/**
 * The javascripts functions for PMS
 * @author Ozgur Ayten
 */
var Akyla_Prototype_Pms = Class.create(Akyla_Prototype_Observer,
{
        /**
         * Name of the module
         */
        moduleName : "Akyla.Login",
        /**
         * Load default preferences
         */
        loadDefaultPreferences : function()
        {
                this.preferences =
                {
                };
                this.lastCall = {};
        },
        observeContainer : function (container)
        {
        },
        showTabs : function ()
        {
                //this.changeToObjectHolder("openTabs");
                //$("openTabs").update($("objectsTabsContainer").select(".akylaTab .titles .title[objectid!=0]"));
        },
                executeButton : function(buttonAction)
                {
                        var activeModule = $(document.body).down("div.objectHolder.active");
                        if (typeof activeModule == "undefined" || activeModule === null)
                        {
                                return false;
                        }
                        var activeTab = activeModule.down("div.akylaTab").akylaTab;
                        var button = activeModule.down("div.content[objectid=" + activeTab.activeTab + "] div.toolbar button[action="+buttonAction+"]");
                        if (!button)
                        {
                                return;
                        }
                        var href = button.readAttribute("href");
                        if (!href)
                        {
                                return;
                        }
                        if (buttonAction == "delete")
                        {
                                Akyla.WindowHandler.factory("Confirm", {
                                                id : "confirm",
                                                content : "Weet u zeker dat u dit object wilt verwijderen?",
                                                onYes : function ()
                                                {
                                                        Akyla.Ajax.ajaxRequest(href,null,{});
                                                },
                                                onNo : function ()
                                                {
                                                }
                                        }).show();
                        }
                        else
                        {
                                Akyla.Ajax.ajaxRequest(href,null,{});
                        }
                        return true;
                },
        changeToObjectHolder : function(holder, link)
        {
                // First find the active holder
                var activeHolder = $("objectsTabsContainer").down(".objectHolder.active");
                var activeOverviewHolder = $("objectOverviewHolder").down(".objectHolder.active");
                var activeAnchor = $("pageMenu").down("a.active");
                if (activeHolder)
                        activeHolder.removeClassName("active");
                if (activeOverviewHolder)
                        activeOverviewHolder.removeClassName("active");
                if (activeAnchor)
                        activeAnchor.removeClassName("active");

                if (link)
                {
                        var menuAnchor = link;
                }
                else
                {
                        var menuAnchor = $("leftPane").down("a[rel="+holder+"]");
                }
                if (menuAnchor)
                        menuAnchor.addClassName("active");

                var objectHolder = $(holder);
                var objectOverviewHolder = $(holder+"Overview");
                if (objectHolder)
                        objectHolder.addClassName("active");
                if (objectOverviewHolder)
                        objectOverviewHolder.addClassName("active");
                scroll(0,0);
        },
        checkLogin : function()
        {
                if (window.name != "pmsWindow")
                {
                        Akyla.WindowHandler.factory("Alert",
                                {
                                        id : "alert",
                                        content : "PMS is geopend in een ander venster. Uit veiligheidsoverwegingen wordt u aangeraden om dit venster te sluiten."
                                }).show();
                }
        },
        forceMenuAction : function (action)
        {
                var link = $("leftPane").down("a[rel="+action+"]");
                if (!link)
                {
                        return;
                }
                Akyla.Widget.Tabs.initTabs($(action));
                Akyla.Ajax.ajaxRequest(link.readAttribute("ref"),null,
                {
                        onRequestSuccess : function()
                        {
                                this.changeToObjectHolder(action);
                        }.bind(this)
                });
        },
        domLoaded : function()
        {
                //new PeriodicalExecuter(function(pe)
                //{
                //      Akyla.Ajax.ajaxRequest("ping",null,{});
                //}, 10);
                $("leftPane").observe("click", function (event)
                {
                        var target = $(event.target);
                        if (target.tagName.toLowerCase() != "a")
                        {
                                target = target.up("a");
                        }
                        if (!target)
                        {
                                return;
                        }
                        // clickable a
                        if (target.hasAttribute("ref"))
                        {
                                var rel = target.readAttribute("rel");
                                if (rel == "logout")
                                {
                                        var tabContainer = new Element("div").addClassName("openTabs");
                                        var content = new Element("div").insert({top : tabContainer});
                                        var openTabs = 0;
                                        $("openTabsTab").select("div.contents div.content li[objectid!=-1]").each (function (element)
                                        {
                                                tabContainer.insert({bottom : element.cloneNode(true)});
                                                openTabs++;
                                        });
                                        if (openTabs > 0)
                                        {
                                                var tabMessage = "tab";
                                                if (openTabs > 1)
                                                {
                                                        tabMessage = tabMessage+"s";
                                                }
                                                tabContainer.insert({top : "U heeft "+openTabs+" "+tabMessage+" open. Hieronder ziet u een overzicht:<br />"});
                                        }
                                        content.insert({bottom : "Weet u zeker dat u wilt uitloggen?"});
                                        Akyla.WindowHandler.factory("Confirm", {
                                                id : "confirm",
                                                content : content,
                                                contentType : "htmlNode",
                                                onYes : function ()
                                                {
                                                        Akyla.Ajax.ajaxRequest(target.readAttribute("ref"),null,
                                                        {
                                                        });
                                                },
                                                onNo : function ()
                                                {
                                                }
                                        }).show();

                                }
                                else
                                {
                                        Akyla.Widget.Tabs.initTabs($(rel));
                                        Akyla.Ajax.ajaxRequest(target.readAttribute("ref"),null,
                                        {
                                                onRequestSuccess : function()
                                                {
                                                        this.changeToObjectHolder(rel,target);
                                                }.bind(this)
                                        });
                                }
                                Event.stop(event);
                        }
                        else if (target.hasAttribute("href"))
                        {
                                var href = target.readAttribute("href");
                                if (typeof this[href] == "function" || typeof this[href] == "object")
                                {
                                        this[href]();
                                }
                        }
                }.bind(this));
                Event.observe(document,"form:submit", function (event)
                {
                        var form = event.target;
                        if (!Akyla.Form.Validator.testForm(form))
                        {
                                Event.stop(event);
                                return false;
                        }
                        else
                        {
                                Event.stop(event);
                                return Akyla.Ajax.ajaxRequest(form.readAttribute("postAction"),form,{});
                        }
                });
                /*
                $("rightPane").observe("focus", function (event)
                {
                        event = event || window.event;
                        var target = $(event.target) || $(event.srcElement);
                });
                */
                $("rightPane").observe("keydown", function (event)
                {
                        var target = event.target;
                        if (target && target.tagName && target.tagName.toLowerCase() == "input")
                        {
                                if ((event.keyCode == Event.KEY_RETURN && target.type) && (target.type == "text" || target.type == "password"))
                                {
                                        Event.stop(event);
                                }
                        }
                }.bind(this));
                $(document.body).observe("mousedown",function (event)
                {
                        var target = $(event.target);
                        if (!target || (typeof target.up != "function" && typeof target.up != "object"))
                        {
                                return;
                        }
                        if (target.up("#openTabs"))
                        {
                                this.handleOpenTabs(event);
                                Event.stop(event);
                                return;
                        }
                        if (target.tagName)
                        {
                                var tagName = target.tagName.toLowerCase();
                        }
                        else
                        {
                                return;
                        }
                        if (this.mousedownObservers[tagName] && event.button === 0)
                        {
                                return this.mousedownObservers[tagName](event,target);
                        }
                }.bind(this));
                Event.observe(window,"mousewheel", function (event)
                {
                        var ajaxSelect = $("ajaxSelect");
                        if (ajaxSelect)
                        {
                                Akyla.Form.Validator.removeAjaxSelect(ajaxSelect.element);
                        }
                });
                $("rightPane").observe("mousedown", function (event)
                {
                        var target = $(event.target);
                        if (!target || (typeof target.up != "function" && typeof target.up != "object"))
                        {
                                return;
                        }
                        if (target.up("#openTabs"))
                        {
                                this.handleOpenTabs(event);
                                Event.stop(event);
                                return;
                        }
                        if (target.tagName)
                        {
                                var tagName = target.tagName.toLowerCase();
                        }
                        else
                        {
                                return;
                        }
                        if (this.mousedownObservers[tagName] && event.button === 0)
                        {
                                return this.mousedownObservers[tagName](event,target);
                        }
                }.bind(this));
                $("rightPane").observe("click", function (event)
                {
                        var target = $(event.target);
                        if (!target.tagName && (!target || (typeof target.up != "function" && typeof target.up != "object")))
                        {
                                return;
                        }
                        var tagName = target.tagName.toLowerCase();
                        if (this.clickObservers[tagName])
                        {
                                return this.clickObservers[tagName](event,target);
                        }
                        else if (this.mousedownObservers[tagName] && event.button === 0)
                        {
                                return this.mousedownObservers[tagName](event,target);
                        }
                        
                }.bind(this));
                Event.observe(document,"container:change", function (event)
                {
                        this.observeContainer(event.target);
                }.bind(this));
                $("pageWrapper").fire("container:change");
        },
        handleOpenTabs : function(event)
        {
                var target = event.target;
                var handlers = {
                        a : function (target)
                        {
                                this.li(target.up("li"));
                        },
                        img : function(target)
                        {
                                if (target.hasClassName("closeButton"))
                                {
                                        var akylaTab = target.up("li").akylaTab;
                                        if (akylaTab)
                                        {
                                                akylaTab.remove(target.up("li").readAttribute("objectid"));
                                        }
                                }
                                else if (target.hasClassname("action"))
                                {
                                        this.li(target.up("li"));
                                }
                        },
                        span : function (target)
                        {
                                this.li(target.up("li"));
                        },
                        h2 : function (target)
                        {
                                Akyla.Pms.changeToObjectHolder(target.up("div").readAttribute("rel"));
                        },
                        li : function (target)
                        {
                                var akylaTab = target.akylaTab;
                                if (akylaTab)
                                {
                                        akylaTab.setActiveTab(target.readAttribute("objectid"));
                                        Akyla.Pms.changeToObjectHolder(target.up("div").readAttribute("rel"));
                                }
                        }
                };
                var tagName = target.tagName.toLowerCase();
                if (typeof handlers[tagName] != "undefined")
                {
                        handlers[tagName](target);
                }
        },
        clickObservers :
        {
                input : function (event,target)
                {
                        if (target.type == "submit")
                        {
                                target.up("form").fire("form:submit");
                                Event.stop(event);
                        }
                },
                div : function (event,target)
                {
                        if (target.hasClassName("switchable"))
                        {
                                target.up("div.fieldset").toggleClassName("collapsed");
                                Event.stop(event);
                        }
                },
                button : function (event,target)
                {
                        if (target.hasClassName("formAdder"))
                        {
                                addFormSection(target.up("div.fieldset").down("div.fieldset"));
                                renumberTabIndices(target.up("form"));
                                Event.stop(event);
                        }
                        else if (target.hasClassName("resendPassword"))
                        {
                                $(document.body).down("div.resend-password").removeClassName("invisible");
                                $("loginArea").addClassName("invisible");       
                                Event.stop(event);
                        }
                        else if (target.type == "submit" && target.up("form").hasClassName("jsValidated"))
                        {
                                target.up("form").fire("form:submit");
                                Event.stop(event);
                        }
                        else
                        {
                                var href = target.readAttribute("href");
                                if (href)
                                {
                                        Akyla.Ajax.ajaxRequest(href,null,{});
                                        Event.stop(event);
                                }
                        }
                },
                img : function(event,target)
                {
                        var parent = target.up();
                        if (parent.tagName && parent.tagName.toLowerCase() == "button" && parent.type == "submit" && target.up("form") && target.up("form").hasClassName("jsValidated"))
                        {
                                target.up("form").fire("form:submit");
                                Event.stop(event);
                        }
                }
        },
        mousedownObservers :
        {
                a : function (event,target)
                {
                        if (target.hasAttribute("url"))
                        {
                                Akyla.Ajax.ajaxRequest(target.readAttribute("url"),null,{});
                        }
                },
                img : function (event,target)
                {
                        if (target.hasClassName("formAdder"))
                        {
                                alert("HI");
                                addFormSection(target.up("div.fieldset").down("div.fieldset"));
                                renumberTabIndices(target.up("form"));
                                Event.stop(event);
                        }
                        // Target was a remove button
                        else if (target.hasClassName("formRemover"))
                        {
                                removeFormSection(target.up("div.fieldset"),target);
                                renumberTabIndices(target.up("form"));
                        }
                        // target is an ajax summary button
                        else if (target.hasClassName("ajaxSummaryInfoButton"))
                        {
                                var summaryDiv = target.up("div.ajaxSummary");
                                summaryDiv.toggleClassName("collapsed");
                        }
                        else if (target.up("button"))
                        {
                                var parent = target.up("button");
                                var href = parent.readAttribute("href");
                                if (href)
                                {
                                        Akyla.Ajax.ajaxRequest(href,null,{});
                                        Event.stop(event);
                                }
                        }
                },
                input : function (event,target)
                {
                        if (target.type == "checkbox" && target.name == "approvalAll")
                        {
                                var elements = target.up("table.simpleTable").select('input[class="approvalcheckbox"]');
                                elements.each(function(item) {
                                        item.checked = !item.checked;
                                });
                        } 
                        else if (target.type == "checkbox" && target.name == "invoiceAll")
                        {
                                var elements = target.up("table.simpleTable").select('input[class="invoice"]');
                                elements.each(function(item) {
                                        item.checked = !item.checked;
                                });
                        } 
                        else if (target.type == "checkbox" && target.name == "downloadAll")
                        {
                                var elements = target.up("table.simpleTable").select('input[class="downloadcheckbox"]');
                                elements.each(function(item) {
                                        item.checked = !item.checked;
                                });
                        }
                        else if (target.type == "checkbox" && target.name == "sendLetterAll")
                        {
                                var elements = target.up("table.simpleTable").select('input[class="sendLetterCheckbox"]');
                                elements.each(function(item) {
                                        item.checked = !item.checked;
                                });
                        }
                        else if (target.type == "checkbox" && target.name == "createLetterAll")
                        {
                                var elements = target.up("table.simpleTable").select('input[class="createLetterCheckbox"]');
                                elements.each(function(item) {
                                        item.checked = !item.checked;
                                });
                        }
                        else if (target.type == "checkbox" && target.name == "closetaskAll")
                        {
                                var elements = target.up("table.simpleTable").select('input[class="closetaskcheckbox"]');
                                elements.each(function(item) {
                                        item.checked = !item.checked;
                                });
                        }
                        else 
                        {
                                target.activate();
                        }
                },
/*              select : function (event,target)
                {
                        Event.stop(event);
                },*/
                button : function (event,target)
                {
                        var action = target.readAttribute("action");
                        var type = target.readAttribute("type");
                        if (target.hasClassName("formAdder"))
                        {
                                addFormSection(target.up("div.fieldset").down("div.fieldset"));
                                renumberTabIndices(target.up("form"));
                                alert("HI");
                                Event.stop(event);
                        }
                        else if (action == "delete")
                        {
                                var href = target.readAttribute("href");
                                if (!href)
                                {
                                        // malformed
                                        return;
                                }
                                Akyla.WindowHandler.factory("Confirm", {
                                        id : "confirm",
                                        content : "Weet u zeker dat u dit object wilt verwijderen?",
                                        onYes : function ()
                                        {
                                                Akyla.Ajax.ajaxRequest(href,null,{});
                                        },
                                        onNo : function ()
                                        {
                                        }
                                }).show();
                        }
                        else if (action == "close")
                        {
                                var objectId = target.up(".content[objectid]").readAttribute("objectid");
                                if (objectId != "0")
                                {
                                        var akylaTab = target.up("div.akylaTab.processed").akylaTab;
                                        akylaTab.remove(objectId);
                                }
                        }
                        else if (action == "save")
                        {
                                var activeModule = $(document.body).down("div.objectHolder.active");
                                var activeTab = activeModule.down("div.akylaTab").akylaTab;
                                var form = target.up('form');
                                if (! form)
                                {
                                        form = activeModule.down("div.content[objectid="+activeTab.activeTab+"] form");
                                }
                                if (target.hasAttribute("data-confirm"))
                                {
                                        Akyla.WindowHandler.factory("Confirm", {
                                                id : "confirm",
                                                content : target.readAttribute("data-confirm"),
                                                onYes : function ()
                                                {
                                                        Akyla.Form.Validator.handleClick(form,target,"button",event);
                                                },
                                                onNo : function ()
                                                {
                                                }
                                        }).show();
                                }
                                else
                                {
                                        Akyla.Form.Validator.handleClick(form,target,"button",event);
                                }
                        }
                        else if (action == "closeall")
                        {
                                var href = target.readAttribute("href");
                                if (!href)
                                {
                                        // malformed
                                        return;
                                }
                                elements = target.up("div.objectHolder").down("table.simpleTable").select('input[class="closetaskcheckbox"]');
                                var serializedElements = new Array();
                                elements.each(function(item) {
                                        if (item.checked)
                                        {
                                                var id = item.name.replace('closetask[','');
                                                id = id.replace(']','');
                                                serializedElements.push( id );
                                        }
                                });
//                              href += "/ids/"+serializedElements.join('_');
                                Akyla.WindowHandler.factory("Confirm", {
                                        id : "confirm",
                                        content : "Weet u zeker dat u de volgende taken wilt sluiten? "+serializedElements.join(', '),
                                        onYes : function ()
                                        {
//                                              Akyla.Ajax.ajaxRequest(href,null,{});
                                                Akyla.Ajax.ajaxRequest(href,null,{
                                                        method : "post",
                                                        parameters : 
                                                        {
                                                                ids : serializedElements.join('_')
                                                        }
                                                });
                                        },
                                        onNo : function ()
                                        {
                                        }
                                }).show();
                        }
                        else if (action == "approveall")
                        {
                                var href = target.readAttribute("href");
                                if (!href)
                                {
                                        // malformed
                                        return;
                                }
                                elements = target.up("div.objectHolder").down("table.simpleTable").select('input[class="approvalcheckbox"]');
                                var serializedElements = new Array();
                                elements.each(function(item) {
                                        if (item.checked)
                                        {
                                                var id = item.name.replace('approval[','');
                                                id = id.replace(']','');
                                                serializedElements.push( id );
                                        }
                                });

                                Akyla.WindowHandler.factory("Confirm", {
                                        id : "confirm",
                                        content : "Weet u zeker dat u de volgende declaraties wilt goedkeuren? "+serializedElements.join(', '),
                                        onYes : function ()
                                        {
                                                Akyla.Ajax.ajaxRequest(href,null,{
                                                        method : "post",
                                                        parameters : 
                                                        {
                                                                ids : serializedElements.join('_')
                                                        }
                                                });
                                        },
                                        onNo : function ()
                                        {
                                        }
                                }).show();
                        }
                        else if (action == "downloadinvoices")
                        {
                                var href = target.readAttribute("href");
                                if (!href)
                                {
                                        // malformed
                                        return;
                                }
                                elements = target.up("div.objectHolder").down("table.simpleTable").select("input.invoice");
                                var serializedElements = new Array();
                                elements.each(function(item) {
                                        if (item.checked)
                                        {
                                                var id = item.name.replace('invoice[','');
                                                id = id.replace(']','');
                                                serializedElements.push( id );
                                        }
                                });
                                Akyla.WindowHandler.factory("Confirm", {
                                        id : "confirm",
                                        content : "Weet u zeker dat u de volgende facturen wilt downloaden? "+serializedElements.join(', '),
                                        onYes : function ()
                                        {
                                                Akyla.Ajax.ajaxRequest(href,null,{
                                                        method : "post",
                                                        parameters : 
                                                        {
                                                                ids : serializedElements.join(';')
                                                        }
                                                });
                                        },
                                        onNo : function ()
                                        {
                                        }
                                }).show();
                        }
                        else if (action == "approveinvoices")
                        {
                                var href = target.readAttribute("href");
                                if (!href)
                                {
                                        // malformed
                                        return;
                                }
                                elements = target.up("div.objectHolder").down("table.simpleTable").select("input.invoice");
                                var serializedElements = new Array();
                                elements.each(function(item) {
                                        if (item.checked)
                                        {
                                                var id = item.name.replace('invoice[','');
                                                id = id.replace(']','');
                                                serializedElements.push( id );
                                        }
                                });
                                Akyla.WindowHandler.factory("Confirm", {
                                        id : "confirm",
                                        content : "Weet u zeker dat u de volgende facturen wilt accorderen? "+serializedElements.join(', '),
                                        onYes : function ()
                                        {
                                                Akyla.Ajax.ajaxRequest(href,null,{
                                                        method : "post",
                                                        parameters : 
                                                        {
                                                                ids : serializedElements.join(';')
                                                        }
                                                });
                                        },
                                        onNo : function ()
                                        {
                                        }
                                }).show();
                        }
                        else if (action == "createletter")
                        {
                                var href = target.readAttribute("href");
                                if (!href)
                                {
                                        // malformed
                                        return;
                                }
                                var selectBox = target.previous("select");
                                if (!selectBox)
                                {
                                        return;
                                }
                                var documentId = $F(selectBox);
                                if ( documentId == '' )
                                {
                                        Akyla.WindowHandler.factory("Alert", {
                                                id : "alert",
                                                content : "Geen sjabloon geselecteerd"
                                        }).show();
                                        return;
                                }

                                elements = target.up("div.objectHolder").down("table.simpleTable").select("input.createLetterCheckbox");

                                var serializedElements = new Array();
                                elements.each(function(item) {
                                        if (item.checked)
                                        {
                                                var id = item.name.replace('createLetter[','');
                                                id = id.replace(']','');
                                                serializedElements.push( id );
                                        }
                                });
                                var urlParams = ''; 
                                urlParams += "ids="+serializedElements.join('_');
                                urlParams += "&documentId="+documentId;
                                var message = "Weet u zeker dat u voor " + serializedElements.length + " ";
                                message += ((serializedElements.length == 1) ? "contact" : "contacten") ;
                                message += " een document wilt klaar zetten om te versturen?";
                                
                                Akyla.WindowHandler.factory("Confirm", {
                                        id : "confirm",
                                        content : message,
                                        onYes : function ()
                                        {
                                                Akyla.Ajax.ajaxRequest(href,null,{postBody:urlParams});
                                        },
                                        onNo : function ()
                                        {
                                        }
                                }).show();
                        }                       
                        else if (action == "sendletter")
                        {
                                var href = target.readAttribute("href");
                                if (!href)
                                {
                                        // malformed
                                        return;
                                }
                                elements = target.up("div.objectHolder").down("table.simpleTable").select('input[class="sendLetterCheckbox"]');
                                selectElements = target.up("div.objectHolder").down("table.simpleTable").select('select[class="sendLetterSelect"]');
                                var serializedElements = new Array();
                                for ( i = 0 ; i < elements.length ; i++)
                                {
                                        if (elements[i].checked)
                                        {
                                                var id = elements[i].name.replace('sendLetter[','');
                                                id = id.replace(']','');
                                                serialized = id + '|' + selectElements[i].value;
                                                serializedElements.push( serialized );
                                        }
                                }
                                var urlParams = ''; 
                                urlParams += "ids="+serializedElements.join('_');
                                urlParams += "&documentId="+documentId;
                                var message = "Weet u zeker dat u deze wilt versturen?";
                                
                                Akyla.WindowHandler.factory("Confirm", {
                                        id : "confirm",
                                        content : message,
                                        onYes : function ()
                                        {
                                                Akyla.Ajax.ajaxRequest(href,null,{postBody:urlParams});
                                        },
                                        onNo : function ()
                                        {
                                        }
                                }).show();
                        }
                        else if (action == "deleteletter")
                        {
                                var href = target.readAttribute("href");
                                if (!href)
                                {
                                        // malformed
                                        return;
                                }
                                elements = target.up("div.objectHolder").down("table.simpleTable").select('input[class="sendLetterCheckbox"]');
                                var serializedElements = new Array();
                                elements.each(function(item) {
                                        if (item.checked)
                                        {
                                                var id = item.name.replace('sendLetter[','');
                                                id = id.replace(']','');
                                                serializedElements.push( id );
                                        }
                                });
                                var urlParams = ''; 
                                urlParams += "ids="+serializedElements.join('_');
                                urlParams += "&documentId="+documentId;
                                var message = "Weet u zeker dat u " + serializedElements.length + " ";
                                message += ((serializedElements.length == 1) ? "item" : "items") ;
                                message += " wilt verwijderen?";
                                
                                Akyla.WindowHandler.factory("Confirm", {
                                        id : "confirm",
                                        content : message,
                                        onYes : function ()
                                        {
                                                Akyla.Ajax.ajaxRequest(href,null,{postBody:urlParams});
                                        },
                                        onNo : function ()
                                        {
                                        }
                                }).show();
                        }
                        Event.stop(event);
                }
        }
});

/**
 * addFormSection
 *
 * @param section should be the fieldset that should be added
 * @access public
 * @return void
 */
function addFormSection(section)
{
        section = $(section);
        if (!section)
        {
                return false;
        }
        if (section.hasClassName("compact"))
        {
                var totalChilds = section.select("tbody tr").size();
                var section = section.down("tbody tr");
                var copiedSection = section.cloneNode(true);
                var parentSection = section.up("div[minoccurence]");
        }
        else
        {
                var copiedSection = section.cloneNode(true);
                var parentSection = section.up("div[minoccurence]");
                var totalChilds = parentSection.childElements().size() -2;
        }
        if (parentSection)
        {
                var min = parseInt(parentSection.readAttribute("minoccurence"),10);
                var max = Number.MAX_VALUE;
                if (parentSection.readAttribute("maxoccurence") != "*")
                {
                        max = parseInt(parentSection.readAttribute("maxoccurence"),10);
                }
                if (totalChilds > max-1)
                {
                        return false;
                }
                copiedSection.select("div[minoccurence] div.fieldset").each(function (subSection)
                {
                        removeFormSection(subSection);
                });
                clearInputElements(copiedSection,parentSection,totalChilds);
                section.insert({before : copiedSection});
        }
        return true;
}

/**
 * removeFormSection
 *
 * @param section should be the fieldset that should be removed
 * @access public
 * @return void
 */
function removeFormSection(section,target)
{
        section = $(section);
        if (!section)
        {
                return false;
        }
        if (section.hasClassName("compact"))
        {
                var section = target.up("tr");
                var parentSection = section.up("div[minoccurence]");
                var totalChilds = section.siblings().size()+1;
        }
        else
        {
                var copiedSection = section.cloneNode(true);
                var parentSection = section.up("div[minoccurence]");
                var totalChilds = parentSection.childElements().size() -1;
                parentSection.childElements().each(function (child)
                {
                        if (child.tagName.toLowerCase() != "div")
                        {
                                totalChilds--;
                        }
                });
        }
        if (parentSection)
        {
                if (!parentSection.hasAttribute("childcount"))
                {
                        var childCount = parentSection.childElements().size()-1;
                        parentSection.writeAttribute("childcount",childCount);
                }
                else
                {
                        parentSection.writeAttribute("childcount",parseInt(parentSection.readAttribute("childcount"),10)+1);
                }
                var min = parseInt(parentSection.readAttribute("minoccurence"),10);
                var max = Number.MAX_VALUE;
                if (parentSection.readAttribute("maxoccurence") != "*")
                {
                        max = parseInt(parentSection.readAttribute("maxoccurence"),10);
                }
                if (totalChilds > min && totalChilds > 1)
                {
                        section.remove();
                }
                else
                {
                        clearInputElements(section,parentSection);
                        parentSection.select("div[minoccurence] div.fieldset").each(function (subSection)
                        {
                                removeFormSection(subSection);
                        });
                }

        }
        return true;
}

/**
 * clearInputElements
 *
 * @param section $section
 * @access public
 * @return void
 */
function clearInputElements(section,parent,totalChilds)
{
        //var parent = section.up("div[minoccurence]");
        // Elment is probably a form control
        if (!parent.hasAttribute("childcount"))
        {
                parent.writeAttribute("childcount",totalChilds);
        }
        parent.writeAttribute("childcount",parseInt(parent.readAttribute("childcount"),10)+1);
        var nextChildNumber = parent.readAttribute("childcount");
        section.descendants().each(function (element)
        {
                if (element.tagName.toLowerCase() == "input" || element.tagName.toLowerCase() == "select" || element.tagName.toLowerCase() == "textarea")
                {
                        var name = element.readAttribute("name");
                        if (name)
                        {
                                // clear name
                                element.writeAttribute("name",name.replace(/(.*)(\[-*\d+\])(\[\w+\])/,"$1[-"+nextChildNumber+"]$3"));
                                if (element.type == "hidden")
                                {
                                        // if not an ajax hidden element, continue without doing anything
                                        var prevElement = element.previous("input");
                                        if (prevElement && prevElement.hasClassName("ajaxSelect"))
                                        {
                                        }
                                        else
                                        {
                                                return;
                                        }
                                }
                                // otherwise reset value
                                if ($F(element) && element.type && element.type != "radio")
                                {
                                        element.value = "";
                                }
                        }
                        if (element.hasClassName("ajaxSelect"))
                        {
                                if ($("ajaxSelect"))
                                {
                                        $("ajaxSelect").remove();
                                }
                                element.value = "";
                                element.stopObserving("click");
                                element.stopObserving("keydown");
                                element.stopObserving("keyup");
                                delete(element.ajaxSelect);
                        }
                }
                if (element.hasClassName("validationAdvice"))
                {
                        element.remove();
                }
                if (element.readAttribute("id") !== null)
                {
                        element.writeAttribute("id",null);
                }
        });

}

/**
 * Renumbers the tabindices of a form
 *
 * @param form Form to be renumbered
 * @access public
 * @return void
 */
function renumberTabIndices(form)
{
        if (!form)
        {
                return;
        }
        var tabIndex = 1;
        $(form).getElements().each(function (formElement)
        {
                if (formElement.type != "hidden")
                {
                        formElement.tabIndex = tabIndex;
                        formElement.writeAttribute("tabindex",tabIndex);
                        tabIndex++;
                }
        });
}

Akyla.Pms = new Akyla_Prototype_Pms();

Object.extend(Akyla.JSON,{
        processData : function (data)
        {
                if (data.eOfficeMenus)
                {
                
                         Object.keys(data.eOfficeMenus).forEach(function(groupMenuKey) 
                         {
                                var hasItems = 0;
                        Object.keys(data.eOfficeMenus[groupMenuKey]).forEach(function(menuItemKey) 
                        {
                                        var menuItem = $("pageMenu").down("a[rel="+menuItemKey+"]")
                                if (menuItem)
                                {
                                        if (data.eOfficeMenus[groupMenuKey][menuItemKey] > 0)
                                        {
                                                hasItems = 1;
                                                var menuItemSpan = menuItem.down("span");
                                                if (menuItemSpan)menuItemSpan.update(" ("+data.eOfficeMenus[groupMenuKey][menuItemKey]+")");
                                                if ( menuItem.hasClassName('invisible') ) menuItem.removeClassName("invisible");
                                        }
                                        else
                                        {
                                                if ( ! menuItem.hasClassName('invisible') ) menuItem.addClassName("invisible");
                                        }
                                }
                        });

                                var menuGroup = $("pageMenu").down("h1[title="+groupMenuKey+"]");
                                if ( menuGroup )
                                {
                                if ( hasItems == 1 )
                                {
                                        if ( ! menuGroup.hasClassName('active') )
                                        {
                                                        var slidee = menuGroup.nextSibling;
                                                        menuGroup.removeClassName("invisible");
                                                        slidee.removeClassName("invisible");    
                                                        slidee.addClassName("animating");       
                                                        menuGroup.addClassName("active");
                                                        new Effect.SlideDown(slidee,
                                                        {
                                                                duration:0.5,
                                                                afterFinish : function ()
                                                                {
                                                                        slidee.removeClassName("animating");
                                                                        slidee.removeClassName("closed");
                                                                }
                                                        });
                                                }
                                                else
                                                {
                                                }
                                }
                                else
                                {
                                                var slidee = menuGroup.nextSibling;
                                                menuGroup.removeClassName("active");
                                                slidee.addClassName("animating");       
                                                new Effect.SlideUp(slidee,
                                                {
                                                        duration:0.5,
                                                        afterFinish : function ()
                                                        {
                                                                slidee.removeClassName("animating");
                                                                slidee.addClassName("closed");
                                                                menuGroup.addClassName("invisible");
                                                                slidee.addClassName("invisible");       
                                                        }
                                                });
                                }
                                }
                    });
                }
        }
});

Object.extend(Akyla.Tester,{
        preferences :
        {
                minValidYear : 1900,
                maxValidYear : null
        }
});

Object.extend(Akyla.Form.Validator,{
        preferences :
        {
                saveButtonReEnableDelay : 30000,
                autoFocus : false
        },
        removeAjaxSelect : function (element)
        {
                var ajaxSelect = element.ajaxSelect;
                if (ajaxSelect)
                {
                        var summaryDiv = element.up().down("div.ajaxSummary div");
                        if (summaryDiv && summaryDiv.readAttribute("objectid") && summaryDiv.readAttribute("objectid") == element.next().value)
                        {
                        }
                        else
                        {
                                this.ajaxSummary(element);
                        }
                        ajaxSelect.stopObserving("click");
                        element.stopObserving("click");
                        element.stopObserving("keydown");
                        element.stopObserving("keyup");
                        if (!element.up("div"))
                        {
                                ajaxSelect.remove();
                                return;
                        }
                        var answerOptions = element.up("div").down(".answerOptions");
                        var cloneBack = ajaxSelect.cloneNode(true);
                        cloneBack.setStyle({display : "none"}).writeAttribute({id : null});
                        answerOptions.replace(cloneBack);
                        element.ajaxSelect = null;
                        ajaxSelect.remove();

                }
        },
        ajaxSummary : function (element)
        {
                var ajaxSelect = element.ajaxSelect;
                var hiddenInput = element.next();
                if (!ajaxSelect || !hiddenInput || hiddenInput.value == "")
                {
                        return;
                }
                var form = element.up("form");
                var objectHolder = element.up("div.objectHolder");
                if (objectHolder)
                {
                        var controller = controller.id;
                }
                else if (form.hasAttribute("controller"))
                {
                        var controller = form.readAttribute("controller");
                }
                else 
                {
                        return;
                }
                var elementName = hiddenInput.name;
                
                Akyla.Ajax.ajaxRequest(controller+"/ajaxsummary/column/"+elementName+"/value/"+hiddenInput.value,null,
                {
                        form : form,
                        realElement : element.ajaxSummary,
                        func :  function (el)
                        {
                                el.removeClassName("collapsed");
                                setTimeout(function ()
                                {
                                        var date = new Date().getTime();
                                        if (date > el.date+2900)
                                        {
                                                el.addClassName("collapsed");
                                        }
                                },3000);
                        }
                });
                element.ajaxSummary.date = new Date().getTime();
        },
        createAjaxSelect : function (element)
        {
                var ajaxSelect = element.ajaxSelect;
                if (ajaxSelect)
                {
                        return;
                }
                var answerOptions = element.up("div").down(".answerOptions");
                ajaxSelect = answerOptions.cloneNode(true);
                ajaxSelect.writeAttribute("id","ajaxSelect");
                var pos = element.viewportOffset();
                element.activate();
                element.ajaxSelect = ajaxSelect;
                ajaxSelect.element = element;
                $(document.body).insert({bottom : ajaxSelect});
                ajaxSelect.setStyle({display : "block", left : (pos.left)+"px", top : (pos.top+21)+"px"});
                if (ajaxSelect.select("table tr").size() < 1)
                {
                        this.canSearch = true;
                        this.searchTime = new Date().getTime()-1;
                        this.trySearch(element);
                }

                if (!element.ajaxSummary)
                {
                        var offset = element.positionedOffset();
                        var ajaxSummary = element.up().down("div.ajaxSummary").setStyle({ left : (offset.left+element.getWidth()+10)+"px", top : (offset.top)+"px"});
                        //$(document.body).insert({bottom : ajaxSummary});
                        element.ajaxSummary = ajaxSummary;
                        ajaxSummary.element = element;
                }

                //this.canSearch = true;
                //this.searchTime = new Date().getTime()-1;
                //this.trySearch(element);
                ajaxSelect.observe("mousedown", function (event)
                {
                        var target = $(event.target);
                        if (!target)
                        {
                                return;
                        }
                        if (target.tagName.toLowerCase() != "tr")
                        {
                                target = $(target).up("tr");
                        }
                        element.setValue(target.readAttribute("label"));
                        var newValue = target.readAttribute("value");
                        if (!element.next("input[type=hidden]"))
                        {
                                ajaxSelect.setStyle({display : "none"});
                                Event.stop(event);
                                return;
                        }
                        element.next("input[type=hidden]").setValue(newValue);
                        var selected = ajaxSelect.down("tr.option.selected");
                        if (selected)
                        {
                                selected.removeClassName("selected");
                        }
                        ajaxSelect.down("tr.option[value="+newValue+"]").addClassName("selected");
                        ajaxSelect.setStyle({display : "none"});
                        this.ajaxSummary(element);
                        this.handleCustodians(element);
                        Event.stop(event);
                        //element.activate();
                }.bind(this));
                $(element).observe("mouseup", function (event)
                {
                        var ajaxSelect = element.ajaxSelect;
                        if (ajaxSelect)
                        {
                                if (ajaxSelect.descendants().size() < 1)
                                {
                                        this.canSearch = true;
                                        this.searchTime = new Date().getTime()-1;
                                        this.trySearch(element);

                                }
                                ajaxSelect.setStyle({display : "block"});
                                //this.searchTime = new Date().getTime()+300;
                                //this.canSearch = true;
                                //this.trySearch(element);
                        }
                }.bind(this));
                $(element).observe("keydown", function (event)
                {
                        var ajaxSelect = element.ajaxSelect;
                        if (event.keyCode == Event.KEY_UP)
                        {
                                if (!ajaxSelect.visible())
                                {
                                        ajaxSelect.setStyle({display : "block"});
                                }
                                var selected = ajaxSelect.down("tr.option.selected");
                                if (selected)
                                {
                                        var prevOption = selected.previous();
                                        if (prevOption)
                                        {
                                                if (prevOption.hasClassName("option"))
                                                {
                                                        selected.removeClassName("selected");
                                                        prevOption.addClassName("selected");
                                                        element.setValue(prevOption.readAttribute("label"));
                                                        element.next("input[type=hidden]").setValue(prevOption.readAttribute("value"));
                                                }
                                        }
                                        Event.stop(event);
                                }
                                else
                                {
                                        var prevOption = ajaxSelect.select(".option").last();
                                        if (prevOption)
                                        {
                                                prevOption.addClassName("selected");
                                                element.setValue(prevOption.readAttribute("label"));
                                                element.next("input[type=hidden]").setValue(prevOption.readAttribute("value"));
                                        }
                                        Event.stop(event);
                                }
                        }
                        else if (event.keyCode == Event.KEY_DOWN)
                        {
                                var ajaxSelect = element.ajaxSelect;
                                if (!ajaxSelect.visible())
                                {
                                        ajaxSelect.setStyle({display : "block"});
                                }
                                var selected = ajaxSelect.down("tr.option.selected");
                                if (selected)
                                {
                                        var nextOption = selected.next();
                                        if (nextOption)
                                        {
                                                if (nextOption.hasClassName("option"))
                                                {
                                                        selected.removeClassName("selected");
                                                        nextOption.addClassName("selected");
                                                        element.setValue(nextOption.readAttribute("label"));
                                                        element.next("input[type=hidden]").setValue(nextOption.readAttribute("value"));
                                                }
                                        }
                                }
                                else
                                {
                                        var nextOption = ajaxSelect.select(".option").first();
                                        if (nextOption)
                                        {
                                                nextOption.addClassName("selected");
                                                element.setValue(nextOption.readAttribute("label"));
                                                element.next("input[type=hidden]").setValue(nextOption.readAttribute("value"));
                                        }
                                }
                                Event.stop(event);
                        }
                        else if (event.keyCode == Event.KEY_RETURN)
                        {
                                var selected = ajaxSelect.down("tr.option.selected");
                                if (selected)
                                {
                                        element.setValue(selected.readAttribute("label"));
                                        element.next("input[type=hidden]").setValue(selected.readAttribute("value"));
                                        this.ajaxSummary(element);
                                }
                                Event.stop(event);
                        }

                }.bind(this));
                $(element).observe("keyup", function (event)
                {
                        if (event.keyCode > 45 || event.keyCode == 8)
                        {
                                element.writeAttribute({search : element.value});
                                this.searchTime = new Date().getTime()+300;
                                this.canSearch = true;
                                setTimeout(function ()
                                {
                                        this.trySearch(element);
                                }.bind(this),350);
                        }
                        //Event.stop(event);
                }.bind(this));
        },
        trySearch : function (element)
        {
                if (!this.canSearch)
                {
                        return;
                }
                var date = new Date().getTime();
                if (date >= this.searchTime)
                {
                        var form = element.up("form");
                        var objectHolder = element.up("div.objectHolder");
                        if (objectHolder)
                        {
                                var controller = controller.id;
                        }
                        else if (form.hasAttribute("controller"))
                        {
                                var controller = form.readAttribute("controller");
                        }
                        else 
                        {
                                return;
                        }
                        var hiddenInput = element.next();
                        var elementName = hiddenInput.name;
                        var depString = "";
                        if (hiddenInput.hasAttribute("dependencies"))
                        {
                                var deps = hiddenInput.readAttribute("dependencies").split(" ");
                                deps.each(function (dependency)
                                {
                                        var value = $F(form.down("[name="+dependency+"]"));
                                        if (!value)
                                        {
                                                value = -1;
                                        }
                                        depString = depString + "/"+dependency+"/"+value;
                                });
                        }
                        var image = new Element("img", {src : Akyla.preferences.baseUrl+"/image/gfx/ajax_loading.gif"});
                        image.addClassName("ajaxLoading");
                        $("ajaxSelect").update(image);
                        var value = element.value;
                        if (value == "")
                        {
                                value = "*";
                        }
                        value = value.replace('\/','_-');
                        value = value.replace('\\','-_');
                        Akyla.Ajax.ajaxRequest(controller+"/ajaxselect/column/"+elementName+"/value/"+value+depString,null,{form : form});
                        this.canSearch = false;
                }
        },
        handleCustodians : function (element)
        {
                var hiddenInput = element.next();
                var form = element.up("form");
                if (hiddenInput.hasAttribute("custodians"))
                {
                        var custodians = hiddenInput.readAttribute("custodians").split(" ");
                        custodians.each(function (custodian)
                        {
                                if (custodian[0] == "*")
                                {
                                        var elements = form.select("[name*="+custodian.substring(1)+"]");
                                        if (elements)
                                        {
                                                elements.each(function (el)
                                                {
                                                        el.value = "";
                                                        el.previous().value = "";
                                                });
                                        }
                                }
                                else
                                {
                                        var el = form.down("[name="+custodian+"]");
                                        if (el)
                                        {
                                                el.value = "";
                                                el.previous().value = "";
                                        }
                                }
                        });
                }
        },
        behaviourFunctions :
        {
                selectTitle : function (element)
                {
                        var fieldset = element.up("div.fieldset"),
                                hidden = element.next(),
                                hiddenVal = hidden && parseInt($F(hidden),10),
                                relHidden = fieldset && fieldset.down("input[name*=genderTypeId]"),
                                relElement = relHidden && relHidden.previous(),
                                lookup = {
                                        1 : {id : 1, text : 'Man'},
                                        2 : {id : 2, text : 'Vrouw'},
                                };
                        if (relElement)
                        {
                                relHidden.value = lookup[hiddenVal].id;
                                relElement.value = lookup[hiddenVal].text;
                        }
                },
                selectGender : function (element)
                {
                        var fieldset = element.up("div.fieldset"),
                                hidden = element.next(),
                                hiddenVal = hidden && parseInt($F(hidden),10),
                                relHidden = fieldset && fieldset.down("input[name*=titleId]"),
                                relElement = relHidden && relHidden.previous(),
                                lookup = {
                                        1 : {id : 1, text : 'Dhr.'},
                                        2 : {id : 2, text : 'Mevr.'},
                                };
                                if (relElement)
                                {
                                        relHidden.value = lookup[hiddenVal].id;
                                        relElement.value = lookup[hiddenVal].text;
                                }
                },
                birthday : function (element)
                {
                        var birthdatearray = element.value.split('-');
                        if (birthdatearray.length == 3)
                        {
                                // Store the current date and time
                                var current_date = new Date();
                                var current_day = current_date.getDate(); //day  1-31
                                var current_month = current_date.getMonth(); //month 0-11
                                var current_year = current_date.getFullYear();

                                // Store the date of the birthday
                                var dayIndex = 0;
                                var monthIndex = 1;
                                var yearIndex = 2;
                                var next_birthday_date = new Date();
                                next_birthday_date.setDate(parseInt(birthdatearray[dayIndex],10));
                                next_birthday_date.setMonth((parseInt(birthdatearray[monthIndex],10) -1 )); //month 0-11
                                var age = 0;
                                if ( current_month > next_birthday_date.getMonth() || (current_month == next_birthday_date.getMonth() && current_day >= next_birthday_date.getDate()) )
                                {
                                        next_birthday_date.setFullYear((current_year + 1));
                                        age = current_year - birthdatearray[yearIndex];
                                }
                                else
                                {
                                        next_birthday_date.setFullYear(current_year);
                                        age = current_year - birthdatearray[yearIndex] - 1;
                                }
                                // Call the days_between function
                                var days_left = days_between(next_birthday_date, current_date );

                                var birtdayText = age + ' Jaar';
                                if (days_left == 1)
                                {
                                        birtdayText += ', ' + days_left + ' dag tot de volgende verjaardag.';
                                }
                                else
                                {
                                        birtdayText += ', ' + days_left + ' dagen tot de volgende verjaardag.';
                                }

                                commentElement = element.up().down("span.formElementComment");
                                commentElement.innerHTML = "&nbsp;" + birtdayText;
                        }
                        else
                        {
                                commentElement = element.up().down("span.formElementComment");
                                commentElement.innerHTML = "&nbsp;";
                        }
                },
                calcFlexExtraLine : function (element)
                {
                        var tr = element.up("tr");
                        var component = tr.down("select");
                        component = $F(component);
                        var flexassignment = $F(element.up("form").down("input[name=flexAssignmentId]"));
                        if (!flexassignment)
                        {
                                return; 
                        }
                        var url ='calculation/calcflexextraline/component/' + component + '/flexassignment/' + flexassignment  ;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        element.up("td").next().innerHTML= data.taxable;
                                        element.up("td").next(2).innerHTML= '&euro; ' + data.cost;
                                        element.up("td").next(1).innerHTML= '&euro; ' + data.wage;

                                }       
                        });
                },
                calcVpoExtraLine : function (element)
                {
                        var tr = element.up("tr");
                        var component = tr.down("select");
                        component = $F(component);
                        var vpoassignment = $F(element.up("form").down("input[name=vpoAssignmentId]"));
                        if (!vpoassignment)
                        {
                                return; 
                        }
                        var url ='calculation/calcvpoextraline/component/' + component + '/vpoassignment/' + vpoassignment  ;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        element.up("td").next().innerHTML= data.taxable;
                                        element.up("td").next(2).innerHTML= '&euro; ' + data.cost;
                                        element.up("td").next(1).innerHTML= '&euro; ' + data.wage;

                                }       
                        });
                },
                calcFlexEndDate : function (element)
                {
                        var date = $F(element);
                        if (!date)
                        {
                                return; 
                        }
                        var flexworker = $F(element.up("form").down("input[name=flexworkerId]"));
                        if (!flexworker)
                        {
                                return; 
                        }
//                      var hist = $F(element.up("form").down("input[name=jobHistoryNumberOfWeeks]"));
                        var url ='calculation/calcflexenddate/flexworker/' + flexworker  + '/date/' + date ;// + '/hist/' + hist;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        element.up("div").down("span").innerHTML= ' Maximale eind datum: ' + data.maxEndDate;
                                }       
                        });

                },
                calcVpoEndDate : function (element)
                {
                        var date = $F(element);
                        if (!date)
                        {
                                return; 
                        }
                        var vpoworker = $F(element.up("form").down("input[name=vpoWorkerId]"));
                        if (!vpoworker)
                        {
                                return; 
                        }
                        var hist = $F(element.up("form").down("input[name=jobHistoryNumberOfWeeks]"));
                        var url ='calculation/calcvpoenddate/vpoworker/' + vpoworker + '/date/' + date + '/hist/' + hist ;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        element.up("div").down("span").innerHTML= ' Maximale eind datum: ' + data.maxEndDate;
                                }       
                        });

                },
                amountzzpLine : function (element)
                {
                        var amount = $F(element);
                        var costcenter = $F(element.up("tr").down("input[type=hidden]"));
                        var url ='calculation/calculateinterimzzphourline/amount/' + amount + '/costcenter/' + costcenter;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        var temp =element.up("tr").select("span[class=value]");
                                        temp[0].innerHTML= '&euro; '+data.cost;
                                        temp[1].innerHTML= '&euro; '+data.total;
                                }       
                        });

                },
                amountzzpExtraLine : function (element)
                {
                        var amount = $F(element);
                        if (!amount)
                        {
                                return; 
                        }
                        var component = $F(element.up("tr").down("input[type=hidden]"));
                        if (!component)
                        {
                                return; 
                        }
                        var url ='calculation/calculateinterimzzpextraline/amount/' + amount + '/component/' + component;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        var temp =element.up("tr").select("span[class=value]");
                                        temp[0].innerHTML= data.cost;
                                        temp[1].innerHTML= data.total;
                                }       
                        });

                },
                flexHourWage : function (element)
                {
                        var component = $F(element.up("td").down("input[type=hidden]"));
                        if (!component)
                        {
                                return; 
                        }
                        var wage = $F(element.up("form").down("input[name=grossWage]"));
                        if (!wage)
                        {
                                return;
                        }
                        var sector = $F(element.up("form").down("input[name=sectorId]"));
                        if (!sector)
                        {
                                return; 
                        }
                        var flexworker = $F(element.up("form").down("input[name=flexworkerId]"));
                        if (!flexworker)
                        {
                                return; 
                        }
                        var flexcompany = $F(element.up("form").down("input[name=flexCompanyId]"));
                        if (!flexcompany)
                        {
                                return true; 
                        }
                        var startdate = $F(element.up("form").down("input[name=startDate]"));
                        var enddate = $F(element.up("form").down("input[name=expectedEndDate]"));
                        var url ='calculation/calculateflexwage/component/' + component + '/wage/' + wage + '/flexworker/' +flexworker + '/flexcompany/' +flexcompany + '/sector/' +sector+ '/startdate/' +startdate+ '/enddate/' +enddate;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        element.up("td").next(1).down("span[class=value]").innerHTML= data.wage;
                                        element.up("td").next(2).down("span[class=value]").innerHTML= data.cost;
                                }       
                        });
                },
                flexCompensation: function (element)
                {
                        var tr = element.up("tr");
                        var component = $F(tr.down("input[type=hidden]"));
                        if (!component)
                        {
                                return; 
                        }
                        var sector = $F(element.up("form").down("input[name=sectorId]"));
                        if (!sector)
                        {
                                return; 
                        }
                        var wage = $F(element);
                        if (!wage)
                        {
                                return; 
                        }
                        var flexworker = $F(element.up("form").down("input[name=flexworkerId]"));
                        if (!flexworker)
                        {
                                return; 
                        }
                        var flexcompany = $F(element.up("form").down("input[name=flexCompanyId]"));
                        if (!flexcompany)
                        {
                                return true; 
                        }
                        var startdate = $F(element.up("form").down("input[name=startDate]"));
                        var enddate = $F(element.up("form").down("input[name=expectedEndDate]"));
                        var url ='calculation/calculateflexcompensationline/component/' + component + '/wage/' + wage + '/flexworker/' +flexworker + '/flexcompany/' +flexcompany+ '/sector/' +sector+ '/startdate/' +startdate+ '/enddate/' +enddate;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        var temp =tr.select("span[class=value]");
                                        temp[0].innerHTML= data.cost;
                                }       
                        });
                },
                vpoHourWage : function (element)
                {
                        var component = $F(element.up("td").down("input[type=hidden]"));
                        if (!component)
                        {
                                return; 
                        }
                        var wage = $F(element.up("form").down("input[name=grossWage]"));
                        if (!wage)
                        {
                                return; 
                        }
                        var sector = $F(element.up("form").down("input[name=sectorId]"));
                        if (!sector)
                        {
                                return; 
                        }
                        var vpoworker = $F(element.up("form").down("input[name=vpoWorkerId]"));
                        if (!vpoworker)
                        {
                                return; 
                        }
                        var vpocompany = $F(element.up("form").down("input[name=vpoCompanyId]"));
                        if (!vpocompany)
                        {
                                return; 
                        }
                        var startdate = $F(element.up("form").down("input[name=startDate]"));
                        var enddate = $F(element.up("form").down("input[name=expectedEndDate]"));
                        var url ='calculation/calculatevpowage/component/' + component + '/wage/' + wage + '/vpoworker/' +vpoworker + '/vpocompany/' +vpocompany+ '/sector/' +sector+ '/startdate/' +startdate+ '/enddate/' +enddate;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        element.up("td").next(1).down("span[class=value]").innerHTML= data.wage;
                                        element.up("td").next(2).down("span[class=value]").innerHTML= data.cost;
                                }       
                        });
                },
                vpoCompensation: function (element)
                {
                        var tr = element.up("tr");
                        var component = $F(tr.down("input[type=hidden]"));
                        if (!component)
                        {
                                return; 
                        }
                        var sector = $F(element.up("form").down("input[name=sectorId]"));
                        if (!sector)
                        {
                                return; 
                        }
                        var wage = $F(element);
                        if (!wage)
                        {
                                return; 
                        }
                        var vpoworker = $F(element.up("form").down("input[name=vpoWorkerId]"));
                        if (!vpoworker)
                        {
                                return; 
                        }
                        var vpocompany = $F(element.up("form").down("input[name=vpoCompanyId]"));
                        if (!vpocompany)
                        {
                                return true; 
                        }
                        var startdate = $F(element.up("form").down("input[name=startDate]"));
                        var enddate = $F(element.up("form").down("input[name=expectedEndDate]"));
                        var url ='calculation/calculatevpocompensationline/component/' + component + '/wage/' + wage + '/vpoworker/' +vpoworker + '/vpocompany/' +vpocompany+ '/sector/' +sector+ '/startdate/' +startdate+ '/enddate/' +enddate;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        var temp =tr.select("span[class=value]");
                                        temp[0].innerHTML= data.cost;
                                }       
                        });
                },
                freelanceHourWage : function (element)
                {
                        var wage = $F(element);
                        if (!wage)
                        {
                                return; 
                        }
                        var externalRate=$F(element.up("td").next(3).down("input[type=text]"));
                        var freelancecompany = $F(element.up("form").down("input[name=freelanceCompanyId]"));
                        if (!freelancecompany)
                        {
                                return; 
                        }
                        var collaborationcontractfreelancelineId = $F(element.up("form").down("input[name=collaborationcontractfreelancelineId]"));
                        var bocollaborationcontractfreelancelineId = $F(element.up("form").down("input[name=bocollaborationcontractfreelancelineId]"));
                        var radioButtonValue = null;
                        element.up("td").next().select("input[type=radio]").each (function (radioButton)
                        {
                                radioButtonValue = $F(radioButton);
                        });
                        var commission = radioButtonValue;
                        var component = $F(element.up("tr").down("td").down("input[type=hidden]"));
                        var url ='calculation/calculatefreelancewage/wage/' + wage + '/freelancecompany/' + freelancecompany + "/commission/" + commission+ '/collaborationcontractfreelancelineId/' +collaborationcontractfreelancelineId+ '/bocollaborationcontractfreelancelineId/' +bocollaborationcontractfreelancelineId + '/externalRate/' + externalRate + '/componentId/' + component;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        element.up("td").next(1).down("span[class=value]").innerHTML= data.wage;
                                        element.up("td").next(2).down("span[class=value]").innerHTML= data.cost;
                                }       
                        });
                },
                freelanceCompensation: function (element)
                {
                        var tr = element.up("tr");
                        var component = $F(tr.down("input[type=hidden]"));
                        if (!component)
                        {
                                return; 
                        }
                        var wage = $F(element);
                        if (!wage)
                        {
                                return; 
                        }
                        var freelancecompany = $F(element.up("form").down("input[name=freelanceCompanyId]"));
                        if (!freelancecompany)
                        {
                                return; 
                        }
                        var collaborationcontractfreelancelineId = $F(element.up("form").down("input[name=collaborationcontractfreelancelineId]"));
                        var bocollaborationcontractfreelancelineId = $F(element.up("form").down("input[name=bocollaborationcontractfreelancelineId]"));
                        var url ='calculation/calculatefreelancecompensationline/component/' + component + '/wage/' + wage + '/collaborationcontractfreelancelineId/' +collaborationcontractfreelancelineId+ '/bocollaborationcontractfreelancelineId/' +bocollaborationcontractfreelancelineId+ '/freelancecompany/' + freelancecompany;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        var temp =tr.select("span[class=value]");
                                        temp[0].innerHTML= data.cost;
                                }       
                        });
                },
                calcCompensationFlex : function (element)
                {
                        var tr = element.up("tr");
                        var component = tr.down("select");
                        if (!component)
                        {
                                component = tr.down("td input[type=hidden]");
                        }
                        if (!component)
                        {
                        //      return; 
                        }
                        else
                        {
                                component = $F(component);
                        }
                        var amount = $F(tr.down("input[type=text].number"));
                        if (!amount)
                        {
                        //      return; 
                        }
                        var flexassignment = $F(element.up("form").down("input[name=flexAssignmentId]"));
                        if (!flexassignment)
                        {
                        //      return; 
                        }
                        var url ='calculation/calculateflexcompensation/component/' + component + '/amount/' + amount + "/flexassignment/" + flexassignment;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        var temp =tr.select("span[class=value]");
                                        temp[0].innerHTML= data.taxable;
                                        temp[1].innerHTML= data.unit;
                                        temp[2].innerHTML= '&euro; '+data.cost;
                                        temp[3].innerHTML= '&euro; '+data.total;
                                        temp[4].innerHTML= '&euro; '+data.totalRate;
                                }       
                        });
                },
                calcCompensationVpo : function (element)
                {
                        var tr = element.up("tr");
                        var component = tr.down("select");
                        if (!component)
                        {
                                component = tr.down("td input[type=hidden]");
                        }
                        if (!component)
                        {
                                return; 
                        }
                        else
                        {
                                component = $F(component);
                        }
                        var amount = $F(tr.down("input[type=text].number"));
                        if (!amount)
                        {
                                return; 
                        }
                        var vpoassignment = $F(element.up("form").down("input[name=vpoAssignmentId]"));
                        if (!vpoassignment)
                        {
                                return; 
                        }
                        var url ='calculation/calculatevpocompensation/component/' + component + '/amount/' + amount + "/vpoassignment/" + vpoassignment;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        var temp =tr.select("span[class=value]");
                                        temp[0].innerHTML= data.taxable;
                                        temp[1].innerHTML= data.unit;
                                        temp[2].innerHTML= '&euro; '+data.cost;
                                        temp[3].innerHTML= '&euro; '+data.total;
                                        temp[4].innerHTML= '&euro; '+data.totalRate;
                                }       
                        });
                },
                calcDeductionFlex : function (element)
                {
                        var tr = element.up("tr");
                        var component = tr.down("select");
                        if (!component)
                        {
                                component = tr.down("td input[type=hidden]");
                        }
                        if (!component)
                        {
                                return; 
                        }
                        else
                        {
                                component = $F(component);
                        }
                        var amount = $F(tr.down("input[type=text].number"));
                        if (!amount)
                        {
                                return; 
                        }
                        var flexassignment = $F(element.up("form").down("input[name=flexAssignmentId]"));
                        if (!flexassignment)
                        {
                                return; 
                        }
                        var url ='calculation/calculateflexdeduction/component/' + component + '/amount/' + amount + "/flexassignment/" + flexassignment;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        var temp =tr.select("span[class=value]");
                                        temp[0].innerHTML= data.taxable;
                                        temp[1].innerHTML= data.unit;
                                        temp[2].innerHTML= '&euro; '+data.cost;
                                        temp[3].innerHTML= '&euro; '+data.total;
                                        temp[4].innerHTML= '&euro; '+data.totalRate;
                                }       
                        });
                },
                calcDeductionVpo : function (element)
                {
                        var tr = element.up("tr");
                        var component = tr.down("select");
                        if (!component)
                        {
                                component = tr.down("td input[type=hidden]");
                        }
                        if (!component)
                        {
                                return; 
                        }
                        else
                        {
                                component = $F(component);
                        }
                        var amount = $F(tr.down("input[type=text].number"));
                        if (!amount)
                        {
                                return; 
                        }
                        var vpoassignment = $F(element.up("form").down("input[name=vpoAssignmentId]"));
                        if (!vpoassignment)
                        {
                                return; 
                        }
                        var url ='calculation/calculatevpodeduction/component/' + component + '/amount/' + amount + "/vpoassignment/" + vpoassignment;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        var temp =tr.select("span[class=value]");
                                        temp[0].innerHTML= data.taxable;
                                        temp[1].innerHTML= data.unit;
                                        temp[2].innerHTML= '&euro; '+data.cost;
                                        temp[3].innerHTML= '&euro; '+data.total;
                                        temp[4].innerHTML= '&euro; '+data.totalRate;
                                }       
                        });
                },
                calcCompensationFreelance: function (element)
                {
                        var tr = element.up("tr");
                        var component = tr.down("select");
                        if (!component)
                        {
                                component = tr.down("td input[type=hidden]");
                        }
                        if (!component)
                        {
                                return; 
                        }
                        else
                        {
                                component = $F(component);
                        }
                        var amount = tr.down("input[type=text].number");
                        if (!amount)
                        {
                                return; 
                        }
                        else
                        {
                                amount = $F(amount);
                        }
                        var freelanceassignment = $F(element.up("form").down("input[name=freelanceAssignmentId]"));
                        if (!freelanceassignment)
                        {
                                return; 
                        }
                        var url ='calculation/calculatefreelancecompensation/component/' + component + '/amount/' + amount + "/freelanceassignment/" + freelanceassignment;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        var temp =tr.select("span[class=value]");
                                        temp[1].innerHTML= data.unit;
                                        temp[2].innerHTML= '&euro; '+data.cost;
                                        temp[3].innerHTML= '&euro; '+data.total;
                                        temp[4].innerHTML= '&euro; '+data.totalRate;
                                }       
                        });
                },
                calcInterimzzp: function (element)
                {
                        var rate=$F(element);
                        if (!rate)
                        {
                                return; 
                        }
                        var externalRate=$F(element.up("td").next(4).down("input[type=text]"));
                        var company = $F(element.up("form").down("input[name=interimzzpCompanyId]"));
                        if (!company)
                        {
                                return; 
                        }
                        var collaborationcontractinterimzzpLineId = $F(element.up("form").down("input[name=collaborationcontractinterimzzpLineId]"));
                        var bocollaborationcontractinterimzzpLineId = $F(element.up("form").down("input[name=bocollaborationcontractinterimzzplineId]"));
                        element.up("td").next(1).select("input[type=radio]").each (function (radioButton)
                        {
                                radioButtonValue = $F(radioButton);
                        });
                        var commission = radioButtonValue;
                        var url ='calculation/calculateinterimzzp/rate/' + rate + '/commission/' + commission + "/company/" + company+ "/collaborationcontractinterimzzpLineId/" + collaborationcontractinterimzzpLineId+ "/bocollaborationcontractinterimzzpLineId/" + bocollaborationcontractinterimzzpLineId + "/externalRate/" + externalRate;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        element.up("td").next(2).innerHTML= "<span class=\"value\">"+data.baseRate+"</span>";
                                        element.up("td").next(3).innerHTML= "<span class=\"value\">"+data.internalRate+"</span>";
                                }       
                        });
                },
                calcInterimzzpCompensation: function (element)
                {
                        var rate=$F(element);
                        if (!rate)
                        {
                                return; 
                        }
                        var externalRate=$F(element.up("td").next(4).down("input[type=text]"));
                        var company = $F(element.up("form").down("input[name=interimzzpCompanyId]"));
                        if (!company)
                        {
                                return; 
                        }
                        var collaborationcontractinterimzzpLineId = $F(element.up("form").down("input[name=collaborationcontractinterimzzpLineId]"));
                        var bocollaborationcontractinterimzzpLineId = $F(element.up("form").down("input[name=bocollaborationcontractinterimzzplineId]"));
                        element.up("td").next(1).select("input[type=radio]").each (function (radioButton)
                        {
                                radioButtonValue = $F(radioButton);
                        });
                        var commission = radioButtonValue;
                        var component = $F(element.up("tr").down("input[type=hidden]"));
                        if (!component)
                        {
                                return; 
                        } 
                        var url ='calculation/calculateinterimzzp/rate/' + rate + '/commission/' + commission + "/company/" + company+ "/collaborationcontractinterimzzpLineId/" + collaborationcontractinterimzzpLineId+ "/bocollaborationcontractinterimzzpLineId/" + bocollaborationcontractinterimzzpLineId+ "/component/" + component + "/externalRate/" + externalRate;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        element.up("td").next(2).innerHTML= "<span class=\"value\">"+data.baseRate+"</span>";
                                        element.up("td").next(3).innerHTML= "<span class=\"value\">"+data.internalRate+"</span>";
                                }       
                        });
                },
                updateStandardComponents : function (section, hoursWorked, daysWorked)
                {
                        if (!section)
                        {
                                return;
                        }
                        if (hoursWorked > 0)
                        {
                                var weeksWorked = 1;
                        }
                        else
                        {
                                var weeksWorked = 0;
                        }
                        section.select("input[unittype].number").each(function (inputElement)
                        {
                                var defaultAmount = parseFloat(inputElement.readAttribute("defaultamount"));    
                                var unitType = inputElement.readAttribute("unittype");
                                var value = inputElement.value;
                                if (unitType == "week")
                                {
                                        inputElement.value = weeksWorked*defaultAmount;
                                }
                                else if (unitType == "day")
                                {
                                        inputElement.value = daysWorked*defaultAmount;
                                }
                                else if (unitType == "hour")
                                {
                                        inputElement.value = hoursWorked*defaultAmount;
                                }
                                var behaviors = inputElement.readAttribute("behaviour").split(" ");
                                behaviors.each(function (behavior)
                                {
                                        if (this[behavior])
                                        {
                                                if (value !== inputElement.value)
                                                {
                                                        this[behavior](inputElement);
                                                }
                                        }
                                }.bind(this));
                                
                        }.bind(this));
                },
                calcTotal: function (element)
                {
                        var tr = element.up("tr");
                        var linetotal=0;
                        var total=0;
                        var timeWorked = new Array();
                        var timeTable = element.up("table");
                        timeTable.select("input[type=text].number").each(function(hours)
                        {
                                var select = hours.up("tr").down("select");
                                if ($F(hours) !== "" )
                                {
                                        if (select && parseInt($F(select),10) != 477)
                                        {
                                        }
                                        else
                                        {
                                                var cellIndex = hours.up("td").cellIndex;
                                                if (!timeWorked[cellIndex])
                                                {
                                                        timeWorked[cellIndex] = 0;
                                                }
                                                timeWorked[cellIndex] = timeWorked[cellIndex] + parseFloat($F(hours));
                                        }
                                }
                        });
                        var daysWorked = timeWorked.findAll(function (day)
                        {
                                return day > 0;
                        });
                        var hoursWorked = 0;
                        daysWorked.each(function (hours)
                        {
                                hoursWorked += hours;
                        });
                        var daysWorked = daysWorked.size();
                        this.updateStandardComponents(element.up("div.fieldset").up().next("div.fieldset"),hoursWorked,daysWorked);
                        this.updateStandardComponents(element.up("div.fieldset").up().next("div.fieldset",1),hoursWorked,daysWorked);
                        tr.select("input[type=text]").each(function(hours)
                        {
                                var time=$F(hours);
                                if (time=="") {
                                        time="0";       
                                }
                                linetotal+=parseFloat(time);
                        });
                        tr.down("span[class=linetotal]").innerHTML= linetotal;
                        timeTable.select("span[class=linetotal]").each(function(line)
                        {
                                var linehour=line.innerHTML;
                                if (linehour=="") {
                                        linehour="0";   
                                }
                                total+=parseFloat(linehour);
                        });
                        element.up("table").down("span[class=total]").innerHTML =total;                 
                },
                checkCivilRegistrationNumber : function (element)
                {
                        // Only run this check for the insert form

                        formElementPostAction = element.up('form').getAttribute('postaction');
                        if ( formElementPostAction.match('insert') )
                        {
                                var service = null;
                                if ( formElementPostAction.match('flexworker') ) service='flexworker';
                                else if ( formElementPostAction.match('vpoworker') ) service='vpoworker';
                                else if ( formElementPostAction.match('freelancer') ) service='freelancer';
                                else if ( formElementPostAction.match('interimzzp') ) service='interimzzp';
                                if (!service)
                                {
                                        return;
                                }
                                var socialNumber = element.value;
                                var url ='personmerger/checksoicialregistrationnumber/socialRegistrationNumber/' + socialNumber + '/service/' + service;
                                Akyla.Ajax.ajaxRequest(url,null,{
                                        onRequestSuccess : function (data) 
                                        {
                                                var requiredData = data.requiredData;
                                                if (requiredData.present)
                                                {
                                                        commentElement = element.up().down("span.formElementComment").addClassName("validationError");
                                                        commentElement.innerHTML = "&nbsp;" + requiredData.message;
                                                        element.writeAttribute("valid","false");
                                                        element.up("div.formPair").addClassName("invalid");
                                                }
                                                else
                                                {
                                                        commentElement = element.up().down("span.formElementComment").removeClassName("validationError");
                                                        commentElement.innerHTML = "&nbsp;" + requiredData.message;
                                                        element.writeAttribute("valid","true");
                                                        element.up("div.formPair").removeClassName("invalid");
                                                }
                                        }       
                                });
                        }
                },
                checkMediator : function (element)
                {
                        mediatorInputElement = element.up('form').down("input[name=mediatorCompanyId]");
                        mediatorAjaxSelect = mediatorInputElement.up('div.ajaxedSelect');
                        mediatorSearchElement = mediatorAjaxSelect.down("input.ajaxSelect");
                        if (element.value == '1')
                        {
                                mediatorSearchElement.enable();
                                //show normal select
                        }
                        else
                        {
                                mediatorSearchElement.disable();
                                mediatorSearchElement.value = mediatorName;
                                mediatorInputElement.value = mediatorId;
                                //add services and disabled select
                        }
                },
                getImage : function (element)
                {
                        documentId = element.value;
                        if (element.hasClassName("ajaxSelect") )
                        {
                                documentId = element.value;
                        }
                },
                calcYearWage : function (element)
                {
                        element.up("div").down("span").update( 'Bruto jaarloon: ' + parseFloat($F(element)) *40 *52);
                },
                /**
                 * Will make sure that the bank element gets its classname removed for validation checks and will remove validation erros
                 *
                 * @param HTMLEelement element The html element which should be check for behavior (should be an input)
                 */
                ibanCheck : function (element)
                {
                        var prefix = $F(element).substr(0,2).toLowerCase(), 
                                bankField = null;
                        // Find the corresponding bankField
                        bankField = element.up("tr").down("input.bank");
                        if (!bankField)
                        {
                                bankField = element.up("tr").down("input.bankForeign");
                        }
                        if (!bankField)
                        {
                                return;
                        }
                        if (prefix != "nl" && $F(element) != "")
                        {
                                // Switch to Foreign bank
                                bankField.removeClassName("bank");
                                bankField.addClassName("bankForeign");
                                // If there was any validation errors, remove them
                                var validationError = bankField.up("div").down("span.validationError.bank");
                                if (validationError)
                                {
                                        validationError.remove();
                                }
                                // recheck the field
                                Akyla.Form.Validator.testElement(bankField);
                        }
                        else if ($F(element) == "" ||  prefix == "nl")
                        {
                                // Switch to NL bank 
                                bankField.removeClassName("bankForeign");
                                bankField.addClassName("bank");
                                // recheck the field
                                Akyla.Form.Validator.testElement(bankField);
                        }
                },
                interimzzpPeriodChange : function (element)
                {
                        var period = element.value;
                        period = period.split(' ',1);
                        if (!period)
                        {
                                return; 
                        }
                        var assignment = $F(element.up("form").down("input[name=interimzzpAssignmentId]"));
                        var costcenters = '';
                        element.up("form").select("input[name*=companyCostcenterId]").each(function (costcenter)
                        {
                                if (! costcenter.name.match('InterimzzpdeclarationextralineTable'))
                                {
                                        costcenters += costcenter.value + '_';
                                }
                        });
                        if ( (!assignment) || costcenters == '' )
                        {
                                return; 
                        }
                        var url = 'interimzzpdeclarationmerger/resetcostcenter/assignment/' + assignment  + '/period/' + period + '/costcenters/' + costcenters;
                        Akyla.Ajax.ajaxRequest(url,null,{
                                onRequestSucces:function (data) {
                                        if (data.isChanged)
                                        {
                                                element.up("form").select("input[name*=companyCostcenterId]").each(function (costcenter)
                                                {
                                                        if (! costcenter.name.match('InterimzzpdeclarationextralineTable'))
                                                        {
                                                                if (data.costcenters[costcenter.value] != '')
                                                                {
                                                                        costcenter.value = data.costcenters[costcenter.value];
                                                                }
                                                        }
                                                });
                                        }
                                }       
                        });

                },
                /**
                 * Will set the class of the formPair to the optionality of the select element
                 *
                 * @param HTMLEelement element The html element which should be check for behavior (should be an input)
                 */
                optionality : function (element)
                {
                        var formPair = element.up("div.formPair");
                        var optional = $F(element);
                        formPair.removeClassName("required").removeClassName("optional").removeClassName("negligible").addClassName(optional);
                        if (optional == "required")
                        {
                                element.next().removeClassName("hidden");
                        }
                        else
                        {
                                element.next().addClassName("hidden");
                        }
                }
        },
        /**
         * Adds automatic collapsing to forms. This will check if the just blurred element was the latest in its fieldset and if the
         * fieldset is collapsable.
         */
        elementBlurred : function(element)
        {
                if (element.hasAttribute("behaviour"))
                {
                        var behaviours = element.readAttribute("behaviour").split(" ");
                        behaviours.each(function (behaviour)
                        {
                                if (this.behaviourFunctions[behaviour])
                                {
                                        this.behaviourFunctions[behaviour](element);
                                }
                        }.bind(this));
                }
                if (element.hasClassName("ajaxSelect"))
                {
                        this.handleCustodians(element);
                        this.removeAjaxSelect(element);
                        return;
                }
                // this is the currentIndex
                var currentIndex = element.tabIndex;
                if (!currentIndex)
                {
                        // Focused element has no tabindex, so no use guessing.
                        return false;
                }
                // select the next element on a smart and fast way
                var nextIndex = currentIndex+1;
                var nextElement = $(element).up("form").down("[tabindex="+nextIndex+"]");
                if (nextElement === null || typeof nextElement == "undefined")
                {
                        return false;
                }
                var nextParent = nextElement.up("div.fieldset");
                var parent = element.up("div.fieldset");
                if (nextParent != parent && nextElement.tabIndex > currentIndex)
                {
                        var switcher = parent.down("div.legend");
                        //if (switcher && switcher.hasClassName("switchable"))
                        //{
                        //      parent.addClassName("collapsed");
                        //}
                }
                return true;
        },
        /**
         * Adds automatic decollapsing to forms by decollapsing the element with the next tabindex whenever an element gets focused
         * This is done this way because invisible elements can't be focused.
         */
        elementFocused : function(element)
        {
                // this is the
                var currentIndex = element.tabIndex;
                if (!currentIndex)
                {
                        // Focused element has no tabindex, so no use guessing.
                        return;
                }
                var nextIndex = currentIndex+1;
                
                // Expand next section
                var nextElement = element.up("form").down("[tabindex="+nextIndex+"]");
                var prevElement = element.up("form").down("[tabindex="+(nextIndex-2)+"]");
                if (nextElement)
                {
                        var fieldset = nextElement.up("div.fieldset.collapsed");
                        if (fieldset)
                        {
                                        fieldset.removeClassName("collapsed");
                        }
                }

                // Expand previous section
                if (prevElement)
                {
                        var fieldset = prevElement.up("div.fieldset.collapsed");
                        if (fieldset)
                        {
                                fieldset.removeClassName("collapsed");
                        }
                }
                
                // Expand parents
                if (nextElement !== null)
                {
                        var done = false;
                        var parent = nextElement;
                        while (!done && parent !== null && typeof parent != "undefined")
                        {
                                // go through all parents which might be collapsed
                                parent = parent.up(".collapsed");
                                if (!parent)
                                {
                                        done = true;
                                }
                                else
                                {
                                        parent.removeClassName("collapsed");
                                }
                        }
                }
                if (element.hasClassName("ajaxSelect"))
                {
                        this.createAjaxSelect(element);
                        if (element.next().hasAttribute("dependencies"))
                        {
                                this.canSearch = true;
                                this.searchTime = new Date().getTime()-1;
                                this.trySearch(element);
                        }
                }
        }
});

Object.extend(Akyla.Form.Validator.testables,
{
        dateOfBirth :
        {
                message : "Geboortedaum mag niet in de toekomst liggen; ook mag de persoon niet ouder zijn dan 85 jaar.",
                tester : function (v,elm)
                {
                        var today = new Date();
                        var earlier = new Date(today.getFullYear()-85, today.getMonth(), today.getDay());
                        //var earlier = earlier.setDate(earlier.getDate()-(85*365));
                        var elDate = Akyla.Tester.getDate(v);
                        if(Akyla.Tester.isEmpty(v))
                        {
                                return true;
                        }
                        else
                        {
                                return ((today > elDate) && (elDate > earlier));
                        }
                        return false;
                }
        }
});

Akyla.Form.Validator.testables.currency = Akyla.Form.Validator.testables.number;
/*
 * Use async loading of Tabs
 */
Akyla.Widget.Tabs.domLoaded = function()
        {
                //observe the AkylaTab.js when window load
                this.initTabsAsync(document.body);
                Event.observe(document,"container:change", function (event)
                {
                        this.initTabsAsync(event.target);
                }.bind(this));
        };

Akyla_Prototype_Widget_Tab = Class.create(Akyla_Prototype_Widget_Tab,{
        afterChange : function(oldTabNumber, newTabNumber)
        {
                if (this.tabElement.up("objectsTabsContainer"))
                {
                        Akyla.Pms.changeToObjectHolder(this.tabElement.up("div.objectHolder").id);
                }
                var titleSelector = this.titleSelectors.get("main")+"[objectid="+oldTabNumber+"]";
                var title = $$(titleSelector);
                if (title.size() == 0)
                {
                        return;
                }
                if (title)
                {
                        title = title.first();
                }
                if (title.hasAttribute("href"))
                {
                        var contentSelector = this.contentSelectors.get("main")+"[objectid="+oldTabNumber+"]";
                        var content = $$(contentSelector);
                        if (content)
                        {
                                content = content.first();
                        }
                        content.update(new Element("img",{src : "image/gfx/ajax_process.gif"}));
                }
        },
        loadDefaultPreferences : function()
        {
                this.preferences =
                        {
                                activeClassName : "active",
                                defaultActiveTab : 0,
                                previewPaned : false,
                                scrollButtons : true,
                                scrollButtonsRight : true
                        };
        },
        afterInit : function()
        {
                /**
                this.tabElement.observe("dblclick", function (event)
                {
                        var container = this.tabElement.up("div.objectHolder");
                        if (container)
                        {
                                container.toggleClassName("bigHolder");
                        }
                        Event.stop(event);
                }.bind(this));
                */
        },
        afterAdd : function(addedTabNumber)
        {
                var obj = this.tabElement.up("div.objectHolder").id;
                var content = this.tabElement.down("div.content[objectid="+addedTabNumber+"]");
                if (content.down("div.toolbar button[action=refresh]"))
                {
                        return;
                }
                var possibleSteps = new Array();
                var childs = content.down("div.fieldset");
                if (!childs)
                        return;
                if (content.down("div.form-info"))
                {
                        var newContent = content.down("div.form-info").cloneNode(true);
                        $(newContent).addClassName("toggled");
                        Akyla.WindowHandler.factory("Alert",
                                {
                                        id : "alert",
                                        content : newContent 
                                }).show();
                }
                function isParent(fieldset)
                {
                        var result = true;
                        $(fieldset).childElements().each(function (child)
                        {
                                if (child.hasClassName("fieldset") || child.hasClassName("legend")) 
                                {
                                } 
                                else 
                                {
                                        result = false;
                                }
                        });
                        return result;
                }
                if (childs.down("div.fieldset div.fieldset div.fieldset")) {
                        var childSize = childs.childElements().size();
                        childs.childElements().each(function (child)
                        {
                                var fd = child.firstDescendant();
                                if (childSize !==1 && fd.next().hasClassName("fieldset"))
                                {
                                        fd.next().childElements().each(function (fs)
                                        {
                                                if (fs.hasClassName("fieldset"))
                                                {
                                                        possibleSteps.push(fs);
                                                }
                                        });
                                }
                                else
                                {
                                        possibleSteps.push(child);
                                }
                        });
                }
                else if (childs.down("div.fieldset div.fieldset"))
                {
                        childs.childElements().each(function (fs)
                        {
                                if (fs.hasClassName("fieldset"))
                                {
                                        possibleSteps.push(fs);
                                }
                        });
                }
                else 
                {
                        content.select("div.fieldset").each(function (fs)
                        {
                                if (!isParent(fs))
                                {
                                        possibleSteps.push(fs);
                                }
                        });
                }
                var holder = new Element('div', {'class' : 'akylaWizard content'});
                var form = content.down("form");
                form.writeAttribute("controller",form.up("div.objectHolder").id);
                holder.insert({bottom : form});
                var index = 1;
                possibleSteps.each(function (child)
                {
                        if (child.up("div.step-wrapper"))
                        {
                                /*continue;  //continue does not work in IE*/
                        }
                        else
                        {
                                var wrap = child.wrap('div', { 'class': 'step-wrapper', 'step' : index });
                                child.removeClassName("collapsed");
                                if (index != 1)
                                {
                                        wrap.addClassName("hidden");
                                }
                                index++;
                        }
                });
                var wizard = Akyla.WindowHandler.factory("Wizard",
                {
                                id : "wizard",
                                content : holder
                });
                wizard.externalData = {
                        tabElement : this,
                        tabNumber : addedTabNumber
                };
                wizard.show();
                wizard.step(1);
                this.remove(addedTabNumber);
                var tabCount = this.tabCount-1;
                if (tabCount > 0)
                {
                        $("leftPane").down("a[rel="+obj+"] span").update(" ("+tabCount+")");
                        var target = $("pageMenu").down("a[rel="+obj+"]");
                        var rel = target.readAttribute("rel");
                        target = target.up(1).previous();
                        target = target.previous();
                        //$("pageMenu").slidingMenu.expand(target);
                        Akyla.Pms.changeToObjectHolder(rel);
                }
                else
                {
                        $("leftPane").down("a[rel="+obj+"] span").update("");
                }
        },
        beforeRemove : function(removedTabNumber, cascade)
        {
        },
        afterRemove : function(removedTabNumber)
        {
        }
});

function days_between(date1, date2) {

    // The number of milliseconds in one day
        var ONE_DAY = 1000 * 60 * 60 * 24;

    // Convert both dates to milliseconds
        var date1_ms = date1.getTime();
        var date2_ms = date2.getTime();

    // Calculate the difference in milliseconds
        var difference_ms = Math.abs(date1_ms - date2_ms);

        // Convert back to days and return
        return Math.round(difference_ms/ONE_DAY);
}


/**
 * Handles key events
 *
 * @param event event
 */
function handleKeyEvent(event)
{
        event = event || window.event;
        var keyCode = event.keyCode;
        var keyHandlers = {
                0 : function ()
                {
                },
                executeButton : function(buttonAction)
                {
                        var activeModule = $(document.body).down("div.objectHolder.active");
                        if (typeof activeModule == "undefined" || activeModule === null)
                        {
                                return false;
                        }
                        var activeTab = activeModule.down("div.akylaTab").akylaTab;
                        var button = activeModule.down("div.content[objectid="+activeTab.activeTab+"] div.toolbar button[action="+buttonAction+"]");
                        if (!button)
                        {
                                return;
                        }
                        var href = button.readAttribute("href");
                        if (!href)
                        {
                                return;
                        }
                        if (buttonAction == "delete")
                        {
                                Akyla.WindowHandler.factory("Confirm", {
                                                id : "confirm",
                                                content : "Weet u zeker dat u dit object wilt verwijderen?",
                                                onYes : function ()
                                                {
                                                        Akyla.Ajax.ajaxRequest(href,null,{});
                                                },
                                                onNo : function ()
                                                {
                                                }
                                        }).show();
                        }
                        else
                        {
                                Akyla.Ajax.ajaxRequest(href,null,{});
                        }
                        return true;
                },
                /**
                 * F1 handler : help
                 */
                112 : function ()
                {
                        var activeModule = $(document.body).down("div.objectHolder.active");
                        var activeTab = activeModule.down("div.akylaTab").akylaTab.activeTab;
                        var helpDialog = Akyla.WindowHandler.getById("help");
                        if (!helpDialog)
                        {
                                helpDialog = Akyla.WindowHandler.factory("Help", {overlayEnabled : false, id : "help", contentType : "htmlNode", content : "helpHelper"}).setTitle("Help").setFooter("F1 toets sluit dit menu weer");
                        }
                        if (helpDialog)
                        {
                                helpDialog.toggle();
                        }
                },
                /**
                 * F2 handler : Save
                 */
                113 : function ()
                {
                        var activeModule = $(document.body).down("div.objectHolder.active");
                        var activeTabHolder = activeModule.down("div.akylaTab");
                        var activeTab = activeTabHolder.akylaTab;
                        var target = activeTabHolder.down("div.toolbar button.saveButton");
                        var form = activeModule.down("div.content[objectid="+activeTab.activeTab+"] form");
                        Akyla.Form.Validator.handleClick(form,target,"button");
                },
                /**
                 * F3 handler
                 */
                114 : function ()
                {
                        var activeModule = $(document.body).down("div.objectHolder.active");
                        var activeTab = $(activeModule).down("div.contents div.content[objectid=0]");
                        if (activeTab)
                        {
                                var searchWidget = $(activeTab).down("div.searchWidget input.search");
                                if (searchWidget)
                                {
                                        searchWidget.activate();
                                }
                        }
                },
                /**
                 * F4 handler : Close tab
                 */
                115 : function ()
                {
                        var activeModule = $(document.body).down("div.objectHolder.active");
                        var activeTab = activeModule.down("div.akylaTab").akylaTab;
                        activeTab.remove(activeTab.activeTab);
                },
                /**
                 * F5 handler : refresh
                 */
                116 : function ()
                {
                        this.executeButton("refresh");
                },
                /**
                 * F6 handler : New
                 */
                117 : function ()
                {
                        this.executeButton("insertform");
                },
                /**
                 * F7 handler : Delete
                 */
                118 : function ()
                {
                        this.executeButton("delete");
                },
                /**
                 * F8 handler : Editform
                 */
                119 : function ()
                {
                        this.executeButton("editform");
                },
                /**
                 * F9 handler
                 */
                120 : function ()
                {
                        this.executeButton("note");
                },
                /**
                 * F10 handler
                 */
                121 : function ()
                {
                },
                /**
                 * F11 handler
                 */
                122 : function ()
                {
                },
                /**
                 * F12 handler
                 */
                123 : function ()
                {
                },
                /**
                 * ESC handler
                 */
                27 : function ()
                {
                        var helpDialog = Akyla.WindowHandler.getById("help");
                        if (helpDialog && helpDialog.visible())
                        {
                                helpDialog.toggle();
                        }
                }
        };
        if(keyCode !== 0 && ((keyCode >= 112 && keyCode <= 123) || keyCode == 27) && keyHandlers[keyCode])
        {
                keyHandlers[keyCode]();
                stopKeyEvent(event);
                return false;
        }
        return true;
}

function stopKeyEvent(event)
{
        //e.cancelBubble is supported by IE - this will kill the bubbling process.
        event.cancelBubble = true;
        event.returnValue = false;

        //e.stopPropagation works only in Firefox.
        if (event.stopPropagation)
        {
                event.stopPropagation();
                event.preventDefault();
        }
        else
        {
                event.keyCode = 0;
        }

}

// Additional code for NS
if (document.addEventListener)
{
        document.addEventListener("keydown",handleKeyEvent,true);
        window.onhelp = function (event)
        {
                return false;
        };
}
else
{
        document.onkeydown = function (event)
        {
                return handleKeyEvent(event);
        };
        window.onhelp = function (event)
        {
                return false;
        };
        document.onhelp = function (event)
        {
                return handleKeyEvent(event);
        };
}
/**
 *
 * The help dialog
 */
Akyla.WindowHandler.Help = Class.create(Akyla.WindowHandler.SlideDown,
{
        loadDefaultPreferences : function()
        {
                this.preferences =
                {
                        contentType : "htmlNode",
                        autoReload : false,
                        autoFocus : true,
                        overlayEnabled : false
                };
        },
        observeDialog : function()
        {
                var eventType = "keydown";
                this.dialog.observe(eventType, function (event)
                {
                        var inputEl = this.innerDiv.down("input");
                        var value = inputEl.value;
                        var target = $("pageMenu").down("a[shortcut="+value+"]");
                        if (event.target != inputEl || !target)
                        {
                                return;
                        }
                        if (event.keyCode == 13)
                        {
                                var rel = target.readAttribute("rel");
                                Akyla.Pms.forceMenuAction(rel);
                                this.hide();
                        }
                }.bind(this));
                var eventType = "keyup";
                if (Prototype.Browser.IE)
                {
                        eventType = "keyup";
                }
                this.dialog.observe(eventType, function (event)
                {
                        var keyCode;
                        if (event.which == null)
                        {
                                keyCode = String.fromCharCode(event.keyCode);
                        }
                        else if (event.which > 0)
                        {
                                keyCode = String.fromCharCode(event.which);
                        }
                        else
                        {
                                return;
                        }
                        if (!keyCode)
                        {
                                return;
                        }

                        var inputEl = this.innerDiv.down("input");
                        var value = inputEl.value;
                        var target = $("pageMenu").down("a[shortcut="+value+"]");
                        // Return
                        if (target)
                        {
                                this.innerDiv.down("span.shortcut").update(target.innerHTML);
                        }
                        else
                        {
                                this.innerDiv.down("span.shortcut").update("");
                        }
                }.bind(this));
        }
});

/**
*
*  Javascript sprintf
*  http://www.webtoolkit.info/
*
*
**/

sprintfWrapper = {

        init : function () {

                if (typeof arguments == "undefined") { return null; }
                if (arguments.length < 1) { return null; }
                if (typeof arguments[0] != "string") { return null; }
                if (typeof RegExp == "undefined") { return null; }

                var string = arguments[0];
                var exp = new RegExp(/(%([%]|(\-)?(\+|\x20)?(0)?(\d+)?(\.(\d)?)?([bcdfosxX])))/g);
                var matches = new Array();
                var strings = new Array();
                var convCount = 0;
                var stringPosStart = 0;
                var stringPosEnd = 0;
                var matchPosEnd = 0;
                var newString = '';
                var match = null;

                while (match = exp.exec(string)) {
                        if (match[9]) { convCount += 1; }

                        stringPosStart = matchPosEnd;
                        stringPosEnd = exp.lastIndex - match[0].length;
                        strings[strings.length] = string.substring(stringPosStart, stringPosEnd);

                        matchPosEnd = exp.lastIndex;
                        matches[matches.length] = {
                                match: match[0],
                                left: match[3] ? true : false,
                                sign: match[4] || '',
                                pad: match[5] || ' ',
                                min: match[6] || 0,
                                precision: match[8],
                                code: match[9] || '%',
                                negative: parseInt(arguments[convCount],10) < 0 ? true : false,
                                argument: String(arguments[convCount])
                        };
                }
                strings[strings.length] = string.substring(matchPosEnd);

                if (matches.length == 0) { return string; }
                if ((arguments.length - 1) < convCount) { return null; }

                var code = null;
                var match = null;
                var i = null;

                for (i=0; i<matches.length; i++) {

                        if (matches[i].code == '%') { substitution = '%'; }
                        else if (matches[i].code == 'b') {
                                matches[i].argument = String(Math.abs(parseInt(matches[i].argument,10)).toString(2));
                                substitution = sprintfWrapper.convert(matches[i], true);
                        }
                        else if (matches[i].code == 'c') {
                                matches[i].argument = String(String.fromCharCode(parseInt(Math.abs(parseInt(matches[i].argument,10)),10)));
                                substitution = sprintfWrapper.convert(matches[i], true);
                        }
                        else if (matches[i].code == 'd') {
                                matches[i].argument = String(Math.abs(parseInt(matches[i].argument,10)));
                                substitution = sprintfWrapper.convert(matches[i]);
                        }
                        else if (matches[i].code == 'f') {
                                matches[i].argument = String(Math.abs(parseFloat(matches[i].argument)).toFixed(matches[i].precision ? matches[i].precision : 6));
                                substitution = sprintfWrapper.convert(matches[i]);
                        }
                        else if (matches[i].code == 'o') {
                                matches[i].argument = String(Math.abs(parseInt(matches[i].argument,10)).toString(8));
                                substitution = sprintfWrapper.convert(matches[i]);
                        }
                        else if (matches[i].code == 's') {
                                matches[i].argument = matches[i].argument.substring(0, matches[i].precision ? matches[i].precision : matches[i].argument.length);
                                substitution = sprintfWrapper.convert(matches[i], true);
                        }
                        else if (matches[i].code == 'x') {
                                matches[i].argument = String(Math.abs(parseInt(matches[i].argument,10)).toString(16));
                                substitution = sprintfWrapper.convert(matches[i]);
                        }
                        else if (matches[i].code == 'X') {
                                matches[i].argument = String(Math.abs(parseInt(matches[i].argument,10)).toString(16));
                                substitution = sprintfWrapper.convert(matches[i]).toUpperCase();
                        }
                        else {
                                substitution = matches[i].match;
                        }

                        newString += strings[i];
                        newString += substitution;

                }
                newString += strings[i];

                return newString;

        },

        convert : function(match, nosign){
                if (nosign) {
                        match.sign = '';
                } else {
                        match.sign = match.negative ? '-' : match.sign;
                }
                var l = match.min - match.argument.length + 1 - match.sign.length;
                var pad = new Array(l < 0 ? 0 : l).join(match.pad);
                if (!match.left) {
                        if (match.pad == "0" || nosign) {
                                return match.sign + pad + match.argument;
                        } else {
                                return pad + match.sign + match.argument;
                        }
                } else {
                        if (match.pad == "0" || nosign) {
                                return match.sign + match.argument + pad.replace(/0/g, ' ');
                        } else {
                                return match.sign + match.argument + pad;
                        }
                }
        }
};
/*
// addSelectOption//
// Add the single select option to the selection list with the id specified//
function addSelectOption(answerOptions, value, display) 
{ 
        if (display == null) display = value;
        var anOption = document.createElement('option');    
        anOption.value = value;    
        anOption.innerHTML = display;    
        selectElement.appendChild(anOption);    
        return anOption;
}
// removeSelectOption//
// Remove the option with the specified value from the list of options
// in the selection list with the id specified//
function removeSelectOption(selectElement, value) 
{ 
        var kids = selectElement.childNodes;  
        var numkids = kids.length;  
        for (var i = 0; i < numkids; i++) 
        {      
                if (kids[i].value == value) 
                {   
                        selectElement.removeChild(kids[i]);   
                        break;     
                }    
        }
}
*/
sprintf = sprintfWrapper.init;

Object.extend(Akyla.Form.Validator.testables,
{
        number :
        {
                message : Akyla.translate("Please enter a valid number in this field."),
                tester : function(v, elm) {  v=v.replace(',','.');return Akyla.Tester.isEmpty(v) || Akyla.Tester.isNumber(v); }
        }
});
 

