function participantsForm() {
$(function() {
    var participantCountField = $("input[name='participant_count']");

    function participantCount(cnt) {
	var ret =  participantCountField.attr('value');
	if (cnt) {
	    participantCountField.attr('value', cnt);
	}
	return parseInt(ret);
    }

    function participantRow(y) {
	return $('#participant_row_'+y);
    }

    function elementToParticipantNr(elt) {
	var rid = $(elt).parents('tr').attr('id');
	var parts = rid.split('_');
	return parts[parts.length-1];
    }


    function moreParticipants() {
	var cnt = participantCount();
	var row = participantRow(cnt);
	if (row.length > 0) {
	    cnt++;
	    participantCount(cnt);
	    row.fadeIn();
	}
	return false;
    }

    function lessParticipants() {
	var cnt = participantCount();
	if (cnt > 3) {
	    var p = cnt-1;
	    var row = participantRow(p);
	    row.find('input').attr('value', '');
	    for (var i = 0; i < cnt; i++) {
		setBlocked(p, i, false);
		setBlocked(i, p, false);
		getParticipantBlockAvatar(p, i).remove();
		getParticipantBlockAvatar(i, p).remove();
	    }
	    row.hide();
	    participantCount(cnt-1);
	}
	return false;
    }


    function setBlocked(participant, blockCandidate, block) {
	var cb = getBlockCheckbox(participant, blockCandidate);
	if (block) {
	    cb.attr('checked', 'checked');
	}
	else {
	    cb.attr('checked', '');
	}
    }

    function isBlocked(participant, blockCandidate) {
	if (participant == blockCandidate) {
	    return true;
	}
	return getBlockCheckbox(participant, blockCandidate).attr('checked');
    }
    
    function getBlockCheckbox(participant, blockedParticipant) {
	return $("#id_participant_block_"+participant
		 +'_'+blockedParticipant);    
    }

    function getParticipantBlockAvatar(participant, blockedParticipant) {
	return $('#participant_block_avatar_'+participant
		 +'_'+blockedParticipant)    
    }
    
    function removeBlock(participant, blockedParticipant) {
	if (isBlocked(participant, blockedParticipant)) {
	    setBlocked(participant, blockedParticipant, false);
	    getParticipantBlockAvatar(participant, blockedParticipant)
		.fadeOut(function () {
			$(this).remove();
		    });
	}
    } 

    function addBlock(participant, blockedParticipant, isInit) {
	if (participant == blockedParticipant) {
	    alert(strExcludeSelf);
	    return;
	}
	if (!isInit && isBlocked(participant, blockedParticipant)) {
	    alert(strAlreadyExcluded);
	    return;
	}
	setBlocked(participant, blockedParticipant, true);
	var dropTarget = $("#participant_row_"+participant+" .participant_blocks");
	var blockedImg = $("#participant_row_"+blockedParticipant+" .participant_avatar_drag");
	var blockedHtml = '<img id="participant_block_avatar_'
	    +participant+'_'+blockedParticipant
	    +'" class="participant_block_avatar" src="'
	    +blockedImg.attr('src') + '"/>';
	var elt = $(blockedHtml).appendTo(dropTarget).click(function(){
		removeBlock(participant, blockedParticipant);
	    });
	if (!isInit) {
	    elt.hide().fadeIn('slow');
	}
    }


    function init() {
	$('#participants_more').click(moreParticipants);
	$('#participants_less').click(lessParticipants);
	var cnt = participantCount() + 1;
	$('#participant_table tr:lt('+cnt+')').show();

	$(".participant_avatar_drag").draggable({helper: 'clone'});
	$(".participant_blocks").droppable({
		accept: ".participant_avatar_drag",
		    activeClass: 'exclude_active',
		    hoverClass: 'exclude_hover',
		    drop: function(ev, ui) {
		    var blockedParticipant = elementToParticipantNr(ui.draggable);
		    var participant = elementToParticipantNr(this);
		    addBlock(participant, blockedParticipant, false);
		}
	    });
	for (var p = 0; ; p++) {
	    var empty = true;
	    for (var q = 0; ; q++) {
		if (p != q) {
		    var cb = getBlockCheckbox(p, q);
		    if (cb.length == 1) {
			empty = false;
			if (isBlocked(p, q)) {
			    addBlock(p, q, true);
			}
		    }
		    else {
			break;
		    }
		}
	    }
	    if (empty) {
		break;
	    }
	}
    }

    init();
    });
}
