var sortBy="name";

catalogLoaded = false;
catalog = "";
catalogByTitle = ""
fillCatalogAfterLoading = false;

var vendor = "All";;
var technology = "All";
var delivery = "All";


function openCourseWindow(theURL, winName, features) {
  var descriptionWindow = window.open(theURL, winName, features);

  descriptionWindow.onload = function() {
    var doc = descriptionWindow.document;
    /*
    var regButton = dojo.byId("registerButton");
    regButton.onclick = function() {
      registerFromCourseDescription(doc);
    }
    */
  }

  descriptionWindow.focus();
}


function queryCatalog(sb) {
  if (sb) {
    sortBy = sb;
  }
  var queryString = "";
  var list = dojo.byId("vendor_list");
  var opts = list.options;
  var index = list.selectedIndex;
  var vendor = opts.item(index);

  if (index >= 0) {
    queryString += "vendor=" + vendor.text;
  }

  list = dojo.byId("technology_list");
  opts = list.options;
  index = list.selectedIndex;
  var technology = opts.item(index);

  if (index >= 0) {
    if (queryString != "") {
      queryString += "&";
    }
    queryString += "technology=" + technology.text;
  }
  
  if (queryString != "") {
    queryString += "&";
  }
  queryString += "sortBy=" + sortBy;

  list = dojo.byId("delivery_list");
  opts = list.options;
  index = list.selectedIndex;
  var delivery = opts.item(index);

  if (index >= 0) {
    if (queryString != "") {
      queryString += "&";
    }
    queryString += "delivery=" + delivery.value;
  }

  makeCatalogQuery(queryString);
}

function getCatalogJSON() {
  var req = createXMLHttpRequest();
  req.onreadystatechange = function() {
    if (req.readyState == 4 && req.status == 200) {
      catalogJSON = req.responseText;
      catalog = eval(catalogJSON);
      catalogByCode = catalog.slice();
      catalogByTitle = catalog.slice();
      catalogByTitle.sort(compareByTitle);
      catalogLoaded = true;
      if (fillCatalogAfterLoading) {
        fillCatalogcTable();
        var loading = dojo.byId("loading");
        loading.style.visibility="hidden";
      }       
    }
  }
  req.open("GET", "/catalog/catalogJSON");
  req.send(null);
}

function showCatalogPage() {
  getCatalogDisplay();
  window.location.hash="catalog";
  dojo.byId("catalogLink").blur();
}

function getCatalogDisplay() {
  var req = createXMLHttpRequest();
  req.onreadystatechange = function() {
    if (req.readyState == 4 && req.status == 200) {
      displayCatalogPage(req.responseText);
    }
  }
  req.open("GET", "/catalog/getCatalogDisplay");
  req.send(null);
}

function displayCatalogPage(responseText) {
  pcDiv = dojo.byId("pageContents");
  pcDiv.innerHTML = responseText;

  var catalogTable1 = dojo.byId("catalogTable");
  var catalogTable2;

  var tbls = pcDiv.getElementsByTagName("TABLE")
  
  catalogTable2 = tbls[4];

  setTimeout(fillCatalogTable, 0);
}

function  fillCatalogTable() {
  if (catalogLoaded) {
    var courseDiv = dojo.byId("courseDivision");
    courseDiv.innerHTML = createTableString();
  }
  else {
    fillCatalogAfterLoading = true;
    var loading = dojo.byId("loading");
    loading.style.visibility="visible";   
  }
}


function displayPropertyNames(obj) {
    var names = "";
    for(var name in obj) names += name + "\n";
    alert(names);
}

function createTableString() {
/*  var rowStrings = new Array(catalog.length); */
  var rowStrings = new Array();

/*  alert(rowStrings.length); */

  var rowParity = 0;

  var rowNumber = 0;
  
  for (var i = 0; i < catalog.length; ++i) {
    var course = catalog[i];

    if ((vendor == "All" || course.vendor == vendor) 
        && (technology == "All" || matchesTechnology(course, technology))
        && (delivery == "All" || course.delivery == delivery)) {

      var evenOdd = (rowParity == 0) ? "ctdeven" : "ctdodd";
      rowParity = 1 - rowParity;

      name = course.name.replace(/-/g, "_");

      var tech = course.technology.split(":", 1)[0];

      rowStrings[rowNumber] = "<tr>"
                      + "<td class=\"" + evenOdd + " ctdcol_1\">"
                      + "<a href=\"javascript:;\" onclick=\"openCourseWindow('/catalog/showcourse?name=" + course.name + "', '" + name + "', 'scrollbars=yes,width=410,height=500')\">"
                      + course.name
                      + "</a>"
                      + "</td>"

                      + "<td class=\"" + evenOdd + " ctdcol_2\">"
                      + "<a href=\"javascript:;\" onclick=\"openCourseWindow('/catalog/showcourse?name=" + course.name + "', '" + name + "', 'scrollbars=yes,width=410,height=500')\">"
                      + course.title
                      + "</a>"
                      + "</td>"
                      + "<td class=\"" + evenOdd + " ctdcol_3\">"
                      + tech
                      + "</td>"
                      + "<td class=\"" + evenOdd + " ctdcol_4\">"
                      + course.vendor
                      + "</td>"
                      + "</tr>";
      rowNumber++;
    }
  }

  if (rowNumber > 0) {
    return "<table id='catalogTable' cellspacing='0' cellpadding='0'>" + rowStrings.join("") + "</table>";  
  }
  else {
    return "<table id='catalogTable'><tr><td>&nbsp;</td><td>&nbsp</td><td>&nbsp;</td><td>&nbsp</td></tr></table>";
  }
}

function matchesTechnology(course, technology) {
  return course.technology.indexOf(technology) >= 0;
}

function compareByName(c1, c2) {
  return c1.name.localeCompare(c2.name);
}

function compareByTitle(c1, c2) {
  return c1.title.localeCompare(c2.title);
}

function compareByVendor(c1, c2) {
  var result = c1.vendor.localeCompare(c2.vendor);
  return result != 0 ? result : compareByName(c1, c2);
} 

function compareByTechnology(c1, c2) {
  var result = c1.technology.localeCompare(c2.technology);
  return result != 0 ? result : compareByName(c1, c2);
} 


function sortCatalog(comparefn) {
  catalog.sort(comparefn);
  filterCatalog()
}


function filterCatalog() {
  var list = dojo.byId("vendor_list");
  var opts = list.options;
  var index = list.selectedIndex;
  vendor = opts.item(index).text;

  list = dojo.byId("technology_list");
  opts = list.options;
  index = list.selectedIndex;
  technology = opts.item(index).text;

  list = dojo.byId("delivery_list");
  opts = list.options;
  index = list.selectedIndex;
  delivery = opts.item(index).value;

/*  var catalogTable = dojo.byId("catalogTable"); */

  fillCatalogTable();
}

function matchesFilter(course, vendor, technology, delivery) {
  return (course.vendor == vendor || vendor == "All")
      && (course.technology == technology || technology == "All")
      && (course.delivery == delivery || delivery == "All");
}


function makeCatalogQuery(query) {
  request = createXMLHttpRequest();
  
  request.onreadystatechange = showCatalogReply;
  request.open("GET", "/catalog/catalogQuery?" + query, true);
  request.send(null);
}


function createXMLHttpRequest() {
  var v;
  try {
    v = new ActiveXObject("Microsoft.XMLHTTP");
  } 
  catch (e) {
    v = new XMLHttpRequest();
  }
  
  return v;
}

function showCatalogReply() {
  if (request.readyState == 4 && request.status == 200) {
    var catdiv = dojo.byId("courseDivision");
    catdiv.innerHTML = request.responseText;
  }
}

function selectVendor() {
  vlist = dojo.byId("vendor_list");
  opts = vlist.options;
  index = vlist.selectedIndex;
  selection = opts.item(index);
  self.location = "/catalog?vendor=" + selection.text;
}

function selectTechnology() {
  vlist = dojo.byId("technology_list");
  opts = vlist.options;
  index = vlist.selectedIndex;
  selection = opts.item(index);
  self.location = "/catalog?technology=" + selection.text;
}

