/**
 * This is automatically executed when the "Message" tab is clicked
 */
Vetstoria.privatemessages.clinic = new(new Class({

    __construct: function () {

        this.folders = ['Inbox', 'Sent', 'Draft', 'Trash'];
        this.messages = [];
        //where in the dom this message class will work
        this.destination = '';

        //dom 
        this.layout = {
            menu: false,
            //dom menu location 
            frame: false,
            //dom frame location
            ready: false
        };

        this.owner_type = "clinic";
        this.owner_id = "";
        //[{level, description}, ...]
        this.debug = []; // a simple debug array
    },

    //init this class, launched by the constructor
    init: function () {

        console.log('inited messagebox');

        this.owner_id = Vetstoria.session.get().id;
        this.messages = [];
        this.destination = $(".messagebox.content.tab");
        this.init_layout();
        this.messages = Vetstoria.privatemessages.db_select_all(this.owner_type, this.owner_id);

        $("button.Inbox").trigger("click");

    },

    //init the layout
    init_layout: function () {

        if (this.layout.ready) return;
        this.destination.css("margin-top","25px");
        this.layout.menu = this.destination.append($('<div class="ui menu raised-buttons" style="left:0px;" />')).find('.menu');
        this.layout.frame = this.destination.append($('<div class="frame" />')).find('div.frame');
        this.init_menu();
        this.layout.ready = true;
    //Vetstoria.setDate();
    },

    //init the tabs
    init_menu: function () {

        var prt = this;

        this.layout.menu.empty();
        this.layout.menu.append($('<button class="write"/>').text('Write').click(function () {

            if ($(this).hasClass('selected') && Vetstoria.privatemessages.draft_message==false) return;

            $(this).parents().find('.messagebox > .menu > button').removeClass('selected');
            $(this).addClass('selected');

            prt.write_form();

        }));

        for (var x=0;x<this.folders.length;++x) {

            var v = this.folders[x];

            this.layout.menu.append($('<button class="' + v + '" />').text(v).click(function () {

                v = $(this).text();

                if ($(this).hasClass('selected')) return;

                $(this).parents().find('.messagebox > .menu > button').removeClass('selected');
                $(this).addClass('selected');

                console.log('click', v);
                prt.show_folder(v);

            }));

        }
        

    },

    //Generate a messages' list
    show_folder: function (folder) {

        if (!Vetstoria.privatemessages.folder_exists(folder)) return false;

        var table = $('<table/>').addClass("message_list style").attr({
            "cellspacing": 0,
            "cellpadding": 0
        });
        var thead = "<thead><tr><th width='25'><input type='checkbox' id='selectAll'/></th><th width='100'>From</th><th width='150'>Message Subject</th><th width='100'>When</th><th>To</th></tr></thead>";
        var prt = this;
        var k;
        var message = [];
        var messageID;

        $(thead).appendTo(table);

        for (var i = 0; i < this.messages.length; i++) {

            if (this.messages[i].folder.toLocaleLowerCase() != folder.toLocaleLowerCase()) continue;
            message.push(this.messages[i]);

        }

        if (message.length == 0) {

            var div = $('<div />').css({
                "text-align": "center",
                "line-height": 16
            }).text("Sorry,no message in this folder.");

            this.layout.frame.empty().append(div);
            return;

        }

        for (var i = 0; i < message.length; i++) {
            // add a class "unread" on read messages		
            var messageREAD = message[i].read;
            if (messageREAD == 0) {
                var row = $('<tr class="unread"/>');
            }
            else {
                var row = $('<tr />');
            }

            var checkbox = $('<input type="checkbox" name="deleteId" />').val(message[i].id);
            var title, from;

            var fromname = $('<div />').append(
                $("<div class='information'/>").append(
                    $("<p class='name'/>").append($("<a href='" + "/" + message[i].from_type + "/" + message[i].from_id + "' />").text(message[i].from_name))));

            var toname = $('<div />').append(
                $("<div class='information'/>").append(
                    $("<p class='name'/>").append($(((message[i].to.length > 0) ? "<a href='" + "/" + message[i].to[0].to_type + "/" + message[i].to[0].to_id + "' />" : "<a href='javascript:void(0)' />")).text(((message[i].to.length > 0) ? (message[i].to[0].to_name + ((message[i].to.length > 1) ? " ..." : "")) : "...")))));

            (function () {
                //console.log(message.id);		
                var messageID = message[i].id;
                // read a class "unread" on read messages	
                var read = message[i].read;
                title = $('<a href="javascript:void(0)"/>').html(((message[i].title != "") ? message[i].title : "...") + "<br/>").click(function (event) {
                    event.stopPropagation();
                    prt.show_message(messageID);
                    if (read == 0) {
                        $(this).parent().parent().removeClass("unread");
                        prt.read(messageID, "read");
                    }
                });

            })();

            with(row) {
                append(($('<td width="25"/>')).append(checkbox));
                append(($('<td width="100"/>')).append(fromname));
                append(($('<td width="150"/>')).append(title));
                append(($('<td width="100"/>')).append($("<em class='timestamp'/>").attr("rel", message[i].date)));
                append(($('<td/>')).append(toname));
                appendTo(table);
                }
        }

        this.layout.frame.empty().append($('<div class="table-list" />').append(table));
        $(table).vetTable({
            'height': 'auto'
        });
        var date;
        $("em.timestamp").each(function(){
            date = $(this).attr('rel');
            $(this).text(prettyDate(date));
        });
        var div = $('<div />').css("padding", "5px 0px");
        var deleteBtn = $('<input type="button" value="Delete" class="deleteBtn"/>');
        var markReadBtn = $('<input type="button" value="Mark as read" class="markReadBtn"/>');
        var markUnreadBtn = $('<input type="button" value="Mark as unread" class="markUnreadBtn"/>');
        div.append(deleteBtn).append(markReadBtn).append(markUnreadBtn);
        this.layout.frame.append(div);

        deleteBtn.bind('click', function () {
            prt.confirmPlanel();
        });

        markReadBtn.bind('click', function () {
            if ($("input[name='deleteId']:checked").length == 0) {
                $.msgbox('Please select at least one message');
                return false;
            }
            if ($("input[name='deleteId']:checked").length == 1) {
                var selectId = 0;
                selectId = $("input[name='deleteId']:checked").val();
            }
            else {
                var selectId = {};
                selectId.id = [];
                $("input[name='deleteId']:checked").each(function () {
                    selectId.id.push($(this).val());
                });
            }
            prt.read(selectId, "read");
        });
        markUnreadBtn.bind('click', function () {
            if ($("input[name='deleteId']:checked").length == 0) {
                $.msgbox('Please select at least one message');
                return false;
            }
            if ($("input[name='deleteId']:checked").length == 1) {
                var selectId = 0;
                selectId = $("input[name='deleteId']:checked").val();
            }
            else {
                var selectId = {};
                selectId.id = [];
                $("input[name='deleteId']:checked").each(function () {
                    selectId.id.push($(this).val());
                });
            }
            prt.read(selectId, "unread");
        });
        Vetstoria.layout.tabHeightFix();
        return true;

    },
    /**
     * delete a message
     * return true if success
     */
    remove: function (selectId, target) {
        var prt = this;
        if (selectId.id) {
            var moveArray2 = this.select('id', selectId.id[0])[0];
            if (moveArray2.folder.toLocaleLowerCase() == "trash") {
                for (var k = 0; k < selectId.id.length; k++) {
                    $.each(prt.messages, function (i) {
                        if (prt.messages[i] != undefined) {
                            if (prt.messages[i].id == selectId.id[k]) {
                                prt.messages.splice(i, 1);
                            }
                        }
                    });
                }
                Vetstoria.privatemessages.db_delete(prt.owner_type, prt.owner_id, selectId);
            }
            else {
                for (var k = 0; k < selectId.id.length; k++) {
                    $.each(prt.messages, function (i) {
                        if (prt.messages[i] != undefined) {
                            if (prt.messages[i].id == selectId.id[k]) {
                                prt.messages[i].folder = "trash";
                            }
                        }
                    });
                }
                this.change_folder(selectId, "trash");
            }
            $("input[name='deleteId']:checked").parent().parent().remove();

        }
        else {
            var moveArray = this.select('id', selectId)[0];
            if (moveArray.folder.toLocaleLowerCase() == "trash") {
                $.each(prt.messages, function (i) {
                    if (prt.messages[i] != undefined) {
                        if (prt.messages[i].id == selectId) {
                            prt.messages.splice(i, 1);
                        }
                    }
                });
                Vetstoria.privatemessages.db_delete(prt.owner_type, prt.owner_id, selectId);
                //change folder
                if (target) {
                    $(target).parent().parent().remove();
                }
                else {
                    $("input[name='deleteId']:checked").parent().parent().remove();
                }
            }
            else {
                $.each(prt.messages, function (i) {
                    if (prt.messages[i] != undefined) {
                        if (prt.messages[i].id == selectId) {
                            prt.messages[i].folder = "trash";
                        }
                    }
                });
                console.log(prt.owner_type, prt.owner_id, selectId, "trash");
                prt.change_folder(selectId, "trash");
                if (target) {
                    $(target).parent().parent().remove();
                }
                else {
                    $("input[name='deleteId']:checked").parent().parent().remove();
                }
            }
        }

    },
    /**
     * change folder (used to move to trash)
     * return true if success
     */
    change_folder: function (id, folder) {

        console.log("change folder");
        Vetstoria.privatemessages.db_change_folder(this.owner_type, this.owner_id, id, folder);
        var message = this.messages;

        $.each(message, function (i) {
            if (message[i].id == id) {
                message[i].folder = folder;
                return true;
            }
            else {
                return false;
            }
        });

    },
    //Show the message in a facebox (sender, title, date, content)
    show_message: function (id) {

        var message = this.messages;

        $.each(message, function (i) {

            if (message[i].id == id) {

                var title = message[i].title;
                var content = message[i].content;

                if (message[i].folder.toLocaleLowerCase() == "draft") {

                    Vetstoria.privatemessages.draft_message = message[i];

                    $("button.write").trigger("click");

                }
                else {
                    var sender = '<div class="information">' + message[i].from_name + '</div>';
                    var recipients = '<div class="information"><span>';
                    $.each(message[i].to, function (j) {
                        recipients = recipients + message[i].to[j].to_name + "; ";
                    });
                    recipients = recipients + "</span></div>";

                    var date = message[i].date;
                    var str = '<div class="ui block" id="faceboxContainer" style="width:610px"><div class="header text_left"><h3>Private Message</h3></div><div class="content" style="overflow-y:auto;overflow-x:hidden;height:400px"><table width="500" border="0" cellspacing="10" cellpadding="0" style="font-size:15px;color:#666666;"><tr><td width="100" align="right"><label style="font-weight:bold;padding-right:10px;">From:</label></td><td width="400" style="border:1px solid black !important;">' + sender + '</td></tr><tr><td width="100" align="right"><label style="font-weight:bold;padding-right:10px;">To:</label></td><td width="400" style="border:1px solid black !important;">' + recipients + '</td></tr><tr><td align="right"><label style="padding-right:10px;font-weight:bold;">Subject:</label></td><td style="border:1px solid black !important;"><span>' + title + '</span></td></tr><tr><td align="right"><label style="font-weight:bold;padding-right:10px;">Date:</label></td><td style="border:1px solid black !important;"><em rel="' + date + '" class="timestamp" style="margin-left:0">'+prettyDate(date)+'</em></td></tr><tr><td align="right" valign="top"><label style="font-weight:bold;padding-right:10px;">Message:</label></td><td style="border:1px solid black !important;"><textarea cols="470" rows="15" class="message_textarea" readonly="readonly">' + content + '</textarea></td></tr></table></div></div>';
                    $.facebox(str);
                }
            }
        });
    },
    read: function (selectId, type) {

        if (type == "read") {
            var read = 1;
            $("input[name='deleteId']:checked").attr("checked", '').parent().parent().removeClass("unread").removeClass("selected");
            Vetstoria.privatemessages.db_read(this.owner_type, this.owner_id, selectId);
        } else if (type == "unread") {
            var read = 0;
            $("input[name='deleteId']:checked").attr("checked", '').parent().parent().addClass("unread").removeClass("selected");
            Vetstoria.privatemessages.db_unread(this.owner_type, this.owner_id, selectId);
        }

        if (selectId.id) {
            for (var k = 0; k < selectId.id.length; k++) {
                this.markRead(this.messages, selectId.id[k], read);
            }
        }
        else {
            this.markRead(this.messages, selectId, read);
        }

    },
    markRead: function (messages, id, read) {

        var prt = this;

        $.each(prt.messages, function (i) {
            if (prt.messages[i] != undefined) {
                if (prt.messages[i].id == id) {
                    prt.messages[i].read = read;
                }
            }
        });

    },
    //Display the write form
    write_form: function (is_external) {

        if (is_external==undefined && !this.layout.ready) return false;
        else if(is_external!=undefined) this.owner_id = Vetstoria.session.get().id;

        var id = -1;
        var saved_title = '';
        var saved_content = '';
        var recipients = [];
        var debug = [];
        var prt = this;

        var form = $('<form/>').addClass("write");
        var to = $('<select/>').addClass("to").attr("name", "to");
        var title = $('<input/>').addClass("title").attr("type", "text");
        var content = $('<textarea/>').addClass("content");
        var sendSubmit = $('<input/>').addClass("sendSubmit").attr({
            "type": "button",
            "value": "Send"
        });
        var cancel = $('<input/>').addClass("sendCancel").attr({
            "type": "button",
            "value": "Clear"
        });
        var saveSubmit = $('<input/>').addClass("saveSubmit").attr({
            "type": "button",
            "value": "Save Draft"
        });

        if (Vetstoria.privatemessages.draft_message != false) {
            id = Vetstoria.privatemessages.draft_message.id;
            saved_title = Vetstoria.privatemessages.draft_message.title;
            saved_content = Vetstoria.privatemessages.draft_message.content;
            var temp = Vetstoria.privatemessages.draft_message.to;
            Vetstoria.privatemessages.draft_message = false;
            for (var i = 0; i < temp.length; i++) {
                var selectedoption = $("<option />").text(temp[i].to_name).attr('value', temp[i].to_type + "/" + temp[i].to_id).attr('selected', 'selected').addClass("selected");
                to.append(selectedoption);
            }
        }

        title.val(saved_title).bind('keyup', function () {
            saved_title = $(this).val();
        });

        content.autogrow({
            "width":"490px",
            "fontSize":"11.5px",
            "lineHeight":"normal"
        });
        content.val(saved_content).bind('keyup', function () {
            saved_content = $(this).val();
        }).trigger("change");


        cancel.bind('click', function () {
            //to.trigger('removeAll');
            title.val('');
            content.val('');
        });
        if(is_external!=undefined) {
            cancel.val("Reset");
        }

        var prt = this;
        sendSubmit.bind('click', function () {

            if (title.val() == "" || content.val() == "" || to.val() == null) {
                $.msgbox("Please complete all fields of the message before sending it!", {
                    type: "error"
                });
            }
            else {
                var k, toTemp = to.val(),
                toA = [];

                for (var i = 0; i < toTemp.length; i++) {
                    var to_details = toTemp[i].split("/");
                    var a = {
                        to_type: to_details[0],
                        to_id: to_details[1]
                    };
                    toA.push(a);
                }

                var sentMsg = {
                    "id": id,
                    "to": toA,
                    "from_type": prt.owner_type,
                    "from_id": prt.owner_id,
                    'title': saved_title,
                    'content': saved_content,
                };

                prt.add(sentMsg);
                prt.remove_from_cache(id);

                if(is_external!=undefined) {
                    $.facebox.close();
                }
            }

        });

        saveSubmit.bind('click', function () {

            if (title.val() == "" && content.val() == "" && to.val() == null) {
                $.msgbox("Please complete at least one field before saving this message as a draft!", {
                    type: "error"
                });
            }
            else {
                var k, toTemp = to.val(),
                toA = [];

                if (to.val() != null && toTemp.constructor == Array) {
                    for (var i = 0; i < toTemp.length; i++) {
                        var to_details = toTemp[i].split("/");
                        var a = {
                            to_type: to_details[0],
                            to_id: to_details[1]
                        };
                        toA.push(a);
                    }
                }

                var sentMsg = {
                    "id": id,
                    "to": toA,
                    "from_type": prt.owner_type,
                    "from_id": prt.owner_id,
                    'title': saved_title,
                    'content': saved_content,
                };

                prt.save(sentMsg);
                prt.remove_from_cache(id);

                if(is_external!=undefined) {
                    $.facebox.close();
                }
            }

        });

        with(form) {

            append("<label class='first'>To</label>");
            append(to);
            append("<p>");
            append("<label class='first'>Title</label>");
            append(title);
            append('<div class="title-count" />');
            append("<p>");
            append("<label class='second'>Content</label>");
            append(content);
            append('<div class="content-count" />');
            append("<p>");
            append(sendSubmit);
            append(cancel);
            append(saveSubmit);
            }

        $(form).find('.to').fcbkcomplete({
            json_url: $BASE_PATH + "messagebox/" + prt.owner_type + "/" + prt.owner_id + "/getcontactlist/",
            cache: false,
            filter_case: false,
            filter_hide: true,
            firstselected: true,
            filter_selected: true,
            newel: false
        });

        if(is_external==undefined) {
            var div = $('<div />').css("padding", "5px 15px 5px 15px").append(form);
            this.layout.frame.empty().append(div);
        }
        else{
            var maindiv = $('<div style="width:500px;" />').append('<div class="header text_left"><h1>Compose Message</h1></div>');
            maindiv.append($('<div style="margin-top:20px;margin-bottom:20px;" />').append(form));
            $.facebox(maindiv);
            /*$('input.title').NobleCount('.title-count',{
                max_chars:150,
                block_negative:true,
                post_text:true
            });
            $('textarea.content').NobleCount('.content-count',{
                max_chars:350,
                block_negative:true,
                post_text:true
            });
            */
        }
    },

    /**
     * Removes messafge from cache
     * return 0 if no success
     * return id if success
     */
    remove_from_cache: function (id) {

        var message = this.messages;

        $.each(message, function (i) {

            if (message[i].id == id) {
                message.splice(i, 1);
            }
        });
    },

    /**
     * Add a message
     * return 0 if no success
     * return id if success
     */
    add: function (message_object) {

        var addMsg = Vetstoria.privatemessages.db_add(this.owner_type, this.owner_id, message_object);

        if (addMsg.state == 1) {
            $.msgbox("Message could not be sent due to an unknown error", {
                type: "error"
            });
            return false;
        }

        if (addMsg.state == 0) {
            this.messages = this.messages.reverse();
            this.messages.push(addMsg.data[0]);
            this.messages = this.messages.reverse();
            $("input.sendCancel").trigger("click");
            $.msgbox("Message has been successfully sent", {
                type: "info"
            });
        }
    },
    /**
     * Save a message
     * return 0 if no success
     * return id if success
     */
    save: function (message_object) {

        var saveMsg = Vetstoria.privatemessages.db_save(this.owner_type, this.owner_id, message_object);

        if (saveMsg.state == 1) {
            $.msgbox("Drat save failed", {
                type: "error"
            });
            return false;
        }

        if (saveMsg.state == 0) {
            this.messages = this.messages.reverse();
            this.messages.push(saveMsg.data[0]);
            this.messages = this.messages.reverse();
            $("input.sendCancel").trigger("click");
            $(".content").trigger("change");
            $.msgbox("Draft successfully saved", {
                type: "info"
            });
        }
    },
    select: function (key, value) {

        return this.messages.filter(function (e, i, a) {
            return (e[key] == value)
        });

    },

    confirmPlanel: function () {

        if ($("input[name='deleteId']:checked").length == 0) {
            $.msgbox('Please select at least one message');
            return false;
        }

        var prt = this;
        /*
        var div = $("<div/>").css({
            "width": "32em",
            "height": "5em",
            "text-align": "center"
        });
        var p1 = $("<p/>").text("Are you sure to delete these messages?");
        var p2 = $("<p/>");
        var confirmBtn = $('<button/>').addClass("deleteBtn").text('confirm').click(function () {

            if ($("input[name='deleteId']:checked").length == 1) {
                var selectID = 0;
                selectID = $("input[name='deleteId']:checked").val();
            }
            else {
                var selectID = {};
                selectID.id = [];
                $("input[name='deleteId']:checked").each(function () {
                    selectID.id.push($(this).val());
                });
            }

            console.log(selectID);
            prt.remove(selectID);
            $.facebox.close();

        });

        p2.append(confirmBtn);
        div.append(p1).append(p2);
        $.facebox(div);
*/
        var del_msg="";
        if ($("input[name='deleteId']:checked").length == 1) {
            del_msg="this message";
        }
        else
        {
            del_msg="these "+$("input[name='deleteId']:checked").length+" messages";
        }
        $.msgbox('Are you sure you wish to delete '+del_msg+'?',{
            type:'confirm',
            buttons:[{
                type:'submit',
                value:'Yes'
            },{
                type:'submit',
                value:'No'
            }]
        },
        function(result){
            if(result=='Yes'){
                $(this).addClass('processing');
                if ($("input[name='deleteId']:checked").length == 1) {
                    var selectID = 0;
                    selectID = $("input[name='deleteId']:checked").val();
                }
                else {
                    var selectID = {};
                    selectID.id = [];
                    $("input[name='deleteId']:checked").each(function(){
                        selectID.id.push($(this).val());
                    });
                }

                console.log(selectID);
                prt.remove(selectID);
            }
        });
    }

}));
