/* -*- mode: java -*- */

/* $Id: site.js 14 2008-03-28 06:13:00Z collins $ */

/* More general stuff */

var doc = window.document

function create(tag, attrs) {
  var obj = doc.createElement(tag)
  for (var a in attrs) {
    obj[a] = attrs[a]
  } 
  return obj
}

function text(s) {
  return create("span", {"innerHTML":s})
}

/* Maybe write a reduce and rewrite this?  */
function append_lists(lsts) {
  function f (xs,ys) {
    for (var i = 0; i < ys.length; ++i) {
      xs.push(ys[i])
    }
  }
  xs = []
  map(function(ys) { f(xs,ys) }, lsts) 
  return xs
}

function map(f, xs) {
  var a = []
  for (var i = 0; i < xs.length; ++i) {
    a.push(f(xs[i]))
  }
  return a
}

function appendChildren(obj, xs) {
  map(function(x) {obj.appendChild(x)}, xs)
}

/* Arbitrarily less general stuff */

function bar_join(xs) {
  var a = []
  map(function(c) { 
        a.push(c)
        a.push(text(" | ")) 
      }, xs)
  a.pop()
  return a
}

/* Takes list of ["Title","URL"] pairs */
function make_links(pairs) {
  return map(
    function(pair) { 
      return create("a", {"innerHTML":pair[0], "href":pair[1]}) 
    }, 
    pairs
  )
}

function insert_header() {
  var nav =
    [["Home", "index.html"],
     ["Teaching","teaching.html"], 
     ["Schedule","schedule.html"],
     ["CV","cv.pdf"]]

  var h = create("div", {"className":"header"})
  h.appendChild(create("h1", {"innerHTML":doc.title}))

  /*
  var n = create("div", {"className":"paragraph centered"})
  map(function(c) { 
        n.appendChild(c)
        n.appendChild(text(" | ")) 
      }, 
      map(function(pair) { 
            return create("a", {"innerHTML":pair[0], "href":pair[1]}) 
          }, 
      nav
    )
  )
  / We appended an extra " | " above.  Should probably just loop and
     check index to avoid adding extra span in the first place. /
  n.removeChild(n.lastChild)
  */
  var n = create("div", {"className":"paragraph centered"})
  appendChildren(n, bar_join(make_links(nav)))
  
  /* Not sure what would happen here if the body were empty ... */
  var c = doc.getElementsByTagName("body")[0].childNodes[0]
  map(function(x) { doc.body.insertBefore(x,c) }, [h,n])
}

var svn_id = typeof(svn_id) == "undefined" ? "$Var svn_id is undefined$" : svn_id
function insert_footer() {
  var foot = 
    [["CSS",  "http://jigsaw.w3.org/css-validator/check/referer"],
     ["HTML", "http://validator.w3.org/check?uri=referer"]]

  var f = create("div", {"className":"footer"})
  appendChildren(f, bar_join(append_lists([[text(svn_id)], make_links(foot)])))
  doc.body.appendChild(f)
}

function poor_mans_cgi() {
  insert_header()
  insert_footer()
}

/* Notes:
   
   var makes variable local.  Default is global.

   Nested functions are allowed.

   array.join(string), array.push(obj)

   obj.id, obj.className

   Arguments that aren't given default to null.

   foo.setAttribute(bar, "baz") is different from foo[bar] = "baz".
   The latter being the same as foo.<bar> = "baz", where <bar> denotes
   the literal text of the string bar.  Not sure what the first form
   does?  Might set foo.attributes[bar] = "baz"?

   You can't pass obj.func to map as a function, you have to do
   something like function (x) { return obj.func(x) } instead :P

   for (var i in obj) iterates over *keys*.  This means for (var i in
   ["a"]) does i = 0, not i = "a".

*/
