
function SelectionTable(table_head_id, table_body_id, value_field_id, selected_counter_id, select_for_delete) {
	this.table_head = $("#"+table_head_id);
	this.table_body = $("#"+table_body_id);
	this.value_field = $("#"+value_field_id);
	this.selected_counter = $("#"+selected_counter_id);
	this.listdiffs = $('#'+value_field_id+"_initial").exists();
    this.select_for_delete = select_for_delete;
	if (this.listdiffs) {
		this.original = sort_numeric_array(field_to_array($('#'+value_field_id+"_initial")));
		this.added = $('#'+value_field_id+"_added");
		this.removed = $('#'+value_field_id+"_removed");
	}
}

function select_toggle_all(selection_table) {
	var selection = field_to_array(selection_table.value_field);
	var all_selected = check_all_selected(selection_table);
	selection_table.table_body.find("tr[select_id]").each(function () {
		if (all_selected) {
			do_unselect(selection_table, $(this));
		} else {
			do_select(selection_table, $(this));
		}
	});
	toggle_all_selected_checkbox(selection_table);
	return all_selected;
}

function select_toggle(selection_table, row) {
	var selection_array = field_to_array(selection_table.value_field);
	var id = row.attr('select_id');
	var idx = binarySearch(selection_array,id);
	var found = idx >= 0;
	if (found) {
		selection_array.splice(idx,1);
	} else {
		selection_array.push(id);
	}
	save_diff_selection(selection_table,id,!found);
	array_to_field(selection_table.value_field,selection_array, selection_table);
	check_uncheck_checkbox(selection_table, row, !found);
	return !found;
}

function save_diff_selection(selection_table,id,selected) {
	if (selection_table.listdiffs) {
		idx = binarySearch(selection_table.original,id);
		var found = idx >= 0;
		if (found && selected) {
			var tmp_a = field_to_array(selection_table.removed);
			idx = binarySearch(tmp_a,id);
			if (idx >= 0) {
				tmp_a.splice(idx,1);
				array_to_field(selection_table.removed,tmp_a);
			}
		}
		if (found && !selected) {
			var tmp_a = field_to_array(selection_table.removed);
			tmp_a.push(id);
			array_to_field(selection_table.removed,tmp_a);
		}
		if (!found && !selected) {
			var tmp_a = field_to_array(selection_table.added);
			idx = binarySearch(tmp_a,id);
			if (idx >= 0) {
				tmp_a.splice(idx,1);
				array_to_field(selection_table.added,tmp_a);
			}
		}
		if (!found && selected) {
			var tmp_a = field_to_array(selection_table.added);
			tmp_a.push(id);
			array_to_field(selection_table.added,tmp_a);
		}
	}
}

function do_select(selection_table, row) {
	var selection_array = field_to_array(selection_table.value_field);
	var id = row.attr('select_id');
	var idx = binarySearch(selection_array,id);
	if (idx < 0) {
		selection_array.push(id);
		array_to_field(selection_table.value_field, selection_array, selection_table);
		save_diff_selection(selection_table,id,true);
	}
	check_uncheck_checkbox(selection_table, row, true);
}

function do_unselect(selection_table, row) {
	var selection_array = field_to_array(selection_table.value_field);
	var id = row.attr('select_id');
	var idx = binarySearch(selection_array,id);
	if (idx >= 0) {
		selection_array.splice(idx,1);
		array_to_field(selection_table.value_field,selection_array, selection_table);
		save_diff_selection(selection_table,id,false);
	}
	check_uncheck_checkbox(selection_table, row, false);
}

function check_all_selected(selection_table) {
	var all_selected = true;
	selection_table.table_body.find("tr[select_id]").each(function () {
		if ($(this).attr('selected') != '1') {
			all_selected = false;
			return;
		}
	});
	return all_selected;
}

function check_uncheck_checkbox(selection_table, row, check) {
	var img = row.find("img[name='checkbox']");
	if (check) {
        if (selection_table.select_for_delete)
            row.addClass('canc_riga_contatti_selezionata');
        else
            row.addClass('riga_contatti_selezionata');
		img.attr('src',img.attr('src_c'));
		row.attr('selected','1');
	} else {
		row.removeClass('riga_contatti_selezionata');
		row.removeClass('canc_riga_contatti_selezionata');
		img.attr('src',img.attr('src_u'));
		row.attr('selected','0');
	}
	toggle_all_selected_checkbox(selection_table);
}

function toggle_all_selected_checkbox(selection_table) {
	var all_img = selection_table.table_head.find("img[name='checkbox_all']");
	if (check_all_selected(selection_table)) {
		all_img.attr('src',all_img.attr('src_c'));
	} else {
		all_img.attr('src',all_img.attr('src_u'));
	}
}

function init_selection(selection_table) {
	var selection = field_to_array(selection_table.value_field);
	selection_table.table_body.find("tr[select_id]").each(function () {
		var idx = binarySearch(selection,parseInt($(this).attr('select_id')));
		check_uncheck_checkbox(selection_table, $(this), idx != -1);
	});
//var tt = new Date().getTime();
//alert(new Date().getTime()-tt);
	array_to_field(selection_table.value_field,selection,selection_table);
}

function field_to_array(value_field) {
	return string_to_array(value_field.val());
}
function string_to_array(a_string) {
	var an_array = a_string.split(",");
	var int_array = new Array();
	var j=0;
	for (var i=0;i<an_array.length;i++) {
		if (an_array[i] == '')
			continue;
		int_array[j] = parseInt(an_array[i]);
		j++;
	}
	return int_array;
}

function array_to_field(value_field,an_array,selection_table) {
	if (an_array.length == 0) {
		value_field.val('');
		if (selection_table && selection_table.selected_counter)
			selection_table.selected_counter.text(0);
		return;
	}
	sort_numeric_array(an_array);
	var first_added = false;
	var joined = '';
	var selected_counter = 0;
	for (i=0;i<an_array.length;i++) {
		if (!an_array[i])
			continue;
		selected_counter ++;
		if (first_added) {
			joined += ","+an_array[i];
		} else {
			joined = an_array[i];
			first_added = true;
		}
	}
	if (selection_table && selection_table.selected_counter)
		selection_table.selected_counter.text(selected_counter);
	value_field.val(joined);
}

function sort_numeric_array(an_array) {
	an_array.sort(function(a, b){
		return (a - b);
	});
	return an_array;
}

