﻿
(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;
        
    function StopEventPropagation(eventArg)
    {
        eventArg = eventArg || GetEventObject(eventArg);
        if(eventArg.stopPropagation){eventArg.stopPropagation();}
        else{eventArg.cancelBubble = true;}
    }
    window['PlanIt']['StopEventPropagation'] = StopEventPropagation;

    function StopEventDefault(eventArg)
    {
        eventArg = eventArg || GetEventObject(eventArg);
        if(eventArg.preventDefault){eventArg.preventDefault();}
        else{eventArg.returnValue = false;}
    }
    window['PlanIt']['StopEventDefault'] = StopEventDefault;
    
    function GetEventObject(W3CEvent)
    {
        return W3CEvent || window.event;
    }
    window['PlanIt']['GetEventObject'] = GetEventObject;
    
    //geef een array van css-klasse-namen terug op basis van een html element.
    function GetClasses(element)
    {
        if(!(element = GetElementsById(element)))return false;
        return element.className.replace(/\s+/, ' ').split(' ');
    }
    window['PlanIt']['GetClasses'] = GetClasses;
    
    //check of een element een bepaalde css-klasse heeft.
    function HasClass(element, className)
    {
        if(!(element = GetElementsById(element)))return false;
        var classes = GetClasses(element);
        for(var i = 0; i < classes.length; i++)
        {
            if(classes[i] == className)return true;
        }
        return false;
    }
    window['PlanIt']['HasClass'] = HasClass;
    
    //Een css-klasse toevoegen
    function AddClass(element, className)
    {
        if(!(element = GetElementsById(element)))return false;
        element.className += (element.className ? ' ' : '') + className;
        return true;
    }
    window['PlanIt']['AddClass'] = AddClass;
    
    //Een css-klasse verwijderen.
    function RemoveClass(element, className)
    {
        if(!(element = GetElementsById(element)))return false;
        var classes = GetClasses(element);
        var classCount = classes.length;
        for(var i = classCount - 1; i >= 0; i--)
        {
            if(classes[i] === className)delete(classes[i]);
        }
        element.className = classes.join(' ');
        //waarde teruggeven afhankelijk van of er een klasse verwijderd is of niet.
        return (classCount == classes.length ? false : true); 
    }
    window['PlanIt']['RemoveClass'] = RemoveClass;
    
})();