


var Presdt = [
	   ["start",
	    [
	     ["tbCenter", "Functional Programming<br>in<br>Javascript", { "top":120, "fontSize":48, "fontWeight":"bold" } ],
	     ["tbCenter", "Pinkhas Nisanov", { "top":450, "fontSize":26 } ],
	     ["tbCenter", "6 November 2007", { "top":480, "fontSize":20 } ]
	     ]
	    ],
	   ["Why Javascript?",
	    [
	     ["title", "Why Javascript?"],
	     [ "next", "tb", "AJAX - engine behind Web 2.0", { "left":50, "top":100, "fontSize":24 } ],
	     [ "next", "tb", "Asynchronous <b><font color='red'>Javascript</font></b> Access Xml", { "left":50, "top":140, "fontSize":24 } ]
	     ]
	    ],
	   ["Why Functional Programming?",
	    [
	     ["title", "Why Functional Programming?"],
	     [ "next", "tb", "New ( Old !? ) world trend", { "left":50, "top":100, "fontSize":26 } ],
	     [ "next", "leftIn", 80, 130, "tb", "<a href='http://blip.tv/file/324976'>Haskel presentation by microsoft reseach engineer</a>", { "fontSize":20 } ],
	     [ "next", "tb", "Advanced technics in programming languages without OOP", { "left":50, "top":170, "fontSize":26, "width":800 } ],
	     [ "next", "tb", "Functional vs OOP", { "left":50, "top":210, "fontSize":26, "width":800 } ],
	     ["next", "tb",  "<a href='http://mitpress.mit.edu/sicp/full-text/book/book.html'>SICP - Structure and Interpretation of Computer Programs</a>", { "left":50, "top":250, "fontSize":26, "width":800 } ],
	     ]
	    ],

	   ["Functional Programming Basic Features",
	    [
	     ["title", "Functional Programming Basic Features"],
	     [ "next", "tb", "first-class functions (including anonymous functions)", { "left":50, "top":100, "fontSize":26 } ],
	     [ "next", "leftIn", 80, 130, "tb", "a first class function can be created during the execution of a program, stored in a data structure, passed as an argument to another function", { "fontSize":20, "width":800 } ],
	     [ "next", "tb", "closures", { "left":50, "top":190, "fontSize":26 } ],
	     [ "next", "leftIn", 80, 220, "tb", "A closure is a function created by a program at run time. This idea is written as a function that appears entirely within the body of another function. The nested, inner function may refer to local variables of the outer function. As the outer function executes, it creates a closure of the inner function.", { "fontSize":20, "width":800 } ],
	     [ "next", "tb", "recursion", { "left":50, "top":320, "fontSize":26 } ],
	     [ "next", "leftIn", 80, 350, "tb", "The definition of an operation in terms of itself", { "fontSize":20, "width":800 } ]

	     ]
	    ],

	   ["Recursion",
	    [
	     ["title", "Recursion"],
	     ["next", "tb", "\"Box In Box\" ", { "left":50, "top":100, "fontSize":26 } ],
	     ["next", "tb",

'var setStyle = function ( elem, newStyle ) {<br>'+
'&#160;&#160;   for ( var stylePrm in newStyle ) {<br>'+
'&#160;&#160;&#160;&#160;     elem.style[ stylePrm ] = newStyle[ stylePrm ];<br>'+
'&#160;&#160;   }<br>'+
'};<br><br>'+


'var pdv = document.createElement( "div" );<br>'+
'function bib ( bSize, bPrnt ) {<br>'+
'&#160;&#160;  if ( bSize < 40 ) return;<br>'+
'<br>'+
'&#160;&#160; var newdv = document.createElement( "div" );<br>'+
'&#160;&#160;  bPrnt.appendChild( newdv );<br>'+


'&#160;&#160; setStyle( newdv, { "position":"absolute" } );<br>'+
'&#160;&#160; setStyle( newdv, { "left":10, "top":10 } );<br>'+
'&#160;&#160; setStyle( newdv, { "width":bSize, "height":bSize } );<br>'+
'&#160;&#160;  var cEl = parseInt( 99 * bSize / 300 );<br>'+
'&#160;&#160;  var newClr = "#"+cEl+"bb"+cEl;<br>'+
'&#160;&#160;  newdv.style.background = newClr;<br>'+
'<br>'+
'&#160;&#160;  bib( bSize - 20, newdv );<br>'+
'};<br>'+
'bib( 300, pdv );',
 { "left":80, "top":150, "fontSize":16 } ],
	     ["next", "runindiv", Example.bibEx, { "left":500, "top":100 } ],
	     ]
	    ],


	   ["Recursion",
	    [
	     ["title", "Recursion"],
	     ["next", "tb", "\"One button\" ", { "left":50, "top":100, "fontSize":26 } ],
	     ["next", "tb",
'var btn = document.createElement( "button" );<br>'+
'var swdv = document.createElement( "div" );<br>'+
'var swOff = function () {<br>'+
'&#160;&#160;  btn.innerHTML = "Switch ON";<br>'+
'&#160;&#160;  setStyle( swdv, { "background":"red" } );<br>'+
'&#160;&#160;  btn.onclick = swOn;<br>'+
'};<br>'+
'var swOn = function () {<br>'+
'&#160;&#160;  btn.innerHTML = "Switch OFF";<br>'+
'&#160;&#160;  setStyle( swdv, { "background":"green" } );<br>'+
'&#160;&#160;  btn.onclick = swOff;<br>'+
'};<br>'+
'swOff();<br>',
  { "left":80, "top":150, "fontSize":16 } ],
   	     ["next", "runindiv", Example.swBtn, { "left":600, "top":100 } ],
	     ]
	    ],


	   ["First-Class Functions",
	    [
	     ["title", "First-Class Functions"],
	     ["next", "tb", "\"Format Check Box\" ", { "left":50, "top":100, "fontSize":26 } ],
	     ["next", "tb",

'var pdv = document.createElement( "div" );<br>'+
'var chDt = [<br>'+
'&#160;&#160;&#160;&#160;["Bold",function ( eldv ) { eldv.style.fontWeight = "bold"; } ],<br>'+
'&#160;&#160;&#160;&#160;["Underline", function ( eldv ) { eldv.style.textDecoration = "underline"; } ],<br>'+
'&#160;&#160;&#160;&#160;["Italic", function ( eldv ) { eldv.style.fontStyle = "italic"; } ]<br>'+
'&#160;&#160;&#160;&#160;];<br>'+
'<br>'+
'var cats = [ "Lion", "Tiger" ];<br>'+
'var cellHt = 30;<br>'+
'var cellWd = 80;<br>'+
'var dresdv;<br>'+
'var shFn = function () {<br>'+
'&#160;&#160;if ( dresdv ) pdv.removeChild( dresdv );<br>'+
'&#160;&#160;dresdv = document.createElement( "div" );<br>'+
'&#160;&#160;var dOff = 0;<br>'+
'&#160;&#160;for ( var jj=0; jj&lt;cats.length; ++jj ) {<br>'+
'&#160;&#160;&#160;&#160;var catdv = document.createElement( "div" );<br>'+
'&#160;&#160;&#160;&#160;setStyle( catdv, { "position":"absolute", "top":dOff, "left":200, "fontSize":28 } );<br>'+
'&#160;&#160;&#160;&#160;catdv.innerHTML = cats[jj];<br>'+
'&#160;&#160;&#160;&#160;for ( var kk=0; kk&lt;chDt.length; ++kk ) {<br>'+
'&#160;&#160;&#160;&#160;&#160;&#160;if ( chDt[kk][2].checked ) chDt[kk][1]( catdv );<br>'+
'&#160;&#160;&#160;&#160;}<br>'+
'<br>'+
'&#160;&#160;&#160;&#160;dresdv.appendChild( catdv );<br>'+
'&#160;&#160;&#160;&#160;dOff += 50;<br>'+
'&#160;&#160;}<br>'+
'&#160;&#160;pdv.appendChild( dresdv );<br>'+
'};<br>'+
'<br>'+
'var chkOff = 0;<br>'+
'for ( var ii=0; ii&lt;chDt.length; ++ii ) {<br>'+
'&#160;&#160;var chkBx = document.createElement( "input" );<br>'+
'&#160;&#160;chkBx.type = "checkbox";<br>'+
'&#160;&#160;setStyle( chkBx, { "position":"absolute", "top":chkOff, "left":0 } );<br>'+
'&#160;&#160;chkBx.onclick = shFn;<br>'+
'&#160;&#160;var chkdv = document.createElement( "div" );<br>'+
'&#160;&#160;setStyle( chkdv, { "position":"absolute", "top":chkOff, "left":20, "fontSize":22 } );<br>'+
'&#160;&#160;chkdv.innerHTML = chDt[ii][0];<br>'+
'&#160;&#160;chDt[ii][2] = chkBx;<br>'+
'&#160;&#160;pdv.appendChild( chkBx );<br>'+
'&#160;&#160;pdv.appendChild( chkdv );<br>'+
'<br>'+
'&#160;&#160;chkOff += cellHt + 2;<br>'+
'}<br>'+
'<br>'+
'return pdv;<br>',
 { "left":80, "top":150, "fontSize":16 } ],
	     ["next", "runindiv", Example.chkFns, { "left":600, "top":100 } ],
	     ]
	    ],

	   ["Closures",
	    [
	     ["title", "Closures"],
	     ["next", "tb", "\"Stepper\" ", { "left":50, "top":100, "fontSize":26 } ],
	     ["next", "tb",

'var pdv = document.createElement( "div" );<br>'+
'<br>'+
'var stepper = function ( parent, sLf, sTp, step, limit, title ) {<br>'+
'&#160;&#160;var sEl = document.createElement( "div" );<br>'+
'&#160;&#160;setStyle( sEl, { "position":"absolute", "top":sTp, "left":sLf, "fontSize":20, "width":100 } );<br>'+
'&#160;&#160;sEl.innerHTML = title;<br>'+
'&#160;&#160;parent.appendChild( sEl );<br>'+
'<br>'+
'&#160;&#160;var currTop = sTp;<br>'+
'&#160;&#160;var direc = 1;<br>'+
'&#160;&#160;var stpFn = function () {<br>'+
'&#160;&#160;&#160;&#160;if ( currTop > limit ) direc = -1;<br>'+
'&#160;&#160;&#160;&#160;if ( currTop < sTp ) direc = 1;<br>'+
'&#160;&#160;&#160;&#160;currTop += step*direc;<br>'+
'&#160;&#160;&#160;&#160;setStyle( sEl, { "top":currTop } );<br>'+
'&#160;&#160;}<br>'+
'&#160;&#160;return stpFn;<br>'+
'};<br>'+
'<br>'+
'var t1 = document.createElement( "button" );<br>'+
'setStyle( t1, { "position":"absolute", "top":0, "left":10, "fontSize":28, "width":100, "textDecoration":"underline" } );<br>'+
't1.innerHTML = "Step 1";<br>'+
'pdv.appendChild( t1 );<br>'+
'<br>'+
'var t2 = document.createElement( "button" );<br>'+
'setStyle( t2, { "position":"absolute", "top":0, "left":130, "fontSize":28, "width":100, "textDecoration":"underline" } );<br>'+
't2.innerHTML = "Step 2";<br>'+
'pdv.appendChild( t2 );<br>'+
'<br>'+
'var s1 = stepper( pdv, 10, 50, 20, 200, "Step 11" );<br>'+
't1.onclick = s1;<br>'+
'var s2 = stepper( pdv, 130, 50, 40, 240, "Step 22" );<br>'+
	      't2.onclick = s2;<br>',
 { "left":80, "top":150, "fontSize":16 } ],
	     ["next", "runindiv", Example.stpEx, { "left":600, "top":100 } ],
	     ]
	    ],



	   ["T",
	    [
	     ["title", "To be continued..."]
	     ]
	    ]

	   ];
