var NS = document.layers; // true if we're in Netscrape function W(s){ document.write(s); } function S(s){ window.status = blank(s)?"":s; return true; } // strings and html smoothing function blank(s){ return (!s || s==0 || s==null); } function stripBlank(s){ s = s.replace(/ *$/,""); return s.replace(/ */,""); } function canonLink(s){// name url var name = s; var url = s.replace(/.*(http[^, ]*).*/,"$1"); if (url.length==s.length) url = s.replace(/.*(www[^, ]*).*/,"$1"); if (!blank(url) && url.length != s.length){ var r = new RegExp(url); name = name.replace(r,""); } if (url.indexOf('http')<0) url = 'http://'+url; if (name == 'http://') name = s; var t = stripBlank(name); t = t.replace(/, *.*$/,""); t = t.replace(/ */," "); if (!blank(url)) t = ''+t+''; return t; } function wLink(s){ W(canonLink(s)); } function canonPerson(s){// parse out name, mail, url var url,email,name = s; url = s.replace(/.*(http[^, ]*).*/,"$1"); if (url.length==s.length) url = s.replace(/.*(www[^, ]*).*/,"$1"); if (!blank(url) && url.length != s.length){ if (NS || navigator.appVersion.indexOf("4.") == -1){ var r = new RegExp(url); name = name.replace(r,""); } } if (url == s) url=0; if (!blank(url) && url.indexOf('http')<0) url = 'http://'+url; email = s.replace(/.*[ ,]([^ ,]+)@([^ ,]+).*/,"$1@$2"); if (!blank(email)){ r = new RegExp(email); name = name.replace(r,""); } name = name.replace(/, *.*$/,""); name = name.replace(/ */," "); var t = stripBlank(name); if (email.indexOf('@')<0) t=email, email=0; if (!blank(url)) t = ''+t+''; if (!blank(email)) t += ', '+email+''; return t; } function wPerson(s){ W(canonPerson(fixUnicode(s))); } function Url(s){ return s.indexOf('www')==0? 'http://'+s : s; } function isUrl(s){ return s.indexOf('http')==0 || s.indexOf('www')==0; } function isJpg(s){ return s.match(/\.(jpg|jpeg|gif)/i) != null; } function fixUnicode(s){ s = s.replace(/---/g, "—"); s = s.replace(/--/g, "–"); s = s.replace(/'/g, "’"); s = s.replace(/"(\[^"]*)"/g, "“$1”"); s = s.replace(//g, "©"); // (c) s = s.replace(//g, "®"); // (r) s = s.replace(/\(c\)/g, "©"); // (c) s = s.replace(/\(r\)/g, "®"); // (r) s = s.replace(/\(tm\)/g,"™");// TM s = s.replace(//g,"™");// TM s = s.replace(/\(o\)/g,"•");// bullet s = s.replace(//g,"•");// bullet s = s.replace(/<\*>/g,"✩");// star s = s.replace(/<\*\*>/g,"✩✩");// ** s = s.replace(/<\*\*\*>/g,"✩✩✩");// *** s = s.replace(/<\*\*\*\*>/g,"✩✩✩✩");// **** s = s.replace(/<\*\*\*\*\*>/g,"✩✩✩✩✩");// **** s = s.replace(//g,"■");// square s = s.replace(//g,"□"); s = s.replace(//g,"◆");// diamond s = s.replace(//g,"◇"); s = s.replace(//g,"○");// circle s = s.replace(//g,"●"); s = s.replace(//g,"▲");// triangle s = s.replace(//g,"△"); s = s.replace(//g,"▽");// triangle down s = s.replace(//g,"▼"); s = s.replace(//g,"★");// star s = s.replace(//g,"☆"); s = s.replace(//g,"☎");// phone s = s.replace(//g,"☏"); s = s.replace(//g,"✆");// white round phone s = s.replace(//g,""); s = s.replace(//g,""); s = s.replace(//g,"☚"); s = s.replace(//g,"☜"); s = s.replace(/<8th>/g,"♪"); s = s.replace(//g,"✂");// scissors s = s.replace(//g,"✈");// plane s = s.replace(//g,"✉");// envelope s = s.replace(//g,"✓");// check mark s = s.replace(//g,"①");// circled numbers s = s.replace(//g,"②"); s = s.replace(//g,"③"); s = s.replace(//g,"④"); s = s.replace(//g,"⑤"); s = s.replace(//g,"⑥"); s = s.replace(//g,"⑦"); s = s.replace(//g,"⑧"); s = s.replace(//g,"⑨"); s = s.replace(//g,"⑩"); s = s.replace(/<<->/g,"←"); s = s.replace(/<^>/g,"↑"); s = s.replace(/<->>/g,"→"); s = s.replace(//g,"↓"); s = s.replace(/<=>>/g,"⇒"); s = s.replace(/<<=>/g,"⇐"); s = s.replace(/<^^>/g,"⇑"); s = s.replace(//g,"⇓"); s = s.replace(/<>>>/g,"⇨"); s = s.replace(/<<<>/g,"⇦"); s = s.replace(//g,"⇧"); s = s.replace(//g,"⇩"); return s; } function fig(name,alt,caption,credit){ // insert a figure var t = ["i/"+name+"t.jpg", "i/"+name+"h.jpg", "i/"+name+".jpg"]; var n = iadd(t); W('

\n' +''+alt+''); if (!blank(caption)){ W('

'+caption+' ') if (!blank(credit)) W('('+credit+')'); W('

\n'); } W('

\n'); } var refgap=0; function WonB(){ return 1; } function refs(){ W('


\n'); W('

References and Acknowledgements

\n'); W('

\n'); W('\n'); } function rTag(s,t){ var bg = WonB()?'#1f1f1f':'#d0d0d0'; refgap=8; W('\n'); var r='\n\n' +'\n'; else r = r+''+t+':\n'; r = r+'\n\n'; W(r); W('\n'); } function rText(s){ refgap=24; W('\n'); W('\n'); W('\n'); W('\n\n'); } function rItem(s,t,u){ if (arguments.length==3){ // assume: s=img, t=url, u=text var d = WonB()?'':'w/'; rText(); W('\n' +'\n'); W('
'; if (blank(t)) r = r+''+s+':\n
\n'); if (s) W('\n'+s); } function rTextEnd(s){ W((s?s:"")+'
\n'); rTextEnd(u); } else if (arguments.length==2){ rText(s+' '+fixUnicode(t)+''); rTextEnd(); } else if (arguments.length == 1){ rText(fixUnicode(s)); rTextEnd(); } } function rLink(a,b,c){ var t, note; if (arguments.length == 3 && isUrl(b)){ t = ''+canonLink(a+' '+b)+', '+canonLink(b)+''; note = c; } else if (arguments.length == 3){ t = ''+a+''; note = c; } else if (arguments.length == 2){ t = canonLink(a) + ' — '; note = b; } if (!blank(note)) t += ''+fixUnicode(note)+''; rText(t); rTextEnd(); } function rPerson(name,note){ var t = canonPerson(name); if (!blank(note)) t += '
'+fixUnicode(note)+''; rText(t); rTextEnd(); } function italParens(s){ return s.replace(/(\([^\)]+\))/g,"$1"); } function rBook(){ var ac=arguments.length; var av=arguments; var i=0; var img=url=author=title=publisher=date=note=0; if (isJpg(av[i])) img = av[i++]; if (isUrl(av[i])) url = Url(av[i++]); if (i'+title+'
'+ author+'
'+ publisher+', '+date+ (blank(note)?'':('
'+note+''))); } function rDone(){ rTag("comm","Comments, Errata"); rItem('Please send me any questions, comments, or corrections.'+ canonPerson(fixUnicode('
--- Michael Hawley www.media.mit.edu/~mike mike@media.mit.edu'))); W('
\n'); } // image and icon handling. var ImageName = new Array(250); // cache of image names var Img = new Array(250); // cache of image data function iadd(t){ // t is an array [big,lo,hi,push] of images var i,n; for (i=0;i= 0) return i; n = i; for (i=0;i= 0) return i; return -1; } function Hi(name,i,s){ // flip state of image 'name' to 'i' var n = ifind(name); if (n >= 0) document[name].src = Img[n+i].src; if (blank(s)) s = ""; window.status=s; return true; } var Target = "_self"; function target(p){ Target = p; } function icon(t,ref,alt,vspace,hspace){ // create a button icon if (!alt) alt = ""; if (!vspace) vspace= ""; var name = t[0], i=0; for (i=0;i2? (' onMouseDown="return Hi(\''+name+'\',2,\''+alt+'\')" ' +'onMouseUp="return Hi(\''+name+'\',0)"'):"") +' target='+Target+'>'+alt+''); } var inTable=0; function tag(href,label,notes){ if (!inTable || arguments.length == 0){ if (!inTable){ W('\n'); } else { W('
\n'); inTable=0; return true; } inTable=0; } inTable += 1; if (arguments.length==2){ notes=label; label=href; if (href.indexOf("/")<=0) href=1; } if (arguments.length==1){ notes=href; href=1; label = inTable + '.'; } if (href){ W(''); else W(' width="5%">'); W(label); if (href != 1) W(''); W('\n'+fixUnicode(notes)+'\n'); } if (arguments.length>3){ W('\n'); inTable=0; } } function eaIcon(){ icon(['t-alliance','t-allianceH'],'http://go.mit.edu','Information about the Expeditionary Alliance is coming.'); } function goIcon(){ icon(['go','goH'],'http://go.mit.edu','GO home.'); } //function mheIcon(){ icon(['mhe','mheH'],'mailto:mike@media.mit.edu','e me'); }