﻿/* <body></body> */
/* <documentation about="ABOUT library.js" type="GENERAL">
    <summary>This file is a library: it contains general functions used for the entire application. 
        No page initialisation calls are made in this file; there is one exception: Lib.addEvent(window, "unload", Lib.eventCache.flush): This removes all attached events.
        Make your function calls in the specific javascript files, in the [namespace].init()
    </summary>
    <namespace>nsUCBInternet</namespace>
</documentation> */
var Lib = {};
/* <documentation about="Lib.debug/Lib.allowAlert" type="global variables">
    <summary>These variables are used for debugging - do not change</summary>
    <namespace>Lib</namespace>
</documentation> */
Lib.debug = false; 
Lib.allowAlert = true;
/* <documentation about="Lib.safari/Lib.opera/Lib.ie" type="global variables">
    <summary>Browser checks</summary>
    <namespace>Lib</namespace>
</documentation> */
Lib.safari = (navigator.userAgent.toLowerCase().indexOf('safari') != - 1);
Lib.opera = window.opera ? true : false;
Lib.ie = (document.all && document.getElementById) ? true:false;
Lib.ie7 = navigator.appVersion.indexOf("MSIE 7")!=-1 ? true:false;
/* <documentation about="Lib.newWindowToolTipText" type="global variables">
    <summary>Title text shown on mouse over of a link which opens in a new window</summary>
    <namespace>Lib</namespace>
</documentation> */
Lib.newWindowToolTipText = "deze link opent in een nieuw venster";

/* ========== CORE ============================================================================ */
/* <documentation about="Lib.addEvent" type="CORE FUNCTION">
    <summary>Adds events to elements of the DOM</summary>
    <namespace>Lib</namespace>
    <param type="object" descr="A reference to the node on which the event has been set (HTML element).">obj</param>
    <param type="string" descr="The name of the event ">evt</param>
    <param type="object" descr="A reference to the function which handles the event.">fn</param>
</documentation> */
Lib.addEvent = function (obj,evt,fn) {
    if (obj.addEventListener)
        obj.addEventListener(evt,fn,false);
    else if (obj.attachEvent)
        obj.attachEvent('on'+evt,fn);
}
/* <documentation about="Lib.removeEvent" type="CORE FUNCTION">
    <summary>Removes events to elements of the DOM</summary>
    <namespace>Lib</namespace>
    <param type="object" descr="A reference to the node on which the event has been set (HTML element).">obj</param>
    <param type="string" descr="The name of the event ">evt</param>
    <param type="object" descr="A reference to the function which handles the event.">fn</param>
</documentation> */
Lib.removeEvent = function (obj,evt,fn) {
    if (obj.removeEventListener)
        obj.removeEventListener(evt,fn,false);
    else if (obj.detachEvent)
        obj.detachEvent('on'+evt,fn);
}
Lib.eventCache = function(){
    try {
        var listEvents = [];
        
        /*  Implement array.push for browsers which don't support it natively. (used in EventCache)
        Please remove this if it's already in other code */
        if(Array.prototype.push == null){
            Array.prototype.push = function(){
                for(var i = 0; i < arguments.length; i++){
                    this[this.length] = arguments[i];
                   };
                return this.length;
            };
        };
         
        return {
            listEvents : listEvents,
         
            /* <documentation about="Lib.eventCache.add" type="CORE FUNCTION">
                <summary>Keeping track of all the attached events</summary>
                <namespace>Lib</namespace>
                <param type="object" descr="A reference to the node on which the event has been set (HTML element).">node</param>
                <param type="string" descr="The name of the event">sEventName</param>
                <param type="object" descr="A reference to the function which handles the event. ">fHandler</param>
                <param type="bool" descr="A boolean which determines whether the event is triggered in capture mode or not. Does not apply to Internet Explorer.">bCapture</param>
            </documentation> */
            add :     function(node, sEventName, fHandler, bCapture){
                        listEvents.push(arguments); 
                    },
         
             /* <documentation about="Lib.eventCache.flush" type="CORE FUNCTION">
                <summary>Used to remove (detach) all cached events.</summary>
            </documentation> */
            flush :     function(){
                    var i, item;
                    for(i = listEvents.length - 1; i >= 0; i = i - 1){
                        item = listEvents[i];
                         Lib.removeEvent(item[0], item[1], item[2])
                        
                        item[0][item[1]] = null;
                    };
            }
          };
    } catch (ex){ Lib.errHandler(ex); }    
}();
/* <documentation about="Lib.debugAlert" type="CORE FUNCTION">
    <summary>Displays alert with error message, if alert is allowed (not cancelled in confirm) and Lib.debug = true</summary>
    <namespace>Lib</namespace>
    <param type="string" descr="Message to display in alert">message</param>
</documentation> */
Lib.debugAlert = function (message) {
        if(Lib.allowAlert && Lib.debug) { Lib.allowAlert = confirm(message); }
    }

/* <documentation about="Lib.errHandler" type="CORE FUNCTION">
    <summary>Handles errors in javascript application</summary>
    <namespace>Lib</namespace>
    <param type="object" descr="Error object">err</param>
</documentation> */
Lib.errHandler = function (err) {
        var errorText = "";
        for (var i in err) { errorText += i + "=" + err[i] + "\n"; }
        Lib.debugAlert("An error has occured: \n\n" + errorText + "\nSee Firefox browser for correct linenumbers.");             
        return true;    
    }    
/* ========== END CORE ====================================================================== */
    
/* ========== GENERAL FUNCTIONS ============================================================= */
/* <documentation about="Lib.getWindowHeight" type="general function">
    <summary>Gets innerheight of browser window</summary>
    <namespace>Lib</namespace>
    <returns>Inner window height in pixels (integer)</returns>
</documentation> */
Lib.getWindowHeight = function () {
    var myHeight = 0;
    if( typeof( window.innerHeight ) == 'number' ) {
        //Non-IE
        myHeight = window.innerHeight;
    } else if( document.documentElement &&  document.documentElement.clientHeight  ) {
        //IE 6+ in 'standards compliant mode'
        myHeight = document.documentElement.clientHeight;
    } else if( document.body && document.body.clientHeight) {
        //IE 4 compatible
        myHeight = document.body.clientHeight;
    }
    return myHeight;
}
/* <documentation about="Lib.getWindowWidth" type="general function">
    <summary>Gets innerwidth of browser window</summary>
    <namespace>Lib</namespace>
    <returns>Inner window width in pixels (integer)</returns>
</documentation> */
Lib.getWindowWidth = function () {
    var myHeight = 0;
    if( typeof( window.innerWidth ) == 'number' ) {
        //Non-IE
        myHeight = window.innerWidth;
    } else if( document.documentElement &&  document.documentElement.clientWidth  ) {
        //IE 6+ in 'standards compliant mode'
        myHeight = document.documentElement.clientWidth;
    } else if( document.body && document.body.clientWidth) {
        //IE 4 compatible
        myHeight = document.body.clientWidth;
    }
    return myHeight;
}
/* <documentation about="Lib.getScrollY" type="general function">
    <summary>Get scrolling distance from the top of the window in pixels</summary>
    <namespace>Lib</namespace>
    <returns>Scrolling distance in pixels (integer)</returns>
</documentation> */
Lib.getScrollY = function () {
  var scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;    
  }
  return scrOfY;
}
/* <documentation about="Lib.findElementPosition" type="general function">
    <summary>Find position of a HTML element relative to window</summary>
    <namespace>Lib</namespace>
    <param type="object" descr="HTML element">elem</param>
    <returns>array [left (integer), top (integer)]</returns>
</documentation> */
Lib.findElementPosition = function (elem){
    var curleft = curtop = 0;
    if (elem.offsetParent) {
    
        curleft = elem.offsetLeft
        curtop = elem.offsetTop
        while (elem = elem.offsetParent) {
            curleft += elem.offsetLeft
            curtop += elem.offsetTop
        }
    }
    return [curleft,curtop];
}
/* <documentation about="Lib.elementIsHidden" type="general function">
    <summary>Checks if an element is hidden (has parent with className 'hide'</summary>
    <namespace>Lib</namespace>
    <param type="object" descr="HTML element">obj</param>
    <returns>true or false</returns>
</documentation> */
Lib.elementIsHidden = function (elem) {
    var isHidden = false;
    
    while ( elem && !isHidden) {
        elem = elem.parentNode; 
        if(elem && elem.className && elem.className.indexOf("hide") != -1) { isHidden=true; }
    }
    return isHidden;
}
/* <documentation about="Lib.elementsExists" type="general function">
    <summary>Checks if all the elements with the id specified in the arguments of this function exist; returns true if they do exist; false if one or more do not exist</summary>
    <namespace>Lib</namespace>
    <param type="array of strings" descr="Id's of HTML elements">[array]</param>
    <returns>boolean</returns>
</documentation> */
Lib.elementsExists = function () {
    var result = true;
    for(var i=0; i< arguments.length; i++) {
        if(!document.getElementById(arguments[i])) result=false;
    }
    return result;
}
/* <documentation about="Lib.addStyleSheet" type="general function">
    <summary>Adds stylesheet to the document</summary>
    <namespace>Lib</namespace>
    <param type="string" descr="Relative path to the stylesheet for example '../css/stylesheet.css'">relPath</param>
</documentation> */
Lib.addStyleSheet = function (relPath) {
    if(document.getElementsByTagName("head"))
    {
        var head = document.getElementsByTagName("head")[0]; 
        var newStyle = document.createElement("link");
           newStyle.setAttribute("type", "text/css");
        newStyle.setAttribute("rel", "stylesheet"); 
        newStyle.setAttribute("href", relPath); 
        head.appendChild(newStyle);
    }
} 
/* <documentation about="Lib.removeStyleSheet" type="general function">
    <summary>Removes (or disables) stylesheet in document</summary>
    <namespace>Lib</namespace>
    <param type="string" descr="File name of stylesheet for example 'stylesheet.css'">stylesheetFileName</param>
</documentation> */
Lib.removeStyleSheet = function (stylesheetFileName) {
    if(document.getElementsByTagName("head"))
    {
        var head = document.getElementsByTagName("head")[0]; 
        var linkElements = head.getElementsByTagName("link");
        
        for(var i=0; i<linkElements.length; i++) {
            
            var href = linkElements[i].getAttribute("href");
            if( href.indexOf(stylesheetFileName) != -1) {  
                linkElements[i].disabled=true; 
                head.removeChild(linkElements[i]); 
            }            
        }        
    }    
} 
/* <documentation about="Lib.switchStyleSheet" type="general function">
    <summary>Enable/disable stylesheet</summary>
    <namespace>Lib</namespace>
    <param type="string" descr="Value of the title attribute of link-tag that has to be adjusted">linkTitle</param>
</documentation> */
Lib.switchStyleSheet = function (linkTitle) {
    if(document.getElementsByTagName("head"))
    {
        var head = document.getElementsByTagName("head")[0]; 
        var linkElements = head.getElementsByTagName("link");
        for(var i=0; i< linkElements.length; i++) {
            if(linkElements[i].getAttribute("title") != linkTitle) { continue; }
            linkElements[i].disabled ? linkElements[i].disabled = false : linkElements[i].disabled = true;
        }
    }
} 
Lib.setCookie = function (name, value) {  
    var argv = Lib.setCookie.arguments;  
    var argc = Lib.setCookie.arguments.length;  
    var expires = (argc > 2) ? argv[2] : null;
    var path = (argc > 3) ? argv[3] : null;  
    var domain = (argc > 4) ? argv[4] : null;  
    var secure = (argc > 5) ? argv[5] : false;  
    document.cookie = name + "=" + escape (value) + 
    ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + 
    ((path == null) ? "" : ("; path=" + path)) +  
    ((domain == null) ? "" : ("; domain=" + domain)) +    
    ((secure == true) ? "; secure" : "");
}
Lib.getCookie = function (name) {
    var start = document.cookie.indexOf(name+"="); 
    var len = start+name.length+1; 
    if ((!start) && (name != document.cookie.substring(0,name.length))) { return  null; }
    if (start == -1){ return null; }
    
    var end = document.cookie.indexOf(";",len); 
    
    if (end == -1) { end = document.cookie.length; } 
    return unescape(document.cookie.substring(len,end)); 
}
/* <documentation about="Lib.getBodyId" type="general function">
    <summary>Gets  id of body element</summary>
    <namespace>Lib</namespace>
    <returns>id (string)</returns>
</documentation> */
Lib.getBodyId = function ()  {
     try {
        var body = document.getElementsByTagName("body")[0];
        return body.id;
    } catch (ex){ Lib.errHandler(ex); }    
 }
/* <documentation about="Lib.getNextElement" type="general function">
    <summary>Gets next element in DOM tree; while ignoring text nodes</summary>
    <namespace>Lib</namespace>
    <param type="object" descr="HTML element">elem</param>
    <returns>HTML element</returns>
</documentation> */
Lib.getNextElement = function ( elem ) {
    do { elem = elem.nextSibling; } 
    while ( elem && elem.nodeType != 1 );
    return elem;
}

/* <documentation about="Lib.getPreviousElement" type="general function">
    <summary>Gets previous element in DOM tree; while ignoring text nodes</summary>
    <namespace>Lib</namespace>
    <param type="object" descr="HTML element">elem</param>
    <returns>HTML element</returns>
</documentation> */
Lib.getPreviousElement = function ( elem ) {
    do { elem = elem.previousSibling; }
    while ( elem && elem.nodeType != 1 );
    return elem;
}
/* <documentation about="Lib.getElementsByClassName" type="general function">
    <summary>Used to find HTML elements with certain classname</summary>
    <namespace>Lib</namespace>
    <param type="string" descr="Classname you are looking for">searchClass</param>
    <param type="string" descr="An optional tag name to narrow the search to specific tags e.g. "a" for links (optional, defaults to  "*").">tagName</param>
    <param type="string" descr="An optional object container to search inside. This narrows the scope of the search (optional, defaults to document).">elem</param>
    <returns>Array of HTML elements</returns>
</documentation> */
Lib.getElementsByClassName = function (searchClass, tagName, containerElement) {
    tagName = tagName || "*";
    containerElement = containerElement || document;
    
    var allElements = containerElement.getElementsByTagName(tagName);
    if (!allElements.length &&  tagName == "*" &&  containerElement.all) allElements = containerElement.all;
    
    var elementsFound = new Array();
    var delim = searchClass.indexOf("|") != -1  ? '|' : " ";
    
    var arrClass = searchClass.split(delim);
    for (var i = 0, j = allElements.length; i < j; i++) {
        var arrObjClass = allElements[i].className.split(" ");
        if (delim == " " && arrClass.length > arrObjClass.length) { continue; }
        var c = 0;
        comparisonLoop:
            for (var k = 0, l = arrObjClass.length; k < l; k++) {
                for (var m = 0, n = arrClass.length; m < n; m++) {
                    if (arrClass[m] == arrObjClass[k]) c++;
                    if (( delim == "|" && c == 1) || (delim == " " && c == arrClass.length)) {
                        elementsFound.push(allElements[i]);
                    break comparisonLoop;
                }
            }
        }
    }
    return elementsFound;
}
/* <documentation about="Lib.getElementByTitle" type="general function">
    <summary>Get Elements by title attribute</summary>
    <namespace>Lib</namespace>
    <param type="string" descr="Value of title attribute you are looking for">searchTitle</param>
    <param type="string" descr="An optional tag name to narrow the search to specific tags e.g. "a" for links (optional, defaults to  "*").">tagName</param>
    <param type="string" descr="An optional object container to search inside. This narrows the scope of the search (optional, defaults to document).">elem</param>
    <returns>Array of HTML elements</returns>
</documentation> */
Lib.getElementsByTitle = function (searchTitle, tagName, containerElement) {
    tagName = tagName || "*";
    containerElement = containerElement || document;
    
    var allElements = containerElement.getElementsByTagName(tagName);
    if (!allElements.length &&  tagName == "*" &&  containerElement.all) allElements = containerElement.all;
    
    var elementsFound = new Array();
    for (var i = 0, j = allElements.length; i < j; i++) {
        if (allElements[i].title == searchTitle) {
            elementsFound.push(allElements[i]);
        }
    }
    return elementsFound;
}
/* <documentation about="Lib.removeElements" type="general function">
    <summary>Used to remove HTML elements</summary>
    <namespace>Lib</namespace>
    <param type="string" descr="An optional tag name to narrow the search to specific tags e.g. "a" for links (optional, defaults to "*").">tagName</param>
    <param type="string" descr="Classname you are looking for">searchClass</param>
    <param type="string" descr="An optional object container to search inside. This narrows the scope of the search (optional, defaults to document).">elem</param>
</documentation> */
Lib.removeElements = function (tagName, searchClass, containerElement) {
    var elementToRemove = Lib.getElementsByClassName(searchClass, tagName, containerElement);
    
    for(var i=0; i< elementToRemove.length; i++) {
        elementToRemove[i].parentNode.removeChild(elementToRemove[i]);
    }
}
/* <documentation about="Lib.showElements" type="general function">
    <summary>Used to show HTML elements</summary>
    <namespace>Lib</namespace>
    <param type="array of objects" descr="references to html objects">[array]</param>
</documentation> */
Lib.showElements = function () {
    for(var i = 0; i < arguments.length; i++){
        arguments[i].style.display = 'block';
    };
}
/* <documentation about="Lib.hideElements" type="general function">
    <summary>Used to hide HTML elements</summary>
    <namespace>Lib</namespace>
    <param type="array of objects" descr="references to html objects">[array]</param>
</documentation> */
Lib.hideElements = function () {
    for(var i = 0; i < arguments.length; i++){
        arguments[i].style.display = 'none';
    };
}
/* <documentation about="Lib.trim" type="general function">
    <summary>Used to trim a variable (removing spaces left and right)</summary>
    <namespace>Lib</namespace>
    <param type="string" descr="Variables that you want to trim">stringToTrim</param>
    <returns>Trimmed variable (string)</returns>
</documentation> */
Lib.trim = function(stringToTrim) {
    return stringToTrim.replace(/^\s+|\s+$/g, '') ;
}
/* <documentation about="Lib.inputAutoClear" type="general function">
    <summary>Resets default value in text field when text field is left empty</summary>
    <namespace>Lib</namespace>
</documentation> */
Lib.inputAutoClear = function () {
    for(var i=0; i< arguments.length; i++) {
        if(arguments[i]==null) { continue; }
        var inputField = arguments[i];
        // Add a onfocus to inputField
        // This will store the initial value for restoring it when the box stays empty when losing focus
        inputField.onfocus = function(){
            if(this.getAttribute("default") && this.getAttribute("default")== this.value) { 
                this.value = "";
            }
        };
        Lib.eventCache.add(inputField,"onfocus",function(){if(this.getAttribute("default")&&this.getAttribute("default")==this.value){this.value="";}},false);
        // Add a onblur to inputField
        // This will restore the initial value if no value is inserted
        inputField.onblur = function() { 
            if(this.value.length==0 && this.getAttribute("default")) { this.value = this.getAttribute("default")} 
        };
        Lib.eventCache.add(inputField,"onblur",function(){if(this.value.length==0&&this.getAttribute("default")){this.value==this.getAttribute("default");}},false);
    }
}

/* <documentation about="Lib.addDefaultTextAttribute" type="specific function">
<summary>Adds attribute "default" to text form elements</summary>
<namespace>Lib</namespace>
<param type="array of strings" descr="Id's of HTML elements">[array]</param>
</documentation> */
Lib.addDefaultTextAttribute = function () {
    for(var i=0; i< arguments.length; i++) {
        if(arguments[i]==null) { continue; }
        var field = arguments[i];
        field.setAttribute("default", field.value);
    }
}
/* ========== END GENERAL FUNCTIONS ========================================================= */
/* <documentation about="Add eventhandler Lib.eventCache.flush on window unload" type="FUNCTION CALL">
    <summary>Calling Lib.addEvent: Add Lib.eventCache.flush as eventhandler on window onunload: Detach all attached events (solves memory leak in ie)</summary>
</documentation> */
Lib.addEvent(window, "unload", Lib.eventCache.flush);