dojo.ready(function() {
  var selectorSpace = dojo.byId("selectorSpace");
  var selectionSpace = dojo.byId("selectionSpace");

  window.onhashchange = function() {
    if (window.location.hash != window.currentHashLocation) {
      hashChanged(window.location.hash);
    }
  }

  var hashChanged = function(hashString) {
    var hashObj = dojo.queryToObject(hashString.substring(1));

    // Find the most specific object.  Note: to avoid polluting the hash
    // object, load the selector space before the selection space.
    if ("class" in hashObj) {
      if ("course" in hashObj) {
	loadCourse(selectorSpace, null, hashObj.course, hashObj,
		   function(descriptiveText) {
		     loadClass(selectionSpace, descriptiveText,
			       hashObj["class"], hashObj, null);
		   });
      } else {
	loadClass(selectionSpace, null, hashObj["class"], hashObj, null);
      }
    } else if ("course" in hashObj) {
      if ("term" in hashObj) {
	loadTerm(selectorSpace, hashObj.term, hashObj,
		 function(descriptiveText) {
		   loadCourse(selectionSpace,
			      descriptiveText, hashObj.course, hashObj, null);
		 });
      } else {
	loadCourse(selectionSpace, null, hashObj.course, hashObj, null);
      }
    } else if ("term" in hashObj) {
      loadTerms(selectorSpace, hashObj);
      loadTerm(selectionSpace, hashObj.term, {"term": hashObj.term});
    } else {
      loadTerms(selectorSpace, hashObj);
      loadMotd(selectionSpace, hashObj);
    }
    window.currentHashLocation = hashString;
  }

  var hashCaptivate = function(hashString, hashChanged) {
    return function() {
      return hashChanged(hashString);
    };
  };

  var populate = function(space, descriptiveText, rows, len, hashObj, hash) {
    dojo.empty(space);
    if (descriptiveText != null) {
      dojo.create("P", {"innerHTML": descriptiveText}, space);
    }
    linkHash = dojo.clone(hashObj);
    for (var i = 0; i < len; i++)
    {
      var link;
      if (typeof hash == "function") {
	link = hash(rows, i, hashObj);
      } else {
	linkHash[hash] = rows[i][0];
	var hashString = "#" + dojo.objectToQuery(linkHash);
	link = dojo.create("A", {"href": hashString,
				 "onclick": hashCaptivate(hashString,
							  hashChanged),
				 "innerHTML": rows[i][1]});
      }
      if (rows[i][0].bold) {
	var bold = dojo.create("B");
	dojo.place(link, bold);
	dojo.place(bold, space);
      } else {
	dojo.place(link, space);
      }
      dojo.place("<BR>", space);
    }
  }

  var gotSelectorError = function(error) {
    dojo.attr(selectorSpace, {innerHTML: error.toString()});
  };
  
  var gotSelectionError = function(error) {
    dojo.attr(selectorSpace, {innerHTML: error.toString()});
  };
  
  var gotoCourse = function(courseId) {
  }

  var loadClass = function(space,
			   descriptiveText, courseClassId, hashObj, andThen) {
    var gotAssets = function(data) {
      populate(space, descriptiveText,
	       data.rows, data.rows.length, hashObj,
	      function(rows, index, hashObj) {
		var row = rows[index];
		var link = dojo.create("A", {"href": "/asset/" + row[0] + "/",
					     "innerHTML":
					     (rows[index][2] + ": " +
					      rows[index][1])});
		return link;
	      });
      if (andThen) {
	dt = "unknown";
	for (i = 0; i < data.rows.length; i++) {
	  if (data.rows[i][0] == hashObj['class']) {
	    dt = data.rows[i][1];
	  }
	}
	andThen(dt);
      }
    }
    dojo.xhrPost({url: "/table/asset/",
		  postData:
		  dojo.toJson({"relations": [{"name": "asset",
					      "columns": ["id", "name"]},
					     {"name": "asset_types",
					      "columns": ["description"]}],
			       "restrictions": ["relation", "courseclass",
						["and",
						 ["eq", "id",
						  ["quote", courseClassId]],
						 ["eq", "id",
						  "classmaterial.courseclass_id"],
						 ["eq",
						  "classmaterial.asset_id",
						  "asset.id"],
						 ["eq", "asset_types.id", "asset.asset_type"]]],
			       "order": [1]}),
		  handleAs: "json",
		  load: gotAssets,
		  error: gotSelectionError});
    
  };

  var loadCourse = function(space, descriptiveText,
			    courseInstanceId, hashObj, andThen) {
    var gotClasses = function(data) {
      populate(space, descriptiveText, 
	       data.rows, data.rows.length, hashObj, "class");
      if (andThen) {
	dt = "unknown";
	for (i = 0; i < data.rows.length; i++) {
	  if (data.rows[i][0] == hashObj['class']) {
	    dt = data.rows[i][1];
	  }
	}
	andThen(dt);
      }
    }
    dojo.xhrPost({url: "/table/courseclass/",
		  postData:
		  dojo.toJson({"relations": [{"name": "courseclass",
					      "columns": ["id", "name"]}],
			       "restrictions": ["relation", "courseinstance",
						["and",
						 ["eq",
						  "id",
						  ["quote", courseInstanceId]],
						 ["eq", "id",
						  "courseclass.courseinstance_id"]]],
			       "order": [2]}),
		  handleAs: "json",
		  load: gotClasses,
		  error: gotSelectionError});
    
  };

  var loadTerm = function(space, termId, hashObj, andThen) {
    var gotCourses = function(data) {
      populate(space, null,
	       data.rows, data.rows.length, hashObj, "course");
      if (andThen) {
	dt = "unknown";
	for (i = 0; i < data.rows.length; i++) {
	  if (data.rows[i][0] == hashObj['course']) {
	    dt = data.rows[i][1];
	  }
	}
	andThen(dt);
      }
    }
    dojo.xhrPost({url: "/table/course/",
		  postData:
		  dojo.toJson({"relations": [{"name": "courseinstance",
					      "columns": ["id"]},
					     {"name": "course",
					      "columns": ["name"]}],
                               "restrictions": ["relation", "courseinstance",
						["and",
						 ["eq",
						  "term_id",
						  ["quote", termId]],
						 ["eq",
						  "course_id",
						  "course.id"]]],
                               "order": [2]}),
		  handleAs: "json",
		  load: gotCourses,
		  error: gotSelectionError});
    
  };

  var loadTerms = function(space, hashObj) {
    var gotTerms = function(termData) {
      var gotVisits = function(visitData) {
	var len = termData.rows.length;
	for (var i = 0; i < len; i++) {
	  var numVisits = visitData.rows.length;
	  var bold = false;
	  for (var j = 0; j < numVisits; j++) {
	    if (visitData.rows[j][0] == termData.rows[i][0]) {
	      bold = true;
	    }
	  }
	  termData.rows[i].bold = bold;
	}
	populate(space, null, termData.rows, len, hashObj, "term");
      };
      dojo.attr(selectorSpace, {innerHTML: "Loading visits..."});
      dojo.xhrPost({url: "/table/visit/",
		    postData:
		    dojo.toJson({"relations": [{"name": "visit",
                                              "columns": ["term_id"]}]}),
		    handleAs: "json",
		    load: gotVisits,
		    error: gotSelectorError});
    };
    
    dojo.attr(space, {innerHTML: "Loading terms..."});
    dojo.xhrPost({url: "/table/term/",
		  postData:
		    dojo.toJson({"relations": [{"name": "term",
                                         "columns": ["id", "name",
                                                     "current"]}],
                           "order": ["term.starts"]}),
		  handleAs: "json",
		  load: gotTerms,
		  error: gotSelectorError});
  };

  var loadMotd = function(space, hashObj) {
    var gotMotd = function(text) {
      dojo.attr(space, {innerHTML: text});
    }
    dojo.attr(space, {innerHTML: "Loading Message of the Day..."});
    dojo.xhrGet({url: "/motd/",
		 load: gotMotd,
		 error: gotSelectorError});
  }

  hashChanged(window.location.hash);
});

// Local Variables:
// mode:javascript
// c-file-style:"gnu"
// end:

