// javascript macros for my TR formats
// M. J. Hawley (mike@media.mit.edu)

var Script = 'Column';
var NS = document.layers; // true if we're in Netscrape
var Alerts=0;
function Alert(s){ if (Alerts) window.alert(s); }
function W(s){ document.write(s); }
function S(s){ window.status = blank(s)?"":s; return true; }
function blank(s){ return (!s || s==0 || s==null); }
function stripBlank(s){ s = s.replace(/ *$/,""); return s.replace(/ */,""); }

function P(){ // parent window
  var p = parent;
  while (p != this){
    if (p == p.parent) break;
    p = p.parent;
  }
  return p;
}

// 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<ImageName.length && ImageName[i]; i++)
    if (ImageName[i].indexOf(t[0])>=0) return i;
  n=i;
  for (i=0;i<t.length;i++){
    Img[n+i] = new Image();
    Img[n+i].src = (ImageName[n+i] = t[i]);
  }
  return n;
}

  function ifind(name){ // return index in ImageName where 'name' begins
    var i;
    for (i=0;i<ImageName.length && ImageName[i]; i++)
      if (ImageName[i].indexOf(name) >= 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;
  S(s);
  return true;
}
  
function icon(t,ref,alt,vspace){ // create a button icon
  var i, d = WonB()? "i/" : "i/w/";
  if (blank(alt)) alt = "";
  if (!vspace) vspace= "";
  var i=0, name = t[0];
  for (i=0;i<t.length;i++){
    t[i] = d+t[i];
    if (t[i].indexOf(".jpg")== -1 && t[i].indexOf(".JPG")== -1) 
      t[i] = t[i]+".jpg";
  }
  iadd(t);
  W('<a href="'+ref+'" '
    +'onMouseOver="return Hi(\''+name+'\',1,\''+alt+'\')" '
    +'onMouseOut="return Hi(\''+name+'\',0)"'
    +(i>2?
       (' onMouseDown="return Hi(\''+name+'\',2,\''+alt+'\')" '
        +'onMouseUp="return Hi(\''+name+'\',0)"'):"")
    +'><img border=0 src="'+t[0]+'" name="'+name+'" alt="'+alt+'" vspace="'+vspace+'"></a>');
}

// Cookies: delCookie, getCookie(name), setCookie(name,val[,expiredays])

function delCookie(c){
 document.cookie = c + "=; expires=Thu, 01-Jan-70 00:00:01 GMT";
}

function getCookie(c){ 
  var C = document.cookie;
  if (C.length > 0){
    begin = C.indexOf(c+"="); 
    if (begin != -1) begin += c.length+1; 
    end = C.indexOf(";", begin);
    if (end == -1) end = C.length;
    return unescape(C.substring(begin, end));
  }
  return null;
}

function setCookie(c, value, expiredays){
  var t = new Date();
  if (!expiredays) expiredays=1000;
  t.setTime(t.getTime() + (expiredays * 24 * 60*60 * 1000));
  document.cookie = c + "=" + escape(value) + 
  (expiredays? "; expires=" + t.toGMTString() : "");
}

function WonB(v){ // true if White on Black
  if (arguments.length==1) setCookie('WonB',v);
  else {
    v = getCookie('WonB');
    return (v == null || v == 1);
  }
}

function FlipWonB(){ // flip the state of WonB
  var flip=0;
  WonB(1-WonB());
  if (t = P().document.frames.fbody) t.document.location.reload(), flip++;
  if (t = P().document.frames.fhead) t.document.location.reload(), flip++;
  if (!flip) document.location.reload();
}

// html macros

function style(s){ W("<link rel='stylesheet' href='util/"+s+"' type='text/css'>\n");}

function webto(name,url){ // embed <a href=url>name</a>
  if (blank(url))  url = "http://www.media.mit.edu/~mike"
  if (blank(name)) name = "Michael Hawley"
  W('<a href="'+url+'">'+name+'</a>\n');
}

function mailto(name,addr){ // embed <a href=mailto:addr>name</a>
  if (blank(addr)) addr = "hawley@media.mit.edu"
  if (blank(name)) name = addr
  W('<a href="mailto:'+addr+'">'+name+'</a>\n');
}

function title(s){
  parent.document.title = s;
  W('<title>'+s+'</title>\n</head>');
}

  function getMon(s){
    var mon = ['January','February','March','April','May','June','July','August',
           'September','October','November','December'];
    var i = s.substring(2,4);
    return mon[i-1]+', 2001.';
  }

  function getTR(s){
    mon = ['jan','feb','mar','apr','may','jun','jul','aug',
           'sep','oct','nov','dec'];
    i = s.substring(2,4);
    return 'http://www.technologyreview.com/magazine/'+mon[i-1]+'01/hawley.asp';
  }

function trtitle(s){ // title and copyright for a TR article
  parent.document.title = s+" (M.J.Hawley, Technology Review)";
  var m = getMon(s);
  var tr = getTR(s);
  s = s.replace(/[^:]*: /,"");
  W('</head>\n');
  W('<body style="margin-top:0in">\n<table width=100%>\n<tr>\n<td width=50%>\n</td>\n<td class=copyright align=right>\n');
  W(fixUnicode('(c) 2001, ')+canonPerson('Michael Hawley mike@media.mit.edu  www.media.mit.edu/~mike')+'\n');
  W('<br><i>in:</i> MIT Technology Review, '+m+'\n');
  if (P()==this)
    W('<br><a href="../index.html"><b>Things That Matter</b> contents,<br>www.mike-hawley.com/tr</a>&nbsp;&nbsp;\n');
  W('<br><i>also:</i> <a href="t.pdf">pdf</a> <a href="t.rtf">rtf</a> <a href="'+tr+'">TechReview</a>&nbsp;&nbsp;\n');
  W('</td></tr></table>\n');
  W('<h1>'+s+'</h1>\n');
}

// for inserting figures and references

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('<br><br><center><a href="'+t[2]+'" target=_blank\n'
    +'onMouseOver="Hi(\''+name+'\',1,\''+alt+'\')"\n'
    +'onMouseOut= "Hi(\''+name+'\',0)">\n'
    +'<img border=0 src="'+t[0]+'" name="'+name+'" alt="'+alt+'"></a>');
  if (!blank(caption)){
    W('<div class=caption><br>'+caption+' ')
    if (!blank(credit))
      W('<i class=credit>('+credit+')</i>');
    W('</div><br>\n');
  }
  W('</center><p>\n');
}

var refgap=0;

function refs(){
  W('<hr width=100%>\n');
  W('<p><h2><a name="refs"></a>References and Acknowledgements</h2><p>\n');
  W('<div style="line-height:10pt">\n');
  W('<table border=0 width=100% callpadding=0 cellspacing=0>\n');
}

function rTag(s,t){
  var bg = WonB()?'#1f1f1f':'#d0d0d0';
  refgap=8;
  W('<tr><td height=24></td></tr>\n');
  var r='<tr bgColor='+bg+'>\n<td width=5 height=20></td>\n'
   +'<td width=170 height=20 valign="middle" align="left">';
  if (blank(t))
    r = r+'<i>'+s+':</i></td>\n';
  else
    r = r+'<i><a name="'+s+'"></a><i>'+t+':</i></td>\n';
  r = r+'<td width=382 height=20 valign="top" align="left">\n</td>\n</tr>\n';
  W(r);
  W('<tr><td height=10></td></tr>\n');
}

function rText(s){
  refgap=24;
  W('<tr><td height='+refgap+'></td></tr>\n');
  W('<tr>\n');
  W('<td width="5"></td>\n');
  W('<td width="170" valign="top" align="left">\n');
  if (s) W('</td><td valign="top" align="left">\n'+s);
}

function rTextEnd(s){
  W((s?s:"")+'</td>\n</tr>\n');
}

function rItem(s,t,u){
  if (arguments.length==3){ // assume: s=img, t=url, u=text
    var d = WonB()?'':'w/';
    d = '';
    rText();
    W('<a href="'+t+'" target=_blank>\n'
     +'<img border=0 src="pix/thumbs/'+d+s+'"></a></td>\n');
    W('<td valign="top" align="left">\n');
    rTextEnd(u);
  } else if (arguments.length==2){
    //rText(s+' <i class=note>'+fixUnicode(t)+'</i>');
    rText(s+' <i>'+fixUnicode(t)+'</i>');
    rTextEnd();
  } else
  if (arguments.length == 1){
    rText(fixUnicode(s));
    rTextEnd();
  }
}

function canonLink(s){// name url
  var name = s;
  var t, 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')==-1) url = 'http://'+url;

  if (name == 'http://')
    name = s;
  t = stripBlank(name);
  t = t.replace(/, *.*$/,"");
  t = t.replace(/ */," ");
  if (!blank(url))   t = '<a href="'+url+'" target=_blank>'+t+'</a>';
  return t;
}

function rLink(a,b,c){
  var t, note;
  if (arguments.length == 3 && isUrl(b)){
    t = '<b>'+canonLink(a+' '+b)+'</b>, <i>'+canonLink(b)+'</i>';
    note = c;
  } else
  if (arguments.length == 3){
    t = '<b><a href="'+b+'" target=_blank>'+a+'</a></b>';
    note = c;
  } else
  if (arguments.length == 2){
    t = canonLink(a) + ' &#8212 ';
    note = b;
  }
  if (!blank(note))
    t += '<i class=note>'+fixUnicode(note)+'</i>';
  rText(t);
  rTextEnd();
}

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("MSIE 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 = '<a href="'+url+'" target=_blank>'+t+'</a>';
  if (!blank(email)) t += ', <i><a href="mailto:'+email+'">'+email+'</a></i>';
  return t;
}

function rPerson(name,note){
  var t = canonPerson(name);
  if (!blank(note))  t += '<br><i class=note>'+fixUnicode(note)+'</i>';
  rText(t);
  rTextEnd();
}

function wPerson(name){ W(canonPerson(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, "&#8212;");
    s = s.replace(/--/g,  "&#8211;");
    s = s.replace(/'/g,   "&#8217;");
    s = s.replace(/"(\[^"]*)"/g,   "&#8220;$1&#8221;");
    s = s.replace(/<c>/g, "&#169;"); // (c)
    s = s.replace(/<r>/g, "&#174;"); // (r)
    s = s.replace(/\(c\)/g, "&#169;"); // (c)
    s = s.replace(/\(r\)/g, "&#174;"); // (r)
    s = s.replace(/\(tm\)/g,"&#8482;");// TM
    s = s.replace(/<tm>/g,"&#8482;");// TM
    s = s.replace(/\(o\)/g,"&#149;");// bullet
    s = s.replace(/<o>/g,"&#149;");// bullet
    s = s.replace(/<\*>/g,"&#10025;");// star
    s = s.replace(/<\*\*>/g,"&#10025;&#10025;");// **
    s = s.replace(/<\*\*\*>/g,"&#10025;&#10025;&#10025;");// ***
    s = s.replace(/<\*\*\*\*>/g,"&#10025;&#10025;&#10025;&#10025");// ****
    s = s.replace(/<\*\*\*\*\*>/g,"&#10025;&#10025;&#10025;&#10025;&#10025");// ****
    s = s.replace(/<SQ>/g,"&#9632;");// square
    s = s.replace(/<sq>/g,"&#9633;");
    s = s.replace(/<DI>/g,"&#9670;");// diamond
    s = s.replace(/<di>/g,"&#9671;");
    s = s.replace(/<ci>/g,"&#9675;");// circle
    s = s.replace(/<CI>/g,"&#9679;");
    s = s.replace(/<TR>/g,"&#9650;");// triangle
    s = s.replace(/<tr>/g,"&#9651;");
    s = s.replace(/<td>/g,"&#9661;");// triangle down
    s = s.replace(/<TD>/g,"&#9660;");
    s = s.replace(/<ST>/g,"&#9733;");// star
    s = s.replace(/<st>/g,"&#9734;");
    s = s.replace(/<PH>/g,"&#9742;");// phone
    s = s.replace(/<ph>/g,"&#9743;");
    s = s.replace(/<Ph>/g,"&#9990;");// white round phone
    s = s.replace(/<RH>/g,"<font size=+1>&#9755;</font>");
    s = s.replace(/<rh>/g,"<font size=+1>&#9758;</font>");
    s = s.replace(/<LH>/g,"&#9754;");
    s = s.replace(/<lh>/g,"&#9756;");
    s = s.replace(/<8th>/g,"&#9834;");
    s = s.replace(/<sc>/g,"&#9986;");// scissors
    s = s.replace(/<pl>/g,"&#9992;");// plane
    s = s.replace(/<env>/g,"&#9993;");// envelope
    s = s.replace(/<chk>/g,"&#10003;");// check mark
    s = s.replace(/<c1>/g,"&#9312;");// circled numbers
    s = s.replace(/<c2>/g,"&#9313;");
    s = s.replace(/<c3>/g,"&#9314;");
    s = s.replace(/<c4>/g,"&#9315;");
    s = s.replace(/<c5>/g,"&#9316;");
    s = s.replace(/<c6>/g,"&#9317;");
    s = s.replace(/<c7>/g,"&#9318;");
    s = s.replace(/<c8>/g,"&#9319;");
    s = s.replace(/<c9>/g,"&#9320;");
    s = s.replace(/<c10>/g,"&#9321;");
    s = s.replace(/<<->/g,"&#8592;");
    s = s.replace(/<^>/g,"&#8593;");
    s = s.replace(/<->>/g,"&#8594;");
    s = s.replace(/<v>/g,"&#8595;");
    s = s.replace(/<=>>/g,"&#8658;");
    s = s.replace(/<<=>/g,"&#8656;");
    s = s.replace(/<^^>/g,"&#8657;");
    s = s.replace(/<vv>/g,"&#8659;");
    s = s.replace(/<>>>/g,"&#8680;");
    s = s.replace(/<<<>/g,"&#8678;");
    s = s.replace(/<w^>/g,"&#8679;");
    s = s.replace(/<wv>/g,"&#8681;");
    return s;
  }

  function italParens(s){
    return s.replace(/(\([^\)]+\))/g,"<i>$1</i>");
  }
  
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<ac) author = canonPerson(italParens(av[i++]));
  if (i<ac) title = italParens(av[i++]);
  if (i<ac) publisher = av[i++];
  if (i<ac) date = av[i++];
  if (i<ac) note = fixUnicode('--- '+av[i++]);
  rItem(img,url,
     '<b>'+title+'</b><br>'+
     author+'<br>'+
     publisher+', '+date+
     (blank(note)?'':('<br><i class=note>'+note+'</i>')));
}

function rDone(){
  rTag("comm","Comments, Errata");
  rItem('Please send me any questions, comments, or corrections.'+
    canonPerson(fixUnicode('<br>--- Michael Hawley www.media.mit.edu/~mike mike@media.mit.edu')));
  W('</table></body>\n');
}

function toc(date,title){ // format table of contents entry
  W('<p style="margin-left:90; text-indent:-58">\n');
  W('<a href="'+date+'/index.html">'+date+'&#8212; '+title+':</a>&nbsp;&nbsp\n');
}

function mjhIcon(){
  icon(["mjh","mjhH"],'mjh/index.html','Click for more of me');
}

  function contents(){
    P().document.frames.fbody.document.location = "contents.html";
  }
function ttmIcon(){
  icon(["ttm","ttmH","ttmP"],"javascript:contents()",
       'Click for Things that Matter contents');
}

function bonwIcon(){
  icon(["bonw","bonwH"],"javascript:FlipWonB()",'Click to invert the color',7);
}

function mhImg(){
  var t = (WonB()? "../i/" : "../i/w/")+"mh.gif";
  W('<p><img border=0 src="'+t+'">\n');
}

// put page fade effects
var Fade = .5;
function fade(){
  if (!NS && Fade>0.0){
    W('<meta http-equiv="Page-Exit" content="blendTrans(Duration='+Fade+')">\n');
  }
}

// set document styles and fonts
fade();
//style('column');
if (WonB()) style('black');
