/**
 * addEventListener Crossbrowser
 *
 * @param Object element
 * @param String Type
 * @param Function expression
 * @param Bool bubbling
 * @return Bool
 */
function addListener(element, type, expression, bubbling){

	bubbling = bubbling || false;
	
	if(window.addEventListener) { // Standard
		element.addEventListener(type, expression, bubbling);
		return true;
		
	} else if(window.attachEvent) { // IE
		element.attachEvent('on' + type, expression);
		return true;
		
	} else
		return false;
		
}



/**
 * Recupera tutti gli oggetti con quella classe
 *
 * @param String classname
 * @param Object node
 * @return Array
 */
function getElementsByClassName(classname, node) {
	if(!node) node = document.getElementsByTagName("body")[0];
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
	var els = node.getElementsByTagName("*");
	for(var i=0,j=els.length; i<j; i++)
		if(re.test(els[i].className))a.push(els[i]);
	return a;
}



/**
 * Funzione agganciata all'onclick del checkbox nel tHead
 */
function checkAll(index){
	for(var i=1; i<checkColumns[index].length; i++)
		checkColumns[index][i].checked = checkColumns[index][0].checked;
}



/**
 * Funzione agganciata all'onclick del checkbox nel tBody
 */
function checkSingle(index){
	checkColumns[index][0].checked = false;
}



/**
 * Inizializza i checkbox delle tabelle con la classe check_column
 * La tabella in questione deve avere un tHead per con il checkbox pilota
 */
var checkColumns = new Array();
function initCheckColumn(){
	
	// Recupero le tabelle con la colonna dei check
	var checkColumnTable = getElementsByClassName('check_column');
	for(var i=0; i<checkColumnTable.length; i++){
		
		var index = checkColumns.length;
		checkColumns[index] = new Array();
		var check = null;
		
		// Recupero il check dell'header
		if(checkColumnTable[i].tHead.rows[0] && checkColumnTable[i].tHead.rows[0].cells[0]){
			check = checkColumnTable[i].tHead.rows[0].cells[0].getElementsByTagName('input')[0];
			if(!check || check.type.toLowerCase() != 'checkbox')
				return void(0);
			checkColumns[index][0] = check;
			addListener(check, 'click', function(){ checkAll(index) });
		}else
			return void(0);
		
		// Recupero gli altri checkbox
		for(var k=0; k<checkColumnTable[i].tBodies.length; k++)
			for(var j=0; j<checkColumnTable[i].tBodies[k].rows.length; j++){
				if(!checkColumnTable[i].tBodies[k].rows[j].cells[0])
					continue;
				
				check = checkColumnTable[i].tBodies[0].rows[j].cells[0].getElementsByTagName('input')[0];
				if(!check || check.type.toLowerCase() != 'checkbox')
					continue;
				
				checkColumns[index][checkColumns[index].length] = check;
				addListener(check, 'click', function(){ checkSingle(index) });
			}
		
	}
	
}



/**
 * Funzione di appoggio per i check dentro la checkColumn
 * @param String action			E' il trancio di query string per identificare un'azione (es: action=delete)
 * @param String target			URL della destinazione dell'action
 * @param String index			E' l'indice della tabella (in ordine "di apparizione", inizia da 0)
 */
function checkColumnAction(action, target, index){
	
	if(index == undefined) index = 0;
	if(target == undefined) target = window.location.href;
	
	if(target.indexOf('?') != -1)
		target = target.substr(0, target.indexOf('?'));
	
	if(!checkColumns[index]) return void(0);
	
	var values = new Array();
	
	for(var i=1; i<checkColumns[index].length; i++)
		if(checkColumns[index][i].checked)
			values[values.length] = checkColumns[index][i].name+'[]='+checkColumns[index][i].value;
	
	if(!values.length)
		return void(0);
	
	window.location.href = target+'?'+action+'&'+values.join('&');
}



/**
 * Evidenzia le linee delle tabelle con la classe roller al passaggio del mouse
 */
function animRoller(){
	
	var tables = getElementsByClassName('roller');
	for(var i=0; i<tables.length; i++)
		if(tables[i].nodeName.toLowerCase() == 'table')
			for(j=0; j<tables[i].tBodies.length; j++)
				for(k=0; k<tables[i].tBodies[j].rows.length; k++){
					tables[i].tBodies[j].rows[k].onmouseover = new Function( 'this.style.backgroundColor = \'#eaf8ff\'' );
					tables[i].tBodies[j].rows[k].onmouseout = new Function( 'this.style.backgroundColor = \'transparent\'' );
				}
}



/**
 * Setta il focus al primo campo input con la classe autofocus
 */
function  autoFocus(){
	// Imposto l'autofocus
	var autofocusField = getElementsByClassName('autofocus');
	
	if(autofocusField.length > 0)
		for(var i=0; i<autofocusField.length; i++)
			if(autofocusField[i].nodeName.toLowerCase() == 'input'){
				autofocusField[i].focus();
				break;
			}
}



/**
 * Funzione di inizializzazione della pagina
 */
function init(){
	initCheckColumn();
	animRoller();
	autoFocus();
}

// Avvio le procedure
addListener(window, 'load', init);

// Carico il Famspam
jQuery(document).ready(function($) {
  $('a[rel*=facebox]').facebox()
}) 
