﻿
(function(){
    
    //Het PlanIt NameSpace object, door eerst te testen of de namespace al bestaat kan de namespace in meerdere 
    // javascript.js files per pagina gebruikt worden.
    if(!window['PlanIt']){ window['PlanIt'] = {}; } 
    
    //Deze functie checked of de browser compatible is met de gehele library.
    function IsCompatible(other)
    {
        if(other === false 
            || !Array.prototype.push
            || !Object.hasOwnProperty
            || !document.createElement
            || !document.getElementsByTagName
            ){return false;}
        return true;
    }
    window['PlanIt']['IsCompatible'] = IsCompatible;
    
    function GetElementsById()
    {
        var elements = new Array();
        for(var i = 0; i < arguments.length; i++)
        {
            var element = arguments[i];
            if(typeof element == 'string')
            {
                element = document.getElementById(element);
            }
            
            //Als er maar op 1 element gezocht werd meteen teruggeven.
            if(arguments.length == 1)
            {
                return element;
            }
            //Anders toevoegen aan elements array.
            elements.push(element);
        }
        return elements;
    }
    window['PlanIt']['GetElementsById'] = GetElementsById;
    
    function GetElementsByClass(className, tag, parent)
    {
        parent = parent || document;
        if(!(parent = GetElementsById(parent))){return false;}
        
        var allTags = (tag == '*' && parent.all) ? parent.all : parent.getElementsByTagName(tag);
        var matchingElements = [];
        
        className = className.replace(/\-/g, '\\-');
        var regEx = new RegExp('(^|\\s)' + className + '(\\s|$)');
        
        var element;
        for(var i = 0; i < allTags.length; i++)
        {
            element = allTags[i];
            if(regEx.test(element.className)){matchingElements.push(element);}
        }
        return matchingElements;
    }
    window['PlanIt']['GetElementsByClass'] = GetElementsByClass;
    
    function AddEvent(node, type, listener)
    {
        if(!IsCompatible()){ return false; }
        
        //Checken of de node wel bestaat
        if(!(node = GetElementsById(node))){return false;}
        
        //Implementatie volgens de standaarden
        if(node.addEventListener)
        {
            node.addEventListener(type, listener, false);
            return true;
        }
        //Implementatie IE
        else if(node.attachEvent)
        {
            node['e' + type + listener] = listener;
            node[type + listener] = 
            function()
            {
                node['e' + type + listener](window.event);
            }
            node.attachEvent('on' + type, node[type + listener]);
            return true;
        }
        return false;
    }
    window['PlanIt']['AddEvent'] = AddEvent;
    
    function RemoveEvent(node, type, listener)
    {
        if(!(node = GetElementsById(node))){return false;}
        
        if(node.removeEventListener)
        {
            node.removeEventListener(type, listener, false);
            return true;
        }
        else if(node.detachEvent)
        {
            node.detachEvent('on' + type, node[type + listener]);
            node[type + listener] = null;
            return true;
        }
        return false;
    }
    window['PlanIt']['RemoveEvent'] = RemoveEvent;
    
    function ToggleDisplay(node, value)
    {
        if(!(node = GetElementsById(node))){return false;}
        
        if(node.style.display != 'none'){node.style.display = 'none';}
        else{node.style.display = value || '';}
        return true;
    }
    window['PlanIt']['ToggleDisplay'] = ToggleDisplay;
    
    function InsertAfter(node, referenceNode)
    {
        if(!(node = GetElementsById(node))){return false;}
        if(!(referenceNode = GetElementsById(referenceNode))){return false;}
        
        return referenceNode.parentNode.insertBefore(node, referenceNode.nextSibling);
    }
    window['PlanIt']['InsertAfter'] = InsertAfter;
    
    function RemoveChildren(parent)
    {
        if(!(parent = GetElementsById(parent))){return false;}
        while(parent.firstChild)
        {
            parent.firstChild.parentNode.removeChild(parent.firstChild);
        }
        return parent;
    }
    window['PlanIt']['RemoveChildren'] = RemoveChildren;
    
    function PrependChild(parent, newChild)
    {
        if(!(parent = GetElementsById(parent))){return false;}
        if(!(newChild = GetElementsById(newChild))){return false;}
        
        if(parent.hasChildNodes)
        {
            parent.insertBefore(newChild, parent.firstChild);
        }
        else
        {
            parent.appendChild(newChild);
        }
        return parent;
    }
    window['PlanIt']['PrependChild'] = PrependChild;
    
    function BindFunction(obj, func)
    {
        return function(){
            func.apply(obj, arguments);
            };
    };
    window['PlanIt']['BindFunction'] = BindFunction;
    
    function GetBrowserWindowSize()
    {
        var docElement = document.documentElement;
        //Een nieuw object aanmaken en teruggeven met 2 statische properties Width en Height.
        return {
            Width:(window.innerWidth || (docElement && docElement.clientWidth) || document.body.clientWidth),
            Height:(window.innerHeight || (docElement && docElement.clientHeight) || document.body.clientHeight)
            };
    }
    window['PlanIt']['GetBrowserWindowSize'] = GetBrowserWindowSize;
    
    window['PlanIt']['NodeType'] = {
            Element:1,
            Attribute:2,
            Text:3,
            CDATASection:4,
            EntityReference:5,
            Entity:6,
            ProcessingInstruction:7,
            Comment:8,
            Document:9,
            DocType:10,
            DocumentFragment:11,
            Notation:12
        };   
})();
