function llapse(){
// blue is for rates between 0 and -1.22 (lower limit of moist adiabadic lapse rate)
// purple is for any inversions
// red is for lift  unstable up to dry adiabadic -3 (higher is absolutely unstable)
var purple=20; var blue=12; var red=0; var orange=8
var scale=20; var llapse;
var prevC; var prevft; var llapserate
document.write("<tr><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\">Pressure<br>(ft)</td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\">Alt <br>(mb)</td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\"> Dir<br> &deg;az</td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\"> Spd<br>Kts </td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\">Temp<br>F&deg;</td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\">Temp<br>C&deg;</td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\">DewPt<br>C&deg;</td> <td style=\"border:solid 1px gray;text-align:center;padding:2 8;\"><a href=\"http://www.hko.gov.hk/aviat/soaring/wxidx/index.shtml?menu=wxidx\" >Thermal<br>Index</a> </td> <td style=\"border:none;text-align:center;padding:2 8;\">Local Lapse<br> Rate C&deg;/1000ft</td>")

//http://www.hko.gov.hk/aviat/soaring/wxidx/index.shtml?menu=wxidx
document.write("<td style=\"border:solid 1px gray;text-align:right\">")
document.write("<img src=dot_purple.gif height=14px width=100%><br>Inv&nbsp;</td>")
document.write("<td  style=\"border:solid 1px gray;text-align:left\" >")
document.write("<img src=blgrnylo.gif height=14px width="+1.22*scale+"px><br>&rarr;</td>")
document.write("<td  style=\"border:solid 1px gray;text-align:center\" >")
document.write("<img src=orangegrad.gif height=14px width="+1.8*scale+"px><br>&uarr;&uarr;</td>")
document.write("<td  style=\"border:solid 1px gray;text-align:left\" >")
document.write("<img src=dot_red.gif height=14px width=100%><br>TS</td></tr>")

if(soundrow['ft'].length>2){
lclset=0
lclmsg=""
for(var ndx in soundrow['ft']){

// spit back the data from the soundrow array
document.write("<tr onClick=\"color(this)\"><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\"> "+soundrow['ft'][ndx]+"ft  </td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\"> "+soundrow['mb'][ndx]+"   </td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\"> "+soundrow['dir'][ndx]+"&deg;  </td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\"> "+soundrow['speed'][ndx]+"  </td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\"> "+soundrow['tempF'][ndx]+"&deg;  </td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\"> "+soundrow['tempC'][ndx]+"&deg;  </td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\"> "+soundrow['dewpointC'][ndx]+"&deg;")


// new stuff for thermal index
rowheight = (soundrow['ft'][ndx]-h1*1000)
dryparceltmp= Math.round(10*(t1+ (rowheight*(-2.987)) ))/10;
dryparceltmp= t1+ (rowheight*-.002987);   // 2.987c/1000ft is DALR 


//dryparceltmp = (Math.round(10*dryparceltmp)) 

//thermal_index= Math.round(10*(dryparceltmp-soundrow['tempC'][ndx]))/10;
thermal_index= Math.round(10*(soundrow['tempC'][ndx]-dryparceltmp))/10;
//thermal_index = soundrow['ft'][ndx]+" - "+h1*1000+"<br>"+t1+"<br>"+soundrow['tempC'][ndx]+"<br> "+rowheight 

if(thermal_index < 0){ti_fontcolor="red"}else{ti_fontcolor="blue"}
if ((lclset == 0 ) &&  ( dryparceltmp < soundrow['dewpointC'][ndx])) {ti_fontcolor="orange"; lclset=1; lclmsg="LCL&uarr;" } 

//if(isNaN(thermal_index)==0)
//if(isNaN(llapserate)==0)
if((lclset == 0 ) &&  (thermal_index == 0) && (soundrow['mb'][ndx]>995) )
{document.write("</td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\">Index C&deg;<br><b>0&rarr;top of lift</b> </td>") }
else
{document.write("</td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\">&nbsp; <b><font color="+ti_fontcolor+">"+thermal_index+"</b>  C&deg; "+lclmsg+"</font>&nbsp; </td>")}

//{document.write("</td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\">&nbsp; <b><font color="+ti_fontcolor+">"+thermal_index+"<br>"+(Math.round(dryparceltmp*10))/10+"</b>  C&deg; "+lclmsg+"</font>&nbsp; </td>")}

lclmsg=""

// old stuff
llapserate=Math.round((10000*(soundrow['tempC'][ndx]-prevC)/(soundrow['ft'][ndx]-prevft)))/10

if(isNaN(llapserate)==0) {document.write("</td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\">&nbsp; <b>"+llapserate+"</b>C&deg;&nbsp; </td>")}
else { var cloudbase=Math.round((parseFloat(soundrow['tempC'][ndx])-parseFloat(soundrow['dewpointC'][ndx]))*400+parseFloat(soundrow['ft'][ndx]));
document.write("</td><td style=\"border:solid 1px gray;text-align:center;padding:2 8;\"><a href=http://www.drjack.info/BLIP/INFO/parameter_details.html#Cumulus_Cloudbase title=\"CLOUDBASE = ((TC - DPC) * 400 FT\">CU Cloudbase<br> &asymp; "+cloudbase+" ft</A> </td>")}
// was just "from data" 

// decide how wide each color column will be based on llapserate
if(isNaN(llapserate)==0) {
      if(llapserate<=-3){                        purple=0; blue=1.22*scale;                 orange=1.78*scale;                         red=(llapserate+3)*(-1)*scale;}
      if((-3<llapserate) && (llapserate<=-1.22)){purple=0; blue=1.22*scale;                 orange=(Math.abs(llapserate+1.22)*scale);                       red=0;}
      if((-1.22<llapserate) && (llapserate<0))  {purple=0; blue=Math.abs(llapserate)*scale; orange=0;                                  red=0;}
      if(llapserate>=0) { purple=scale/8*llapserate; red=0; orange=0; blue=0;}

document.write("\n<!-- red="+red+" blue="+blue+" orange="+orange+" purple="+purple+"-->\n")
document.write("<td style=\"border-right:solid 1px gray;text-align:right;\"><img src=dot_purple.gif height=\"22px\" width=\""+purple+"px\"></td><td align=left><img src=blgrnylo.gif height=\"22px\" width=\""+blue+"px\"></td><td align=left><img src=orangegrad.gif height=\"22px\" width=\""+orange+"px\"></td><td align=left><img src=dot_red.gif height=\"22px\" width=\""+red+"px\"></td></tr>\n")
         }
     else
     {document.write("<td colspan=2 style=\"border-bottom:solid 1px black;text-align:center;\" >stable</td> <td colspan=1 style=\"border-bottom:solid 1px black; border-left:solid 1px gray;text-align:center;\">cond</td><td colspan=1 style=\"border-bottom:solid 1px black; border-left:solid 1px gray;text-align:center;\">Un</td></tr>\n")
     }

prevC= soundrow['tempC'][ndx];prevft=soundrow['ft'][ndx];

}  //end for loop one row processed
}  //end of if soundrow.length
else {document.write( "<br><font color=red> Sorry, RUC2 Soundings Unavailable at the moment </font><br>")}
document.write("</table>")
document.write("<!-- End  llapse.html -->") 
}

//// MoistAdiabadicLapseRrate MALR = dT/dz = DALR / (1 + L/Cp*dWs/dT)
// http://www.theweatherprediction.com/habyhints/161/
// To figure out when it is truly unstable and also to figure out where the LCL and CCL are
//
//Every term in the equation is a constant except for dWs/dT. dWs/dT is the change in saturation mixing ratio 
// with a change in temperature. 
//
//The formula for the saturation mixing ratio is: Ws = 0.622Es / (P - Es).
//Therefore Ws depends on the pressure and Es of the air. It is temperature that determines the moisture carrying capacity of the air. Remember that Es is found by plugging T into the Clausius-Clapeyron equation. Therefore, ultimately, Ws depends on temperature and pressure.
//
//http://www.theweatherprediction.com/thermo/hints/  
//

// gratutitous row coloring function from HADS site.

function color(thisRow) {
    if (thisRow.style.backgroundColor == "cyan") {
    thisRow.style.backgroundColor = "#DFF7FF"
	return;
	}
    if (previousRow != null) {
	previousRow.style.backgroundColor = "#DFF7FF";
	}
	thisRow.style.backgroundColor = "cyan";
	previousRow = thisRow;
	}

function copyArray(inputArray) {
        var size = inputArray.length;
	        var cps = new Array(size);
	for (var k = 0; k < size; k++) {
	var cols = inputArray[k].cells;
	var colsArray = new Array(cols.length);
	for (var l = 0; l < colsArray.length; l++)
	colsArray[l] = cols[l].innerHTML + "|" + cols[l].align;
	cps[k] = colsArray;
	}
	return cps;
	}

function reverseRows(ID) 
{
   
           var grid=document.getElementById(ID);
           var rows = grid.rows;
           var rowSize = rows.length;
           var columnSize;
           var invertRows = copyArray(rows);
   // we don't want to reverse the row 0 (1st row or header row from top)
   // // row 1 is 2nd row from top
            for (var i = 1; i < rowSize; i++) {
                    columns = grid.rows[i].cells;
                    columnSize = columns.length;
                    for (var j = 0; j < columnSize; j++) {
    arrayOfStrings = invertRows[rowSize-i][j].split("|");
    columns[j].innerHTML = arrayOfStrings[0];
    columns[j].align = arrayOfStrings[1];
    }
            }
    }

						


