Mega Code Archive

 
Categories / JavaScript DHTML / Page Components
 

JavaScript Calculator - sCal

<HEAD> <SCRIPT LANGUAGE="JavaScript"> <!-- Begin // ************************************************* sCal2-06r.htm // // sCal - small, scientific, script Calculator // // Copyright (C) 2003  R. Mohaupt // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA // 02111-1307  USA //                                 --- mgineer1@netscape.net // ABOUT sCal:                         R.Mohaupt, Feb, 2003 // //    GENERAL:  sCal is a scientific, programmable calculator form // --predominately generated in HTML in a relatively short BODY of // code at the end (approximately the last 20%, depending on how // much additional code has been added).  The HEAD contains JavaScript // (JScript, ECMA std.262 Script, or JS) programming language.   // Therefore, one only needs a JS-enabled web browser (Microsoft // Internet Explorer, Mozilla, Netscape Navigator, versions 5+, have // been checked & provided for) to operate sCal, and a text editor // (usually accessable within the browser) to modify.  The HEAD has // 3 commented purposes: // //    I. CALCULATOR OPERATION FUNCTIONS:  Basic instructions to // handle I/O (Input / Output) to the calculator form BODY.  These // are named Ix, Ox, Im, Om etc. {coding convention might have // named these get_x, put_x, etc.} for I/O to the x-display, memory,  // etc.  All areas of sCal can be modified by the user;  however, // special care should be taken in this area since so much other // code depends on operation of these functions.  The key function // is "xEval()" which, after some checking for use of the '^' to  // take x to the y power, calls the JS "eval('string')" function. // //    II. MENU GROUPS WITH STRINGS OF JS SOURCE CODE: Operation of // the menu structure is fairly simple: observing 'Catagory' drop- // down menus in the upper-right cell of the Calculator BODY, to // select 'Groups' of individual operations from the drop-down // menus in the upper-left cell.  Programming this requires some // study of the included source examples.  As in any coding effort, // it is VERY important to mimic the location of commas, quotes, // semi-colons, etc. exactly.  More interesting and challenging is  // creation of JS-coded strings, often multi-line statements, to // perform computational desires.  These vary from the application // of a simple factor (the majority of x}conversions do this) to  // somewhat elaborate mini-programs, identifiable by some dense // string construction.  The function "eval" expects a string of // JS code.  This is what appears in the x-display when the [JS] // button clicked.  Data additions in *}functions are made in the // x-display.  Code can be modified there, too.  But for code // modifications, or addition of new procedures, to become 'per- // manent', they need to be added to the source.  Here one must // keep in mind that STRINGS are being built.  Single and double- // quotes only provide 2-levels.  Prompts in the n[0...19] array // require another level, hence the supplemental strings of dense // code appearing immediately before the Group Menu layouts. //    A few comments are in order here: // // *  Operational Summary:  sCal conventions suggest that the  // following 'codes' be observed.  (The program does not key on // these, but they give the user a hint of what to expect.) // x} in description, user click [>x] button to convert or  //                     operate on value in x-display. // s} user click [JS] to view text (script) in x-display // *} click [JS], user seeks comment or other areas in text to  //             place or replace a value into a procedure, ->[=]. // n} click [JS] to fill-in the n[0..19] array for the program: //     prompt 'input <' means value to be entered in next column //     label 'output >' designates the computed output to right //     '_column_head_'  may indicate that I/O values are below // // *  String Media:  All Programs & Functions could have been built // into sCal and skip the call to 'eval()' to interpret strings; // however,  that would be a different process from allowing the // user to modify or creat new programming in the x-display. //  // *  Finding Code:  Sub-menus are called by exactly the first 7- // characters of the catagory name.  The specific code in the HEAD // is placed roughly in the order of Menu appearance, but it may // be easier to locate by using the text editor's 'Find' function. // These 7-characters can 'Find' the code area: sub-menu selections // will be below the 'found', and additional strings to execute // them (if any) are in the block immediately above it. // // *  JS References:  Many excellent books are available on the // topic, as well as tutorials and code examples on the Web.  Both // Netscape and Microsoft have extensive (though not all-inclusive) // Guides and References that can be downloaded.  sCal contains // only a sub-set of JS language elements--mostly listed in the // JavaScript examples Group.  Comments are provided, but there // are never enough. // // *  Reliability: NO EXHAUSTIVE ERROR CHECKING HAS BEEN CONDUCTED! // Some errors can be anticipated.  Conversion factors and procedure // output should be checked before relying upon the results.  And, // of course, the user is expected to know when a computation is // applicable to the problem at hand. Tho some simple discussion // and an example may be included in the string or an s}(script), // there is no substitute for comprehensive knowledge and  // experience. // // *  Philosophy:  sCal is not intended to compete with big, slick // full-blown applications in any areas it touches.  It is intended // to be highly portable (hence JS & HTML); use only one "small" // file (both source & executable, with no supplemental image, // sound, .ddl etc. files to be installed); handy for the rare use // of a procedure or quick implementation of a special calculation // not warranting development of a large program.  It will not have // extensive help files, options, and error-checking. //  //    III.  BROWSER DETERMINATION - MENU POPULATION: A small set // of variables and functions at the end of the HEAD, before the // BODY, to provide settings for browser variable text size and // default menu groups. sCal is set up to run properly with recent // versions of Netscape, Mozilla, or Internet Explorer (trademarks // of respective providers) in their default, out-of-the-box set- // tings. If a user has made modifications, their impact on sCal is // unpredictable.  If unsatisfactory, some CSS instructions can be // added, or direct code modifications made. // //    BODY:  The running sCal calculator is divided in a 2x2 table.  // The cell boundries are clearly commented in the source code // and can be compared to the visible form.  HTML is in the order // of appearance.  Brief operating instructions are given in the // lowest 2 cells.  Experimentation and reading this source code // are highly recommended. // // ************************************************************** // *********************************** I. CALCULATOR OPERATION FUNCTIONS var x = "";    // Display: by loose typing, 'x' mostly a string, sometimes a number                // Advantages & Disadvantages.  Big problem is use of '+' to add strings.                // Often necessary to induce JavaScript to treat variable as a number by                // dividing it by 1: i.e. +x adds x-string, +x/1 adds numeric value of x.                // A stray '/1' is seen in many formulations to use less code than eval(). var m = "";       // stores Memory var nFlag = "0";  // determines function of [n] keys n = new Array(20);// stores variables used in programming, initialize as empty strings  for (i=0; i<20; i++) {n[i]="";} var temp = ""; function Ix() {x = document.sCal.IOx.value;}            // Input synch to x-string.  Do since TextArea can be changed from keyboard function Ox() {document.sCal.IOx.value = x;}  // Output x-string change to display function xEval() {Ix(); Im(); // --- MAIN Evaluation Routine, invoked by screen [ = ] click ---  for (i=0; i<20; i++) {nI(i);}      var j = x.indexOf('^');     // check to see if there is an x^y function  if (j > 0) {                // all to left of '^' is taken as base and all right as exponent   if (x.indexOf('^',j+1) > 0) {alert("WARNING! Only 1 [^] allowed in expression! Math.pow(x,y) preferred.");}   else {                     // likewise, entire x-value is used as function argument, not just last term   document.sCal.IOx.value = Math.pow(eval(x.substring(0,j)),eval(x.substring(j+1)));}}  else {                      // check to see if a program, update variables for keyboard entries   if (x.indexOf('=')>-1) {   // Note: certain calls reserved for programs ('=' designated)    temp=x; eval(x); x=temp; Ox();}              // original x not changed in a program    else {document.sCal.IOx.value = eval(x);} }   // end of nested if-else statements  Ix(); Om(); On();}           function xPlusEq(s) {Ix(); x += s; Ox();}   // --- DISPLAY x functions --- function xMultEq(s) {xEval(); x *= s; Ox();} function Clear() {x = ""; Ox();}            // Clearing x often necessary when switching functions. function BkSpace() {Ix(); x = x.substring(0,x.length-1) ; Ox();} function recip() {xEval(); x = 1/(x); Ox();} function xEnd() {Ix(); return x.substr(x.length-1,1);}  // allows last char. of x to be a Flag;  // click display button, or key if cursor placed at end of x, for a control. {x[i] doesn't work} function JSwork(s) // --- determine what to do with incoming MENU (s) values from [JS] button ---  {if (s.indexOf('n[1]')>-1)          //-if there is program (indicated by presence of n[1]),   {x=""; Ox(); xPlusEq(s); xEval();} // fill in array.  ERROR if x-display not cleared prior.   else {xPlusEq(s);}  }   function Xwork(s)  // --- determine what to do with incoming MENU (s) values from [Do] button ---  {if (isNaN(s))   {if (s.indexOf('x')>-1)        //-if expression, s, is f(x), i.e.Method,    {xEval(); x = eval(s); Ox();} // figure x, & substiture in function    else {x += eval(s); Ox();}  }  //-if a Property or program, add 's' value  else {xPlusEq(s);}   }          //-if numeric constant, append like JSwork   function DoRecip(s) //--- does [1/d]: inverse [Do] eg. ft>m becomes m>ft. NOT ALWAYS SENSIBLE! ---  {Ix(); temp=eval(s); if (s.indexOf('x')>-1) {x=x*x/temp} else {x=1/temp} Ox();} function Im() {m = document.sCal.IOm.value;} // --- MEMORY functions: (similar to Ix() & Ox()) function Om() {document.sCal.IOm.value = m;} function XtoM()  {Ix(); Im(); m += x; Om(); x=""; Ox();} // Memory click operations: function MtoX()  {Ix(); Im(); x += m; Ox();} function Mplus() {xEval(); if (m=="") {m=0} // --- note that Mplus can accumulate:  if (isNaN(m) && m.charAt(0)=="/"){m+=x+"/"}// string of data values, triggered by starting '/'  else {m=parseFloat(m)+parseFloat(x)}       //   & using '/' as delimiter between values,  Om(); x=""; Ox();}                         // or as summation & storage of a single value. function Mclear() {m = ""; Om();}           // - Use MtoX to view/edit the string of values. function nI(k) {n[k] = eval("document.sCal.n"+k+".value");} // --- for n[.] DATA ARRAY ---  // for consistency with Ix() & Im() this would have been named In, except its reserved function On() {                  // function On(k) like Ox() & Om().  document.sCal.n0.value = n[0];  // These are values of the text boxes  document.sCal.n1.value = n[1];  // on the right cell of sCal.  document.sCal.n2.value = n[2];  // {This is not ellegant code  document.sCal.n3.value = n[3];  // but the prior form of n[k]=  document.sCal.n4.value = n[4];  // eval("document.sCal.n"+k+".value")  document.sCal.n5.value = n[5];  // in the 'input' nI form, but  document.sCal.n6.value = n[6];  // contrary to Netscape documentation,  document.sCal.n7.value = n[7];  // eval("document.sCal.n"+k+".value")  document.sCal.n8.value = n[8];  // =n[k] for On, doesn't work.}  document.sCal.n9.value = n[9];  document.sCal.n10.value=n[10];  document.sCal.n11.value=n[11];  document.sCal.n12.value=n[12];  document.sCal.n13.value=n[13];  document.sCal.n14.value=n[14];  document.sCal.n15.value=n[15];  document.sCal.n16.value=n[16];  document.sCal.n17.value=n[17];  document.sCal.n18.value=n[18];  document.sCal.n19.value=n[19];}   function setNflag1() {nFlag="1";}  // sets flag to insert 'n[k]' in x-display function setNflag2() {nFlag="2";}  // sets flag to insert value of n[k] in x  function nData(k) {                // similar to Memory functions  if (nFlag=="0") {n[k] = x; On();}  if (nFlag=="1") {Ix(); x += "n["+k+"]"; Ox(); nFlag="0";}  // Nflag is reset to 0  if (nFlag=="2") {Ix(); nI(k); x += n[k]; Ox(); nFlag="0";}}//     after each use. function Nclear() {for (i=0; i<20; i++) {n[i] = "";} On();} // clears entire n-array   // --- except when data is specifically intended to carry over, it is good practice   //  to clear the n-data array (AND the x-display) when switching to a new function.    function Mr(val,place) {var d=Math.pow(10,place);   //--- MISC. UTILITY FUNCTIONS ---      return Math.round(d*val)/d;}                       //--- Output decimal places --- function Fo(val) {var d=0; if (val<100){            // format output to 3 +/- significant figures  if (val<10){d=2} else {d=1}} return Mr(val,d)} function fact(q) {var j=q; for (i=q;i>1;i--) {j*=fact(j-1)} return j};// factorial, n!=1*2*3*...*n       // note recursion: fact(q) calls itself, above. var Pi =Math.PI; // Consideration has been given to streamlining all Math. fcn. calls by defining                  // them in a cluster; eg. sin(a)=Math.sin(a*PI/180) {in degrees vs. radians}, etc.                  // With the math intensity of sCal, there would be a savings in code size (and it                  // has been done in the cases above), but it would not encourage good JS coding.                  // Not a big matter of principle, tho. User could do it, looking like VB.script.    /* ****************************** II. MENU GROUPS WITH STRINGS OF JS SOURCE CODE:      All of sCal is user-programmable, of course.  But the following Menu-Value    setups should be particularly useful to engineers & scientific professionals for    adding new functions, often just because many formulae are too easily forgettable.                     --- Follow working code closely. ---  GROUP MENU options format = "('selected.text','selected.value')",  "('','')", <-copy/paste to fill in new options in chosen group  Watch length of .text to avoid overrun of cell width (obvious when border blows).  Last option must end with ); close parentheses & semi-colon, to end array.    >       < use EXACTLY 7-characters of group name .text & EXACT CASE!  */ var A234567_nA = new Array("('A23456789 sample NAME','COMPUTATION string')",  "('x} . NAME','COMP')",  "('x} . . .','')",     // copy this section to start a new catagory;  "('x} . . .','')",     // paste it to an appropriate location in the code;  "('x} . . .','')",     // fill in the blanks with desired name, comp;  "('x} . . .','')",     // copy the top catagory name to the desired option select  "('x} . . .','')",     // menu (top, right cell) to make available for use.  "('x} . . .','')",  "('x} . . .','')",     // adding a calculation to an existing catagory: simply  "('x} . . .','')",     // add blank lines where needed.  Delete these comments.  "('x} . . .','')",     // Note that final line ending with semi-colon = critical.  "('x} . . .','')",  "('x} . . .','')",     // There are better blanks (less editing required) at  "('','')");            // Catagory 3: Special for User_01; User_02; User_03. // *********************** Catagory 1: default selection of conversions********* // // Sources (numerous, some discrepancies, potential transcription errors:) // ASHRAE, Handbook of Fundamentals, Subcommittee Bryan, Wm. L, et al, 1972; // Engineering Manual, Perry, Robert H, 3rd. Ed, McGraw Hill, 1976; // Engineers Manual, Hudson, 2nd Ed, Ralph G, Wiley & Sons, 1944; // Handbook of Chemistry and Physics, 47th Ed, CRC, 1966-67; // Timber Construction Manual, American Inst. of Timber Constr, 2nd Ed, 1974; var General_nA = new Array("('General: convert x}. Pi .','Math.PI')",  "('len. x}. inch > millimeter','x*25.4')",  "('length x} . . feet > meter','x*0.3048')",  "('length x} . . . feet > mile','x/5280')",  "('len. x} . mile >kilometer','1.609344*x')",  "('area x} . ft^2 > meter^2','0.092903*x')",  "('area x} . . feet^2 > acre','x/43560')",  "('area x} . acre >hectare','0.404686*x')",  "('area x} . acre > mile^2','x/640')",  "('vol. x} . . ft^3 > meter^3','0.0283168*x')",  "('vol. x} . . . . ft^3 > gallon','7.4805*x')",  "('vol. x} .yd^3 > meter^3','0.764555*x')",  "('force . . . lb(f) > Newton','4.44822*x')",  "('mass x} . . . lb.US > kg','0.45359*x')",  "('x} . . .','')",  "('n} Rect.-Polar Convert',R_PCon)", // code for this is is at Analytic Geometry  "('x} . . .','')",  "('temp. . . C deg > F deg','9*x/5+32')",  "('temp. . . F deg > C deg','5*(x-32)/9')",  "('temp. . . C deg > K deg','x-273.15')"); var Length__nA = new Array("('length x} . feet > meter','x*0.3048')",  "('x} . . . inch > millimeter','x*25.4')",  "('x} . . . . . . yard > meter','x*0.9144')",  "('x} . . .ft(us) > ft(survey)','x*0.9999980315')",  "('x} . . . . . . feet > link','x/0.66')",  "('x} . . . . . . feet > rod','x/16.5')",  "('x} . . . . . . feet > chain','x/66')",  "('x} . . . . . . feet > inch','x*12')",  "('x} . . . . . . feet > hand','x*3')",  "('x} . . . . . . feet > cubit','x/1.5')",  "('x} . . . . . . feet > yard','x/3')",  "('x} . . . . . feet > fathom','x/6')",  "('x} . . . . . feet > furlong','x/660')",  "('x} . . . . . . feet > cable','x/720')",  "('x} . . . . . . feet > mile','x/5280')",  "('x} feet > mile(int.naut.)','x/6076.115485')",  "('x} . . . mile > kilometer','x*1.609344')",  "('x} mile > league(stat.)','x/3')",  "('x} mile>league(intnat)','x/3.45')",  "('x} . mile > astrom.unit','x/92955763.342')",  "('x} . . . . . mile > parsec','x/1.917377515e13')",  "('x} . . . mile > light year','x/5.87851323e12')",  "('x} . . .','')",  "('x} . . inch > pica(print)','x*6')",  "('x} . .inch > point(print)','x*72')",  "('x} . . .','')",  "('x} . . . meter > micron','x*1e6')",  "('x} . meter > angstrom','x*1e10')");    var Area_co_nA = new Array("('Area conv.x} f^2 >m^2','x*0.092903')",  "('x} . . . . . feet^2 > inch^2','x*144')",  "('x} . . . . . . inch^2 > cm^2','x*6.4516')",  "('x} . . . . .feet^2 > yard^2','x/9')",  "('x} . . .yard^2 > meter^2','x*0.83612736')",  "('x} . . . . . . . feet^2 > acre','x/43560')",  "('x} . . . . . acre > hectare','x*0.40468564')",  "('x} . . . . . .mile^2 > km^2','x*2.589988')",  "('x} . . . . . . feet^2 > rood','x/10890')",  "('x}acre>sq.mi.(section)','x/640')",  "('x} . . mile^2 > township','x/36')",   "('x} . . .','')",  "('x} circular inch > sq.in.','x*Math.PI/4')",  "('x} circular mm > sq.mm','x*Math.PI/4')",  "('x} circular in. > circ.mil','x*1000000')",  "('x} circular in. > circ.mm','x*645.16')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')");   var Volume__nA = new Array("('Vol. conv. x} ft^3 > m^3','x*0.0283168')",  "('x} . . . . . feet^3 > inch^3','x*1728')",  "('x} . . . . . .inch^3 > cm^3','x*16.387064')",  "('x} . . . . .feet^3 > yard^3','x/27')",  "('x} . . .yard^3 > meter^3','x*0.764555')",  "('x} . . . .acre.ft > meter^3','x*1233.48')",  "('x} . . .','')",  "('x} gallon(US)>gal(Imp.)','x*0.83261')",  "('x} fl.oz(us) > teaspoon','x*6')",  "('x} fl.oz(us)>tablespoon','x*2')",  "('x} . fl.oz(us) > fl.oz(Brit)','x*1.04')",  "('x} .fluid oz(us) > inch^3','x*1.8')",  "('x} . .fluid oz(us) > cm^3','x*29.573')",  "('x} fluid ounce(us) >cup','x/8')",  "('x} . . .fl.oz(us) > pint(us)','x/16')",  "('x} fl.oz(us) >quart(fl.us)','x/32')",  "('x} . . . . . . fl.oz(us) > liter','x/33.8146282')",  "('x} quart(us)liquid > dry','x*0.8594')",  "('x} quart(us.liq) >gallon','x/4')",  "('x} . . . . . feet^3 > gallon','x*7.4805')",  "('x} ft^3>bushel(us.dry)','x*0.80356')",  "('x} feet^3 > bbl(us.liq)','x*0.237483')",  "('x} feet^3 > bbl(us.oil)','x*0.17811')",  "('x} feet^3 > bbl(us.dry)','x*0.2449')",  "('x} ft^3>ton(us.shipng)','x/40')",  "('x} ton(register)>m^3','x*2.8317')",  "('x} . . .','')",  "('x} . . feet^3 > board.ft','x*12')",  "('x} . ft^3 > cord(wood)','x/128')");   var Time_Ve_nA = new Array("('Time_Velocity x} hr > s','x*3600')",  "('x} . . . day > second','x*86400')",  "('x} . sec.> nanosecond','x*1e9')",  "('x}sec(sidereal)>s(solr)','x*0.9972695')",  "('x} day > day(sidereal)','x*1.0027379')",  "('x} year > yr.(sidereal)','x*0.999298')",  "('x} year > day(actual)','x*365.24')",  "('','')",  "('x} velocity: ft/s > mi/hr','x*0.68181818')",  "('x} . meter/sec > km/hr','x*3.6')",  "('x} . . . . . . mi/hr > km/hr','x*1.609344')",  "('x} . . . . . . mi/hr > knot','x*0.86898')",  "('x} . . . mi/hr > Mach no.','x/741.5444')",  "('x} C(light speed) >m/s','x*2.99792458e8')",  "('','')",  "('','')"); var Mass_Fo_nA = new Array("('Mass_Force x} lb > kg','x/2.204634')",  "('x} lb(pound.av)>lb.troy','x*1.215 //avoirdupois is common used here')",  "('x} . . . . lb > oz(avoir.)','x*16')",  "('x} . . . . lb > oz (troy)','x*14.58')",  "('x} . . lb > carat(metric)','x*2267.95')",  "('x} gram > carat(metric)','x*5')",  "('x}      gram > grain','x*15.432')",  "('','')",  "('x}pound(lb.mass)>slug','x/32.174')",  "('x} . . . . lb > grains','x*7000')",  "('x} . . lb > stone(Brit)','x/14')",  "('x} . . . . . lb > ton','x/2000')",  "('x} . . . . . lb > ton(metric)','x/2204.634')",  "('x} . . . . . lb > ton(long)','x/2240')",  "('x} . . .','')",  "('s} DEFINITION F=MA','if a=g~9.8m/sec^2, kg * g = N (Newton)')",  "('x} . . .','')",  "('x} . kg(f) > Newton','x*9.80665')",  "('x} . . kg.m/sec > N','x*1.0')",  "('x} . . . . . . . J/m > N','x*1.0')",  "('x} . . . . . .dyne > N','x/10000')",  "('x} . . . . gram(f) > dyne','x*980.665')",  "('x} . . . . . . lb(f) > N','x*4.44822')",  "('x} . . . . . . lb(f) > kip','x/1000')",  "('x} . . . . . lb(f) > poundal','x*32.174')",  "('x} . . .','')",  "('x} . . .','')"); var Pressur_nA = new Array("('Pressure x} p.s.i. > Pa','x*6894.757')",  "('x} . . N/sq.m > Pascal','x*1.0 // definition')",  "('x} . . dyne/sq.cm > Pa','x*0.1')",  "('x} . . . . . lb(f)/sq.ft > Pa','x*47.88')",  "('x} . tons/s.f. > kg/cm^2','x*0.9765')",  "('x} . . . . kg(f)/sq.m > Pa','x*9.80665')",  "('x} Newton/cm^2 > Pa','x*10000')",  "('x} . . . . . . . cm Hg > Pa','x*1333.224')",  "('x} . . . in Hg(32 F) > Pa','x*3386.38')",  "('x} . . . in Hg(60 F) > Pa','x*3376.85')",  "('x} . . .','')",  "('x} . atmosphere > Pa','x*101325')",  "('x} . . . . atm(std) > p.s.i.','x*14.69595')",  "('x} . . . . . atm(std) > bar','x*1.01325')",  "('x} . . . . . bars > Pascal','x*100000')",  "('x} . . .atm(std) > in Hg','x*29.92')",  "('x} . . atm(std) > ft.water','x*33.899')",  "('x} . . .','')",  "('x} . .','')");   var Density_nA = new Array("('Density x} p/cf >kg/m^3','x*16.02')",  "('x} . lb/gal(us) > kg/cu.m','x*119.83')",  "('x} . . g/cu.cm > kg/cu.m','x*1000')",  "('x} milligram/liter > kg/l','x*1e-6')",  "('x} megag./cu.m. > kg/l','x*1.0')",  "('x} . oz/gal(us)>kg/c.m','x*7.489')",  "('x} oz/gal(us)>oz/g(uk)','x*1.2')",  "('x} . ton/c.y. > kg/liter','x*1.18655')",  "('x} g/cu.cm > spec.grav','x*1.0')",  "('x} . . g/cc = kg/l > s.g.','x*1.0')",  "('x} . . . . . . lb/cu.ft > s.g.','x/62.428')",  "('x} . . . . . . lb/cu.in > s.g.','x/0.036127')",  "('x} . . . . . . . lb/gal > s.g.','x/8.345')",  "('x} . . .','')",  "('s} TYP. Values of S.G.','see Materials charts in this catagory.')",  "('s} . . .','')",  "('s} . . .','')",  "('s} . . .','')"); var Energy__nA = new Array("('Energy_or work s} Def.','Energy=work ~F*dist')",  "('x} . . Watt.sec > Joule','x*1.0 //definition')",  "('x} . . . . Watt.hr > Joule','x*3600')",  "('x} . . . kWatt.hr > Joule','x*3600000')",  "('x} . . . . Btu(mean) > J','x*1054.35')",  "('x} . . . . . . Btu(ISO) > J','x*1055.06')",  "('x} . . . . . . . . . ft.lb(f) > J','x*1.355818')",  "('x} . . . . . . . . . kg.m > J','x*9.80665')",  "('x} . . . . . . . . . . kCal > J','x*4186.75')",  "('x} . . . . . . . . . therm > J','x*105506000')",  "('x} . . . . . therm(us) > J','x*105480400')",  "('x} tonsTNT equiv >J','x*4200000000')",  "('x} horsepower.hr >J','x*2.6845e6')",  "('x} . . metric HP.hr > J','x*2.648e6')",  "('x} liter.atmosphere>J','x*101.33')",  "('x} . . . . . . dyne.cm > J','x/10000000')",  "('x} . . . . dyne.cm > erg','x*1.0 //definition')",  "('x} . . .','')",  "('x} . .','')");   var Power_r_nA = new Array("('Power_rate of Work s}','Power ~energy/time')",  "('x} . . . . . Watt > Btu/hr','x*3.414426')",  "('x} . . . kw > Btu/sec','x*0.9478')",  "('x} . . . kw > poncelet','x*1.02')",  "('x} . . . kw > kg.m/sec','x*102')",  "('x} . . . Watt > cal/sec','x*0.23885')",  "('x}W>candle pow(sp.)','x*53.2481363')",  "('x} . . . . . W > erg/sec','x*10000000')",  "('x} . . . W > ft.lb(f)/sec','x*0.737562')",  "('x} W > HP (550ft.lb/s)','x/745.7')",  "('x} . . . W > HP (metric)','x/735.5')",  "('x} . . . . . . . W > lumen','x*668.45')",  "('x} W > tons.refrigerat.','x/3516.9')",  "('x} tons.refrig >BTU.hr','x*1200')",  "('x} . . .','')",  "('x} . . .','')",  "('','')");   var HtRes="R =resistance to heat flow (reciprocal of conductivity). R values are added to obtain ";   HtRes +="reciprocal of overall heat transmission of a building surface, U. eg. for a frame wall: ";   HtRes +="Outside surf.15mph wind R~0.17 deg.F/Btu/hr/sf; wood siding, 1/2in.w/laps R~0.81; ";   HtRes +="Sheathing, 1/2in. asph.impreg.board R~1.32; Insulation, 4in.fiberglass R~11; Gypsum wall";   HtRes +="board R~0.45; Inside surf. still air R~0.68; ->Total R=14.43 =1/U -> U=0.0697Btu/hr.sf.F";   HtRes +=" adjust for framing:2x4 @ 16in.cts ->U*1.08 =0.075.  Heating capacity needed is then ";   HtRes +="computed from sq.ft of walls, adj. windows, doors, ceiling, etc. Apply to design temp.";   var Heat_Te_nA = new Array("('Heat_Temperature: s}','meas. of atomic kinetic energy')",  "('x}. . . C deg > F deg','9*x/5+32')",  "('x}. . . F deg > C deg','5*(x-32)/9')",  "('x}. . . C deg > K deg','x-273.15')",  "('x} . . .F deg > R deg','x-458.57')",  "('x} . . .','')",  "('x} . BTU/lb > J/kg','x*2326')",  "('x} . . cal/g > J/kg','x*4186')",  "('x} . . . C/m>W/m.C','x*1.0')",  "('x} . . .','')",  "('s} __HEAT FLOW__','rate of Heat per area')",  "('x} Watt/cm^2 >Btu/hr.sf','x*3170')",  "('x} watt/cm^2 >Btu/dy.sf','x*76081')",  "('x} w/cm^2 >cal/hr.cm^2','x*860')",  "('x} w/cm^2 > cal/s.cm^2','x*0.2388')",  "('s} _CONDUCTANCE_','=heat flow per deg.F or deg.C temperature gradient')",  "('x} w/cm^2.C>Btu/hr.sf.F','x*1761')",  "('x} w/sm.C>cal/hr.sm.C','x*860')",  "('x} w/smC>cal/s.sm.C','x*0.2388')",  "('x}Btu/hr.sf.F>W/s.sm.C','x*5.6784')",  "('x}kcal/hr.sm.C>w/sm.C','x*1.163')",  "('s}_CONDUCTIVITY, k','conductance through a thickness of material')",  "('x} w/scm(cm/C)>Btu/h..','x*57.79 // watt/cm^2(cm/C)>Btu/hr.sf(ft/F)')",  "('x} w/sm(cm/C)>cal/h...','x*860 // watt/sm(cm/C)>cal/h.sm(cm/C)')",  "('x} Btu/s.sf(in/F)>cal..','x*1.2405 // Btu/s.sf(in/F)>cal/s.cm^2(cm/C)')",  "('x}Btu/hr.sf.(in/F)>w/m.C','x*0.1442')",  "('s}_RESISTIVITY,1/k_',HtRes)",  "('x} . . .','')",  "('x} . . .','')",  "('','')"); var Light_R_nA = new Array("('Light_Rad. lux>lum./sm','x*1.0')",  "('x} . candle pow.>lumen','x*12.556')",  "('x} . . . . lumen > watt','0.001496')",  "('x} . . . . lux > ft.candle','x*0.0929')",  "('x} . ft.candle>lumen/s.f','x*0.0929')",  "('x} . . .','')",  "('x} candela/s.in>ft.lam.','x*452.389 //c./sq.inch>foot.lambert')",  "('x} candela/s.in>c./s.m','x*1550')",  "('x} . . .','')",  "('x}rayleigh>ph./sm.sec','1.0E10 //photon emission/sq.m.Second')",  "('x} roentgen>coul./kg','x*2.57976E-4')",  "('x} . . dose rad > J/kg','x/100')",  "('x} . . Rutherford > Bq','x*1000000 // disintegrations/second')",  "('x} . . curie >disinteg/s','x*3.7e10')",  "('x} . . .','')",  "('','')");     var DMStoDeg="var dg=(/*Deg*/ ); var mn=(/*min*/ ); var sc=(/*sec*/ ); /*CLICK[=]*/ ";   DMStoDeg +="m=dg + mn/60 + sc/3600; "; var AZtoBEAR="var Az=(/*Azimuth 0-deg @ N, rotate to E.(right)*/ ); /*CLICK[=]*/ ";   AZtoBEAR +="var Quad=Math.floor(Az/90); while (Quad>=4) {Quad-=4} var d=Az%90; ";   AZtoBEAR +="if (Quad==0||Quad==3) {m='N';} else {m='S';} if (Quad==1 || Quad==3) ";   AZtoBEAR +="{d=90-d} m+=Mr(d,4); if (Quad>1) {m+='W'} else {m+='E'}";   var Angular_nA = new Array("('Angular x} . . deg > rad','x*Math.PI/180')",  "('x} . . . . grad > degrees','x*360/400')",  "('x} . . . . .mils > degrees','x*360/6400 // 1/tan(grad)=1018.6 ie.~1unit wide @ 1000unit dist.')",  "('x} . . .','')",  "('x} . degrees > arc.min.','x*60')",  "('x} . degrees > arc.sec.','x*3600')",  "('x} deg,min,sec > deg.',DMStoDeg)",  "('x} . . .','')",  "('*} d.azimuth > bearing',AZtoBEAR)",  "('n} Rect.-Polar Convert',R_PCon)",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('','')"); var Electri_nA = new Array("('Elect,Magnet. EMU >F','x*1000000000')",  "('x} capacit: ESU>Farad','x*1.11265E-12')",  "('x} charge/mole>Farad','x*1.036484E-5')",  "('x} . . Amp.hr>Faraday','x/26.811639')",  "('x} . . Amp.hr>Coulomb','x*3600')",  "('x} Coulomb > Faraday','x*1.03603431E-5')",  "('x} electron.volt>Joule','1.60219e-19')",  "('x} current Amp.>EMU','x/10')",  "('x} . . . Ampere > ESU','x/3.3356E-10')",  "('x} . . . Ampere > mA','x*1000')",  "('x} . . . A > abampere','x/10')",  "('x} . . . A > statampere','x/3.33564E-10')",  "('x} micrOhm.cm>O.cm','x*1e-6 //O.cm=Ohm.cm^2/cm')",  "('x} mO>circ.mil.Ohm/ft','x*6.0153049')",  "('x} mO>mOhm.in^2/in','x/2.54')",  "('','')",  "('x} induct: Henry>ESU','x/8.987554E11')",  "('x} . . . . . Henry > EMU','x/1.0E-9')",  "('x} m.fild:A/m>Oersted','x/79.5775')",  "('x} mmf: A.turn >gilbert','x*1.256637')",  "('x} . . .','')",  "('x} . . . gauss > tesla','x*1e-4')",  "('x} . maxwell > webber','x*1e-8')",  "('x} unit.pole>maxwell','x*12.5664')",  "('','')"); var MscKCode="n[0]='_key_below_'; n[10]='_unicode_no_'; for (j=1;j<10;j++){n[j+10]=n[j].charCodeAt(0)}";   var Misc_Un_nA = new Array("('Misc_Units each >doz.','x/12')",  "('x} . bytes > kilobyte','x/1024')",  "('x} . each > score','x/20')",  "('x} . each > gross','x/144')",  "('x} each > ream(paper)','x/500')",  "('x} . . .','')",  "('n} Key > char code',MscKCode)",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('','')"); var GrabNval="function GrabN(s){for (j=10;j<20;j++){n[j]=s[j-10]}} var j=n[1]; "; //fill s-array to n[10..20] var MatP="/* Material Properties are given in tables: Select->[JS]->[=]. Descriptors prefixed by * have ";   MatP +="additional beyond-cell info. [c]->[nx]->[n?] display in full in x-display.  Same process to ";   MatP +="transfer data from the n-cell to manipulate/convert units/apply in the x-display.*/";  var Mat0=GrabNval+" n[0]='*__Material__characteristics can be highly variable, especially those that ";   Mat0 +="absorb water, eg. stone agg. & wood '; "+MatP;   Mat0 +="n[1]='*Specific Grav. water based: S.G =1 =1kg/liter =1g/cc =62.4lb/c.f =8.34lb/gal'; ";   Mat0 +="n[2]='atom.No/wt if an element'; n[3]='melt/boil C.deg'; n[4]='*therm.conductivity, ";   Mat0 +="water @20deg.C std. =0.346 Btu/hr.sf(deg.F/ft) =4.15 Btu/hr.sf.(deg.F/in) ";   Mat0 +="=0.006 Watt/cm.deg.C =0.00143 cal/sec.cm2(deg.C/cm) =1/R'; ";   Mat0 +="n[5]='*Specific Heat water std. =1Btu/lb.deg.F =1cal/g.deg.C =4186.8J/kg.C =1.163watt.h/kg.C'; ";   Mat0 +="n[6]='*coef.lin.expansion*E6 per deg.C eg. L1=L0*(1+coeff*(deg.C1-deg.C0))'; ";   Mat0 +="n[7]='*sound.speed m/sec'; n[8]='*Strength: tensile/yield/Mod of Elast, all kips/s.in'; ";   Mat0 +="n[9]='*electrical resistivity, ohm.cir.mil/ft =0.1662426 microhm.cm =0.06545 mOhm.in'; s =new Array"; var MAcou=Mat0+"('Acoustic Tile',0.4,'','',0.1,'','','1600','',''); GrabN(s);"; var MAir =Mat0+"('Air @ STP',0.00125,'N2%78,O2%21-,A%1-,CO2%.03,etc','',0.04,'','',340,'',''); GrabN(s);"; var MAlum=Mat0+"('Aluminum',2.65,'Al 13/26.98','660/2467',368,0.226,23.8,16400,'13-24/5-22/10E3',18); GrabN(s);"; var MAsph=Mat0+"('Asphalt, Tar',1.3,'','',1.23,0.22,'','','',''); GrabN(s);"; var MBras=Mat0+"('Brass(.7Cu,.3Zn)',8.53,'','',210,0.0917,18.7,11400,'53/20/16E3',42); GrabN(s);"; var MBron=Mat0+"('Bronze(.9Cu,.1Zn)',8.6,'','',49,0.086,27,1250,'61/54/17E3',65); GrabN(s);"; var MBric=Mat0+"('Brick',1.9,'','',1.15,0.2,9.5,12000,'',''); GrabN(s);"; var MCast=Mat0+"('Cast Iron',7.6,'Fe 26/55.85','1535/2750',79.3,0.119,79.3,16900,'25+//13E3',60); GrabN(s);"; var MCCok=Mat0+"('Coal -coke',1.2,'','',1.6,0.36,'','','',''); GrabN(s);"; var MCChr=Mat0+"(' -charcoal',2.4,'','',0.09,0.2,'','','',''); GrabN(s);"; var MCCin=Mat0+"(' -cinders',0.7,'','','','','','','',''); GrabN(s);"; var MCBit=Mat0+"(' -bituminous',1.35,'','',0.25,0.201,'','','',''); GrabN(s);"; var MCAnt=Mat0+"(' -anthracite',1.55,'','','','','','','',''); GrabN(s);"; var MCCLt=Mat0+"('Concrete, lite',1.6,'','',0.22,'','','','',''); GrabN(s);"; var MCHol=Mat0+"('Conc, hollow core',1.55,'','',0.86,'','','','',''); GrabN(s);"; var MCPla=Mat0+"('Conc, plain',2.3,'','',1.56,0.271,'','','0.55//',''); GrabN(s);"; var MCRen=Mat0+"('Conc, reinforced',2.4,'','','','','','','',''); GrabN(s);"; var MCopp=Mat0+"('Copper',8.9,'Cu 29/63.55','1083/2567',562,0.093,16.8,12500,'30-60//17E3',10.3); GrabN(s);"; var MCork=Mat0+"('Cork',0.24,'','',0.04,0.485,'',1640,'',''); GrabN(s);"; var MCorn=Mat0+"('Corn',0.7,'','','','','','','',''); GrabN(s);"; var MCotH=Mat0+"('Cotton; Hemp',1.5,'','',0.04,0.362,'','','',''); GrabN(s);"; var MEaDL=Mat0+"('Earth:dry loose',1.2,'','',0.3,'','','','',''); GrabN(s);"; var MEaMP=Mat0+"('Earth:moist pack',1.6,'','',2.5,'','','','',''); GrabN(s);"; var MEaSG=Mat0+"(' . Sand; Gravel',1.9,'','',1.5,'','','','',''); GrabN(s);"; var MFlOa=Mat0+"('Flour; Oats',0.5,'','','','','','','',''); GrabN(s);"; var MGaso=Mat0+"('Gasoline',0.7,'','',0.2,0.5,'','','',''); GrabN(s);"; var MGold=Mat0+"('Gold',9.3,'Au 79/196.97','1064/2808',494,0.0321,14.3,6660,'17.5-30//10.8E3',14.7); GrabN(s);"; var MGlFl=Mat0+"('Glass: flint',3.8,'','',1.7,0.18,7.88,12200,'',''); GrabN(s);"; var MGlSi=Mat0+"('Glass: silica',2.2,'','',1.7,0.18,'',18900,'',''); GrabN(s);"; var MGyps=Mat0+"('Gypsum',0.9,'','',0.72,0.26,'','','',''); GrabN(s);"; var MHayB=Mat0+"('Hay, baled',0.3,'','','','','','','',''); GrabN(s);"; var MInsB=Mat0+"('Insulation, bat',0.1,'','',0.07,0.16,'','','',''); GrabN(s);"; var MInsR=Mat0+"('Insul, rigid board',0.3,'','',0.09,0.3,'','','',''); GrabN(s);"; var MLead=Mat0+"('Lead',11.4,'Pb 82/207.2','327.5/1740',58,0.0297,29.4,3900,'3/2/2E3',124); GrabN(s);"; var MMerc=Mat0+"('Mercury',13.6,'Hg 80/200.59','-38.9/356.6',13.9,0.0331,'',4750,'0','576'); GrabN(s);"; var MOil=Mat0+"('Oil (variable)',0.9,'','','','','','','',''); GrabN(s);"; var MPlsr=Mat0+"('Plaster',1.6,'','',1.24,'','','','',''); GrabN(s);"; var MPlLu=Mat0+"('Plastic-lucite',1.18,'','','','','',6000,'',''); GrabN(s);"; var MPlPs=Mat0+"('Plastic-polystyrene',1.06,'','','','','',7350,'7/5E3',''); GrabN(s);"; var MPlNe=Mat0+"('Plastic-neoprene',1.33,'','','','','','','',''); GrabN(s);"; var MSilv=Mat0+"('Silver',10.5,'Ag 47/107.87','961.9/2212',705,0.056,18.8,8790,'23-43/12-38/10.5E3',9.8); GrabN(s);"; var MStel=Mat0+"('Steel',7.9,'','',75,0.118,13.6,'16800','60/36-60/30E3','60-600'); GrabN(s);"; var MSton=Mat0+"('Stone s.g.x0.8 if crushed','','','','','','','','',''); GrabN(s);"; var MStSa=Mat0+"('Stone, sand',2.3,'','','','','0.5 fused quartz','','',''); GrabN(s);"; var MStLi=Mat0+"('Stone, lime',2.5,'','',1.6,0.2,'','','',''); GrabN(s);"; var MStGr=Mat0+"('Stone, granite',2.65,'','',3.2-6,0.191,8.3,1250,'',''); GrabN(s);"; var MStIO=Mat0+"('Stone, iron ore',5.2,'','','','','','','',''); GrabN(s);"; var MTiCl=Mat0+"('Tile:shingles,clay',1.3,'','','',0.22,'',11400,'',''); GrabN(s);"; var MTiAA=Mat0+"('Tile:asphalt/agg',1.5,'','',0.3,0.35,'','','',''); GrabN(s);"; var MTiMa=Mat0+"('Tile: marble',2.7,'','',4.3,0.206,1-15,1250,'',''); GrabN(s);"; var MTin=Mat0+"('Tin',7.36,'Sn 50/118.71','232/2270',108,0.0556,26.9,9000,'4//6E3',66); GrabN(s);"; var MWatr=Mat0+"('Water, 4-degC',1.00,'','',1.00,1.00,'',4915,'',''); GrabN(s);"; var MWSea=Mat0+"('Water, Sea','1.03','','','','','','','',''); GrabN(s);"; var MWIce=Mat0+"('Water, Ice',0.9,'','',2.8,0.505,51,'','',''); GrabN(s);"; var MWdCe=Mat0+"('Wood: Cedar',0.35,'','','','','','','.4-.7/.7-1/750',''); GrabN(s);"; var MWdPS=Mat0+"('Wood: pine,spruce',0.45,'','',0.18,0.67,'','','.4-.7/.8-1.2/1.1e3',''); GrabN(s);"; var MWdMW=Mat0+"('Wood: maple,walnut',0.6,'','','0.22-.29','0.45-.65',6.58,13500,'',''); GrabN(s);"; var MWdPl=Mat0+"('Wood: plywood',0.6,'','',0.23,'','','','/1.2-2/.9-1.8e3',''); GrabN(s);"; var MWdYR=Mat0+"('Wood: yel.pine,red.oak',0.65,'','',0.31,'','','','.8-1.2/1-1.8/1.7e3',''); GrabN(s);"; var MWdWO=Mat0+"('Wood: white oak',0.77,'','',0.31,'','',12600,'',''); GrabN(s);"; var MZinc=Mat0+"('Zinc',7.2,'Zn 30/65.39','419.6/907',187,0.095,26.3,12600,'10//',36.6); GrabN(s);"; var Materia_nA = new Array("('Materials, Elements s}',MatP)",  "('x} . . .','')",  "('s} . Acoustic Tile',MAcou)",  "('s} . Air @ STP',MAir)",  "('s} . Aluminum',MAlum)",  "('s} . Asphalt, Tar',MAsph)",  "('s} . Brass(.7Cu,.3Zn)',MBras)",  "('s} . Bronze(.9Cu,.1Zn)',MBron)",  "('s} . Brick',MBric)",  "('s} . Cast Iron',MCast)",  "('s} . Coal-coke',MCCok)",  "('s} . . -charcoal',MCChr)",  "('s} . . -cinders',MCCin)",  "('s} . . -bituminous',MCBit)",  "('s} . . -anthracite',MCAnt)",  "('s} . Concrete-lite',MCCLt)",  "('s} . . -hollow core',MCHol)",  "('s} . . -plain',MCPla)",  "('s} . . -reinforced',MCRen)",  "('s} . Copper',MCopp)",  "('s} . Cork',MCork)",  "('s} . Corn',MCorn)",  "('s} . Cotton, Hemp',MCotH)",  "('s} . Earth-dry,loose',MEaDL)",  "('s} . . -moist,pack',MEaMP)",  "('s} . . -sand,gravel',MEaSG)",  "('s} . Flour, Oats',MFlOa)",  "('s} . Gasoline',MGaso)",  "('s} . Gold',MGold)",  "('s} . Glass-flint',MGlFl)",  "('s} . . -silica',MGlSi)",  "('s} . Gypsum',MGyps)",  "('s} . Hay, baled',MHayB)",  "('s} . Insulation-bat',MInsB)",  "('s} . . -rigid board',MInsR)",  "('s} . Lead',MLead)",  "('s} . Mercury',MMerc)",  "('s} . Oil (var)',MOil)",  "('s} . Plaster',MPlsr)",  "('s} . Plastic-lucite',MPlLu)",  "('s} . . -polyethylene',MPlPs)",  "('s} . . -neoprene',MPlNe)",  "('s} . Silver',MSilv)",  "('s} . Steel',MStel)",  "('s} . Stone x.8 crushed',MSton)",  "('s} . . -sandstone',MStSa)",  "('s} . . -limestone',MStLi)",  "('s} . . -granite',MStGr)",  "('s} . . -iron ore',MStIO)",  "('s} . Tile-shingles, clay',MTiCl)",  "('s} . . -asphalt,aggreg.',MTiAA)",  "('s} . . -marble',MTiMa)",  "('s} . Tin',MTin)",  "('s} . Water',MWatr)",  "('s} . . -seawater',MWSea)",  "('s} . . -ice',MWIce)",  "('s} . Wood-cedar',MWdCe)",  "('s} . . -pine,spruce',MWdPS)",  "('s} . . -maple,walnut',MWdMW)",  "('s} . . -plywood',MWdPl)",  "('s} . . -yel.pine, red oak',MWdYR)",  "('s} . . -white oak',MWdWO)",  "('s} . Zinc',MZinc)",  "('s} . . .','')",  "('s} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('','')"); var Math_Sc_nA = new Array("('Math_Science s} . Pi .','Math.PI')",  "('Nat.Log base, e','Math.E')",  "('common log (10) of e','Math.LOG10E')",  "('Euler constant','0.5772156649')",  "('Golden ratio','1.61803398875')",  "('','')",  "('Unified AMU, g','1.66053873E-24')",   "('hydrogen atom mass','1.67339E-24 // g')",  "('electron mass, g','9.10938188E-28')",  "('proton mass, g','1.67262158E-24')",  "('','')",  "('Avagadro No./mole','6.02214199E23')",  "('pres.vol of gas','2271.16 // joules/mole at 0C & 0 pressure')",   "('mole vol,ideal gas,stp','0.022413996 //m^3/mol')",  "('','')",  "('Boltzmann con, J/K','1.3806503E-23')",  "('Faraday, coulomb','96484.6')",  "('Fermi coupling con,','1.16639E-5 // Ge/v^2')",  "('Gravitational con,','6.673E-11 // m^3/kg/s^2')",  "('std.accel.Grav, m/s^2','9.80665')",  "('permiability of space,','8.854187817E-12 //N/A^2')",  "('permitivity of space,','1.2566370614E-6 //F/m')",  "('Plank constant, J.s','6.62606876E-34')",  "('Stefan-Boltzmann,','5.6704E-8 // W/m^2/K')",  "('Wien displac.law con,','0.0028977686 // m K')",  "('strong coupling con,','0.1185')",  "('weak mixing angle','0.23117')",  "('W boson mass,','80.419 // Ge/v^2')",  "('Z boson mass,','91.1882 // Ge/v^2')",  "('','')",  "('sound speed, air, m/s','340')",  "('light speed c, m/sec','299792458')",  "('light speed c, mi./sec','186300')");   var Geo_Phy_nA = new Array("('Geo_Physical cnst. s}','Earth characteristics')",  "('s} . . Earth mass, kg','5.97E24')",  "('s} radius @Equator,km','6378.388')",  "('s} radius @ Poles, km','6356..912')",  "('s} mean density, g/cc','5.522')",  "('s} atmos. press, bars','1.013')",  "('s} . . .','')",  "('x} deg.latitude>naut.mi','x*60')",  "('x} naut.mile > stat. mi','x*1.15078 //=1852 m =6076.115 ft')",  "('*} deg.longitude, n.mi.','Math.cos((/*lat.deg*/ )*Math.PI/180)*60')",  "('x} deg.longitude > hour','x/15')",  "('s} . . .','')",  "('s} inclin. to axis, deg','23.45')",  "('s} rotation period, hrs','23.9')",  "('s} revolution per., day','365.26')",  "('s} avg. orbit vel, mi/s','18.46')",  "('s} escape vel, mi/sec','6.96')",  "('s} . . .','')",  "('s} avg.dist.to Sun, mi','92960000')");       var Prefixe_nA = new Array("('Prefixes to Units s}','names for powers')",  "('s} . . .yotta- Y','1E24')",  "('s} . . .zetta- Z','1E21')",  "('s} . . .exa-   E','1E18')",  "('s} . . .peta-  P','1E15')",  "('s} . . .tera-  T','1E12')",  "('s} . . .giga-  G','1E9')",  "('s} . . .mega- M','1E6')",  "('s} . . .kilo-  k','1E3')",  "('s} . . .hecto- h','1E2')",  "('s} . . .deka- da','1E1')",  "('s} . -no prefix','1')",  "('s} . . .deci-  d','1E-1')",  "('s} . . .centi- c','1E-2')",  "('s} . . .milli- m','1E-3')",  "('s} . . micro- mu','1E-6')",  "('s} . . .nano-  n','1E-9')",  "('s} . . .pico-  p','1E-12')",  "('s} . . .femto- f','1E-15')",  "('s} . . .atto-  a','1E-18')",  "('s} . . .zepto- z','1E-21')",  "('s} . . .yocto- y','1E-24')");   var dec_bin="var j=(/*start No.*/ ); for(i=j;i<j+20;i++){n[i-j]=i+', '+i.toString(2)}"; var dec_oct="var j=(/*start No.*/ ); for(i=j;i<j+20;i++){n[i-j]=i+' octal,'+i.toString(8)}";  var ASCIIhex="var j=(/*start No.*/ ); for(i=j;i<j+20;i++){var k=i.toString(16); ";   ASCIIhex +="n[i-j]=i+' hex,'+k+' .'+unescape('%'+k)}"; var dec_bse="var j=(/*start No.*/ ); var k=(/*2 to 36: base:*/ ); for(i=j;i<j+20;i++) ";   dec_bse +="{n[i-j]=i+' b'+k+','+i.toString(k)}"; var CharSin="var j=(/*SIN deg.start*/ ); var k=(/*deg.increm.*/5 ); for(i=0;i<20;i++) ";   CharSin +="{n[i]='sin('+(j+i*k)/1+')='+Math.sin((j+i*k)*Math.PI/180)};"; var CharCos="var j=(/*COS deg.start*/ ); var k=(/*deg.increm.*/5 ); for(i=0;i<20;i++) ";   CharCos +="{n[i]='cs('+(j+i*k)/1+')='+Math.cos((j+i*k)*Math.PI/180)};"; var CharTan="var j=(/*TAN deg.start*/ ); var k=(/*deg.increm.*/5 ); for(i=0;i<20;i++) ";   CharTan +="{n[i]='tan('+(j+i*k)/1+')='+Math.tan((j+i*k)*Math.PI/180)};"; var CharLn="var j=(/*LN start*/ ); var k=(/*increm.*/1 ); for(i=0;i<20;i++) ";   CharLn +="{n[i]='ln('+(j+i*k)/1+')='+Math.log(j+i*k)};"; var CharLog="var j=(/*LOG start*/ ); var k=(/*increm.*/1 ); for(i=0;i<20;i++) ";   CharLog +="{n[i]='log('+(j+i*k)/1+')='+Math.log(j+i*k)*Math.LOG10E};"; var ChaRoot="var j=(/*SQUARE ROOT start*/ ); var k=(/*increm.*/1 ); for(i=0;i<20;i++) ";   ChaRoot +="{n[i]='sr('+(j+i*k)/1+')='+Math.sqrt(j+i*k)};"; var CharPow="var j=(/*POWER base start*/ ); var ex=(/*exponent*/ ); var k=(/*increm.*/1 ); ";   CharPow +="for(i=0;i<20;i++) {n[i]=(j+i*k)/1+'p'+ex+'='+Math.pow(j+i*k,ex)};"; var CharFac="var k=(/*FACTORIAL start*/ ); for (j=k;j<20;j++) {n[j-k]=j+'!='+fact(j)};";  var Charts__nA = new Array("('Charts_Series, misc. s}','various series, display in n[]')",  "('*} . . decimal, binary',dec_bin)",  "('*} . . decimal, octal',dec_oct)",  "('*} . . dec, hex, ASCII',ASCIIhex)",  "('*} . . dec, spec. base',dec_bse)",  "(' . . .','')",  "('*} . . Sine function',CharSin)",  "('*} . . Cosine function',CharCos)",  "('*} . . Tangent function',CharTan)",  "('*} . . natural log(e)',CharLn)",  "('*} . . common log(10)',CharLog)",  "('*} . . square roots',ChaRoot)",  "('*} . . power function',CharPow)",  "(' . . .','')",  "('*} . . factorial',CharFac)",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('','')");       // *************** Catagory 2: default sel. of ordinary math functions **************   var Ordinar_nA =  new Array("('Ordinary Math x}. (x)^2','Math.pow(x,2)')",  "('x} . . factorial . . . x! ','fact(x) //pos integer assumed; Source in upper area of code.')",  "('(opp/hyp, deg.) . sin(x)','Math.sin(x*Math.PI/180)')",  "('(adj/hyp, deg.) . cos(x)','Math.cos(x*Math.PI/180)')",  "('(opp/adj, deg.) . tan(x)','Math.tan(x*Math.PI/180)')",  "('x} . degrees > radians','Math.PI/180 *x')",  "('*} Pythagorean hyp.','m=Math.sqrt(Math.pow((/*side1*/ ),2)+Math.pow((/*side2*/ ),2))')",  "('*} Pythagorean side','m=Math.sqrt(Math.pow((/*hyp*/ ),2)-Math.pow((/*side*/ ),2))')",  "('','')",  "('(for deg.) .  .  arc sin(x)','Math.asin(x)*180/Math.PI')",  "('(for deg.) .  .arc cos(x)','Math.acos(x)*180/Math.PI')",  "('(for deg.) .  .  arc tan(x)','Math.atan(x)*180/Math.PI')",  "('','')",  "(' . . natural log (base e)','Math.log(x)')",  "('exponentiation: . . e^x','Math.exp(x)')",  "(' common log (bse 10)','Math.log(x)*Math.LOG10E')",  "('anti-log(common)10^x','Math.pow(10,x)')",  "('','')",  "('','')",  "('','')",  "('*} Count Down Timer',TimCntDn)",  // source code with Time_Functions  "('to 4-dec.places: round','Math.round(x*10000)/10000')",  "('>Random Num. (0 - 1)','Math.random()')"); var Fj1_20 = "for (j=1; j<20; j++)"; //used for series expansions, eg. JavaScript w/o 'Math.'fcns var sinX="var i=1; var k=-1; var l=x; m=x; "+Fj1_20+"{i+=2; l=l*x*x; k=-k; m=m-l/(fact(i)*k)}";  // sin(x) =x -x^3/3! +x^5/5! -x^7/7! +...; x in radians, code convoluted to prevent string concatination.  var cosX="x=3.14159265359/2-x; "+sinX; var atnX="var i=1; var k=-1; if (x*x<1) {m=x; var l=x; "+Fj1_20+" {l*=x*x; i+=2; k=-k; m=m-k*l/i}}";  // for x^2<1: atan(x) =x -x^3/3 +x^5/5 -x^7/7 +...    atnX +=" else {i=-1; var l=1/x; var m=3.14159265359/2; "+Fj1_20+" {k=-k; l*=x*x; i+=2; m=m-k/(l*i)}";  // for x>1: atan(x) =PI/2 +series{-1/x +1/3x^2 -1/5x^5 +...}; if x<-1: atan(x) = -PI/2 +series.   atnX +=" if (x<-1){m=m-3.14159265359}}"; var lnX ="var a=(x-1)/(x/1+1); var i=1; var k=a; m=a; "+Fj1_20+"{i+=2; k=k*a*a; m+=k/i} m*=2";  // ln(x) =2*(a +a^3/3 +a^5/5 +...)  // limitations on series lnX: very good for small x, tho 0.03% error by x=8, and increasing var expX="var i=1; var k=1; m=1; "+Fj1_20+"{k*=x; i*=j; m+=k/i}"; // e^x =1 +x +x^2/2! +x^3/3! +...  // limitations on series expX: very good for small x, tho 0.03% error by x=15, & increasing  // note: power function x^y coded as exp(ln(x)*y); convert to common logs to avoid limitations?   var Esoteri_nA =  new Array("('Esoteric Math *}. (x)^y','Math.pow(x,y)')",  "('(opp/hyp, rad.) . sin(x)','Math.sin(x)')",  "('(adj/hyp, rad.) . cos(x)','Math.cos(x)')",  "('(opp/adj, rad.) . tan(x)','Math.tan(x)')",  "('*} Pythagorean hyp.','m=Math.sqrt(Math.pow((/*side1*/ ),2)+Math.pow((/*side2*/ ),2))')",  "('*} Pythagorean side','m=Math.sqrt(Math.pow((/*hyp*/ ),2)-Math.pow((/*side*/ ),2))')",  "('x} 3.14159265359 = PI','Math.PI')",  "('s} reciprocal functions','csc=1/sin; sec=1/sin; cot=1/tan=cos/sin')",  "('s} . . general triangles','a+b+c=180=Math.PI //deg or radians; note-A is side opp. angle a')",  "('s} . . . . . . . law of sines','A/Math.sin(a) = B/Math.sin(b) = C/Math.sin(c)')",  "('s} . . . . law of cosines','A*A = B*B + C*C -2BC*cos(a); B*B = A*A + C*C -2AC*cos(b); etc')",  "('s} . . . .law of tangents','(A-B)/(A+B) = tan((a-b)/2)/tan((a+b)/2); etc')",  "('','')",  "('x} sin(x) ser.expans.',sinX)",  "('x} cos(x) = sin(PI/2 -x)',cosX)",  "('s} tan(x) = sin/cos','if Math not avail, code sinX & cosX, then do division')",  "('','')",  "('x} . degrees > radians','Math.PI/180 *x')",  "('x}(for rad.)  .  arc sin(x)','Math.asin(x)')",  "('x}(for rad.)  .arc cos(x)','Math.acos(x)')",  "('x}(for rad.)  .  arc tan(x)','Math.atan(x)')",  "('','')",  "('x} atan(x) ser.expans.',atnX)",  "('x} (from atan) asin(x)','x=x/Math.sqrt(1-x*x); '+atnX)",  "('s} (from asin) acos(x)','PI/2-asin(x)')",  "(' . . . . ','')",  "('x}Hyperbolic . sinh(x)','(Math.exp(x)-Math.exp(-x))/2')",  "('x} . . . . . . . . . . . . cosh(x)','(Math.exp(x)+Math.exp(-x))/2')",  "('x} . . . . . . . . . . . . tanh(x)','(Math.exp(x)-Math.exp(-x))/(Math.exp(x)+Math.exp(-x))')",  "('s} reciprocal functions','csch=1/sinh; sech=1/cosh; coth=1/tanh=cosh/sinh')",  "('','')",  "('x} . . . . . . . arc sinh(x)','Math.log(x/1+Math.sqrt(x*x+1))')",  "('x} . . . . . . . arc cosh(x)','Math.log(x/1+Math.sqrt(x*x-1))')",  "('x} . . . . . . . arc tanh(x)','Math.log((1+x/1)/(1-x/1))/2')",  "('','')",  "('x} natural log (base e)','Math.log(x)')",  "('x}<8,ln(x): ser. expans.',lnX)",  "('x} exponentiation: e^x','Math.exp(x)')",  "('x}<15,e^x: ser. expans',expX)",  "('','')",  "('','')",  "('','')",  "('','')");   var QuadEq="/*[-b +/-sqrt(bb-4ac)]/2a =roots*/ n[1]='Quadratic eq'; n[11]='axx+bx+c=0'; n[0]='';";   QuadEq +=" n[12]='- - data'; n[10]=''; n[2]=''; n[3]='coeff. . a . . <'; n[4]='coeff. . ";   QuadEq +="b . . <'; n[5]='coeff. . c . . <'; n[16]=' - output -'; n[6]=''; n[7]=' =  = x = =>';";   QuadEq +=" n[8]=' = = or x =>'; var sr=Math.sqrt(n[14]*n[14]-4*n[13]*n[15]); ";   QuadEq +="n[17]=(-n[14]+sr)/(2*n[13]); n[18]=(-n[14]-sr)/(2*n[13]); n[9]=''; n[19]='';";   var Algebra_nA = new Array("('Algebra . . . . . s} . terms','definitions & laws:')",  "('s} addition, subtraction','a+0 = a; a+b = b+a; a-b = -(b-a); a+(-a)=0')",  "('s} . . multiplication','ab = ba; 0*a=0; c(ab)=abc; c(a+b)=ca+cb; a(-b)=-ab; (-a)(-b)=ab')",  "('s} . . . . . . . division','a/b = 1/(b/a); a*(1/a)=1; (a/b)(b/a)=1')",  "('s} . . . . . . powers I','a^2 = aa; a^1=a; a^0=1; (a^x)(a^y)=a^(x+y); (ab)^x=(a^x)(b^x)')",  "('s} . . . . . .powers II','a^(-x) = 1/a^x; a^(1/x)=xth root of a; (a^x)^y=a^(xy)')",  "('s} . . . . . powers III','(a+x)^2 = a^2 +2ax + x^2; (a-x)^2 = a^2 -2ax +x^2')",  "('s} . . . . . powers IV','(a+b)^3 = a^3 +3ba^2 +3ab^2 +b^3')",  "('s} . . common logs','(base 10): let x=10^a, then log(x)=a; operates like natural logs')",  "('s} . Napierian logs','(base e): let x=e^a, then ln(x)=a; operates like common logs')",  "('s} . . . logarithms I','ln(xy)=ln(x)+ln(y); ln(1/x)=-ln(x); ln(x/y)=ln(x)-ln(y)')",  "('s} . . .logarithms II','ln(x^y)=y*ln(x); ln(x)=log(x)/log(e); log(x)=ln(x)/ln(10)')",  "('s} . . logarithms III','log(10)=1; log(1)=0; e^a = EXP(a)')",  "('s} . . . proportions','if a:b :: c:d or a/b=c/d, then ad=bc, a=bc/d, & (a+b)/b=(c+d)/d')",  "('s} . . .','')",  "('x} . . factorial . . . . x! ','fact(x)')",  "('s} . . .','')",  "('n} quadratic equation',QuadEq)",  "('','')"); var RectCo="Axes x_ (abscissa), y| (ordinate), [& z/ if 3-dim.] at right angles. A point ";   RectCo +="is located by (x,y[,z]) where +x is right of origin (intersection), +y is above."; var PoleCo="Point located by (r,a) where r is dist. from origin, a is angle /_ measured from ";   PoleCo +="x-direction: + if counter-clockwise, toward the +y-direction."; var R_PCon="/*eg. from origin O(0,0) to rectang.coord. point P(3,4) -> r=5, a.deg=53.1;  ";   R_PCon +="the polar point of r=6, a.deg=30, gives the rectang.point x,y P(5.2,3).*/ ";   R_PCon +="n[0]='Rectangular'; n[10]='->_to_Polar_'; n[1]='. . . x . . <'; n[2]='. . . y . . <';";   R_PCon +=" n[3]=' = = r = = >'; n[4]=' = a deg >'; n[14]=Math.atan(n[12]/n[11])*180/Math.PI; ";   R_PCon +="n[13]=Math.sqrt(n[11]*n[11]+n[12]*n[12]); n[5]='__Polar__->'; n[15]='__Rectang__'; ";   R_PCon +="n[6]='. . . r . . <'; n[7]=' . a deg . <'; n[8]=' = = x = = >'; n[9]=' = = y = = >'; ";   R_PCon +="n[18]=n[16]*Math.cos(n[17]*Math.PI/180); n[19]=n[16]*Math.sin(n[17]*Math.PI/180);"; var AnLine="2 points: (x1,y1) & (x2,y2): Dist, d=sqrt((x2-x1)^2+(y2-y1)^2); midpoint between=";   AnLine +="([x1+x2]/2,[y1+y2]/2); slope of line, a to x-axis =tan(a) =m =(y2-y1)/(x2-x1); ";   AnLine +="slope.intercept eq. of line: y=mx+b; Lines parallel if m1=m2, perpendicular if m1=-1/m2."; var EqLine="/*eg. P1(3,7), P2(5,17) -> P1-P2 dist.=10.2; line y =5x-8.*/ ";   EqLine +="n[0]='Point 1, x1 <'; n[1]=' . . . . . . . .y1<'; n[2]='Point 2, x2 <'; n[3]=";   EqLine +="' . . . . . . . y2 <'; var dx=n[12]-n[10]; var dy=n[13]-n[11]; n[4]='P1-P2 dist >';";   EqLine +=" n[14]=Math.sqrt(dx*dx+dy*dy); n[5]='line_equation'; n[15]='y = mx +b'; ";   EqLine +=" n[6]='. . slope, m >'; n[16]=dy/dx; n[7]='y-intercpt, b>'; n[17]=n[11]-n[16]*n[10]; ";   EqLine +="n[8]='give X (-> y)'; n[18]='give Y (<- x)'; if (n[9]=='') {n[9]=(n[19]-n[17])/n[16]} ";   EqLine +="else {n[19]=n[16]*n[9]+n[17]/1} //NOTE default is x solves y, clear x to solve from y"; var AnCirc="gen. eq. Rect.: sq(x-Cx)+sq(y-Cy)=sq(r), where (Cx,Cy)=center of circle, r=radius. ";   AnCirc +="Polar Coord: sq(r)+sq(Cr)-2r*Cr*cos(a-Ca), where (Cr,Ca)=ctr.of circle. Special case";   AnCirc +=" if Origin (0,0)=center: sq(x)+sq(y)=sq(r); polar: r=numeric value of radius."; var AnConi="Locus of points, a constant ratio (eccentricity,e) of dist. from a point (focus,F) ";   AnConi +="and from a line (directrix,D). If d=dist.F-D: sq(x)+sq(y)=sq(e)sq(d-x); r=de/(1-e*cos(a))";   AnConi +=". The Conic =Ellipse if e<1; =Parabola if e=1; =Hyperbola if e>1."; var AnEllip="Conic e<1: sq(x-Ex)/sq(Sx)+sq(y-Ey)/sq(Sy)=1, where center=(Ex,Ey), Sx & Sy are ";   AnEllip +="semi-axes in x- & y-directions respectively, & as spec. cond. parallel || to axes."; var AnHyper="Conic e>1: sq((x-Ix)/b)-sq((y-Iy)/c)=1, (Ix,Iy)=intersection of asymptotes."; var PCurv="/*eg. if P1(1,1), P2(7,3), P3(13,11) -> equation: y = 0.0833xx -0.33x +1.25*/ ";   PCurv +="n[0]='2-d polynomial'; n[10]='axx+bx+c=y'; n[1]='x: input_pairs'; n[11]='y:_3_points_'; ";   PCurv +="n[5]='Coefficients>'; var A=(n[14]-n[12]-(n[13]-n[12])*(n[4]-n[2])/(n[3]-n[2]))/";   PCurv +="(n[4]*n[4]-n[2]*n[2]-(n[3]*n[3]-n[2]*n[2])*(n[4]-n[2])/(n[3]-n[2])); n[15]='a='+A; ";   PCurv +="var B=(n[13]-n[12]-A*(n[3]*n[3]-n[2]*n[2]))/(n[3]-n[2]); n[6]='b='+B; n[17]=''; ";   PCurv +="var C=n[12]-A*n[2]*n[2]-B*n[2]; n[16]='c='+C; n[7]=''; n[8]='enter_x_:_'; ";   PCurv +="n[18]='y:_computed'; n[19]=A*n[9]*n[9]+B*n[9]+C; // enter x=2 per eg. -> y=0.916"; var mRegres="/*eg. P1(1,1), P2(7,3) -> y=1*pow(x,0.565); if x=2 -> y=1.48*/ ";   mRegres +="n[0]='Regres.form'; n[10]='A*pow(x,B)=y'; n[1]='x: input_pairs'; n[11]='y:_2_points_';";   mRegres +=" n[4]='Coefficients>'; function L(v){return Math.log(v)} var x1=L(n[2]); ";   mRegres +="var y1=L(n[12]); var x2=L(n[3]); var y2=L(n[13]); var B=(y2-y1)/(x2-x1); ";   mRegres +="var A=Math.exp(y1-B*x1); n[4]='Coefficients>'; n[14]='A='+A; n[15]='B='+B; ";   mRegres +="n[7]='enter_x_:_'; n[17]='y:_computed'; n[18]='>y='+A*Math.pow(n[8],B)"; var nRegres="/* form A*pow(x1,B)*pow(x12,C)=y: 3-point enter for 3-unk. Each point has 2 x-";   nRegres +="var: input x1 to n0, x12 to n1, y1 to n11; similarly x2 to n2, x22 to n3, etc. ";   nRegres +="eg. (see Civil-hydrology) 1-acre sloping 3% -> Q2 =1.4cfs; 10ac @2% -> Q2 = 7.1cfs; ";   nRegres +="100ac @1% -> Q2=31.1cfs. => Regression Formula for 2-yr.events: ";   nRegres +="Q2 =0.8*pow(ac,.795)*pow(slope,.51) {note: some inputs choke algorithm}*/ ";   nRegres +="function L(v){return Math.log(v)} n[10]='<x1/x12,_y1:'; n[12]='<x2/x22,_y2:'; ";   nRegres +="n[14]='<x3/x32,_y3:'; var x1=L(n[0]); var x12=L(n[1]); var y1=L(n[11]); ";   nRegres +="var x2=L(n[2]); var x22=L(n[3]); var y2=L(n[13]); var x3=L(n[4]); var x32= ";   nRegres +="L(n[5]); var y3=L(n[15]); n[6]='Coefficients>';var R=(x3-x1)/(x2-x1); var ";   nRegres +="C=(y3-y1-R*(y2-y1))/(x32-x12-R*(x22-x12)); n[17]='C='+C; var B=(y2-y1-C*(x22-x12))";   nRegres +="/(x2-x1); n[7]='B='+B; A=Math.exp(y1-B*x1-C*x12); n[16]='A='+A; n[18]='<x/x1_>?y_'; ";   nRegres +="n[19]='>y='+A*Math.pow(n[8],B)*Math.pow(n[9],C); "; var Analyti_nA = new Array("('Analytic Geometry . . s}','graphic coordinates')",  "('s} Rectangular Coord.',RectCo)",  "('s} . . . . . . Polar Coord.',PoleCo)",  "('s} Rect.-Polar Convert','x=r*cos(a); y=r*sin(a); r=sqrt(xx+yy); tan(a)=y/x')",  "('n} Rect.-Polar Convert',R_PCon)",  "(' . . .','')",  "('s} . . line: ax+by+c =0',AnLine)",  "('n} . line equation, etc',EqLine)",  "('s} circle:ax^2+by^2=rr',AnCirc)",  "('s} . conic sections',AnConi)",  "('s} . . . .ellipse:',AnEllip)",  "('s} . . . parabola:','Conic e=1: sq(y-Vy)=b(x-Vx), (Vx,Vy)=virtex point, || to x-axis')",  "('s} . . .hyperbola:',AnHyper)",  "(' . . .','')",  "('n} parabola curve fit',PCurv)",  "(' . . .','')",  "('n} linear regress. 1-var',mRegres)",  "('n} linear regress.2-var',nRegres)",  "(' . . .','')",  "(' . . .','')",   "('','')");        var FinanceBase="n[1]=' int. APR % <'; n[2]='no. of years<'; n[3]='periods / yr<'; ";   FinanceBase +="n[6]='int% /period>'; n[16]=n[11]/n[13]; var I=n[16]/100; var N=n[12]*n[13]; ";   FinanceBase +="var y=Math.pow(1+I,N); n[5]=' - OUTPUT -'; n[15]=' -------------'; "; var FinanceCR="/*CRF eg: 9%APR (=0.75%/mo.) for 36mo, repay $10000 @ $318/mo.*/ "+ FinanceBase;   FinanceCR +="n[0]='Cap_Recov:'; n[10]='(loan_repay)'; n[4]=' Principal $ <'; ";    FinanceCR +="n[7]='Payments $>'; n[17]= n[14]*I*y/(y-1); n[8]='Total paid $>'; ";   FinanceCR +="n[18]=n[17]*N; n[9]='avg.int/per$>'; n[19]=(n[18]-n[14])/N"; var FinanceCA="/*SPCAF eg: $1000 invested @9%APR for 10 yrs. becomes $2367.*/ "+ FinanceBase;   FinanceCA +="n[0]='Comp_Amt.'; n[10]='sgl_payment'; n[4]='P: banked $<'; ";    FinanceCA +="n[7]=' in '+n[12] +' yr $>'; n[17]= n[14]*y; n[8]=' Total Int. $>'; ";   FinanceCA +="n[18]=n[17]-n[14]; n[9]='avg.int/per$>'; n[19]=n[18]/N"; var FinanceCU="/*UCAF eg: @9%APR, $1000 invested/yr for 10yrs, yields $15193.*/ "+  FinanceBase;   FinanceCU +="n[0]='Comp_Amt.'; n[10]='uniform_pay'; n[4]='bank/per. $<'; ";    FinanceCU +="n[7]=' in '+n[12] +' yr $>'; n[17]= n[14]*(y-1)/I; n[8]=' Total Int. $>'; ";   FinanceCU +="n[18]=n[17]-n[14]*N; n[9]='avg.int/per$>'; n[19]=n[18]/N"; var FinancePs="/*SPPWF eg: @9%APR, $1000 needed in 10yrs; bank $422 now.*/ "+ FinanceBase;   FinancePs +="n[0]='Pres_Worth'; n[10]='sgl_payment'; n[4]='need in '+n[12]+'yr$<'; ";    FinancePs +="n[7]='Bank Now $>'; n[17]= n[14]/y; n[8]=' Total Int. $>'; ";   FinancePs +="n[18]=n[14]-n[17]; n[9]='avg.int/per$>'; n[19]=n[18]/N"; var FinancePu="/*UPWF eg: @9%APR, $1000 needed annually for 10yrs; bank $6418 now.*/ "+ FinanceBase;   FinancePu +="n[0]='Pres_Worth'; n[10]='uniform_pay'; n[4]='need / year $<'; ";    FinancePu +="n[7]='Bank Now $>'; n[17]= n[14]*(y-1)/(y*I); n[8]=' Total Int. $>'; ";   FinancePu +="n[18]=n[14]*N-n[17]; n[9]='avg.int/per$>'; n[19]=n[18]/N"; var FinanceSF="/*SFF eg: @9%APR, $1000 needed in 10yrs; bank $66 annually.*/ "+ FinanceBase;   FinanceSF +="n[0]='Sinking_Fund'; n[10]='uniform_pay'; n[4]='need in '+n[12]+'yr.$<'; ";    FinanceSF +="n[7]='Bank/per.$>'; n[17]= n[14]*I/(y-1); n[8]=' Total Int. $>'; ";   FinanceSF +="n[18]=n[14]-n[17]*N; n[9]='avg.int/per$>'; n[19]=n[18]/N"; var IntFact="Tables vary. The discrete interest factors: CRF SCAF, UCAF, SPWF, UPWF, & SFF, are ";   IntFact +="standard, end-of-period, where APR(annual percent rate)/(no.pay./yr)=effective ";   IntFact +="interest. Arithmatic series factors are extensions where a repeated regular payment ";   IntFact +="is required. When interest quoted at less than 1-year, effective annual interest = ";   IntFact +="SCAF-1. Interest compounded Continuously is handy when payments made at irregular times.";   IntFact +=" Factor is not much more than effective rate componuded 365 days/year."; var IntEff="var ipp=(/*Int.%/period*/ ); var n=(/*periods/yr*/ ); m='eff.%='+(Math.pow(1/1+ipp/100,n)-1)";   IntEff +="*100; /*eg. 1.5% per month (12x per year) = 19.56% anual effective interest rate.*/"; var IntCont="n[0]='Cont.eff_i% <'; n[1]='no.perds, n <'; n[2]='Nom.int,_r%>'; ";   IntCont +="n[12]=Math.log(n[10]/100+1/1)*100; var r=n[12]/100; var f=Math.exp(r*n[11]); ";   IntCont +="n[3]='S.CapAmF >'; n[13]=f; n[4]='S.PresWrF >'; n[14]=1/f; n[5]='CapRecoF >'; ";   IntCont +="n[15]=r*f/(f-1); n[6]='U.PresWrF >'; n[16]=1/n[15]; n[7]='SinkFundF >'; ";   IntCont +="n[17]=r/(f-1); n[8]='U.CapAmF >'; n[18]=1/n[17]; n[9]=' . ArithSerF >'; ";   IntCont +="n[19]=1/(Math.exp(r)-1)-(n[11]/(f-1));";     var Finance_nA = new Array("('Finance fn} . . $ > Euro .','x*1.0034 //11-02 c} MUST UPDATE!')",  "('x} . . . $US > $Can','x*1.58 //c}11-02')",  "('x} . . . $ > Pound,Brit','x*0.6338 //c}11-02')",  "('x} . . . $ > Peso,Mex','x*10.124 //c}11-02')",  "('x} . . . $ > Yen','x*122.84 //c}11-02')",  "('x} . . . $ > Yuan','x*8.227 //c}11-02')",  "('','')",  "('','')",  "('n}Cap.Recov:loan pay',FinanceCR)",  "('n} sgl.pay: Comp.Amt.',FinanceCA)",  "('n} unif.pay: Comp.Amt.',FinanceCU)",  "('n} sgl.pay: Pres.Worth',FinancePs)",  "('n}unif.pay: Pres.Worth',FinancePu)",  "('n} unif.pay: Sink.Fund',FinanceSF)",  "('','')",  "('s} Interest Rate terms',IntFact)",  "('*} Effective Int. Rate',IntEff)",    //eg: int. @1.5%/month (12x/yr) = 19.56%/yr  "('n} Contin. Int. Factors',IntCont)",  "('','')",  "('','')",  "('','')");   var JavaScr0="Samples of code. Note that program strings must be activated with the [js] key,";   JavaScr0 +=" initiated with the [=] key, fill in the unknowns, and [=] again to calculate."; var JS_sCal="sCal uses a limited set of JavaScript language elements, listed following: ";   JS_sCal +="(Use the browser->source text->find 'code element name' as shown below to ";   JS_sCal +="view (hopefully sound) example.) {MATH} Math.E; Math.PI; Math.LOG10E; Math.abs; ";   JS_sCal +="Math.acos; Math.asin; Math.atan; Math.cos; Math.exp; Math.log; Math.pow; Math.random;"   JS_sCal +="Math.round; Math.sin; Math.sqrt; Math.tan; {STRING} eval(x); x.indexOf(; length; ";   JS_sCal +="x.substr(; x.substring(; parseFloat(; parseInt(; charAt; charCodeAt; .slice(; split;";   JS_sCal +=" toString; unescape; {MORE} appName; document.captureEvents; inform; onkeypress; ";   JS_sCal +=".options; onLoad; isNaN; {TECHNIQUES} interpolation; fact(q) {regression}; ";   JS_sCal +="{TIME} .getDate(); .getDay(); .getFullYear(); .getMonth(); .getTime; "; var JavaScr1="n[0]='start point . <'; n[1]='increment . <'; n[2]='-- number --'; n[12]='-- ";   JavaScr1 +="value --'; for (i=1; i<8; i++) {n[2+i]=i; n[12+i]=parseInt(n[10])+i*n[11]}"; var J_Graph="for (j=0;j<10;j++){n[j]=Math.round(Math.random()*120)}; /*<-generate data for eg.";   J_Graph +="->graph*/ var s='::::!::::!::::!::::!::::!'; var max=n[0]; var min=n[0]; for ";   J_Graph +="(j=1;j<10;j++){if (n[j]<min){min=n[j]} if (n[j]>max){max=n[j]}} var unit=";   J_Graph +="(max-min)/25; for (j=10;j<20;j++){n[j]=s.slice(0,Math.round((n[j-10]-min)/unit))}";   J_Graph +=" On(); m='Graph Random Data: base='+min+'; units/colon='+unit"; var FcnGraf="/*Graphs a Function (eg. y=Math.sin(a) within the a-limits of 0 to 2*PI, & -1<y-limit<1).";   FcnGraf +=" These values, including the fcn, can be replaced in the following code.*/ ";   FcnGraf +="var s=' '; for (j=1;j<20;j++){s+=' '} s+=' | '+s; /*built std. blank, next set parameters.*/";   FcnGraf +=" var aStart=0; var aEnd=2*Math.PI; var yMin=-1; var yMax=1; var unit=(yMax-yMin)/20; ";   FcnGraf +="var loEnd=Math.abs(yMin/unit); s=s.slice(20-loEnd); var aIncrem=(aEnd-aStart)/10; ";   FcnGraf +="for (j=0;j<10;j++){var a=aStart +j*aIncrem; n[j]=Fo(a)+' a|y '+Fo(Math.sin(a)); ";   FcnGraf +="var i=Math.round(Math.sin(a)/unit+loEnd+1); n[j+10]=s.substr(0,i)+':'+s.substr(i+1);}"; var Interp="n[0]='__x:_data__'; n[10]='__y:_data__'; for (j=1;j<7;j++){n[j]=j*2; n[j+10]=";   Interp +="Math.pow(n[j],1.6);} /*generate data for eg. ->do interpolation*/ n[7]='__x: input__'; ";   Interp +="n[17]='_interp. y:_'; if (n[8]<=n[1]){n[18]=n[11]+(n[8]-n[1])*(n[12]-n[11])/(n[2]-n[1])};";   Interp +=" for (j=1;j<6;j++) {if (n[8]>n[j]&&n[8]<=n[j+1]) {n[18]=n[j+10]+(n[8]-n[j])*";   Interp +="(n[j+11]-n[j+10])/(n[j+1]-n[j])} } if (n[8]>n[6]) {n[18]=n[16]+(n[8]-n[6])*";    Interp +="(n[16]-n[15])/(n[6]-n[5])}; n[9]=' actual y = >'; n[19]=Math.pow(n[8],1.6);";   var JavaScr_nA = new Array("('s} JavaScript samples',JavaScr0)",  "('s} sCal used Elements',JS_sCal)",  "('n}start>increment code',JavaScr1)",  "('*} Square function','function Square(a) {return a*a} Square(/*insert no. to square*/ );')",  "('x} xEnd() function','xEnd()')",  "('','')",  "('x} Bar-Graph Example',J_Graph)",  "('x} Function Grapher','FcnGraf')",  "('n} Interpolate / Extrap.',Interp)",  "('','')",  "('s} str.>str.(geo time)',TimeGeo)", // Source code at Time_Fcns  "('n} data entry form 1',CivVC1)",  // Source at Civ_Highway, Survey  "('n} data for series 2',CivVC2)",  //  ditto  "('','')"); var MenTerms="a=angle; b=base.width; d=diagonal; s=side; h=perpendicular.height; ";  MenTerms += "A=area; V=volume; "; var CirArc="/*_where arc subtended by /_ angle a-radians, defining a cord, h=dist. between ";   CirArc +="center of circle and center of cord.*/ arc.len =r*a; cord.len =2*Math.sqrt(r*r-h*h)";   CirArc +=" =2*r*Math.sin(a/2) =2*h*Math.tan(a/2); dist.cord-to-circumf.=H =r-h; ";   CirArc +="h =Math.sqrt(4*r*-cord.len^2)/2 =cord.len/(2*tan(a/2); A.sector =r*arc.len/2 = ";   CirArc +="r*r*a/2; A.segment =A.sector -A.triangle(ctr-cord) =r*r*(a-Math.sin(a))/2 ";   CirArc +="=r*r*arc.cos((r-H)/r) -(r-H)*Math.sqrt(2*r*H-H*H)"; var Mensura_nA = new Array("('Mensuration .s} . terms',MenTerms)",  "('s} . . . Triangle','A = b*h/2')",  "('s} . . . Rectangle','A = b*h')",  "('s} . . . Parallelogram','A = b*h =b*s*Math.sin(a)')",  "('s} . . . Trapezoid','A = h*(b1+b2)/2')",  "('s} .gen.Quadrilateral','A = d1*d2/2*sin(a) //a is acute angle between diagonals d1, d2')",  "('s} reg.Polygon,n-sides','A = n*s*s/4*cot(180-deg/n)')",  "('s} . . . Circle, rad=r','A = Math.PI*r*r = Math.PI*D*D/4')",  "('s} . Circumference, C','C = 2*Math.PI*r = Math.PI*D')",  "('s} Cir.arc, cord, segm,',CirArc)",  "('s} . . . Ring','A= Math.PI*(r1*r1-r2*r2) =Math.PI*(r1+r2)*(r1-r2)')",  "('s} . . . Ellipse','A = Math.PI*semi.axis.major*semi.axis.minor')",  "('s} . . . Parabola','A = 2/3*b*h; height,h1 at given width,b1: h1 = (h/b^2)*(b*b-b1*b1')",  "('s} . . . ','')",  "('s} . . . Cube','V =s*s*s; A.all.surf. = 6*s*s; diagonal =s*Math.sqrt(3)')",  "('s} rect.Parallelepiped','V =a*b*c; A.surf =2*(a*b+b*c+c*a); diag =Math.sqrt(a*a+b*b+c*c)')",  "('s} . . . Prism','V = A.b * h')",  "('s} . . . Pyramid','V = A.b*h/3')",  "('s} . . . Cylinder','V = A.b * h; lateral.A.surf.rt.circ. =2*r*Math.PI')",  "('s} . . . Cone','V =A.b*h/3; Rt.Circ.Cone.A.b =Math.PI*r*r; A.surf =PI*r*Math.sqrt(r*r+h*h)')",  "('s} frustum rt.Cone','V =PI*h/3*(r1*r1+r1*r2+r2*r2); A.surf =PI*(r1+r2)*sqrt(h*h+(r1-r2)^2)')",  "('s} . . . Sphere','V =4/3*PI*r^3; V.sector =2/3*PI*h*r^2; A.surf =4*PI*r^2')",  "('s} . . . Ellipsoid','V =4/3*PI*a*b*c//semi-axes')",  "('s} . . . Torus','V =2*PI^2*R*r^2; A.surf =4*PI^2*R*r //R is large rad, r is small')",  "('','')",  "('Irregular Area s}terms','area is split into equally spaced, h.dist, cords meas. y0,y1,..,yn')",  "('s} . . Trapezoid rule','A =h/2*((y0+yn) +2*(y1+y2+...+y(n-1))')",  "('s} . . Simpsons rule','A =h/3*((y0+yn) +4*(y1+y3+y5...) +2*(y2+y4+y6+...))')"); var PhysGen="Simplified formulae w/o calculus. Constants implied: eg. v=at may include an ";   PhysGen +="initial vel. v =v0 +at. Observe unit consistency."; var PhysKin="x =v*t =a*t^2/2; v =a*t =x/t =(2*a*x)^.5; //x:distance; v:velocity,x/sec; ";   PhysKin +="a:acceleration,x/sec^2; for freefall bodies a =g =9.8m/sec^2 =32.15ft/sec^2"; var PhysVec="scalar magnitude + direction: a, angle to x_axis, [=(90-deg -a)to y|axis] ";   PhysVec +="V @.direct. to components: Vx =V*cos(@); Vy =V*sin(@); V=sqrt(Vx*Vx+Vy*Vy)"; var PhyProj="initial vel.v; angle.@ to horiz: Vy=g*t: at top of arc, Vy=0, solve for t; ";   PhyProj +="returns to horiz. ground in t; then range, x =Vx*2*t"; var PhyNewt="I. Object at rest or unif. motion continues: inertia (if Fy=Fx=0, a=0), II. unless ";   PhyNewt +="acted upon by unballanced force (F =ma); for which III. there is equal & opposite ";   PhyNewt +="reaction: Fx =-Fx. Ft=mv=m2v2 {impulse=momentum). Weight,w =mg. Mass,m is scalar."; var PhyFric="Ff =Cf*normal force, where coeff.frict, Cf for brake.mat-c.iron =.4, .2 if wet; steel-";   PhyFric +="steel =.58 clean, .1 oiled; Rubber-solids =.2 to .6; Ice =.1 @ 0degC, .3@-12, .5@-70C."; var PhyUGr="Newton: F=GmM/r^2; m & M are 2 masses, r ctrs.dist; G=6.673E-11 newton-meter^2/kg^2"; var PhyWE="Work =Fs=force*dist.parallel to resisting F. Potential Energy: PE=Wh=mgh (against ";   PhyWE +="gravity). Input.Work: (F1s1=F2s2) =Output.Work/efficiency. Kinetic Energy: KE=mv^2/2 ";   PhyWE +=" Energy is Conserved."; var PhyPas="Pressure applied to incompressable fluid (liquid) is transmitted equally & normal to";   PhyPas +=" the walls throughout."; var PhyRot="follows pattern like translatory. angular a.vel*t; a.vel=a.acc*t =(2*a.acc*ang)^.5 ";   PhyRot +=" =2*PI*r*n.rev/sec. Convert: s=r*ang; v=rv; a=ra; ang in radians, r=radius"; var PhySHM="approx. Unif. Circular Motion->Pendulum(ideal): T = 2p (L/g)^0.5 for swing +/-5deg."; var PhyWave="l=wave len, A=amplitude: v=nl.  standing cord wave: n=1/(2L)((N^2T)/m)^0.5 ";   PhyWave +="N, T, m, L =no. loops, tension, mass/length"; var PhyTex="L=Lo(1+aT), a is coef.linear expansion; V=Vo(1+BT), B is coef.vol. thermal expans.";   PhyTex +=" B=>3a,  For gasses B=>1/273 (for deg.C)"; var PhyHMeas="1 calorie (1 BTU) avg. raises temp. 1g (1 lb.) water 1 deg.C (deg.F). ";   PhyHMeas +=" 1BTU=778 ft-lb =252cal =1053joule"; var PhyHCon="H/time=Ch*A*dT/thicknes; A=surf.area, dT=temp.dif Ch=Heat Conductivity. * selected";   PhyHCon +=" Ch as a fctr of water Ch=1, =0.348 BTU/(hr*sq.ft.*deg.F/ft.)=4.176 BTU/(hr*sq.ft.";   PhyHCon +="*deg.F/in.)=0.60 Watt/(sq.m.*deg.C/m)=.6W/m*deg.K=0.518 kcal./(hr*sq.m.*deg.C/m) ";   PhyHCon +=" Note: Insulation R-value =1/(Ch*water value)"; var PTherm0="System placed in contact with an infinite environment (a thermal reservoir) ";   PTherm0 +="eventually comes to equlibrium with it. i.e. thermometer meas."; var PTherm1="When mechanical work is changed to heat, or heat to work, work=heat, but heat>work.";   PTherm1 +=" -precludes perpetual motion of 1st kind."; var PTherm2="No continuous self-sustained process moves heat from cold to hot. Entropy (disorder)";   PTherm2 +=" of isolated syst. can't drop. -no perpetual motion of 2nd kind."; var PTherm3="Absolute Zero (-273.16 deg.C) can't be achieved physically."; var PhyESU="Electrostatic Unit (ESU or Stat-Coulomb) = positive charge which repels a like charge ";   PhyESU +=" 1 cm apart in a vacuum with a force of 1 dyne (2.248E-6 pound). coulomb(6.25E18";   PhyESU +=" electron)/sec =ampere current,I";    var Physics_nA = new Array("('Physics . . . . . s} . terms',PhysGen)",  "('s} Motion (kinematics)',PhysKin)",  "('s} . . Vector Resolution',PhysVec)",  "('s} . . Projectiles',PhyProj)",   "('(kinetics) Newton laws',PhyNewt)",  "('s} . . Friction',PhyFric)",  "('s} Univ.law gravitation',PhyUGr)",  "('s} . Work, Energy',PhyWE)",  "('s} CIRCULAR motion','a(cir)=v^2/r; F(centripital)=mv^2/r')",  "('s} . Rotary kinematics',PhyRot)",  "('s} . Periodic Motion','frequency, n (cycles/s) =1/period, T')",  "('s} simpl harmonic mot.',PhySHM)",  "('s} . . .Wave Motion',PhyWave)",  "('s} . . .Doppler Effect','n.observed= n(v+/-v.observer)/(v-/+v.source)')",  "('s} electromag. spctrm','Light Speed, C=lf where l=wave length, f=frequency, c/s')",  "('s} . . . MATTER','Solid=fixed struct; Fluid=liquid, free surf.; or gas, fills container')",  "('s} . Hookes Law','within elastic limits, strain (distortion) is proportional to stress.')",  "('s} . . . Modulii','(Young)Elasticity: E=(F/A)/(dL/L); Bulk Mod: B=(F/A)/(dV/V)=P/(dV/V)')",  "('s} Density =m/Vol','Specific Gravity: S.g.x=density.x/density.water')",  "('s} . Pascals Principle',PhyPas)",  "('s} Liquid Pressure','P=h*density*g +P.over; h=ht of column (Atmos. 14.7psi=760mm Hg, etc')",  "('s} Archimedes princip.','Body in fluid is buoyed up by a force=weight of fluid displaced.')",  "('s} . Ideal Gas Law:','P1V1/T1=P2V2/T2, T=absol. temp, approx for real gas, best for H & He')",  "('s} Bernoulli Principle','dV1^2 + P1 = dV2^2 + P2')",  "('s} . . . HEAT','avg. atomic kinetic energy as meas. by temp.')",  "('s} . thermal expans',PhyTex)",  "('s} . heat measuremnt',PhyHMeas)",  "('s} . Change of State','water: heat.vaporization(boil)=540 cal/g; of fusion(freeze)=80 cal/g')",  "('s} . . .Heat Capacity','of x/water = Specific Heat of x.')",  "('s} . . Heat Conduction',PhyHCon)",  "('s} thermodynamics 0',PTherm0)",  "('s} . 1st Law Thermo .',PTherm1)",  "('s} . 2nd Law Thermo .',PTherm2)",  "('s} . 3rd Law Thermo .',PTherm3)",  "('s} ELECTricity & Mag',PhyESU)",  "('s} . Coulombs Law','F=(qq1)/(Kr^2); q=charge,ESU; r=separatn, K=dialectric const.(1 in vacuum)')",  "('s} Potnetial Difference','volts, V=IR, R,ohms(law)')",  "('s} . Electric Power','watts, P=IV=I^2R')",  "('s}Capacitor Reactnce','Xc=1/2pifC=V/I [A.C.]')",  "('s}Inductive Reactance','Xi=2pi/L=V/I [A.C.]')",  "('s}combined Impednce','Z=(R^2+(Xi-Xc)^2)^.5; V=IZ')",  "('s} Inverse Square law','Radiation Intensity,I decreases as inv.sq. of dist,r: Ir^2=I1r1^2.')",  "('s} . . .','')",  "('s} . . .','')",  "('s} . . Heisenberg','Uncertainty Principle: One cannot define both position & momentum of a particle.')",  "('s} . . Einstein','E=mC^2; m=m1/(1-(v^2/C^2))^0.5')"); var MdataGet=" function MDG() {end =m.indexOf('/',start); temp = m.substr(start,end-start); start=end+1;} "; var MdataExtract=MdataGet+"var start=1; var end=0; MDG(); var lo=temp; var hi=temp; var i=0; ";  var ProbTerm="if P=probability of outcome, P1 +P2 +P3 +... =1 (certainty). Statistics derived from ";   ProbTerm +="representative data can determine probabilities.  DATA can be entered in sCal by several";   ProbTerm +=" means: <=20 points to n-array; >20 pts to memory; or random number generator to test. ";   ProbTerm +="Once DATA entered, run Stats on n-, or stats on m- or group- finds average, std.dev, etc.";  var StatRndm="var No=(/*No.of points*/ ); var d=(/*size 1 to */100);/*CLICK[=]*/ if (No>20){m='/'} ";   StatRndm +="for (j=0;j<No;j++) {temp=Math.round(Math.random()*d); if (No<21){n[j]=temp} else ";   StatRndm +="{m+=temp+'/'}}; //procedure loads No random data values (1 to d) in n-array or m-series;"; var StatsN="var No=0; var Tot=0; for (j=0;j<20;j++){nI(j); if (n[j]!=''){Tot+=n[j]/1; No+=1}} var mean=Tot/No;";   StatsN +=" var variance2=0; for (j=0;j<20;j++){if (n[j]!=''){variance2+=Math.pow(n[j]-mean,2)}} var ";   StatsN +="Std_Dev0=Math.sqrt(variance2/No); Std_Dev1=Math.sqrt(variance2/(No-1)); var d=2; if (mean>100)";     StatsN +="{d=0} if (mean<1){d=5} m='No of data points='+No+' Total='+Tot+' mean='+Mr(mean,d)+";//decimal out   StatsN +="' Standard Deviation(n)='+Mr(Std_Dev0,d)+' Std.Dev(n-1)='+Mr(Std_Dev1,d)"; var StatsD="/*Enter data values one at a time in x-display, clicking [M+] after each (or simply start ";   StatsD +="the data with a slash '/', place '/' between data values & at END, then click [x>m]). When ";   StatsD +="finished, select 'Stats on m-DATA' or 'Group m-DATA' to analyse. CLICK[=] to initialize ";   StatsD +="m-cell for data string:*/ m='/';"; var StatGp="var lw=(/*Set Group Ranges: Lowest value=*/ ); var r=(/*Range=*/ ); /*note: can enter odd-sized ";   StatGp +="ranges manually--in same format (comment out for-loop to do this).*/ for (j=0;j<9;j++){n[j] ";   StatGp +="=(lw+j*r)+'-'+(lw+(j+1)*r-1); n[j+10]=''} ";   StatGp +="n[9]='. >'+(lw+9*r); n[19]=''; /*Place DATA in m (see 'DATA > 20 pts') & CLICK[=]*/"+MdataExtract;   StatGp +=" start=1; do {MDG(); if (temp<lw){alert('value '+temp+' is less than least range '+lw)} var s=0; ";   StatGp +="for (j=0;j<9;j++){i=n[j].indexOf('-'); if (temp>=n[j].substr(0,i)/1 && temp<=n[j].substr(i+1)/1) ";   StatGp +="{n[j+10]=n[j+10]/1+1/1; s=1}} if (s!=1){n[19]=n[19]/1+1/1}} while (m.indexOf('/',start)>-1); "; var StatIn=MdataExtract+"var Tot=temp; var No=1; do {MDG(); if (temp!=''){Tot=Tot/1+temp/1; No+=1; ";   StatIn +="if (temp<lo){lo=temp} if (temp>hi){hi=temp}}} while (m.indexOf('/',start)>-1); var mean=Tot/No; ";   StatIn +="start=1; var variance2=0; do {MDG(); if (temp!=''){variance2+=Math.pow(temp-mean,2)}} ";   StatIn +="while (m.indexOf('/',start)>-1); n[0]='_Statistics_'; n[10]='data_from_m'; n[1]='No. of points'; ";   StatIn +="n[11]=No; n[2]='Total . . . . >'; n[12]=Tot; n[3]='Mean . . . . >'; n[13]=mean; n[4]='Std.dev.(n)";   StatIn +=" >'; n[14]=Math.sqrt(variance2/No); n[5]=' . . S.d.(n-1)>'; n[15]=Math.sqrt(variance2/(No-1)); ";   StatIn +="n[6]='range.low val'; n[16]=lo; n[7]=' . . .  . high val'; n[17]=hi; n[8]=' . mid-range >'; ";   StatIn +="n[18]=(hi/1+lo/1)/2; n[9]='copy m-data >'; n[19]=m;"; var ProbComb="/*Number of outcomes for probability. eg. Have 6 books, can display 4 at a time; there are ";   ProbComb +="15 diff. combinations possible, but 360 if the order of the 4 books included. In 3 Binomial ";   ProbComb +="trials, where the probability of success, P(pass), is 0.8 in each trial, the prob. of only 1 ";   ProbComb +="success =0.096*/ n[0]=' . # of items <'; n[1]=' . r at a time <'; var s=n[10]-n[11]; n[2]='";   ProbComb +="Combinations'; n[12]='________'; n[3]='. possible r >'; n[13]=fact(n[10])/(fact(n[11])*fact(s));";   ProbComb +=" n[4]='Permutations'; n[14]='________'; n[5]='. orders of r >'; n[15]=n[13]*fact(n[11]); n[6]=";   ProbComb +="'Binoml.trials<'; n[7]=' . . P(pass) <'; n[8]=' . # passes <'; n[9]='probability >'; s=n[16]";   ProbComb +="-n[18]; n[19]=Math.pow(n[17],n[18])*Math.pow(1-n[17],s)*fact(n[16])/(fact(n[18])*fact(s));" var ProbPois="/*Where average rate defined for random events: eg. if avg. is 20 cars/min, in 0.5-min, EXACTLY";   ProbPois +=" 4 cars passing has a 1.9% chance.*/ n[0]='Poisson Dist.'; n[10]='_avg/interval'; ";   ProbPois +="n[1]='known rate <'; n[2]=' . rev.intervl<'; n[3]='x.occuranc<'; n[4]='x.probability>'; ";   ProbPois +="function PDist(s) {n[s]=Math.pow(n[11]*n[12],n[s-1])*Math.exp(-n[11]*n[12])/fact(n[s-1])} ";   ProbPois +="PDist(14); n[5]=' . . x2.occur <'; n[6]=' . . x2.prob. >'; PDist(16); n[7]=' . . x3.occur <'; ";   ProbPois +="n[8]=' . . x3.prob. >'; PDist(18); n[9]='sum of prob>'; n[19]=n[14]/1+n[16]/1+n[18]/1; "; var ProbNorm="/*Normal 'bell-curve' symmetrical about mean=median=mode. +/- 1 stdandard deviation covers ~68%";   ProbNorm +=" of data, +/- 2 s.d ~95%, 3 s.d virtually all. Probabilities,P, are areas under curve between ";   ProbNorm +="points. eg. if mean=10, std.dev=1; from point 8.5 (15% of norm) the area outside (2-tails) ";   ProbNorm +="=0.1336 or 13.4%; 43.3% will be on the low side of the mean, but still within 15% of it.*/ ";   ProbNorm +="n[0]='Normal_Distr.'; n[10]='sampl.represent'; n[1]=' . mean val <'; n[2]=' . std.deviat<'; ";   ProbNorm +="n[3]=' . . . . point.x <'; n[4]=' . x.ordinate >'; var s=n[13]-n[11]; n[14]=1/(Math.exp(s*s/";   ProbNorm +="(2*n[12]*n[12]))*n[12]*Math.sqrt(2*Pi)); n[5]='Z=(x-m)/s.d >'; var Z=s/n[12]; var Za=Math.abs(Z);";   ProbNorm +=" n[16]=1/Math.pow(1/1+Za*(0.04986735+Za*(0.02114101+Za*(0.00327763+Za*(0.0000380036+Za";   ProbNorm +="*(0.0000488906+Za*0.000005383))))),16); n[15]=Z; n[6]=' . P(2-tails) >'; n[7]=' . . P(m to x)>'; ";   ProbNorm +="n[17]=(1-n[16])/2; n[8]=' . . P(1-tail) >'; n[18]=n[16]/2;"; var ProbX2="/*Hypothesis (Ho) Testing: Expected value,Ex, is compared to experimental observation,Ob, to ";   ProbX2 +="find if Ho behind Ex is probable. The Chi-Square statistic, X2 =sum(sq(Ob-Ex))/Ex, and degree of ";   ProbX2 +="freedom (d.f=No.Sets-1; if more than 1 group (+'blind'), d.f=(Sets-1)*(Groups-1)). eg. set of 100:";   ProbX2 +=" Ob: 45 got better, 25 worse, 30 same; but Ex was 1/3 (33.3)each case. X2 stat.=6.5 with d.f=2, ";   ProbX2 +=" results in a 4% chance that Ex was correct. NOTE that formula used here is approx: +/- 1% for ";   ProbX2 +="0.01<P<0.9 AND d.f<6. Layout here is for a SIMPLE case. n[17],n[18] are independent inputs of ";   ProbX2 +="X2 statistic and deg.of freedom for GENERAL cases.*/ n[0]='Chi-Square'; n[10]='experim.data';";   ProbX2 +=" n[1]='__observ__'; n[11]='__expect__'; n[6]='___data___'; n[16]='___d.f=2__'; function X2(s) ";   ProbX2 +="{return Math.pow(n[s-10]-n[s],2)/n[s]} n[5]=Mr(X2(12),2)+'|'+Mr(X2(13),2)+'|'+Mr(X2(14),2); n[7]=";   ProbX2 +="'INPUT X2 <'; var X=X2(12)/1+X2(13)/1+X2(14)/1; n[15]='<X2='+X; X=n[17]; n[8]=' deg.freed.<';";   ProbX2 +=" var d=n[18]; n[9]='probability >'; var o=Math.pow(0.734,1/d); var p=Math.pow(d,0.00816); ";   ProbX2 +="var q=Math.pow(d,1.58); var Pr=(-0.193+0.846*d-0.138*d*d+0.0059*d*d*d)*Math.pow(0.704*o*p,X)*";   ProbX2 +="Math.pow(X,(-26.36+8.8*q)/(156.4+1.58*d)); if (d<1.5){Pr*=1.2}; n[19]=Mr(Pr,2)";//~good @ 2 dec.pl.    var Probabi_nA = new Array("('Probability, Statistic s}',ProbTerm)",  "('s} DATA: <=20 points','Enter data (0 is legit, blank=pass) in cells. Use Stats on n-data to analyse.')",  "('*} DATA: random gen.',StatRndm)",  "('x} Stats on n-DATA',StatsN)",  "('*} DATA > 20 points',StatsD)",  "('n} Stats on m-DATA',StatIn)",  "('n} Group m-DATA',StatGp)",  "('*} n[1..19] > memory',DataNdM)", //source at Data Management, edit>select.all>copy>paste to text file>save  "(' . . .','')",  "('n} Combin,Permut,Bin.',ProbComb)",  "('n} Poisson Distribution',ProbPois)",  "('n} Normal Distribution',ProbNorm)",  "('n} Chi-Square Distrib',ProbX2)",  "(' . . .','')",  "(' . . .','')",  "(' . . .','')",  "(' . . .','')"); var Time0 ="var now=new Date(); now.getTime();"; var Months=" var MonthAr =new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');"; var WeekDay=" var DayAr = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');"; var TimCntDn="var c=(/*Count Down from: seconds*/ );/*CLICK[=]*/ m=c; var a=new Date(); ";   TimCntDn +="while (m>0) {var b=new Date(); m=c-eval(b-a)/1000;} alert('Time Up'); "; var JSdate="Date is measured in milliseconds (86,400,000 ms/day) since midnight Jan 1, 1970 UTC. ";   JSdate +="Date object range is -100,000,000 days to 100,000,000 days relative to Jan 1, 1970 UTC. ";   JSdate +="Universal Time (UTC) [aka Greenwich Mean Time (GMT)] is rel. to local time set on system.";   JSdate +=" When date is entered as a string, form must be as 'Jan 4, 2003' with full 4-digit year."; var TimeDif="n[0]='Date_Difference'; n[10]='_Calculator_'; n[1]='. . NOW . . =>'; "+Time0+Months+WeekDay+" n[11]";   TimeDif +="=MonthAr[now.getMonth()]+' '+now.getDate()+', '+now.getFullYear(); n[12]='(note format)';";   TimeDif +=" n[3]='new date.1 <'; var New1=Date.parse(n[13]); n[4]=' . day of wk >'; var da=new Date(n[13]); ";   TimeDif +="n[14]=DayAr[da.getDay()]; n[16]='(neg.=past)'; n[5]='to d.1, days>'; n[15]=(New1-now)/86400000; ";   TimeDif +="n[7]='new date.2 <'; var New2=Date.parse(n[17]); n[8]='d.2-d.1, day>'; n[18]=(New1-New2)/86400000;";   TimeDif +=" n[9]=' . . . = years >'; n[19]=Mr(n[18]/365.24,3);"; var TimeDDif="var d=(/*neg.=past: Days from Now*/ ); "+Time0+Months+" var s=Date.parse(now)+d*86400000; ";   TimeDDif +="var then=new Date(s); m=MonthAr[then.getMonth()]+then.getDate()+','+then.getFullYear();"; var TimePal="n[0]='PALEO_pds'; n[10]='B.P. . 570 mil'; n[1]='Cambrian'; n[11]='-trilobites'; ";   TimePal +="n[2]='Ordovician'; n[12]='-coral 500 mil'; n[3]='Silurian'; n[13]='-clam 425 mil'; ";   TimePal +="n[4]=' - 1st land'; n[14]='-plant,animal'; n[5]='Devonian'; n[15]='-fern 395 mil'; ";   TimePal +="n[6]=' - anphibian'; n[16]='-shark,lungfish'; n[7]='Carboniferous'; n[17]='-insect 350m'; ";   TimePal +="n[8]=' - forest'; n[18]='-early reptile'; n[9]='Permian'; n[19]='conifer 290m';"; var TimeMes="n[0]='MESO_pds'; n[10]='B.P. . 235 mil'; n[1]='Triassic'; n[11]=' -frog,turtle'; ";   TimeMes +="n[2]=' - 1st mammal'; n[12]='-1st dinosaur'; n[3]=' -pangea split'; n[13]=''; ";   TimeMes +="n[4]='Jurassic'; n[14]='-bird 190 mil'; n[5]=' - 1st flowers'; n[15]='-dinasaur age'; ";   TimeMes +="n[6]='Cretaceous'; n[16]=' . . . . . 130 mil'; n[7]=' - late dinosaur'; n[17]='-var.mammal'; ";   TimeMes +="n[8]=' - Rocky mts'; n[18]=''; n[9]=''; n[19]='';"; var TimeQuat="n[0]='Quatenary_Pd'; n[10]='Epochs follow'; n[1]='Pleistocene'; n[11]='B.P. . 1.8 mil'; ";   TimeQuat +="n[2]=' -homo erectus'; n[12]='(1st human ancest)'; n[3]='-neanderthal'; n[13]=''; ";   TimeQuat +="n[4]='Holocene'; n[14]='modrn 0.01m'; n[5]=' -dark ages'; n[15]=' . . 0.001m'; ";   TimeQuat +="n[6]=' -moon landing'; n[16]=' . . 0.000035m'; n[7]=''; n[17]=''; n[8]=''; n[18]=''; ";   TimeQuat +="n[9]=''; n[19]=''; ";   var TimeCen="n[0]='CENO_periods'; n[10]='B.P. . . 65 mil'; n[1]='_Tertiary'; n[11]='Epochs follow'; ";   TimeCen +="n[2]='. Paleocene'; n[12]='-1st primates'; n[3]='. Eocene'; n[13]='-cats . . . 55m'; ";   TimeCen +="n[4]=' - bat,whale'; n[14]='-dog,penguin'; n[5]='. Oligocene'; n[15]='-monkey 38m'; ";   TimeCen +="n[6]='. Miocene'; n[16]='-bear . . . 26m'; n[7]=' - alps,himalayas'; n[17]='-grass,1st ape'; ";   TimeCen +="n[8]='. Pliocene'; n[18]='homo hab. 6m'; n[9]='/*Quaternary Pd*/'+TimeQuat; n[19]='[c][nx][n9][=]';"; var TimeGeo="n[0]='_EON_*Era_'; n[10]='_years_B.P_'; n[1]='Archeon'; n[11]='4.6 bil.'; n[2]='- 1st bacteria'; ";   TimeGeo +="n[12]='4.2 bil'; n[3]='- Oxy to atm'; n[13]='3.5 bil'; n[4]='Proterozoic'; n[14]='2.5 bil'; ";   TimeGeo +="n[5]='-proista,amoeba'; n[15]='1.2 bil'; n[6]='Phanerozoic'; n[16]=' . . 570 mil';";   TimeGeo +="n[7]='/* Paleozoic */ '+TimePal; n[17]='[c][nx][n7][=]'; ";// example of calling another set   TimeGeo +="n[8]='/* Mesozoic */ '+TimeMes; n[18]=' . . 235 mil'; ";  // of data via string to expand table.   TimeGeo +="n[9]='/* Cenozoic */ '+TimeCen; n[19]=' . . . 65 mil';"; // Can extend from an extension, etc.    var Time_Fu_nA = new Array("('Time_Functns: x} Now','Date()')",  "('x}Time Code,milliSec.',Time0)",  "('x}Universal(GMT)time',Time0+' now.toUTCString()')",  "('','')",  "('*} Count Down Timer',TimCntDn)",  "('','')",  "('s} Dates in JavaScript',JSdate)",  "('*} . Days Difference',TimeDDif)",  "('n} . Date Difference',TimeDif)",  "('','')",  "('','')",  "('s} Geologic Timetable',TimeGeo)", // Source code at Time_Fcns  "('','')",  "('','')",  "('','')"); // ****************************** Catagory 3: Special Programs - default selection ********* var Special_nA = new Array("('Special pg} root . (x)^.5','Math.pow(x,0.5)')",  "('','')",  "('n} Peak Flow, nwIL',CHpkILnw)", // source code at Civ_Hydro group   "('n} Rational Meth, nwIL',CHratIln)",  "('n} Stormwater Storage',CHdet)",  "('n} Hyd.Control Struct.',CHydCStr)",  "('n} Normal Open Chan.',CHydMan)",  "('','')",  "('n}Cap.Recov:loan pay',FinanceCR)", // source code at Finance group  "('n} sgl.pay: Comp.Amt.',FinanceCA)",  "('n} unif.pay: Comp.Amt.',FinanceCU)",  "('n} sgl.pay: Pres.Worth',FinancePs)",  "('n}unif.pay: Pres.Worth',FinancePu)",  "('n} unif.pay: Sink.Fund',FinanceSF)",  "('','')",  "('','')",  "('','')",  "('','')",  "('','')"); var User_01_nA = new Array("('User_01 . . . . . blank set','Set-up for user function group')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('','')"); var User_02_nA = new Array("('User_02 . . . . . blank set','Set-up for user function group')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('','')"); var User_03_nA = new Array("('User_03 . . . . . blank set','Set-up for user function group')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('','')"); // GrabNval: sting containing function GrabN to populate s-array to n[st..en] located in Materials area var CivHS="/*Following stds tables based on typical values (IL DOT 1975). Consult local DOT. NOTES: ";   CivHS +="Design Hourly Volume, DHV, typically 10-20% of Average Daily Traffic, ADT, enclosed in [ ] ";   CivHS +="in tables. Slopes are denoted by horiz.dist : 1-vertical. Stopping Site Dist. approx. 6-sec";   CivHS +=" at design speed, Passing Site Dist.~25-sec. Minimum K (=L/A =vert.curve.length / algebraic";   CivHS +=" difference in grades) for drainage ~1.43. External, E=AL/8. Degree of Curve, D=5729.6/radius."; var CivHS0=GrabNval+" n[0]='Design, mph'; n[1]=' . . . Class'; n[2]='drainage, yr.';";   CivHS0 +=" n[3]='Site.d Stop,ft'; n[4]=' . . . . . Pass,ft'; n[5]='max.grade%'; n[6]='Sag Curve K'; ";   CivHS0 +="n[7]='Crest: Stop,K'; n[8]='Crest: Pass,K'; n[9]='Horiz: max,D'; s =new Array"; var CivHS70=CivHS0+"(70,'Major','50-30[<750]',625,2500,'3up-5dn',1.45,2.6,23,3); GrabN(s,10,20);"; var CivHS60=CivHS0+"(60,'Area Service','50-30[<750]',525,2100,5,1,1.6,17.49,5); GrabN(s,10,20);"; var CivHS50=CivHS0+"(50,'Collectr[<750]','30-25',400,1800,6,0.75,0.9,9.84,7.5); GrabN(s,10,20);"; var CivHS40=CivHS0+"(40,'Collectr[<250]',20,275,1500,7,0.55,0.55,6.83,12.5); GrabN(s,10,20);"; var CivHS30=CivHS0+"(30,'Rd.Dist.[<150]','~10',200,1100,8,0.35,0.33,3.67,23); GrabN(s,10,20);"; var  CivVC=" FCN. FOR VERT.CURVE CALCULATION*/ function GetEl(sta) {var xEl =0; if (sta/1 < PIst/1) ";   CivVC +="{xEl=PIel-(PIst-sta)*G1/100; if (sta/1>PCst/1){xEl+=Math.pow((sta-PCst)*2/L,2)*Ex}} else ";   CivVC +="{xEl=PIel-(PIst-sta)*G2/100; if (sta/1<PTst/1){xEl+=Math.pow((PTst-sta)*2/L,2)*Ex}} return xEl} ";          // Vert.Curve is example of a data entry screen, with the data saved for use in a next screen          // to generate a series of output values.  Data could also be entered directly or pasted from          // a text file. var CivVC1="/*READ! Vertical Curve contains 2 procedures: First for curve data: enter curve Length {eg.400};";   CivVC1 +=" grade,% to PI (all grades looking to increased stations, enter '-' for negative){eg.-2}; ";   CivVC1 +="PI station (do not insert '+'){eg. sta 10+00=1000} & elevation {eg.200.00}; & grade,% away from";   CivVC1 +=" PI {eg. 1}. The V.C. E- & K-values will be displayed {eg. 1.5 & 133.3}. An unk. odd station may";   CivVC1 +=" be input {eg. 950} to obtain elev. {eg.201.844}. The Curve Data is saved to m-memory to be used";   CivVC1 +=" to compute elevations for a series of stations in Vert.Curve Series. "+CivVC+"n[0]='Vert.Curv,";   CivVC1 +=" L<'; var L=n[10]; n[1]=' . . to PI G% <'; var G1=n[11]; n[2]=' . . PI station <';";   CivVC1 +=" var PIst=n[12]; n[3]='PI elevation<'; var PIel=n[13]; n[4]='away PI G%<'; var G2=n[14]; ";   CivVC1 +="var Ex=(G2-G1)*L/800; n[5]='E='+Ex; n[15]='K='+0.01*L/Math.abs(G2-G1); var PCst=PIst-L/2; ";   CivVC1 +="n[6]='pc.sta='+PCst; var PCel=PIel -G1*L/200; n[16]='pc.el='+PCel; var PTst=PIst/1+L/2; ";   CivVC1 +="n[7]='pt.sta='+PTst; var PTel=PIel/1 +G2*L/200; n[17]='pt.el='+PTel; n[8]='input station<'; ";   CivVC1 +="n[9]='<data to m)'; var xSt=n[18]; n[19]='elev '+GetEl(xSt); /*end DATA ENTRY, SAVE DATA to";   CivVC1 +=" m-mem.*/ m='VC.dta,'+L+','+G1+','+PIst+','+PIel+','+G2+','+PCst+','+PTst+','+Ex; "; var CivVC2="/*READ! Vert.Curve Data must first be input to m-memory. This can be done by running Vert.Curve";   CivVC2 +=" data or pasting previously saved data from a text file to the m-box. The first point 'VC.dta' ";   CivVC2 +="can be augmented with a name--include NO Comas! Then a series of stations based on starting ";   CivVC2 +="station {eg.700} & increment {eg.50} can be slisted. Can repeat by changing start or increment. ";   CivVC2 +=CivVC+"var VCd=m.split(','); L=VCd[1]; G1=VCd[2]; PIst=VCd[3]; PIel=VCd[4]; G2=VCd[5]; ";   CivVC2 +="PCst=VCd[6]; PTst=VCd[7]; Ex=VCd[8]; n[0]='list:start sta <'; L=VCd[1]; G1=VCd[2]; PIst=VCd[3]; ";   CivVC2 +="PIel=VCd[4]; G2=VCd[5]; PCst=VCd[6]; PTst=VCd[7]; Ex=VCd[8]; /*listing*/ var st=n[10]; ";   CivVC2 +="n[1]=' . increment<'; var i=n[11]; for (j=0;j<8;j++){xSt=st/1+j*i; n[j+2]='sta '+xSt; ";   CivVC2 +="n[j+12]='elev '+GetEl(xSt)}"; var Civ_Hig_nA = new Array("('Civ_Highway, Survey','')",  "('s} __Geometric Stds__',CivHS)",  "('s} Std. 70-mph design',CivHS70)",  "('s} Std. 60-mph design',CivHS60)",  "('s} Std. 50-mph design',CivHS50)",  "('s} Std. 40-mph design',CivHS40)",  "('s} Std. 30-mph design',CivHS30)",  "('x} . . .','')",  "('n} Vert.Curve data.in',CivVC1)",  "('x} Vert.Curve series.out',CivVC2)",  "('n} H.Curv. tan.offset.dta','')",  "('x} . . .','')",  "('n} H.Curv. deflect.dta','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "('','')"); var CHyd0="Q=V*A // Continuity Equation: for consistent units: cubic feet (or meters)/sec ";  CHyd0 += "= ft (or m)/sec, velocity * area, sq.ft (or sq.m). Without any inflow or outflow, ";  CHyd0 += "Q is constant between sections 1 & 2, therefore: V1*A1 = V2*A2."; var CHydB="Z1 +V1*V1/(2*g) +density*V1 = Z2 +V2*V2/(2*g) +frict.head +density*V2 //Bernoulli"; var CHpkILnw="/*Hydrology highly dependent on local climate. These methods developed for northwest ";   CHpkILnw +="Illinois. US units; 3-variations: eg. 330 acres, 1% impervious, main channel slope= ";   CHpkILnw +="1.5%; output, in cfs, is for 4 recurrence intervals |2-yr|10yr||30yr|100y| the top, ";   CHpkILnw +="n5, row computed by a strictly local method, depending only on area; the second row, n6, ";   CHpkILnw +="modifies the first for urbanization; the 3rd row, n7, is from regional regression equations ";   CHpkILnw +="(Curtis,USGS,1987) for unmod. rural basins. By the eg. inputs, the 2-year peaks estim. ";   CHpkILnw +="114,116,97 cfs. 3.3 ft. on last line is APPROX. channel flow depth,2-yr (Prugh,USGS,1976).*/";   CHpkILnw +=" n[0]='_Peaks_cfs_'; n[10]='_for_n.w.IL_'; n[1]=' Drain acre<'; n[2]=' . imperv.%<'; ";   CHpkILnw +="n[3]=' ch.slope%<'; n[4]='Q-2_|_-10 cfs'; n[14]='30yr_|_100yr'; var A=n[11]; ";   CHpkILnw +="var i=n[12]; var s=n[13]; function OQ(q){var d=0; if (q<10){d=1} return Mr(q,d)} ";   CHpkILnw +="/*WinCo comp.*/ var Q2=1.56*Math.pow(A,0.74); if (A>3200){Q2*=(2.42-0.176*Math.log(A))}";   CHpkILnw +=" function WinCo(y){var Qy = Q2*(9*Math.pow(y,0.17)-7.2)/(1.8+Math.pow(y,0.17)); ";    CHpkILnw +="return Qy} /* built-in rel. s decrease as A incr.*/ n[5]=OQ(Q2)+' | '+OQ(WinCo(10));";   CHpkILnw +=" n[15]=OQ(WinCo(30))+' | '+OQ(WinCo(100)); function WUrb(y){return WinCo(y)*(1+0.02*i)}";   CHpkILnw +="n[6]=OQ(Q2*(1+0.02*i))+' | '+OQ(WUrb(10)); n[16]=OQ(WUrb(30))+' | '+OQ(WUrb(100)); ";   CHpkILnw +="/*USGS comp.*/ function USG(y){var p=0.51*Math.pow(0.86,1/y)*Math.pow(y,0.028); ";   CHpkILnw +="return OQ(34*Math.pow(0.29,1/y)*Math.pow(y,0.11)*Math.pow(A/640,0.786)*Math.pow(s*52.8,p))}";   CHpkILnw +=" n[7]=USG(2)+' | '+USG(10); n[17]=USG(30)+' | '+USG(100); /*Depth comp.*/ n[8]='chan_depth';";   CHpkILnw +=" n[18]='_aprox_ft_'; function Ud(y){var r=0.283*Math.pow(1.14,1/y)*Math.pow(y,-0.02); ";   CHpkILnw +="return Mr(1.12*Math.pow(0.49,1/y)*Math.pow(y,0.104)*Math.pow(USG(2),r),1)}; ";   CHpkILnw +="n[9]=' '+Ud(2)+' | '+Ud(10); n[19]=' '+Ud(30)+' | '+Ud(100)"; var CHratIln="/*Rational Formula: Q=ciA (based on 1-in/hr rainfall on 1 acre=1.008cfs) where c=runoff coeff.";   CHratIln +="=runoff/rainfall; {depend. on soils, cover, rain, etc.} ~.9-.95 impervious, ~.2-.3 pervious, ";   CHratIln +="composit~.45 for 25% imperv. urban subdiv, etc. i=rainfall,in/hr {key assumption: rain of ";   CHratIln +="duration of time of concentration, for flow to travel from most remote part of drainage basin,";   CHratIln +=" herein based on ISWS Bul.70 for NW Illinois. There is a subroutine using Kirpick equation for";   CHratIln +=" Tc, minutes, flow in natural channels, grass ditches, bare-dirt overland. Multiply by ";   CHratIln +="~2 grass overland, ~0.4 conc.sheet, ~0.2 paved channel: add components. Manual enter Final Tc.";   CHratIln +=" eg. for 100-yr event, with channel travel 2300-ft & 50-ft fall yields 13.22-min in channel, ";   CHratIln +="Enter 20-min to add ~7-m sheetfl (300ft w/4ft fall)x2 to channel (all depends on basin config.)";   CHratIln +=" With c=0.3 on 48 acres. Routine calculates 7 in/hour for 20-min, 100-yr rain [Total rain in ";   CHratIln +="this time would be 7in/hr*20min/60min/hr =2.33-in.] Resulting Q=101-cfs.*/ n[1]='Design Yr. <';";   CHratIln +="n[0]='Rational_nwIL'; n[10]='_Q=ciA_cfs_'; n[2]='travel.dist,ft <'; n[3]=' . .Tc. . fall,ft <';";   CHratIln +=" n[4]='partl Tc,min>'; var d=n[12]; n[14]='__'+Mr(0.00781*Math.pow(d*d*d/n[13],0.385),2)+'__'; ";   CHratIln +="n[5]='Fin. Tc,min <'; n[6]='compos. c <'; n[7]='drain.acres<'; n[8]='rain, i, in/hr >'; ";   CHratIln +="n[18]=0.9465*Math.pow(0.843,1/n[11])*Math.pow(n[11],0.204)/(0.11+0.0211*Math.pow(n[15],0.805));";   CHratIln +=" n[9]=' . . . . Q, cfs >'; n[19]=n[16]*n[17]*n[18];"; var CHdet="/*2 calculations presented: first is a one-step route, VERY approximate but applicable ";   CHdet +="anywhere, uses a triangular inflow hydrograph clipped by a triangular (at least on the ";   CHdet +="rising limb) outflow at the time to peak of outflow. eg. 250cfs inflow peak at 30 minutes ";   CHdet +="can be reduced to 200cfs outflow if about 2.5 acre.ft of storage applied. Secondly, in an ";   CHdet +="algorithm tied to ISGS Bulletin 70 for Northwestern Illinois, the area and runoff coeff.";   CHdet +=" and allowable release rate (in cfs per acre developed) are used to return a factor in ";   CHdet +="ft.depth of storage required which becomes acre feet when multiplied by the acreage, eg. ";   CHdet +="50 acres developed to a C-value of 0.95, if the allowable release is 0.2cfs/acre, needs 17.2";   CHdet +=" acre.feet of stormwater detention volume.*/ n[0]='Storage_Vol.'; n[10]='_acre_feet_'; ";   CHdet +="n[1]='1-st pk, cfs <'; n[2]='. min. to pk<'; n[3]='. outflo,cfs <'; n[4]='vol.req. ac.ft>';";   CHdet +=" n[14]=(n[11]-n[13])*n[12]/600; n[5]='_nwIl_acre <'; n[6]='. runoff coef.<'; n[7]=";   CHdet +="'. 0ut, cfs/ac <'; n[8]='stor.depth, ft>'; n[18]=0.27*n[16]/Math.pow(n[17],0.25) -0.04;";   CHdet +=" n[9]='vol.req. ac.ft>'; n[19]=n[18]*n[15];"; var CHydCStr="/*Three control structures share head Input. eg. with 2.75ft head, a 10ft long, broad ";   CHydCStr +="crested weir spills 141 cfs. Using the same head, a rectangular orifice, 1ft wide by ";   CHydCStr +="0.5ft high, passes 3.8cfs, a round orifice, 0.75ft (9-inch) dia. delivers 3.3cfs.*/";   CHydCStr +="n[0]='Head feet . <'; n[1]=' - WEIR Q ='; n[11]=' 3.1L*H**1.5'; n[2]='length, feet <'; ";   CHydCStr +="n[3]='= Flow, cfs . >'; n[13]=3.1*n[12]*Math.pow(n[10],1.5); n[4]='-ORIFICE Q='; ";   CHydCStr +="n[14]='0.6A(2gh)**.5'; n[5]='Rect:width ft<'; n[6]=' . . . height,ft.<'; n[7]=n[3]; ";   CHydCStr +="n[17]=0.6*n[15]*n[16]*Math.pow(2*32.15*(n[10]-n[16]/2),0.5); n[8]='Circ: Dia. ft. <'; ";   CHydCStr +="n[9]=n[3]; n[19]=0.6*3.1416*n[18]*n[18]/4*Math.pow(2*32.15*(n[10]-n[18]/2),0.5)"; var CHydMan="/*For Normal Flow: by gravity only, surface parallel to channel bottom.  v, ft/sec =1.486*pow";   CHydMan +="(Hyd.rad,2/3)*sqrt(s,ft/ft)/n & Q=vA. {Hydraulic Radius =area of section,A/wetted perimeter}.";   CHydMan +=" n =Manning roughness coeff. ~.009-.012 plastic,glass,conc.pipe; ~.013-.025: clay,brick,to ";   CHydMan +="asphalt; ~.02-.025: corr.metal:paved bottom to plain; ~.025-.03: channel, straight,dirt to ";   CHydMan +="short grass; ~.035-.04: smooth rip.rap to weedy; ~.06-.14+: brushy, winding, to extremely ";   CHydMan +="dense. sCal uses a single form for full-pipe & trapezoidal channel analysis, so the n- & s-";   CHydMan +="inputs are shared. One ignores the inappropriate output. eg: a conc.pipe and a conc.channel,";   CHydMan +=" both with n=0.012 & s=0.5% (.5ft fall per 100ft run). The PIPE has dia. 1.25ft (15-inches) ";   CHydMan +="yielding v=1.23 sq.ft & a Normal Q of 4.9cfs. The CHANNEL has a left side slope of 4:1 (4 ";   CHydMan +="units horiz to 1 vert.); bottom width of 4ft, & right side slope of 2:1. Assuming a flow ";   CHydMan +="depth of 1.5ft: the top width is 15ft, Froude no. of 1.52 (>1, supercritical), v=8.8ft/sec,";   CHydMan +=" and Q=139 cfs. [Note the flexibility of trapezoidal shape: v-ditch if bot.wid set to 0, ";   CHydMan +="box-shape if side.slopes=0. As a trick feature, if either lt, rt or both side slopes set to ";   CHydMan +="exactly 0.01, the respective boundry is ignored in the wet.perim calculation, allowing ";   CHydMan +="subsections of complex channel/floodplain to add manually.]*/";   CHydMan +="n[0]=' Manning n <'; n[1]='lon.slope%<'; var sn=1.486*Math.sqrt(n[11]/100)/n[10]; /*<COMMON ";   CHydMan +=". PIPE>*/ n[2]='PIPE dia, ft <'; var ap=3.1416*n[12]*n[12]/4; n[3]='A, s.f='+ap; ";   CHydMan +="n[13]='Q,cfs=' +sn*Math.pow(n[12]/4,0.667)*ap; /*TRAP.CHANNEL>*/ n[4]='|_/Chan.lt.ss<'; ";   CHydMan +="n[5]=' bot.width, ft <'; n[6]=' . . right.ss:1 <'; n[7]='flow depth,ft<'; var d2=n[17]*n[17];";   CHydMan +=" var tw=(n[14]*n[17]+n[15]/1+n[16]*n[17]); n[8]='top.w,ft='+tw; var ac=n[17]*(tw+n[15]/1)/2; ";   CHydMan +="var wp=n[15]/1; if (n[14]!=0.01){wp+=Math.sqrt(n[14]*n[14]*d2+d2)}; if (n[16]!=0.01){wp+=";   CHydMan +="Math.sqrt(n[16]*n[16]*d2+d2)}; var vc=sn*Math.pow(ac/wp,0.667); n[18]='V,ft/s='+vc; ";   CHydMan +="n[9]='froud#='+vc/Math.sqrt(32.15*ac/tw); n[19]='Q,cfs='+ac*vc;";   var Civ_Hyd_nA = new Array("('Civ_Hydro-Hydraulics',CHyd0)",  "('s} Energy Ballance',CHydB)",  "('','')",  "('n} Peak Flow, nwIL',CHpkILnw)",  "('n} Rational Meth, nwIL',CHratIln)",  "('n} Stormwater Storage',CHdet)",  "('*} Brd.Crest Weir, Q,cfs','3.1*(/*weirLength,ft*/ )*Math.pow((/*head,ft*/ ),1.5)')",  "('n} Hyd.Control Struct.',CHydCStr)",  "('n} Normal Open Chan.',CHydMan)",  "('','')",  "('','')",  "('','')");   var StrLL="var f=(/*TYP.Live Loads (see local code for actual) lb/sf >for kg/sm, replace 1 w/ 4.88*/1.0); ";   StrLL +="n[0]='__Use__'; n[10]='_Typ_L.L_'; n[1]='heavy.mfg.'; n[11]=Mr(250*f,0); n[2]='l.mfg,warehse'; ";   StrLL +="n[12]=Mr(125*f,0); n[3]='gym,dining'; n[13]=Mr(100*f,0); n[4]='hall,balcony'; n[14]=Mr(80*f,0); ";   StrLL+="n[5]='1st.fl retail'; n[15]=Mr(75*f,0); n[6]='theater:fix.seat'; n[16]=Mr(60*f,0); n[7]='office,";   StrLL +="car.park'; n[17]=Mr(50*f,0); n[8]='residential'; n[18]=Mr(40*f,0); n[9]='no-access areas'; ";   StrLL +="n[19]=Mr(20*f,0);"; var StrMat="/*(Youngs) MODULUS OF ELASTICITY, E: Mat'l: mod. E  commonly: STEEL: mild structural (A36) 30 ";   StrMat +="E+6 psi, high-strength 29 & variable many grades;  WOOD: has even more grades.  Machine stress ";   StrMat +="rated lumber has some consistency: f(b) values run from 900psi to 3300psi (probably a rare ";   StrMat +="piece of wood) in 300psi increments--with an extra desig. at 1650psi.  Modulus of elasticity, ";   StrMat +="E, varies from 1,000,000psi to 2,600,000 according to the general rule of E=1,200,000psi + ";   StrMat +="(f(b)-1200)*2000/3, eg. 1200psi rated has typical E=1.2mil.psi; 1500psi ->E 1.4mil.psi.  As ";   StrMat +="for all timber, allowable f(b) can be increased by 15% if repetative members are used in an ";   StrMat +="element.  Thus, structural glue laminated timber runs f(b) from 1600-2400psi. (in 200psi ";   StrMat +="increments) while E corresponds with 1.6-1.8 mil.psi.  [Reduce both values by 20% for wet use ";   StrMat +="conditions.]  Visually rated lumber is more variable, TENDING to the samy TYPE of relation.  ";   StrMat +="Doug.Fir,Larch, Southern Pine have similar ranges: 1200-2000psi, E 1.5-1.9mil.psi for structural";   StrMat +=" types, S.Pine perhaps 10% higher.  Other species 10% and more, lower.  ALLOWABLE EXTREME FIBER ";   StrMat +="STRESS IN BENDING: f(b)>M/s :typically STEEL-(By AISC in compact sections=0.66x Yield Strength, ";   StrMat +="for non-compact=0.6x Fy ->) mild (A36 0.66*36ksi or 0.6*36) 24 0r 22 [ksi], {note F-ultimate";   StrMat +="~60+ksi}, high strength (Fy60) 39.6 or 60 [ksi] {F-ult.~85ksi};  WOOD-see discussion under mod.E";   StrMat +=" above. Code Max. DEFLECTION= L/360 for habitable floors, L/240 for ceilings w/o plaster. SHEAR,";   StrMat +=" fv [steel~.4fb, wood var] --allowable shear strength (US) lb/sq.in. or (SI) kg/sq.cm. to carry ";   StrMat +="the shear stress in col.K-L.  For STEEL, 0.4 * allowable extreme fiber stress in bending is ";   StrMat +="general value,  tho this operates only on the gross section = web thickness * beam depth.  ";   StrMat +="WOOD is susceptible to Horizontal Shear = 3/2 times the normal vertical shear, which is computed";   StrMat +=" in col.K-L.  In other words, the computed shear stress must be <= 2/3 the Horiz. Shear Strength";   StrMat +="which varies greatly between species of wood, but little within each species for structural ";   StrMat +="grades.  eg. Douglas Fir, Larch, Hemlock: horiz.shear strength is 85 to 95 psi.  2/3 of that = ";   StrMat +="60psi. <---value to enter.  Similar 2/3 horiz.shear values: balsam fir, 40; Cal.redwood, 60 ";   StrMat +="(or 97 for clear heart str.); eastern spruce, southern pine, 55; white pine, 43; Structural ";   StrMat +="Glue Laminated timbers tend to have shorz.shear strengths 1.8x the single board strength if ";   StrMat +="load is perpendicular to wide face, 1.6x if loaded parallel to wide face, deduct 20psf if under";   StrMat +=" wet service conditions.  NOTE: These are generalities.  Consult ratings specific to ";   StrMat +="available grades. SPECIFIC GRAVITY: typically: STEEL mild (A36) 7.86, high-strength 8.0;  WOOD";   StrMat +=" [at 12% moisture content, factor 1.15 for 20% moist, 0.92 oven dry]: HARDWOODS: Hickory 0.7, ";   StrMat +="Oak, Birch, Maple .6, Elm .55, Poplar .43:  SOFTWOODS: Southern Pine 0.52, Douglas Fir .48, ";   StrMat +="Spruce .4, White Pine, Redwood .38, Cedar .35 */";    var StrSecR="/*Rectangular Section Properties: units either US or SI as long as consistent. eg. say units=i:";   StrSecR +=" Beam =2i wide x 6i deep, then A=12ii, moment of inertia,I=36iiii, section modulus,S=I/c=12iii,";   StrSecR +=" radius of gyration,r=1.73. All this is about a horiz.axis through the centroid,c=3i from base.";   StrSecR +=" If the axis translated 3i from centroid (i.e. to base), I=144, r=3.46. {Note: move axis x ";   StrSecR +="units, I=I+Axx} OR if the axis rotated 30-degrees, in std.directn: ccw from the horiz, I=28, ";   StrSecR +="r=1.53.*/ n[0]='_Sect_Prop_'; n[10]='_rectangular_'; n[1]='base width <'; var b=n[11]; n[2]=";   StrSecR +="'beam dep. <'; var d=n[12]; n[3]='A='+Fo(b*d); var I=b*d*d*d/12; n[4]='I='+Fo(I); n[13]='S=";   StrSecR +="'+Fo(b*d*d/6); n[14]='r='+Fo(Math.sqrt(d*d/12)); n[5]='_move_axis_'; n[15]='>_centroid_>'; n[6]";   StrSecR +="='translate.c.<'; var c=n[16]; I+=b*d*c*c; n[7]='I='+Fo(I); n[17]='r='+Fo(Math.sqrt(I/(b*d))); ";   StrSecR +="var a=n[18]; n[8]='rotate.h.ang<'; var c1=Math.sin(a*Math.PI/180); var c2=Math.cos(a*Math.PI/";   StrSecR +="180); c1=b*b*c1*c1 +d*d*c2*c2; n[9]='I='+Fo(b*d*c1/12); n[19]='r='+Fo(Math.sqrt(c1/12));"; var StrSecI="/*Rect. based shapes: Outer dimensions, base & depth entered. Rather than enter web & flange ";   StrSecI +="thick., the inner rectangle entered. H-shape is ][ at y-axis. Definitions in 'Rectang.sect.'. ";   StrSecI +="eg. 4x6 outside, 2x5 inside dim: A=14 for any orientation; S=17.1 as I-shape, etc, S=12.1 as ";   StrSecI +="H.*/ n[0]='[],I,H shapes'; n[10]='_outer_dim_'; n[1]='base width <'; var b=n[11]; n[2]='beam ";   StrSecI +="dep. <'; var d=n[12]; n[3]='. inner_wid.<'; var b1=n[13]; n[4]='.inner_dep.<'; var d1=n[14]; ";   StrSecI +="n[5]=' . common >'; n[15]='A='+Fo(b*d -b1*d1); n[6]='I, [] shape_>'; var I=(b*d*d*d ";   StrSecI +="-b1*d1*d1*d1)/12; n[16]='S='+Fo(I*2/d); n[7]='I='+Fo(I); n[17]='r='+Fo(Math.sqrt(I/";   StrSecI +="(b*d-b1*d1))); n[8]='_H shape_>'; var f=b-b1; var t=d-d1; I=(f*d*d*d +b1*t*t*t)/12; ";   StrSecI +="n[18]='S='+Fo(I*2/d); n[9]='I='+Fo(I); n[19]='r='+Fo(Math.sqrt(I/(b*d-b1*d1)));"; var StrSecL="/*L & trapezoid shapes: eg. L-shape: 6d x 4w with stem thicknes of 1 & lower leg 0.5 thick; ";    StrSecL +="A=7.5, centroid distance & S rel. to bottom =2.45, =11.06, I=27.1, r=1.9. eg. for trapezoidal ";   StrSecL +="shape, L/: using same dimensions, except low leg thick n/a, centroid to bottom =2.4, A=15.0, ";   StrSecL +="S rel.bottom=14.2, I=39.6, r=1.625.*/ n[0]='L & L/ sh.dp<'; var d=n[10]; n[1]='top, stem.w<'; ";   StrSecL +="var t=n[11]; n[2]=' . bot.width <'; var b=n[12]; n[3]='L_bot.thick <'; var t2=n[13]; n[4]=";   StrSecL +="'centroid-bot>'; var c=(t*d*d +(b-t)*t2*t2)/(2*(t*d+(b-t)*t2)); n[14]=c; n[5]='A='+(b*t2+t*";   StrSecL +="(d-t2))/1; var I=(b*c*c*c -(b-t)*(c-t2)*(c-t2)*(c-t2) +t*(d-c)*(d-c)*(d-c))/3; n[15]='S.bot='+";   StrSecL +="I/c; n[6]='I='+I; n[16]='r='+Math.sqrt(I/(b*t2 +t*(d-t2))); n[7]='L/ _centr-b_>'; ";   StrSecL +="c=d*(2*t+b/1)/(3*(b/1+t/1)); n[17]=c; var A=d*(b/1+t/1)/2; n[8]='A='+A; I=d*d*d*(b*b+4*b*t+t*t)";   StrSecL +="/(36*(b/1+t/1)); n[18]='S.bot='+I/c; n[9]='I='+I; n[19]='r='+Math.sqrt(I/A);"; var StrSecO="/*Circular: eg. Solid dia.2, A=3.14, I=S=.785, etc. eg. pipe, inner dia 1.25, A=1.91, I=.66.*/";   StrSecO +=" n[0]='CIRCULAR'; n[10]='_solid_bar_'; n[1]=' . diameter <'; var d=n[11]; var PI=Math.PI; n[2]=";   StrSecO +="'A='+PI*d*d/4; var I=PI*d*d*d*d/64; n[12]='S='+2*I/d; n[3]='I='+I; n[13]='r='+d/4; n[4]=''; ";   StrSecO +="n[14]='_hollow_pipe'; n[5]=' . inner dia.<'; var d1=n[15]; n[6]='A='+PI*(d*d-d1*d1)/4; I=PI*";   StrSecO +="(d*d*d*d-d1*d1*d1*d1)/64; n[16]='S='+2*I/d; n[7]='I='+I; n[17]='r='+Math.sqrt(d*d+d1*d1)/4;"; var StrLum="/*US dimensional lumber up to 6-in, is dressed 1/2-inch less than nominal, 8-in & bigger is 3/4";   StrLum +="-inch short. eg. a 2x4 is 1.5-in x 3.5-in, has area=5.25sq.in, & S=3.06cu.in in 4-in directn. ";   StrLum +="typical (MUST BE CONFIRMED!) spruce, white pine, etc. with allowable f-bending 900psi can ";   StrLum +="a moment,M =230ft-lb, with compressive strength (parallel to grain, allow 900psi) C=31,500lb, ";   StrLum +="& dead load (at 25 lb/c.f) w=0.9 lb/ft. Douglas fir, select structural, with f-b of 1600psi ";   StrLum +="capacity M=408 ft.lb, C=47,250 lb (all subject to length/r for buckling), & w=1.1 lb/ft.*/ ";   StrLum +="n[0]='Lumber_size'; n[10]='_nominal_'; n[1]=' . . width, in <'; var b=n[11]-0.5; if (b>6){b-=";    StrLum +="0.25} n[2]=' . height, in <'; var d=n[12]-0.5; if (d>6){d-=0.25}; n[3]=' . . . . actual >'; ";   StrLum +="n[13]=Fo(b)+' x '+Fo(d); n[4]='A,s.in.='+d*b; var S=b*d*d/6; n[14]='S,cu.in='+S; n[5]='I,in**4=";   StrLum +="'+b*d*d*d/12; n[15]='r,in='+Math.sqrt(d*d/12); n[6]='_typ_spruce>'; n[16]='M,ft.lb='+900*S/12; ";   StrLum +="n[7]='C,lb='+6000*b*d; n[17]='w,lb/ft='+25*b*d/144; n[8]='typ_d.fir_ss.>';  n[18]='M,ft.lb='";   StrLum +="+1600*S/12; n[9]='C,lb='+9000*b*d; n[19]='w,lb/ft='+30*b*d/144;"; var StBmSS="/*Simply Supported Beam: eg. 8-ft span, unif. load,w=50lb/ft; point load of 200lb located 6-ft ";   StBmSS +="from left end. Check beam at 3-ft from left end: (Note- max moment,M will occur between the ";   StBmSS +="mid-point (4-ft) & 6-ft where point loaded, this for illustration.) Beam f-b, allow. extreme ";   StBmSS +="fiber strength in bending, 1400psi, and combined EI (mod. of elasticity 1.3E6 psi times I ";   StBmSS +="assumed 178 in.-to-4th-power) =231.4E6 lb-sq.in. Output: left & right reactions, R=250 & 350 ";   StBmSS +="lb, shear, V= 100lb. (V/A of section tests against f-v, 3V/2 for horiz.shear) Mx(at pt.x)=525ft";   StBmSS +="=.lb; min. S =M/f 4.5, deflection=0.028-in (genl: defl.<L/360 (8*12/360=0.26-in) if plastered, ";   StBmSS +="L/240 otherwise).*/ n[0]='.--L--. Len,ft <'; var L=n[10]; n[1]='unif. w: lb/ft <'; var w=n[11];";   StBmSS +=" n[2]='sgl.ld: P,lb <'; var P=n[12]; n[3]='dist.P.left: ft<'; var a=n[13]; n[4]='chk.pt.x: ";   StBmSS +="lt,ft<'; var X=n[14]; n[5]='Beam_f,psi<'; n[6]='combin.EI <'; var Rlw=w*L/2; var Rlp=P*(L-a)/L;";   StBmSS +=" n[7]='R-lt,lb='+(Rlw/1 +Rlp/1); var Rrw=w*L/2; var Rrp=P*a/L; n[17]='R-rt,lb='+(Rrw/1 +Rrp/1);";   StBmSS+=" var Vx=w*(L/2-X); var Mx=w*X*(L-X)/2; if (X<a){Vx+=Rlp; Mx+=Rlp*X} else {Vx+=Rrp; Mx+=Rrp*(L-X)}";   StBmSS +=" n[8]='Vx,lb='+Vx; n[18]='Mx,ft.lb='+Mx; n[9]='S,c.in>'+Mx*12/n[15]; var dx=P*1728/(6*n[16]*L);";   StBmSS +=" if (X<a){dx*=X*(L-a)*(L*L-(L-a)*(L-a)-X*X)} else {dx*=(L-X)*a*(L*L-a*a-(L-X)*(L-X))} ";   StBmSS +="dx+=w*X*(L*L*L -2*L*X*X +X*X*X)*1728/(24*n[16]); n[19]='defl,in='+dx;";    var Civ_Str_nA = new Array("('Civ_Structures . . . s} . .','Def. in 1st ea. group: know thy limits!')",  "('s} Typical L.L. table',StrLL)",  "('s} Matl, Properties',StrMat)",  "(' . . .','')",  "('n} Section: Rectangle',StrSecR)",  "('n} Sec: [], I, H shapes',StrSecI)",  "('n} Sec: L, trap. shape',StrSecL)",  "('n} Sec: Circular shape',StrSecO)",  "('n} Sec: std.US lumber',StrLum)",  "(' . . .','')",  "('n} Beam: simple sup.',StBmSS)",  "(' . . .','')",  "(' . . .','')",  "(' . . .','')",  "('','')"); var DataSR="JavaScript is SAFE: no functions a virus can use to destroy data. Which makes saving ";   DataSR +="data difficult -must use 'copy'&'paste'. TO SAVE 1)-Use text editor. (Easily obtained: ";   DataSR +="View->Source Code->File->New gets NotePad from Internet Explorer; & ->composer page ";   DataSR +="from Mozilla; etc.) 2)-Place cursor in box with data. 3)-Edit->Select All->Copy 4)-paste";   DataSR +=" to text file.  Data in n[0..19] could be laborious, 1 at a time. sCal provides utility ";   DataSR +="to dump all values to the m-cell. User can select order & delimiters (to transfer to a ";   DataSR +="spreadsheet or database program); n[index] to restore to sCal (paste to x-cell); etc."; var DataNdM="var d=(/*delimiter*/', '); m=''; for (j=0;j<20;j++){m+=n[j]+d}"; var DataNsM="var d=(/*delimiter*/', '); m=''; for (j=0;j<10;j++){m+=n[j]+d+n[j+10]+d}"; var Quote="'"; var DataNaM="m=''; for (j=0;j<20;j++){m+='n['+j+']='+Quote+n[j]+Quote+'; '}";   var Data_Ma_nA = new Array("('Data_Management s}','for manipulating & displaying data')",   "('s} save/restore Data',DataSR)",  "('*} n[1..19] > memory',DataNdM)",  "('*} n0, n10, n1, n11 >m',DataNsM)",  "('x} n[0], n[1], . . . . . > m',DataNaM)",  "('','')",  "('n} parabola curve fit',PCurv)",     //Source at Analytic Geometry  "(' . . .','')",  "('n} linear regress. 1-var',mRegres)",//Source at Analytic Geometry  "('n} linear regress.2-var',nRegres)", //Source at Analytic Geometry  "('s} Statistics on data','see Probability, Statistics group')",  "('x} Pseudo-Graphing',J_Graph)",      //Source at JavaScript samples  "('n} Interpolate / Extrap.',Interp)", //Source at JavaScript samples  "(' . . .','')",  "('s} ext.Table(geo time)',TimeGeo)", // Source code at Time_Fcns  "(' . . .','')",  "('','')"); var RanderI="Instruct: 2 player; select Random Num. above; player-1: [Do], use [n0] to [n9] ";   RanderI +="place in cell, [C] to clear x; player-2: [Do], use [n10] to [n19] to place in cell,";   RanderI +=" [C] to clear; back to player-1 & continue alternating until all 20 cells filled. ";   RanderI +="OBJECT: place random numbers in order lowest to highest in column. [C]>[Do] Scorder."; var Scorder="var P1=10; P2=10; for (j=0;j<9;j++){if (n[j]>n[j+1]){P1--}} for (j=10;j<19;j++)";   Scorder +="{if (n[j]>n[j+1]){P2--}} m=' P1='+P1+'; P2='+P2"; var CasIns="INSTR: 1 player; select Random No.(1-11) above; [Do], use [n0] to [n19] to place ";   CasIns +="in cell' [C] clear, repeat. OBJECT: obtain highest score of closest to 21 total in ";   CasIns +="horiz. rows (like Blackjack) combined with highest score of matches (like slots) ";   CasIns +="in vert. columns. [C]->[Do] ScoreCasandom to see total. (check source for score ";   CasIns +="values; max. 378 on slots +360 blackjack =738, tho 400 good) Variant: 2 players: ";   CasIns +="alternating columns for max. slot score. Player completing 21 awarded manual 50 pts."; var ScoreCas="var B=0; P=new Array(0,0); var t=0; var k=0; for(j=0; j<10; j++) {t=n[j]/1+n[j+10]/1;";   ScoreCas +=" if(t>15 && t<22) {B+=Math.pow(t-15,2)} for(i=0;i<2;i++) {k=10*i; if(j<9 && n[k+j]";   ScoreCas +="==n[k+j+1]){P[i]+=n[k+j]/1} if(j>0 && n[k+j]==n[k+j-1]){P[i]+=n[k+j]/1}}} m='Slot-1=";   ScoreCas +="'+P[0]+'; Slot-2='+P[1]+'; BlackJack='+B+' for TOTAL='+parseInt(P[0]+P[1]+B)";   var Strateg_nA = new Array("('Strategic Planning . s}','These are games, random numbers, skill varies')",  "('x} . . .','')",  "('x} Random Num.(0 - 1)','Math.random()')",  "('s} RANDER: order no',RanderI)",  "('x} Scorder for Rander',Scorder)",  "('x} . . .','')",  "('x} Random No.(5 - 15)','Math.round(Math.random()*10)+5')",  "('s} . . CASANDOM:',CasIns)",  "('x} . Score Casandom',ScoreCas)",  "('x} . . .','')",  "('x} . NO.NINE','')",  "('x} . . .','')",  "('x} . . .','')",  "('x} . . .','')",  "(' . . .','')"); // ******** BROWSER DETERMINATION ** set Text size & [Enter] key to invoke xEval like [=] button var Browser = navigator.appName.substr(0,9); // alert('Browser is '+Browser); var MemSize = "10";  var TxtAreaCol = "26";            // Default (MS Internet Explorer) Text size & TextArea columns if (Browser=='Netscape')          // Mozilla is same as Netscape Navigator  {MemSize="12"; TxtAreaCol="25";} // Other Browsers may need some manual code work here.   function EnterKey_EqButton(e) {   // Response to .onkeypress. Other keyCodes could be added. var k=0; if (Browser=='Netscape') {k=e.which} else {k=window.event.keyCode;}  if (k==13) {xEval();} }          // NOTE: CURSOR MUST BE IN TEXTAREA WHEN PRESSED, OR LAST                                     // DIGIT IN X-DISPLAY IS APPENDED TO END OF EVALUATION. document.onkeypress = EnterKey_EqButton; // if (Browser='Netscape') {document.captureEvents(Event.KEYDOWN|Event.KEYUP);}   // *************************************** MENU POPULATION *****************   function populateGroup(inForm,selected) { // --- sets left GROUP MENUS to chosen right Category  var selectedArray = eval(selected.substring(0,7) + "_nA");  while (selectedArray.length < inForm.options.length) {   inForm.options[(inForm.options.length - 1)] = null;}  for (var i=0; i < selectedArray.length; i++) {   eval("inForm.options[i]=" + "new Option" + selectedArray[i]);} // OLDER BROWSERS MAY NEED FOLLOWING LINE TO DISPLAY OPTIONS, Leave out for newer ones: // window.history.go(0); } function setDefaultMenus() {  populateGroup(document.sCal.group1,document.sCal.catagory1.options[0].text);  populateGroup(document.sCal.group2,document.sCal.catagory2.options[0].text);  populateGroup(document.sCal.group3,document.sCal.catagory3.options[0].text); } //  End of  JavaScript Calculator sCal in HEAD --> </script> </HEAD> <!-- **************** HEAD *********************************************** --> <!-- ********************************************************************* --> <!-- ************************************** BODY ************************* --> <BODY onLoad="setDefaultMenus()"> <!-- ----------------- JavaScript (sCal) Calculator in BODY of html documant: --> <!-- This is free, open-source, user-modifiable code.  R.Mohaupt-Feb,2003 - No Warantee. --> <form name="sCal"> <table border=1 cellspacing=0 cellpadding=0 width=480> <!-- assign sCal BGCOLOR below, MAIN 2 x 2 table; ^ coordinate TextArea COLS with WIDTH--> <tr valign=top BGCOLOR="yellow">  <td>    <!-- *] [] top, left cell: sCal JavaScript Calculator layout table -->    <!-- [] []                 --------------------------------------- -->          <table border=1 cellspacing=0 cellpadding=0 WIDTH=238>   <tr>    <td colspan=6><b><large><u> JavaScript Calculator </u> . sCal-1ce</large></b></td>   </tr>   <tr align="center">    <td colspan=1><small><small>Place</small></small></td>    <td colspan=4><small><small>Constants, Functions</small></small></td>    <td colspan=1><small><small>Apply</small></small></td>   </tr> <!-- Top group1 drop-down SELECT menus: can change or add functions -->   <tr align="center">    <td><input type="button" value="JS "      onClick="JSwork(document.sCal.group1.options[document.sCal.group1.selectedIndex].value)">     </td>    <td colspan=4><select name="group1"><option value='Math.PI'>General convert x}. Pi .</option>     </select></td>    <td><input type="button" Value=">x "     onClick="Xwork(document.sCal.group1.options[document.sCal.group1.selectedIndex].value)">     </td>   </tr> <!-- Middle group2 SELECT menu: -->   <tr align="center">    <td><input type="button" value="JS "     onClick="JSwork(document.sCal.group2.options[document.sCal.group2.selectedIndex].value)">     </td>    <td colspan=4><SELECT name="group2"><option value="Math.pow(x,2)">Ordinary Math x} . (x)&sup2; .</option>      </select></td>    <td><input type="button" Value=">x "     onClick="Xwork(document.sCal.group2.options[document.sCal.group2.selectedIndex].value)">     </td>   </tr> <!-- Bottom group3 SELECT menu: Much PROGRAMMABLE AREA available -->   <tr align="center">    <td><input type="button" value="JS "     onClick="JSwork(document.sCal.group3.options[document.sCal.group3.selectedIndex].value)">     </td>    <td colspan=4><SELECT name="group3"><option value="Math.sqrt(x)">Special: *} . root (x)&frac12;</option>      </select></td>    <td><input type="button" Value=">x "     onClick="Xwork(document.sCal.group3.options[document.sCal.group3.selectedIndex].value)">     </td>   </tr>   <tr>    <td colspan=6><small><small>Display - x</small></small></td>   </tr>   <tr> <script language="JavaScript" type="text/javascript"> <!-- document.write('<td colspan=6><TextArea name="IOx" rows=4 COLS='+TxtAreaCol+'></TextArea></td>');  --> </script>   </tr>   <tr>    <td colspan=6><small><small>Memory - m</small></small></td>   </tr> <!-- buttons & small MEMORY text box: -->   <tr align="center">    <td><input type="button" Value="x&rsaquo;m" onClick="XtoM()"></td>    <td><input type="button" Value="m&rsaquo;x" onClick="MtoX()"></td>    <td colspan=2> <script language="JavaScript" type="text/javascript"> <!-- document.write('<INPUT TYPE="text" NAME="IOm" VALUE="" SIZE='+MemSize+'>');  --> </script>    </td>    <td><input type="button" Value="m+" onClick="Mplus()"></td>    <td><input type="button" Value="mc" onClick="Mclear()"></td>   </tr>   <tr>    <td colspan=6><small><small>.</small></small></td>   </tr> <!-- main layout of CALCULATOR keypad buttons: -->   <tr align="center">    <td><input type="button" Value="  7  " onClick="xPlusEq(7)"></td>      <td><input type="button" Value="  8  " onClick="xPlusEq(8)"></td>      <td><input type="button" Value="  9  " onClick="xPlusEq(9)"></td>    <td><input type="button" Value="  (   " onClick="xPlusEq('(')"></td>    <td><input type="button" Value="   )  " onClick="xPlusEq(')')"></td>    <td><input type="button" Value=" C  " onClick="Clear()"></td>   </tr>   <tr align="center">    <td><input type="button" Value="  4  " onClick="xPlusEq(4)"></td>    <td><input type="button" Value="  5  " onClick="xPlusEq(5)"></td>    <td><input type="button" Value="  6  " onClick="xPlusEq(6)"></td>    <td><input type="button" Value="  *   " onClick="xPlusEq('*')"></td>    <td><input type="button" Value="  /   " onClick="xPlusEq('/')"></td>    <td><input type="button" Value=" &lt;  " onClick="BkSpace()"></td>   </tr>   <tr align="center">    <td><input type="button" Value="  1  " onClick="xPlusEq(1)"></td>    <td><input type="button" Value="  2  " onClick="xPlusEq(2)"></td>    <td><input type="button" Value="  3  " onClick="xPlusEq(3)"></td>    <td><input type="button" Value="  +  " onClick="xPlusEq('+')"></td>    <td><input type="button" Value="  -   " onClick="xPlusEq('-')"></td>    <td><input type="button" Value="  ^ " onClick="xPlusEq('^')"></td>   </tr>   <tr align="center">    <td><input type="button" Value="  0  " onClick="xPlusEq('0')"></td>    <td><input type="button" Value="  &bull;  " onClick="xPlusEq('.')"></td>    <td><input type="button" Value=" +/- " onClick="xMultEq('-1')"></td>    <td><input type="button" Value="1/x "  onClick="recip()">    <td colspan=2><input type="button" Value="=, Enter" onClick="xEval()"></td>   </tr>   <tr>    <td colspan=6 align="right"><small><small>Civil Engr. vers. r.m.02</small></small></td>   </tr>  </table> </td> <td>   <!-- [] [* top, right cell: sCal2 Expansion layout table -->   <!-- [] []                  --------------------------- -->  <table border=1 cellspacing=0 cellpadding=0 WIDTH=238>   <tr>    <td colspan=6 align="center"><b><large><u>sCal2 Data Handling Expansion </u></large></b></td>   </tr>   <tr align="center">    <td><small><small>1/Do</small></small></td>    <td colspan=4><small><small>CATAGORY of Const, Fcn.</small></small></td>    <td><small><small>n[ ]</small></small></td>   </tr> <!-- Top(catagory1) drop-down SELECT menus: can change or add CATEGORIES -->   <tr align="center">    <td><input type="button" value="1/x"     onClick="DoRecip(document.sCal.group1.options[document.sCal.group1.selectedIndex].value)">     </td>    <td colspan=4><select name="catagory1"  onChange="populateGroup(document.sCal.group1,document.sCal.catagory1.options[document.sCal.catagory1.selectedIndex].text)"> <!-- ***************** catagory1 -- User add conversions, cv} and constants, cs} ********** -->     <option selected value='Math.PI'>General: convert x}. Pi .</option>     <option value=''>Length_convert x} ft&gt;m</option>     <option value=''>Area_convert x} ft&sup2; &gt;m&sup2;</option>     <option value=''>Volume_conv.x} ft&sup3 &gt;m&sup3;</option>     <option value=''>Time_Velocity x} hr > s.</option>     <option value=''>Mass_Force x} lb > kg</option>     <option value=''>Pressure x} p.s.i. > Pa</option>     <option value=''>Density x} p/cf > kg/m&sup3;</option>     <option value=''>Energy_or work s} Def.</option>     <option value=''>Power_rate of Work s}</option>     <option value=''>Heat_Temperature: s}</option>     <option value=''>Angular x} . . deg > rad</option>     <option value=''>Electric, Magnetism x}</option>     <option value=''>Light_Rad. lux>lum./sm</option>     <option value=''>Misc_Units each >doz.</option>     <option value=''></option>     <option value=''>Materials, Elements s}</option>     <option value=''>Math_Science cnst. s}</option>     <option value=''>Geo_Physical cnst. s}</option>     <option value=''>Prefixes to Units s}</option>     <option value=''>Charts_Series, misc.s}</option>     <option value=''></option>     <option value=''></option>      <!-- ----- end catagory1 ----- -->     </select></td>     <td><input type="button" value="nx " onClick="setNflag2()"></td>   </tr>   <tr align="center">    <td><input type="button" value="1/x"     onClick="DoRecip(document.sCal.group2.options[document.sCal.group2.selectedIndex].value)">     </td>    <td colspan=4><SELECT name="catagory2" onChange="populateGroup(document.sCal.group2,document.sCal.catagory2.options[document.sCal.catagory2.selectedIndex].text)"> <!-- ***************** catagory2 -- User add ordinary and general functions, fn} ********** -->     <option selected value="Math.pow(x,2)">Ordinary Math x} . (x)&sup2; .</option>     <option value="Math.pow(x,y)">Esoteric Math *} .(x)^y</option>     <option value="">Algebra . . . . . s} . terms</option>     <option value="">Analytic Geometry . . s}</option>     <option value="">Mensuration .s} . terms</option>     <option value="">*</option>     <option value="">Finance *} . . . . . . $ &gt; &euro; .</option>     <option value="">Physics . . . . . s} . terms</option>     <option value="">Probability, Statistic s}</option>     <option value="">Time_Function: x}Now</option>     <option value="">*</option>     <option value="">JavaScript samples</option>     <option value="">*</option>     <option value="">*</option>     <option value="">*</option>      <!-- ----- end catagory2 ----- -->     </select></td>    <td><input type="button" value="n[ ]" onClick="setNflag1()"></td>   </tr>   <tr align="center">    <td><input type="button" value="1/x"     onClick="DoRecip(document.sCal.group3.options[document.sCal.group3.selectedIndex].value)">     </td>    <td colspan=4><SELECT name="catagory3" onChange="populateGroup(document.sCal.group3,document.sCal.catagory3.options[document.sCal.catagory3.selectedIndex].text)"> <!-- ***************** catagory3 -- User add special programs, pg} (or anything) ********** -->     <option selected value="Math.sqrt(x)">Special: pg} . . root (x)&frac12;</option>     <option value="">User_01 . . . . . blank set</option>     <option value="">User_02 . . . . . blank set</option>     <option value="">User_03 . . . . . blank set</option>     <option value="">*</option>     <option value="">Civ_Highway-Survey</option>     <option value="">Civ_Hydro-Hydraulics</option>     <option value="">Civ_Structures . . . s} . .</option>     <option value="">*</option>     <option value="">Data_Management s}</option>     <option value="">*</option>     <option value="">Strategic Planning . s}</option>     <option value="">*</option>     <option value="">*</option>     <option value="">*</option>      <!-- ----- end catagory3 ----- -->     </select></td>    <td><input type="button" value="nc " onClick="Nclear()"></td>    </tr> <!-- begin layout of name/number n[0..20] data array -->   <tr>    <td align="right"><input type="button" value="n 0" onClick="nData(0)"></td> <script language="JavaScript" type="text/javascript"> <!-- document.write('<td colspan=2><input type="text" name="n0" size='+MemSize+'></td>');  // size set to browser document.write('<td colspan=2><input type="text" name="n10" size='+MemSize+'></td>'); // at end of HEAD --> </script>    <td><input type="button" value="10 " onClick="nData(10)"></td>   </tr>   <tr>    <td align="right"><input type="button" value="n 1" onClick="nData(1)"></td> <script language="JavaScript" type="text/javascript"> <!-- document.write('<td colspan=2><input type="text" name="n1" size='+MemSize+'></td>'); document.write('<td colspan=2><input type="text" name="n11" size='+MemSize+'></td>'); --> </script>    <td><input type="button" value="11 " onClick="nData(11)"></td>   </tr>   <tr>    <td align="right"><input type="button" value="n 2" onClick="nData(2)"></td> <script language="JavaScript" type="text/javascript"> <!-- document.write('<td colspan=2><input type="text" name="n2" size='+MemSize+'></td>'); document.write('<td colspan=2><input type="text" name="n12" size='+MemSize+'></td>'); --> </script>    <td><input type="button" value="12 " onClick="nData(12)"></td>   </tr>   <tr>    <td align="right"><input type="button" value="n 3" onClick="nData(3)"></td> <script language="JavaScript" type="text/javascript"> <!-- document.write('<td colspan=2><input type="text" name="n3" size='+MemSize+'></td>'); document.write('<td colspan=2><input type="text" name="n13" size='+MemSize+'></td>'); --> </script>    <td><input type="button" value="13 " onClick="nData(13)"></td>   </tr>   <tr>    <td align="right"><input type="button" value="n 4" onClick="nData(4)"></td> <script language="JavaScript" type="text/javascript"> <!-- document.write('<td colspan=2><input type="text" name="n4" size='+MemSize+'></td>'); document.write('<td colspan=2><input type="text" name="n14" size='+MemSize+'></td>'); --> </script>    <td><input type="button" value="14 " onClick="nData(14)"></td>   </tr>   <tr>    <td align="right"><input type="button" value="n 5" onClick="nData(5)"></td> <script language="JavaScript" type="text/javascript"> <!-- document.write('<td colspan=2><input type="text" name="n5" size='+MemSize+'></td>'); document.write('<td colspan=2><input type="text" name="n15" size='+MemSize+'></td>'); --> </script>    <td><input type="button" value="15 " onClick="nData(15)"></td>   </tr>   <tr>    <td align="right"><input type="button" value="n 6" onClick="nData(6)"></td> <script language="JavaScript" type="text/javascript"> <!-- document.write('<td colspan=2><input type="text" name="n6" size='+MemSize+'></td>'); document.write('<td colspan=2><input type="text" name="n16" size='+MemSize+'></td>'); --> </script>    <td><input type="button" value="16 " onClick="nData(16)"></td>   </tr>   <tr>    <td align="right"><input type="button" value="n 7" onClick="nData(7)"></td> <script language="JavaScript" type="text/javascript"> <!-- document.write('<td colspan=2><input type="text" name="n7" size='+MemSize+'></td>'); document.write('<td colspan=2><input type="text" name="n17" size='+MemSize+'></td>'); --> </script>    <td><input type="button" value="17 " onClick="nData(17)"></td>   </tr>   <tr>    <td align="right"><input type="button" value="n 8" onClick="nData(8)"></td> <script language="JavaScript" type="text/javascript"> <!-- document.write('<td colspan=2><input type="text" name="n8" size='+MemSize+'></td>'); document.write('<td colspan=2><input type="text" name="n18" size='+MemSize+'></td>'); --> </script>    <td><input type="button" value="18 " onClick="nData(18)"></td>   </tr>   <tr>    <td align="right"><input type="button" value="n 9" onClick="nData(9)"></td> <script language="JavaScript" type="text/javascript"> <!-- document.write('<td colspan=2><input type="text" name="n9" size='+MemSize+'></td>'); document.write('<td colspan=2><input type="text" name="n19" size='+MemSize+'></td>'); --> </script>    <td><input type="button" value="19 " onClick="nData(19)"></td>   </tr>  </table>  </td> <!-- end of top, right cell --> </tr> </FORM> <tr valign=top>  <td>    <!-- [] [] lower, left cell: sCal basic DOCUMENTATION -->    <!-- *] []                   ------------------------ -->    <table border=1 width=238>  <tr><td><small><b>Notes on JavaScript Calculator - sCal</b></small></td></tr>  <tr><td><small>  <b>&nbsp;&nbsp; Operation</b> on lowest level = a simple calculator: click on-screen buttons   <b>or</b> use keyboard <i>-- best for inserting values or programming. </i> On a higher level,   some functions are available as buttons or from drop-down select menus: designated by   <b>x}</b>. These operate directly on entire value in x-display, not just last   term, when the <b>[>x]</b> clicked. <i>(The </i><b>[^]</b><i> takes all values left of it as   base, all to the right as exponent.)</i> Trade values in and out of <b>Memory</b> to control.  -Experiment-. Test on known data.<br>  <b>&nbsp;&nbsp; *} Programs</b> invoked with the <b>[JS]</b> button, give much more control:  replace alpha-characters with numeric, or insert after /*com'nt-prompt*/ ) before closing   ')'. Write legitimate JavaScript expressions --evaluated according to interpreter's  parser. NaN is Not a Number, can often correct.<br>  <b>&nbsp;&nbsp; Programming</b> is on the highest level. Definitely <b>view source code</b>.   Programming experience is desireable, but with minimal effort, one's most-used functions  can be inserted in the source (well commented for the purpose). Copy - Paste from any TEXT  file. <b>s}</b> comments can be set to display.<br>  <b>&nbsp;&nbsp; GNU General Public License</b> Free, user-modifiable, NO WARANTEE. (c) 2003 <br>  R. Mohaupt. <a href="http://scal-2.sourceforge.net">http://scal-2.sourceforge.net</a>  </small></td>  </tr>  </table>  </td>  <td>    <!-- [] [] lower, right cell: sCal2 Expansion DOCUMENTATION -->   <!-- [] [*                    ----------------------------- -->  <table border=1 width=238>  <tr><td><small><b>JavaScript Calculator Expansion - sCal2</b></small></td></tr>  <tr><td><small>  Basic <b>sCal</b> is designed for a small window, (floating over larger screens with other   programs running, or alone on PDAs) to perform simple scientific calculations with a limited  library of add-on procedures.<br>  <b>&nbsp &nbsp sCal2</b> is no vast increase in computing power but, doubling the footprint, adds:  <b>Catagories</b> to systematically handle many times the conversion/procedure selection;  <b>[1/x]</b> buttons to reciprocate conversions, eg. ft&gt;m [>x] gets m&gt;ft with [1/x],  tan(x) becomes cotan(x), etc --but sometimes makes no sense, eg. 1/deg.C != deg.F;<br>  <b>n[0..19]</b> array of additional variables for 20 more memory slots {click the desired  <b>[n-]</b> button to put x to it} or programming input prompts and output labels. Procedures using  this feature are designated by <b>n}</b>, invoke with the <b>[JS]</b> button, occasionally w/[=],  run/rerun with new values [=, Enter], usually [c] clear between programs;<br>  <b>[nx]</b> followed by the desired [n-] cell-button, moves that cell value to the x-disp.  Similarly, <b>[n[]]</b> puts the next [n-] name in x, and <b>[nc]</b> clears all.<br>  * sCal needs a JS-enabled browser and no additional files, for maximum portability.<br>  * More documentation may be created.<br> * Compact display and file size are goals.    </small></td>  </tr>  </table> </td> </tr> </table>        </body> </html>