
//
// An in-place GRDDL profile
// that parses hcard
//
// Ben Adida 
// 2006-12-21
//

//
// helper functions
//

HCARD = new Object();

HCARD.getElementsByClassName = function(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }
    }
    return (arrReturnElements);
};

HCARD.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;
};

HCARD.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;
};

//
// hcard support
//


// set up the RDF fields for hcard
HCARD.fields = ['fn','street-address','extended-address','locality','region','postal-code','country-name'];
HCARD.vcard_prefix = 'vcard';
HCARD.vcard_ns = 'http://www.w3.org/2001/vcard-rdf/3.0#';
HCARD.dc_prefix = 'dc';
HCARD.dc_ns = 'http://purl.org/dc/elements/1.1/';
HCARD.foaf_prefix = 'foaf';
HCARD.foaf_ns = 'http://xmlns.com/foaf/0.1/';

HCARD.rdfa_fields = new Array();

HCARD.vcard_count = 0;

HCARD.transform_one_class = function(root_element, class_name, rdf_predicate, attribute_name) {
    var els = HCARD.getElementsByClassName(root_element, '*', class_name);
    for (var i=0; i<els.length; i++) {
	HCARD.setNodeAttributeValue(els[i], attribute_name, rdf_predicate);
    }
};

HCARD.transform = function(element) {
    var elements = HCARD.getElementsByClassName(element, "*", "vcard");

    // loop through the elements
    for (var i=0; i<elements.length; i++) {
        // set up the namespaces
        HCARD.setNodeAttributeValue(elements[i], 'xmlns:' + HCARD.vcard_prefix, HCARD.vcard_ns);
	HCARD.setNodeAttributeValue(elements[i], 'xmlns:' + HCARD.dc_prefix, HCARD.dc_ns);
	HCARD.setNodeAttributeValue(elements[i], 'xmlns:' + HCARD.foaf_prefix, HCARD.foaf_ns);

	// set up the REL on the element
	HCARD.setNodeAttributeValue(elements[i], 'rel', 'dc:creator');

        HCARD.vcard_count++;

	// the ones that are straight-forward literals
        for (var j=0; j<HCARD.fields.length; j++) {
	    HCARD.transform_one_class(elements[i], HCARD.fields[j], HCARD.vcard_prefix + ':' + HCARD.fields[j], 'property');
	}

	// class=adr
	HCARD.transform_one_class(elements[i], 'adr', HCARD.vcard_prefix + ':adr', 'rel');

	// class=photo
	HCARD.transform_one_class(elements[i], 'photo', HCARD.vcard_prefix + ':photograph', 'rel');

	// class=email
	HCARD.transform_one_class(elements[i], 'email', HCARD.vcard_prefix + ':email', 'rel');

	// class=url
	HCARD.transform_one_class(elements[i], 'url', HCARD.foaf_prefix + ':homepage', 'rel');
    }
};

HCARD.transform(document.body);

RDFA.GRDDL.DONE_LOADING(__RDFA_BASE + __RDFA_VERSION_SUBDIR + 'hcard-rdfa.js');