/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */

var ComponentEditor = {
    attendeesWindow: null,
    recurrenceWindow: null,
    reminderWindow: null
};

function getOwnerLogin() {
    return ownerLogin;
}

function getCalendarOwner() {
    var ownerProfile;

    if (typeof organizer == "undefined") {
        var calendarIndex = $("calendarList").value;
        var ownersList = owners[0];
        var profiles = owners[1];
        var ownerUid = ownersList[calendarIndex];
        ownerProfile = profiles[ownerUid];
        ownerProfile["uid"] = ownerUid;
    }
    else {
        ownerProfile = organizer;
    }
    
    return ownerProfile;
}

function onPopupAttendeesWindow(event) {
    if (event)
        preventDefault(event);
    if (ComponentEditor.attendeesWindow && ComponentEditor.attendeesWindow.open && !ComponentEditor.attendeesWindow.closed)
        ComponentEditor.attendeesWindow.focus();
    else
        ComponentEditor.attendeesWindow = window.open(ApplicationBaseURL + "/editAttendees",
                                                      sanitizeWindowName(activeCalendar + activeComponent + "Attendees"),
                                                      "width=900,height=573");
    
    return false;
}

function onSelectClassification(event) {
    if (event.button == 0 || (isWebKit() && event.button == 1)) {
        var node = getTarget(event);
        if (node.tagName != 'A')
            node = $(node).up("A");
        popupToolbarMenu(node, "classification-menu");
        Event.stop(event);
    }
}

function onPopupAttachWindow(event) {
    if (event)
        preventDefault(event);

    var attachInput = $("attach");
    var newAttach = window.prompt(_("Target"), attachInput.value || "http://");
    if (newAttach != null) {
        var documentHref = $("documentHref");
        var documentLabel = $("documentLabel");
        if (documentHref.childNodes.length > 0) {
            documentHref.childNodes[0].nodeValue = newAttach;
            if (newAttach.length > 0)
                documentLabel.setStyle({ display: "block" });
            else
                documentLabel.setStyle({ display: "none" });
        }
        else {
            documentHref.appendChild(document.createTextNode(newAttach)); 
            if (newAttach.length > 0)
                documentLabel.setStyle({ display: "block" });
        }
        attachInput.value = newAttach;
    }
    onWindowResize(event);
  
    return false;
}

function onPopupDocumentWindow(event) {
    var documentUrl = $("attach");

    preventDefault(event);
    window.open(documentUrl.value, "SOGo_Document");

    return false;
}

function onMenuSetClassification(event) {
    event.cancelBubble = true;

    var classification = this.getAttribute("classification");
    if (this.parentNode.chosenNode)
        this.parentNode.chosenNode.removeClassName("_chosen");
    this.addClassName("_chosen");
    this.parentNode.chosenNode = this;

    var classificationInput = $("classification");
    classificationInput.value = classification;
}

function onChangeCalendar(event) {
    var calendars = $("calendarFoldersList").value.split(",");
    var form = document.forms["editform"];
    var urlElems = form.getAttribute("action").split("?");
    var choice = calendars[this.value];
    var urlParam = "moveToCalendar=" + choice;
    if (urlElems.length == 1)
        urlElems.push(urlParam);
    else
        urlElems[2] = urlParam;

    while (urlElems.length > 2)
        urlElems.pop();

    form.setAttribute("action", urlElems.join("?"));
}

function initializeDocumentHref() {
    var documentHref = $("documentHref");
    var documentLabel = $("documentLabel");
    var documentUrl = $("attach");

    documentHref.on("click", onPopupDocumentWindow);
    if (documentUrl.value.length > 0) {
        documentHref.appendChild(document.createTextNode(documentUrl.value));
        documentLabel.setStyle({ display: "block" });
    }

    var changeUrlButton = $("changeAttachButton");
    if (changeUrlButton)
        changeUrlButton.on("click", onPopupAttachWindow);
}

function initializeClassificationMenu() {
    if ($("classification-menu")) {
        var classification = $("classification").value.toUpperCase();
        var classificationMenu = $("classification-menu").childNodesWithTag("ul")[0];
        var menuEntries = $(classificationMenu).childNodesWithTag("li");
        var chosenNode;
        if (classification == "CONFIDENTIAL")
            chosenNode = menuEntries[1];
        else if (classification == "PRIVATE")
            chosenNode = menuEntries[2];
        else
            chosenNode = menuEntries[0];
        classificationMenu.chosenNode = chosenNode;
        $(chosenNode).addClassName("_chosen");
    }
}

function findAttendeeWithFieldValue(field, fieldValue) {
    var foundAttendee = null;

    var attendeesKeys = attendees.keys();
    for (var i = 0; !foundAttendee && i < attendeesKeys.length; i++) {
        var attendee = attendees.get(attendeesKeys[i]);
        if (attendee[field] == fieldValue) {
            foundAttendee = attendee;
        }
    }

    return foundAttendee;
}

function findDelegateAddress() {
    var delegateAddress = null;

    var ownerAttendee = findAttendeeWithFieldValue("uid", ownerLogin);
    if (ownerAttendee && ownerAttendee["delegated-to"]) {
        var delegateAttendee
            = findAttendeeWithFieldValue("email",
                                         ownerAttendee["delegated-to"]);
        if (delegateAttendee) {
            if (delegateAttendee["name"]) {
                delegateAddress = (delegateAttendee["name"]
                                   + " <" + delegateAttendee["email"] + ">");
            }
            else {
                delegateAddress = delegateAttendee["email"];
            }
        }
    }

    return delegateAddress;
}

function onComponentEditorLoad(event) {
    initializeDocumentHref();
    initializeClassificationMenu();
    var list = $("calendarList");
    if (list) {
        list.on("change", onChangeCalendar);
        list.fire("mousedown");
    }
    
    var tmp = $("itemClassificationList");
    if (tmp) {
        var menuItems = tmp.childNodesWithTag("li");
        for (var i = 0; i < menuItems.length; i++)
            menuItems[i].on("mousedown", onMenuSetClassification);
    }

    tmp = $("replyList");
    if (tmp) {
        tmp.on("change", onReplyChange);
        var isDelegated = (tmp.value == 4);
        tmp = $("delegatedTo");
        tmp.addInterface(SOGoAutoCompletionInterface);
        tmp.uidField = "c_mail";
        tmp.excludeGroups = true;
        var delegateEditor = $("delegateEditor");
        tmp.animationParent = delegateEditor;
        if (isDelegated) {
            var delegateAddress = findDelegateAddress();
            if (delegateAddress) {
                tmp.value = delegateAddress;
            }
            delegateEditor.show();
        }
     }

    tmp = $("repeatHref");
    if (tmp)
        tmp.on("click", onPopupRecurrenceWindow);
    tmp = $("repeatList");
    if (tmp)
        tmp.on("change", onPopupRecurrenceWindow);
    tmp = $("reminderHref");
    if (tmp)
        tmp.on("click", onPopupReminderWindow);
    tmp = $("reminderList");
    if (tmp)
        tmp.on("change", onPopupReminderWindow);
    tmp = $("summary");
    if (tmp)
        tmp.on("keyup", onSummaryChange);
    
    Event.on(window, "resize", onWindowResize);
    Event.on(window, "beforeunload", onComponentEditorClose);
    
    onPopupRecurrenceWindow(null);
    onPopupReminderWindow(null);
    onSummaryChange (null);
    
    var summary = $("summary");
    if (summary) {
  	summary.focus();
        summary.selectText(0, summary.value.length);
    }
    
    tmp = $("okButton");
    if (tmp)
        tmp.on ("click", onOkButtonClick);
    tmp = $("cancelButton");
    if (tmp)
        tmp.on ("click", onCancelButtonClick);
}

function onSummaryChange (e) {
    if ($("summary"))
        document.title = $("summary").value;
}

function onReplyChange(event) {
    var delegateEditor = $("delegateEditor");
    if (this.value == 4) {
        // Delegated
        delegateEditor.show();
        $("delegatedTo").focus();
    }
    else {
        delegateEditor.hide();
    }
    onWindowResize(null);

    return true;
}

function onComponentEditorClose(event) {
    if (ComponentEditor.attendeesWindow && ComponentEditor.attendeesWindow.open && !ComponentEditor.attendeesWindow.closed)
        ComponentEditor.attendeesWindow.close();
    if (ComponentEditor.recurrenceWindow && ComponentEditor.recurrenceWindow.open && !ComponentEditor.recurrenceWindow.closed)
        ComponentEditor.recurrenceWindow.close();
    if (ComponentEditor.reminderWindow && ComponentEditor.reminderWindow.open && !ComponentEditor.reminderWindow.closed)
        ComponentEditor.reminderWindow.close();
}

function onWindowResize(event) {
    var comment = $("commentArea");
    if (comment) {
        // Resize comment area of read-write component
        var document = $("documentLabel");
        var area = comment.select("textarea").first();
        var offset = 6;
        var height;
        
        height = window.height() - comment.cumulativeOffset().top - offset;
        
        if (document.visible()) {
            // Component has an attachment
            if ($("changeAttachButton"))
                height -= $("changeAttachButton").getHeight();
            else
                height -= $("documentHref").getHeight();
        }
        
        if (area)
            area.setStyle({ height: (height - offset*2) + "px" });

        comment.setStyle({ height: (height - offset) + "px" });
    }
    else {
        // Resize attendees area of a read-only component
        $("eventView").style.height = window.height () + "px";
        var height = window.height() - 120;
        var tmp = $("generalDiv");
        if (tmp)
            height -= tmp.offsetHeight;
        tmp = $("descriptionDiv");
        if (tmp)
            height -= tmp.offsetHeight;
        
        tmp = $("attendeesDiv");
        if (tmp) {
            tmp.style.height = height + "px";
            $("attendeesMenu").style.height = (height - 20) + "px";
        }
    }
    
    return true;
}

function onPopupRecurrenceWindow(event) {
    if (event)
        preventDefault(event);
    
    var repeatHref = $("repeatHref");
    
    var repeatList = $("repeatList");
    if (repeatList && repeatList.value == 7) {
        // Custom repeat rule
        repeatHref.show();
        if (event) {
            if (ComponentEditor.recurrenceWindow && ComponentEditor.recurrenceWindow.open && !ComponentEditor.recurrenceWindow.closed)
                ComponentEditor.recurrenceWindow.focus();
            else
                ComponentEditor.recurrenceWindow = window.open(ApplicationBaseURL + "/editRecurrence",
                                                               sanitizeWindowName(activeCalendar + activeComponent + "Recurrence"),
                                                               "width=500,height=400");
        }
    }
    else if (repeatHref)
        repeatHref.hide();
    
    return false;
}

function onPopupReminderWindow(event) {
    if (event)
        preventDefault(event);

    var reminderHref = $("reminderHref");

    var reminderList = $("reminderList");
    if (reminderList && reminderList.value == 15) {
        reminderHref.show();
        if (event) {
            if (ComponentEditor.reminderWindow && ComponentEditor.reminderWindow.open && !ComponentEditor.reminderWindow.closed)
                ComponentEditor.reminderWindow.focus();
            else {
                var height = (emailAlarmsEnabled ? 235 : 150);
                ComponentEditor.reminderWindow
                    = window.open(ApplicationBaseURL + "/editReminder",
                                  sanitizeWindowName(activeCalendar + activeComponent + "Reminder"),
                                  "width=255,height=" + height);
            }
        }
    }
    else if (reminderHref)
        reminderHref.hide();

    return false;
}

function onOkButtonClick (e) {
    
    var jsonData = Form.serialize(document.forms['rsvpform'], true);

    var input = $("delegatedTo");
    if (input && input.readAttribute("uid") != null) {
        jsonData['delegatedTo'] = input.readAttribute("uid");
    }
    
    triggerAjaxRequest(document.forms['rsvpform'].readAttribute("action"),
                       modifyEventCallback,
                       null,
                       Object.toJSON(jsonData),
                       { "content-type": "application/json"}
                       );
    
    return false;
}

function onCancelButtonClick (e) {
    window.close ();
}

document.on("dom:loaded", onComponentEditorLoad);
