(function($){	
    $.fn.truncate = function(options) {
    
        var defaults = {
        highlightCols: 	true, // if set to true then mouseover a table cell will highlight entire column (except sibling headings)
        highlightRows: 	true, // if set to true then mouseover a table cell will highlight entire row	(except sibling headings)
		selectable: 	true, // if set to true then click on a table sell will select row or column based on config
        showHigh: 		false,
        showLow: 		false,
        showAvg: 		false
    };
    
    var options = $.extend(defaults, options);
	var tableover = false;
        
    return this.each(function() {
        rows(this);
    });
  
	function rows (table){
		var css = "";
		var tr = table.getElementsByTagName("tr");
		var high = 0;
		var low = 1000000;
		var avg = 0;
		
		for (var row=0;row<tr.length;row++){
		    var parent = tr[row].parentNode;
			css = (css == "odd") ? "even" : "odd";
			tr[row].className = css;
			
		    var newTR = document.createElement("tr");
			newTR.className = css;
			
			var arr = new Array();
			for(var col=0;col<tr[row].childNodes.length;col++){				
				if(tr[row].childNodes[col].nodeType == 1) arr.push(tr[row].childNodes[col]);
			};	
	
			for (var col=0;col<arr.length;col++){				
				if(arr[col].innerHTML == "&nbsp;" || arr[col].innerHTML == "") arr[col].className += " empty";				
				arr[col].css = arr[col].className;	

				if(	col > 0 && parseInt(arr[col].innerHTML) > high ) high = arr[col].innerHTML; 	
				if(	col > 0 && parseInt(arr[col].innerHTML) < low ) low = arr[col].innerHTML; 	
				if(	col > 0 ) avg = avg + parseFloat(arr[col].innerHTML);
				
			};

			for (var col=0;col<arr.length;col++){	
			    if(col > 0){			
					if(	arr[col].innerHTML == high && options.showHigh ) arr[col].innerHTML = "<span class='high'>" + arr[col].innerHTML + "</span>"; 
					if(	arr[col].innerHTML == low && options.showLow ) arr[col].innerHTML = "<span class='low'>" + arr[col].innerHTML + "</span>"; 
					if(	col==1 && row > 0 && options.showAvg ) arr[col].innerHTML = arr[col].innerHTML + "<br/>Avg(" + (avg/parseInt(arr.length - 1)).toFixed(2) + ")"; 
				}
				
				if((row == 0 || col == 0) && (row != 0 || col != 0))
				{
				    var newTH = document.createElement("th");
					newTH.row = row;
					newTH.col = col;
                    newTH.innerHTML = arr[col].innerHTML;
                    newTH.className = arr[col].className;	
                    newTH.css = arr[col].css;
					newTH.onmouseover = function(){ over(table,this,this.row,this.col); };
					newTH.onmouseout = function(){ out(table,this,this.row,this.col); };
					newTH.onmousedown = function(){ down(table,this,this.row,this.col); };
					newTH.onmouseup = function(){ up(table,this,this.row,this.col); };				
					newTH.onclick = function(){ click(table,this,this.row,this.col); };
                    newTR.appendChild(newTH);
                }else{
				    var newTD = document.createElement("td");
					newTD.row = row;
					newTD.col = col;
                    newTD.innerHTML = arr[col].innerHTML;
                    newTD.className = arr[col].className;
                    newTD.css = arr[col].css;
					newTD.onmouseover = function(){ over(table,this,this.row,this.col); };
					newTD.onmouseout = function(){ out(table,this,this.row,this.col); };
					newTD.onmousedown = function(){ down(table,this,this.row,this.col); };
					newTD.onmouseup = function(){ up(table,this,this.row,this.col); };				
					newTD.onclick = function(){ click(table,this,this.row,this.col); };
                    newTR.appendChild(newTD);
                } 	
				parent.replaceChild(newTR,tr[row]);
			};
			
			high = 0;
			low = 1000000;
			avg = 0;
		};
	};
	
	// appyling mouseover state for objects (th or td)
	function over(table,obj,row,col){
		if (!options.highlightCols && !options.highlightRows) obj.className = obj.css + " over";  
		if(check1(obj,col)){
			if(options.highlightCols) highlightCol(table,obj,col);
			if(options.highlightRows) highlightRow(table,obj,row);		
		};
	};
	// appyling mouseout state for objects (th or td)	
	function out(table,obj,row,col){
		if (!options.highlightCols && !options.highlightRows) obj.className = obj.css; 
		unhighlightCol(table,col);
		unhighlightRow(table,row);
	};
	// appyling mousedown state for objects (th or td)	
	function down(table,obj,row,col){
		obj.className = obj.css + " down";  
	};
	// appyling mouseup state for objects (th or td)	
	function up(table,obj,row,col){
		obj.className = obj.css + " over";  
	};	
	// onclick event for objects (th or td)	
	 function click(table,obj,row,col){
		if(check1){
			if(options.selectable) {
				unselect(table);	
				if(options.highlightCols) highlightCol(table,obj,col,true);
				if(options.highlightRows) highlightRow(table,obj,row,true);
				document.onclick = unselectAll;
			}
		};
		clickAction(obj); 		
	};		
	
	function highlightCol(table,active,col,sel){
		var css = (typeof(sel) != "undefined") ? "selected" : "over";
		var tr = table.getElementsByTagName("tr");
		for (var i=0;i<tr.length;i++){	
			var arr = new Array();
			for(j=0;j<tr[i].childNodes.length;j++){				
				if(tr[i].childNodes[j].nodeType == 1) arr.push(tr[i].childNodes[j]);
			};							
			var obj = arr[col];
			if (check2(active,obj) && check3(obj)) obj.className = obj.css + " " + css; 		
		};
	};
	function unhighlightCol(table,col){
		var tr = table.getElementsByTagName("tr");
		for (var i=0;i<tr.length;i++){
			var arr = new Array();
			for(j=0;j<tr[i].childNodes.length;j++){				
				if(tr[i].childNodes[j].nodeType == 1) arr.push(tr[i].childNodes[j])
			};				
			var obj = arr[col];
			if(check3(obj)) obj.className = obj.css; 
		};
	};	
	function highlightRow(table,active,row,sel){
		var css = (typeof(sel) != "undefined") ? "selected" : "over";
		var tr = table.getElementsByTagName("tr")[row];		
		for (var i=0;i<tr.childNodes.length;i++){		
			var obj = tr.childNodes[i];
			if (check2(active,obj) && check3(obj)) obj.className = obj.css + " " + css; 		
		};
	};
	function unhighlightRow(table,row){
		var tr = table.getElementsByTagName("tr")[row];		
		for (var i=0;i<tr.childNodes.length;i++){
			var obj = tr.childNodes[i];			
			if(check3(obj)) obj.className = obj.css; 			
		};
	};
	function unselect(table){
		var tr = table.getElementsByTagName("tr");	
		for (var i=0;i<tr.length;i++){
			for (var j=0;j<tr[i].childNodes.length;j++){
				var obj = tr[i].childNodes[j];	
				if(obj.className) obj.className = obj.className.replace("selected","");
			};
		};
	};
	function unselectAll(){
		if(!tableover){
			/*tables = document.getElementsByTagName("table");
			for (var i=0;i<tables.length;i++){
				unselect(tables[i])
			};*/		
			//this is not working
			tr = document.getElementById("tr");
			//unselect(tr)
		};
	};	
	function check1(obj,col){
		return (!(col == 0 && obj.className.indexOf("empty") != -1));
	}
	function check2(active,obj){
		return (!(active.tagName == "TH" && obj.tagName == "TH")); 
	};
	function check3(obj){
		return (obj.className) ? (obj.className.indexOf("selected") == -1) : true; 
	};	
	function clickAction(obj){
		//alert(obj.innerHTML);
		
	};
 };
})(jQuery);
