﻿$.extend({
    toHtml: function (text) {
        text = $('<div/>').text(text).html();
        return text.replace(/(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)/g, '<a href="$1" target="_blank">$1</a>');
    },
    sign: function (num) {
        return Math.min(Math.max(num, -1), 1);
    },
    removeTime: function (date) {
        date.setHours(0);
        date.setMinutes(0);
        date.setSeconds(0);
        date.setMilliseconds(0);
        return date;
    },
    dayDifferenceText: function (date1, date2) {
        var tmp_iDays = ((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
        if (tmp_iDays == 0) return "vandaag";
        else if (tmp_iDays == 1) return "gisteren";
        else return tmp_iDays + " dagen geleden";
    }
});

$.fn.extend({
    getCoordinate: function (size) {
        return { x: $(this).index() % size, y: parseInt($(this).index() / size) };
    },
    disableTextSelect: function () {
        return this.each(function () {
            if ($.browser.mozilla) $(this).css('MozUserSelect', 'none'); //firefox
            else if ($.browser.msie) $(this).bind('selectstart', function () { return false; }); //ie
            else $(this).mousedown(function () { return false; }); //opera/webkit
        });
    },
    getLine: function (from, to, size) {
        //get both coordinates and the difference
        var tmp_oA = from.getCoordinate(size);
        var tmp_oB = to.getCoordinate(size);
        var tmp_oDiff = { x: tmp_oA.x - tmp_oB.x, y: tmp_oA.y - tmp_oB.y }
        var tmp_oLine = { text: null, letters: $() };

        //check if its a line (horizontal, vertical, or diagonal)
        if (tmp_oDiff.x == 0 || tmp_oDiff.y == 0 || (Math.abs(tmp_oDiff.x) == Math.abs(tmp_oDiff.y))) {

            //move in steps of 1 coordinate until we hit the destination, building the line in the progress
            tmp_oLine.text = from.text();
            tmp_oLine.letters = from;
            var tmp_oMod = { x: $.sign(tmp_oDiff.x), y: $.sign(tmp_oDiff.y) }
            while (tmp_oA.x != tmp_oB.x || tmp_oA.y != tmp_oB.y) {
                tmp_oA.x -= tmp_oMod.x;
                tmp_oA.y -= tmp_oMod.y;
                var tmp_oItem = $(this[(tmp_oA.y * size) + tmp_oA.x]);
                tmp_oLine.text += tmp_oItem.text();
                tmp_oLine.letters = tmp_oLine.letters.add(tmp_oItem);
            }
        }

        return tmp_oLine;
    }
});



//initialize when the dom is ready
$(function () {

    if ($(document.body).hasClass("EditMode")) {

        //detect property changes on panels and force a layout update
        setInterval(function () {
            $(".PanelPart").each(function () {
                if (!$(this).data("handleschanges")) {
                    $(this).data("handleschanges", true);
                    $(this).on("propertychange", function () {
                        $(document.body).toggleClass("dummy1", "dummy2");
                    });
                }
            });
        }, 250);

        //skip the rest of the scripts
        return;
    }

    //initialize sudokus
    $(".SudokuPart").each(function () {
        var tmp_oSudoku = $(this);
        var tmp_bSending = false;

        //add the navigation warning if the user filled in a part of the sudoku
        $(window).bind('beforeunload', function () {
            if (!tmp_bSending && $(".Cijfers ul input[readonly!=readonly]:text[value!='']", tmp_oSudoku).length)
                return 'Je hebt de sudoku nog niet verzonden.';
        });

        //focuses another inputbox relative from the start, skipping any readonly inputboxes
        var tmp_oFocusIndex = function (start, relative) {
            if (start < 0 || start > 80 || relative == 0) return;
            var tmp_oInputs = $(".Cijfers ul li input");
            var tmp_oInput = null;
            var tmp_iOffset = relative;
            do {
                if ((start + tmp_iOffset) > 80) tmp_iOffset -= 81;
                tmp_oInput = tmp_oInputs.eq(start + tmp_iOffset);
                tmp_iOffset += relative;
            } while (tmp_oInput.is("[readonly]"));
            tmp_oInput.focus();
        };

        //only allow numeric keys (and backspace/delete)
        $(".Cijfers ul input").keydown(function (event) {
            var tmp_iIndex = $(this).parent().index();
            if (event.keyCode == 37) tmp_oFocusIndex(tmp_iIndex, -1); //left
            else if (event.keyCode == 38) tmp_oFocusIndex(tmp_iIndex, -9); //up
            else if (event.keyCode == 39) tmp_oFocusIndex(tmp_iIndex, 1); //right
            else if (event.keyCode == 40) tmp_oFocusIndex(tmp_iIndex, 9); //down

            if (!(
                event.keyCode == 8 ||                               // backspace
                event.keyCode == 9 ||                               // tab
                event.keyCode == 46 ||                              // delete
                (event.keyCode >= 35 && event.keyCode <= 40) ||     // arrow keys/home/end
                (event.keyCode >= 48 && event.keyCode <= 57) ||     // numbers on keyboard
                (event.keyCode >= 96 && event.keyCode <= 105))      // number on keypad
            ) {
                event.preventDefault();     // Prevent character input
            }
        });

        //handle the submit
        $(".Verzenden", this).click(function () {
            if ($(".Cijfers ul input:text[value='']", tmp_oSudoku).length) {
                $(".SudokuIncomplete", tmp_oSudoku).stop(true, true).slideDown(250).delay(5000).slideUp(250);
            } else {
                $(this).hide();
                $(".EmailFormPart", tmp_oSudoku).slideDown(250)
            }
        });

        //allow the user to submit the form without warning
        $(".SubmitButton", tmp_oSudoku).mouseup(function () { tmp_bSending = true; });

    });

    //initialize woordzoekers
    $(".WoordzoekerPart").each(function () {
        var tmp_oActiveLetter = null;
        var tmp_oWoordzoeker = $(this);
        var tmp_iSize = Math.sqrt($(".Letters li", this).length);
        var tmp_bSending = false;

        //disable select
        $(".Letters, .Woorden", tmp_oWoordzoeker).disableTextSelect();

        //if its a postback, add the navigation warning if the user filled in a part of the woordzoeker
        $(window).bind('beforeunload', function () {
            if (!tmp_bSending && $(".Done:eq(0)", tmp_oWoordzoeker).length) return 'Je hebt de woordzoeker nog niet verzonden.';
        });


        //handle the submit
        $(".Verzenden", this).click(function () {
            if ($(".Woorden li:not(.Done)", tmp_oWoordzoeker).length) {
                $(".WoordzoekerIncomplete", tmp_oWoordzoeker).stop(true, true).slideDown(250).delay(5000).slideUp(250);
            } else {
                $(this).hide();
                $(".EmailFormPart", tmp_oWoordzoeker).slideDown(250)
            }
        });

        //allow the user to submit the form without warning
        $(".SubmitButton", tmp_oWoordzoeker).mouseup(function () { tmp_bSending = true });

        //show the selection line
        $(".Letters li", this).mouseover(function () {
            if (tmp_oActiveLetter) {
                $(".Letters li").removeClass("Hover");
                $(".Letters li").getLine(tmp_oActiveLetter, $(this), tmp_iSize).letters.addClass("Hover");
            }
        });

        //handle the click event of each letter
        $(".Letters li", this).click(function () {
            //mark starting letter
            if (!tmp_oActiveLetter) {
                tmp_oActiveLetter = $(this).addClass("Selected");
            }
            else {
                //remove all hover class, and get the new line
                var tmp_oLine = $(".Letters li").removeClass("Hover").getLine(tmp_oActiveLetter, $(this), tmp_iSize);

                //find the word, mark it as done and if the word was found, also mark the line as done
                if ($(".Woorden li", tmp_oWoordzoeker)
                    .filter(function () { return $(this).text().toUpperCase() == tmp_oLine.text; })
                    .addClass("Done").find("input").val("").length) {
                    tmp_oLine.letters.addClass("Done").find("input").val("");
                }

                //reset active letter
                if (tmp_oActiveLetter) tmp_oActiveLetter.removeClass("Selected");
                tmp_oActiveLetter = null;
            }
        });
    });

    //twitter feeds
    $(".TwitterPart[user]").each(function () {

        var tmp_oTag = $("ul", this);
        var tmp_oToday = $.removeTime(new Date());
        var tmp_oHashTag = $(this).attr("hashtag");
        var tmp_oUser = $(this).attr("user").substr(1);
        var tmp_iCount = parseInt($(this).attr("count")) || 5;

        var tmp_oResult = $.getJSON(
            "http://search.twitter.com/search.json?callback=?",
            { q: "from:" + tmp_oUser, rpp: tmp_iCount, result_type: "recent" },
            function (data) {

                $.each(data.results, function (i) {
                    var tmp_oDate = $.removeTime(new Date(this.created_at));
                    var tmp_oDays = $.dayDifferenceText(tmp_oToday, tmp_oDate);
                    tmp_oTag.append(
                        $("<li>")
                            .html($.toHtml(this.text))
                            .append($("<div>")
                                .append($("<span>").text(tmp_oDays))
                                .append(" - ")
                                .append($("<a>").text("reply").attr("target", "_blank").attr("href", "https://twitter.com/intent/tweet?in_reply_to=" + this.id_str))
                                .append(" - ")
                                .append($("<a>").text("retweet").attr("target", "_blank").attr("href", "https://twitter.com/intent/retweet?tweet_id=" + this.id_str))
                                ))
                });
            }
        );
    });

    //add corners
    $("#qmppMenu li a, .TwitterPart, .PanelPart").not(".Transparent").append($("<div>").addClass("CornerBottomRight"));

    //add links to panel headers
    //    $(".PanelPart:has(.PanelPartFooter .LinkButton)").each(function () {
    //        $("h1", this).wrapInner($("<a>").attr("href", $(".PanelPartFooter .LinkButton", this).attr("href")));
    //    });

    //close ContentParts for floating elements
    $("<div style='clear:both'></div>").appendTo(".ContentPart");

    //auto resize flash objects when they don't have a width
    $(window).load(function () {
        var tmp_iWidth = 0;
        $("object, embed")
            .filter(function () { return $(this).attr("width") || "" == ""; })
            .width(function () { return tmp_iWidth = $(this).parents(".FlashPart:eq(0)").width(); })
            .height(tmp_iWidth / 4 * 3);
    });
})

//gets called by the pageflip flash control
function js_sendStats() { }
