var COMPOSE = {
    init: function (friends_div, recipients_div, explanation_el, compose_form, container_el) {
        this.friends_div = friends_div;
        this.compose_form = compose_form;
        this.container_el = container_el;
        this.friends_labels = friends_div.getElementsByTagName('label');
        this.hidden_input = this.create_hidden_input();
        this.recipients_div = recipients_div;
        this.explanation = explanation_el;
        if(this.explanation){
	        this.explanation.show = function () {
	            this.style.display = '';
	        };
	        this.explanation.hide = function () {
	            this.style.display = 'none';
	        };
        }
        this.process_friends_list();
        this.remove_labels();
    },
    create_hidden_input: function () {
        // this input will contain the selected recipients ids
        var hidden = document.createElement('input');
        hidden.type = 'hidden';
        hidden.name = 'recipient_ids';
        hidden.add_id = function (id) {
            var ids = this.value.split(',');
            if (ids.length==1 && ids[0]=='') {
                this.value = id;
            } else {
                ids.push(id);
                ids.join(',');
                this.value = ids;
            }
        }
        hidden.remove_id = function (id) {
            var ids = this.value.split(',');
            for (var i=0; i<ids.length; i++) {
                if (ids[i]==id)
                    ids.splice(i, 1);
            }
            this.value = ids.join(',');
        }
        this.compose_form.appendChild(hidden);
        return hidden;
    },
    add_recipient: function (el) {
        el.style.display = 'none';
        el.related_link.style.display = '';
        var recipient_id = el.id.substring(7);
        this.hidden_input.add_id(recipient_id);
        if (this.hidden_input.value && this.explanation) {
            this.explanation.hide();
        }
    },
    remove_recipient: function (el) {
        el.style.display = 'none';
        el.related_link.style.display = '';
        var recipient_id = el.id.substring(10);
        this.hidden_input.remove_id(recipient_id);
        if (!this.hidden_input.value && this.explanation) {
            this.explanation.show();
        }
    },
    create_link: function (text) {
        var link = document.createElement('a');        
        var left_span = document.createElement('span');
        left_span.className = "left_span";
        var right_span = document.createElement('span');
        right_span.className = "right_span";
        link.appendChild(left_span);
        left_span.appendChild(right_span);
        right_span.appendChild(document.createTextNode(text));
        link.href = 'javascript:void(0);';
        return link;
    },
    process_friends_list: function () {
        // generate list of friends, change inputs with labels into links
        for (var i=0; i<this.friends_labels.length; i++) {
            
            // extract ids from checkboxes, usernames from labels
            var label = this.friends_labels[i];
            var input = label.getElementsByTagName('input')[0];
            var user_id = input.value;
            var label_name = label.lastChild.data;

            // create link
            var link = this.create_link(label_name);

            // friends links
            var friend_link = link.cloneNode(true);
            friend_link.id = 'friend_' + user_id;
            friend_link.title = 'Empfänger hinzufügen.';
            this.friends_div.appendChild(friend_link);

            // recipients links
            var recipient_link = link.cloneNode(true);
            recipient_link.id = 'recipient_' + user_id;
            recipient_link.style.display = 'none';
            recipient_link.title = 'Empfänger entfernen.';
            this.recipients_div.appendChild(recipient_link);

            // link friend-links to equivalent recipient-links
            recipient_link.related_link = friend_link;
            friend_link.related_link = recipient_link;

            // attatch eventhandler
            var that = this
            friend_link.onclick = function () {
                that.add_recipient(this);
                return false;
            }
            recipient_link.onclick = function () {
                that.remove_recipient(this);
                return false;
            }
        }
    },
    remove_labels: function () {
        for (var i=(this.friends_labels.length-1); i>=0; i--) {
            this.friends_div.removeChild(this.friends_labels[i]);
        }
    },
    select_by_id: function (ids) {
        for (var i=0; i<ids.length; i++) {
            var current_link = document.getElementById('friend_'+ids[i]);
            current_link.onclick();
        }
    }
};



var MESSAGE = {
    // relpath: = $REL2ROOTWEB
    // show_link: if specified append answer-link to message-text
    // tr_func: function that generates the tr to be inserted (inbox, outbox and trash have different table-layout)
    // update_icon: specifies if "read"-icon needs to updated (only inbox)
    init: function (relpath, sid, show_link, tr_func, update_icon) {
        this.relpath = relpath;
        this.sid = sid;
        this.show_link = show_link;
        this.update_icon = update_icon;
        this.tbody = document.getElementsByTagName('tbody')[0];
        this.trs = document.getElementsByTagName('tr');
        this.cur_open = null;
        //this.message_tr = tr_func();
    },
    /*
    create_tr_inbox: function () {
        var tr = document.createElement('tr');
        var td = document.createElement('td');
        tr.appendChild(td.cloneNode(true));
        tr.appendChild(td.cloneNode(true));
        tr.appendChild(td.cloneNode(true));
        tr.message_td = td.cloneNode(true);
        tr.message_td.colSpan = 2;
        tr.appendChild(tr.message_td);
        tr.appendChild(td.cloneNode(true));
        return tr;
    },
    create_tr_outbox: function () {
        var tr = document.createElement('tr');
        var td = document.createElement('td');
        tr.appendChild(td.cloneNode(true));
        //tr.appendChild(td.cloneNode(true));
        tr.message_td = td.cloneNode(true);
        tr.message_td.colSpan = 2;
        tr.appendChild(tr.message_td);
        tr.appendChild(td.cloneNode(true));
        return tr;
    },
    create_tr_trash: function () {
        var tr = document.createElement('tr');
        var td = document.createElement('td');
        tr.appendChild(td.cloneNode(true));
        tr.appendChild(td.cloneNode(true));
        tr.appendChild(td.cloneNode(true));
        tr.message_td = td.cloneNode(true);
        tr.message_td.colSpan = 2;
        tr.appendChild(tr.message_td);
        tr.appendChild(td.cloneNode(true));
        return tr;
    },
    */
    update_styles_show: function (id) {
        // icon
        var current_tr = $('tr_'+id)
        if (this.update_icon && current_tr) {
            var icon = current_tr.getElementsByTagName('img')[0];
            icon.src = this.relpath + 'nachrichten/img/read.gif';
        }
        // subject
        if(current_tr)
        	current_tr.removeClassName('unread');
        	
        // recalculate total unread mesages
        var total_unread = $$('.messages tr.unread');
        $('total-unread').innerHTML = total_unread.length==0?'':'&nbsp;('+total_unread.length+')';
    },
    toggle_message: function (id, elm) {
        var is_open = $('div_'+id);
        if (is_open) {
            this.cur_open = null;
            var div = $('div_'+id);
            $('td_'+id).removeChild(div);
        } else {
        	if(this.cur_open) {
        		var div = $('div_'+this.cur_open);
        		$('td_'+this.cur_open).removeChild(div);
        	}
        	this.cur_open = id;
            MESSAGE.get_message(id, null);
            if($('inbox'))
            	MESSAGE.update_styles_show(id);
        }
    },
    get_message: function (id, current_tr) {
        new Ajax.Request(this.relpath+'nachrichten/ajax/nachricht.php', {
            method: 'get',
            onSuccess: function(transport) {
               	var div = document.createElement("div");
                div.id = 'div_'+id;
                div.innerHTML = transport.responseText;
                $('td_'+id).appendChild(div);
            },
            parameters: {id: id, sid: this.sid, show_link: this.show_link}
        });
    }
};
