﻿// AAHG functies, gaat ervan uit dat yuiloader-dom-event geladen is

// Voor Intellisense in Visual Studio
/// <reference path="lib/yui/yahoo/yahoo-debug.js" />
/// <reference path="lib/yui/dom/dom-debug.js" />
/// <reference path="lib/yui/event/event-debug.js" />
/// <reference path="lib/yui/yuiloader/yuiloader-debug.js" />

// namespaces
AAHG = {};

// Hierbinnen zijn variabelen lokaal ipv globaal
(function() {
    // Aliases
    var Dom = YAHOO.util.Dom;
    var Event = YAHOO.util.Event;

    // Timeouts

    var KEEPALIVE_MINUTES = 4;
    var LOGOUT_MINUTES = 30;
    var COUNTDOWN_SECONDS = 30;
    var NOOP = '/_layouts/NoOp.aspx';
    var MINUTE_IN_MS = 60 * 1000;

    var keepaliveMinutesAgo = 0;
    var activityMinutesAgo = 0;
    var countdownLeft = COUNTDOWN_SECONDS;
    var logoutwarningPanel;
    var autoLogoutEnabled = false;

    function keepAliveFailure(e) {
        YAHOO.log('keepAliveFailure', 'error', 'AAHG');
        logout('error');
    }

    function logout(reason) {
        window.onbeforeunload = null;
        document.location = '/_layouts/LoggedOut.aspx?reason=' + reason;
    }

    // Aanroepen als er een ajax call naar de server is geweest
    AAHG.reportServerCommunication = function() {
        keepaliveMinutesAgo = 0;
    }

    // Aanroepen als de gebruiker typt of met de muis klikt
    reportActivity = function() {
        activityMinutesAgo = 0;
    }
    Event.on(document, 'click', reportActivity);
    Event.on(document, 'keydown', reportActivity);

    // Om sessie timeouts te voorkomen kan deze functie vervangen worden
    AAHG.keepAlive = function() {
        YAHOO.log('keepalive no-op', 'info', 'AAHG');
        new AAHG.Loader({
            require: ['connection'],
            onSuccess: function() {
                YAHOO.log('keepalive sending no-op', 'info', 'AAHG');
                YAHOO.util.Connect.asyncRequest('POST', NOOP, { failure: keepAliveFailure });
            }
        }).insert();
    }

    function warnLogout() {
        new AAHG.Loader({
            require: ['connection', 'container'],
            onSuccess: function() {
                removeLogoutWarning();
                YAHOO.log('warning the user that he will be logged out automatically', 'info', 'AAHG');
                logoutwarningPanel = new YAHOO.widget.Panel('logoutwarning', {
                    fixedcenter: true,
                    close: false,
                    zindex: 99999,
                    modal: true,
                    visible: true
                });
                logoutwarningPanel.setBody(
                    '<p>Om veiligheidsredenen wordt u binnen <span id="logoutwarningSeconds">' + COUNTDOWN_SECONDS + '</span> seconden automatisch uitgelogd</p>' +
                    '<div class="wrapper controlbuttons">' +
                    '<a href="#" id="logoutwarningStop" class="prev"><span>Stop</span></a>' +
                    '<a href="#" id="logoutwarningLogout" class="next"><span>Uitloggen</span></a>' +
                    '</div>'
                );
                countdownLeft = COUNTDOWN_SECONDS;
                setTimeout(countdown, 1000);
                logoutwarningPanel.render(document.body);
                Event.on('logoutwarningStop', 'click', removeLogoutWarning);
                Event.on('logoutwarningLogout', 'click', logout, 'manual');
            }
        }).insert();
    }

    function countdown() {
        if (logoutwarningPanel == null) return;
        countdownLeft--;
        Dom.get('logoutwarningSeconds').innerHTML = countdownLeft;
        if (countdownLeft == 0) {
            logout('auto');
        } else {
            setTimeout(countdown, 1000);
        }
    }

    function removeLogoutWarning() {
        if (logoutwarningPanel != null) {
            logoutwarningPanel.destroy();
        }
        logoutwarningPanel = null;
    }

    function onceEveryMinute() {
        setTimeout(onceEveryMinute, MINUTE_IN_MS);
        keepaliveMinutesAgo++;
        activityMinutesAgo++;
        if (keepaliveMinutesAgo >= KEEPALIVE_MINUTES) {
            AAHG.keepAlive();
            keepaliveMinutesAgo = 0;
        }
        if (autoLogoutEnabled && activityMinutesAgo >= LOGOUT_MINUTES) {
            warnLogout();
            activityMinutesAgo = 0;
        }
    }
    setTimeout(onceEveryMinute, MINUTE_IN_MS);

    AAHG.enableAutoLogout = function() {
        autoLogoutEnabled = true;
    }

    // Sitestat

  function sitestat(ns_l) {       // FromUrl v1.5 Copyright (c) 2001-2007 Nedstat B.V. All rights reserved.  
        var ns_type = ''          // leave empty for normal/ppc measurement, fill in for clickin, clickout or pdf 
        var r = ''                // yes=only parse url when there is a real document.referrer, 
        // no=only parse url when there is no real document.referrer, empty=always parse url 
        var t = '?'               // tag in url where parameters follow; default '?' could be replaced by "#" 
            var p=new Array();var w='';var l='';var d=document;var n=navigator;var ns_0='' 
            ;if(top!=self){if('\u0041'=='A'){var u=n.userAgent;if(u.indexOf('Safari')==-1) 
            {var b=u.indexOf('Opera');if(b==-1||(u.charAt(b+6)+0)>5){b=u.indexOf('Mozilla' 
            );var xb=b!=-1?u.charAt(b+8)>4:1;if(u.indexOf('compatible')!=-1||xb){var c= 
            'try{ns_0=top.document.referrer}catch(e){}';eval(c);c= 
            'try{l=top.document.location.href}catch(e){}';eval(c);}}}}}else{ns_0= 
            d.referrer;l=d.location.href;}if(ns_0.lastIndexOf('/')==ns_0.length-1){ns_0= 
            ns_0.substring(ns_0.lastIndexOf('/'),0);}var f=ns_l.indexOf('?');if(f!=-1){ 
            var q=ns_l.substring(f+1);ns_l=ns_l.substring(0,f);if(q){var m=q.indexOf('&'); 
            w=q.substring(0,m==-1?q.length:m);if(w.indexOf('=')!=-1){w='';}if(w){q= 
            q.substring(m==-1?q.length:m+1);q+=(q?'&':'')+'ns_name='+w;}if(ns_0.length>0){ 
            q+=(q?'&':'')+'ns_referrer='+escape(ns_0);}var s=0;var e=0;while(q.length){e= 
            q.indexOf('&');if(e==-1){e=q.length;}var o=q.substring(s,e);if(o.substring(0,4 
            )=='amp;'){o=o.substring(4);}if(o)p[p.length]=o;q=q.substring(e+1);}}}var a= 
            l.indexOf(t);a=a==-1?0:l.substring(a+1);var j;if(r=='yes')j=ns_0.length;else 
            if(r=='no')j=!ns_0.length;else if(r=='')j=1;if(a&&j){while(a.length){var e= 
            a.indexOf('&');if(e==-1){e=a.length;}var k=a.substring(0,a.substring(0,e) 
            .indexOf('='));var v=a.substring(a.substring(0,e).indexOf('=')+1,e);if( 
            k.substring(0,4)=='amp;'){k=k.substring(4);}while(v.substring(0,1)=='='){v= 
            v.substring(1);}if(k=='ns_name'){w=v;}else if(k=='ns_or'){var g='ns_referrer=' 
            ;for(var z=0;z<p.length;z++){if(p[z].substring(0,g.length)==g){p[z]= 
            'ns_referrer='+v;}}}else{if(k.substring(0,3)=='ns_'&&v&&k){var h=0;for(var x=0 
            ;x<p.length;x++){if(p[x].substring(0,p[x].indexOf('='))==k){p[x]=k+"="+v;h=1}} 
            if(!h){p[p.length]=k+"="+v;}}}a=a.substring(e+1);}}if(!w){return;}var s=''; 
            var y='';for(var i=0;i<p.length;i++)if(p[i].substring(0,8)!='ns_name='){if(p[i 
            ].substring(0,12)!='ns_referrer='){s+='&'+p[i];}else{y='&'+p[i];}}s+=ns_type? 
            '&ns_type='+ns_type+'&ns_action=view':'';ns_pixelUrl=ns_l+'?'+w+"&ns__t="+( 
            new Date()).getTime();ns_l=ns_pixelUrl+s+y;if(d.images){ns_1=new Image(); 
            ns_1.src=ns_l;}else{d.write('<img src='+ns_l+' width="1" height="1">');}
        }

    // Onderstaande variabelen worden vervangen tijdens het laden van de pagina
    AAHG.sitestatPrefix = '/sitestat_dummy.gif';
    AAHG.sitestatSuffix = '';

    // pagina mag geen vreemde tekens bevatten, alleen letters, cijfers en -._
    AAHG.reportSitestat = function(pagina) {
        pagina = pagina.toLowerCase();
        sitestat(AAHG.sitestatPrefix + pagina + AAHG.sitestatSuffix);
    }

    // Dynamisch inladen van javascript

    var loaderDefaults = {
        base: '/_layouts/js/lib/yui/',
        combine: false
        //        ,filter: "DEBUG" //bij incommentarieren, de regel 'base:' uitcommentarieren
    }

    // Deze regel wordt door het buildscript vervangen door het versienummer tbv caching
    AAHG.versie = '4.0.0.22';

    var Loader = AAHG.Loader = function(options) {
        var newOptions = {};
        YAHOO.lang.augmentObject(newOptions, loaderDefaults);
        YAHOO.lang.augmentObject(newOptions, options);
        Loader.superclass.constructor.call(this, newOptions);
        this.addModule({
            name: 'tussenpersoonSelector',
            type: 'js',
            fullpath: '/_layouts/js/tussenpersoonSelector.js?' + AAHG.versie,
            requires: ['autocomplete', 'skin-sam-autocomplete', 'button', 'connection', 'menu', 'json']
        });
        this.addModule({
            name: 'aanvraagOverzicht',
            type: 'js',
            fullpath: '/_layouts/js/aanvraagOverzicht.js?' + AAHG.versie,
            requires: ['cookie','autocomplete', 'skin-sam-autocomplete', 'button', 'connection', 'menu', 'tussenpersoonSelector']
        });
        this.addModule({
            name: 'aquima.behavior',
            type: 'js',
            fullpath: '/_layouts/js/aquima.behavior.js?' + AAHG.versie,
            requires: []
        });
        this.addModule({
            name: 'aquima',
            type: 'js',
            fullpath: '/_layouts/js/aquima.js?' + AAHG.versie,
            requires: ['connection', 'json', 'aquima.behavior']
        });
        this.addModule({
            name: 'aahg.mvc.florius',
            type: 'js',
            fullpath: '/_layouts/js/florius-mvc-webpart.js?' + AAHG.versie,
            requires: ['connection', 'json', 'slider', 'container', 'animation']
        });
        if (AAHG.mvcHbsVersie) {
            this.addModule({ //css
                name: 'aahg.mvc.hbs.style',
                type: 'css',
                fullpath: (AAHG.brandingPrefix?AAHG.brandingPrefix:'')+'/_layouts/mvc_hbs/Styles/HBS/style/stylesheet.css?' + AAHG.mvcHbsVersie,
                requires: []
            });
            this.addModule({ //css tables
                name: 'aahg.mvc.hbs.style.tables',
                type: 'css',
                fullpath: (AAHG.brandingPrefix?AAHG.brandingPrefix:'')+'/_layouts/mvc_hbs/Styles/HBS/style/tables.css?' + AAHG.mvcHbsVersie,
                requires: []
            });
            // generic
            this.addMvcHbsModule('mvc.core','mvc/core.js',['connection','container','animation','json']);
            this.addMvcHbsModule('mvc.generic.controllers','mvc/generic-controllers.js',['mvc.core']);
            this.addMvcHbsModule('mvc.generic.inputs','mvc/generic-inputs.js',['mvc.core']);
            this.addMvcHbsModule('mvc.generic.factories','mvc/generic-factories.js',
                ['mvc.core','mvc.generic.controllers','mvc.generic.inputs']);
            // aahg
            this.addMvcHbsModule('styles.aahg.util','Styles/aahg/aahg-util.js',[]);
            this.addMvcHbsModule('styles.aahg.sliders','Styles/aahg/sliders.js',['slider']);
            this.addMvcHbsModule('styles.aahg.controllers','Styles/aahg/aahg-controllers.js',[]);
            this.addMvcHbsModule('styles.aahg.inputs','Styles/aahg/aahg-inputs.js',[]);
            this.addMvcHbsModule('styles.aahg.factories','Styles/aahg/aahg-factories.js',
                ['mvc.generic.factories','styles.aahg.util','styles.aahg.sliders','styles.aahg.inputs','styles.aahg.controllers']);
            // hbs
            this.addMvcHbsModule('styles.hbs.controllers','Styles/HBS/hbs-controllers.js',[]);
            this.addMvcHbsModule('styles.hbs.inputs','Styles/HBS/hbs-inputs.js',[]);
            this.addMvcHbsModule('styles.hbs.factories','Styles/HBS/hbs-factories.js',
                ['styles.aahg.factories','styles.hbs.inputs','styles.hbs.controllers','aahg.mvc.hbs.style','aahg.mvc.hbs.style.tables']);
        }
    }

    YAHOO.lang.extend(Loader, YAHOO.util.YUILoader);
    
    Loader.prototype.addMvcHbsModule = function(name, path, requires) {
        this.addModule({
            name: name,
            type: 'js',
            fullpath: (AAHG.brandingPrefix?AAHG.brandingPrefix:'')+'/_layouts/mvc_hbs/'+path+'?'+AAHG.mvcHbsVersie,
            requires: requires
        });
    }

    // Debugging
    // In de firebug console kun je AAHG.showLog() typen.
    AAHG.showLog = function() {
        new AAHG.Loader({
            require: ['logger'],
            loadOptional: true,
            onSuccess: function() {
                new YAHOO.widget.LogReader();
            },
            onFailure: function(msg) {
                alert('inladen logger library niet gelukt: ' + msg);
            }
        }).insert();
    }

    AAHG.PrintWindow = function(url) {
        if (YAHOO.env.ua.ie) {
            var w = window.open(url, "PrintPreview");
            w.print();
        }
        else {
            var w = window.open("", "PrintPreview");
            var beginToken = "<!--[Content Begin]-->";
            var endToken = "<!--[Content End]-->";

            YAHOO.util.Connect.asyncRequest('GET', url,
						{
						    success: function(o) {
						        var innerHTML = AAHG.stringBetween(beginToken, endToken, o.responseText);
						        w.document.write("<html><head><title>Print: " + url + "</title></head><body>");
						        w.document.write(innerHTML);
						        w.document.write("</body></html>");
						        w.print();
						        w.close();
						    }
						}
			);
        }
    }

    AAHG.stringBetween = function(prefix, suffix, s) {
        var i = s.indexOf(prefix);
        if (i >= 0) {
            s = s.substring(i + prefix.length);
        }
        else {
            return '';
        }
        if (suffix) {
            i = s.indexOf(suffix);
            if (i >= 0) {
                s = s.substring(0, i);
            }
            else {
                return '';
            }
        }
        return s;
    }

    AAHG.renderInPanel = function() {
        var e = Event.getEvent();
        var link = Event.getTarget(e);

        var beginToken = "<!--[Content Begin]-->";
        var endToken = "<!--[Content End]-->";

        new AAHG.Loader({
            require: ['container', 'connection'],
            loadOptional: true,
            onSuccess: function() {

                YAHOO.util.Connect.asyncRequest('GET', link.href,
					{
					    success: function(o) {
					        var panel = new YAHOO.widget.Panel("panel", {
					            constraintoviewport: false,
					            underlay: "shadow",
					            modal: true,
					            close: true,
					            visible: true,
					            draggable: true,
					            effect: { effect: YAHOO.widget.ContainerEffect.FADE, duration: 0.25 }
					        });

					        var header = "<div id='pageOptions'><a id='printTag' onclick='AAHG.PrintWindow(\"" + link.href + "\"); return false' href='#' class='print'>Pagina afdrukken</a></div>";
					        var innerHTML = AAHG.stringBetween(beginToken, endToken, o.responseText);
					        var innerH1 = AAHG.stringBetween("<h1>", "</h1>", o.responseText);
					        panel.setHeader("<H1>" + innerH1 + "</H1>" + header);

					        panel.setBody(innerHTML);
					        panel.render(document.body);
					        panel.center();
					    }
					}
				);
            }
        }).insert();
    }

    // Redirect de browser naar https, indien hij over een http-url zonder poortnummer communiceert.
    // Returns false als de redirect gestuurd is
    AAHG.ensureHttps = function() {
        var url = document.location.href;
        if (/^http:\/\/[\w\.]*\/.*$/.test(url)) {
            url = 'https:' + url.substr(5);
            if (url.indexOf('?') >= 0) {
                url += '&rewriteHttp=true';
            } else {
                url += '?rewriteHttp=true';
            }
            document.location = url;
            return false;
        }
        if (document.location.search.indexOf('rewriteHttp=true') >= 0) {
            // Rewrite alle links op de pagina dat deze naar http gaan wijzen
            Event.onDOMReady(function() {
                var prefix = 'https://' + document.location.host;
                var links = document.getElementsByTagName('a');
                for (var i = 0; i < links.length; i++) {
                    var link = links[i];
                    if (link.href.indexOf(prefix) == 0) {
                        link.href = 'http:' + link.href.substr(6);
                    }
                }
            });
        }
        return true;
    };

    // Wordt op 'fan', 'florius' of 'imv' gezet en aan de hand hiervan worden z-indexes verbeterd
    AAHG.site = 'unknown';

    // Globale events

    // Als er iets in de DOM veranderd is kan het zijn dat de styling aangepast moet worden (paginahoogte is veranderd)
    AAHG.domUpdated = new YAHOO.util.CustomEvent('domUpdated');

})();