reset_form = function(form){
    form[0].reset();
    var inputs = form.find("input");
    inputs.attr("disabled", false);
    $(inputs[0]).focus();
}

cancel_merge = function(){
    hide_modal();
    var form = $("form#insert_word_form");
    var inputs = form.find("input");
    inputs.attr("disabled", false);
    $(inputs[0]).focus();
}

add_word_successful = function(data, textStatus){
    var form = $("form#insert_word_form");
    var inputs = form.find("input[type=text]");
    var obj = eval("(" + data + ")");

    if(obj["status"] == "success"){
	var new_row_html = obj["new_row"];
	$("table.list_content>tbody").prepend($(new_row_html));
	reset_form(form);
    } else if (obj["status"] == "invalid"){
	alert("Invalid request"); // this should never happen
    } else if (obj["status"] == "duplicate"){
	reset_form(form); // do nothing silently
    } else if (obj["status"] == "incoherent"){
	var merge_form = $(obj["merge_form"]);
	var cancel_text = obj["cancel_text"];
	
	var cancel_button = $('<input type="button"/>');
	cancel_button.attr("value", cancel_text);
	cancel_button.click(cancel_merge);
	merge_form.find("input[type=submit]").after(cancel_button);
	show_modal(merge_form);
    }

}

add_word_error = function(XMLHttpRequest, textStatus, errorThrown){

}

add_words = function(){
    // Get the words and langs
    var data = new Object;
    var form = $(this);
    form.find("input[type=text]").each(function(){
            var node = $(this);
	    var name = node.attr("name");
	    var value = node.val();
	    data[name] = value;

	    node.attr("disabled", true);
	});
    form.find("input[type=submit]").attr("disabled", true);
    
    // Forge and send the request
    jQuery.ajax({type: "POST",
	    url: "add_word_async/",
	    cache: false,
	    data: data,
	    success: add_word_successful,
            contentType:"application/x-www-form-urlencoded; charset=utf-8",
	    error: add_word_error});
}

// Validate a word field (not an hint field)
validate_input = function(){
    var input = $(this);
    if(jQuery.trim(input.val()) != ""){
	$(input).removeClass("bad_value");
	return true;
    }else{
	$(input).addClass("bad_value");
	return false;
    }
}

// same as validate input without returning anything
validate_input_noreturn = function(){
    validate_input.call(this);
}

send_form = function(){
    var inputs = $(this).find("input[type=text]");

    var valid = true;
    inputs.filter("[id$=-words]").each(function(){
	    var old_valid = valid;
	    if(validate_input.call(this) != true){
		valid=false;
	    }
	    // focus on the first invalid
	    if(valid==false && old_valid == true){
		this.focus();
	    }
	});
    if(valid){
	add_words.call(this);
    }
    return false;
}

// factory to get a keyboard event handler that 
// give the focus to the "next" object when enter is pressed
focus_next_on_enter_factory = function(next){
    return function(e) {
	if(e.which == 13){ // 13 = enter
	    next.focus();
	    return false;
	}
    }
}

jQuery(function($){
    var insert_form = $("form#insert_word_form");
    insert_form.attr("autocomplete", "off");

    var inputs = insert_form.find("ul>li>input[type=text]");
    inputs.attr("autocomplete", "off");
    // Pressing enter give the focus to the next input field
    inputs[0].focus();
    for(var i=0; i<(inputs.length-1); i++){
	var input = $(inputs[i]);
        var next_input = $(inputs[i+1]);
	input.keypress(focus_next_on_enter_factory(next_input));
	word_fields = input.filter("[id$=-words]");
	word_fields.change(validate_input_noreturn);
	word_fields.blur(validate_input_noreturn);
    }
    
    // Remove the bad_value class on non empty input
    inputs.each(function(){
	    this.setAttribute("autocomplete","off");
	});
    
    // Validation and submission
    insert_form.submit(send_form);
    });
