function FlexiGrid(){var D=this;var E=0;var B=[];var A;var C;var H=false;var F="";var G;this.dom_cache=[];this.meanValue=0;this.minimumValue=0;this.maximumValue=0;this.rowMeans=[];this.columnMeans=[];this.standardDeviation=0;this.selectedCells=[];this.onCellUpdate="";this.unique_id=random_id();this.is_rendered=false;O_APP.Flexigrids[this.unique_id]=this;this.columnNames=[];this.rowNames=[];this.minColWidth=100;this.shrinkRowLabels=false;this.showMeanValues=false;this.div_id="";this.values=[];this.colorQuantiles=false;this.dataset="";this.chart_type="";this.title="";this.print_footer_text="";this.reverseQuantileColors=false;this.selectAllFocusObject=undefined;this.attach_events=function(){try{var M=getElementsBySelector("#"+D.div_id+" td.fg_header");for(var K=0;K<M.length;K++){var I=M[K];if(I.id!="fg_row_header_top"){Event.observe(I,"mousedown",D.mDown_label,false);Event.observe(I,"mouseup",D.mUp_label,false);Event.observe(I,"mouseover",D.mOver_label,false);}else{var J="<img src='themes/images/pointer.png' title='"+localize("^select_all_description;")+"'/>&nbsp;<img src='themes/images/chart.png' title='"+localize("^show_chart_tooltip;")+"'/>";I.innerHTML=J;Event.observe(I.firstChild,"click",D._selectAll,false);Event.observe(I.lastChild,"click",D._toggle_chart_popup,false);}}var M=getElementsBySelector("#"+D.div_id+" td.fg_cell");for(var K=0;K<M.length;K++){var I=M[K];if(I.id!="fg_row_header_top"){Event.observe(I,"mousedown",D.mDown,false);Event.observe(I,"mouseup",D.mUp,false);Event.observe(I,"mouseover",D.mOver,false);Event.observe(I,"dblclick",D.editCell,false);}else{Event.observe(I,"click",D._selectAll,false);}}}catch(L){alert(L.message);}};this.id_to_rc=function(M){var K=M.split("|");var J=K[1];var I=J.substring(0,2);var L=J.substring(2,4);return[L,I];};this.id_to_short_id=function(J){var I=J.split("|");return I[1];};this.get_obj=function(J){var I="";if(D.dom_cache[J]){I=D.dom_cache[J];}else{I=document.getElementById(J);D.dom_cache[J]=I;}return I;};this.updateSelected=function(){if(B.length>0){D.reset_styles();}B=[];if(C&&A){var I=this.id_to_rc(A.id);var S=parseFloat(I[1]);var P=parseFloat(I[0]);I=this.id_to_rc(C.id);var R=parseFloat(I[1]);var O=parseFloat(I[0]);}else{alert("ERROR: begin and end selected not set");E=0;return false;}if(O>P){var Q=P;P=O;O=Q;}if(R>S){Q=S;S=R;R=Q;}for(var T=O;T<(P+1);T++){for(var J=R;J<(S+1);J++){var N=J+"";var L=T+"";if(N.length==1){J="0"+J;}if(L.length==1){T="0"+T;}var K=this.get_obj(this.div_id+"|"+J+T);if(K){B.push(K);}}}for(var M=0;M<B.length;M++){if(B[M]){B[M].className="fg_highlight";B[M].innerHTML=B[M].innerHTML;}}D.selectedCells=B;};this.unselect_selection=function(){var K=!document.all;try{if(!K){return false;}else{oTextRange=window.getSelection();if(oTextRange){oTextRange.collapseToStart();}}var M=getElementsBySelector("#"+F+" td.fg_header");for(var J=0;J<M.length;J++){var I=M[J];I.innerHTML=I.innerHTML;}}catch(L){}};this.mDown_label=function(I){E=3;D.m_activity_label("down",I);};this.mUp_label=function(I){if(!E==3){return false;}E=0;if(B.length>0){D.unselect_selection();}D.m_activity_label("up",I);};this.mOver_label=function(I){if(E==0){return false;}m_activity_label("over",I);};this.m_activity_label=function(K,R){var J=Event.element(R).id;var M=J.split("|");var Q=M[1].substring(0,3);try{switch(Q){case"row":var N=J.split("|");var I=N[1].substring(4,J.length);if(I.length==1){I="0"+I;}var S=(D.columnNames.length-1).toString();if(S.length==1){S="0"+S;}if(K=="down"){A=this.get_obj(this.div_id+"|00"+I);}C=this.get_obj(this.div_id+"|"+S+I);break;case"col":var T=J.split("|");var L=T[1].substring(7,J.length);if(L.length==1){L="0"+L;}var P=(D.rowNames.length-1).toString();if(P.length==1){P="0"+P;}if(K=="down"){A=this.get_obj(this.div_id+"|"+L+"00");}C=this.get_obj(this.div_id+"|"+L+P);break;}D.updateSelected();}catch(O){alert(O.message);}};this.mDown=function(I){if(H){var K=H;H=false;D.updateEditedCell(K);}E=1;try{A=Event.element(I);C=Event.element(I);D.updateSelected();}catch(J){alert(J.message);}};this.mUp=function(I){if(!E==1){return false;}E=0;C=Event.element(I);D.updateSelected();D.unselect_selection();};this.mOver=function(I){if(E==1){C=Event.element(I);D.updateSelected();}};this.mOver_label=function(I){if(E==0){return false;}D.m_activity_label("over",I);};this.reset_styles=function(){for(var I in B){if(B[I]){B[I].className=D.get_quantile_color(parseFloat(B[I].innerHTML))+" fg_cell";B[I].innerHTML=B[I].innerHTML;}}};this._selectAll=function(){D.reset_styles();B=[];var I=getElementsBySelector("#"+D.div_id+" td.fg_cell");for(var J=0;J<I.length;J++){I[J].className="fg_highlight";B.push(I[J]);}D.selectedCells=B;if(D.selectAllFocusObject){var K=document.getElementById(D.selectAllFocusObject);K.focus();}};this.editCell=function(J){if(D.onCellUpdate===""){return false;}H=Event.element(J).id;var M=Event.element(J).id;var L="<input id='"+M+"_input' style='font: inherit' type='text'/>";var I=document.getElementById(M);var K=I.innerHTML;var N=I.parentNode;I.innerHTML=L;Event.observe($(M+"_input"),"blur",D.updateEditedCell_wrapper,false);$(M+"_input").value=K;I.className="fg_highlight";$(M+"_input").select();};this.updateEditedCell_wrapper=function(I){O_APP.log("updateEditedCell_wrapper fired!");var L=Event.element(I).id;var J=$(L);var K=J.parentNode.id;D.updateEditedCell(K);};this.updateEditedCell=function(M){if(M==false){return ;}var I=$(M);var J=$(M+"_input");if(J){try{var L=J.value;}catch(K){return false;}try{L=parseFloat(L);}catch(K){L=0;}if(L.toString().indexOf(".")>0){L=L.toFixed(2);}D.value_to_array(I.id,L);if(this.onCellUpdate){this.onCellUpdate(I.id,L);}H=false;}};this.update_if_enter=function(I,J){if(I.keyCode==13){updateEditedCell(J);}};this.value_to_array=function(O,L){try{var J=O;var K=this.id_to_rc(J);var I=K[1];var N=K[0];I=parseInt(I,10);N=parseInt(N,10);D.values[I][N]=L;}catch(M){alert(M.message);}};this.get_quantile_color=function(N){var M=(N-D.meanValue)/D.standardDeviation;var J=0;var L=0;var I=0;var K="";if(this.reverseQuantileColors){J=3;L=-1;I=-2;if(M>J){K="fg_cat1";}else{if(N===0){K="fg_cat4";}else{if(M>L||D.standardDeviation===0){K="fg_cat2";}else{if(M>I){K="fg_cat3";}else{K="fg_cat4";}}}}}else{J=2;L=1;I=-2;if(M>J){K="fg_cat4";}else{if(M>L){K="fg_cat3";}else{if(M>I||D.standardDeviation===0){K="fg_cat2";}else{K="fg_cat1";}}}}return K;};this._define_chart_popup=function(){if(this.chart_popup){}else{if(this.dataset){this.chart_type=this.dataset.blocktype;}else{this.chart_type=0;}this.chart_popup=new Popup('<div id="'+this.div_id+'_title">Chart</div>',"600px",this.div_id,"tl","tl");this.chart_popup.body_div_id=this.div_id+"_body";Element.addClassName(this.chart_popup.overlay.body.parentNode,"corona_chart");}};this._toggle_chart_popup=function(){var K=Element.getDimensions(D.div_id);var J=K.height;if(J>600){J=600;}if(J<300){J=300;}var I=K.width;D.chart_popup.overlay.cfg.setProperty("width",I+"px");D.chart_popup.overlay.cfg.setProperty("height",J+"px");$(D.chart_popup.body_div_id).style.height=(J-80)+"px";$(D.chart_popup.body_div_id).style.width=(I-20)+"px";D.chart_popup.toggle();if(D.chart_popup.showing){D._build_chart_body();}};this._reset_chart_popup_body=function(){var I=this._build_chart_body();};this._build_chart_body=function(L){setTimeout("document.body.style.cursor = 'wait';",1);var P=L||this.chart_popup.body_div_id;var V=this.values;var R=this.maximumValue;var Y='O_APP.Flexigrids["'+this.unique_id+'"]._print_chart();';var M="<div><img class='print_chart' align='right' title='^click_to_print_chart;' onclick='"+Y+"' src='themes/images/document-print.png'/></div>";this.chart_popup.overlay.setFooter(localize(M));$(this.div_id+"_title").innerHTML=localize(this.title);var Q=new Chart($(P));if(this.chart_type==0){Q.setDefaultType(CHART_LINE);}else{Q.setDefaultType(CHART_BAR);var T=Element.getDimensions(this.chart_popup.body_div_id);var K=T.width;var X=V.length;var U=V[0].length;var J=(K*0.6)/U/X;Q.setBarWidth(J);}var N=this.rowNames.length;var W=R+1;if(R>21){W=21;}Q.setGridDensity(N,W);Q.setVerticalRange(0,R);if(Q._yMax==0){Q.setVerticalRange(0,2);}var S=this._clean_row_names();Q.setHorizontalLabels(S);var I=new Array("#CC0000","#FFCC33","#33CC00","#99FFFF","#3366FF","#993399","#666666");for(var O=0;O<this.columnNames.length;O++){Q.add(this.columnNames[O],I[O],this.values[O]);}Q.draw();setTimeout("document.body.style.cursor = 'auto';",1);};this._build_chart_body_for_report=function(Q,b){var U=Q;var J=this.values;var M=this.maximumValue;var I=b.document.getElementById(U);var X=new Chart(b.document.getElementById(U));if(this.chart_type==0){X.setDefaultType(CHART_LINE);}else{X.setDefaultType(CHART_BAR);var R=Element.getDimensions(U);var L=R.width;var Z=J.length;var a=J[0].length;var P=(L*0.6)/a/Z;X.setBarWidth(P);}var W=this.rowNames.length;var S=M+1;if(M>21){S=21;}X.setGridDensity(W,S);X.setVerticalRange(0,M);if(X._yMax==0){X.setVerticalRange(0,2);}var T=this._clean_row_names();X.setHorizontalLabels(T);var O=new Array("#CC0000","#FFCC33","#33CC00","#99FFFF","#3366FF","#993399","#666666");for(var V=0;V<this.columnNames.length;V++){X.add(this.columnNames[V],O[V],this.values[V]);}X.draw();var Y=I.childNodes[1];var K=I.parentNode.lastChild.lastChild;var N=((K.clientWidth-K.offsetLeft)-5)+"px";Y.style.left=N;};this._clean_row_names=function(){if(this.chart_type==1){return this.rowNames;}var K=parseInt(this.rowNames.length/24,10);var L=new Array();var J=1;for(var I=0;I<this.rowNames.length;I++){if(J==1){L.push(this.rowNames[I]);}else{L.push("  ");}if(J==K){J=1;}else{J++;}}for(var I=0;I<L.length;I++){L[I]=L[I].substring(0,2);}return L;};this._print_chart=function(){O_APP.block_type=this.chart_type;O_APP.row_names=this._clean_row_names();O_APP.col_names=this.columnNames;O_APP.values=this.values;O_APP.max_value=this.maximumValue;var M='<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html><head><link rel="stylesheet" href="'+O_APP.BASE_URL+'/index.css"/><script src="lib/prototype1.5.0_rc0/prototype.js" type="text/javascript"><\/script><script src="lib/corona/chart_in_iframe.js" type="text/javascript"><\/script><script src="lib/webfx/chart/includes/excanvas.js" type="text/javascript"><\/script><script src="lib/webfx/chart/includes/chart.js" type="text/javascript"><\/script><script src="lib/webfx/chart/includes/canvaschartpainter.js" type="text/javascript"><\/script></head>';var K='<body onLoad="build_iframe_chart();" style="background:none; height:100%"><div id="title" style="width: 50%; margin: auto; text-align: center; font-size:20px; font-weight: bold;">'+O_APP.Flexigrids[this.unique_id].title+'</div><div id="chart" style="width: 9.5in; height: 6.5in;"></div><div id="footer" style="width: 50%; margin: auto; text-align: center; font-size:12px; font-weight: bold;">'+O_APP.Flexigrids[this.unique_id].print_footer_text+"</div></body>";var N="</html>";var J=M+K+N;var I=document.getElementById("print_content");var L=I.contentDocument;if(L==undefined||L==null){L=I.contentWindow.document;}L.open();L.write(J);L.close();};this.multiply_values=function(J){this.unaltered_values=this.values;var I=new Array();this.values.each(function(K){new_value_col=new Array();K.each(function(L){new_value=Math.ceil(L*J);new_value_col.push(new_value);});I.push(new_value_col);});this.values=I;this.draw();};this.revert_values=function(){O_APP.log("reverting");this.values=this.unaltered_values;this.draw();};}FlexiGrid.prototype.highlightByIndex=function(J){var G;var C=this.values.length;var K=this.values[0].length;var I=0;var A=0;var B="";for(var F=0;F<this.values.length*this.values[0].length;F++){if(J.indexOf(F)>=0){B="font-weight: bold";}else{B="normal";}I=Math.floor(F/K);A=F%K;var H=I+"";var E=A+"";if(H.length===1){H="0"+I;}if(E.length===1){E="0"+A;}var D=this.get_obj(this.div_id+"|"+H+E);if(D){D.style.cssText=B;}}};FlexiGrid.prototype.selectAll=function(){this._selectAll();};FlexiGrid.prototype.doCalculations=function(){var I=0;var L=0;var D=Math.pow(10,50);var M=0;var F=this.rowNames.length*this.columnNames.length;var E=[];var B=[];var N=this.rowNames.length;var H=this.columnNames.length;var A=N-1;var G=H-1;do{E[A]=0;G=H-1;do{if(A==N-1){B[G]=0;}var C=this.values[G][A];if(!isNumber(C)){continue;}E[A]+=C;B[G]+=C;I+=C;if(C>L){L=C;}if(C<D){D=C;}}while(G--);}while(A--);A=N-1;do{this.rowMeans[A]=Math.round((E[A]/B.length)*100)/100;}while(A--);G=H-1;do{this.columnMeans[G]=Math.round((B[G]/E.length)*100)/100;}while(G--);this.minimumValue=D;this.maximumValue=L;this.meanValue=I/F;A=N-1;var J=Math.pow;var K=this.values;var C=0;do{G=H-1;do{C=K[G][A];M+=J((C-this.meanValue),2);}while(G--);}while(A--);this.standardDeviation=Math.sqrt(M/F);};FlexiGrid.prototype.getSelectedCells=function(){return this.selectedCells;};FlexiGrid.prototype.redraw=function(){var B=this.values;var J=B.length;var I=B[J-1].length;var D="";var F="";var S=J-1;var L=I-1;var O=this.div_id;var K=this.columnMeans;var A=this.rowMeans;var N=0;var M="";var G=this.colorQuantiles;var P=this.get_quantile_color;var H=this.showMeanValues;var T=this.get_obj;do{D=S.toString();if(D.length==1){col2d="0"+D;}else{col2d=D;}if(H){var R=T(O+"|cmean_"+S);try{R.innerHTML=K[S];}catch(Q){O_APP.log("no such node: "+O+"|cmean_"+S);}}L=I-1;do{N=B[S][L];F=L.toString();if(F.length==1){row2d="0"+F;}else{row2d=F;}cell=T(O+"|"+col2d+row2d);try{cell.innerHTML=N;if(G){cell.className=P(N)+" fg_cell";}}catch(Q){O_APP.log("no such object "+O+"|"+col2d+row2d);}if(S==0&&H){var C=T(O+"|rmean_"+L);C.innerHTML=A[L];}}while(L--);}while(S--);if(H){var E=Math.round(this.meanValue*100)/100;T(O+"|mean").innerHTML=E;}};FlexiGrid.prototype.draw=function(C){var A=this.values;this._define_chart_popup();if(!this.div_id){alert("ERROR: Property div_id is not set.");return false;}if(this.columnNames.length==0||this.rowNames.length==0){alert("ERROR: Need to set rowNames and columnNames before drawing");return false;}try{var F=A[this.columnNames.length-1][this.rowNames.length-1];}catch(D){O_APP.log("values array doesn't match size of labels");return false;}var B=this.rowNames.length-1;var E=this.columnNames.length-1;do{E=this.columnNames.length-1;do{if(!A[E][B]){A[E][B]=0;}}while(E--);}while(B--);if(this.columnNames.length==1){this.showMeanValues=false;}this.doCalculations();if(!this.is_rendered||C){this.render();}this.redraw();};FlexiGrid.prototype.detach_events=function(){var C=getElementsBySelector("#"+this.div_id+" td.fg_header");for(var B=0;B<C.length;B++){var A=C[B];if(A.id!="fg_row_header_top"){Event.stopObserving(A,"mousedown",this.mDown_label,false);Event.stopObserving(A,"mouseup",this.mUp_label,false);Event.stopObserving(A,"mouseover",this.mOver_label,false);}else{Event.stopObserving(A.firstChild,"click",this._selectAll,false);Event.stopObserving(A.lastChild,"click",this._toggle_chart_popup,false);}}var C=getElementsBySelector("#"+this.div_id+" td.fg_cell");for(var B=0;B<C.length;B++){var A=C[B];if(A.id!="fg_row_header_top"){Event.stopObserving(A,"mousedown",this.mDown,false);Event.stopObserving(A,"mouseup",this.mUp,false);Event.stopObserving(A,"mouseover",this.mOver,false);Event.stopObserving(A,"dblclick",this.editCell,false);}else{Event.stopObserving(A,"click",this._selectAll,false);}}};FlexiGrid.prototype.render=function(){var B="";for(var A=0;A<this.rowNames.length+1;A++){var N="<tr>";var J=A?false:true;if(J){var C="";if(this.shrinkRowLabels){C="1%";}else{C=this.minColWidth;}N+="<td width='"+C+"' id='fg_row_header_top' class='fg_header'>&nbsp</td>";}else{N+="<td onSelectStart='return false;' id='"+this.div_id+"|row_"+(A-1)+"' class='fg_header fg_row'>"+this.rowNames[A-1]+"</td>";}for(var M=0;M<this.columnNames.length;M++){if(J){N+="<td onSelectStart='return false;' id='"+this.div_id+"|column_"+M+"' width='"+this.minColWidth+"' class='fg_header'>"+this.columnNames[M]+"</td>";if(this.showMeanValues&&M==(this.columnNames.length-1)){N+="<td onSelectStart='return false;' width='"+this.minColWidth+"' class='fg_mean'>"+O_APP.strings["mean"]+"</td>";}}else{var E="";var H="";var G=M.toString();if(G.length==1){E="0"+G;}else{E=G;}var L=A-1;var I=L.toString();if(I.length==1){H="0"+I;}else{H=I;}N+="<td class='fg_cell' onSelectStart='return false;' id='"+this.div_id+"|"+E+H+"'></td>";}}if(this.showMeanValues&&!J){N+="<td id='"+this.div_id+"|rmean_"+(A-1)+"' class='fg_mean'></td>";}N+="</tr>";B+=N;}var M=0;if(this.showMeanValues){var N="<tr><td class='fg_mean'>"+O_APP.strings["mean"]+"</td>";M=this.columnMeans.length-1;do{var F=this.columnMeans.length-1-M;N+="<td id='"+this.div_id+"|cmean_"+F+"' class='fg_mean'></td>";}while(M--);N+="<td id='"+this.div_id+"|mean' class='fg_mean' style='font-weight: bold'></td>";N+="</tr>";B+=N;}var O="<div id='fg_container' class='max_height_501'><table class='fg_grid' width='100%'>"+B+"</table></div>";try{var D=document.getElementById(this.div_id);D.innerHTML=O;this.attach_events();this.is_rendered=true;}catch(K){alert("Can't draw div because "+this.div_id+" does not exist in DOM");return false;}};FlexiGrid.prototype.return_html=function(){var B="";for(var A=0;A<this.rowNames.length+1;A++){var L="<tr>";var I=A?false:true;if(I){var C="";if(this.shrinkRowLabels){C="1%";}else{C=this.minColWidth;}L+="<td width='"+C+"' id='fg_row_header_top' class='fg_header'>&nbsp</td>";}else{L+="<td onSelectStart='return false;' id='"+this.div_id+"|row_"+(A-1)+"' class='fg_header fg_row'>"+this.rowNames[A-1]+"</td>";}for(var K=0;K<this.columnNames.length;K++){if(I){L+="<td onSelectStart='return false;' id='"+this.div_id+"|column_"+K+"' width='"+this.minColWidth+"' class='fg_header'>"+this.columnNames[K]+"</td>";if(this.showMeanValues&&K==(this.columnNames.length-1)){L+="<td onSelectStart='return false;' width='"+this.minColWidth+"' class='fg_mean'>"+O_APP.strings["mean"]+"</td>";}}else{var E="";var G="";var F=K.toString();if(F.length==1){E="0"+F;}else{E=F;}var J=A-1;var H=J.toString();if(H.length==1){G="0"+H;}else{G=H;}L+="<td class='fg_cell' onSelectStart='return false;' id='"+this.div_id+"|"+E+G+"'></td>";}}if(this.showMeanValues&&!I){L+="<td id='"+this.div_id+"|rmean_"+(A-1)+"' class='fg_mean'></td>";}L+="</tr>";B+=L;}var K=0;if(this.showMeanValues){var L="<tr><td class='fg_mean'>"+O_APP.strings["mean"]+"</td>";K=this.columnMeans.length-1;do{L+="<td id='"+this.div_id+"|cmean_"+K+"' class='fg_mean'></td>";}while(K--);L+="<td id='"+this.div_id+"|mean' class='fg_mean' style='font-weight: bold'></td>";L+="</tr>";B+=L;}var M="<div id='fg_container' class='max_height_501'><table class='fg_grid' width='100%'>"+B+"</table></div>";var D=document.getElementById(this.div_id);return M;};FlexiGrid.prototype.redraw_in_report=function(U){var B=this.values;var J=B.length;var I=B[J-1].length;var D="";var F="";var S=J-1;var L=I-1;var O=this.div_id;var K=this.columnMeans;var A=this.rowMeans;var N=0;var M="";var G=this.colorQuantiles;var P=this.get_quantile_color;var H=this.showMeanValues;var T=this.get_obj;do{D=S.toString();if(D.length==1){col2d="0"+D;}else{col2d=D;}if(H){var R=U.document.getElementById(O+"|cmean_"+S);try{R.innerHTML=K[S];}catch(Q){O_APP.log("no such node: |cmean_"+S);}}L=I-1;do{N=B[S][L];F=L.toString();if(F.length==1){row2d="0"+F;}else{row2d=F;}cell=U.document.getElementById(O+"|"+col2d+row2d);try{cell.innerHTML=N;if(G){cell.className=P(N)+" fg_cell";}}catch(Q){O_APP.log("no such object |"+col2d+row2d);}if(S==0&&H){var C=U.document.getElementById(O+"|rmean_"+L);C.innerHTML=A[L];}}while(L--);}while(S--);if(H){var E=Math.round(this.meanValue*100)/100;U.document.getElementById(O+"|mean");}};