// $Id: SmartTableFuncs.js,v 1.10 2009/07/01 08:52:02 marcos Exp $
//addEvent(window, "load", sortables_init);

var SORT_COLUMN_INDEX;

function sortables_init() {
    // Find all tables with class sortable and make them sortable
    if (!document.getElementsByTagName) return;
    tbls = document.getElementsByTagName("table");
    for (ti=0;ti<tbls.length;ti++) {
        thisTbl = tbls[ti];
        if (((' '+thisTbl.className+' ').indexOf("sortable") != -1) && (thisTbl.id)) {
            //initTable(thisTbl.id);
            ts_makeSortable(thisTbl);
        }
    }
}

function ts_makeSortable(table) {
    if (table.rows && table.rows.length > 0) {
        var firstRow = table.rows[0];
    }
    if (!firstRow) return;
    
    // We have a first row: assume it's the header, and make its contents clickable links
    for (var i=0;i<firstRow.cells.length;i++) {
        var cell = firstRow.cells[i];
        var txt = ts_getInnerText(cell);
        cell.innerHTML = '<a href="#" class="sortheader" onclick="ts_resortTable(this);return false;">'+txt+'<span class="sortarrow">&nbsp;&nbsp;&nbsp;</span></a>';
    }
}

function ts_getInnerText(el) {
    if (typeof el == "string") return el;
    if (typeof el == "undefined") { return el };
    if (el.innerText) return el.innerText; //Not needed but it is faster
    var str = "";

    var cs = el.childNodes;
    var l = cs.length;
    for (var i = 0; i < l; i++) {
        switch (cs[i].nodeType) {
            case 1: //ELEMENT_NODE
            str += ts_getInnerText(cs[i]);
            break;
            case 3://TEXT_NODE
            str += cs[i].nodeValue;
            break;
        }
    }
    return str;
}

function ts_resortTable(lnk) {
				
    // get the span
    var span;
    for (var ci=0;ci<lnk.childNodes.length;ci++) {
        if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') span = lnk.childNodes[ci];
    }
    var spantext = ts_getInnerText(span);
    var td = lnk.parentNode;
    var column = td.cellIndex;
    var table = getParent(td,'TABLE');
    var sortType = span.getAttribute("sortMethod");

   
    // Work out a type for the column
    if (table.rows.length <= 1) return;
  
    
    // Determina quali tipi sono consentiti
    sortfn = ts_sort_caseinsensitive;
    switch ( sortType ) {
        case "T":
                sortfn = ts_sort_caseinsensitive;
                break;
        case "X":
                return;
                break;
        case "N":
                sortfn = ts_sort_numeric;
                break;
        case "Nt":
                sortfn = ts_sort_numeric_text;
                break;		
        case "Ds":
                sortfn = ts_sort_datetime_short;
                break;
        case "H":
        	sortfn = ts_sort_html;
                break;                
    }

    document.body.style.cursor='wait';
	    
    SORT_COLUMN_INDEX = column;
    var firstRow = new Array();
    var newRows = new Array();
    for (i=0;i<table.rows[0].length;i++) { firstRow[i] = table.rows[0][i]; }
    for (j=1;j<table.rows.length;j++) { newRows[j-1] = table.rows[j]; }

    newRows.sort(sortfn);

    if (span.getAttribute("sortdir") == 'down') {
        ARROW = '&nbsp;&nbsp;&darr;';
        newRows.reverse();
        span.setAttribute('sortdir','up');
    } else {
        ARROW = '&nbsp;&nbsp;&uarr;';
        span.setAttribute('sortdir','down');
    }
    
    // We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
    // don't do sortbottom rows
    for (i=0;i<newRows.length;i++) { 
    	if (!newRows[i].className || (newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) {
    		table.tBodies[0].appendChild(newRows[i]);
    	}
    }
    // do sortbottom rows only
    for (i=0;i<newRows.length;i++) { 
    	if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1))  {
    		table.tBodies[0].appendChild(newRows[i]);
    	}
    }
    
    // Delete any other arrows there may be showing
    var allspans = document.getElementsByTagName("span");
    for (var ci=0;ci<allspans.length;ci++) {
        if (allspans[ci].className == 'sortarrow') {
            if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?
                allspans[ci].innerHTML = '&nbsp;&nbsp;&nbsp;';
            }
        }
    }
 
    // imposta la classe delle righe corretta
    for ( i = 1; i < table.rows.length; i++ ) {
        table.rows[i].className = "ST_TR" + ( i % 2);
    }
 	
    span.innerHTML = ARROW;
    document.body.style.cursor='';
}

function getParent(el, pTagName) {
    if (el == null) return null;
    else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())// Gecko bug, supposed to be uppercase
    return el;
    else
    return getParent(el.parentNode, pTagName);
}

function ts_sort_date(a,b) {
    // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    if (aa.length == 10) {
        dt1 = aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2);
    } else {
        yr = aa.substr(6,2);
        if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
        dt1 = yr+aa.substr(3,2)+aa.substr(0,2);
    }
    if (bb.length == 10) {
        dt2 = bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2);
    } else {
        yr = bb.substr(6,2);
        if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
        dt2 = yr+bb.substr(3,2)+bb.substr(0,2);
    }
    if (dt1==dt2) return 0;
    if (dt1<dt2) return -1;
    return 1;
}

function ts_sort_currency(a,b) { 
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^0-9.]/g,'');
    return parseFloat(aa) - parseFloat(bb);
}

function ts_sort_numeric(a,b) { 
    aa = parseFloat(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
    if (isNaN(aa)) aa = 0;
    bb = parseFloat(ts_getInnerText(b.cells[SORT_COLUMN_INDEX])); 
    if (isNaN(bb)) bb = 0;
    return aa-bb;
}

function ts_sort_numeric_text(a,b) { 
	// una cella di testo che inizia con un valore numerico
	// elimino il testo tranne i numeri
	aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
	bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
	
    aa = parseFloat( bonificaNumero(aa) );
    if (isNaN(aa)) aa = 0;
    bb = parseFloat( bonificaNumero(bb) ); 
    if (isNaN(bb)) bb = 0;
    return aa-bb;
}

function bonificaNumero( s ) {
	var s1 = "";
	var c = "";
	var allowd = "0123456789";
	
	for ( i = 0; i < s.length; i++ ) {
		c = s.substring(i,i+1);
		if ( allowd.indexOf(c) > -1 ) {
			s1 += c;
		}
	}	
	return s1;
}


function ts_sort_datetime_short(a,b) { 
	var dt1 = "";
	var dt2 = "";
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]); 
    
    if ( aa.length == 18 ) {
    	dt1 = aa.substring(4,6)+aa.substring(1,3)+aa.substring(8,17);
    }
    
    if ( bb.length == 18 ) {
    	dt2 = bb.substring(4,6)+bb.substring(1,3)+bb.substring(8,17);
    }

	//logNow( "aa: '" + aa + "' DT1: '" + dt1 + "' DT2: '" + dt2 + "' |" )
    
    if (dt1==dt2) return 0;
    if (dt1<dt2) return -1;
    return 1;
}


function ts_sort_html(a,b) { 
    aa = a.cells[SORT_COLUMN_INDEX].innerHTML;
    bb = b.cells[SORT_COLUMN_INDEX].innerHTML; 
    
    if (aa==bb) return 0;
    if (aa<bb) return -1;
    return 1;
}


function ts_sort_caseinsensitive(a,b) {
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
    if (aa==bb) return 0;
    if (aa<bb) return -1;
    return 1;
}

function ts_sort_default(a,b) {
    aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
    bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
    if (aa==bb) return 0;
    if (aa<bb) return -1;
    return 1;
}


function addEvent(elm, evType, fn, useCapture)
// addEvent and removeEvent
// cross-browser event handling for IE5+,  NS6 and Mozilla
// By Scott Andrew
{
  if (elm.addEventListener){
    elm.addEventListener(evType, fn, useCapture);
    return true;
  } else if (elm.attachEvent){
    var r = elm.attachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
} 


function logNow(s) {

	span = document.getElementById("logger");	
	span.innerHTML = ts_getInnerText(span) + "<br>" + s;
	
}


function csvPopup( tableId ) {
	
	table = document.getElementById( tableId );	
	var generator=window.open('','name','height=400,width=500');
	
	generator.document.write( "<html><head></head><body>");
	for ( i = 0; i < table.rows.length; i++ ) {
		for ( j = 0; j < table.rows[i].cells.length; j++ ) {
			generator.document.write( "\"'" + ts_getInnerText( table.rows[i].cells[j] ) + "\";" );
		}
		generator.document.write( "\"\"<br>");
	}
	generator.document.write( "</body></html>");
	generator.document.close();
}



var checkflag = false;
function checkUncheckSmartTable( stTable ) {
        var table = document.getElementById( stTable );
        for (i = 1; i < table.rows.length; i++) {
            document.getElementById( stTable + "_riga_" + (i-1) ).checked = checkflag;            
        }
        checkflag = !checkflag;            
}    


function vers() {
	alert( "Allarmei" );
}


// =======================================================================
//                     G o o g l e    C h a r t s
// =======================================================================


// ==========================================================
//     Oggetto LabelVal
// ==========================================================


function LabelVal() {

	this.label = "";
	this.val   = 0;

	this.setIntVal = function( v ) {
		if ( v ) {
			v.replace( " ", "" );
			v.replace( "%", "" );
			v.replace( ",", "." );
			this.val = parseInt(v) ;
		}
	}

	this.setHHMMSS = function( v ) {

		var nSec = 0;

		if ( v ) {
			v.replace( " ", "" );

			var p0 = v.indexOf( ":" );
			if ( p0 > -1 ) {
				nSec = nSec * 60 + parseInt( v.substring(0, p0) );
				v    = v.substring( p0+1 );
			}

			var p0 = v.indexOf( ":" );
			if ( p0 > -1 ) {
				nSec = nSec * 60 + parseInt( v.substring(0, p0) );
				v    = v.substring( p0+1 );
			}

			nSec = nSec * 60 + parseInt( v );

			this.val = nSec;

		} else {
			this.val = -1;
		}

	}


	this.setLabel  = function(lbl) {
		
        if ( lbl.length > 13 ) {
            lbl = lbl.substring( 0, 10 ) + "...";
        }

        this.label = lbl;
	}

	this.toString = function() {
		return "LabelVal: " + this.label + " -> " + this.val;
	}

}


// ==================================================
//       C A R I C A M E N T O   P A G I N A
// ==================================================


// $(document).ready(function() {
// 	drawPieChart( "pic0",
//		"400x150", "666699",
//		getData( "x", 1, 2 )
//	);
// } );


function prt( s ) {
	$( "<span>- " + s + "</span><br>" ).appendTo( '#stdout' );
}


// ==================================================
// Crea un set di valori data una SmartTable
// ==================================================


function getData( idTabella, colLbl, colDat ) {

	var arDati = [];
 

    //prt( "Cerco " + idTabella );

	$( "table#" + idTabella +" tr" )
	.slice(1)                // salto il titolo
	.each( function(n) {
        //prt( "Ecchime:" + n);
		var labVal = new LabelVal();
		labVal.setLabel(  $(this).find( "td:nth-child(" + colLbl + ")").text() );
		labVal.setIntVal( $(this).find( "td:nth-child(" + colDat + ")").text() );

	  	arDati.push( labVal )
	}) ;

    return arDati;
}

function getDataTime( idTabella, colLbl, colDat ) {

	var arDati = [];

	$( "table#" + idTabella +" tbody tr" )
	.slice(1)                // salto il titolo
	.each( function(n) {
		var labVal = new LabelVal();
		labVal.setLabel(  $(this).find( "td:nth-child(" + colLbl + ")").html() );

		var vx = $(this).find( "td:nth-child(" + colDat + ")").html();

		labVal.setHHMMSS( vx );

	  	arDati.push( labVal )
	}) ;


	return arDati;
}



function sortAr( arX ) {
	return arX.sort( function(a,b) {return b.val - a.val })
}



// ======================================================
// Prepara una Pie Chart
// ======================================================

function drawPieChart( divId, size, color, arInput ) {

    arInput = ordinaEBonifica( arInput, 15 );

	var arLabel = [];
	var arDati  = [];
	var max     = 0;

	$.map( arInput, function(me) {		
		if ( me.val > 0 ) {
            arLabel.push( escape(me.label) );
            arDati.push(  me.val   );
            if ( me.val > max ) { max = me.val; };
        }
	} );

    // se ho solo una riga, non metto il grafico.
    if ( arLabel.length <= 1 ) {
        return 0;
    }


	// crea il grafico
	var url = "http://chart.apis.google.com/chart"
	        + "?cht=p"  // p o p3
	        + "&chco=" + color	        
	        + "&chd=s:" + simpleEncode( arDati, max )
	        + "&chl=" +   arLabel.join("|");

    var urlBig = url + "&chs=600x400";
    var urlSmall = url + "&chs=400x150";

	prt( url );

	$( '#' + divId ).html( "<a target='_new' href=\"" + urlBig + "\"><img border=0 src=\"" + urlSmall + "\"></a>" );

}

function ordinaEBonifica( arX, MAX_ITEMS ) {

    arDati2 = arX.sort( function(a,b) {return b.val - a.val });

    if ( arDati2.length > MAX_ITEMS ) {
        var arDati3 = [];

        for ( var i = 0; i < MAX_ITEMS; i++  ) {
            arDati3[i] = arDati2[i];
        }

        var lvRes = new LabelVal();
        lvRes.setLabel( "" );

        for ( i = MAX_ITEMS; i < arDati2.length; i++ ) {
            lvRes.val += arDati2[i].val;
        }

        arDati3.push( lvRes );

        return arDati3;

    } else {

        return arDati2;
    }

}


// ======================================================
// Prepara una SLA Chart
// ======================================================

function drawSlaChart( divId, size, color, arInput ) {

    //dumpAr( "Dati per SLA", arInput );

    if ( arInput.length == 0 ) {
        return 0;
    }

	var arLabel = [ "0"];
	var arDati  = [ 0 ];

	$.map( arInput, function(me) {
		arLabel.push( bonificaNumeroVirgola( me.label ) );
		arDati.push(  me.val   );
	} );

    //prt("xxx");

	// crea il grafico
	var url = "http://chart.apis.google.com/chart"
            + "?cht=lc"
            + "&chxt=x,y"
            + "&chco=800000," + color
            + "&chm=B," + color + ",0,0,0"
            + "&chg=100,20"
	        + "&chs=" + size
	        + "&chd=s:" + simpleEncode( arDati, 100 )
	        + "&chl=" + arLabel.join("|");

	prt( url );

	$( '#' + divId ).html( "<img src=\"" + url + "\">" );

}

// ============================================================
// generaGraficoDoppiaSerie - per pagina della distribuzione
// se il grafico fosse molto lungo, ne genera molti
// ============================================================

function drawMultiSeries( divId, size, colFill, colLine, arFill, arLine ) {

	var arImg = [];
	var SIZE = 200;

	for ( var i = 0; i < (arFill.length / SIZE ); i++ ) {
		var min = SIZE * i;
		var max = min + SIZE;

		if ( max > arFill.length ) { max = arFill.length; };

		arImg.push(
			"<img src=\"" +
			drawMultiSeriesUrl( divId, size, colFill, colLine,
			        arFill.slice( min, max),
			        arLine.slice( min, max)
			) + "\">"
		);
	}

	$( '#' + divId ).html( arImg.join( "<br>" ) );
}



function drawMultiSeriesUrl( divId, size, colFill, colLine, arFill, arLine ) {

	var arLabel = [];
	var arDFill = [];
	var maxFill = 0;
	var arDLine = [];
	var maxLine = 0;

	$.map( arFill, function(me) {
		arDFill.push(  me.val   );
		if ( me.val > maxFill ) { maxFill = me.val; };
	} );

	$.map( arLine, function(me) {
		arDLine.push(  me.val   );
		if ( me.val > maxLine ) { maxLine = me.val; };
	} );

	// crea le label partendo dalla Fill
	// se ho fino a 10 punti le metto tutte
	// sopra ne metto 5
	var UNALTERED = 10;
	var ALTERED   = 7;
	if ( arFill.length <= UNALTERED ) {

		$.map( arFill, function(me) { arLabel.push( me.label ) } );

	} else {

		for ( var i = 0; i < (ALTERED-1); i++ ) {
			var nItem = parseInt( arFill.length * ( i / (ALTERED-1)) );
			arLabel.push( arFill[ nItem ].label );
		}
		arLabel.push( arFill[ arFill.length-1 ].label );
	}

	// ottieni i veri massimi
	maxFill = getRealMax( maxFill );
	maxLine = getRealMax( maxLine );

	// crea il grafico

	var url2 = "http://chart.apis.google.com/chart"
	         + "?cht=lxy"
	         + "&chs=" + size
	         + "&chd=s:_," + simpleEncode( arDLine, maxLine) + ",_," + simpleEncode( arDFill, maxFill)
	         + "&chco=" + colLine + "," + colFill
	        + "&chbh=a"               // all
	        + "&chxt=x,y,r"           // axis
            + "&chxl=0:|" + arLabel.join( "|" )
            +      "|1:||" + (maxFill/2) + "|" + maxFill
            +      "|2:||" + (maxLine/2) + "|" + maxLine
	         ;

	prt( url2 );

	return url2;

}

function getRealMax( n ) {
	var MAXES = [ 1000000, 500000, 200000,
	               100000,  50000,  20000,
	                10000,   5000,   2000,
	                 1000,    500,    200,
	                  100,     50,     20 ];

	for ( var r = 1; r < MAXES.length; r++ ) {
		if ( n > MAXES[r] ) {
			return MAXES[r-1];
		}
	}

	return 10;
}


function bonificaNumeroVirgola( s ) {
	var s1 = "";
	var c = "";
	var allowd = "0123456789.";

    s.replace( ",", "." );

	for ( i = 0; i < s.length; i++ ) {
		c = s.substring(i,i+1);
		if ( allowd.indexOf(c) > -1 ) {
			s1 += c;
		}
	}
	return parseInt(s1);
}



// encoding dei valori, con rescaling 

var simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

function simpleEncode(valueArray,maxValue) {
  //var chartData = ['s:'];
  var chartData = [];
  for (var i = 0; i < valueArray.length; i++) {
    var currentValue = valueArray[i];
    if (!isNaN(currentValue) && currentValue >= 0) {
    chartData.push(simpleEncoding.charAt(Math.round((simpleEncoding.length-1) * currentValue / maxValue)));
    }
      else {
      chartData.push('_');
      }
  }
  return chartData.join('');
}


// ==================================================
//             U T I L I T A '
// ==================================================

function dumpAr( hdr, arX ) {
	prt( "<b>" + hdr + "</b>" + " - N. Items: " + arX.length  );
	$.map( arX, function(me) { prt( me.toString() ) } );
}


// ===================================================
// OGGETTO SEARCHCOMBOS
// USO:
// $(document).ready(function() {
//    new SearchCombos().setup( "CODA_F_agenteFiltro", "idTextBox" );
// }
// ===================================================

function SearchCombos() {

	var idCombo = "";
	var idTextBox = "";

	this.setup = function( myIdCombo, myIdTesto ) {
		idCombo   = myIdCombo;
		idTextBox = myIdTesto;

		var searchDB = setupCampiRicerca();
		$( "#" + idTextBox ).change( function() { changeTextBox( searchDB ) } );
        
	}

	// Cambiato il TextBox

	function changeTextBox( searchDb ) {
		//print( "TB changed: " + idTextBox  + " - DB size: " + searchDb.length );
                
		var text = $( "#" + idTextBox )[0].value.toLowerCase() ;

		if ( text.length== 0 ) {

			buildCombo( searchDb, -1 );

		} else {

			var arFiltered = [];
			for ( var i = 0; i < searchDb.length; i++ ) {
				var line = searchDb[i];

				if ( (line[0].toLowerCase().indexOf( text ) > -1) ||
				     (line[1].toLowerCase().indexOf( text ) > -1) )  {
					arFiltered[ arFiltered.length ] = line;
				}
			}
			buildCombo( arFiltered, 0 );
		}

	}

	// Preparo l'array di [k, v] per ricostruire la combo

	function setupCampiRicerca() {

		var searchCombos = [];
		var options = $( "#" + idCombo ).html();


		var arRighe = options.split( /<\/option>/i );

		for ( var i = 0; i < arRighe.length; i++ ) {

			if ( arRighe[i].match( /<option value="(.*?)".*?>(.+)/i ) ) {
				var k = RegExp.$1 ;
				var v = RegExp.$2 ;

				if ( k.length > 0 ) {
					searchCombos[ searchCombos.length ] = [ k, v ];
				}

			} else // per quel cornuto di IE7, che non mette le virgolette per parole singole
			if ( arRighe[i].match( /<option value=(.*)\s*.*?>(.+)/i ) ) {

				var k = RegExp.$1 ;
				var v = RegExp.$2 ;

				if ( k.length > 0 ) {
					searchCombos[ searchCombos.length ] = [ k, v ];
				}

			}

		}

		return searchCombos;
	}


	function buildCombo( arDati, itemSelected ) {
		var h = "<option value=''>-</option>";

		for ( var i = 0; i < arDati.length; i++ ) {
			h += "<option value=\"" + arDati[i][0] + "\""
			   + ( i == itemSelected ? " SELECTED " : "" ) + ">"
			   + arDati[i][1] + "</option>\n";
		}

		//printQuote( h );

		$( "#" + idCombo ).html( h );

	}
}






// $Log: SmartTableFuncs.js,v $
// Revision 1.10  2009/07/01 08:52:02  marcos
// #745: escaping # characters in URLs
//
// Revision 1.9  2009/04/27 10:42:19  lenz-mobile
// Bug #682 - prefiltraggio agenti
//
// Revision 1.8  2009/03/02 16:42:56  lenz
// Grafici per distr chiamate.
//
// Revision 1.7  2009/02/27 16:02:00  lenz
// Aggiunstato render dinamico
//
// Revision 1.6  2009/02/27 12:04:31  lenz-mobile
// Immagini Google via jQuery
//
// Revision 1.5  2007/05/18 11:04:54  lenz-mobile
// Bug #131: Sort di un campo in HTML
//
// Revision 1.4  2007/01/20 11:42:37  lenz
// Bottone Check All nel wizard.
// Bugzilla #14
//
// Revision 1.3  2006/07/06 22:31:48  lenz
// Le frecce per il sort erano al contrario (capita)
//
// Revision 1.2  2006/05/08 17:20:19  lenz
// no message
//
// Revision 1.1.2.2  2006/01/25 16:08:31  lenz
// Chiamate OK, KO ed agenti sortabili ed esportabili CSV
//
//
//
