Date.prototype.DAYNAMES = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
Date.prototype.MONTHNAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

Date.prototype.getFullDay = function() {
  return this.DAYNAMES[this.getDay()];
};
Date.prototype.getDayAbbr = function() {
  return this.getFullDay().slice(0, 3);
};

Date.prototype.getFullMonth = function() {
  return this.MONTHNAMES[this.getMonth()];
};
Date.prototype.getMonthAbbr = function() {
  return this.getFullMonth().slice(0, 3);
};

function Hash()
{
  this.length = 0;
  this.items = new Array();
  for (var i = 0; i < arguments.length; i += 2) {
    if (typeof(arguments[i + 1]) != 'undefined') {
      this.items[arguments[i]] = arguments[i + 1];
      this.length++;
    }
  }

  this.reset = function(in_key)
    {
      this.length = 0;
      this.items = new Array();
    }

  this.removeItem = function(in_key)
    {
      var tmp_value;
      if (typeof(this.items[in_key]) != 'undefined') {
	this.length--;
	var tmp_value = this.items[in_key];
	delete this.items[in_key];
      }
	   
      return tmp_value;
    }

  this.getItem = function(in_key) {
    return this.items[in_key];
  }

  this.setItem = function(in_key, in_value)
    {
      if (typeof(in_value) != 'undefined') {
	if (typeof(this.items[in_key]) == 'undefined') {
	  this.length++;
	}

	this.items[in_key] = in_value;
      }
	   
      return in_value;
    }

  this.hasItem = function(in_key)
    {
      return typeof(this.items[in_key]) != 'undefined';
    }
}

var currentDocument;

var req;

function NSResolver(prefix) {
  if(prefix == 'html') {
    return 'http://www.w3.org/1999/xhtml';
  }
  else if(prefix == 'mathml') {
    return 'http://www.w3.org/1998/Math/MathML';
  }
  else if(prefix == 'dc') {
    return 'http://purl.org/dc/elements/1.1/';
  }
  else if(prefix == 'rdf') {
    return 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
  }
  else  {
    //this shouldn't ever happen
    return null;
  }
}


function cleanState() {
  document.getElementById("Data").textContent = "";
  document.getElementById('media').textContent = "";
}

function processReqChange() {
  // only if req shows "loaded"
  if (req && req.readyState == 4) {
    // only if "OK"
    if (req.status == 200 && req.getResponseHeader("Content-Type").indexOf("application/rdf+xml") != -1) {
      // would be nicer if I had an RDF API for Javascript...
      var rdf = req.responseXML;
      var data = document.getElementById("Data");
      data.textContent = "";
      if (rdf) {
	var values = new Hash();
	var els = rdf.evaluate(".//rdf:Description/*", rdf.documentElement, NSResolver, XPathResult.ANY_TYPE, null);
	var el = null;
	
	el = els.iterateNext();
	while (el) {
	  if (el.nodeType == 1) {
	    values.setItem(el.tagName, el);
	  }
	  el = els.iterateNext();
	}
	var els = rdf.evaluate(".//rdf:Description/@rdf:about", rdf.documentElement, NSResolver, XPathResult.ANY_TYPE, null);
	var el = null;
	
	el = els.iterateNext();
	if (el) {
	  values.setItem(el.nodeName, el);
	}
      }
      updatePageData(values);      
    } else {
      var data = document.getElementById("Data");
      data.appendChild(document.createElement("P"));
      data.lastChild.textContent = "Failed to ";
      data.lastChild.appendChild(document.createElement("A"));
      data.lastChild.lastChild.textContent = "load RDF.";
      data.lastChild.lastChild.href = currentDocument;
      data.appendChild(document.createElement("PRE"));
      data.lastChild.textContent = req.getAllResponseHeaders();
    }
  } else {
    // nothing ?
  }
}

function loadDocument(url) {
  req = false;
  currentDocument = url;
  document.getElementById("Data").textContent = "Loading....";

  // branch for native XMLHttpRequest object
  if(window.XMLHttpRequest && !(window.ActiveXObject)) {
    try {
      req = new XMLHttpRequest();
    } catch(e) {
      req = false;
    }
    // branch for IE/Windows ActiveX version
  } else if(window.ActiveXObject) {
    try {
      req = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      try {
	req = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {
	req = false;
      }
    }
  }
  if(req) {
    req.onreadystatechange = processReqChange;
    req.open("GET", url, true);
    req.send("");
  } else {
    document.getElementById("Data").textContent = "Failed to create proper XHR Object";
  }
}

function updatePage(uri) {
  cleanState();
  loadDocument("http://www.w3.org/2006/01/img2rdf/?uri=" + encodeURIComponent(uri));
  var el = document.getElementById("MediaURI");
  el.value = uri;
  // loadDocument("http://localhost/image.rdf");
}


function updatePageData(values) {
  var data = document.getElementById("Data");

  cleanState();

  if (values.hasItem("rdf:about")) {	
    var format = values.getItem("dc:format").textContent;
    var e = document.getElementById('media');
    if (format.indexOf("image/") != -1) {
      e = e.appendChild(document.createElement("IMG"));
      e.width = '500';
      e.height = "333";
      e.src = values.getItem("rdf:about").textContent;
      if (values.hasItem("dc:title")) {
	e.alt = values.getItem("dc:title").textContent;
      }	
    } else if (format.indexOf("video/") != -1 || format.indexOf("audio/") != -1) {
      e = e.appendChild(document.createElement("OBJECT"));
      e.width = '500';
      e.height = "333";
      e.data = values.getItem("rdf:about").textContent;
      e.type = format;
    }
  }
  data.appendChild(document.createElement("H2"));
  if (values.hasItem("dc:title")) {
    data.lastChild.textContent = values.getItem("dc:title").textContent;
    if (values.hasItem("tiff:ImageLength")) {
      var e = data.lastChild;
      e.appendChild(document.createElement("BR"));
      e = e.appendChild(document.createElement("SMALL"));
      e.textContent = "    (" + values.getItem("dc:format").textContent + ", "
	+ values.getItem("tiff:ImageLength").textContent
	+ " x " + values.getItem("tiff:ImageWidth").textContent + ")";
    } else {
      var e = data.lastChild;
      e.appendChild(document.createElement("BR"));
      e = e.appendChild(document.createElement("SMALL"));
      e.textContent = "    (" + values.getItem("dc:format").textContent + ")";
    }
  } else {
    data.lastChild.textContent = "[no title]";
    document.getElementById('image').alt = 'empty';
  }
  if (values.hasItem("exif:DateTimeOriginal")) {
    data.appendChild(document.createElement("P"));
    data.lastChild.setAttribute("class", "date");
    var dateString = values.getItem("exif:DateTimeOriginal").textContent;
    var d = new Date(Date.UTC(dateString.substr(0, 4), dateString.substr(5, 2) - 1, dateString.substr(8, 2),
			      dateString.substr(11, 2), dateString.substr(14, 2), dateString.substr(17, 2)));
    data.lastChild.appendChild(document.createTextNode("Taken on " + d.getFullMonth() + " " + d.getDate() + ", " + d.getFullYear()));    
  }
  if (values.hasItem("dc:creator")) {
    var e = data.appendChild(document.createElement("P"));
    e.setAttribute("class", "creator");
    e.textContent =  "by ";
    if (values.hasItem("Iptc4xmpCore:CreatorContactInfo")) {
      var info = values.getItem("Iptc4xmpCore:CreatorContactInfo");
      var l1 = info.getElementsByTagName("Iptc4xmpCore:CiUrlWork");
      if (l1.length > 0) {
	e.appendChild(document.createElement("A"));
	e.lastChild.href = l1.item(0).getAttribute("rdf:resource");
	e.lastChild.textContent = values.getItem("dc:creator").textContent;
      } else {
	e.appendChild(document.createTextNode(values.getItem("dc:creator").textContent));
      }
      var l2 = info.getElementsByTagName("Iptc4xmpCore:CiEmailWork");
      if (l2.length > 0) {
	e.appendChild(document.createTextNode("  <"));
	e.appendChild(document.createElement("A"));
	e.lastChild.href =  l2.item(0).getAttribute("rdf:resource");
	e.lastChild.textContent = l2.item(0).getAttribute("rdf:resource");
	e.appendChild(document.createTextNode(">"));
      }
    } else {
      e.appendChild(document.createTextNode(values.getItem("dc:creator").textContent));
    }
  }
  if (values.hasItem("photoshop:Country")) {
    var e = data.appendChild(document.createElement("P"));
    e.setAttribute("class", "place");
    var place = "";
    if (values.hasItem("photoshop:City")) {
      place += values.getItem("photoshop:City").textContent + ", ";
    }
    if (values.hasItem("photoshop:State")) {
      place += values.getItem("photoshop:State").textContent + ", ";
    }
    place += values.getItem("photoshop:Country").textContent;
    e.textContent = "In ";    
    e = e.appendChild(document.createElement("A"));
    e.href = "http://maps.google.com/maps?q=" + place;
    e.textContent = place;    
  }
  if (values.hasItem("tiff:Model")) {
    data.appendChild(document.createElement("P"));
    data.lastChild.setAttribute("class", "model");
    data.lastChild.textContent = "With a " + values.getItem("tiff:Model").textContent;
  }
  if (values.hasItem("dc:subject")) {
    var s = values.getItem("dc:subject");
    var e = data.appendChild(document.createElement("DIV"));
    e.setAttribute("class", "tags");
    e.appendChild(document.createElement("P"));
    e.firstChild.appendChild(document.createTextNode("Subject:"));    
    e = e.appendChild(document.createElement("UL"));        
    if (s.nodeType != 1) {
      e.appendChild(document.createElement("LI"));
      e.firstChild.appendChild(document.createTextNode(s.textContent));    
    } else {
      var list = s.ownerDocument.evaluate(".//rdf:li", s, NSResolver, XPathResult.ANY_TYPE, null);
      var el = list.iterateNext();
      while (el) {	
	if (el.nodeType == 1) {
	  e.appendChild(document.createElement("LI"));
	  e.lastChild.appendChild(document.createTextNode(el.textContent));    
	}
	el = list.iterateNext();
      }
    }
  }
  if (values.hasItem("dc:rights")) {
    data.appendChild(document.createElement("P"));
    data.lastChild.setAttribute("class", "dcrights");
    data.lastChild.textContent =  "Rights: ";
    if (values.hasItem("xmpRights:WebStatement")) {
      data.lastChild.appendChild(document.createElement("A"));      
      data.lastChild.lastChild.href = values.getItem("xmpRights:WebStatement").getAttribute("rdf:resource");
    } else if (values.hasItem("cc:license")) {
      data.lastChild.appendChild(document.createElement("A"));      
      data.lastChild.lastChild.href = values.getItem("cc:license").textContent;
    } else {
      data.lastChild.appendChild(document.createElement("STRONG"));
    }
    data.lastChild.lastChild.textContent = values.getItem("dc:rights").textContent;
  }
  if (values.hasItem("xmpRights:UsageTerms")) {
    var e = data.appendChild(document.createElement("DIV"));
    e.appendChild(document.createElement("P"));
    e.lastChild.setAttribute("class", "rights");
    e.lastChild.textContent =  "Usage Terms: ";
    e = e.appendChild(document.createElement("P"));
    e.setAttribute("class", "usageTerms");
    e.textContent = values.getItem("xmpRights:UsageTerms").textContent;
  }

  if (values.hasItem("rdf:about")) {
    data.appendChild(document.createElement("P"));
    data.lastChild.setAttribute("class", "rdf");
    var e = data.lastChild.appendChild(document.createElement("A"));
    e.href = "http://www.w3.org/2006/01/img2rdf/?uri=" + values.getItem("rdf:about").textContent;
    e = e.appendChild(document.createElement("IMG"));
    e.height = "15";
    e.width = "80";
    e.border = "0";
    e.alt = "RDF Button";
    e.src = "../../Icons/SW/Buttons/sw-rdf-blue";
  }
}

