/* Copyright (c) 2008 Leandro Lopez (inkel)
   See the file LICENSE.txt for licensing information. */

// Inspired by TransFormr http://transformr.co.uk/

Components.utils.import("resource://gre/modules/Microformats.js");

function dcmf(node, validate) {
    if (node) {
        Microformats.parser.newMicroformat(this, node, "dublincore", validate);
    }
}

dcmf.prototype.isValid = function() {
    for(var p in this)
        if(this[p])
            return true;
    return false;
}

var dcmf_definition = {
    mfVersion: 0.8,
    mfObject: dcmf,
    className: "dublincore",
    properties: {
        'contributor': { },
        'coverage': { },
        'creator': { },
        'date': { datatype: "dateTime" },
        'description': { },
        'format': { },
        'identifier': { },
        'language': { },
        'publisher': { },
        'relation': { datatype: "anyURI" },
        'rights': { },
        'source': { },
        'subject': { },
        'title': { value: 'Untitled' },
        'type': { },
        
        //
        
        'created': { }
    },
    
    validate: function(node) {
        var classes = '';
        for(var p in this.properties) {
            classes += " or contains(concat(' ', @class, ' '), ' " + p + " ')";
        }
        var xpathExpression = "count(descendant::*[" + classes.substring(4) + "])";
        var xpathResult = (node.ownerDocument || node).evaluate(xpathExpression, node, null,  Components.interfaces.nsIDOMXPathResult.ANY_TYPE, null).numberValue;
        if (xpathResult == 0) {
            throw("Unable to create microformat");
        }
        return true;
    }
};

Microformats.add("dublincore", dcmf_definition);

CmdUtils.CreateCommand({
    //icon: "http://localhost:7453/semweb/dcmf/dcmf.png",
    icon: "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%03%00%00%00(-%0FS%00%00%03%00PLTE%ED_%01%F3%A0b%F9%F1%D6%F7%BAY%F1%9C%5E%FD%C9b%F5%CF%AC%F6%B6T%FE%C8Y%F8%C2%94%F7%ED%DA%F6%A85%F6%B8V%F8%F6%E6%F2%B5%60%F3%C2%7B%F6%D4%9E%F6%DA%AA%FD%CEt%F3%A20%F5%B5%81%FD%CCr%F5%B1M%FB%96I%F8%DA%A3%F1%A4j%F1%95T%F4%7F%2B%F3%B9%8B%FD%CAp%FF%D1f%F7%C0%91%F7%E1%C6%FD%D0w%FA%ACo%FB%DF%9E%F8%EF%DA%F0%849%F8%D1%8C%F5%CD%A7%F6%C3%95%F8%EE%D1%F6%B4S%EF%9B%2C%F7%E9%CA%F5%94M%F8%E9%D3%F5%8EC%F9%D6%B3%F5%C1t%F3m%11%EEb%04%EFc%05%ED%60%02%FBy%1B%FAw%19%EEa%03%F1g%09%F9v%18%F2i%0B%F0e%07%F7%AC8%F0%9A(%F3k%0D%FAx%1A%EFd%06%F5n%10%F7r%14%F6p%12%F8%F8%E9%F4l%0E%F0%99'%F7%AD9%F8t%16%F3%A2%2F%F4%A41%F4m%0F%F4%A52%F9u%17%F3%A1.%FBz%1C%F0f%08%FF%CBY%FF%CCZ%F3j%0C%F5%A63%FE%C1P%FF%CAX%F2%A0-%F2%9F%2C%FF%C9W%FE%C0O%F8s%15%FE%C3R%F5o%11%FE%C2Q%FF%C8V%FF%CD%5B%FE%C4S%FF%C7U%FF%CE%5C%FE%C5T%F2h%0A%FF%CF%5D%F1%9C*%FE%BFN%F5%A74%F6%AA6%FF%C6U%F1%9D*%F5%A85%FE%BEM%F1h%0A%F6%A96%F6%AB7%F1%9D%2B%F1%9B)%F6q%13%FF%C7V%FE%C6T%F6%AA7%EF%98%26%F1%9C)%FE%C5S%F2%9E%2B%FE%BDL%F7q%13%FF%C8W%F8%AE%3A%F1f%08%FE%C3Q%FE%C4R%F4%A30%EDa%03%F5%A73%F2%9F-%F7s%15%F2%9E%2C%F5%A84%FBx%1A%F0%9B(%FCz%1C%F0d%06%F7%AB8%F8u%17%F2j%0C%F2%9E%60%F7%AC9%F0%9A'%FF%CBZ%FE%C1O%F5%D2%9C%F0%9B)%F7%AB7%FF%CAY%FE%C2P%F9%F0%D0%F6o%11%F2%9Fa%FF%CC%5B%FF%D0%5E%F9%F1%D1%F5%D3%9D%F7%AD%3A%F4%A62%F0%99%26%F3%A0.%F3%9Fa%F5m%0F%F8%C1%92%FE%BFM%FF%CD%5C%F9%C3%94%F8%C2%93%F4%A2d%FE%C0N%F3l%0E%F4%A40%F7%AE%3A%FE%BCK%F0%98%26%F9%F0%D1%F1%9E%2B%F3%A1%2F%F6%CF%90%F8%B0%3E%EDi%10%F4%A51%F6%E5%CE%F5%A62%F8%F7%E8%F2%A0.%F4%A54%F4%D2%9C%F7%F5%E6%F5%D5%A3%F7%E7%C5%ECb%05%F5%BE%90%F0%A06%F6%A4e%F2%BCo%F8%DF%AE%F7%B4~%F9%E9%C3%FF%CB_%F6%CE%8C%F9%C9%9C%FB%E6%AB%F5p%13%FD%D9%7F%FC%84%2C%F9%CC%A2%F6%C7%7F%F3%89%3D%F4o%12%F7%C5%99%F4%821%F8%D6%99%FC%883%FC%DB%92%F5%D3%9C%FF%CE%5D%F3%A1c%FD%D2z%F8%E7%C1%F8%E5%CC%F3%AFz%F7%E4%C0%F5%DB%AF%F7%DA%BB%FC%D2%85%F7%F2%DE%FD%D9%89%F1%A9I%F9%F1%D4%F4%A88%FA%C0%8E%F6%E2%BE%F8%E5%BD%FA%EB%BE%F7%EB%CE%F7%EC%CF%F7%EC%D0%F0%88%40%F4%8B%40%F5%8FD%EDg%0E%F8%C0%91%F3%A44%F4%B5Z%FA%C2%91%F7%EA%D4%F7%F7%E9%F8%F8%EB%F8%F8%EA%0E%C4%0Eg%00%00%00FtRNS%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%FF%00i%96D%D0%00%00%00%09pHYs%00%00%0B%12%00%00%0B%12%01%D2%DD~%FC%00%00%00%F0IDAT%18%95cp%85%83K%E9)%F3%83%E4%18%20%1C%26%09%09%D7%F4%94%C4%A0%A82%88%C0%CE%C5%93%FB%5DS%82gE%25%A7%02%05%DE*%B9z%D8%CE%CCv%0D%0E%AF%CFIjbp%ED%0D0s%B5-%CA%E6v%8DJ(o%8E%8Ff00%EB6w-%CA%CEksMN%8D%9D%1D%9D%CF%B0%C6%C1%DC%CA%B50%AF%CD%D7%B5%BA)%2C3%BF%96a%8D%B9%95%9F%2B%90%EF%0D%B5%9Ca%8D%D5%84%18%D7P%DF%16%AFe%91%DB2J%EC%5C%198%3Dc%9C%5D%81%FC%FD%91%C5%193%EC%DC%5D%19%D6v8%BB%B8%1E%F0%8A%00%F2%7B%A6%2C%ADteXY%E7%E2%E4%E3%CA%2B%20%B0%E8%EE%F4%E9%3A%403%E4%81%7C%FB%10%A3u%F7%19%19%E7M%02%19*%0F%E2%A7Y%06%DA%98%18%5B%98%82%04%B8%DC%EC'%02%F9%7D%20%3E%C8c%0C%AE%F6%D6%05%966%8E%60%FEQ%A0%00%00h5Xbt1%CB%D3%00%00%00%00IEND%AEB%60%82",
    name: "dcmf",
    author: {
        name: "Leandro L&oacute;pez",
        email: "inkel.ar@gmail.com"
    },
    contributors: ["Eva M&eacute;ndez", "Alejandro Gonzalo Bravo Garc&iacute;a"],
    description: "Extracts Dublin Core Microformats",
    help: "Search the current page for <a href=\"http://webposible.com/microformatos-dublincore/\">Dublin Core Microformats</a> and extacts them.",
    
    _count_dcmf: function(doc) { return Microformats.count('dublincore', doc, { showHidden : true }); },
    
    preview: function ( pblock ) {
        var doc = Application.activeWindow.activeTab.document;
        var mfs = Microformats.get('dublincore', doc, { showHidden: true });
        
        if(mfs.length > 0) {
            var preview = CmdUtils.renderTemplate('<div>${count} Dublin Core Microformats were found in this page.</div>', { count: mfs.length });

            var tpl = '<dl style="font-size: small">\
    <dt>Title</dt><dd>${title}</dd>\
    <dt>ID</dt><dd>${identifier}</dd>\
    <dt>Created</dt><dd>${created}</dd>\
</dl>';
            
            for(var i = 0, j = mfs.length; i < j; i++) {
                var mf = mfs[i];
                
                if(mf.isValid()) {                
                    preview += CmdUtils.renderTemplate(tpl, mf);
                }
            }
            
            pblock.innerHTML = preview;
        } else {
            pblock.innerHTML = 'No Dublin Core Microformats were found in this page.';
        }
    },
    
    execute: function() {
        var doc = Application.activeWindow.activeTab.document;
        var mFcount = this._count_dcmf(doc);
        
        if (mFcount > 0) {
            var mfs = Microformats.get('dublincore', doc, { showHidden: true });
            displayMessage('No action at the moment, sorry!');
        } else {
            displayMessage('Sorry, no Dublin Core Microformats were found!');
        }
    }
});

