(function($)
{var fixCellIndexes=function(table)
{var rows=table.rows;var len=rows.length;var matrix=[];for(var i=0;i<len;i++)
{var cells=rows[i].cells;var clen=cells.length;for(var j=0;j<clen;j++)
{var c=cells[j];var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1;var firstAvailCol=-1;if(!matrix[i])
{matrix[i]=[];}
var m=matrix[i];while(m[++firstAvailCol]){}
c.realIndex=firstAvailCol;for(var k=i;k<i+rowSpan;k++)
{if(!matrix[k])
{matrix[k]=[];}
var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++)
{matrixrow[l]=1;}}}}};var fixRowIndexes=function(tbl)
{var v=0,i,k,r=(tbl.tHead)?tbl.tHead.rows:0;if(r)
{for(i=0;i<r.length;i++)
{r[i].realRIndex=v++;}}
for(k=0;k<tbl.tBodies.length;k++)
{r=tbl.tBodies[k].rows;if(r)
{for(i=0;i<r.length;i++)
{r[i].realRIndex=v++;}}}
r=(tbl.tFoot)?tbl.tFoot.rows:0;if(r)
{for(i=0;i<r.length;i++)
{r[i].realRIndex=v++;}}};$.fn.tableHover=function(options)
{var settings=$.extend({allowHead:true,allowBody:true,allowFoot:true,headRows:false,bodyRows:true,footRows:false,spanRows:true,headCols:false,bodyCols:true,footCols:false,spanCols:true,ignoreCols:[],headCells:false,bodyCells:true,footCells:false,rowClass:'hover',colClass:'',cellClass:'',clickClass:''},options);return this.each(function()
{var colIndex=[],rowIndex=[],tbl=this,r,rCnt=0,lastClick=[-1,-1];if(!tbl.tBodies||!tbl.tBodies.length)
{return;}
var addToIndex=function(rows,nodeName)
{var c,row,rowI,cI,rI,s;for(rowI=0;rowI<rows.length;rowI++,rCnt++)
{row=rows[rowI];for(cI=0;cI<row.cells.length;cI++)
{c=row.cells[cI];if((nodeName=='TBODY'&&settings.bodyRows)||(nodeName=='TFOOT'&&settings.footRows)||(nodeName=='THEAD'&&settings.headRows))
{s=c.rowSpan;while(--s>=0)
{rowIndex[rCnt+s].push(c);}}
if((nodeName=='TBODY'&&settings.bodyCols)||(nodeName=='THEAD'&&settings.headCols)||(nodeName=='TFOOT'&&settings.footCols))
{s=c.colSpan;while(--s>=0)
{rI=c.realIndex+s;if($.inArray(rI+1,settings.ignoreCols)>-1)
{break;}
if(!colIndex[rI])
{colIndex[rI]=[];}
colIndex[rI].push(c);}}
if((nodeName=='TBODY'&&settings.allowBody)||(nodeName=='THEAD'&&settings.allowHead)||(nodeName=='TFOOT'&&settings.allowFoot))
{c.thover=true;}}}};var over=function(e)
{var p=e.target;while(p!=this&&p.thover!==true)
{p=p.parentNode;}
if(p.thover===true)
{highlight(p,true);}};var out=function(e)
{var p=e.target;while(p!=this&&p.thover!==true)
{p=p.parentNode;}
if(p.thover===true)
{highlight(p,false);}};var click=function(e)
{var t=e.target;while(t&&t!=tbl&&!t.thover)
t=t.parentNode;if(t.thover&&settings.clickClass!='')
{var x=t.realIndex,y=t.parentNode.realRIndex,s='';$('td.'+settings.clickClass+', th.'+settings.clickClass,tbl).removeClass(settings.clickClass);if(x!=lastClick[0]||y!=lastClick[1])
{if(settings.rowClass!='')
{s+=',.'+settings.rowClass;}
if(settings.colClass!='')
{s+=',.'+settings.colClass;}
if(settings.cellClass!='')
{s+=',.'+settings.cellClass;}
if(s!='')
{$('td, th',tbl).filter(s.substring(1)).addClass(settings.clickClass);}
lastClick=[x,y];}
else
{lastClick=[-1,-1];}}};var highlight=function(cell,on)
{if(on)
{$.fn.tableHoverHover=$.fn.addClass;}
else
{$.fn.tableHoverHover=$.fn.removeClass;}
var h=colIndex[cell.realIndex]||[],rH=[],i=0,rI,nn;if(settings.colClass!='')
{while(settings.spanCols&&++i<cell.colSpan&&colIndex[cell.realIndex+i])
{h=h.concat(colIndex[cell.realIndex+i]);}
$(h).tableHoverHover(settings.colClass);}
if(settings.rowClass!='')
{rI=cell.parentNode.realRIndex;if(rowIndex[rI])
{rH=rH.concat(rowIndex[rI]);}
i=0;while(settings.spanRows&&++i<cell.rowSpan)
{if(rowIndex[rI+i])
{rH=rH.concat(rowIndex[rI+i]);}}
$(rH).tableHoverHover(settings.rowClass);}
if(settings.cellClass!='')
{nn=cell.parentNode.parentNode.nodeName.toUpperCase();if((nn=='TBODY'&&settings.bodyCells)||(nn=='THEAD'&&settings.headCells)||(nn=='TFOOT'&&settings.footCells))
{$(cell).tableHoverHover(settings.cellClass);}}};fixCellIndexes(tbl);fixRowIndexes(tbl);for(r=0;r<tbl.rows.length;r++)
{rowIndex[r]=[];}
if(tbl.tHead)
{addToIndex(tbl.tHead.rows,'THEAD');}
for(r=0;r<tbl.tBodies.length;r++)
{addToIndex(tbl.tBodies[r].rows,'TBODY');}
if(tbl.tFoot)
{addToIndex(tbl.tFoot.rows,'TFOOT');}
$(this).bind('mouseover',over).bind('mouseout',out).click(click);});};})(jQuery);
