﻿var INVITEUSERS = {

    showSelectModalForEvents: function(objectid) {
        return this.showSelectModalWithOptions(objectid, {
            jsonBaseUrl: "/json-services/events.asmx/",
            hint: 'De foreslåede deltagere er gruppens brugere',
            titleText: 'Invitér deltagere til begivenheden',
            tabText: 'Find deltagere'
        });
    },

    showSelectModalForGroups: function(objectid) {
        return this.showSelectModalWithOptions(objectid, {
            jsonBaseUrl: "/json-services/groups.asmx/",
            hint: 'Søg efter nye gruppemedlemmer',
            titleText: 'Invitér medlemmer til gruppen',
            tabText: 'Find medlemmer'
        });
    },

    showSelectModalWithOptions: (function() {

        return function(objectId, options) {
            var pager = {
                selector: "div.pager",
                page: 1,
                totalhits: 0,
                pagesize: 6,
                getStartIndex: function() {
                    return (this.page - 1) * this.pagesize;
                },
                getNumPages: function() {
                    var numPages = Math.ceil(this.totalhits / this.pagesize);
                    return numPages;
                },
                reset: function() {
                    this.page = 1;
                    this.totalhits = 0;
                },

                updateLook: function() {
                    if (this.totalhits < this.pagesize + 1) {
                        $(this.selector).hide();
                        this.updateButtons();
                    } else {
                        this.updateButtons();
                        $(this.selector).show();
                    }
                },

                updateButtons: function() {
                    // first & previous button
                    if (this.page == 1) {
                        $(this.selector + " a.btnFirst img").attr({ "src": "/Media/Layout/icons/btn-pagination-first-grey.gif" });
                        $(this.selector + " a.btnPrev img").attr({ "src": "/Media/Layout/icons/btn-pagination-prev-grey.gif" });
                    } else {
                        $(this.selector + " a.btnFirst img").attr({ "src": "/Media/Layout/icons/btn-pagination-first.gif" });
                        $(this.selector + " a.btnPrev img").attr({ "src": "/Media/Layout/icons/btn-pagination-prev.gif" });
                    }

                    // next & last button
                    if (this.page == this.getNumPages()) {
                        $(this.selector + " a.btnNext img").attr({ "src": "/Media/Layout/icons/btn-pagination-next-grey.gif" });
                        $(this.selector + " a.btnLast img").attr({ "src": "/Media/Layout/icons/btn-pagination-last-grey.gif" });
                    } else {
                        $(this.selector + " a.btnNext img").attr({ "src": "/Media/Layout/icons/btn-pagination-next.gif" });
                        $(this.selector + " a.btnLast img").attr({ "src": "/Media/Layout/icons/btn-pagination-last.gif" });
                    }
                }
            };
            var state = new Array();
            var suggestions = new Array();


            var hasBeenRun = false;
            var modalId = "#modalInviteUsers";
            var suggestionSelector = modalId + " div.table-suggestions tbody";
            var nodesSelector = modalId + " div.table-nodes tbody";
            var suggestionLength = 10;
            var timeout;
            var pagerMarkedForReset = false;
            var prepopulatedSuggestions = false;

            var setInvitebuttonVisibility = function() {
                if (state.length > 0) {
                    $(modalId + " input.save").removeAttr("disabled");
                }
                else {
                    $(modalId + " input.save").attr("disabled", "disabled");
                }
            };

            var close = function() {
                $.ajax({
                    type: "POST",
                    cache: true,
                    async: true,
                    timeout: 500,
                    contentType: "application/json",
                    dataType: "json",
                    data: $.toJSON({ input: 'hej' }),
                    url: "/json-services/keepalive.asmx/pong",

                    success: function(result) {
                        $(modalId).jqmHide();
                        $(modalId).remove();
                    }
                });
                return false;
            };
            var inputSelector = modalId + " #inputSearchForm";

            var searchSucceeded = function(result) {
                suggestions = result.results;
                listSuggestions();
                pager.totalhits = result.total;
                $(modalId + ' .total-count').html(result.total);
                pager.updateLook();
                if (!result.success) {
                    var box = NOTICE.getNoticeBoxInfo("Der opstod en fejl under søgning. Prøv igen. Fejlbeskeden er: <br />" + result.errorMessage, "formSearchError");
                    showError(box);
                } else {
                    showError('');
                }
            };


            var addNodeToStateAndStateTable = function(node) {
                state.push(node);
                // Insert suggestiont at first position in table
                if (state.length == 1) {
                    // Remove the 'Ingen tilføjede områder' row
                    $(nodesSelector).find('tr').remove();
                }
                var newRow = $(nodesSelector).prepend(generateNodeRow(node, true));
                newRow.find("a:first").click(userRemovedNode);
                TABLE.fixColoring($(modalId + ' table:last'));
                setInvitebuttonVisibility();
            }

            var addNodeToState = function(nodeId, td) {
                for (var i = 0; i < suggestions.length; i++) {
                    if (suggestions[i].id == nodeId) {
                        addNodeToStateAndStateTable(suggestions[i]);
                        td.text("Er tilføjet");
                        break;
                    }
                }
            }

            var userAddedNode = function(event) {
                var nodeId = $(event.target).parent("a").attr("rel");
                addNodeToState(nodeId, $(event.target).closest("td"));
                return false;
            };

            var addAll = function(event) {
                var addResults = function(result) {
                    var allNodes = result.d.results;
                    for (var i = 0; i < allNodes.length; i++) {
                        if (allNodes[i].status == 3 && !nodeIsInState(allNodes[i].id)) {
                            addNodeToStateAndStateTable(allNodes[i]);
                        }
                    }
                    if (prepopulatedSuggestions == true) {
                        prepopulateSuggestions(false);
                    } else {
                        newSearch(true);
                    }
                    return false;
                };
                if (prepopulatedSuggestions == true) {
                    $.ajax({
                        type: "POST",
                        cache: false,
                        async: true,
                        timeout: 5000,
                        contentType: "application/json",
                        dataType: "json",
                        url: options.jsonBaseUrl + "suggestparticipantsgetall",
                        data: $.toJSON({
                            objectid: objectid
                        }),
                        success: addResults
                    });
                } else {
                    $.ajax({
                        type: "POST",
                        cache: false,
                        async: true,
                        timeout: 5000,
                        contentType: "application/json",
                        dataType: "json",
                        url: options.jsonBaseUrl + "searchforinviteegetall",
                        data: $.toJSON({
                            objectid: objectid,
                            term: $(inputSelector).val()
                        }),
                        success: addResults
                    });
                }
                return false;

            }


            var noNodesSelectedRow = '<tr><td class="first-item">Ingen tilføjede</td><td class="last-item"></td></tr>';

            var removedNodeFromState = function(nodeId, tr) {
                for (var i = 0; i < state.length; i++) {
                    if (state[i].id == nodeId) {
                        state.splice(i, 1);
                        tr.remove();
                        if (state.length == 0) {
                            $(nodesSelector).append(noNodesSelectedRow);
                        }
                        listSuggestions();
                        TABLE.fixColoring($(modalId + ' table:last'));
                        setInvitebuttonVisibility();
                        break;
                    }
                }
            };

            var userRemovedNode = function(event) {
                var nodeId = $(event.target).parent("a").attr("rel");
                removedNodeFromState(nodeId, $(event.target).closest("tr"));
                return false;
            };

            var listNodes = function() {
                var jqtbody = $(nodesSelector);
                jqtbody.empty();
                if (state.length == 0) {
                    jqtbody.append(noNodesSelectedRow);
                }
                else {
                    for (var i = 0; i < state.length; i++) {
                        jqtbody.append(generateNodeRow(state[i], true));
                    }
                    jqtbody.find("a").click(userRemovedNode);
                    //jqtbody.find(".tip-item").cluetip({ positionBy: 'mouse', topOffset: -5, leftOffset: 18, local: true, waitImage: false, cluezIndex: 300001, showTitle: false, dropShadow: false });
                }
                TABLE.fixColoring($(modalId + ' table:last'));
            }

            var listSuggestions = function() {
                $(suggestionSelector).empty();
                if (suggestions == null || suggestions.length == 0) {
                    var emptyRow = '<tr class="odd-last"><td class="col-name first-item">Der er ikke fundet nogen forslag.</td><td class="col-add"></td><td class=" last-item"/></tr>';
                    $(suggestionSelector).append(emptyRow);
                }

                for (var i = 0; i < suggestions.length; i++) {
                    $(suggestionSelector).append(generateSuggestionRow(suggestions[i]));
                    $(suggestionSelector + " a img.img-collapse:last").click(function() {
                        var userid = suggestions[i].userid;
                        return function() {
                            expandUserlist(this.id, userid);
                            return false;
                        }
                    } ());
                }
                TABLE.fixColoring($(modalId + ' table:first'));
                $(modalId + ' img.add').click(userAddedNode);
            };

            var nodeIsInState = function(nodeId) {
                for (var i = 0; i < state.length; i++) {
                    if (state[i].id == nodeId) {
                        return true;
                    }
                }
                return false;
            };

            var invitableSuggestions = function() {
                var invitable = new Array();
                if (suggestions != null) {
                    for (var i = 0; i < suggestions.length; i++) {
                        if (invitable[i].status == 3) {
                            invitable.push(invitable[i]);
                        }
                    }
                }
            }

            var generateSuggestionRow = function(suggestion) {

                var tdadd = '<a href="#" rel="' + suggestion.id + '"><img class="img-collapse add" src="/media/Layout/icons/btn-plus.gif" alt="add"/></a>';
                if (nodeIsInState(suggestion.id)) {
                    tdadd = 'Er tilføjet';
                }
                if (suggestion.status == 0) {  // "invited"
                    tdadd = 'Er inviteret';
                }
                else if (suggestion.status == 1) { // "participating"
                    tdadd = 'Er med';
                }
                else if (suggestion.status == 2) { // "notgroupmember"
                    tdadd = 'Ikke gruppemedlem';
                }
                var tdexpand = '';
                var expandrow = '';
                if (suggestion.id != 0) {
                    tdexpand = "<td class='last-item'><a title='Vis supplerende information ...' href='#'><img id='imgInviteUserExpand-" + suggestion.userid + "' alt='Vis supplerende information ...' src='/media/Layout/icons/btn-expand-filer.gif' class='img-collapse '/></a></td>";
                    expandrow = "<tr class='expand-area hidden'><td class='first-item' colspan='5'>(henter oplysninger ...)</td></tr>";
                } else {
                    tdexpand = "<td class='last-item'><img alt='Ingen supplerende information' src='/media/Layout/icons/btn-expand-filer-inaktiv.gif' class='img-collapse' /></td>";
                }
                var row = '<tr><td class="col-name first-item">' + suggestion.displayString + '</td><td class="col-add">' + tdadd + '</td>' + tdexpand + '</tr>';
                row += expandrow;

                return row;
            };

            var generateNodeRow = function(node, showRemoveButton) {
                var row = '<tr><td class=" first-item "';
                row += '"><span>' + node.displayString + '</span></td><td class=" last-item">';

                if (showRemoveButton) {
                    row += '<a href="#" rel="' + node.id + '"><img class="img-collapse remove" src="/media/Layout/icons/btn-delete-file.gif" alt="remove"/></a>';
                }
                row += '</td></tr>';

                return row;
            };

            var newSearch = function(resetPager) {
                prepopulatedSuggestions = false;
                pagerMarkedForReset = resetPager;
                if (timeout != undefined) {
                    clearTimeout(timeout);
                }
                timeout = setTimeout(executeSearch, 300);

                return true;
            }

            var executeSearch = function() {

                if (pagerMarkedForReset) {
                    pager.reset();
                    pagerMarkedForReset = false;
                }

                $.ajax({
                    type: "POST",
                    cache: false,
                    async: true,
                    timeout: 5000,
                    contentType: "application/json",
                    dataType: "json",
                    url: options.jsonBaseUrl + "searchforinvitee",
                    data: $.toJSON({
                        objectid: objectid,
                        term: $(inputSelector).val(),
                        begin: pager.getStartIndex().toString(),
                        length: pager.pagesize.toString()
                    }),
                    success: function(result) {
                        searchSucceeded(result.d);

                    }
                });

            };

            var changePage = function() {
                if (prepopulatedSuggestions == true) {
                    prepopulateSuggestions(true);
                }
                else {
                    newSearch(false);
                }
            };

            var showError = function(msg) {
                $(modalId + " div.notice-box + div.clearing").remove();
                $(modalId + " div.notice-box").remove();
                $(modalId + " div.buttons-divider").after(msg);
            };

            var setupPagerEvents = function() {
                $(modalId).click(function(event) {
                    if ($(event.target).parent().is("a.btnNext")) {
                        if (pager.page < pager.getNumPages()) {
                            pager.page++;
                            changePage();
                        }
                        return false;
                    }
                    if ($(event.target).parent().is("a.btnLast")) {
                        if (pager.page < pager.getNumPages()) {
                            pager.page = pager.getNumPages();
                            changePage();
                        }
                        return false;
                    }
                    if ($(event.target).parent().is("a.btnPrev")) {
                        if (pager.page > 1) {
                            pager.page--;
                            changePage();
                        }
                        return false;
                    }
                    if ($(event.target).parent().is("a.btnFirst")) {
                        if (pager.page > 1) {
                            pager.page = 1;
                            changePage();
                        }
                        return false;
                    }
                });
            };

            var prepopulateSuggestions = function(pagerInitiated) {
                prepopulatedSuggestions = true;
                if (!pagerInitiated) {
                    $(nodesSelector).empty();
                }
                $(suggestionSelector).empty();

                $.ajax({
                    type: "POST",
                    cache: false,
                    async: true,
                    timeout: 5000,
                    contentType: "application/json",
                    dataType: "json",
                    url: options.jsonBaseUrl + "suggestparticipants",
                    data: $.toJSON({
                        objectid: objectid.toString(),
                        begin: pager.getStartIndex().toString(),
                        length: pager.pagesize.toString()
                    }),
                    success: function(result) {
                        searchSucceeded(result.d);
                        listNodes();
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown) {
                        var errorBoxId = "modalAddGroupMemberid" + Math.floor(Math.random() * 1000);
                        var errorBox = NOTICE.getNoticeBoxInfo('Der skete en fejl ved søgningen efter de foreslåede brugere: ' + textStatus, errorBoxId);
                        $(modalId + " .errorBoxPin").after(errorBox);
                    }
                });

            }

            var objectid;

            var duplicateNodeArray = function(array) {

                var result = new Array();
                if (array != undefined) {
                    for (var i = 0; i < array.length; i++) {
                        result.push(array[i]);
                    }
                }

                return result;
            }





            var objectid = objectId;

            var save = function() {
                var userIds = new Array();
                var emails = new Array();
                for (var i = 0; i < state.length; i++) {
                    if (state[i].id) {
                        userIds.push(state[i].id);
                    } else {
                        emails.push(state[i].email);
                    }
                }

                $.ajax({
                    type: "POST",
                    cache: false,
                    async: true,
                    timeout: 60000,
                    contentType: "application/json",
                    dataType: "json",
                    url: options.jsonBaseUrl + "invite",
                    data: $.toJSON({
                        objectid: objectid,
                        emails: emails,
                        userids: userIds
                    }),
                    success: function() {
                        return function(result) {
                            var errorBoxId = "modalAddGroupMemberid" + Math.floor(Math.random() * 1000);
                            var errorBox = NOTICE.getNoticeBoxInfo(result.d.errorMessage, errorBoxId);
                            $(modalId + ' .loader').remove();
                            $(modalId + " .errorBoxPin").after(errorBox);
                        };
                    } (),
                    error: function(XMLHttpRequest, textStatus, errorThrown) {
                        var errorBoxId = "modalAddGroupMemberid" + Math.floor(Math.random() * 1000);
                        var errorBox = NOTICE.getNoticeBoxInfo('Der skete en fejl ved invitation: ' + textStatus, errorBoxId);
                        $(modalId + ' .loader').remove();
                        $(modalId + " .errorBoxPin").after(errorBox);
                    }
                });
                $(modalId).find('.modal-container-left').addClass('hidden');
                $(modalId).find('.modal-container-right').addClass('hidden');
                $(modalId).find('.modal-container-right').after('<div class="loader" style="width: 100%; text-align:center"><img src="/media/Layout/ajax-loader.gif" alt="Inviterer brugere" /></div>');
                $(modalId + " .save").unbind('click', save);
                $(modalId + " .save").click(close);
                $(modalId + " .save").val('Luk vindue');
                $(modalId + " .cancel").hide();
                $(modalId + " span.button-large-cancel").addClass('hidden');

                return false;
            }
            var url = "/Custom/modalinviteusers.aspx?objectId=" + objectId;


            if (hasBeenRun == false) {
                hasBeenRun = true;
                $("body").append('<div id="injectedInvitedUsersContainer" style="display:none"></div>');
            }

            $("#injectedInvitedUsersContainer").load(url + " div.jqmWindow", { "rand": Math.random() }, function() {
                $(modalId).jqm({
                    modal: true, /* FORCE FOCUS */
                    toTop: true, /* FORCE z-index */ //(toTop makes loads of errors and may not be used)
                    onShow: function(hash) {
                        $("form#aspnetForm").removeClass('jqtransformdone');
                        $("form#aspnetForm").jqTransform();
                        initThisModal(hash);
                    }
                });
                $(modalId + ' img.img-collapse').click(close);
                $(modalId + ' .cancel').click(close);
                $(modalId + ' .add-all').click(addAll);
                $(modalId + ' .save').click(save);
                $(modalId + ' #inputSearchForm').keydown(function(event) {
                    if (event.keyCode == 13) {
                        $('#buttonUserSearch').click();
                        return false;
                    }
                });
                $('#buttonUserSearch').click(function() { newSearch(true); });

                setupPagerEvents();
                pager.reset();

                prepopulateSuggestions(false);
                $(modalId + " h2:first").html(options.titleText);
                $(modalId + " ul.tabs-navigation a:first").html(options.tabText);
                $(modalId).jqmShow();
                var hint = options.hint;
                $(inputSelector).attr('title', hint);
                $(inputSelector).attr("autocomplete", "off");
                $(inputSelector).val(hint);
                $(inputSelector).hint();
            });
        };

    } ())

};