$(document).ready(function() {
    initSiteStatLinks();
    initializeerHoofdMenu();
    initializeerStandaardElementen(null);
});

function initializeerHoofdMenu() {
    $(".hoofdmenu_item").hover(function() {
        $(".hoofdmenu_uitgeklapt", this).fadeIn(200);
    }, function() {
        $(".hoofdmenu_uitgeklapt", this).fadeOut(100);
    });
}

function initializeerStandaardElementen(element) {
    initializeerFomulierTekstVelden(element);
    initialiseerTooltips(element);
    initialiseerFormSubmitLinks(element);
    initialiseerBanners(element);
    initializeerTekstveldBeperktAantalKarakters(element);
    initializeerNumeriekeTekstvelden(element);
    initializeerUploads(element);
    initializeerRadiobuttonLabels(element);
    initializeerCheckboxLabels(element);
}


function initializeerFomulierTekstVelden(element) {
    var tekstVelden = element ? $("form input[type='text']", element) : $("form input[type='text']");
    tekstVelden.keypress(function(event) {
        if (event.keyCode == 13)  {
            $(this).parents("form").submit();
        }
    });
}

/**
 * Initialiseert de tooltips
 */
function initialiseerTooltips(element) {

    if (!jQuery().tooltip) {
        //alert("Geen tooltips mogelijk");
        return;
    }
    var infoKnoppen = element ? $(".info_knop", element) : $(".info_knop");
    infoKnoppen.click(function() {
        return false;
    });
    infoKnoppen.each(function() {
        var knoppie = $(this);
        knoppie.tooltip({
            cancelDefault: true,
            relative: true,
            tip: knoppie.attr("href"),
            position: "center right",
            predelay: 250,
            offset: [20, 20],
            onShow: function() {
                if ($.browser.msie && $.browser.version < 7) {
                    $("select").css("visibility", "hidden");
                }
            },
            onHide: function() {
                if ($.browser.msie && $.browser.version < 7) {
                    $("select").css("visibility", "visible");
                }
            }
        }).dynamic();
    });
}

/**
 * Initialiseert de algemene zoek knop (rechts in de header en in de
 * uitvaartwensen van anderen pagina)
 */
function initialiseerFormSubmitLinks(element) {
    var submitLinks = element ? $(".formulier_submit", element) : $(".formulier_submit");
    submitLinks.click(function() {
        var form = $(this).parents("form");
        //alert("Formulier submit: " + form.size());
        form.submit();
        return false;
    });
}

/**
 * Laat banners zich gedragen als links
 */
function initialiseerBanners(element) {
    var banners = element ? $(".banner_met_url", element) : $(".banner_met_url");
    banners.click(function(e) {
        var bannerLink = $(".banner_link", this);
        var url = bannerLink.attr("href");
        if (url) {
            var target = bannerLink.attr("target");
            if (target == "_new") {
                var opties =
                    "width=800, height=600,"
                    + "screenX=100, screenY=100, "
                    + "toolbar=yes, location=yes, directories=yes, "
                    + "status=yes, menubar=yes, scrollbars=yes, resizable=yes"
                ;
                var titel = "";
                window.open(url, titel, opties);
            } else {
                document.location = url;
            }
            e.preventDefault();
        }
        return false;
    });
}
/**
 * Retourneert een functie om een dialoog mee te openen.
 */
function dialoog(naam, componentID, breedte, hoogte) {
    $.setupJMPopups({
        screenLockerBackground: "#000",
        screenLockerOpacity: "0.5"
    });

    var popupId = "popupLayer_" + naam;
    var toonDialoog = function() {
        var popup = $.openPopupLayer({
            name: naam,
            animate: true,
            width: breedte,
            height: hoogte,
            target: componentID
        });

        // Fix voor de semitransparante background layer die maar een deel
        // van het document bedekt indien de pagina niet binnen de viewport
        // van het window past (anders gezegd, als er scrollbars zichtbaar zijn)
        if (verticaalGescrolldeAfstand() > 0) {
            var hoogtePagina = paginaAfmeting().height;
            $("#popupLayerScreenLocker").css("height", hoogtePagina);
        }

        var sluitKnopSelectors = "#" + popupId + " .dialoog_sluiten, #" + popupId + " .sluiten_knop, #" + popupId + " .annuleren_knop";
        $(sluitKnopSelectors).click(function() {
            $.closePopupLayer();
            return false;
        });
        return false;
    };

    toonDialoog.popupId = popupId;
    toonDialoog.popupElement = function() {
        return $("#" + popupId);
    }
    
    return toonDialoog;
}

/**
 * TODO: moet tekst ook daadwerkelijk beperken tot 200 karakters!!!
 */
function initializeerTekstveldBeperktAantalKarakters(element) {
    var selector = ".tekstveld_beperkt_aantal_karakters textarea, .tekstveld_beperkt_aantal_karakters input";
    var tekstVelden = element ? $(selector, element) : $(selector);
    
    var maximaalAantalTekens = function(tekstveld) {
        var max = 200;
        var maxKaraktersPrefix = "max_";
        var stijlKlassen = tekstveld.attr("class").split(" ");
        for (var i = 0; i<stijlKlassen.length; i++) {
            var klasse = stijlKlassen[i];
            if (klasse.indexOf(maxKaraktersPrefix) == 0) {
                var aantal = klasse.substring(maxKaraktersPrefix.length);
                max = new Number(aantal);
            }
        }
        return max;
    }
    var werkResterendAantalBij = function(tekstveld, maxAantalKarakters) {
        var text = tekstveld.val();
        var parent = tekstveld.parents(".tekstveld_beperkt_aantal_karakters");
        var aantalKaraktersToelichting = parent.find(".aantal_karakters_toelichting");
        var resterend = maxAantalKarakters - text.length;
        //aantalKarakters.text(resterend);
        if (resterend >= 1) {
            aantalKaraktersToelichting.text("Nog " + resterend + (resterend > 1 ? " karakters" : " karakter"));
        } else {
            aantalKaraktersToelichting.text("Maximum bereikt");
        }
        
    }
    tekstVelden.each(function() {
        werkResterendAantalBij($(this), maximaalAantalTekens($(this)));
    });
    tekstVelden.keyup(function(event) {
        var tekst = $(this).val();
        var max = maximaalAantalTekens($(this));
        if (tekst.length <= max) {
            werkResterendAantalBij($(this), max);
        } else {
//            if (!isSpecialeToetsAanslag(event)) {
//                event.preventDefault();
//            }
            $(this).val(tekst.substring(0, max));
        }
        
    });
}

function initializeerNumeriekeTekstvelden(element) {
    var velden = element ? $(".numeriek", element) : $(".numeriek");
    
    velden.keydown(function(event) {
        // Allow only backspace and delete
        if ( event.keyCode == 46 || event.keyCode == 8 ) {
            // let it happen, don't do anything
        }
        else {
            // Ensure that it is a number and stop the keypress
            if (!isToetsAanslagEenGetal(event)) {
                var alsnogToelaten = false;
                
                if (isSpecialeToetsAanslag(event)) {
                    alsnogToelaten = true;
                } else {
                    var tekst = $(this).val();
                    if (event.keyCode == 188) { // komma
                        if (tekst.indexOf(',') < 0) {
                            alsnogToelaten = true;
                        }
                    } /*else if (event.keyCode == 190) { // punt
                        if (tekst.indexOf('.') < 0) {
                            alsnogToelaten = true;
                        }
                    }*/
                }
                if (!alsnogToelaten) {
                    event.preventDefault();
                }
            }
        }
    });
}

function initializeerUploads(element) {
    var uploads = element ? $(".upload", element) : $(".upload");
    uploads.each(function() {

        var uploadFormulier = $(this);

        var uploadURI = $(this).find(".upload_link");
        var uploadSelectieKnop = $(this).find(".upload_selectie_knop");
        var uploadBestandsnaamVeld = $(this).find(".upload_bestandsnaam");
        var isAjaxUpload = $(this).find(".is_ajax_upload").val() == "true";
        //var uploadVoortgang = $(this).find(".upload_voortgang");
        var uploadBestandsLink = $(this).find(".upload_bestands_link");
        var uploadVerwijderen = $(this).find(".upload_verwijderen_link");
        var uploadAttribuut = $(this).find(".upload_attribuut");
        var anderBestandUploadenKnop = $(this).find(".ander_bestand_uploaden_knop");
        var anderBestandUploadenAnnulerenKnop = $(this).find(".andere_bestand_upload_annuleren_link");
        var uploadGeslaagdFunctieVeld = $(this).find(".upload_geslaagd_functie");
        var uploadVerwijderdFunctieVeld = $(this).find(".upload_verwijderd_functie");
        
        anderBestandUploadenKnop.click(function() {
            uploadFormulier.attr("class", "upload upload_ander_bestand_uploaden");
            return false;
        });

        anderBestandUploadenAnnulerenKnop.click(function() {
            uploadFormulier.attr("class", "upload upload_verzonden");
            return false;
        });

        uploadVerwijderen.click(function() {
            if (confirm("Weet je zeker dat je dit wilt verwijderen?")) {
                var ref = $(this).attr("href");
                $.ajax({
                    type: "POST",
                    url: ref,
                    success: function() {
                        uploadFormulier.attr("class", "upload upload_leeg");

                        uploadBestandsLink.attr("href", "#");
                        uploadBestandsnaamVeld.attr("value", "");
                        //uploadBestandsnaamVerzonden.text("");
                        var verwijderdCallbackFunctie = uploadVerwijderdFunctieVeld.val();
                        eval(verwijderdCallbackFunctie + "()");
                    },
                    error: function() {
                        alert("Fout bij verwijderen upload");
                    }
                });
            }
            return false;
        });
        if (!isAjaxUpload) {
            var bestandUploadControlClass = "uploadFileControl";
            var bestandUploadControlHTML = "<input type=\"file\" name=\"" + uploadAttribuut.val() + "\" class=\"" + bestandUploadControlClass + "\"/>";
            var uploadSelectieKnopParent = uploadSelectieKnop.parent();
            uploadSelectieKnopParent.append(bestandUploadControlHTML);
            //alert(uploadFormulier.outerHeight());
            var bestandUploadControl = $("." + bestandUploadControlClass, uploadSelectieKnopParent);
            bestandUploadControl.css({
                position: "absolute",
                top: "0px",
                left: "0px",
                opacity: 0.0,
                cursor: "pointer",
                border: "1px red solid",
                //margin: "-5px 0pt 0pt -175px",
                //visibility: "hidden",
                "z-index": "999"
            });
            bestandUploadControl.change(function() {
               uploadBestandsnaamVeld.val($(this).val());
            });
            bestandUploadControl.hover(
                function() {
                    //uploadSelectieKnop.removeClass(".bladeren_knop");
                    uploadSelectieKnop.addClass("bladeren_knop_hover");
                },
                function() {
                    //uploadSelectieKnop.addClass(".bladeren_knop");
                    uploadSelectieKnop.removeClass("bladeren_knop_hover");
                }
            );
        } else {
            new AjaxUpload(uploadSelectieKnop, {
                action: uploadURI.attr("value"),
                name: "bestand",
                autoSubmit: true,
                responseType: 'json',
                hoverClass: 'bladeren_knop_hover',
                closeConnection: true,
                data: {
                    attribuut: uploadAttribuut.attr('value')
                },
                onChange: function(file, extension) {
                    uploadBestandsnaamVeld.attr('value', file);
                },
                onSubmit: function(file, extension) {
                    uploadFormulier.attr("class", "upload upload_actief");
                    this.disable();
                },
                onComplete: function(file, response) {
                    uploadFormulier.attr("class", "upload upload_verzonden");

                    uploadBestandsLink.text(file);
                    var viewLink = response["upload"]["viewLink"];
                    uploadBestandsLink.attr("href", viewLink);

                    if (uploadBestandsnaamVeld.get(0).tagName.toLowerCase() == 'input') {
                        uploadBestandsnaamVeld.attr("value", "");
                    } else {
                        uploadBestandsnaamVeld.text("");
                    }

                    this.enable();
                    var uploadGeslaagdFunctieNaam = uploadGeslaagdFunctieVeld.attr("value");
                    if (uploadGeslaagdFunctieNaam) {
                        var evalFunc = uploadGeslaagdFunctieVeld.val() + "(\'" + viewLink + "\')";
                        eval(uploadGeslaagdFunctieVeld.val() + "(\'" + viewLink + "\')");
                    }

                    return true;
                }
            });
        }
        
    });
}

/**
 * Triggert een click op de radiobutton naast een span met class 'radiobutton_label'
 */
function initializeerRadiobuttonLabels(element) {
    var labels = element ? $(".radiobutton_label", element) : $(".radiobutton_label");
    labels.click(function() {
        var kandidaatRB = $(this).prev();
        if (kandidaatRB.size() == 1 && kandidaatRB.attr("type") == "radio") {
            kandidaatRB.trigger('click');
        } else {
            var parent = $(this).parent();
            parent.children("input[type='radio']").trigger('click');
        }
    });
}
/**
 * Triggert een click op de radiobutton naast een span met class 'checkbox_label'
 */
function initializeerCheckboxLabels(element) {
    var labels = element ? $(".checkbox_label", element) : $(".checkbox_label");
    labels.click(function() {
        var kandidaatCB = $(this).prev();
        if (kandidaatCB.size() == 1 && kandidaatCB.attr("type") == "checkbox") {
            //kandidaatCB.trigger('click');
            kandidaatCB.click();
            kandidaatCB.change();
            //var checkboxElement = kandidaatCB.get(0);
            //checkboxElement.checked = !checkboxElement.checked;
//            alert(kandidaatCB.attr("checked"));
//            alert(checkboxElement.checked);
            //kandidaatCB.attr("checked", "checked");
        } else {
            var parent = $(this).parent();
            parent.children("input[type='checkbox']").trigger('click');
        }
        return false;
    });
}

/**
 * Bepaalt de plaats van de muiscursor
 */
function MuisPositie(event) {
    this.x = 0;
    this.y = 0;
    if (!event)
        event = window.event;
    if (event.pageX || event.pageY){
        this.x = event.pageX;
        this.y = event.pageY;
    } else if (event.clientX || event.clientY){
        this.x = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
        this.y = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
    }
}

function positioneerElementBijMuisCursor(element, event, correctie) {
    var pos = new MuisPositie(event);
    var vga = verticaalGescrolldeAfstand();
    var hga = horizontaalGescrolldeAfstand();

    var x = pos.x - hga + correctie;
    var y = pos.y - vga + correctie;
    element.css("top", y);
    element.css("left", x);
}

function paginaAfmeting() {
    var xWithScroll = 0;
    var yWithScroll = 0;
    
    if (window.innerHeight && window.scrollMaxY) {// Firefox
        yWithScroll = window.innerHeight + window.scrollMaxY;
        xWithScroll = window.innerWidth + window.scrollMaxX;
    } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
        yWithScroll = document.body.scrollHeight;
        xWithScroll = document.body.scrollWidth;
    } else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
        yWithScroll = document.body.offsetHeight;
        xWithScroll = document.body.offsetWidth;
    }
    return {
        width: xWithScroll,
        height: yWithScroll
    };
}

function paginaBreedte() {
    return filterResultaten (
    window.innerWidth ? window.innerWidth : 0,
    document.documentElement ? document.documentElement.clientWidth : 0,
    document.body ? document.body.clientWidth : 0
);
}
function paginaHoogte() {
    return filterResultaten (
    window.innerHeight ? window.innerHeight : 0,
    document.documentElement ? document.documentElement.clientHeight : 0,
    document.body ? document.body.clientHeight : 0
);
}
function horizontaalGescrolldeAfstand() {
    return filterResultaten (
    window.pageXOffset ? window.pageXOffset : 0,
    document.documentElement ? document.documentElement.scrollLeft : 0,
    document.body ? document.body.scrollLeft : 0
);
}
function verticaalGescrolldeAfstand() {
    return filterResultaten (
    window.pageYOffset ? window.pageYOffset : 0,
    document.documentElement ? document.documentElement.scrollTop : 0,
    document.body ? document.body.scrollTop : 0
);
}
function filterResultaten(n_win, n_docel, n_body) {
    var n_result = n_win ? n_win : 0;
    if (n_docel && (!n_result || (n_result > n_docel)))
        n_result = n_docel;
    return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}

function isToetsAanslagEenGetal(event) {
    var isGetal = event.keyCode >= 48 && event.keyCode <= 57;
    var isNumPadGetal = event.keyCode >= 96 && event.keyCode <= 105;
    return isGetal || isNumPadGetal;
}

function isSpecialeToetsAanslag(event) {
    var isSpecialeToets = (event.keyCode >= 8 && event.keyCode <= 46) || (event.keyCode >= 91 && event.keyCode <= 93);
    var isFunctieToets = event.keyCode >= 112 && event.keyCode <= 123;
    //alert(event.keyCode + " " + isSpecialeToets + " " + isFunctieToets);
    return isSpecialeToets || isFunctieToets;
}

/**
 * Aangezien Javascript geen 'String.trim()' functie kent, hierbij een...
 * 
 * 'Geinspireerd' door volgende URL:
 * http://blog.stevenlevithan.com/archives/faster-trim-javascript
 */
function trim(str) {
	var whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
	for (var i = 0; i < str.length; i++) {
		if (whitespace.indexOf(str.charAt(i)) === -1) {
			str = str.substring(i);
			break;
		}
	}
	for (i = str.length - 1; i >= 0; i--) {
		if (whitespace.indexOf(str.charAt(i)) === -1) {
			str = str.substring(0, i + 1);
			break;
		}
	}
	return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
}

function zetTekstveldCursorPositie(jQueryElem, caretPos) {
    var elem = jQueryElem.get(0);

    if(elem != null) {
        if(elem.createTextRange) {
            var range = elem.createTextRange();
            range.move('character', caretPos);
            range.select();
        }
        else {
            if(elem.selectionStart) {
                elem.focus();
                elem.setSelectionRange(caretPos, caretPos);
            }
            else {
                elem.focus();
            }
        }
    }
}


/**
 * Voegt een clickHandler toe aan alle links met class 'sitestat_link' die
 * de sitestat functie aanroept. Een link met deze class dient een id te hebben
 * waar sitestat wat mee kan (bv mud.muziek.vorige.link)
 */
function initSiteStatLinks() {
   $(".sitestat_link").click(function() {
      var id = $(this).attr("id");
      ns_onclick (this,'',id,'clickin');
      return false;
   });
}