var Site=function(){var CONST={cookie:{pre:"Tomek-Loboda-Site--",days:30},expMaxHeight:"500px",hashPairDelim:",",hashKeyDelim:"=",html:{dot:'<span class="dot">&nbsp;&nbsp;&bull;&nbsp;&nbsp;</span>'},lnk2html:{"new":"_blank",same:"_self"},none:-1,nextIdPre:"el",pageAppProp:"__app",pageTitlePrefix:"Tomek Loboda: ",scrollTimerDelay:200,titleImgW:978,url:"http://www.sis.pitt.edu/~tloboda"};var env={agent:{ie:(navigator.appName==="Microsoft Internet Explorer"),ff:(navigator.userAgent.indexOf("Firefox")!==-1),o:(navigator.userAgent.indexOf("Opera")!==-1)},platform:{iphone:(navigator.userAgent.indexOf("iPhone")!==-1)}};var evtLst=[];var state={areaTitleCol:false,currPgSecCnt:0,evts:[],logCnt:0,isMsg:false,nextId:0,pageIdx:CONST.none,sessId:"",subpageIdx:CONST.none,scrollYDoc:0,scrollTimer:null,ui:{content:null,subnav:null}};var ui={areaTitle:null,areaNav:null,areaSubnav:null,areaContent:null,content:null,imgCont:null,lyrics:null,mov:null,movCont:null,msg:{cont:null,from:null,handle:null,msg:null,send:null},imgTitleLst:[]};var pages=[];var title2lyrics={};function appendEndLine(o,cnt){for(var i=0;i<cnt;i++){$$("br",o)}}function bb2html(txt){return txt.replace(getRegExpBB01("nl"),"<br />").replace(getRegExpBB01("dot"),CONST.html.dot).replace(getRegExpBB02("b"),"<b>$1</b>").replace(getRegExpBB02("i"),"<i>$1</i>").replace(getRegExpBB02("u"),"<u>$1</u>").replace(getRegExpBB02("code"),'<span class="code">$1</span>').replace(getRegExpBB02("url"),'<a href="$1" class="url">$1</a>').replace(getRegExpBB_lnk(),'<a href="$3" target="'+CONST.lnk2html["$2"]+'" class="lnk">$1</a>')}function construct(){}function docScrollSave(){var scrollYDoc=getScrollY();if(scrollYDoc!=state.scrollYDoc){state.scrollYDoc=scrollYDoc;Cookie.set(CONST.cookie.pre+":doc-scroll-y",scrollYDoc,CONST.cookie.days)}}function getScrollY(){if(typeof(window.pageYOffset)=="number"){return window.pageYOffset}else{if(document.body&&(document.body.scrollLeft||document.body.scrollTop)){return document.body.scrollTop}else{if(document.documentElement&&(document.documentElement.scrollLeft||document.documentElement.scrollTop)){return document.documentElement.scrollTop}}}return -1}function ehTitleImgClick(e){if(state.areaTitleCol){ui.areaTitle.style.height="300px"}else{ui.areaTitle.style.height="120px"}state.areaTitleCol=!state.areaTitleCol;Cookie.set(CONST.cookie.pre+"area-title-col",(state.areaTitleCol?"1":"0"),CONST.cookie.days)}function getNextId(){return CONST.nextIdPre+state.nextId++}function initApp(){var wl=window.location;if(wl.hostname==="localhost"){CONST.url="http://localhost:"+wl.port+wl.pathname}state.sessId=$genSessId(3);$log(CONST.url,"site-load:v3|"+(new Date()).getTime()+"|"+(navigator.platform||"")+"|"+(screen&&screen.width?screen.width+"x"+screen.height:""),!env.agent.ff,{s:state.sessId,n:++state.logCnt,i:1,tz:(new Date()).getTimezoneOffset(),ref:encodeURIComponent(document.referrer)});window.onunload=function(e){$log(CONST.url,"site-unload",!env.agent.ff,{s:state.sessId,n:++state.logCnt})};ui.info=$("info");ui.areaTitle=$("area-title");ui.areaNav=$("area-nav");ui.areaSubnav=$("area-subnav");ui.areaContent=$("area-content");ui.imgCont=$("img-cont");ui.lyrics=$("lyrics");ui.mov=$("mov");ui.movCont=$("mov-cont");ui.msg.cont=$("msg-cont");ui.msg.handle=$("msg-handle");ui.msg.from=$("msg-f");ui.msg.msg=$("msg-m");ui.msg.send=$("msg-send");ui.msg.res=$("msg-res");ui.msg.cont.style.height="0px";for(var i=0,ni=pages.length;i<ni;i++){var p=pages[i];var img=$$("img",ui.imgCont);img.setAttribute("src","gfx/title/"+p.name+".jpg");img.setAttribute("alt",p.title);img.onclick=ehTitleImgClick;ui.imgTitleLst.push(img)}for(var i=0,ni=pages.length;i<ni;i++){var page=pages[i];genPage(page,i,CONST.none);if(!page.pages){continue}for(var j=0,nj=page.pages.length;j<nj;j++){var subpage=page.pages[j];genPage(subpage,i,j)}}var ip=0,is=CONST.none;var h=getHash();if(h.p&&pages[h.p]){ip=h.p;if(h.s&&pages[h.p].pages&&pages[h.p].pages[h.s]){is=h.s}}pub.setPage(ip,is);if(!env.platform.iphone){$show("msg");ui.msg.send.disabled=false;ui.msg.handle.onclick=function(e){if(state.isMsg){ui.msg.cont.style.height="0px"}else{ui.msg.cont.style.height="220px"}state.isMsg=!state.isMsg;$hide(ui.msg.res)};ui.msg.send.onclick=function(e){$hide(ui.msg.res);if(location.hostname.indexOf("localhost")!==-1){return}if($trim(ui.msg.msg.value).length===0){ui.msg.msg.className="error";return}ui.msg.send.value="Sending...";ui.msg.send.disabled=true;var extra=(!env.agent.ff?"&_="+(new Date()).getTime():"");$call("GET",CONST.url+"/cgi-bin/msg.cgi?s="+state.sessId+"&n="+(++state.logCnt)+"&f="+encodeURIComponent($trim(ui.msg.from.value))+"&m="+encodeURIComponent($trim(ui.msg.msg.value))+extra,null,function(res){if(res.outcome){ui.msg.msg.value="";ui.msg.res.innerHTML="message has been sent";ui.msg.res.style.display="inline"}else{ui.msg.res.innerHTML="message could not be send";ui.msg.res.style.display="inline";alert(res.msg)}ui.msg.send.value="Send";ui.msg.send.disabled=false},true)}}if(env.agent.o){window.onscroll=function(){if(state.scrollTimer){window.clearTimeout(state.scrollTimer)}state.scrollTimer=window.setTimeout(docScrollSave,CONST.scrollTimerDelay)}}for(var i=0,ni=state.evts.length;i<ni;i++){eval(state.evts[i])}$show($("app"));loadLastState()}function genPage(p,ip,is){var nav=$$("span",(is===CONST.none?ui.areaNav:pages[ip][CONST.pageAppProp].subnav),null,null,p.title.toLowerCase());nav.onclick=function(e){pub.setPage(ip,is)};var subnav=null;if(p.pages){subnav=$$("div",ui.areaSubnav,"span");$hide(subnav)}var cont=$$("div",null,null,"cont");p[CONST.pageAppProp]={cont:cont,imgs:[],imgsLoaded:false,nav:nav,subnav:subnav};if(p.nav){$$("div",cont,null,"sec-title","Table of contents").style.marginTop="10px";var pageNav=$$("div",cont,null,"in-page-nav");var ulNav=$$("ul",pageNav);$map(function(o){switch(o.t){case"sec":$$("li",ulNav,null,null,"<a href=\"javascript:$('ip:"+ip+", is:"+is+", sec:"+o.title.replace(/'/g,"")+"').scrollIntoView()\">"+o.title+"</a>");break;case"sec-sep":ulNav=$$("ul",pageNav);break}},p.cont)}state.currPgSecCnt=0;$map(function(o){json2html(o,cont,ip,is)},p.cont);ui.areaContent.appendChild(cont)}function getHash(){var h={};var P=window.location.hash.substring(1).split(CONST.hashPairDelim);$map(function(p){var tmp=p.split(CONST.hashKeyDelim);if(tmp[0]){h[tmp[0]]=tmp[1]}},P);return h}function getRegExpBB01(tag){return new RegExp("\\["+tag+"\\]",["gm"])}function getRegExpBB02(tag){return new RegExp("\\["+tag+"\\](.*?)\\[\\/"+tag+"\\]",["gm"])}function getRegExpBB_lnk(){return new RegExp('\\[lnk name=\\"(.*?)\\" dst=\\"(.*?)\\"\\](.*?)\\[\\/lnk\\]',["gm"])}function json2html(o,cont,ip,is){if(typeof o==="string"){cont.innerHTML+=bb2html(o)}else{if(o instanceof Array){$map(function(o){json2html(o,cont,ip,is)},o)}else{switch(o.t){case"btn":var btn=$$input("button",cont,o.id,o.cls,o.value);btn.onclick=o.onclick;break;case"div":case"span":case"p":var el=$$(o.t,cont,o.id,o.cssClass);$map(function(o){json2html(o,el,ip,is)},o.cont);break;case"code":var txt=(o.line||o.lines.join("\n"));var pre=$$("pre",cont);if(cont.innerText!==undefined){pre.innerText=txt}else{pre.appendChild(document.createTextNode(txt))}if(window.opera){pre.className+="opera-pre"}break;case"container":var d=$$("div",cont);if(o.align){d.style.textAlign=o.align}$map(function(o){json2html(o,d,ip,is)},o.cont);break;case"end-line":$$("br",cont);break;case"exp":var idH=getNextId();var idC=getNextId();var h=$$("div",cont,idH,"exp-handle-col exp-handle-col--"+o.cssClass,o.name);var c=$$("div",cont,idC,"exp-cont exp-cont--"+o.cssClass);c.style.maxHeight="0px";state.evts.push('$("'+idH+'").onclick = function (e) {  var h = $("'+idH+'");  var c = $("'+idC+"\");  if (c.style.maxHeight === '0px') {    h.className = 'exp-handle-exp + exp-handle-exp--"+o.cssClass+"';    c.style.maxHeight = '"+(o.maxHeight?o.maxHeight:CONST.expMaxHeight)+"';  }  else {    h.className = 'exp-handle-col exp-handle-col--"+o.cssClass+"';    c.style.maxHeight = '0px';  }}");$map(function(o){json2html(o,c,ip,is)},o.cont);break;case"file":var a=$$("a",cont);a.setAttribute("href",'javascript:Site.getFile("'+encodeURIComponent(o.path)+'");');if(o.cssClass){a.className=o.cssClass}$map(function(o){json2html(o,a,ip,is)},o.cont);break;case"gallery-set":GallerySet(o.items,cont);break;case"img":var img=$$("img",cont);img.setAttribute("border",0);if(o.name){img.setAttribute("alt",o.name)}if(o.width){img.setAttribute("width",o.width)}if(o.cssClass){img.className=o.cssClass}var app=(is===CONST.none?pages[ip][CONST.pageAppProp]:pages[ip].pages[is][CONST.pageAppProp]);app.imgs.push({img:img,src:o.src});break;case"inp":var inp=$$input("text",cont,o.id,o.cssClass,o.value);inp.disabled=o.disabled;break;case"inp-box":var inp=$$("textarea",cont,o.id,o.cssClass,o.value);inp.disabled=o.disabled;break;case"lnk":var a=$$("a",cont);a.setAttribute("href",o.uri);if(o.dst){a.setAttribute("target",CONST.lnk2html[o.dst])}if(o.cssClass){a.className=o.cssClass}if(!o.cont){a.appendChild(document.createTextNode(o.uri))}else{$map(function(o){json2html(o,a,ip,is)},o.cont)}break;case"lnk-lst":var tbl=$$("table",cont,null,"lnk-lst");if(!env.agent.ie){tbl.setAttribute("cellpadding",(o.cellpadding===undefined?0:o.cellpadding));tbl.setAttribute("cellspacing",(o.cellspacing===undefined?0:o.cellspacing))}else{tbl.cellPadding=(o.cellpadding===undefined?0:o.cellpadding);tbl.cellSpacing=(o.cellspacing===undefined?0:o.cellspacing)}var tbody=$$("tbody",tbl);$map(function(o){json2html(o,tbody,ip,is)},o.cont);appendEndLine(cont,1);break;case"lnk-lst-item":var tr=$$("tr",cont);var td01=$$("td",tr,null,"lnk-lst-01");var img=$$("img",td01,null,"lnk-lst");img.setAttribute("src",o.img+"-off.jpg");img.setAttribute("alt","");img.onclick=function(p,s){return function(e){pub.setPage(p,s)}}(o.pg,o.subpg);img.onmouseover=function(img,src){return function(e){img.setAttribute("src",src)}}(img,o.img+"-on.jpg");img.onmouseout=function(img,src){return function(e){img.setAttribute("src",src)}}(img,o.img+"-off.jpg");var td02=$$("td",tr,"lnk-lst-02");var a=$$("a",td02,null,"lnk-lst-title",o.title);a.setAttribute("href","javascript:Site.setPage("+o.pg+","+o.subpg+");");if(o.subtitle){$$("br",td02);$$("span",td02,null,"lnk-lst-subtitle",o.subtitle)}break;case"lnk-mov":var a=$$("a",cont,null,null,o.title);a.setAttribute("href",'javascript:Site.showMov("'+o.id+'","'+o.title+'",'+o.lyrics+");");break;case"quote":$$("div",cont,null,"quote-txt",o.txt);if(o.who){$$("div",cont,null,"quote-who",o.who)}$$("br",cont);break;case"ref":var p=$$("p",cont);$$("b",p,null,null,"References:");var ul=$$("ul");$map(function(o){var li=$$("li",ul);json2html(o,li,ip,is)},o.items);p.appendChild(ul);break;case"sec":var divTitle=$$("div",cont,"ip:"+ip+", is:"+is+", sec:"+o.title.replace(/'/g,""),"sec-title",o.title);if(state.currPgSecCnt===0){divTitle.style.marginTop="10px"}state.currPgSecCnt++;var divContent=$$("div",cont,null,"sec-content");if(o.dateAdd||o.dateUpd){var s="";if(o.dateAdd){var d=new Date();d.setFullYear(o.dateAdd.y);d.setMonth(o.dateAdd.m-1);d.setDate(o.dateAdd.d);s+="<b>Added</b>: "+d.toLocaleDateString()+(o.dateUpd?CONST.html.dot:"")}if(o.dateUpd){var d=new Date();d.setFullYear(o.dateUpd.y);d.setMonth(o.dateUpd.m-1);d.setDate(o.dateUpd.d);s+="<b>Updated</b>: "+d.toLocaleDateString()}$$("div",divContent,null,"sec-date",s)}$map(function(o){json2html(o,divContent,ip,is)},o.cont);break;case"sec-sep":$$("span",cont,null,"sec-sep");break;case"tbl":var rowAdj=o.headRowCnt||0;if(o.caption){(o.cssClass?$$("span",cont,null,o.cssClass,o.caption):cont.appendChild(document.createTextNode(bb2html(o.caption))))}var tbl=$$("table",cont);if(o.cssClass){tbl.className=o.cssClass}if(!env.agent.ie){tbl.setAttribute("cellpadding",(o.cellpadding===undefined?0:o.cellpadding));tbl.setAttribute("cellspacing",(o.cellspacing===undefined?0:o.cellspacing))}else{tbl.cellPadding=(o.cellpadding===undefined?0:o.cellpadding);tbl.cellSpacing=(o.cellspacing===undefined?0:o.cellspacing)}var tbody=$$("tbody",tbl);for(var j=0,nj=o.cont.length;j<nj;j++){(function(j){var row=o.cont[j];var tr=$$("tr",tbody);var classCell=(o.markEven&&o.cssClass&&((j+rowAdj)%2)?"even ":"");var cellCnt=0;$map(function(A){var cell=$$((j<o.headRowCnt?"th":"td"),tr);cell.className=classCell+(o.headColCnt&&cellCnt++<o.headColCnt?"head ":"")+A[1];json2html(A[0],cell,ip,is)},row,o.colCssClasses)})(j)}break;case"txt":cont.innerHTML+=bb2html(o.cont);break;case"ol":case"ul":var ul=$$(o.t,cont);$map(function(o){var li=$$("li",ul);json2html(o,li,ip,is)},o.items);break}if(o.nl>0){appendEndLine(cont,o.nl)}}}}function loadLastState(){state.areaTitleCol=(Cookie.get(CONST.cookie.pre+"area-title-col")==1);if(state.areaTitleCol){ui.areaTitle.style.height="120px"}else{ui.areaTitle.style.height="300px"}if(env.agent.o){var s=parseInt(Cookie.get(CONST.cookie.pre+":doc-scroll-y"));state.scrollYDoc=(s&&!isNaN(s)?s:0);window.scroll(0,state.scrollYDoc)}}function showInfo(msg){ui.info.innerHTML=msg;$show(ui.info)}var pub={getFile:function(path){window.open("cgi-bin/get-pdf.cgi?s="+state.sessId+"&n="+(++state.logCnt)+"&p="+encodeURIComponent(path)+(!env.agent.ff?"&_="+(new Date()).getTime():""),"","")},log:function(evt){$log(CONST.url,evt,!env.agent.ff,{s:state.sessId,n:++state.logCnt})},setPage:function(ip,is){$hide(ui.info);if(is===undefined){var is=CONST.none}if(state.pageIdx===ip&&state.subpageIdx===is){return}var app=(is===CONST.none?pages[ip][CONST.pageAppProp]:pages[ip].pages[is][CONST.pageAppProp]);if(!app.imgsLoaded){for(var i=0,ni=app.imgs.length;i<ni;i++){var img=app.imgs[i];img.img.setAttribute("src",img.src)}app.imgsLoaded=true}var p=pages[ip];if(state.pageIdx!==ip){if(state.pageIdx!==CONST.none){pages[state.pageIdx][CONST.pageAppProp].nav.className=""}pages[ip][CONST.pageAppProp].nav.className="curr";if(state.ui.subnav){if(state.subpageIdx!==CONST.none){pages[state.pageIdx].pages[state.subpageIdx][CONST.pageAppProp].nav.className="";state.subpageIdx=CONST.none}$hide(state.ui.subnav);state.ui.subnav=null}if(p[CONST.pageAppProp].subnav){p[CONST.pageAppProp].subnav.style.display="inline";state.ui.subnav=p[CONST.pageAppProp].subnav}else{state.ui.subnav=null}state.pageIdx=ip;document.title=CONST.pageTitlePrefix+pages[ip].title}if(state.subpageIdx!==CONST.none){pages[state.pageIdx].pages[state.subpageIdx][CONST.pageAppProp].nav.className=""}if(is!==CONST.none){pages[ip].pages[is][CONST.pageAppProp].nav.className="curr"}state.subpageIdx=is;if(is!==CONST.none){p=p.pages[is]}ui.imgCont.style.marginLeft=-CONST.titleImgW*ip+"px";if(ui.content){$hide(ui.content)}$show(p[CONST.pageAppProp].cont);ui.content=p[CONST.pageAppProp].cont;window.location.hash="#p="+ip+(is!==CONST.none?",s="+is:"");$log(CONST.url,"nav-page:"+ip+(is!==CONST.none?","+is:""),!env.agent.ff,{s:state.sessId,n:++state.logCnt})},hideMov:function(){$hide(ui.movCont)},showMov:function(id,title,lyrics){ui.mov.innerHTML='<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/'+id+'&fmt=18&rel=0&autoplay=1"></param><param name="allowFullScreen" value="false"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/'+id+'&fmt=18&rel=0&autoplay=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="false" width="425" height="344"></embed></object>';if(lyrics){if(title2lyrics[title]){ui.lyrics.innerHTML=title2lyrics[title];$show(ui.lyrics)}else{$hide(ui.lyrics);var titleFile=$trim((title.charAt(title.length-1)==="*"?title.substr(0,title.length-2):title)).replace(/:/g,"_")+".txt";$call("GET",CONST.url+"/res/lyrics/"+titleFile,null,function(res){var lyricsTxt=res.responseText.replace(/\n/g,"<br />");title2lyrics[title]=lyricsTxt;ui.lyrics.innerHTML=lyricsTxt;$show(ui.lyrics)},false)}}else{$hide(ui.lyrics)}$show(ui.movCont)},showMsg:function(){if(ui.msg.cont.style.display!=="block"){ui.msg.handle.onclick()}},start:function(_pages){pages=_pages;initApp()}};construct();return pub}();
