
//
// An in-place GRDDL profile
// for XHTML1 hGRDDL
//
// Ben Adida (ben@adida.net)
// 2006-10-08
//

//
// helper functions
//

XH = new Object();

XH.getNodeAttributeValue = function(element, attr) {
    if (!element)
        return null;

    if (element.getAttribute) {
        if (element.getAttribute(attr))
            return(element.getAttribute(attr));
    }

    if (!element.attributes)
        return null;

	if (!element.attributes[attr])
		return null;

	return element.attributes[attr].value;
};

XH.setNodeAttributeValue = function(element, attr, value) {
    if (!element)
        return;

    if (element.setAttribute) {
        element.setAttribute(attr,value);
        return;
    }

    if (!element.attributes)
        element.attributes = new Object();

    element.attributes[attr] = new Object();
    element.attributes[attr].value = value;
};

XH.get_special_subject = function(element) {
	// ABOUT overrides ID
	if (XH.getNodeAttributeValue(element,'about'))
		return XH.getNodeAttributeValue(element,'about');

    // there is no ABOUT, but this might be the HEAD
    if (element.name == 'head')
        return ""

	// ID
	if (XH.getNodeAttributeValue(element,'id'))
		return "#" + XH.getNodeAttributeValue(element,'id');

  if (typeof(XH.bnode_counter) == 'undefined')
    XH.bnode_counter = 0;
    
  XH.bnode_counter++;
  return '[_:]' + element.nodeName + XH.bnode_counter + ']';
};

//
// the transformation
//

// FIXME: more of these
XH.SPECIAL_RELS_ARR = ['next','prev','home'];

XH.SPECIAL_RELS = new Object();
for (var i=0; i<XH.SPECIAL_RELS_ARR.length; i++) {
  XH.SPECIAL_RELS[XH.SPECIAL_RELS_ARR[i]] = true;
}

XH.RDF_PREFIX = 'rdf';
XH.RDF_URI = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';

XH.XHTML_PREFIX = 'xhtml';
XH.XHTML_URI = 'http://www.w3.org/1999/xhtml';

XH.transform = function(element) {
    // recurse down the children
    // depth-first search here, because we don't need to
    // explore nodes we add along the way, only existing ones.
    var children = element.childNodes;
    for (var i=0; i < children.length; i++) {
	    XH.transform(children[i]);
    }

    // the classes
    if (typeof(element.className) != 'undefined' && element.className != '') {
      var classes = element.className.split(' ');
      
      for (var i=0; i<classes.length; i++) {
        var link_el = document.createElement('link');
        link_el.rel= 'rdf:type';
        link_el.href= '[' + classes[i] + ']'
        element.appendChild(link_el);
      }
    }
    
    // the special RELs
    if (typeof(element.rel) != 'undefined' && element.rel != '') {
      var rels = element.rel.split(' ');
      
      var new_rels=[];
      for (var i=0; i<rels.length; i++) {
        var the_rel = rels[i];
        if (XH.SPECIAL_RELS[the_rel]) {
          the_rel = XH.XHTML_PREFIX + ':' + the_rel;
        }
        new_rels[new_rels.length] = the_rel;
      }
      
      element.setAttribute('rel',new_rels.join(" "));
    }
    
    // 2007-02-05: no longer processing OL and UL, too much controversy for now (Ben)
    return;
    
    // the OL and UL
    if (element.nodeName == 'UL' || element.nodeName == 'OL') {
      var link_el = document.createElement('link');
      XH.setNodeAttributeValue(link_el, 'rel', 'rdf:type');
      XH.setNodeAttributeValue(link_el, 'href', 'rdf:Bag');
      element.appendChild(link_el);
      
      // go through the LIs
      var li_els = element.getElementsByTagName('li');
      for (var i=0; i<li_els.length; i++) {
        var new_rel = "rdf:_" + (i+1);
        var existing_rel = XH.getNodeAttributeValue(li_els[i],'rel');
        if (existing_rel) {
          new_rel = existing_rel + ' ' + new_rel;
        }
        XH.setNodeAttributeValue(li_els[i],'rel',new_rel);
      }
    }
};

XH.transform(document.body)
XH.transform(document.getElementsByTagName('head')[0])
document.body.setAttribute('xmlns:' + XH.RDF_PREFIX, XH.RDF_URI);
document.body.setAttribute('xmlns:' + XH.XHTML_PREFIX, XH.XHTML_URI);
document.getElementsByTagName('head')[0].setAttribute('xmlns:' + XH.RDF_PREFIX, XH.RDF_URI);
document.getElementsByTagName('head')[0].setAttribute('xmlns:' + XH.XHTML_PREFIX, XH.XHTML_URI);

RDFA.GRDDL.DONE_LOADING(__RDFA_BASE + __RDFA_VERSION_SUBDIR + 'xhtml1-hgrddl.js');