Bug 1245649: Turn on no-irregular-whitespace and no-mixed-spaces-and-tabs. draft
authorDave Townsend <dtownsend@oxymoronical.com>
Wed, 03 Feb 2016 18:07:39 -0800
changeset 328963 337c33712248da91021de9b9d752e4d61abeadaf
parent 328962 41da2e0755aea0fdb9aef09118d5bcac96b56e36
child 328964 a6dd48e8e6228bbc2d9bbe26eb5043a9bce5c86b
push id10442
push userdtownsend@mozilla.com
push dateThu, 04 Feb 2016 20:44:00 +0000
bugs1245649
milestone47.0a1
Bug 1245649: Turn on no-irregular-whitespace and no-mixed-spaces-and-tabs.
browser/base/content/browser-places.js
browser/base/content/pageinfo/pageInfo.js
browser/extensions/pocket/content/main.js
browser/extensions/pocket/content/panels/js/saved.js
browser/extensions/pocket/content/pktApi.jsm
toolkit/.eslintrc
toolkit/components/microformats/microformat-shiv.js
toolkit/components/microformats/test/interface-tests/get-test.js
toolkit/components/microformats/test/lib/domutils.js
toolkit/components/microformats/test/standards-tests/mf-mixed-h-card-mixedpropertries.js
toolkit/components/microformats/test/standards-tests/mf-mixed-h-card-tworoots.js
toolkit/components/microformats/test/standards-tests/mf-mixed-h-entry-mixedroots.js
toolkit/components/microformats/test/standards-tests/mf-mixed-h-resume-mixedroots.js
toolkit/components/microformats/test/standards-tests/mf-v1-adr-simpleproperties.js
toolkit/components/microformats/test/standards-tests/mf-v1-geo-abbrpattern.js
toolkit/components/microformats/test/standards-tests/mf-v1-geo-hidden.js
toolkit/components/microformats/test/standards-tests/mf-v1-geo-simpleproperties.js
toolkit/components/microformats/test/standards-tests/mf-v1-geo-valuetitleclass.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-ampm.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-attendees.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-combining.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-concatenate.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-time.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcard-email.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcard-format.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcard-hyperlinkedphoto.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcard-justahyperlink.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcard-justaname.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcard-multiple.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcard-name.js
toolkit/components/microformats/test/standards-tests/mf-v1-hcard-single.js
toolkit/components/microformats/test/standards-tests/mf-v1-hentry-summarycontent.js
toolkit/components/microformats/test/standards-tests/mf-v1-hfeed-simple.js
toolkit/components/microformats/test/standards-tests/mf-v1-hnews-all.js
toolkit/components/microformats/test/standards-tests/mf-v1-hnews-minimum.js
toolkit/components/microformats/test/standards-tests/mf-v1-hproduct-aggregate.js
toolkit/components/microformats/test/standards-tests/mf-v1-hproduct-simpleproperties.js
toolkit/components/microformats/test/standards-tests/mf-v1-hresume-affiliation.js
toolkit/components/microformats/test/standards-tests/mf-v1-hresume-contact.js
toolkit/components/microformats/test/standards-tests/mf-v1-hresume-education.js
toolkit/components/microformats/test/standards-tests/mf-v1-hresume-skill.js
toolkit/components/microformats/test/standards-tests/mf-v1-hresume-work.js
toolkit/components/microformats/test/standards-tests/mf-v1-hreview-aggregate-hcard.js
toolkit/components/microformats/test/standards-tests/mf-v1-hreview-aggregate-justahyperlink.js
toolkit/components/microformats/test/standards-tests/mf-v1-hreview-aggregate-vevent.js
toolkit/components/microformats/test/standards-tests/mf-v1-hreview-item.js
toolkit/components/microformats/test/standards-tests/mf-v1-hreview-vcard.js
toolkit/components/microformats/test/standards-tests/mf-v1-includes-hcarditemref.js
toolkit/components/microformats/test/standards-tests/mf-v1-includes-heventitemref.js
toolkit/components/microformats/test/standards-tests/mf-v1-includes-hyperlink.js
toolkit/components/microformats/test/standards-tests/mf-v1-includes-object.js
toolkit/components/microformats/test/standards-tests/mf-v1-includes-table.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-adr-geo.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-adr-geourl.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-adr-justaname.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-adr-simpleproperties.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-as-note-note.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-baseurl.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-childimplied.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-extendeddescription.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-hcard.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-horghcard.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-hyperlinkedphoto.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-impliedname.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-impliedphoto.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-impliedurl.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-justahyperlink.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-justaname.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-nested.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-p-property.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-card-relativeurls.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-impliedvalue-nested.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-justahyperlink.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-justaname.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-summarycontent.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-u-property.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-urlincontent.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-event-ampm.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-event-attendees.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-event-combining.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-event-concatenate.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-event-dates.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-event-dt-property.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-event-justahyperlink.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-event-justaname.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-event-time.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-feed-implied-title.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-feed-simple.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-abbrpattern.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-altitude.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-hidden.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-justaname.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-simpleproperties.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-valuetitleclass.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-news-all.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-news-minimum.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-org-hyperlink.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-org-simple.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-org-simpleproperties.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-product-aggregate.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-product-justahyperlink.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-product-justaname.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-product-simpleproperties.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-recipe-all.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-recipe-minimum.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-affiliation.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-contact.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-education.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-justaname.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-skill.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-work.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-review-aggregate-hevent.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-review-aggregate-justahyperlink.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-review-aggregate-simpleproperties.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-review-hyperlink.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-review-implieditem.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-review-item.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-review-justaname.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-review-photo.js
toolkit/components/microformats/test/standards-tests/mf-v2-h-review-vcard.js
toolkit/components/microformats/test/standards-tests/mf-v2-rel-duplicate-rels.js
toolkit/components/microformats/test/standards-tests/mf-v2-rel-license.js
toolkit/components/microformats/test/standards-tests/mf-v2-rel-nofollow.js
toolkit/components/microformats/test/standards-tests/mf-v2-rel-rel-urls.js
toolkit/components/microformats/test/standards-tests/mf-v2-rel-varying-text-duplicate-rels.js
toolkit/components/microformats/test/standards-tests/mf-v2-rel-xfn-all.js
toolkit/components/microformats/test/standards-tests/mf-v2-rel-xfn-elsewhere.js
toolkit/components/microformats/test/static/javascript/count.js
toolkit/components/microformats/test/static/javascript/testrunner.js
toolkit/components/nsDefaultCLH.js
toolkit/components/places/tests/unifiedcomplete/test_416214.js
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -409,17 +409,17 @@ var PlacesCommandHook = {
         info.title = docInfo.isErrorPage ?
           (yield PlacesUtils.promisePlaceInfo(aBrowser.currentURI)).title :
           aBrowser.contentTitle;
         info.title = info.title || url.href;
         description = docInfo.description;
         charset = aBrowser.characterSet;
       }
       catch (e) {
-      	Components.utils.reportError(e);
+        Components.utils.reportError(e);
       }
 
       if (aShowEditUI) {
         // If we bookmark the page here (i.e. page was not "starred" already)
         // but open right into the "edit" state, start batching here, so
         // "Cancel" in that state removes the bookmark.
         StarUI.beginBatch();
       }
@@ -428,17 +428,17 @@ var PlacesCommandHook = {
         info.annotations = [{ name: PlacesUIUtils.DESCRIPTION_ANNO
                             , value: description }];
       }
 
       info.guid = yield PlacesTransactions.NewBookmark(info).transact();
 
       // Set the character-set
       if (charset && !PrivateBrowsingUtils.isBrowserPrivate(aBrowser))
-      	 PlacesUtils.setCharsetForURI(makeURI(url.href), charset);
+         PlacesUtils.setCharsetForURI(makeURI(url.href), charset);
     }
 
     // Revert the contents of the location bar
     if (gURLBar)
       gURLBar.handleRevert();
 
     // If it was not requested to open directly in "edit" mode, we are done.
     if (!aShowEditUI)
--- a/browser/base/content/pageinfo/pageInfo.js
+++ b/browser/base/content/pageinfo/pageInfo.js
@@ -103,17 +103,17 @@ pageInfoTreeView.prototype = {
     var treecol = tree.columns.getNamedColumn(columnname);
 
     this.sortdir =
       gTreeUtils.sort(
         tree,
         this,
         this.data,
         treecol.index,
-        function textComparator(a, b) { return (a || "").toLowerCase().localeCompare((b || "").toLowerCase()); },
+        function textComparator(a, b) { return (a || "").toLowerCase().localeCompare((b || "").toLowerCase()); },
         this.sortcol,
         this.sortdir
       );
 
     Array.forEach(tree.columns, function(col) {
       col.element.removeAttribute("sortActive");
       col.element.removeAttribute("sortDirection");
     });
--- a/browser/extensions/pocket/content/main.js
+++ b/browser/extensions/pocket/content/main.js
@@ -46,51 +46,51 @@ XPCOMUtils.defineLazyModuleGetter(this, 
   "resource://gre/modules/PrivateBrowsingUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "ReaderMode",
   "resource://gre/modules/ReaderMode.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "pktApi",
   "chrome://pocket/content/pktApi.jsm");
 
 var pktUI = (function() {
 
-	// -- Initialization (on startup and new windows) -- //
-	var inited = false;
-	var _currentPanelDidShow;
+    // -- Initialization (on startup and new windows) -- //
+    var inited = false;
+    var _currentPanelDidShow;
     var _currentPanelDidHide;
-	var _isHidden = false;
-	var _notificationTimeout;
+    var _isHidden = false;
+    var _notificationTimeout;
 
     // Init panel id at 0. The first actual panel id will have the number 1 so
     // in case at some point any panel has the id 0 we know there is something
     // wrong
     var _panelId = 0;
 
-	var prefBranch = Services.prefs.getBranch("extensions.pocket.settings.");
+    var prefBranch = Services.prefs.getBranch("extensions.pocket.settings.");
 
-	var overflowMenuWidth = 230;
-	var overflowMenuHeight = 475;
-	var savePanelWidth = 350;
-	var savePanelHeights = {collapsed: 153, expanded: 272};
+    var overflowMenuWidth = 230;
+    var overflowMenuHeight = 475;
+    var savePanelWidth = 350;
+    var savePanelHeights = {collapsed: 153, expanded: 272};
 
-	// -- Event Handling -- //
+    // -- Event Handling -- //
 
     /**
      * Event handler when Pocket toolbar button is pressed
      */
 
     function pocketPanelDidShow(event) {
-    	if (_currentPanelDidShow) {
-    		_currentPanelDidShow(event);
+        if (_currentPanelDidShow) {
+            _currentPanelDidShow(event);
         }
 
     }
 
     function pocketPanelDidHide(event) {
-    	if (_currentPanelDidHide) {
-    		_currentPanelDidHide(event);
+        if (_currentPanelDidHide) {
+            _currentPanelDidHide(event);
         }
 
         // clear the panel
         getPanelFrame().setAttribute('src', 'about:blank');
     }
 
 
     /**
@@ -100,30 +100,30 @@ var pktUI = (function() {
         openTabWithUrl('https://getpocket.com/a/', true);
      }
 
     // -- Communication to API -- //
 
     /**
      * Either save or attempt to log the user in
      */
-	function tryToSaveCurrentPage() {
-		tryToSaveUrl(getCurrentUrl(), getCurrentTitle());
-	}
+    function tryToSaveCurrentPage() {
+        tryToSaveUrl(getCurrentUrl(), getCurrentTitle());
+    }
 
     function tryToSaveUrl(url, title) {
 
-    	// If the user is logged in, go ahead and save the current page
-    	if (pktApi.isUserLoggedIn()) {
-    		saveAndShowConfirmation(url, title);
+        // If the user is logged in, go ahead and save the current page
+        if (pktApi.isUserLoggedIn()) {
+            saveAndShowConfirmation(url, title);
             return;
-    	}
+        }
 
-    	// If the user is not logged in, show the logged-out state to prompt them to authenticate
-    	showSignUp();
+        // If the user is not logged in, show the logged-out state to prompt them to authenticate
+        showSignUp();
     }
 
 
     // -- Panel UI -- //
 
     /**
      * Show the sign-up panel
      */
@@ -131,17 +131,17 @@ var pktUI = (function() {
         getFirefoxAccountSignedInUser(function(userdata)
         {
             var fxasignedin = (typeof userdata == 'object' && userdata !== null) ? '1' : '0';
             var startheight = 490;
             var inOverflowMenu = isInOverflowMenu();
 
             if (inOverflowMenu)
             {
-            	startheight = overflowMenuHeight;
+                startheight = overflowMenuHeight;
             }
             else if (pktApi.getSignupAB().indexOf('storyboard') > -1)
             {
                 startheight = 460;
                 if (fxasignedin == '1')
                 {
                     startheight = 406;
                 }
@@ -158,22 +158,22 @@ var pktUI = (function() {
             {
                 variant = 'overflow';
             }
             else
             {
                 variant = pktApi.getSignupAB();
             }
             var panelId = showPanel("about:pocket-signup?pockethost=" + Services.prefs.getCharPref("extensions.pocket.site") + "&fxasignedin=" + fxasignedin + "&variant=" + variant + '&inoverflowmenu=' + inOverflowMenu + "&locale=" + getUILocale(), {
-            		onShow: function() {
+                    onShow: function() {
                     },
-        			onHide: panelDidHide,
-            		width: inOverflowMenu ? overflowMenuWidth : 300,
-            		height: startheight
-            	});
+                    onHide: panelDidHide,
+                    width: inOverflowMenu ? overflowMenuWidth : 300,
+                    height: startheight
+                });
             });
     }
 
     /**
      * Show the logged-out state / sign-up panel
      */
     function saveAndShowConfirmation(url, title) {
 
@@ -182,21 +182,21 @@ var pktUI = (function() {
             url = ReaderMode.getOriginalUrl(url);
         }
 
         var isValidURL = (typeof url !== 'undefined' && (url.startsWith("http") || url.startsWith('https')));
 
         var inOverflowMenu = isInOverflowMenu();
         var startheight = pktApi.isPremiumUser() && isValidURL ? savePanelHeights.expanded : savePanelHeights.collapsed;
         if (inOverflowMenu) {
-        	startheight = overflowMenuHeight;
+            startheight = overflowMenuHeight;
         }
 
-    	var panelId = showPanel("about:pocket-saved?pockethost=" + Services.prefs.getCharPref("extensions.pocket.site") + "&premiumStatus=" + (pktApi.isPremiumUser() ? '1' : '0') + '&inoverflowmenu='+inOverflowMenu + "&locale=" + getUILocale(), {
-    		onShow: function() {
+        var panelId = showPanel("about:pocket-saved?pockethost=" + Services.prefs.getCharPref("extensions.pocket.site") + "&premiumStatus=" + (pktApi.isPremiumUser() ? '1' : '0') + '&inoverflowmenu='+inOverflowMenu + "&locale=" + getUILocale(), {
+            onShow: function() {
                 var saveLinkMessageId = 'saveLink';
 
                 // Send error message for invalid url
                 if (!isValidURL) {
                     // TODO: Pass key for localized error in error object
                     let error = {
                         message: 'Only links can be saved',
                         localizedKey: "onlylinkssaved"
@@ -243,67 +243,67 @@ var pktUI = (function() {
                 }
 
                 // Add title if given
                 if (typeof title !== "undefined") {
                     options.title = title;
                 }
 
                 // Send the link
-				pktApi.addLink(url, options);
-			},
-			onHide: panelDidHide,
-    		width: inOverflowMenu ? overflowMenuWidth : savePanelWidth,
-    		height: startheight
-    	});
+                pktApi.addLink(url, options);
+            },
+            onHide: panelDidHide,
+            width: inOverflowMenu ? overflowMenuWidth : savePanelWidth,
+            height: startheight
+        });
     }
 
     /**
      * Open a generic panel
      */
     function showPanel(url, options) {
 
         // Add new panel id
         _panelId += 1;
         url += ("&panelId=" + _panelId);
 
         // We don't have to hide and show the panel again if it's already shown
         // as if the user tries to click again on the toolbar button the overlay
         // will close instead of the button will be clicked
-    	var iframe = getPanelFrame();
+        var iframe = getPanelFrame();
 
-		// Register event handlers
-		registerEventMessages();
+        // Register event handlers
+        registerEventMessages();
 
-    	// Load the iframe
-    	iframe.setAttribute('src', url);
+        // Load the iframe
+        iframe.setAttribute('src', url);
 
-    	// Uncomment to leave panel open -- for debugging
-    	// panel.setAttribute('noautohide', true);
-    	// panel.setAttribute('consumeoutsideclicks', false);
-    	//
+        // Uncomment to leave panel open -- for debugging
+        // panel.setAttribute('noautohide', true);
+        // panel.setAttribute('consumeoutsideclicks', false);
+        //
 
-    	// For some reason setting onpopupshown and onpopuphidden on the panel directly didn't work, so
-    	// do it this hacky way for now
-    	_currentPanelDidShow = options.onShow;
-    	_currentPanelDidHide = options.onHide;
+        // For some reason setting onpopupshown and onpopuphidden on the panel directly didn't work, so
+        // do it this hacky way for now
+        _currentPanelDidShow = options.onShow;
+        _currentPanelDidHide = options.onHide;
 
-    	resizePanel({
-    		width: options.width,
-    		height: options.height
-    	});
+        resizePanel({
+            width: options.width,
+            height: options.height
+        });
         return _panelId;
     }
 
     /**
      * Resize the panel
      * options = {
-     * 	width: ,
-     *	height: ,
-     * 	animate [default false]
+     *  width: ,
+     *  height: ,
+     *  animate [default false]
      * }
      */
     function resizePanel(options) {
         var iframe = getPanelFrame();
         var subview = getSubview();
 
         if (subview) {
           // Use the subview's size
@@ -322,163 +322,163 @@ var pktUI = (function() {
     function panelDidHide() {
 
     }
 
     /**
      * Register all of the messages needed for the panels
      */
     function registerEventMessages() {
-    	var iframe = getPanelFrame();
+        var iframe = getPanelFrame();
 
-    	// Only register the messages once
+        // Only register the messages once
         var didInitAttributeKey = 'did_init';
         var didInitMessageListener = iframe.getAttribute(didInitAttributeKey);
-    	if (typeof didInitMessageListener !== "undefined" && didInitMessageListener == 1) {
+        if (typeof didInitMessageListener !== "undefined" && didInitMessageListener == 1) {
             return;
         }
-    	iframe.setAttribute(didInitAttributeKey, 1);
+        iframe.setAttribute(didInitAttributeKey, 1);
 
-		// When the panel is displayed it generated an event called
-		// "show": we will listen for that event and when it happens,
-		// send our own "show" event to the panel's script, so the
-		// script can prepare the panel for display.
+        // When the panel is displayed it generated an event called
+        // "show": we will listen for that event and when it happens,
+        // send our own "show" event to the panel's script, so the
+        // script can prepare the panel for display.
         var _showMessageId = "show";
-		pktUIMessaging.addMessageListener(_showMessageId, function(panelId, data) {
-			// Let panel know that it is ready
-			pktUIMessaging.sendMessageToPanel(panelId, _showMessageId);
-		});
+        pktUIMessaging.addMessageListener(_showMessageId, function(panelId, data) {
+            // Let panel know that it is ready
+            pktUIMessaging.sendMessageToPanel(panelId, _showMessageId);
+        });
 
         // Open a new tab with a given url and activate if
         var _openTabWithUrlMessageId = "openTabWithUrl";
         pktUIMessaging.addMessageListener(_openTabWithUrlMessageId, function(panelId, data) {
 
             // Check if the tab should become active after opening
             var activate = true;
             if (typeof data.activate !== "undefined") {
                 activate = data.activate;
             }
 
             var url = data.url;
             openTabWithUrl(url, activate);
             pktUIMessaging.sendResponseMessageToPanel(panelId, _openTabWithUrlMessageId, url);
         });
 
-		// Close the panel
+        // Close the panel
         var _closeMessageId = "close";
-		pktUIMessaging.addMessageListener(_closeMessageId, function(panelId, data) {
-			getPanel().hidePopup();
-		});
+        pktUIMessaging.addMessageListener(_closeMessageId, function(panelId, data) {
+            getPanel().hidePopup();
+        });
 
-		// Send the current url to the panel
+        // Send the current url to the panel
         var _getCurrentURLMessageId = "getCurrentURL";
-		pktUIMessaging.addMessageListener(_getCurrentURLMessageId, function(panelId, data) {
+        pktUIMessaging.addMessageListener(_getCurrentURLMessageId, function(panelId, data) {
             pktUIMessaging.sendResponseMessageToPanel(panelId, _getCurrentURLMessageId, getCurrentUrl());
-		});
+        });
 
         var _resizePanelMessageId = "resizePanel";
-		pktUIMessaging.addMessageListener(_resizePanelMessageId, function(panelId, data) {
-			resizePanel(data);
+        pktUIMessaging.addMessageListener(_resizePanelMessageId, function(panelId, data) {
+            resizePanel(data);
         });
 
-		// Callback post initialization to tell background script that panel is "ready" for communication.
-		pktUIMessaging.addMessageListener("listenerReady", function(panelId, data) {
+        // Callback post initialization to tell background script that panel is "ready" for communication.
+        pktUIMessaging.addMessageListener("listenerReady", function(panelId, data) {
 
-		});
+        });
 
-		pktUIMessaging.addMessageListener("collapseSavePanel", function(panelId, data) {
-			if (!pktApi.isPremiumUser() && !isInOverflowMenu())
-				resizePanel({width:savePanelWidth, height:savePanelHeights.collapsed});
-		});
+        pktUIMessaging.addMessageListener("collapseSavePanel", function(panelId, data) {
+            if (!pktApi.isPremiumUser() && !isInOverflowMenu())
+                resizePanel({width:savePanelWidth, height:savePanelHeights.collapsed});
+        });
 
-		pktUIMessaging.addMessageListener("expandSavePanel", function(panelId, data) {
-			if (!isInOverflowMenu())
-				resizePanel({width:savePanelWidth, height:savePanelHeights.expanded});
-		});
+        pktUIMessaging.addMessageListener("expandSavePanel", function(panelId, data) {
+            if (!isInOverflowMenu())
+                resizePanel({width:savePanelWidth, height:savePanelHeights.expanded});
+        });
 
-		// Ask for recently accessed/used tags for auto complete
-		var _getTagsMessageId = "getTags";
+        // Ask for recently accessed/used tags for auto complete
+        var _getTagsMessageId = "getTags";
         pktUIMessaging.addMessageListener(_getTagsMessageId, function(panelId, data) {
-			pktApi.getTags(function(tags, usedTags) {
+            pktApi.getTags(function(tags, usedTags) {
                 pktUIMessaging.sendResponseMessageToPanel(panelId, _getTagsMessageId, {
                     tags: tags,
                     usedTags: usedTags
                 });
-			});
-		});
+            });
+        });
 
-		// Ask for suggested tags based on passed url
+        // Ask for suggested tags based on passed url
         var _getSuggestedTagsMessageId = "getSuggestedTags";
-		pktUIMessaging.addMessageListener(_getSuggestedTagsMessageId, function(panelId, data) {
-			pktApi.getSuggestedTagsForURL(data.url, {
-				success: function(data, response) {
-					var suggestedTags = data.suggested_tags;
-					var successResponse = {
-						status: "success",
-						value: {
-							suggestedTags: suggestedTags
-						}
-					}
+        pktUIMessaging.addMessageListener(_getSuggestedTagsMessageId, function(panelId, data) {
+            pktApi.getSuggestedTagsForURL(data.url, {
+                success: function(data, response) {
+                    var suggestedTags = data.suggested_tags;
+                    var successResponse = {
+                        status: "success",
+                        value: {
+                            suggestedTags: suggestedTags
+                        }
+                    }
                     pktUIMessaging.sendResponseMessageToPanel(panelId, _getSuggestedTagsMessageId, successResponse);
-				},
-				error: function(error, response) {
+                },
+                error: function(error, response) {
                     pktUIMessaging.sendErrorResponseMessageToPanel(panelId, _getSuggestedTagsMessageId, error);
-				}
-			})
-		});
+                }
+            })
+        });
 
-		// Pass url and array list of tags, add to existing save item accordingly
+        // Pass url and array list of tags, add to existing save item accordingly
         var _addTagsMessageId = "addTags";
-		pktUIMessaging.addMessageListener(_addTagsMessageId, function(panelId, data) {
-			pktApi.addTagsToURL(data.url, data.tags, {
-				success: function(data, response) {
-				    var successResponse = {status: "success"};
+        pktUIMessaging.addMessageListener(_addTagsMessageId, function(panelId, data) {
+            pktApi.addTagsToURL(data.url, data.tags, {
+                success: function(data, response) {
+                    var successResponse = {status: "success"};
                     pktUIMessaging.sendResponseMessageToPanel(panelId, _addTagsMessageId, successResponse);
-				},
-				error: function(error, response) {
+                },
+                error: function(error, response) {
                     pktUIMessaging.sendErrorResponseMessageToPanel(panelId, _addTagsMessageId, error);
-				}
-			});
-		});
+                }
+            });
+        });
 
-		// Based on clicking "remove page" CTA, and passed unique item id, remove the item
+        // Based on clicking "remove page" CTA, and passed unique item id, remove the item
         var _deleteItemMessageId = "deleteItem";
-		pktUIMessaging.addMessageListener(_deleteItemMessageId, function(panelId, data) {
-			pktApi.deleteItem(data.itemId, {
-				success: function(data, response) {
-				    var successResponse = {status: "success"};
+        pktUIMessaging.addMessageListener(_deleteItemMessageId, function(panelId, data) {
+            pktApi.deleteItem(data.itemId, {
+                success: function(data, response) {
+                    var successResponse = {status: "success"};
                     pktUIMessaging.sendResponseMessageToPanel(panelId, _deleteItemMessageId, successResponse);
-				},
-				error: function(error, response) {
-				    pktUIMessaging.sendErrorResponseMessageToPanel(panelId, _deleteItemMessageId, error);
-				}
-			})
-		});
+                },
+                error: function(error, response) {
+                    pktUIMessaging.sendErrorResponseMessageToPanel(panelId, _deleteItemMessageId, error);
+                }
+            })
+        });
 
         var _initL10NMessageId = "initL10N";
         pktUIMessaging.addMessageListener(_initL10NMessageId, function(panelId, data) {
             var strings = {};
             var bundle = Services.strings.createBundle("chrome://pocket/locale/pocket.properties");
             var e = bundle.getSimpleEnumeration();
             while(e.hasMoreElements()) {
                 var str = e.getNext().QueryInterface(Components.interfaces.nsIPropertyElement);
                 strings[str.key] = str.value;
             }
             pktUIMessaging.sendResponseMessageToPanel(panelId, _initL10NMessageId, { strings: strings });
         });
 
-	}
+    }
 
-	// -- Browser Navigation -- //
+    // -- Browser Navigation -- //
 
-	/**
+    /**
      * Open a new tab with a given url and notify the iframe panel that it was opened
      */
 
-	function openTabWithUrl(url) {
+    function openTabWithUrl(url) {
         let recentWindow = Services.wm.getMostRecentWindow("navigator:browser");
         if (!recentWindow) {
           Cu.reportError("Pocket: No open browser windows to openTabWithUrl");
           return;
         }
 
         // If the user is in permanent private browsing than this is not an issue,
         // since the current window will always share the same cookie jar as the other
@@ -495,36 +495,36 @@ var pktUI = (function() {
           if (!PrivateBrowsingUtils.isWindowPrivate(win)) {
             win.openUILinkIn(url, "tab");
             return;
           }
         }
 
         // If there were no non-private windows opened already.
         recentWindow.openUILinkIn(url, "window");
-	}
+    }
 
 
     // -- Helper Functions -- //
 
     function getCurrentUrl() {
-    	return getBrowser().currentURI.spec;
+        return getBrowser().currentURI.spec;
     }
 
     function getCurrentTitle() {
         return getBrowser().contentTitle;
     }
 
     function getPanel() {
         var frame = getPanelFrame();
         var panel = frame;
         while (panel && panel.localName != "panel") {
             panel = panel.parentNode;
         }
-    	return panel;
+        return panel;
     }
 
     function getPanelFrame() {
         var frame = document.getElementById('pocket-panel-iframe');
         if (!frame) {
             var frameParent = document.getElementById("PanelUI-pocketView").firstChild;
             frame = document.createElement("iframe");
             frame.id = 'pocket-panel-iframe';
@@ -542,51 +542,51 @@ var pktUI = (function() {
     }
 
     function isInOverflowMenu() {
         var subview = getSubview();
         return !!subview;
     }
 
     function hasLegacyExtension() {
-    	return !!document.getElementById('RIL_urlbar_add');
+        return !!document.getElementById('RIL_urlbar_add');
     }
 
     function isHidden() {
-    	return _isHidden;
+        return _isHidden;
     }
 
     function getFirefoxAccountSignedInUser(callback) {
-	    fxAccounts.getSignedInUser().then(userData => {
-    		callback(userData);
-    	}).then(null, error => {
-      		callback();
-	    });
+        fxAccounts.getSignedInUser().then(userData => {
+            callback(userData);
+        }).then(null, error => {
+            callback();
+        });
     }
 
     function getUILocale() {
-    	var locale = Cc["@mozilla.org/chrome/chrome-registry;1"].
+        var locale = Cc["@mozilla.org/chrome/chrome-registry;1"].
              getService(Ci.nsIXULChromeRegistry).
              getSelectedLocale("browser");
         return locale;
     }
 
-	/**
+    /**
      * Public functions
      */
     return {
-    	getPanelFrame: getPanelFrame,
+        getPanelFrame: getPanelFrame,
 
         openTabWithUrl: openTabWithUrl,
 
-    	pocketPanelDidShow: pocketPanelDidShow,
-    	pocketPanelDidHide: pocketPanelDidHide,
+        pocketPanelDidShow: pocketPanelDidShow,
+        pocketPanelDidHide: pocketPanelDidHide,
 
-    	tryToSaveUrl: tryToSaveUrl,
-    	tryToSaveCurrentPage: tryToSaveCurrentPage
+        tryToSaveUrl: tryToSaveUrl,
+        tryToSaveCurrentPage: tryToSaveCurrentPage
     };
 }());
 
 // -- Communication to Background -- //
 // https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Interaction_between_privileged_and_non-privileged_pages
 var pktUIMessaging = (function() {
 
     /**
--- a/browser/extensions/pocket/content/panels/js/saved.js
+++ b/browser/extensions/pocket/content/panels/js/saved.js
@@ -248,20 +248,20 @@ var PKT_SAVED_OVERLAY = function (option
             },
             onDelete: function() {
                 myself.checkValidTagSubmit();
                 changestamp = Date.now();
                 myself.showActiveTags();
                 myself.checkPlaceholderStatus();
             },
             onShowDropdown: function() {
-            	thePKT_SAVED.sendMessage("expandSavePanel");
+                thePKT_SAVED.sendMessage("expandSavePanel");
             },
             onHideDropdown: function() {
-            	thePKT_SAVED.sendMessage("collapseSavePanel");
+                thePKT_SAVED.sendMessage("collapseSavePanel");
             }
         });
         $('body').on('keydown',function(e) {
             var key = e.keyCode || e.which;
             if (key == 8) {
                 var selected = $('.token-input-selected-token');
                 if (selected.length) {
                     e.preventDefault();
@@ -526,21 +526,21 @@ PKT_SAVED.prototype = {
         }
         this.panelId = pktPanelMessaging.panelIdFromURL(window.location.href);
         this.overlay = new PKT_SAVED_OVERLAY();
 
         this.inited = true;
     },
 
     addMessageListener: function(messageId, callback) {
-    	pktPanelMessaging.addMessageListener(this.panelId, messageId, callback);
+        pktPanelMessaging.addMessageListener(this.panelId, messageId, callback);
     },
 
     sendMessage: function(messageId, payload, callback) {
-    	pktPanelMessaging.sendMessage(this.panelId, messageId, payload, callback);
+        pktPanelMessaging.sendMessage(this.panelId, messageId, payload, callback);
     },
 
     create: function() {
         var myself = this;
         var url = window.location.href.match(/premiumStatus=([\w|\d|\.]*)&?/);
         if (url && url.length > 1)
         {
             myself.overlay.premiumStatus = (url[1] == '1');
--- a/browser/extensions/pocket/content/pktApi.jsm
+++ b/browser/extensions/pocket/content/pktApi.jsm
@@ -51,30 +51,30 @@ Cu.import("resource://gre/modules/Servic
 
 var pktApi = (function() {
 
     /**
      * Configuration
      */
 
     // Base url for all api calls
-    var pocketAPIhost = Services.prefs.getCharPref("extensions.pocket.api"); 	// api.getpocket.com
+    var pocketAPIhost = Services.prefs.getCharPref("extensions.pocket.api");    // api.getpocket.com
     var pocketSiteHost = Services.prefs.getCharPref("extensions.pocket.site"); // getpocket.com
     var baseAPIUrl = "https://" + pocketAPIhost + "/v3";
 
 
     /**
      * Auth keys for the API requests
      */
     var oAuthConsumerKey = Services.prefs.getCharPref("extensions.pocket.oAuthConsumerKey");
 
-	/**
-	 *
-	 */
-	var prefBranch = Services.prefs.getBranch("extensions.pocket.settings.");
+    /**
+     *
+     */
+    var prefBranch = Services.prefs.getBranch("extensions.pocket.settings.");
 
     /**
      * Helper
      */
 
     var extend = function(out) {
         out = out || {};
 
@@ -114,45 +114,45 @@ var pktApi = (function() {
     /**
      * Wrapper for different plattforms to get settings for a given key
      * @param  {string} key A string containing the name of the key you want to
      *                  retrieve the value of
      * @return {string} String containing the value of the key. If the key
      *                  does not exist, null is returned
      */
      function getSetting(key) {
-     	// TODO : Move this to sqlite or a local file so it's not editable (and is safer)
-     	// https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Local_Storage
+        // TODO : Move this to sqlite or a local file so it's not editable (and is safer)
+        // https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Local_Storage
 
-		if (!prefBranch.prefHasUserValue(key))
-			return undefined;
+        if (!prefBranch.prefHasUserValue(key))
+            return undefined;
 
-		return prefBranch.getComplexValue(key, Components.interfaces.nsISupportsString).data;
+        return prefBranch.getComplexValue(key, Components.interfaces.nsISupportsString).data;
      }
 
      /**
       * Wrapper for different plattforms to set a value for a given key in settings
       * @param {string} key     A string containing the name of the key you want
       *                         to create/update.
       * @param {string} value   String containing the value you want to give
       *                         the key you are creating/updating.
       */
     function setSetting(key, value) {
-     	// TODO : Move this to sqlite or a local file so it's not editable (and is safer)
-     	// https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Local_Storage
+        // TODO : Move this to sqlite or a local file so it's not editable (and is safer)
+        // https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Local_Storage
 
-     	if (!value)
-     		prefBranch.clearUserPref(key);
-     	else
-     	{
-     		// We use complexValue as tags can have utf-8 characters in them
-     		var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
-			str.data = value;
-     		prefBranch.setComplexValue(key, Components.interfaces.nsISupportsString, str);
-     	}
+        if (!value)
+            prefBranch.clearUserPref(key);
+        else
+        {
+            // We use complexValue as tags can have utf-8 characters in them
+            var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
+            str.data = value;
+            prefBranch.setComplexValue(key, Components.interfaces.nsISupportsString, str);
+        }
     }
 
     /**
      * Auth
      */
 
     /*
      *  All cookies from the Pocket domain
@@ -256,19 +256,19 @@ var pktApi = (function() {
         var data = options.data || {};
         data.locale_lang = Cc["@mozilla.org/chrome/chrome-registry;1"].
              getService(Ci.nsIXULChromeRegistry).
              getSelectedLocale("browser");
         data.consumer_key = oAuthConsumerKey;
 
         var request = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Components.interfaces.nsIXMLHttpRequest);
         request.open("POST", url, true);
-		request.onreadystatechange = function(e){
-			if (request.readyState == 4) {
-				if (request.status === 200) {
+        request.onreadystatechange = function(e){
+            if (request.readyState == 4) {
+                if (request.status === 200) {
                     // There could still be an error if the response is no valid json
                     // or does not have status = 1
                     var response = parseJSON(request.response);
                     if (options.success && response && response.status == 1) {
                         options.success(response, request);
                         return;
                     }
                 }
@@ -285,32 +285,32 @@ var pktApi = (function() {
                     var errorMessage;
                     if (request.status !== 200) {
                         errorMessage = request.getResponseHeader("X-Error") || request.statusText;
                         errorMessage = JSON.parse('"' + errorMessage + '"');
                     }
                     var error = {message: errorMessage};
                     options.error(error, request);
                 }
-			}
-		};
+            }
+        };
 
-		// Set headers
-		request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
-		request.setRequestHeader('X-Accept',' application/json');
+        // Set headers
+        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
+        request.setRequestHeader('X-Accept',' application/json');
 
         // Serialize and Fire off the request
-		var str = [];
-		for(var p in data) {
-			if (data.hasOwnProperty(p)) {
-				str.push(encodeURIComponent(p) + "=" + encodeURIComponent(data[p]));
-			}
-		}
+        var str = [];
+        for(var p in data) {
+            if (data.hasOwnProperty(p)) {
+                str.push(encodeURIComponent(p) + "=" + encodeURIComponent(data[p]));
+            }
+        }
 
-		request.send(str.join("&"));
+        request.send(str.join("&"));
 
         return true;
     }
 
     /**
      * Cleans all settings for the previously logged in user
      */
     function clearUserData() {
@@ -606,27 +606,27 @@ var pktApi = (function() {
             error: options.error
         });
     }
 
     /**
      * Helper function to get current signup AB group the user is in
      */
     function getSignupAB() {
-    	var setting = getSetting('signupAB');
+        var setting = getSetting('signupAB');
         if (!setting || setting.contains('hero'))
         {
             var rand = (Math.floor(Math.random()*100+1));
             if (rand > 90)
             {
-            	setting = 'storyboard_nlm';
+                setting = 'storyboard_nlm';
             }
             else
             {
-            	setting = 'storyboard_lm';
+                setting = 'storyboard_lm';
             }
             setSetting('signupAB',setting);
         }
         return setting;
     }
 
     /**
      * Public functions
--- a/toolkit/.eslintrc
+++ b/toolkit/.eslintrc
@@ -87,23 +87,23 @@
 
     // No overwriting defined functions
     // "no-func-assign": 2,
 
     // No invalid regular expresions
     "no-invalid-regexp": 2,
 
     // No odd whitespace characters
-    // "no-irregular-whitespace": 2,
+    "no-irregular-whitespace": 2,
 
     // No single if block inside an else block
     // "no-lonely-if": 2,
 
     // No mixing spaces and tabs in indent
-    // "no-mixed-spaces-and-tabs": [2, "smart-tabs"],
+    "no-mixed-spaces-and-tabs": [2, "smart-tabs"],
 
     // No unnecessary spacing
     // "no-multi-spaces": [2, { exceptions: { "AssignmentExpression": true, "VariableDeclarator": true, "ArrayExpression": true, "ObjectExpression": true } }],
 
     // No reassigning native JS objects
     // "no-native-reassign": 2,
 
     // No (!foo in bar)
--- a/toolkit/components/microformats/microformat-shiv.js
+++ b/toolkit/components/microformats/microformat-shiv.js
@@ -17,4528 +17,4528 @@ var Microformats; // jshint ignore:line
     } else {
         root.Microformats = factory();
   }
 }(this, function () {
 
     var modules = {};
 
 
-	modules.version = '1.3.3';
-	modules.livingStandard = '2015-09-25T12:26:04Z';
-
-	/**
-	 * constructor
-	 *
-	 */
-	modules.Parser = function () {
-		this.rootPrefix = 'h-';
-		this.propertyPrefixes = ['p-', 'dt-', 'u-', 'e-'];
-		this.excludeTags = ['br', 'hr'];
-	};
-
-
-	// create objects incase the v1 map modules don't load
-	modules.maps = (modules.maps)? modules.maps : {};
-	modules.rels = (modules.rels)? modules.rels : {};
-
-
-	modules.Parser.prototype = {
-
-		init: function(){
-			this.rootNode = null;
-			this.document = null;
-			this.options = {
-				'baseUrl': '',
-				'filters': [],
-				'textFormat': 'whitespacetrimmed',
-				'dateFormat': 'auto', // html5 for testing
-				'overlappingVersions': false,
-				'impliedPropertiesByVersion': true,
-				'parseLatLonGeo': false
-			};
-			this.rootID = 0;
-			this.errors = [];
-			this.noContentErr = 'No options.node or options.html was provided and no document object could be found.';
-		},
-
-
-		/**
-		 * internal parse function
-		 *
-		 * @param  {Object} options
-		 * @return {Object}
-		 */
-		get: function(options) {
-			var out = this.formatEmpty(),
-				data = [],
-				rels;
-
-			this.init();
-			options = (options)? options : {};
-			this.mergeOptions(options);
-			this.getDOMContext( options );
-
-			// if we do not have any context create error
-			if(!this.rootNode || !this.document){
-				this.errors.push(this.noContentErr);
-			}else{
-
-				// only parse h-* microformats if we need to
-				// this is added to speed up parsing
-				if(this.hasMicroformats(this.rootNode, options)){
-					this.prepareDOM( options );
-
-					if(this.options.filters.length > 0){
-						// parse flat list of items
-						var newRootNode = this.findFilterNodes(this.rootNode, this.options.filters);
-						data = this.walkRoot(newRootNode);
-					}else{
-						// parse whole document from root
-						data = this.walkRoot(this.rootNode);
-					}
-
-					out.items = data;
-					// don't clear-up DOM if it was cloned
-					if(modules.domUtils.canCloneDocument(this.document) === false){
-						this.clearUpDom(this.rootNode);
-					}
-				}
-
-				// find any rels
-				if(this.findRels){
-					rels = this.findRels(this.rootNode);
-					out.rels = rels.rels;
-					out['rel-urls'] = rels['rel-urls'];
-				}
-
-			}
-
-			if(this.errors.length > 0){
-				return this.formatError();
-			}
-			return out;
-		},
-
-
-		/**
-		 * parse to get parent microformat of passed node
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Object} options
-		 * @return {Object}
-		 */
-		getParent: function(node, options) {
-			this.init();
-			options = (options)? options : {};
-
-			if(node){
-				return this.getParentTreeWalk(node, options);
-			}else{
-				this.errors.push(this.noContentErr);
-				return this.formatError();
-			}
-		},
-
-
-	    /**
-		 * get the count of microformats
-		 *
-		 * @param  {DOM Node} rootNode
-		 * @return {Int}
-		 */
-		count: function( options ) {
-			var out = {},
-				items,
-				classItems,
-				x,
-				i;
-
-			this.init();
-			options = (options)? options : {};
-			this.getDOMContext( options );
-
-			// if we do not have any context create error
-			if(!this.rootNode || !this.document){
-				return {'errors': [this.noContentErr]};
-			}else{
-
-				items = this.findRootNodes( this.rootNode, true );
-				i = items.length;
-				while(i--) {
-					classItems = modules.domUtils.getAttributeList(items[i], 'class');
-					x = classItems.length;
-					while(x--) {
-						// find v2 names
-						if(modules.utils.startWith( classItems[x], 'h-' )){
-							this.appendCount(classItems[x], 1, out);
-						}
-						// find v1 names
-						for(var key in modules.maps) {
-							// dont double count if v1 and v2 roots are present
-							if(modules.maps[key].root === classItems[x] && classItems.indexOf(key) === -1) {
-								this.appendCount(key, 1, out);
-							}
-						}
-					}
-				}
-				var relCount = this.countRels( this.rootNode );
-				if(relCount > 0){
-					out.rels = relCount;
-				}
-
-				return out;
-			}
-		},
-
-
-		/**
-		 * does a node have a class that marks it as a microformats root
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Objecte} options
-		 * @return {Boolean}
-		 */
-		isMicroformat: function( node, options ) {
-			var classes,
-				i;
-
-			if(!node){
-				return false;
-			}
-
-			// if documemt gets topmost node
-			node = modules.domUtils.getTopMostNode( node );
-
-			// look for h-* microformats
-			classes = this.getUfClassNames(node);
-			if(options && options.filters && modules.utils.isArray(options.filters)){
-				i = options.filters.length;
-				while(i--) {
-					if(classes.root.indexOf(options.filters[i]) > -1){
-						return true;
-					}
-				}
-				return false;
-			}else{
-				return (classes.root.length > 0);
-			}
-		},
-
-
-		/**
-		 * does a node or its children have microformats
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Objecte} options
-		 * @return {Boolean}
-		 */
-		hasMicroformats: function( node, options ) {
-			var items,
-				i;
-
-			if(!node){
-				return false;
-			}
-
-			// if browser based documemt get topmost node
-			node = modules.domUtils.getTopMostNode( node );
-
-			// returns all microformat roots
-			items = this.findRootNodes( node, true );
-			if(options && options.filters && modules.utils.isArray(options.filters)){
-				i = items.length;
-				while(i--) {
-					if( this.isMicroformat( items[i], options ) ){
-						return true;
-					}
-				}
-				return false;
-			}else{
-				return (items.length > 0);
-			}
-		},
-
-
-		/**
-		 * add a new v1 mapping object to parser
-		 *
-		 * @param  {Array} maps
-		 */
-		add: function( maps ){
-			maps.forEach(function(map){
-				if(map && map.root && map.name && map.properties){
-				modules.maps[map.name] = JSON.parse(JSON.stringify(map));
-				}
-			});
-		},
-
-
-		/**
-		 * internal parse to get parent microformats by walking up the tree
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Object} options
-		 * @param  {Int} recursive
-		 * @return {Object}
-		 */
-		getParentTreeWalk: function (node, options, recursive) {
-			options = (options)? options : {};
-
-			// recursive calls
-		    if (recursive === undefined) {
-		        if (node.parentNode && node.nodeName !== 'HTML'){
-		            return this.getParentTreeWalk(node.parentNode, options, true);
-				}else{
-		            return this.formatEmpty();
-				}
-		    }
-		    if (node !== null && node !== undefined && node.parentNode) {
-		        if (this.isMicroformat( node, options )) {
-					// if we have a match return microformat
-					options.node = node;
-		            return this.get( options );
-		        }else{
-		            return this.getParentTreeWalk(node.parentNode, options, true);
-		        }
-		    }else{
-		        return this.formatEmpty();
-		    }
-		},
-
-
-
-		/**
-		 * configures what are the base DOM objects for parsing
-		 *
-		 * @param  {Object} options
-		 */
-		getDOMContext: function( options ){
-			var nodes = modules.domUtils.getDOMContext( options );
-			this.rootNode = nodes.rootNode;
-			this.document = nodes.document;
-		},
-
-
-		/**
-		 * prepares DOM before the parse begins
-		 *
-		 * @param  {Object} options
-		 * @return {Boolean}
-		 */
-		prepareDOM: function( options ){
-			var baseTag,
-				href;
+    modules.version = '1.3.3';
+    modules.livingStandard = '2015-09-25T12:26:04Z';
+
+    /**
+     * constructor
+     *
+     */
+    modules.Parser = function () {
+        this.rootPrefix = 'h-';
+        this.propertyPrefixes = ['p-', 'dt-', 'u-', 'e-'];
+        this.excludeTags = ['br', 'hr'];
+    };
+
+
+    // create objects incase the v1 map modules don't load
+    modules.maps = (modules.maps)? modules.maps : {};
+    modules.rels = (modules.rels)? modules.rels : {};
+
+
+    modules.Parser.prototype = {
+
+        init: function(){
+            this.rootNode = null;
+            this.document = null;
+            this.options = {
+                'baseUrl': '',
+                'filters': [],
+                'textFormat': 'whitespacetrimmed',
+                'dateFormat': 'auto', // html5 for testing
+                'overlappingVersions': false,
+                'impliedPropertiesByVersion': true,
+                'parseLatLonGeo': false
+            };
+            this.rootID = 0;
+            this.errors = [];
+            this.noContentErr = 'No options.node or options.html was provided and no document object could be found.';
+        },
+
+
+        /**
+         * internal parse function
+         *
+         * @param  {Object} options
+         * @return {Object}
+         */
+        get: function(options) {
+            var out = this.formatEmpty(),
+                data = [],
+                rels;
+
+            this.init();
+            options = (options)? options : {};
+            this.mergeOptions(options);
+            this.getDOMContext( options );
+
+            // if we do not have any context create error
+            if(!this.rootNode || !this.document){
+                this.errors.push(this.noContentErr);
+            }else{
+
+                // only parse h-* microformats if we need to
+                // this is added to speed up parsing
+                if(this.hasMicroformats(this.rootNode, options)){
+                    this.prepareDOM( options );
+
+                    if(this.options.filters.length > 0){
+                        // parse flat list of items
+                        var newRootNode = this.findFilterNodes(this.rootNode, this.options.filters);
+                        data = this.walkRoot(newRootNode);
+                    }else{
+                        // parse whole document from root
+                        data = this.walkRoot(this.rootNode);
+                    }
+
+                    out.items = data;
+                    // don't clear-up DOM if it was cloned
+                    if(modules.domUtils.canCloneDocument(this.document) === false){
+                        this.clearUpDom(this.rootNode);
+                    }
+                }
+
+                // find any rels
+                if(this.findRels){
+                    rels = this.findRels(this.rootNode);
+                    out.rels = rels.rels;
+                    out['rel-urls'] = rels['rel-urls'];
+                }
+
+            }
+
+            if(this.errors.length > 0){
+                return this.formatError();
+            }
+            return out;
+        },
+
+
+        /**
+         * parse to get parent microformat of passed node
+         *
+         * @param  {DOM Node} node
+         * @param  {Object} options
+         * @return {Object}
+         */
+        getParent: function(node, options) {
+            this.init();
+            options = (options)? options : {};
+
+            if(node){
+                return this.getParentTreeWalk(node, options);
+            }else{
+                this.errors.push(this.noContentErr);
+                return this.formatError();
+            }
+        },
+
+
+        /**
+         * get the count of microformats
+         *
+         * @param  {DOM Node} rootNode
+         * @return {Int}
+         */
+        count: function( options ) {
+            var out = {},
+                items,
+                classItems,
+                x,
+                i;
+
+            this.init();
+            options = (options)? options : {};
+            this.getDOMContext( options );
+
+            // if we do not have any context create error
+            if(!this.rootNode || !this.document){
+                return {'errors': [this.noContentErr]};
+            }else{
+
+                items = this.findRootNodes( this.rootNode, true );
+                i = items.length;
+                while(i--) {
+                    classItems = modules.domUtils.getAttributeList(items[i], 'class');
+                    x = classItems.length;
+                    while(x--) {
+                        // find v2 names
+                        if(modules.utils.startWith( classItems[x], 'h-' )){
+                            this.appendCount(classItems[x], 1, out);
+                        }
+                        // find v1 names
+                        for(var key in modules.maps) {
+                            // dont double count if v1 and v2 roots are present
+                            if(modules.maps[key].root === classItems[x] && classItems.indexOf(key) === -1) {
+                                this.appendCount(key, 1, out);
+                            }
+                        }
+                    }
+                }
+                var relCount = this.countRels( this.rootNode );
+                if(relCount > 0){
+                    out.rels = relCount;
+                }
+
+                return out;
+            }
+        },
+
+
+        /**
+         * does a node have a class that marks it as a microformats root
+         *
+         * @param  {DOM Node} node
+         * @param  {Objecte} options
+         * @return {Boolean}
+         */
+        isMicroformat: function( node, options ) {
+            var classes,
+                i;
+
+            if(!node){
+                return false;
+            }
+
+            // if documemt gets topmost node
+            node = modules.domUtils.getTopMostNode( node );
+
+            // look for h-* microformats
+            classes = this.getUfClassNames(node);
+            if(options && options.filters && modules.utils.isArray(options.filters)){
+                i = options.filters.length;
+                while(i--) {
+                    if(classes.root.indexOf(options.filters[i]) > -1){
+                        return true;
+                    }
+                }
+                return false;
+            }else{
+                return (classes.root.length > 0);
+            }
+        },
+
+
+        /**
+         * does a node or its children have microformats
+         *
+         * @param  {DOM Node} node
+         * @param  {Objecte} options
+         * @return {Boolean}
+         */
+        hasMicroformats: function( node, options ) {
+            var items,
+                i;
+
+            if(!node){
+                return false;
+            }
+
+            // if browser based documemt get topmost node
+            node = modules.domUtils.getTopMostNode( node );
+
+            // returns all microformat roots
+            items = this.findRootNodes( node, true );
+            if(options && options.filters && modules.utils.isArray(options.filters)){
+                i = items.length;
+                while(i--) {
+                    if( this.isMicroformat( items[i], options ) ){
+                        return true;
+                    }
+                }
+                return false;
+            }else{
+                return (items.length > 0);
+            }
+        },
+
+
+        /**
+         * add a new v1 mapping object to parser
+         *
+         * @param  {Array} maps
+         */
+        add: function( maps ){
+            maps.forEach(function(map){
+                if(map && map.root && map.name && map.properties){
+                modules.maps[map.name] = JSON.parse(JSON.stringify(map));
+                }
+            });
+        },
+
+
+        /**
+         * internal parse to get parent microformats by walking up the tree
+         *
+         * @param  {DOM Node} node
+         * @param  {Object} options
+         * @param  {Int} recursive
+         * @return {Object}
+         */
+        getParentTreeWalk: function (node, options, recursive) {
+            options = (options)? options : {};
+
+            // recursive calls
+            if (recursive === undefined) {
+                if (node.parentNode && node.nodeName !== 'HTML'){
+                    return this.getParentTreeWalk(node.parentNode, options, true);
+                }else{
+                    return this.formatEmpty();
+                }
+            }
+            if (node !== null && node !== undefined && node.parentNode) {
+                if (this.isMicroformat( node, options )) {
+                    // if we have a match return microformat
+                    options.node = node;
+                    return this.get( options );
+                }else{
+                    return this.getParentTreeWalk(node.parentNode, options, true);
+                }
+            }else{
+                return this.formatEmpty();
+            }
+        },
+
+
+
+        /**
+         * configures what are the base DOM objects for parsing
+         *
+         * @param  {Object} options
+         */
+        getDOMContext: function( options ){
+            var nodes = modules.domUtils.getDOMContext( options );
+            this.rootNode = nodes.rootNode;
+            this.document = nodes.document;
+        },
+
+
+        /**
+         * prepares DOM before the parse begins
+         *
+         * @param  {Object} options
+         * @return {Boolean}
+         */
+        prepareDOM: function( options ){
+            var baseTag,
+                href;
 
             // use current document to define baseUrl, try/catch needed for IE10+ error
             try {
                 if (!options.baseUrl && this.document && this.document.location) {
                     this.options.baseUrl = this.document.location.href;
                 }
             } catch (e) {
                 // there is no alt action
             }
 
 
-			// find base tag to set baseUrl
-			baseTag = modules.domUtils.querySelector(this.document,'base');
-			if(baseTag) {
-				href = modules.domUtils.getAttribute(baseTag, 'href');
-				if(href){
-					this.options.baseUrl = href;
-				}
-			}
-
-			// get path to rootNode
-			// then clone document
-			// then reset the rootNode to its cloned version in a new document
-			var path,
-				newDocument,
-				newRootNode;
-
-			path = modules.domUtils.getNodePath(this.rootNode);
-			newDocument = modules.domUtils.cloneDocument(this.document);
-			newRootNode = modules.domUtils.getNodeByPath(newDocument, path);
-
-			// check results as early IE fails
-			if(newDocument && newRootNode){
-				this.document = newDocument;
-				this.rootNode = newRootNode;
-			}
-
-			// add includes
-			if(this.addIncludes){
-				this.addIncludes( this.document );
-			}
-
-			return (this.rootNode && this.document);
-		},
-
-
-		/**
-		 * returns an empty structure with errors
-		 *
-		 *   @return {Object}
-		 */
-		formatError: function(){
-			var out = this.formatEmpty();
-			out.errors = this.errors;
-			return out;
-		},
-
-
-		/**
-		 * returns an empty structure
-		 *
-		 *   @return {Object}
-		 */
-		formatEmpty: function(){
-			return {
-			    'items': [],
-			    'rels': {},
-			    'rel-urls': {}
-			};
-		},
-
-
-		// find microformats of a given type and return node structures
-		findFilterNodes: function(rootNode, filters) {
-			var newRootNode = modules.domUtils.createNode('div'),
-				items = this.findRootNodes(rootNode, true),
-				i = 0,
-				x = 0,
-				y = 0;
-
-			if(items){
-				i = items.length;
-				while(x < i) {
-					// add v1 names
-					y = filters.length;
-					while (y--) {
-						if(this.getMapping(filters[y])){
-							var v1Name = this.getMapping(filters[y]).root;
-							filters.push(v1Name);
-						}
-					}
-					// append matching nodes into newRootNode
-					y = filters.length;
-					while (y--) {
-						if(modules.domUtils.hasAttributeValue(items[x], 'class', filters[y])){
-							var clone = modules.domUtils.clone(items[x]);
-							modules.domUtils.appendChild(newRootNode, clone);
-							break;
-						}
-					}
-					x++;
-				}
-			}
-
-			return newRootNode;
-		},
-
-
-		/**
-		 * appends data to output object for count
-		 *
-		 * @param  {string} name
-		 * @param  {Int} count
-		 * @param  {Object}
-		 */
-		appendCount: function(name, count, out){
-			if(out[name]){
-				out[name] = out[name] + count;
-			}else{
-				out[name] = count;
-			}
-		},
-
-
-		/**
-		 * is the microformats type in the filter list
-		 *
-		 * @param  {Object} uf
-		 * @param  {Array} filters
-		 * @return {Boolean}
-		 */
-		shouldInclude: function(uf, filters) {
-			var i;
-
-			if(modules.utils.isArray(filters) && filters.length > 0) {
-				i = filters.length;
-				while(i--) {
-					if(uf.type[0] === filters[i]) {
-						return true;
-					}
-				}
-				return false;
-			} else {
-				return true;
-			}
-		},
-
-
-		/**
-		 * finds all microformat roots in a rootNode
-		 *
-		 * @param  {DOM Node} rootNode
-		 * @param  {Boolean} includeRoot
-		 * @return {Array}
-		 */
-		findRootNodes: function(rootNode, includeRoot) {
-			var arr = null,
-				out = [],
-				classList = [],
-				items,
-				x,
-				i,
-				y,
-				key;
-
-
-			// build an array of v1 root names
-			for(key in modules.maps) {
-				if (modules.maps.hasOwnProperty(key)) {
-					classList.push(modules.maps[key].root);
-				}
-			}
-
-			// get all elements that have a class attribute
-			includeRoot = (includeRoot) ? includeRoot : false;
-			if(includeRoot && rootNode.parentNode) {
-				arr = modules.domUtils.getNodesByAttribute(rootNode.parentNode, 'class');
-			} else {
-				arr = modules.domUtils.getNodesByAttribute(rootNode, 'class');
-			}
-
-			// loop elements that have a class attribute
-			x = 0;
-			i = arr.length;
-			while(x < i) {
-
-				items = modules.domUtils.getAttributeList(arr[x], 'class');
-
-				// loop classes on an element
-				y = items.length;
-				while(y--) {
-					// match v1 root names
-					if(classList.indexOf(items[y]) > -1) {
-						out.push(arr[x]);
-						break;
-					}
-
-					// match v2 root name prefix
-					if(modules.utils.startWith(items[y], 'h-')) {
-						out.push(arr[x]);
-						break;
-					}
-				}
-
-				x++;
-			}
-			return out;
-		},
-
-
-		/**
-		 * starts the tree walk to find microformats
-		 *
-		 * @param  {DOM Node} node
-		 * @return {Array}
-		 */
-		walkRoot: function(node){
-			var context = this,
-				children = [],
-				child,
-				classes,
-				items = [],
-				out = [];
-
-			classes = this.getUfClassNames(node);
-			// if it is a root microformat node
-			if(classes && classes.root.length > 0){
-				items = this.walkTree(node);
-
-				if(items.length > 0){
-					out = out.concat(items);
-				}
-			}else{
-				// check if there are children and one of the children has a root microformat
-				children = modules.domUtils.getChildren( node );
-				if(children && children.length > 0 && this.findRootNodes(node, true).length > -1){
-					for (var i = 0; i < children.length; i++) {
-						child = children[i];
-						items = context.walkRoot(child);
-						if(items.length > 0){
-							out = out.concat(items);
-						}
-					}
-				}
-			}
-			return out;
-		},
-
-
-		/**
-		 * starts the tree walking for a single microformat
-		 *
-		 * @param  {DOM Node} node
-		 * @return {Array}
-		 */
-		walkTree: function(node) {
-			var classes,
-				out = [],
-				obj,
-				itemRootID;
-
-			// loop roots found on one element
-			classes = this.getUfClassNames(node);
-			if(classes && classes.root.length && classes.root.length > 0){
-
-				this.rootID++;
-				itemRootID = this.rootID;
-				obj = this.createUfObject(classes.root, classes.typeVersion);
-
-				this.walkChildren(node, obj, classes.root, itemRootID, classes);
-				if(this.impliedRules){
-					this.impliedRules(node, obj, classes);
-				}
-				out.push( this.cleanUfObject(obj) );
-
-
-			}
-			return out;
-		},
-
-
-		/**
-		 * finds child properties of microformat
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Object} out
-		 * @param  {String} ufName
-		 * @param  {Int} rootID
-		 * @param  {Object} parentClasses
-		 */
-		walkChildren: function(node, out, ufName, rootID, parentClasses) {
-			var context = this,
-				children = [],
-				rootItem,
-				itemRootID,
-				value,
-				propertyName,
-				propertyVersion,
-				i,
-				x,
-				y,
-				z,
-				child;
-
-			children = modules.domUtils.getChildren( node );
-
-			y = 0;
-			z = children.length;
-			while(y < z) {
-				child = children[y];
-
-				// get microformat classes for this single element
-				var classes = context.getUfClassNames(child, ufName);
-
-				// a property which is a microformat
-				if(classes.root.length > 0 && classes.properties.length > 0 && !child.addedAsRoot) {
-					// create object with type, property and value
-					rootItem = context.createUfObject(
-						classes.root,
-						classes.typeVersion,
-						modules.text.parse(this.document, child, context.options.textFormat)
-					);
-
-					// add the microformat as an array of properties
-					propertyName = context.removePropPrefix(classes.properties[0][0]);
-
-					// modifies value with "implied value rule"
-					if(parentClasses && parentClasses.root.length === 1 && parentClasses.properties.length === 1){
-						if(context.impliedValueRule){
-							out = context.impliedValueRule(out, parentClasses.properties[0][0], classes.properties[0][0], value);
-						}
-					}
-
-					if(out.properties[propertyName]) {
-						out.properties[propertyName].push(rootItem);
-					} else {
-						out.properties[propertyName] = [rootItem];
-					}
-
-					context.rootID++;
-					// used to stop duplication in heavily nested structures
-					child.addedAsRoot = true;
-
-
-					x = 0;
-					i = rootItem.type.length;
-					itemRootID = context.rootID;
-					while(x < i) {
-						context.walkChildren(child, rootItem, rootItem.type, itemRootID, classes);
-						x++;
-					}
-					if(this.impliedRules){
-						context.impliedRules(child, rootItem, classes);
-					}
-					this.cleanUfObject(rootItem);
-
-				}
-
-				// a property which is NOT a microformat and has not been used for a given root element
-				if(classes.root.length === 0 && classes.properties.length > 0) {
-
-					x = 0;
-					i = classes.properties.length;
-					while(x < i) {
-
-						value = context.getValue(child, classes.properties[x][0], out);
-						propertyName = context.removePropPrefix(classes.properties[x][0]);
-						propertyVersion = classes.properties[x][1];
-
-						// modifies value with "implied value rule"
-						if(parentClasses && parentClasses.root.length === 1 && parentClasses.properties.length === 1){
-							if(context.impliedValueRule){
-								out = context.impliedValueRule(out, parentClasses.properties[0][0], classes.properties[x][0], value);
-							}
-						}
-
-						// if we have not added this value into a property with the same name already
-						if(!context.hasRootID(child, rootID, propertyName)) {
-							// check the root and property is the same version or if overlapping versions are allowed
-							if( context.isAllowedPropertyVersion( out.typeVersion, propertyVersion ) ){
-								// add the property as an array of properties
-								if(out.properties[propertyName]) {
-									out.properties[propertyName].push(value);
-								} else {
-									out.properties[propertyName] = [value];
-								}
-								// add rootid to node so we can track its use
-								context.appendRootID(child, rootID, propertyName);
-							}
-						}
-
-						x++;
-					}
-
-					context.walkChildren(child, out, ufName, rootID, classes);
-				}
-
-				// if the node has no microformat classes, see if its children have
-				if(classes.root.length === 0 && classes.properties.length === 0) {
-					context.walkChildren(child, out, ufName, rootID, classes);
-				}
-
-				// if the node is a child root add it to the children tree
-				if(classes.root.length > 0 && classes.properties.length === 0) {
-
-					// create object with type, property and value
-					rootItem = context.createUfObject(
-						classes.root,
-						classes.typeVersion,
-						modules.text.parse(this.document, child, context.options.textFormat)
-					);
-
-					// add the microformat as an array of properties
-					if(!out.children){
-						out.children =  [];
-					}
-
-					if(!context.hasRootID(child, rootID, 'child-root')) {
-						out.children.push( rootItem );
-						context.appendRootID(child, rootID, 'child-root');
-						context.rootID++;
-					}
-
-					x = 0;
-					i = rootItem.type.length;
-					itemRootID = context.rootID;
-					while(x < i) {
-						context.walkChildren(child, rootItem, rootItem.type, itemRootID, classes);
-						x++;
-					}
-					if(this.impliedRules){
-						context.impliedRules(child, rootItem, classes);
-					}
-					context.cleanUfObject( rootItem );
-
-				}
-
-
-
-				y++;
-			}
-
-		},
-
-
-
-
-		/**
-		 * gets the value of a property from a node
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} className
-		 * @param  {Object} uf
-		 * @return {String || Object}
-		 */
-		getValue: function(node, className, uf) {
-			var value = '';
-
-			if(modules.utils.startWith(className, 'p-')) {
-				value = this.getPValue(node, true);
-			}
-
-			if(modules.utils.startWith(className, 'e-')) {
-				value = this.getEValue(node);
-			}
-
-			if(modules.utils.startWith(className, 'u-')) {
-				value = this.getUValue(node, true);
-			}
-
-			if(modules.utils.startWith(className, 'dt-')) {
-				value = this.getDTValue(node, className, uf, true);
-			}
-			return value;
-		},
-
-
-		/**
-		 * gets the value of a node which contains a 'p-' property
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Boolean} valueParse
-		 * @return {String}
-		 */
-		getPValue: function(node, valueParse) {
-			var out = '';
-			if(valueParse) {
-				out = this.getValueClass(node, 'p');
-			}
-
-			if(!out && valueParse) {
-				out = this.getValueTitle(node);
-			}
-
-			if(!out) {
-				out = modules.domUtils.getAttrValFromTagList(node, ['abbr'], 'title');
-			}
-
-			if(!out) {
-				out = modules.domUtils.getAttrValFromTagList(node, ['data','input'], 'value');
-			}
-
-			if(node.name === 'br' || node.name === 'hr') {
-				out = '';
-			}
-
-			if(!out) {
-				out = modules.domUtils.getAttrValFromTagList(node, ['img', 'area'], 'alt');
-			}
-
-			if(!out) {
-				out = modules.text.parse(this.document, node, this.options.textFormat);
-			}
-
-			return(out) ? out : '';
-		},
-
-
-		/**
-		 * gets the value of a node which contains the 'e-' property
-		 *
-		 * @param  {DOM Node} node
-		 * @return {Object}
-		 */
-		getEValue: function(node) {
-
-			var out = {value: '', html: ''};
-
-			this.expandURLs(node, 'src', this.options.baseUrl);
-			this.expandURLs(node, 'href', this.options.baseUrl);
-
-			out.value = modules.text.parse(this.document, node, this.options.textFormat);
-			out.html = modules.html.parse(node);
-
-			return out;
-		},
-
-
-		/**
-		 * gets the value of a node which contains the 'u-' property
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Boolean} valueParse
-		 * @return {String}
-		 */
-		getUValue: function(node, valueParse) {
-			var out = '';
-			if(valueParse) {
-				out = this.getValueClass(node, 'u');
-			}
-
-			if(!out && valueParse) {
-				out = this.getValueTitle(node);
-			}
-
-			if(!out) {
-				out = modules.domUtils.getAttrValFromTagList(node, ['a', 'area'], 'href');
-			}
-
-			if(!out) {
-				out = modules.domUtils.getAttrValFromTagList(node, ['img','audio','video','source'], 'src');
-			}
-
-			if(!out) {
-				out = modules.domUtils.getAttrValFromTagList(node, ['object'], 'data');
-			}
-
-			// if we have no protocol separator, turn relative url to absolute url
-			if(out && out !== '' && out.indexOf('://') === -1) {
-				out = modules.url.resolve(out, this.options.baseUrl);
-			}
-
-			if(!out) {
-				out = modules.domUtils.getAttrValFromTagList(node, ['abbr'], 'title');
-			}
-
-			if(!out) {
-				out = modules.domUtils.getAttrValFromTagList(node, ['data','input'], 'value');
-			}
-
-			if(!out) {
-				out = modules.text.parse(this.document, node, this.options.textFormat);
-			}
-
-			return(out) ? out : '';
-		},
-
-
-		/**
-		 * gets the value of a node which contains the 'dt-' property
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} className
-		 * @param  {Object} uf
-		 * @param  {Boolean} valueParse
-		 * @return {String}
-		 */
-		getDTValue: function(node, className, uf, valueParse) {
-			var out = '';
-
-			if(valueParse) {
-				out = this.getValueClass(node, 'dt');
-			}
-
-			if(!out && valueParse) {
-				out = this.getValueTitle(node);
-			}
-
-			if(!out) {
-				out = modules.domUtils.getAttrValFromTagList(node, ['time', 'ins', 'del'], 'datetime');
-			}
-
-			if(!out) {
-				out = modules.domUtils.getAttrValFromTagList(node, ['abbr'], 'title');
-			}
-
-			if(!out) {
-				out = modules.domUtils.getAttrValFromTagList(node, ['data', 'input'], 'value');
-			}
-
-			if(!out) {
-				out = modules.text.parse(this.document, node, this.options.textFormat);
-			}
-
-			if(out) {
-				if(modules.dates.isDuration(out)) {
-					// just duration
-					return out;
-				} else if(modules.dates.isTime(out)) {
-					// just time or time+timezone
-					if(uf) {
-						uf.times.push([className, modules.dates.parseAmPmTime(out, this.options.dateFormat)]);
-					}
-					return modules.dates.parseAmPmTime(out, this.options.dateFormat);
-				} else {
-					// returns a date - microformat profile
-					if(uf) {
-						uf.dates.push([className, new modules.ISODate(out).toString( this.options.dateFormat )]);
-					}
-					return new modules.ISODate(out).toString( this.options.dateFormat );
-				}
-			} else {
-				return '';
-			}
-		},
-
-
-		/**
-		 * appends a new rootid to a given node
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} id
-		 * @param  {String} propertyName
-		 */
-		appendRootID: function(node, id, propertyName) {
-			if(this.hasRootID(node, id, propertyName) === false){
-				var rootids = [];
-				if(modules.domUtils.hasAttribute(node,'rootids')){
-					rootids = modules.domUtils.getAttributeList(node,'rootids');
-				}
-				rootids.push('id' + id + '-' + propertyName);
-				modules.domUtils.setAttribute(node, 'rootids', rootids.join(' '));
-			}
-		},
-
-
-		/**
-		 * does a given node already have a rootid
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} id
-		 * @param  {String} propertyName
-		 * @return {Boolean}
-		 */
-		hasRootID: function(node, id, propertyName) {
-			var rootids = [];
-			if(!modules.domUtils.hasAttribute(node,'rootids')){
-				return false;
-			} else {
-				rootids = modules.domUtils.getAttributeList(node, 'rootids');
-				return (rootids.indexOf('id' + id + '-' + propertyName) > -1);
-			}
-		},
-
-
-
-		/**
-		 * gets the text of any child nodes with a class value
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} propertyName
-		 * @return {String || null}
-		 */
-		getValueClass: function(node, propertyType) {
-			var context = this,
-				children = [],
-				out = [],
-				child,
-				x,
-				i;
-
-			children = modules.domUtils.getChildren( node );
-
-			x = 0;
-			i = children.length;
-			while(x < i) {
-				child = children[x];
-				var value = null;
-				if(modules.domUtils.hasAttributeValue(child, 'class', 'value')) {
-					switch(propertyType) {
-					case 'p':
-						value = context.getPValue(child, false);
-						break;
-					case 'u':
-						value = context.getUValue(child, false);
-						break;
-					case 'dt':
-						value = context.getDTValue(child, '', null, false);
-						break;
-					}
-					if(value) {
-						out.push(modules.utils.trim(value));
-					}
-				}
-				x++;
-			}
-			if(out.length > 0) {
-				if(propertyType === 'p') {
-					return modules.text.parseText( this.document, out.join(' '), this.options.textFormat);
-				}
-				if(propertyType === 'u') {
-					return out.join('');
-				}
-				if(propertyType === 'dt') {
-					return modules.dates.concatFragments(out,this.options.dateFormat).toString(this.options.dateFormat);
-				}
-			} else {
-				return null;
-			}
-		},
-
-
-		/**
-		 * returns a single string of the 'title' attr from all
-		 * the child nodes with the class 'value-title'
-		 *
-		 * @param  {DOM Node} node
-		 * @return {String}
-		 */
-		getValueTitle: function(node) {
-			var out = [],
-				items,
-				i,
-				x;
-
-			items = modules.domUtils.getNodesByAttributeValue(node, 'class', 'value-title');
-			x = 0;
-			i = items.length;
-			while(x < i) {
-				if(modules.domUtils.hasAttribute(items[x], 'title')) {
-					out.push(modules.domUtils.getAttribute(items[x], 'title'));
-				}
-				x++;
-			}
-			return out.join('');
-		},
-
-
-	   /**
-		 * finds out whether a node has h-* class v1 and v2
-		 *
-		 * @param  {DOM Node} node
-		 * @return {Boolean}
-		 */
-		hasHClass: function(node){
-			var classes = this.getUfClassNames(node);
-			if(classes.root && classes.root.length > 0){
-				return true;
-			}else{
-				return false;
-			}
-		},
-
-
-		/**
-		 * get both the root and property class names from a node
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Array} ufNameArr
-		 * @return {Object}
-		 */
-		getUfClassNames: function(node, ufNameArr) {
-			var context = this,
-				out = {
-					'root': [],
-					'properties': []
-				},
-				classNames,
-				key,
-				items,
-				item,
-				i,
-				x,
-				z,
-				y,
-				map,
-				prop,
-				propName,
-				v2Name,
-				impiedRel,
-				ufName;
-
-			// don't get classes from excluded list of tags
-			if(modules.domUtils.hasTagName(node, this.excludeTags) === false){
-
-				// find classes for node
-				classNames = modules.domUtils.getAttribute(node, 'class');
-				if(classNames) {
-					items = classNames.split(' ');
-					x = 0;
-					i = items.length;
-					while(x < i) {
-
-						item = modules.utils.trim(items[x]);
-
-						// test for root prefix - v2
-						if(modules.utils.startWith(item, context.rootPrefix)) {
-							if(out.root.indexOf(item) === -1){
-								out.root.push(item);
-							}
-							out.typeVersion = 'v2';
-						}
-
-						// test for property prefix - v2
-						z = context.propertyPrefixes.length;
-						while(z--) {
-							if(modules.utils.startWith(item, context.propertyPrefixes[z])) {
-								out.properties.push([item,'v2']);
-							}
-						}
-
-						// test for mapped root classnames v1
-						for(key in modules.maps) {
-							if(modules.maps.hasOwnProperty(key)) {
-								// only add a root once
-								if(modules.maps[key].root === item && out.root.indexOf(key) === -1) {
-									// if root map has subTree set to true
-									// test to see if we should create a property or root
-									if(modules.maps[key].subTree) {
-										out.properties.push(['p-' + modules.maps[key].root, 'v1']);
-									} else {
-										out.root.push(key);
-										if(!out.typeVersion){
-											out.typeVersion = 'v1';
-										}
-									}
-								}
-							}
-						}
-
-
-						// test for mapped property classnames v1
-						if(ufNameArr){
-							for (var a = 0; a < ufNameArr.length; a++) {
-								ufName = ufNameArr[a];
-								// get mapped property v1 microformat
-								map = context.getMapping(ufName);
-								if(map) {
-									for(key in map.properties) {
-										if (map.properties.hasOwnProperty(key)) {
-
-											prop = map.properties[key];
-											propName = (prop.map) ? prop.map : 'p-' + key;
-
-											if(key === item) {
-												if(prop.uf) {
-													// loop all the classList make sure
-													//   1. this property is a root
-													//   2. that there is not already an equivalent v2 property i.e. url and u-url on the same element
-													y = 0;
-													while(y < i) {
-														v2Name = context.getV2RootName(items[y]);
-														// add new root
-														if(prop.uf.indexOf(v2Name) > -1 && out.root.indexOf(v2Name) === -1) {
-															out.root.push(v2Name);
-															out.typeVersion = 'v1';
-														}
-														y++;
-													}
-													//only add property once
-													if(out.properties.indexOf(propName) === -1) {
-														out.properties.push([propName,'v1']);
-													}
-												} else {
-													if(out.properties.indexOf(propName) === -1) {
-														out.properties.push([propName,'v1']);
-													}
-												}
-											}
-										}
-
-									}
-								}
-							}
-
-						}
-
-						x++;
-
-					}
-				}
-			}
-
-
-			// finds any alt rel=* mappings for a given node/microformat
-			if(ufNameArr && this.findRelImpied){
-				for (var b = 0; b < ufNameArr.length; b++) {
-					ufName = ufNameArr[b];
-					impiedRel = this.findRelImpied(node, ufName);
-					if(impiedRel && out.properties.indexOf(impiedRel) === -1) {
-						out.properties.push([impiedRel, 'v1']);
-					}
-				}
-			}
-
-
-			//if(out.root.length === 1 && out.properties.length === 1) {
-			//	if(out.root[0].replace('h-','') === this.removePropPrefix(out.properties[0][0])) {
-			//		out.typeVersion = 'v2';
-			//	}
-			//}
-
-			return out;
-		},
-
-
-		/**
-		 * given a v1 or v2 root name, return mapping object
-		 *
-		 * @param  {String} name
-		 * @return {Object || null}
-		 */
-		getMapping: function(name) {
-			var key;
-			for(key in modules.maps) {
-				if(modules.maps[key].root === name || key === name) {
-					return modules.maps[key];
-				}
-			}
-			return null;
-		},
-
-
-		/**
-		 * given a v1 root name returns a v2 root name i.e. vcard >>> h-card
-		 *
-		 * @param  {String} name
-		 * @return {String || null}
-		 */
-		getV2RootName: function(name) {
-			var key;
-			for(key in modules.maps) {
-				if(modules.maps[key].root === name) {
-					return key;
-				}
-			}
-			return null;
-		},
-
-
-		/**
-		 * whether a property is the right microformats version for its root type
-		 *
-		 * @param  {String} typeVersion
-		 * @param  {String} propertyVersion
-		 * @return {Boolean}
-		 */
-		isAllowedPropertyVersion: function(typeVersion, propertyVersion){
-			if(this.options.overlappingVersions === true){
-				return true;
-			}else{
-				return (typeVersion === propertyVersion);
-			}
-		},
-
-
-		/**
-		 * creates a blank microformats object
-		 *
-		 * @param  {String} name
-		 * @param  {String} value
-		 * @return {Object}
-		 */
-		createUfObject: function(names, typeVersion, value) {
-			var out = {};
-
-			// is more than just whitespace
-			if(value && modules.utils.isOnlyWhiteSpace(value) === false) {
-				out.value = value;
-			}
-			// add type i.e. ["h-card", "h-org"]
-			if(modules.utils.isArray(names)) {
-				out.type = names;
-			} else {
-				out.type = [names];
-			}
-			out.properties = {};
-			// metadata properties for parsing
-			out.typeVersion = typeVersion;
-			out.times = [];
-			out.dates = [];
-			out.altValue = null;
-
-			return out;
-		},
-
-
-		/**
-		 * removes unwanted microformats property before output
-		 *
-		 * @param  {Object} microformat
-		 */
-		cleanUfObject: function( microformat ) {
-			delete microformat.times;
-			delete microformat.dates;
-			delete microformat.typeVersion;
-			delete microformat.altValue;
-			return microformat;
-		},
-
-
-
-		/**
-		 * removes microformat property prefixes from text
-		 *
-		 * @param  {String} text
-		 * @return {String}
-		 */
-		removePropPrefix: function(text) {
-			var i;
-
-			i = this.propertyPrefixes.length;
-			while(i--) {
-				var prefix = this.propertyPrefixes[i];
-				if(modules.utils.startWith(text, prefix)) {
-					text = text.substr(prefix.length);
-				}
-			}
-			return text;
-		},
-
-
-		/**
-		 * expands all relative URLs to absolute ones where it can
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attrName
-		 * @param  {String} baseUrl
-		 */
-		expandURLs: function(node, attrName, baseUrl){
-			var i,
-				nodes,
-				attr;
-
-			nodes = modules.domUtils.getNodesByAttribute(node, attrName);
-			i = nodes.length;
-			while (i--) {
-				try{
-					// the url parser can blow up if the format is not right
-					attr = modules.domUtils.getAttribute(nodes[i], attrName);
-					if(attr && attr !== '' && baseUrl !== '' && attr.indexOf('://') === -1) {
-						//attr = urlParser.resolve(baseUrl, attr);
-						attr = modules.url.resolve(attr, baseUrl);
-						modules.domUtils.setAttribute(nodes[i], attrName, attr);
-					}
-				}catch(err){
-					// do nothing - convert only the urls we can, leave the rest as they are
-				}
-			}
-		},
-
-
-
-		/**
-		 * merges passed and default options -single level clone of properties
-		 *
-		 * @param  {Object} options
-		 */
-		mergeOptions: function(options) {
-			var key;
-			for(key in options) {
-				if(options.hasOwnProperty(key)) {
-					this.options[key] = options[key];
-				}
-			}
-		},
-
-
-		/**
-		 * removes all rootid attributes
-		 *
-		 * @param  {DOM Node} rootNode
-		 */
-		removeRootIds: function(rootNode){
-			var arr,
-				i;
-
-			arr = modules.domUtils.getNodesByAttribute(rootNode, 'rootids');
-			i = arr.length;
-			while(i--) {
-				modules.domUtils.removeAttribute(arr[i],'rootids');
-			}
-		},
-
-
-		/**
-		 * removes all changes made to the DOM
-		 *
-		 * @param  {DOM Node} rootNode
-		 */
-		clearUpDom: function(rootNode){
-			if(this.removeIncludes){
-				this.removeIncludes(rootNode);
-			}
-			this.removeRootIds(rootNode);
-		}
-
-
-	};
-
-
-	modules.Parser.prototype.constructor = modules.Parser;
-
-
-	// check parser module is loaded
-	if(modules.Parser){
-
-		/**
-		 * applies "implied rules" microformat output structure i.e. feed-title, name, photo, url and date
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Object} uf (microformat output structure)
-		 * @param  {Object} parentClasses (classes structure)
-		 * @param  {Boolean} impliedPropertiesByVersion
-		 * @return {Object}
-		 */
-		 modules.Parser.prototype.impliedRules = function(node, uf, parentClasses) {
-			var typeVersion = (uf.typeVersion)? uf.typeVersion: 'v2';
-
-			// TEMP: override to allow v1 implied properties while spec changes
-			if(this.options.impliedPropertiesByVersion === false){
-				typeVersion = 'v2';
-			}
-
-			if(node && uf && uf.properties) {
-				uf = this.impliedBackwardComp( node, uf, parentClasses );
-				if(typeVersion === 'v2'){
-					uf = this.impliedhFeedTitle( uf );
-					uf = this.impliedName( node, uf );
-					uf = this.impliedPhoto( node, uf );
-					uf = this.impliedUrl( node, uf );
-				}
-				uf = this.impliedValue( node, uf, parentClasses );
-				uf = this.impliedDate( uf );
-
-				// TEMP: flagged while spec changes are put forward
-				if(this.options.parseLatLonGeo === true){
-					uf = this.impliedGeo( uf );
-				}
-			}
-
-			return uf;
-		};
-
-
-		/**
-		 * apply implied name rule
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Object} uf
-		 * @return {Object}
-		 */
-		modules.Parser.prototype.impliedName = function(node, uf) {
-			// implied name rule
-			/*
-				img.h-x[alt]										<img class="h-card" src="glenn.htm" alt="Glenn Jones"></a>
-				area.h-x[alt] 										<area class="h-card" href="glenn.htm" alt="Glenn Jones"></area>
-				abbr.h-x[title]										<abbr class="h-card" title="Glenn Jones"GJ</abbr>
-
-				.h-x>img:only-child[alt]:not[.h-*]					<div class="h-card"><a src="glenn.htm" alt="Glenn Jones"></a></div>
-				.h-x>area:only-child[alt]:not[.h-*] 				<div class="h-card"><area href="glenn.htm" alt="Glenn Jones"></area></div>
-				.h-x>abbr:only-child[title] 						<div class="h-card"><abbr title="Glenn Jones">GJ</abbr></div>
-
-				.h-x>:only-child>img:only-child[alt]:not[.h-*] 		<div class="h-card"><span><img src="jane.html" alt="Jane Doe"/></span></div>
-				.h-x>:only-child>area:only-child[alt]:not[.h-*] 	<div class="h-card"><span><area href="jane.html" alt="Jane Doe"></area></span></div>
-				.h-x>:only-child>abbr:only-child[title]				<div class="h-card"><span><abbr title="Jane Doe">JD</abbr></span></div>
-			*/
-			var name,
-				value;
-
-			if(!uf.properties.name) {
-				value = this.getImpliedProperty(node, ['img', 'area', 'abbr'], this.getNameAttr);
-				var textFormat = this.options.textFormat;
-				// if no value for tags/properties use text
-				if(!value) {
-					name = [modules.text.parse(this.document, node, textFormat)];
-				}else{
-					name = [modules.text.parseText(this.document, value, textFormat)];
-				}
-				if(name && name[0] !== ''){
-					uf.properties.name = name;
-				}
-			}
-
-			return uf;
-		};
-
-
-		/**
-		 * apply implied photo rule
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Object} uf
-		 * @return {Object}
-		 */
-		modules.Parser.prototype.impliedPhoto = function(node, uf) {
-			// implied photo rule
-			/*
-				img.h-x[src] 												<img class="h-card" alt="Jane Doe" src="jane.jpeg"/>
-				object.h-x[data] 											<object class="h-card" data="jane.jpeg"/>Jane Doe</object>
-				.h-x>img[src]:only-of-type:not[.h-*]						<div class="h-card"><img alt="Jane Doe" src="jane.jpeg"/></div>
-				.h-x>object[data]:only-of-type:not[.h-*] 					<div class="h-card"><object data="jane.jpeg"/>Jane Doe</object></div>
-				.h-x>:only-child>img[src]:only-of-type:not[.h-*] 			<div class="h-card"><span><img alt="Jane Doe" src="jane.jpeg"/></span></div>
-				.h-x>:only-child>object[data]:only-of-type:not[.h-*] 		<div class="h-card"><span><object data="jane.jpeg"/>Jane Doe</object></span></div>
-			*/
-			var value;
-			if(!uf.properties.photo) {
-				value = this.getImpliedProperty(node, ['img', 'object'], this.getPhotoAttr);
-				if(value) {
-					// relative to absolute URL
-					if(value && value !== '' && this.options.baseUrl !== '' && value.indexOf('://') === -1) {
-						value = modules.url.resolve(value, this.options.baseUrl);
-					}
-					uf.properties.photo = [modules.utils.trim(value)];
-				}
-			}
-			return uf;
-		};
-
-
-		/**
-		 * apply implied URL rule
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Object} uf
-		 * @return {Object}
-		 */
-		modules.Parser.prototype.impliedUrl = function(node, uf) {
-			// implied URL rule
-			/*
-				a.h-x[href]  							<a class="h-card" href="glenn.html">Glenn</a>
-				area.h-x[href]  						<area class="h-card" href="glenn.html">Glenn</area>
-				.h-x>a[href]:only-of-type:not[.h-*]  	<div class="h-card" ><a href="glenn.html">Glenn</a><p>...</p></div>
-				.h-x>area[href]:only-of-type:not[.h-*]  <div class="h-card" ><area href="glenn.html">Glenn</area><p>...</p></div>
-			*/
-			var value;
-			if(!uf.properties.url) {
-				value = this.getImpliedProperty(node, ['a', 'area'], this.getURLAttr);
-				if(value) {
-					// relative to absolute URL
-					if(value && value !== '' && this.options.baseUrl !== '' && value.indexOf('://') === -1) {
-						value = modules.url.resolve(value, this.options.baseUrl);
-					}
-					uf.properties.url = [modules.utils.trim(value)];
-				}
-			}
-			return uf;
-		};
-
-
-		/**
-		 * apply implied date rule - if there is a time only property try to concat it with any date property
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Object} uf
-		 * @return {Object}
-		 */
-		modules.Parser.prototype.impliedDate = function(uf) {
-			// implied date rule
-			// http://microformats.org/wiki/value-class-pattern#microformats2_parsers
-			// http://microformats.org/wiki/microformats2-parsing-issues#implied_date_for_dt_properties_both_mf2_and_backcompat
-			var newDate;
-			if(uf.times.length > 0 && uf.dates.length > 0) {
-				newDate = modules.dates.dateTimeUnion(uf.dates[0][1], uf.times[0][1], this.options.dateFormat);
-				uf.properties[this.removePropPrefix(uf.times[0][0])][0] = newDate.toString(this.options.dateFormat);
-			}
-			// clean-up object
-			delete uf.times;
-			delete uf.dates;
-			return uf;
-		};
-
-
-		/**
-		 * get an implied property value from pre-defined tag/attriubte combinations
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} tagList (Array of tags from which an implied value can be pulled)
-		 * @param  {String} getAttrFunction (Function which can extract implied value)
-		 * @return {String || null}
-		 */
-		modules.Parser.prototype.getImpliedProperty = function(node, tagList, getAttrFunction) {
-			// i.e. img.h-card
-			var value = getAttrFunction(node),
-				descendant,
-				child;
-
-			if(!value) {
-				// i.e. .h-card>img:only-of-type:not(.h-card)
-				descendant = modules.domUtils.getSingleDescendantOfType( node, tagList);
-				if(descendant && this.hasHClass(descendant) === false){
-					value = getAttrFunction(descendant);
-				}
-				if(node.children.length > 0 ){
-					// i.e.  .h-card>:only-child>img:only-of-type:not(.h-card)
-					child = modules.domUtils.getSingleDescendant(node);
-					if(child && this.hasHClass(child) === false){
-						descendant = modules.domUtils.getSingleDescendantOfType(child, tagList);
-						if(descendant && this.hasHClass(descendant) === false){
-							value = getAttrFunction(descendant);
-						}
-					}
-				}
-			}
-
-			return value;
-		};
-
-
-		/**
-		 * get an implied name value from a node
-		 *
-		 * @param  {DOM Node} node
-		 * @return {String || null}
-		 */
-		modules.Parser.prototype.getNameAttr = function(node) {
-			var value = modules.domUtils.getAttrValFromTagList(node, ['img','area'], 'alt');
-			if(!value) {
-				value = modules.domUtils.getAttrValFromTagList(node, ['abbr'], 'title');
-			}
-			return value;
-		};
-
-
-		/**
-		 * get an implied photo value from a node
-		 *
-		 * @param  {DOM Node} node
-		 * @return {String || null}
-		 */
-		modules.Parser.prototype.getPhotoAttr = function(node) {
-			var value = modules.domUtils.getAttrValFromTagList(node, ['img'], 'src');
-			if(!value && modules.domUtils.hasAttributeValue(node, 'class', 'include') === false) {
-				value = modules.domUtils.getAttrValFromTagList(node, ['object'], 'data');
-			}
-			return value;
-		};
-
-
-		/**
-		 * get an implied photo value from a node
-		 *
-		 * @param  {DOM Node} node
-		 * @return {String || null}
-		 */
-		modules.Parser.prototype.getURLAttr = function(node) {
-			var value = null;
-			if(modules.domUtils.hasAttributeValue(node, 'class', 'include') === false){
-
-				value = modules.domUtils.getAttrValFromTagList(node, ['a'], 'href');
-				if(!value) {
-					value = modules.domUtils.getAttrValFromTagList(node, ['area'], 'href');
-				}
-
-			}
-			return value;
-		};
-
-
-		/**
-		 *
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {Object} uf
-		 * @return {Object}
-		 */
-		modules.Parser.prototype.impliedValue = function(node, uf, parentClasses){
-
-			// intersection of implied name and implied value rules
-			if(uf.properties.name) {
-				if(uf.value && parentClasses.root.length > 0 && parentClasses.properties.length === 1){
-					uf = this.getAltValue(uf, parentClasses.properties[0][0], 'p-name', uf.properties.name[0]);
-				}
-			}
-
-			// intersection of implied URL and implied value rules
-			if(uf.properties.url) {
-				if(parentClasses && parentClasses.root.length === 1 && parentClasses.properties.length === 1){
-					uf = this.getAltValue(uf, parentClasses.properties[0][0], 'u-url', uf.properties.url[0]);
-				}
-			}
-
-			// apply alt value
-			if(uf.altValue !== null){
-				uf.value = uf.altValue.value;
-			}
-			delete uf.altValue;
-
-
-			return uf;
-		};
-
-
-		/**
-		 * get alt value based on rules about parent property prefix
-		 *
-		 * @param  {Object} uf
-		 * @param  {String} parentPropertyName
-		 * @param  {String} propertyName
-		 * @param  {String} value
-		 * @return {Object}
-		 */
-		modules.Parser.prototype.getAltValue = function(uf, parentPropertyName, propertyName, value){
-			if(uf.value && !uf.altValue){
-				// first p-name of the h-* child
-				if(modules.utils.startWith(parentPropertyName,'p-') && propertyName === 'p-name'){
-					uf.altValue = {name: propertyName, value: value};
-				}
-				// if it's an e-* property element
-				if(modules.utils.startWith(parentPropertyName,'e-') && modules.utils.startWith(propertyName,'e-')){
-					uf.altValue = {name: propertyName, value: value};
-				}
-				// if it's an u-* property element
-				if(modules.utils.startWith(parentPropertyName,'u-') && propertyName === 'u-url'){
-					uf.altValue = {name: propertyName, value: value};
-				}
-			}
-			return uf;
-		};
-
-
-		/**
-		 * if a h-feed does not have a title use the title tag of a page
-		 *
-		 * @param  {Object} uf
-		 * @return {Object}
-		 */
-		modules.Parser.prototype.impliedhFeedTitle = function( uf ){
-			if(uf.type && uf.type.indexOf('h-feed') > -1){
-				// has no name property
-				if(uf.properties.name === undefined || uf.properties.name[0] === '' ){
-					// use the text from the title tag
-					var title = modules.domUtils.querySelector(this.document, 'title');
-					if(title){
-						uf.properties.name = [modules.domUtils.textContent(title)];
-					}
-				}
-			}
-			return uf;
-		};
-
-
-
-	    /**
-		 * implied Geo from pattern <abbr class="p-geo" title="37.386013;-122.082932">
-		 *
-		 * @param  {Object} uf
-		 * @return {Object}
-		 */
-		modules.Parser.prototype.impliedGeo = function( uf ){
-			var geoPair,
-				parts,
-				longitude,
-				latitude,
-				valid = true;
-
-			if(uf.type && uf.type.indexOf('h-geo') > -1){
-
-				// has no latitude or longitude property
-				if(uf.properties.latitude === undefined || uf.properties.longitude === undefined ){
-
-					geoPair = (uf.properties.name)? uf.properties.name[0] : null;
-					geoPair = (!geoPair && uf.properties.value)? uf.properties.value : geoPair;
-
-					if(geoPair){
-						// allow for the use of a ';' as in microformats and also ',' as in Geo URL
-						geoPair = geoPair.replace(';',',');
-
-						// has sep char
-						if(geoPair.indexOf(',') > -1 ){
-							parts = geoPair.split(',');
-
-							// only correct if we have two or more parts
-							if(parts.length > 1){
-
-								// latitude no value outside the range -90 or 90
-								latitude = parseFloat( parts[0] );
-								if(modules.utils.isNumber(latitude) && latitude > 90 || latitude < -90){
-									valid = false;
-								}
-
-								// longitude no value outside the range -180 to 180
-								longitude = parseFloat( parts[1] );
-								if(modules.utils.isNumber(longitude) && longitude > 180 || longitude < -180){
-									valid = false;
-								}
-
-								if(valid){
-									uf.properties.latitude = [latitude];
-									uf.properties.longitude  = [longitude];
-								}
-							}
-
-						}
-					}
-				}
-			}
-			return uf;
-		};
-
-
-		/**
-		 * if a backwards compat built structure has no properties add name through this.impliedName
-		 *
-		 * @param  {Object} uf
-		 * @return {Object}
-		 */
-		modules.Parser.prototype.impliedBackwardComp = function(node, uf, parentClasses){
-
-			// look for pattern in parent classes like "p-geo h-geo"
-			// these are structures built from backwards compat parsing of geo
-			if(parentClasses.root.length === 1 && parentClasses.properties.length === 1) {
-				if(parentClasses.root[0].replace('h-','') === this.removePropPrefix(parentClasses.properties[0][0])) {
-
-					// if microformat has no properties apply the impliedName rule to get value from containing node
-					// this will get value from html such as <abbr class="geo" title="30.267991;-97.739568">Brighton</abbr>
-					if( modules.utils.hasProperties(uf.properties) === false ){
-						uf = this.impliedName( node, uf );
-					}
-				}
-			}
-
-			return uf;
-		};
-
-
-
-	}
-
-
-	// check parser module is loaded
-	if(modules.Parser){
-
-
-		/**
-		 * appends clones of include Nodes into the DOM structure
-		 *
-		 * @param  {DOM node} rootNode
-		 */
-		modules.Parser.prototype.addIncludes = function(rootNode) {
-			this.addAttributeIncludes(rootNode, 'itemref');
-			this.addAttributeIncludes(rootNode, 'headers');
-			this.addClassIncludes(rootNode);
-		};
-
-
-		/**
-		 * appends clones of include Nodes into the DOM structure for attribute based includes
-		 *
-		 * @param  {DOM node} rootNode
-		 * @param  {String} attributeName
-		 */
-		modules.Parser.prototype.addAttributeIncludes = function(rootNode, attributeName) {
-			var arr,
-				idList,
-				i,
-				x,
-				z,
-				y;
-
-			arr = modules.domUtils.getNodesByAttribute(rootNode, attributeName);
-			x = 0;
-			i = arr.length;
-			while(x < i) {
-				idList = modules.domUtils.getAttributeList(arr[x], attributeName);
-				if(idList) {
-					z = 0;
-					y = idList.length;
-					while(z < y) {
-						this.apppendInclude(arr[x], idList[z]);
-						z++;
-					}
-				}
-				x++;
-			}
-		};
-
-
-		/**
-		 * appends clones of include Nodes into the DOM structure for class based includes
-		 *
-		 * @param  {DOM node} rootNode
-		 */
-		modules.Parser.prototype.addClassIncludes = function(rootNode) {
-			var id,
-				arr,
-				x = 0,
-				i;
-
-			arr = modules.domUtils.getNodesByAttributeValue(rootNode, 'class', 'include');
-			i = arr.length;
-			while(x < i) {
-				id = modules.domUtils.getAttrValFromTagList(arr[x], ['a'], 'href');
-				if(!id) {
-					id = modules.domUtils.getAttrValFromTagList(arr[x], ['object'], 'data');
-				}
-				this.apppendInclude(arr[x], id);
-				x++;
-			}
-		};
-
-
-		/**
-		 * appends a clone of an include into another Node using Id
-		 *
-		 * @param  {DOM node} rootNode
-		 * @param  {Stringe} id
-		 */
-		modules.Parser.prototype.apppendInclude = function(node, id){
-			var include,
-				clone;
-
-			id = modules.utils.trim(id.replace('#', ''));
-			include = modules.domUtils.getElementById(this.document, id);
-			if(include) {
-				clone = modules.domUtils.clone(include);
-				this.markIncludeChildren(clone);
-				modules.domUtils.appendChild(node, clone);
-			}
-		};
-
-
-		/**
-		 * adds an attribute marker to all the child microformat roots
-		 *
-		 * @param  {DOM node} rootNode
-		 */
-		modules.Parser.prototype.markIncludeChildren = function(rootNode) {
-			var arr,
-				x,
-				i;
-
-			// loop the array and add the attribute
-			arr = this.findRootNodes(rootNode);
-			x = 0;
-			i = arr.length;
-			modules.domUtils.setAttribute(rootNode, 'data-include', 'true');
-			modules.domUtils.setAttribute(rootNode, 'style', 'display:none');
-			while(x < i) {
-				modules.domUtils.setAttribute(arr[x], 'data-include', 'true');
-				x++;
-			}
-		};
-
-
-		/**
-		 * removes all appended include clones from DOM
-		 *
-		 * @param  {DOM node} rootNode
-		 */
-		modules.Parser.prototype.removeIncludes = function(rootNode){
-			var arr,
-				i;
-
-			// remove all the items that were added as includes
-			arr = modules.domUtils.getNodesByAttribute(rootNode, 'data-include');
-			i = arr.length;
-			while(i--) {
-				modules.domUtils.removeChild(rootNode,arr[i]);
-			}
-		};
-
-
-	}
-
-
-	// check parser module is loaded
-	if(modules.Parser){
-
-		/**
-		 * finds rel=* structures
-		 *
-		 * @param  {DOM node} rootNode
-		 * @return {Object}
-		 */
-		modules.Parser.prototype.findRels = function(rootNode) {
-			var out = {
-					'items': [],
-					'rels': {},
-					'rel-urls': {}
-				},
-				x,
-				i,
-				y,
-				z,
-				relList,
-				items,
-				item,
-				value,
-				arr;
-
-			arr = modules.domUtils.getNodesByAttribute(rootNode, 'rel');
-			x = 0;
-			i = arr.length;
-			while(x < i) {
-				relList = modules.domUtils.getAttribute(arr[x], 'rel');
-
-				if(relList) {
-					items = relList.split(' ');
-
-
-					// add rels
-					z = 0;
-					y = items.length;
-					while(z < y) {
-						item = modules.utils.trim(items[z]);
-
-						// get rel value
-						value = modules.domUtils.getAttrValFromTagList(arr[x], ['a', 'area'], 'href');
-						if(!value) {
-							value = modules.domUtils.getAttrValFromTagList(arr[x], ['link'], 'href');
-						}
-
-						// create the key
-						if(!out.rels[item]) {
-							out.rels[item] = [];
-						}
-
-						if(typeof this.options.baseUrl === 'string' && typeof value === 'string') {
-
-							var resolved = modules.url.resolve(value, this.options.baseUrl);
-							// do not add duplicate rels - based on resolved URLs
-							if(out.rels[item].indexOf(resolved) === -1){
-								out.rels[item].push( resolved );
-							}
-						}
-						z++;
-					}
-
-
-					var url = null;
-					if(modules.domUtils.hasAttribute(arr[x], 'href')){
-						url = modules.domUtils.getAttribute(arr[x], 'href');
-						if(url){
-							url = modules.url.resolve(url, this.options.baseUrl );
-						}
-					}
-
-
-					// add to rel-urls
-					var relUrl = this.getRelProperties(arr[x]);
-					relUrl.rels = items;
-					// // do not add duplicate rel-urls - based on resolved URLs
-					if(url && out['rel-urls'][url] === undefined){
-						out['rel-urls'][url] = relUrl;
-					}
-
-
-				}
-				x++;
-			}
-			return out;
-		};
-
-
-		/**
-		 * gets the properties of a rel=*
-		 *
-		 * @param  {DOM node} node
-		 * @return {Object}
-		 */
-		modules.Parser.prototype.getRelProperties = function(node){
-			var obj = {};
-
-			if(modules.domUtils.hasAttribute(node, 'media')){
-				obj.media = modules.domUtils.getAttribute(node, 'media');
-			}
-			if(modules.domUtils.hasAttribute(node, 'type')){
-				obj.type = modules.domUtils.getAttribute(node, 'type');
-			}
-			if(modules.domUtils.hasAttribute(node, 'hreflang')){
-				obj.hreflang = modules.domUtils.getAttribute(node, 'hreflang');
-			}
-			if(modules.domUtils.hasAttribute(node, 'title')){
-				obj.title = modules.domUtils.getAttribute(node, 'title');
-			}
-			if(modules.utils.trim(this.getPValue(node, false)) !== ''){
-				obj.text = this.getPValue(node, false);
-			}
-
-			return obj;
-		};
-
-
-		/**
-		 * finds any alt rel=* mappings for a given node/microformat
-		 *
-		 * @param  {DOM node} node
-		 * @param  {String} ufName
-		 * @return {String || undefined}
-		 */
-		modules.Parser.prototype.findRelImpied = function(node, ufName) {
-			var out,
-				map,
-				i;
-
-			map = this.getMapping(ufName);
-			if(map) {
-				for(var key in map.properties) {
-					if (map.properties.hasOwnProperty(key)) {
-						var prop = map.properties[key],
-							propName = (prop.map) ? prop.map : 'p-' + key,
-							relCount = 0;
-
-						// is property an alt rel=* mapping
-						if(prop.relAlt && modules.domUtils.hasAttribute(node, 'rel')) {
-							i = prop.relAlt.length;
-							while(i--) {
-								if(modules.domUtils.hasAttributeValue(node, 'rel', prop.relAlt[i])) {
-									relCount++;
-								}
-							}
-							if(relCount === prop.relAlt.length) {
-								out = propName;
-							}
-						}
-					}
-				}
-			}
-			return out;
-		};
-
-
-		/**
-		 * returns whether a node or its children has rel=* microformat
-		 *
-		 * @param  {DOM node} node
-		 * @return {Boolean}
-		 */
-		modules.Parser.prototype.hasRel = function(node) {
-			return (this.countRels(node) > 0);
-		};
-
-
-		/**
-		 * returns the number of rel=* microformats
-		 *
-		 * @param  {DOM node} node
-		 * @return {Int}
-		 */
-		modules.Parser.prototype.countRels = function(node) {
-			if(node){
-				return modules.domUtils.getNodesByAttribute(node, 'rel').length;
-			}
-			return 0;
-		};
-
-
-
-	}
-
-
-	modules.utils = {
-
-		/**
-		 * is the object a string
-		 *
-		 * @param  {Object} obj
-		 * @return {Boolean}
-		 */
-		isString: function( obj ) {
-			return typeof( obj ) === 'string';
-		},
-
-		/**
-		 * is the object a number
-		 *
-		 * @param  {Object} obj
-		 * @return {Boolean}
-		 */
-		isNumber: function( obj ) {
-			return !isNaN(parseFloat( obj )) && isFinite( obj );
-		},
-
-
-		/**
-		 * is the object an array
-		 *
-		 * @param  {Object} obj
-		 * @return {Boolean}
-		 */
-		isArray: function( obj ) {
-			return obj && !( obj.propertyIsEnumerable( 'length' ) ) && typeof obj === 'object' && typeof obj.length === 'number';
-		},
-
-
-		/**
-		 * is the object a function
-		 *
-		 * @param  {Object} obj
-		 * @return {Boolean}
-		 */
-		isFunction: function(obj) {
-			return !!(obj && obj.constructor && obj.call && obj.apply);
-		},
-
-
-		/**
-		 * does the text start with a test string
-		 *
-		 * @param  {String} text
-		 * @param  {String} test
-		 * @return {Boolean}
-		 */
-		startWith: function( text, test ) {
-			return(text.indexOf(test) === 0);
-		},
-
-
-		/**
-		 * removes spaces at front and back of text
-		 *
-		 * @param  {String} text
-		 * @return {String}
-		 */
-		trim: function( text ) {
-			if(text && this.isString(text)){
-				return (text.trim())? text.trim() : text.replace(/^\s+|\s+$/g, '');
-			}else{
-				return '';
-			}
-		},
-
-
-		/**
-		 * replaces a character in text
-		 *
-		 * @param  {String} text
-		 * @param  {Int} index
-		 * @param  {String} character
-		 * @return {String}
-		 */
-		replaceCharAt: function( text, index, character ) {
-			if(text && text.length > index){
-			   return text.substr(0, index) + character + text.substr(index+character.length);
-			}else{
-				return text;
-			}
-		},
-
-
-		/**
-		 * removes whitespace, tabs and returns from start and end of text
-		 *
-		 * @param  {String} text
-		 * @return {String}
-		 */
-		trimWhitespace: function( text ){
-			if(text && text.length){
-				var i = text.length,
-					x = 0;
-
-				// turn all whitespace chars at end into spaces
-				while (i--) {
-					if(this.isOnlyWhiteSpace(text[i])){
-						text = this.replaceCharAt( text, i, ' ' );
-					}else{
-						break;
-					}
-				}
-
-				// turn all whitespace chars at start into spaces
-				i = text.length;
-				while (x < i) {
-					if(this.isOnlyWhiteSpace(text[x])){
-						text = this.replaceCharAt( text, i, ' ' );
-					}else{
-						break;
-					}
-					x++;
-				}
-			}
-			return this.trim(text);
-		},
-
-
-		/**
-		 * does text only contain whitespace characters
-		 *
-		 * @param  {String} text
-		 * @return {Boolean}
-		 */
-		isOnlyWhiteSpace: function( text ){
-			return !(/[^\t\n\r ]/.test( text ));
-		},
-
-
-		/**
-		 * removes whitespace from text (leaves a single space)
-		 *
-		 * @param  {String} text
-		 * @return {Sring}
-		 */
-		collapseWhiteSpace: function( text ){
-			return text.replace(/[\t\n\r ]+/g, ' ');
-		},
-
-
-		/**
-		 * does an object have any of its own properties
-		 *
-		 * @param  {Object} obj
-		 * @return {Boolean}
-		 */
-		hasProperties: function( obj ) {
-			var key;
-			for(key in obj) {
-				if( obj.hasOwnProperty( key ) ) {
-					return true;
-				}
-			}
-			return false;
-		},
-
-
-		/**
-		 * a sort function - to sort objects in an array by a given property
-		 *
-		 * @param  {String} property
-		 * @param  {Boolean} reverse
-		 * @return {Int}
-		 */
-		sortObjects: function(property, reverse) {
-			reverse = (reverse) ? -1 : 1;
-			return function (a, b) {
-				a = a[property];
-				b = b[property];
-				if (a < b) {
-					return reverse * -1;
-				}
-				if (a > b) {
-					return reverse * 1;
-				}
-				return 0;
-			};
-		}
-
-	};
-
-
-	modules.domUtils = {
-
-		// blank objects for DOM
-		document: null,
-		rootNode: null,
-
-
-	     /**
-		 * gets DOMParser object
-		 *
+            // find base tag to set baseUrl
+            baseTag = modules.domUtils.querySelector(this.document,'base');
+            if(baseTag) {
+                href = modules.domUtils.getAttribute(baseTag, 'href');
+                if(href){
+                    this.options.baseUrl = href;
+                }
+            }
+
+            // get path to rootNode
+            // then clone document
+            // then reset the rootNode to its cloned version in a new document
+            var path,
+                newDocument,
+                newRootNode;
+
+            path = modules.domUtils.getNodePath(this.rootNode);
+            newDocument = modules.domUtils.cloneDocument(this.document);
+            newRootNode = modules.domUtils.getNodeByPath(newDocument, path);
+
+            // check results as early IE fails
+            if(newDocument && newRootNode){
+                this.document = newDocument;
+                this.rootNode = newRootNode;
+            }
+
+            // add includes
+            if(this.addIncludes){
+                this.addIncludes( this.document );
+            }
+
+            return (this.rootNode && this.document);
+        },
+
+
+        /**
+         * returns an empty structure with errors
+         *
+         *   @return {Object}
+         */
+        formatError: function(){
+            var out = this.formatEmpty();
+            out.errors = this.errors;
+            return out;
+        },
+
+
+        /**
+         * returns an empty structure
+         *
+         *   @return {Object}
+         */
+        formatEmpty: function(){
+            return {
+                'items': [],
+                'rels': {},
+                'rel-urls': {}
+            };
+        },
+
+
+        // find microformats of a given type and return node structures
+        findFilterNodes: function(rootNode, filters) {
+            var newRootNode = modules.domUtils.createNode('div'),
+                items = this.findRootNodes(rootNode, true),
+                i = 0,
+                x = 0,
+                y = 0;
+
+            if(items){
+                i = items.length;
+                while(x < i) {
+                    // add v1 names
+                    y = filters.length;
+                    while (y--) {
+                        if(this.getMapping(filters[y])){
+                            var v1Name = this.getMapping(filters[y]).root;
+                            filters.push(v1Name);
+                        }
+                    }
+                    // append matching nodes into newRootNode
+                    y = filters.length;
+                    while (y--) {
+                        if(modules.domUtils.hasAttributeValue(items[x], 'class', filters[y])){
+                            var clone = modules.domUtils.clone(items[x]);
+                            modules.domUtils.appendChild(newRootNode, clone);
+                            break;
+                        }
+                    }
+                    x++;
+                }
+            }
+
+            return newRootNode;
+        },
+
+
+        /**
+         * appends data to output object for count
+         *
+         * @param  {string} name
+         * @param  {Int} count
+         * @param  {Object}
+         */
+        appendCount: function(name, count, out){
+            if(out[name]){
+                out[name] = out[name] + count;
+            }else{
+                out[name] = count;
+            }
+        },
+
+
+        /**
+         * is the microformats type in the filter list
+         *
+         * @param  {Object} uf
+         * @param  {Array} filters
+         * @return {Boolean}
+         */
+        shouldInclude: function(uf, filters) {
+            var i;
+
+            if(modules.utils.isArray(filters) && filters.length > 0) {
+                i = filters.length;
+                while(i--) {
+                    if(uf.type[0] === filters[i]) {
+                        return true;
+                    }
+                }
+                return false;
+            } else {
+                return true;
+            }
+        },
+
+
+        /**
+         * finds all microformat roots in a rootNode
+         *
+         * @param  {DOM Node} rootNode
+         * @param  {Boolean} includeRoot
+         * @return {Array}
+         */
+        findRootNodes: function(rootNode, includeRoot) {
+            var arr = null,
+                out = [],
+                classList = [],
+                items,
+                x,
+                i,
+                y,
+                key;
+
+
+            // build an array of v1 root names
+            for(key in modules.maps) {
+                if (modules.maps.hasOwnProperty(key)) {
+                    classList.push(modules.maps[key].root);
+                }
+            }
+
+            // get all elements that have a class attribute
+            includeRoot = (includeRoot) ? includeRoot : false;
+            if(includeRoot && rootNode.parentNode) {
+                arr = modules.domUtils.getNodesByAttribute(rootNode.parentNode, 'class');
+            } else {
+                arr = modules.domUtils.getNodesByAttribute(rootNode, 'class');
+            }
+
+            // loop elements that have a class attribute
+            x = 0;
+            i = arr.length;
+            while(x < i) {
+
+                items = modules.domUtils.getAttributeList(arr[x], 'class');
+
+                // loop classes on an element
+                y = items.length;
+                while(y--) {
+                    // match v1 root names
+                    if(classList.indexOf(items[y]) > -1) {
+                        out.push(arr[x]);
+                        break;
+                    }
+
+                    // match v2 root name prefix
+                    if(modules.utils.startWith(items[y], 'h-')) {
+                        out.push(arr[x]);
+                        break;
+                    }
+                }
+
+                x++;
+            }
+            return out;
+        },
+
+
+        /**
+         * starts the tree walk to find microformats
+         *
+         * @param  {DOM Node} node
+         * @return {Array}
+         */
+        walkRoot: function(node){
+            var context = this,
+                children = [],
+                child,
+                classes,
+                items = [],
+                out = [];
+
+            classes = this.getUfClassNames(node);
+            // if it is a root microformat node
+            if(classes && classes.root.length > 0){
+                items = this.walkTree(node);
+
+                if(items.length > 0){
+                    out = out.concat(items);
+                }
+            }else{
+                // check if there are children and one of the children has a root microformat
+                children = modules.domUtils.getChildren( node );
+                if(children && children.length > 0 && this.findRootNodes(node, true).length > -1){
+                    for (var i = 0; i < children.length; i++) {
+                        child = children[i];
+                        items = context.walkRoot(child);
+                        if(items.length > 0){
+                            out = out.concat(items);
+                        }
+                    }
+                }
+            }
+            return out;
+        },
+
+
+        /**
+         * starts the tree walking for a single microformat
+         *
+         * @param  {DOM Node} node
+         * @return {Array}
+         */
+        walkTree: function(node) {
+            var classes,
+                out = [],
+                obj,
+                itemRootID;
+
+            // loop roots found on one element
+            classes = this.getUfClassNames(node);
+            if(classes && classes.root.length && classes.root.length > 0){
+
+                this.rootID++;
+                itemRootID = this.rootID;
+                obj = this.createUfObject(classes.root, classes.typeVersion);
+
+                this.walkChildren(node, obj, classes.root, itemRootID, classes);
+                if(this.impliedRules){
+                    this.impliedRules(node, obj, classes);
+                }
+                out.push( this.cleanUfObject(obj) );
+
+
+            }
+            return out;
+        },
+
+
+        /**
+         * finds child properties of microformat
+         *
+         * @param  {DOM Node} node
+         * @param  {Object} out
+         * @param  {String} ufName
+         * @param  {Int} rootID
+         * @param  {Object} parentClasses
+         */
+        walkChildren: function(node, out, ufName, rootID, parentClasses) {
+            var context = this,
+                children = [],
+                rootItem,
+                itemRootID,
+                value,
+                propertyName,
+                propertyVersion,
+                i,
+                x,
+                y,
+                z,
+                child;
+
+            children = modules.domUtils.getChildren( node );
+
+            y = 0;
+            z = children.length;
+            while(y < z) {
+                child = children[y];
+
+                // get microformat classes for this single element
+                var classes = context.getUfClassNames(child, ufName);
+
+                // a property which is a microformat
+                if(classes.root.length > 0 && classes.properties.length > 0 && !child.addedAsRoot) {
+                    // create object with type, property and value
+                    rootItem = context.createUfObject(
+                        classes.root,
+                        classes.typeVersion,
+                        modules.text.parse(this.document, child, context.options.textFormat)
+                    );
+
+                    // add the microformat as an array of properties
+                    propertyName = context.removePropPrefix(classes.properties[0][0]);
+
+                    // modifies value with "implied value rule"
+                    if(parentClasses && parentClasses.root.length === 1 && parentClasses.properties.length === 1){
+                        if(context.impliedValueRule){
+                            out = context.impliedValueRule(out, parentClasses.properties[0][0], classes.properties[0][0], value);
+                        }
+                    }
+
+                    if(out.properties[propertyName]) {
+                        out.properties[propertyName].push(rootItem);
+                    } else {
+                        out.properties[propertyName] = [rootItem];
+                    }
+
+                    context.rootID++;
+                    // used to stop duplication in heavily nested structures
+                    child.addedAsRoot = true;
+
+
+                    x = 0;
+                    i = rootItem.type.length;
+                    itemRootID = context.rootID;
+                    while(x < i) {
+                        context.walkChildren(child, rootItem, rootItem.type, itemRootID, classes);
+                        x++;
+                    }
+                    if(this.impliedRules){
+                        context.impliedRules(child, rootItem, classes);
+                    }
+                    this.cleanUfObject(rootItem);
+
+                }
+
+                // a property which is NOT a microformat and has not been used for a given root element
+                if(classes.root.length === 0 && classes.properties.length > 0) {
+
+                    x = 0;
+                    i = classes.properties.length;
+                    while(x < i) {
+
+                        value = context.getValue(child, classes.properties[x][0], out);
+                        propertyName = context.removePropPrefix(classes.properties[x][0]);
+                        propertyVersion = classes.properties[x][1];
+
+                        // modifies value with "implied value rule"
+                        if(parentClasses && parentClasses.root.length === 1 && parentClasses.properties.length === 1){
+                            if(context.impliedValueRule){
+                                out = context.impliedValueRule(out, parentClasses.properties[0][0], classes.properties[x][0], value);
+                            }
+                        }
+
+                        // if we have not added this value into a property with the same name already
+                        if(!context.hasRootID(child, rootID, propertyName)) {
+                            // check the root and property is the same version or if overlapping versions are allowed
+                            if( context.isAllowedPropertyVersion( out.typeVersion, propertyVersion ) ){
+                                // add the property as an array of properties
+                                if(out.properties[propertyName]) {
+                                    out.properties[propertyName].push(value);
+                                } else {
+                                    out.properties[propertyName] = [value];
+                                }
+                                // add rootid to node so we can track its use
+                                context.appendRootID(child, rootID, propertyName);
+                            }
+                        }
+
+                        x++;
+                    }
+
+                    context.walkChildren(child, out, ufName, rootID, classes);
+                }
+
+                // if the node has no microformat classes, see if its children have
+                if(classes.root.length === 0 && classes.properties.length === 0) {
+                    context.walkChildren(child, out, ufName, rootID, classes);
+                }
+
+                // if the node is a child root add it to the children tree
+                if(classes.root.length > 0 && classes.properties.length === 0) {
+
+                    // create object with type, property and value
+                    rootItem = context.createUfObject(
+                        classes.root,
+                        classes.typeVersion,
+                        modules.text.parse(this.document, child, context.options.textFormat)
+                    );
+
+                    // add the microformat as an array of properties
+                    if(!out.children){
+                        out.children =  [];
+                    }
+
+                    if(!context.hasRootID(child, rootID, 'child-root')) {
+                        out.children.push( rootItem );
+                        context.appendRootID(child, rootID, 'child-root');
+                        context.rootID++;
+                    }
+
+                    x = 0;
+                    i = rootItem.type.length;
+                    itemRootID = context.rootID;
+                    while(x < i) {
+                        context.walkChildren(child, rootItem, rootItem.type, itemRootID, classes);
+                        x++;
+                    }
+                    if(this.impliedRules){
+                        context.impliedRules(child, rootItem, classes);
+                    }
+                    context.cleanUfObject( rootItem );
+
+                }
+
+
+
+                y++;
+            }
+
+        },
+
+
+
+
+        /**
+         * gets the value of a property from a node
+         *
+         * @param  {DOM Node} node
+         * @param  {String} className
+         * @param  {Object} uf
+         * @return {String || Object}
+         */
+        getValue: function(node, className, uf) {
+            var value = '';
+
+            if(modules.utils.startWith(className, 'p-')) {
+                value = this.getPValue(node, true);
+            }
+
+            if(modules.utils.startWith(className, 'e-')) {
+                value = this.getEValue(node);
+            }
+
+            if(modules.utils.startWith(className, 'u-')) {
+                value = this.getUValue(node, true);
+            }
+
+            if(modules.utils.startWith(className, 'dt-')) {
+                value = this.getDTValue(node, className, uf, true);
+            }
+            return value;
+        },
+
+
+        /**
+         * gets the value of a node which contains a 'p-' property
+         *
+         * @param  {DOM Node} node
+         * @param  {Boolean} valueParse
+         * @return {String}
+         */
+        getPValue: function(node, valueParse) {
+            var out = '';
+            if(valueParse) {
+                out = this.getValueClass(node, 'p');
+            }
+
+            if(!out && valueParse) {
+                out = this.getValueTitle(node);
+            }
+
+            if(!out) {
+                out = modules.domUtils.getAttrValFromTagList(node, ['abbr'], 'title');
+            }
+
+            if(!out) {
+                out = modules.domUtils.getAttrValFromTagList(node, ['data','input'], 'value');
+            }
+
+            if(node.name === 'br' || node.name === 'hr') {
+                out = '';
+            }
+
+            if(!out) {
+                out = modules.domUtils.getAttrValFromTagList(node, ['img', 'area'], 'alt');
+            }
+
+            if(!out) {
+                out = modules.text.parse(this.document, node, this.options.textFormat);
+            }
+
+            return(out) ? out : '';
+        },
+
+
+        /**
+         * gets the value of a node which contains the 'e-' property
+         *
+         * @param  {DOM Node} node
+         * @return {Object}
+         */
+        getEValue: function(node) {
+
+            var out = {value: '', html: ''};
+
+            this.expandURLs(node, 'src', this.options.baseUrl);
+            this.expandURLs(node, 'href', this.options.baseUrl);
+
+            out.value = modules.text.parse(this.document, node, this.options.textFormat);
+            out.html = modules.html.parse(node);
+
+            return out;
+        },
+
+
+        /**
+         * gets the value of a node which contains the 'u-' property
+         *
+         * @param  {DOM Node} node
+         * @param  {Boolean} valueParse
+         * @return {String}
+         */
+        getUValue: function(node, valueParse) {
+            var out = '';
+            if(valueParse) {
+                out = this.getValueClass(node, 'u');
+            }
+
+            if(!out && valueParse) {
+                out = this.getValueTitle(node);
+            }
+
+            if(!out) {
+                out = modules.domUtils.getAttrValFromTagList(node, ['a', 'area'], 'href');
+            }
+
+            if(!out) {
+                out = modules.domUtils.getAttrValFromTagList(node, ['img','audio','video','source'], 'src');
+            }
+
+            if(!out) {
+                out = modules.domUtils.getAttrValFromTagList(node, ['object'], 'data');
+            }
+
+            // if we have no protocol separator, turn relative url to absolute url
+            if(out && out !== '' && out.indexOf('://') === -1) {
+                out = modules.url.resolve(out, this.options.baseUrl);
+            }
+
+            if(!out) {
+                out = modules.domUtils.getAttrValFromTagList(node, ['abbr'], 'title');
+            }
+
+            if(!out) {
+                out = modules.domUtils.getAttrValFromTagList(node, ['data','input'], 'value');
+            }
+
+            if(!out) {
+                out = modules.text.parse(this.document, node, this.options.textFormat);
+            }
+
+            return(out) ? out : '';
+        },
+
+
+        /**
+         * gets the value of a node which contains the 'dt-' property
+         *
+         * @param  {DOM Node} node
+         * @param  {String} className
+         * @param  {Object} uf
+         * @param  {Boolean} valueParse
+         * @return {String}
+         */
+        getDTValue: function(node, className, uf, valueParse) {
+            var out = '';
+
+            if(valueParse) {
+                out = this.getValueClass(node, 'dt');
+            }
+
+            if(!out && valueParse) {
+                out = this.getValueTitle(node);
+            }
+
+            if(!out) {
+                out = modules.domUtils.getAttrValFromTagList(node, ['time', 'ins', 'del'], 'datetime');
+            }
+
+            if(!out) {
+                out = modules.domUtils.getAttrValFromTagList(node, ['abbr'], 'title');
+            }
+
+            if(!out) {
+                out = modules.domUtils.getAttrValFromTagList(node, ['data', 'input'], 'value');
+            }
+
+            if(!out) {
+                out = modules.text.parse(this.document, node, this.options.textFormat);
+            }
+
+            if(out) {
+                if(modules.dates.isDuration(out)) {
+                    // just duration
+                    return out;
+                } else if(modules.dates.isTime(out)) {
+                    // just time or time+timezone
+                    if(uf) {
+                        uf.times.push([className, modules.dates.parseAmPmTime(out, this.options.dateFormat)]);
+                    }
+                    return modules.dates.parseAmPmTime(out, this.options.dateFormat);
+                } else {
+                    // returns a date - microformat profile
+                    if(uf) {
+                        uf.dates.push([className, new modules.ISODate(out).toString( this.options.dateFormat )]);
+                    }
+                    return new modules.ISODate(out).toString( this.options.dateFormat );
+                }
+            } else {
+                return '';
+            }
+        },
+
+
+        /**
+         * appends a new rootid to a given node
+         *
+         * @param  {DOM Node} node
+         * @param  {String} id
+         * @param  {String} propertyName
+         */
+        appendRootID: function(node, id, propertyName) {
+            if(this.hasRootID(node, id, propertyName) === false){
+                var rootids = [];
+                if(modules.domUtils.hasAttribute(node,'rootids')){
+                    rootids = modules.domUtils.getAttributeList(node,'rootids');
+                }
+                rootids.push('id' + id + '-' + propertyName);
+                modules.domUtils.setAttribute(node, 'rootids', rootids.join(' '));
+            }
+        },
+
+
+        /**
+         * does a given node already have a rootid
+         *
+         * @param  {DOM Node} node
+         * @param  {String} id
+         * @param  {String} propertyName
+         * @return {Boolean}
+         */
+        hasRootID: function(node, id, propertyName) {
+            var rootids = [];
+            if(!modules.domUtils.hasAttribute(node,'rootids')){
+                return false;
+            } else {
+                rootids = modules.domUtils.getAttributeList(node, 'rootids');
+                return (rootids.indexOf('id' + id + '-' + propertyName) > -1);
+            }
+        },
+
+
+
+        /**
+         * gets the text of any child nodes with a class value
+         *
+         * @param  {DOM Node} node
+         * @param  {String} propertyName
+         * @return {String || null}
+         */
+        getValueClass: function(node, propertyType) {
+            var context = this,
+                children = [],
+                out = [],
+                child,
+                x,
+                i;
+
+            children = modules.domUtils.getChildren( node );
+
+            x = 0;
+            i = children.length;
+            while(x < i) {
+                child = children[x];
+                var value = null;
+                if(modules.domUtils.hasAttributeValue(child, 'class', 'value')) {
+                    switch(propertyType) {
+                    case 'p':
+                        value = context.getPValue(child, false);
+                        break;
+                    case 'u':
+                        value = context.getUValue(child, false);
+                        break;
+                    case 'dt':
+                        value = context.getDTValue(child, '', null, false);
+                        break;
+                    }
+                    if(value) {
+                        out.push(modules.utils.trim(value));
+                    }
+                }
+                x++;
+            }
+            if(out.length > 0) {
+                if(propertyType === 'p') {
+                    return modules.text.parseText( this.document, out.join(' '), this.options.textFormat);
+                }
+                if(propertyType === 'u') {
+                    return out.join('');
+                }
+                if(propertyType === 'dt') {
+                    return modules.dates.concatFragments(out,this.options.dateFormat).toString(this.options.dateFormat);
+                }
+            } else {
+                return null;
+            }
+        },
+
+
+        /**
+         * returns a single string of the 'title' attr from all
+         * the child nodes with the class 'value-title'
+         *
+         * @param  {DOM Node} node
+         * @return {String}
+         */
+        getValueTitle: function(node) {
+            var out = [],
+                items,
+                i,
+                x;
+
+            items = modules.domUtils.getNodesByAttributeValue(node, 'class', 'value-title');
+            x = 0;
+            i = items.length;
+            while(x < i) {
+                if(modules.domUtils.hasAttribute(items[x], 'title')) {
+                    out.push(modules.domUtils.getAttribute(items[x], 'title'));
+                }
+                x++;
+            }
+            return out.join('');
+        },
+
+
+       /**
+         * finds out whether a node has h-* class v1 and v2
+         *
+         * @param  {DOM Node} node
+         * @return {Boolean}
+         */
+        hasHClass: function(node){
+            var classes = this.getUfClassNames(node);
+            if(classes.root && classes.root.length > 0){
+                return true;
+            }else{
+                return false;
+            }
+        },
+
+
+        /**
+         * get both the root and property class names from a node
+         *
+         * @param  {DOM Node} node
+         * @param  {Array} ufNameArr
+         * @return {Object}
+         */
+        getUfClassNames: function(node, ufNameArr) {
+            var context = this,
+                out = {
+                    'root': [],
+                    'properties': []
+                },
+                classNames,
+                key,
+                items,
+                item,
+                i,
+                x,
+                z,
+                y,
+                map,
+                prop,
+                propName,
+                v2Name,
+                impiedRel,
+                ufName;
+
+            // don't get classes from excluded list of tags
+            if(modules.domUtils.hasTagName(node, this.excludeTags) === false){
+
+                // find classes for node
+                classNames = modules.domUtils.getAttribute(node, 'class');
+                if(classNames) {
+                    items = classNames.split(' ');
+                    x = 0;
+                    i = items.length;
+                    while(x < i) {
+
+                        item = modules.utils.trim(items[x]);
+
+                        // test for root prefix - v2
+                        if(modules.utils.startWith(item, context.rootPrefix)) {
+                            if(out.root.indexOf(item) === -1){
+                                out.root.push(item);
+                            }
+                            out.typeVersion = 'v2';
+                        }
+
+                        // test for property prefix - v2
+                        z = context.propertyPrefixes.length;
+                        while(z--) {
+                            if(modules.utils.startWith(item, context.propertyPrefixes[z])) {
+                                out.properties.push([item,'v2']);
+                            }
+                        }
+
+                        // test for mapped root classnames v1
+                        for(key in modules.maps) {
+                            if(modules.maps.hasOwnProperty(key)) {
+                                // only add a root once
+                                if(modules.maps[key].root === item && out.root.indexOf(key) === -1) {
+                                    // if root map has subTree set to true
+                                    // test to see if we should create a property or root
+                                    if(modules.maps[key].subTree) {
+                                        out.properties.push(['p-' + modules.maps[key].root, 'v1']);
+                                    } else {
+                                        out.root.push(key);
+                                        if(!out.typeVersion){
+                                            out.typeVersion = 'v1';
+                                        }
+                                    }
+                                }
+                            }
+                        }
+
+
+                        // test for mapped property classnames v1
+                        if(ufNameArr){
+                            for (var a = 0; a < ufNameArr.length; a++) {
+                                ufName = ufNameArr[a];
+                                // get mapped property v1 microformat
+                                map = context.getMapping(ufName);
+                                if(map) {
+                                    for(key in map.properties) {
+                                        if (map.properties.hasOwnProperty(key)) {
+
+                                            prop = map.properties[key];
+                                            propName = (prop.map) ? prop.map : 'p-' + key;
+
+                                            if(key === item) {
+                                                if(prop.uf) {
+                                                    // loop all the classList make sure
+                                                    //   1. this property is a root
+                                                    //   2. that there is not already an equivalent v2 property i.e. url and u-url on the same element
+                                                    y = 0;
+                                                    while(y < i) {
+                                                        v2Name = context.getV2RootName(items[y]);
+                                                        // add new root
+                                                        if(prop.uf.indexOf(v2Name) > -1 && out.root.indexOf(v2Name) === -1) {
+                                                            out.root.push(v2Name);
+                                                            out.typeVersion = 'v1';
+                                                        }
+                                                        y++;
+                                                    }
+                                                    //only add property once
+                                                    if(out.properties.indexOf(propName) === -1) {
+                                                        out.properties.push([propName,'v1']);
+                                                    }
+                                                } else {
+                                                    if(out.properties.indexOf(propName) === -1) {
+                                                        out.properties.push([propName,'v1']);
+                                                    }
+                                                }
+                                            }
+                                        }
+
+                                    }
+                                }
+                            }
+
+                        }
+
+                        x++;
+
+                    }
+                }
+            }
+
+
+            // finds any alt rel=* mappings for a given node/microformat
+            if(ufNameArr && this.findRelImpied){
+                for (var b = 0; b < ufNameArr.length; b++) {
+                    ufName = ufNameArr[b];
+                    impiedRel = this.findRelImpied(node, ufName);
+                    if(impiedRel && out.properties.indexOf(impiedRel) === -1) {
+                        out.properties.push([impiedRel, 'v1']);
+                    }
+                }
+            }
+
+
+            //if(out.root.length === 1 && out.properties.length === 1) {
+            //  if(out.root[0].replace('h-','') === this.removePropPrefix(out.properties[0][0])) {
+            //      out.typeVersion = 'v2';
+            //  }
+            //}
+
+            return out;
+        },
+
+
+        /**
+         * given a v1 or v2 root name, return mapping object
+         *
+         * @param  {String} name
+         * @return {Object || null}
+         */
+        getMapping: function(name) {
+            var key;
+            for(key in modules.maps) {
+                if(modules.maps[key].root === name || key === name) {
+                    return modules.maps[key];
+                }
+            }
+            return null;
+        },
+
+
+        /**
+         * given a v1 root name returns a v2 root name i.e. vcard >>> h-card
+         *
+         * @param  {String} name
+         * @return {String || null}
+         */
+        getV2RootName: function(name) {
+            var key;
+            for(key in modules.maps) {
+                if(modules.maps[key].root === name) {
+                    return key;
+                }
+            }
+            return null;
+        },
+
+
+        /**
+         * whether a property is the right microformats version for its root type
+         *
+         * @param  {String} typeVersion
+         * @param  {String} propertyVersion
+         * @return {Boolean}
+         */
+        isAllowedPropertyVersion: function(typeVersion, propertyVersion){
+            if(this.options.overlappingVersions === true){
+                return true;
+            }else{
+                return (typeVersion === propertyVersion);
+            }
+        },
+
+
+        /**
+         * creates a blank microformats object
+         *
+         * @param  {String} name
+         * @param  {String} value
+         * @return {Object}
+         */
+        createUfObject: function(names, typeVersion, value) {
+            var out = {};
+
+            // is more than just whitespace
+            if(value && modules.utils.isOnlyWhiteSpace(value) === false) {
+                out.value = value;
+            }
+            // add type i.e. ["h-card", "h-org"]
+            if(modules.utils.isArray(names)) {
+                out.type = names;
+            } else {
+                out.type = [names];
+            }
+            out.properties = {};
+            // metadata properties for parsing
+            out.typeVersion = typeVersion;
+            out.times = [];
+            out.dates = [];
+            out.altValue = null;
+
+            return out;
+        },
+
+
+        /**
+         * removes unwanted microformats property before output
+         *
+         * @param  {Object} microformat
+         */
+        cleanUfObject: function( microformat ) {
+            delete microformat.times;
+            delete microformat.dates;
+            delete microformat.typeVersion;
+            delete microformat.altValue;
+            return microformat;
+        },
+
+
+
+        /**
+         * removes microformat property prefixes from text
+         *
+         * @param  {String} text
+         * @return {String}
+         */
+        removePropPrefix: function(text) {
+            var i;
+
+            i = this.propertyPrefixes.length;
+            while(i--) {
+                var prefix = this.propertyPrefixes[i];
+                if(modules.utils.startWith(text, prefix)) {
+                    text = text.substr(prefix.length);
+                }
+            }
+            return text;
+        },
+
+
+        /**
+         * expands all relative URLs to absolute ones where it can
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attrName
+         * @param  {String} baseUrl
+         */
+        expandURLs: function(node, attrName, baseUrl){
+            var i,
+                nodes,
+                attr;
+
+            nodes = modules.domUtils.getNodesByAttribute(node, attrName);
+            i = nodes.length;
+            while (i--) {
+                try{
+                    // the url parser can blow up if the format is not right
+                    attr = modules.domUtils.getAttribute(nodes[i], attrName);
+                    if(attr && attr !== '' && baseUrl !== '' && attr.indexOf('://') === -1) {
+                        //attr = urlParser.resolve(baseUrl, attr);
+                        attr = modules.url.resolve(attr, baseUrl);
+                        modules.domUtils.setAttribute(nodes[i], attrName, attr);
+                    }
+                }catch(err){
+                    // do nothing - convert only the urls we can, leave the rest as they are
+                }
+            }
+        },
+
+
+
+        /**
+         * merges passed and default options -single level clone of properties
+         *
+         * @param  {Object} options
+         */
+        mergeOptions: function(options) {
+            var key;
+            for(key in options) {
+                if(options.hasOwnProperty(key)) {
+                    this.options[key] = options[key];
+                }
+            }
+        },
+
+
+        /**
+         * removes all rootid attributes
+         *
+         * @param  {DOM Node} rootNode
+         */
+        removeRootIds: function(rootNode){
+            var arr,
+                i;
+
+            arr = modules.domUtils.getNodesByAttribute(rootNode, 'rootids');
+            i = arr.length;
+            while(i--) {
+                modules.domUtils.removeAttribute(arr[i],'rootids');
+            }
+        },
+
+
+        /**
+         * removes all changes made to the DOM
+         *
+         * @param  {DOM Node} rootNode
+         */
+        clearUpDom: function(rootNode){
+            if(this.removeIncludes){
+                this.removeIncludes(rootNode);
+            }
+            this.removeRootIds(rootNode);
+        }
+
+
+    };
+
+
+    modules.Parser.prototype.constructor = modules.Parser;
+
+
+    // check parser module is loaded
+    if(modules.Parser){
+
+        /**
+         * applies "implied rules" microformat output structure i.e. feed-title, name, photo, url and date
+         *
+         * @param  {DOM Node} node
+         * @param  {Object} uf (microformat output structure)
+         * @param  {Object} parentClasses (classes structure)
+         * @param  {Boolean} impliedPropertiesByVersion
+         * @return {Object}
+         */
+         modules.Parser.prototype.impliedRules = function(node, uf, parentClasses) {
+            var typeVersion = (uf.typeVersion)? uf.typeVersion: 'v2';
+
+            // TEMP: override to allow v1 implied properties while spec changes
+            if(this.options.impliedPropertiesByVersion === false){
+                typeVersion = 'v2';
+            }
+
+            if(node && uf && uf.properties) {
+                uf = this.impliedBackwardComp( node, uf, parentClasses );
+                if(typeVersion === 'v2'){
+                    uf = this.impliedhFeedTitle( uf );
+                    uf = this.impliedName( node, uf );
+                    uf = this.impliedPhoto( node, uf );
+                    uf = this.impliedUrl( node, uf );
+                }
+                uf = this.impliedValue( node, uf, parentClasses );
+                uf = this.impliedDate( uf );
+
+                // TEMP: flagged while spec changes are put forward
+                if(this.options.parseLatLonGeo === true){
+                    uf = this.impliedGeo( uf );
+                }
+            }
+
+            return uf;
+        };
+
+
+        /**
+         * apply implied name rule
+         *
+         * @param  {DOM Node} node
+         * @param  {Object} uf
+         * @return {Object}
+         */
+        modules.Parser.prototype.impliedName = function(node, uf) {
+            // implied name rule
+            /*
+                img.h-x[alt]                                        <img class="h-card" src="glenn.htm" alt="Glenn Jones"></a>
+                area.h-x[alt]                                       <area class="h-card" href="glenn.htm" alt="Glenn Jones"></area>
+                abbr.h-x[title]                                     <abbr class="h-card" title="Glenn Jones"GJ</abbr>
+
+                .h-x>img:only-child[alt]:not[.h-*]                  <div class="h-card"><a src="glenn.htm" alt="Glenn Jones"></a></div>
+                .h-x>area:only-child[alt]:not[.h-*]                 <div class="h-card"><area href="glenn.htm" alt="Glenn Jones"></area></div>
+                .h-x>abbr:only-child[title]                         <div class="h-card"><abbr title="Glenn Jones">GJ</abbr></div>
+
+                .h-x>:only-child>img:only-child[alt]:not[.h-*]      <div class="h-card"><span><img src="jane.html" alt="Jane Doe"/></span></div>
+                .h-x>:only-child>area:only-child[alt]:not[.h-*]     <div class="h-card"><span><area href="jane.html" alt="Jane Doe"></area></span></div>
+                .h-x>:only-child>abbr:only-child[title]             <div class="h-card"><span><abbr title="Jane Doe">JD</abbr></span></div>
+            */
+            var name,
+                value;
+
+            if(!uf.properties.name) {
+                value = this.getImpliedProperty(node, ['img', 'area', 'abbr'], this.getNameAttr);
+                var textFormat = this.options.textFormat;
+                // if no value for tags/properties use text
+                if(!value) {
+                    name = [modules.text.parse(this.document, node, textFormat)];
+                }else{
+                    name = [modules.text.parseText(this.document, value, textFormat)];
+                }
+                if(name && name[0] !== ''){
+                    uf.properties.name = name;
+                }
+            }
+
+            return uf;
+        };
+
+
+        /**
+         * apply implied photo rule
+         *
+         * @param  {DOM Node} node
+         * @param  {Object} uf
+         * @return {Object}
+         */
+        modules.Parser.prototype.impliedPhoto = function(node, uf) {
+            // implied photo rule
+            /*
+                img.h-x[src]                                                <img class="h-card" alt="Jane Doe" src="jane.jpeg"/>
+                object.h-x[data]                                            <object class="h-card" data="jane.jpeg"/>Jane Doe</object>
+                .h-x>img[src]:only-of-type:not[.h-*]                        <div class="h-card"><img alt="Jane Doe" src="jane.jpeg"/></div>
+                .h-x>object[data]:only-of-type:not[.h-*]                    <div class="h-card"><object data="jane.jpeg"/>Jane Doe</object></div>
+                .h-x>:only-child>img[src]:only-of-type:not[.h-*]            <div class="h-card"><span><img alt="Jane Doe" src="jane.jpeg"/></span></div>
+                .h-x>:only-child>object[data]:only-of-type:not[.h-*]        <div class="h-card"><span><object data="jane.jpeg"/>Jane Doe</object></span></div>
+            */
+            var value;
+            if(!uf.properties.photo) {
+                value = this.getImpliedProperty(node, ['img', 'object'], this.getPhotoAttr);
+                if(value) {
+                    // relative to absolute URL
+                    if(value && value !== '' && this.options.baseUrl !== '' && value.indexOf('://') === -1) {
+                        value = modules.url.resolve(value, this.options.baseUrl);
+                    }
+                    uf.properties.photo = [modules.utils.trim(value)];
+                }
+            }
+            return uf;
+        };
+
+
+        /**
+         * apply implied URL rule
+         *
+         * @param  {DOM Node} node
+         * @param  {Object} uf
+         * @return {Object}
+         */
+        modules.Parser.prototype.impliedUrl = function(node, uf) {
+            // implied URL rule
+            /*
+                a.h-x[href]                             <a class="h-card" href="glenn.html">Glenn</a>
+                area.h-x[href]                          <area class="h-card" href="glenn.html">Glenn</area>
+                .h-x>a[href]:only-of-type:not[.h-*]     <div class="h-card" ><a href="glenn.html">Glenn</a><p>...</p></div>
+                .h-x>area[href]:only-of-type:not[.h-*]  <div class="h-card" ><area href="glenn.html">Glenn</area><p>...</p></div>
+            */
+            var value;
+            if(!uf.properties.url) {
+                value = this.getImpliedProperty(node, ['a', 'area'], this.getURLAttr);
+                if(value) {
+                    // relative to absolute URL
+                    if(value && value !== '' && this.options.baseUrl !== '' && value.indexOf('://') === -1) {
+                        value = modules.url.resolve(value, this.options.baseUrl);
+                    }
+                    uf.properties.url = [modules.utils.trim(value)];
+                }
+            }
+            return uf;
+        };
+
+
+        /**
+         * apply implied date rule - if there is a time only property try to concat it with any date property
+         *
+         * @param  {DOM Node} node
+         * @param  {Object} uf
+         * @return {Object}
+         */
+        modules.Parser.prototype.impliedDate = function(uf) {
+            // implied date rule
+            // http://microformats.org/wiki/value-class-pattern#microformats2_parsers
+            // http://microformats.org/wiki/microformats2-parsing-issues#implied_date_for_dt_properties_both_mf2_and_backcompat
+            var newDate;
+            if(uf.times.length > 0 && uf.dates.length > 0) {
+                newDate = modules.dates.dateTimeUnion(uf.dates[0][1], uf.times[0][1], this.options.dateFormat);
+                uf.properties[this.removePropPrefix(uf.times[0][0])][0] = newDate.toString(this.options.dateFormat);
+            }
+            // clean-up object
+            delete uf.times;
+            delete uf.dates;
+            return uf;
+        };
+
+
+        /**
+         * get an implied property value from pre-defined tag/attriubte combinations
+         *
+         * @param  {DOM Node} node
+         * @param  {String} tagList (Array of tags from which an implied value can be pulled)
+         * @param  {String} getAttrFunction (Function which can extract implied value)
+         * @return {String || null}
+         */
+        modules.Parser.prototype.getImpliedProperty = function(node, tagList, getAttrFunction) {
+            // i.e. img.h-card
+            var value = getAttrFunction(node),
+                descendant,
+                child;
+
+            if(!value) {
+                // i.e. .h-card>img:only-of-type:not(.h-card)
+                descendant = modules.domUtils.getSingleDescendantOfType( node, tagList);
+                if(descendant && this.hasHClass(descendant) === false){
+                    value = getAttrFunction(descendant);
+                }
+                if(node.children.length > 0 ){
+                    // i.e.  .h-card>:only-child>img:only-of-type:not(.h-card)
+                    child = modules.domUtils.getSingleDescendant(node);
+                    if(child && this.hasHClass(child) === false){
+                        descendant = modules.domUtils.getSingleDescendantOfType(child, tagList);
+                        if(descendant && this.hasHClass(descendant) === false){
+                            value = getAttrFunction(descendant);
+                        }
+                    }
+                }
+            }
+
+            return value;
+        };
+
+
+        /**
+         * get an implied name value from a node
+         *
+         * @param  {DOM Node} node
+         * @return {String || null}
+         */
+        modules.Parser.prototype.getNameAttr = function(node) {
+            var value = modules.domUtils.getAttrValFromTagList(node, ['img','area'], 'alt');
+            if(!value) {
+                value = modules.domUtils.getAttrValFromTagList(node, ['abbr'], 'title');
+            }
+            return value;
+        };
+
+
+        /**
+         * get an implied photo value from a node
+         *
+         * @param  {DOM Node} node
+         * @return {String || null}
+         */
+        modules.Parser.prototype.getPhotoAttr = function(node) {
+            var value = modules.domUtils.getAttrValFromTagList(node, ['img'], 'src');
+            if(!value && modules.domUtils.hasAttributeValue(node, 'class', 'include') === false) {
+                value = modules.domUtils.getAttrValFromTagList(node, ['object'], 'data');
+            }
+            return value;
+        };
+
+
+        /**
+         * get an implied photo value from a node
+         *
+         * @param  {DOM Node} node
+         * @return {String || null}
+         */
+        modules.Parser.prototype.getURLAttr = function(node) {
+            var value = null;
+            if(modules.domUtils.hasAttributeValue(node, 'class', 'include') === false){
+
+                value = modules.domUtils.getAttrValFromTagList(node, ['a'], 'href');
+                if(!value) {
+                    value = modules.domUtils.getAttrValFromTagList(node, ['area'], 'href');
+                }
+
+            }
+            return value;
+        };
+
+
+        /**
+         *
+         *
+         * @param  {DOM Node} node
+         * @param  {Object} uf
+         * @return {Object}
+         */
+        modules.Parser.prototype.impliedValue = function(node, uf, parentClasses){
+
+            // intersection of implied name and implied value rules
+            if(uf.properties.name) {
+                if(uf.value && parentClasses.root.length > 0 && parentClasses.properties.length === 1){
+                    uf = this.getAltValue(uf, parentClasses.properties[0][0], 'p-name', uf.properties.name[0]);
+                }
+            }
+
+            // intersection of implied URL and implied value rules
+            if(uf.properties.url) {
+                if(parentClasses && parentClasses.root.length === 1 && parentClasses.properties.length === 1){
+                    uf = this.getAltValue(uf, parentClasses.properties[0][0], 'u-url', uf.properties.url[0]);
+                }
+            }
+
+            // apply alt value
+            if(uf.altValue !== null){
+                uf.value = uf.altValue.value;
+            }
+            delete uf.altValue;
+
+
+            return uf;
+        };
+
+
+        /**
+         * get alt value based on rules about parent property prefix
+         *
+         * @param  {Object} uf
+         * @param  {String} parentPropertyName
+         * @param  {String} propertyName
+         * @param  {String} value
+         * @return {Object}
+         */
+        modules.Parser.prototype.getAltValue = function(uf, parentPropertyName, propertyName, value){
+            if(uf.value && !uf.altValue){
+                // first p-name of the h-* child
+                if(modules.utils.startWith(parentPropertyName,'p-') && propertyName === 'p-name'){
+                    uf.altValue = {name: propertyName, value: value};
+                }
+                // if it's an e-* property element
+                if(modules.utils.startWith(parentPropertyName,'e-') && modules.utils.startWith(propertyName,'e-')){
+                    uf.altValue = {name: propertyName, value: value};
+                }
+                // if it's an u-* property element
+                if(modules.utils.startWith(parentPropertyName,'u-') && propertyName === 'u-url'){
+                    uf.altValue = {name: propertyName, value: value};
+                }
+            }
+            return uf;
+        };
+
+
+        /**
+         * if a h-feed does not have a title use the title tag of a page
+         *
+         * @param  {Object} uf
+         * @return {Object}
+         */
+        modules.Parser.prototype.impliedhFeedTitle = function( uf ){
+            if(uf.type && uf.type.indexOf('h-feed') > -1){
+                // has no name property
+                if(uf.properties.name === undefined || uf.properties.name[0] === '' ){
+                    // use the text from the title tag
+                    var title = modules.domUtils.querySelector(this.document, 'title');
+                    if(title){
+                        uf.properties.name = [modules.domUtils.textContent(title)];
+                    }
+                }
+            }
+            return uf;
+        };
+
+
+
+        /**
+         * implied Geo from pattern <abbr class="p-geo" title="37.386013;-122.082932">
+         *
+         * @param  {Object} uf
+         * @return {Object}
+         */
+        modules.Parser.prototype.impliedGeo = function( uf ){
+            var geoPair,
+                parts,
+                longitude,
+                latitude,
+                valid = true;
+
+            if(uf.type && uf.type.indexOf('h-geo') > -1){
+
+                // has no latitude or longitude property
+                if(uf.properties.latitude === undefined || uf.properties.longitude === undefined ){
+
+                    geoPair = (uf.properties.name)? uf.properties.name[0] : null;
+                    geoPair = (!geoPair && uf.properties.value)? uf.properties.value : geoPair;
+
+                    if(geoPair){
+                        // allow for the use of a ';' as in microformats and also ',' as in Geo URL
+                        geoPair = geoPair.replace(';',',');
+
+                        // has sep char
+                        if(geoPair.indexOf(',') > -1 ){
+                            parts = geoPair.split(',');
+
+                            // only correct if we have two or more parts
+                            if(parts.length > 1){
+
+                                // latitude no value outside the range -90 or 90
+                                latitude = parseFloat( parts[0] );
+                                if(modules.utils.isNumber(latitude) && latitude > 90 || latitude < -90){
+                                    valid = false;
+                                }
+
+                                // longitude no value outside the range -180 to 180
+                                longitude = parseFloat( parts[1] );
+                                if(modules.utils.isNumber(longitude) && longitude > 180 || longitude < -180){
+                                    valid = false;
+                                }
+
+                                if(valid){
+                                    uf.properties.latitude = [latitude];
+                                    uf.properties.longitude  = [longitude];
+                                }
+                            }
+
+                        }
+                    }
+                }
+            }
+            return uf;
+        };
+
+
+        /**
+         * if a backwards compat built structure has no properties add name through this.impliedName
+         *
+         * @param  {Object} uf
+         * @return {Object}
+         */
+        modules.Parser.prototype.impliedBackwardComp = function(node, uf, parentClasses){
+
+            // look for pattern in parent classes like "p-geo h-geo"
+            // these are structures built from backwards compat parsing of geo
+            if(parentClasses.root.length === 1 && parentClasses.properties.length === 1) {
+                if(parentClasses.root[0].replace('h-','') === this.removePropPrefix(parentClasses.properties[0][0])) {
+
+                    // if microformat has no properties apply the impliedName rule to get value from containing node
+                    // this will get value from html such as <abbr class="geo" title="30.267991;-97.739568">Brighton</abbr>
+                    if( modules.utils.hasProperties(uf.properties) === false ){
+                        uf = this.impliedName( node, uf );
+                    }
+                }
+            }
+
+            return uf;
+        };
+
+
+
+    }
+
+
+    // check parser module is loaded
+    if(modules.Parser){
+
+
+        /**
+         * appends clones of include Nodes into the DOM structure
+         *
+         * @param  {DOM node} rootNode
+         */
+        modules.Parser.prototype.addIncludes = function(rootNode) {
+            this.addAttributeIncludes(rootNode, 'itemref');
+            this.addAttributeIncludes(rootNode, 'headers');
+            this.addClassIncludes(rootNode);
+        };
+
+
+        /**
+         * appends clones of include Nodes into the DOM structure for attribute based includes
+         *
+         * @param  {DOM node} rootNode
+         * @param  {String} attributeName
+         */
+        modules.Parser.prototype.addAttributeIncludes = function(rootNode, attributeName) {
+            var arr,
+                idList,
+                i,
+                x,
+                z,
+                y;
+
+            arr = modules.domUtils.getNodesByAttribute(rootNode, attributeName);
+            x = 0;
+            i = arr.length;
+            while(x < i) {
+                idList = modules.domUtils.getAttributeList(arr[x], attributeName);
+                if(idList) {
+                    z = 0;
+                    y = idList.length;
+                    while(z < y) {
+                        this.apppendInclude(arr[x], idList[z]);
+                        z++;
+                    }
+                }
+                x++;
+            }
+        };
+
+
+        /**
+         * appends clones of include Nodes into the DOM structure for class based includes
+         *
+         * @param  {DOM node} rootNode
+         */
+        modules.Parser.prototype.addClassIncludes = function(rootNode) {
+            var id,
+                arr,
+                x = 0,
+                i;
+
+            arr = modules.domUtils.getNodesByAttributeValue(rootNode, 'class', 'include');
+            i = arr.length;
+            while(x < i) {
+                id = modules.domUtils.getAttrValFromTagList(arr[x], ['a'], 'href');
+                if(!id) {
+                    id = modules.domUtils.getAttrValFromTagList(arr[x], ['object'], 'data');
+                }
+                this.apppendInclude(arr[x], id);
+                x++;
+            }
+        };
+
+
+        /**
+         * appends a clone of an include into another Node using Id
+         *
+         * @param  {DOM node} rootNode
+         * @param  {Stringe} id
+         */
+        modules.Parser.prototype.apppendInclude = function(node, id){
+            var include,
+                clone;
+
+            id = modules.utils.trim(id.replace('#', ''));
+            include = modules.domUtils.getElementById(this.document, id);
+            if(include) {
+                clone = modules.domUtils.clone(include);
+                this.markIncludeChildren(clone);
+                modules.domUtils.appendChild(node, clone);
+            }
+        };
+
+
+        /**
+         * adds an attribute marker to all the child microformat roots
+         *
+         * @param  {DOM node} rootNode
+         */
+        modules.Parser.prototype.markIncludeChildren = function(rootNode) {
+            var arr,
+                x,
+                i;
+
+            // loop the array and add the attribute
+            arr = this.findRootNodes(rootNode);
+            x = 0;
+            i = arr.length;
+            modules.domUtils.setAttribute(rootNode, 'data-include', 'true');
+            modules.domUtils.setAttribute(rootNode, 'style', 'display:none');
+            while(x < i) {
+                modules.domUtils.setAttribute(arr[x], 'data-include', 'true');
+                x++;
+            }
+        };
+
+
+        /**
+         * removes all appended include clones from DOM
+         *
+         * @param  {DOM node} rootNode
+         */
+        modules.Parser.prototype.removeIncludes = function(rootNode){
+            var arr,
+                i;
+
+            // remove all the items that were added as includes
+            arr = modules.domUtils.getNodesByAttribute(rootNode, 'data-include');
+            i = arr.length;
+            while(i--) {
+                modules.domUtils.removeChild(rootNode,arr[i]);
+            }
+        };
+
+
+    }
+
+
+    // check parser module is loaded
+    if(modules.Parser){
+
+        /**
+         * finds rel=* structures
+         *
+         * @param  {DOM node} rootNode
+         * @return {Object}
+         */
+        modules.Parser.prototype.findRels = function(rootNode) {
+            var out = {
+                    'items': [],
+                    'rels': {},
+                    'rel-urls': {}
+                },
+                x,
+                i,
+                y,
+                z,
+                relList,
+                items,
+                item,
+                value,
+                arr;
+
+            arr = modules.domUtils.getNodesByAttribute(rootNode, 'rel');
+            x = 0;
+            i = arr.length;
+            while(x < i) {
+                relList = modules.domUtils.getAttribute(arr[x], 'rel');
+
+                if(relList) {
+                    items = relList.split(' ');
+
+
+                    // add rels
+                    z = 0;
+                    y = items.length;
+                    while(z < y) {
+                        item = modules.utils.trim(items[z]);
+
+                        // get rel value
+                        value = modules.domUtils.getAttrValFromTagList(arr[x], ['a', 'area'], 'href');
+                        if(!value) {
+                            value = modules.domUtils.getAttrValFromTagList(arr[x], ['link'], 'href');
+                        }
+
+                        // create the key
+                        if(!out.rels[item]) {
+                            out.rels[item] = [];
+                        }
+
+                        if(typeof this.options.baseUrl === 'string' && typeof value === 'string') {
+
+                            var resolved = modules.url.resolve(value, this.options.baseUrl);
+                            // do not add duplicate rels - based on resolved URLs
+                            if(out.rels[item].indexOf(resolved) === -1){
+                                out.rels[item].push( resolved );
+                            }
+                        }
+                        z++;
+                    }
+
+
+                    var url = null;
+                    if(modules.domUtils.hasAttribute(arr[x], 'href')){
+                        url = modules.domUtils.getAttribute(arr[x], 'href');
+                        if(url){
+                            url = modules.url.resolve(url, this.options.baseUrl );
+                        }
+                    }
+
+
+                    // add to rel-urls
+                    var relUrl = this.getRelProperties(arr[x]);
+                    relUrl.rels = items;
+                    // // do not add duplicate rel-urls - based on resolved URLs
+                    if(url && out['rel-urls'][url] === undefined){
+                        out['rel-urls'][url] = relUrl;
+                    }
+
+
+                }
+                x++;
+            }
+            return out;
+        };
+
+
+        /**
+         * gets the properties of a rel=*
+         *
+         * @param  {DOM node} node
+         * @return {Object}
+         */
+        modules.Parser.prototype.getRelProperties = function(node){
+            var obj = {};
+
+            if(modules.domUtils.hasAttribute(node, 'media')){
+                obj.media = modules.domUtils.getAttribute(node, 'media');
+            }
+            if(modules.domUtils.hasAttribute(node, 'type')){
+                obj.type = modules.domUtils.getAttribute(node, 'type');
+            }
+            if(modules.domUtils.hasAttribute(node, 'hreflang')){
+                obj.hreflang = modules.domUtils.getAttribute(node, 'hreflang');
+            }
+            if(modules.domUtils.hasAttribute(node, 'title')){
+                obj.title = modules.domUtils.getAttribute(node, 'title');
+            }
+            if(modules.utils.trim(this.getPValue(node, false)) !== ''){
+                obj.text = this.getPValue(node, false);
+            }
+
+            return obj;
+        };
+
+
+        /**
+         * finds any alt rel=* mappings for a given node/microformat
+         *
+         * @param  {DOM node} node
+         * @param  {String} ufName
+         * @return {String || undefined}
+         */
+        modules.Parser.prototype.findRelImpied = function(node, ufName) {
+            var out,
+                map,
+                i;
+
+            map = this.getMapping(ufName);
+            if(map) {
+                for(var key in map.properties) {
+                    if (map.properties.hasOwnProperty(key)) {
+                        var prop = map.properties[key],
+                            propName = (prop.map) ? prop.map : 'p-' + key,
+                            relCount = 0;
+
+                        // is property an alt rel=* mapping
+                        if(prop.relAlt && modules.domUtils.hasAttribute(node, 'rel')) {
+                            i = prop.relAlt.length;
+                            while(i--) {
+                                if(modules.domUtils.hasAttributeValue(node, 'rel', prop.relAlt[i])) {
+                                    relCount++;
+                                }
+                            }
+                            if(relCount === prop.relAlt.length) {
+                                out = propName;
+                            }
+                        }
+                    }
+                }
+            }
+            return out;
+        };
+
+
+        /**
+         * returns whether a node or its children has rel=* microformat
+         *
+         * @param  {DOM node} node
+         * @return {Boolean}
+         */
+        modules.Parser.prototype.hasRel = function(node) {
+            return (this.countRels(node) > 0);
+        };
+
+
+        /**
+         * returns the number of rel=* microformats
+         *
+         * @param  {DOM node} node
+         * @return {Int}
+         */
+        modules.Parser.prototype.countRels = function(node) {
+            if(node){
+                return modules.domUtils.getNodesByAttribute(node, 'rel').length;
+            }
+            return 0;
+        };
+
+
+
+    }
+
+
+    modules.utils = {
+
+        /**
+         * is the object a string
+         *
+         * @param  {Object} obj
+         * @return {Boolean}
+         */
+        isString: function( obj ) {
+            return typeof( obj ) === 'string';
+        },
+
+        /**
+         * is the object a number
+         *
+         * @param  {Object} obj
+         * @return {Boolean}
+         */
+        isNumber: function( obj ) {
+            return !isNaN(parseFloat( obj )) && isFinite( obj );
+        },
+
+
+        /**
+         * is the object an array
+         *
+         * @param  {Object} obj
+         * @return {Boolean}
+         */
+        isArray: function( obj ) {
+            return obj && !( obj.propertyIsEnumerable( 'length' ) ) && typeof obj === 'object' && typeof obj.length === 'number';
+        },
+
+
+        /**
+         * is the object a function
+         *
+         * @param  {Object} obj
+         * @return {Boolean}
+         */
+        isFunction: function(obj) {
+            return !!(obj && obj.constructor && obj.call && obj.apply);
+        },
+
+
+        /**
+         * does the text start with a test string
+         *
+         * @param  {String} text
+         * @param  {String} test
+         * @return {Boolean}
+         */
+        startWith: function( text, test ) {
+            return(text.indexOf(test) === 0);
+        },
+
+
+        /**
+         * removes spaces at front and back of text
+         *
+         * @param  {String} text
+         * @return {String}
+         */
+        trim: function( text ) {
+            if(text && this.isString(text)){
+                return (text.trim())? text.trim() : text.replace(/^\s+|\s+$/g, '');
+            }else{
+                return '';
+            }
+        },
+
+
+        /**
+         * replaces a character in text
+         *
+         * @param  {String} text
+         * @param  {Int} index
+         * @param  {String} character
+         * @return {String}
+         */
+        replaceCharAt: function( text, index, character ) {
+            if(text && text.length > index){
+               return text.substr(0, index) + character + text.substr(index+character.length);
+            }else{
+                return text;
+            }
+        },
+
+
+        /**
+         * removes whitespace, tabs and returns from start and end of text
+         *
+         * @param  {String} text
+         * @return {String}
+         */
+        trimWhitespace: function( text ){
+            if(text && text.length){
+                var i = text.length,
+                    x = 0;
+
+                // turn all whitespace chars at end into spaces
+                while (i--) {
+                    if(this.isOnlyWhiteSpace(text[i])){
+                        text = this.replaceCharAt( text, i, ' ' );
+                    }else{
+                        break;
+                    }
+                }
+
+                // turn all whitespace chars at start into spaces
+                i = text.length;
+                while (x < i) {
+                    if(this.isOnlyWhiteSpace(text[x])){
+                        text = this.replaceCharAt( text, i, ' ' );
+                    }else{
+                        break;
+                    }
+                    x++;
+                }
+            }
+            return this.trim(text);
+        },
+
+
+        /**
+         * does text only contain whitespace characters
+         *
+         * @param  {String} text
+         * @return {Boolean}
+         */
+        isOnlyWhiteSpace: function( text ){
+            return !(/[^\t\n\r ]/.test( text ));
+        },
+
+
+        /**
+         * removes whitespace from text (leaves a single space)
+         *
+         * @param  {String} text
+         * @return {Sring}
+         */
+        collapseWhiteSpace: function( text ){
+            return text.replace(/[\t\n\r ]+/g, ' ');
+        },
+
+
+        /**
+         * does an object have any of its own properties
+         *
+         * @param  {Object} obj
+         * @return {Boolean}
+         */
+        hasProperties: function( obj ) {
+            var key;
+            for(key in obj) {
+                if( obj.hasOwnProperty( key ) ) {
+                    return true;
+                }
+            }
+            return false;
+        },
+
+
+        /**
+         * a sort function - to sort objects in an array by a given property
+         *
+         * @param  {String} property
+         * @param  {Boolean} reverse
+         * @return {Int}
+         */
+        sortObjects: function(property, reverse) {
+            reverse = (reverse) ? -1 : 1;
+            return function (a, b) {
+                a = a[property];
+                b = b[property];
+                if (a < b) {
+                    return reverse * -1;
+                }
+                if (a > b) {
+                    return reverse * 1;
+                }
+                return 0;
+            };
+        }
+
+    };
+
+
+    modules.domUtils = {
+
+        // blank objects for DOM
+        document: null,
+        rootNode: null,
+
+
+         /**
+         * gets DOMParser object
+         *
          * @return {Object || undefined}
-		 */
+         */
         getDOMParser: function () {
             if (typeof DOMParser === "undefined") {
                 try {
                     return Components.classes["@mozilla.org/xmlextras/domparser;1"]
                         .createInstance(Components.interfaces.nsIDOMParser);
                 } catch (e) {
                     return undefined;
                 }
             } else {
                 return new DOMParser();
             }
         },
 
 
-	     /**
-		 * configures what are the base DOM objects for parsing
-		 *
-		 * @param  {Object} options
-		 * @return {DOM Node} node
-		 */
-		getDOMContext: function( options ){
-
-			// if a node is passed
-			if(options.node){
-				this.rootNode = options.node;
-			}
-
-
-			// if a html string is passed
-			if(options.html){
-				//var domParser = new DOMParser();
+         /**
+         * configures what are the base DOM objects for parsing
+         *
+         * @param  {Object} options
+         * @return {DOM Node} node
+         */
+        getDOMContext: function( options ){
+
+            // if a node is passed
+            if(options.node){
+                this.rootNode = options.node;
+            }
+
+
+            // if a html string is passed
+            if(options.html){
+                //var domParser = new DOMParser();
                 var domParser = this.getDOMParser();
-       			this.rootNode = domParser.parseFromString( options.html, 'text/html' );
-			}
-
-
-			// find top level document from rootnode
-			if(this.rootNode !== null){
-				if(this.rootNode.nodeType === 9){
-					this.document = this.rootNode;
-					this.rootNode = modules.domUtils.querySelector(this.rootNode, 'html');
-				}else{
-					// if it's DOM node get parent DOM Document
-					this.document = modules.domUtils.ownerDocument(this.rootNode);
-				}
-			}
-
-
-			// use global document object
-			if(!this.rootNode && document){
-				this.rootNode = modules.domUtils.querySelector(document, 'html');
-				this.document = document;
-			}
-
-
-			if(this.rootNode && this.document){
-				return {document: this.document, rootNode: this.rootNode};
-			}
-
-			return {document: null, rootNode: null};
-		},
-
-
-
-		/**
-		* gets the first DOM node
-		*
-		* @param  {Dom Document}
-		* @return {DOM Node} node
-		*/
-		getTopMostNode: function( node ){
-			//var doc = this.ownerDocument(node);
-			//if(doc && doc.nodeType && doc.nodeType === 9 && doc.documentElement){
-			//	return doc.documentElement;
-			//}
-			return node;
-		},
-
-
-
-		 /**
-		 * abstracts DOM ownerDocument
-		 *
-		 * @param  {DOM Node} node
-		 * @return {Dom Document}
-		 */
-		ownerDocument: function(node){
-			return node.ownerDocument;
-		},
-
-
-		/**
-		 * abstracts DOM textContent
-		 *
-		 * @param  {DOM Node} node
-		 * @return {String}
-		 */
-		textContent: function(node){
-			if(node.textContent){
-				return node.textContent;
-			}else if(node.innerText){
-				return node.innerText;
-			}
-			return '';
-		},
-
-
-		/**
-		 * abstracts DOM innerHTML
-		 *
-		 * @param  {DOM Node} node
-		 * @return {String}
-		 */
-		innerHTML: function(node){
-			return node.innerHTML;
-		},
-
-
-		/**
-		 * abstracts DOM hasAttribute
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @return {Boolean}
-		 */
-		hasAttribute: function(node, attributeName) {
-			return node.hasAttribute(attributeName);
-		},
-
-
-		/**
-		 * does an attribute contain a value
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @param  {String} value
-		 * @return {Boolean}
-		 */
-		hasAttributeValue: function(node, attributeName, value) {
-			return (this.getAttributeList(node, attributeName).indexOf(value) > -1);
-		},
-
-
-		/**
-		 * abstracts DOM getAttribute
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @return {String || null}
-		 */
-		getAttribute: function(node, attributeName) {
-			return node.getAttribute(attributeName);
-		},
-
-
-		/**
-		 * abstracts DOM setAttribute
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @param  {String} attributeValue
-		 */
-		setAttribute: function(node, attributeName, attributeValue){
-			node.setAttribute(attributeName, attributeValue);
-		},
-
-
-		/**
-		 * abstracts DOM removeAttribute
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 */
-		removeAttribute: function(node, attributeName) {
-			node.removeAttribute(attributeName);
-		},
-
-
-		/**
-		 * abstracts DOM getElementById
-		 *
-		 * @param  {DOM Node || DOM Document} node
-		 * @param  {String} id
-		 * @return {DOM Node}
-		 */
-		getElementById: function(docNode, id) {
-			return docNode.querySelector( '#' + id );
-		},
-
-
-		/**
-		 * abstracts DOM querySelector
-		 *
-		 * @param  {DOM Node || DOM Document} node
-		 * @param  {String} selector
-		 * @return {DOM Node}
-		 */
-		querySelector: function(docNode, selector) {
-			return docNode.querySelector( selector );
-		},
-
-
-		/**
-		 * get value of a Node attribute as an array
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @return {Array}
-		 */
-		getAttributeList: function(node, attributeName) {
-			var out = [],
-				attList;
-
-			attList = node.getAttribute(attributeName);
-			if(attList && attList !== '') {
-				if(attList.indexOf(' ') > -1) {
-					out = attList.split(' ');
-				} else {
-					out.push(attList);
-				}
-			}
-			return out;
-		},
-
-
-		/**
-		 * gets all child nodes with a given attribute
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @return {NodeList}
-		 */
-		getNodesByAttribute: function(node, attributeName) {
-			var selector = '[' + attributeName + ']';
-			return node.querySelectorAll(selector);
-		},
-
-
-		/**
-		 * gets all child nodes with a given attribute containing a given value
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @return {DOM NodeList}
-		 */
-		getNodesByAttributeValue: function(rootNode, name, value) {
-			var arr = [],
-				x = 0,
-				i,
-				out = [];
-
-			arr = this.getNodesByAttribute(rootNode, name);
-			if(arr) {
-				i = arr.length;
-				while(x < i) {
-					if(this.hasAttributeValue(arr[x], name, value)) {
-						out.push(arr[x]);
-					}
-					x++;
-				}
-			}
-			return out;
-		},
-
-
-		/**
-		 * gets attribute value from controlled list of tags
-		 *
-		 * @param  {Array} tagNames
-		 * @param  {String} attributeName
-		 * @return {String || null}
-		 */
-		getAttrValFromTagList: function(node, tagNames, attributeName) {
-			var i = tagNames.length;
-
-			while(i--) {
-				if(node.tagName.toLowerCase() === tagNames[i]) {
-					var attrValue = this.getAttribute(node, attributeName);
-					if(attrValue && attrValue !== '') {
-						return attrValue;
-					}
-				}
-			}
-			return null;
-		},
-
-
-	   /**
-		 * get node if it has no siblings. CSS equivalent is :only-child
-		 *
-		 * @param  {DOM Node} rootNode
-		 * @param  {Array} tagNames
-		 * @return {DOM Node || null}
-		 */
-		getSingleDescendant: function(node){
-			return this.getDescendant( node, null, false );
-		},
+                this.rootNode = domParser.parseFromString( options.html, 'text/html' );
+            }
+
+
+            // find top level document from rootnode
+            if(this.rootNode !== null){
+                if(this.rootNode.nodeType === 9){
+                    this.document = this.rootNode;
+                    this.rootNode = modules.domUtils.querySelector(this.rootNode, 'html');
+                }else{
+                    // if it's DOM node get parent DOM Document
+                    this.document = modules.domUtils.ownerDocument(this.rootNode);
+                }
+            }
+
+
+            // use global document object
+            if(!this.rootNode && document){
+                this.rootNode = modules.domUtils.querySelector(document, 'html');
+                this.document = document;
+            }
+
+
+            if(this.rootNode && this.document){
+                return {document: this.document, rootNode: this.rootNode};
+            }
+
+            return {document: null, rootNode: null};
+        },
+
+
+
+        /**
+        * gets the first DOM node
+        *
+        * @param  {Dom Document}
+        * @return {DOM Node} node
+        */
+        getTopMostNode: function( node ){
+            //var doc = this.ownerDocument(node);
+            //if(doc && doc.nodeType && doc.nodeType === 9 && doc.documentElement){
+            //  return doc.documentElement;
+            //}
+            return node;
+        },
+
+
+
+         /**
+         * abstracts DOM ownerDocument
+         *
+         * @param  {DOM Node} node
+         * @return {Dom Document}
+         */
+        ownerDocument: function(node){
+            return node.ownerDocument;
+        },
+
+
+        /**
+         * abstracts DOM textContent
+         *
+         * @param  {DOM Node} node
+         * @return {String}
+         */
+        textContent: function(node){
+            if(node.textContent){
+                return node.textContent;
+            }else if(node.innerText){
+                return node.innerText;
+            }
+            return '';
+        },
+
+
+        /**
+         * abstracts DOM innerHTML
+         *
+         * @param  {DOM Node} node
+         * @return {String}
+         */
+        innerHTML: function(node){
+            return node.innerHTML;
+        },
+
+
+        /**
+         * abstracts DOM hasAttribute
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @return {Boolean}
+         */
+        hasAttribute: function(node, attributeName) {
+            return node.hasAttribute(attributeName);
+        },
+
+
+        /**
+         * does an attribute contain a value
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @param  {String} value
+         * @return {Boolean}
+         */
+        hasAttributeValue: function(node, attributeName, value) {
+            return (this.getAttributeList(node, attributeName).indexOf(value) > -1);
+        },
+
+
+        /**
+         * abstracts DOM getAttribute
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @return {String || null}
+         */
+        getAttribute: function(node, attributeName) {
+            return node.getAttribute(attributeName);
+        },
+
+
+        /**
+         * abstracts DOM setAttribute
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @param  {String} attributeValue
+         */
+        setAttribute: function(node, attributeName, attributeValue){
+            node.setAttribute(attributeName, attributeValue);
+        },
+
+
+        /**
+         * abstracts DOM removeAttribute
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         */
+        removeAttribute: function(node, attributeName) {
+            node.removeAttribute(attributeName);
+        },
+
+
+        /**
+         * abstracts DOM getElementById
+         *
+         * @param  {DOM Node || DOM Document} node
+         * @param  {String} id
+         * @return {DOM Node}
+         */
+        getElementById: function(docNode, id) {
+            return docNode.querySelector( '#' + id );
+        },
+
+
+        /**
+         * abstracts DOM querySelector
+         *
+         * @param  {DOM Node || DOM Document} node
+         * @param  {String} selector
+         * @return {DOM Node}
+         */
+        querySelector: function(docNode, selector) {
+            return docNode.querySelector( selector );
+        },
+
+
+        /**
+         * get value of a Node attribute as an array
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @return {Array}
+         */
+        getAttributeList: function(node, attributeName) {
+            var out = [],
+                attList;
+
+            attList = node.getAttribute(attributeName);
+            if(attList && attList !== '') {
+                if(attList.indexOf(' ') > -1) {
+                    out = attList.split(' ');
+                } else {
+                    out.push(attList);
+                }
+            }
+            return out;
+        },
+
+
+        /**
+         * gets all child nodes with a given attribute
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @return {NodeList}
+         */
+        getNodesByAttribute: function(node, attributeName) {
+            var selector = '[' + attributeName + ']';
+            return node.querySelectorAll(selector);
+        },
+
+
+        /**
+         * gets all child nodes with a given attribute containing a given value
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @return {DOM NodeList}
+         */
+        getNodesByAttributeValue: function(rootNode, name, value) {
+            var arr = [],
+                x = 0,
+                i,
+                out = [];
+
+            arr = this.getNodesByAttribute(rootNode, name);
+            if(arr) {
+                i = arr.length;
+                while(x < i) {
+                    if(this.hasAttributeValue(arr[x], name, value)) {
+                        out.push(arr[x]);
+                    }
+                    x++;
+                }
+            }
+            return out;
+        },
+
+
+        /**
+         * gets attribute value from controlled list of tags
+         *
+         * @param  {Array} tagNames
+         * @param  {String} attributeName
+         * @return {String || null}
+         */
+        getAttrValFromTagList: function(node, tagNames, attributeName) {
+            var i = tagNames.length;
+
+            while(i--) {
+                if(node.tagName.toLowerCase() === tagNames[i]) {
+                    var attrValue = this.getAttribute(node, attributeName);
+                    if(attrValue && attrValue !== '') {
+                        return attrValue;
+                    }
+                }
+            }
+            return null;
+        },
+
+
+       /**
+         * get node if it has no siblings. CSS equivalent is :only-child
+         *
+         * @param  {DOM Node} rootNode
+         * @param  {Array} tagNames
+         * @return {DOM Node || null}
+         */
+        getSingleDescendant: function(node){
+            return this.getDescendant( node, null, false );
+        },
 
 
         /**
-		 * get node if it has no siblings of the same type. CSS equivalent is :only-of-type
-		 *
-		 * @param  {DOM Node} rootNode
-		 * @param  {Array} tagNames
-		 * @return {DOM Node || null}
-		 */
-		getSingleDescendantOfType: function(node, tagNames){
-			return this.getDescendant( node, tagNames, true );
-		},
-
-
-	    /**
-		 * get child node limited by presence of siblings - either CSS :only-of-type or :only-child
-		 *
-		 * @param  {DOM Node} rootNode
-		 * @param  {Array} tagNames
-		 * @return {DOM Node || null}
-		 */
-		getDescendant: function( node, tagNames, onlyOfType ){
-			var i = node.children.length,
-				countAll = 0,
-				countOfType = 0,
-				child,
-				out = null;
-
-			while(i--) {
-				child = node.children[i];
-				if(child.nodeType === 1) {
-					if(tagNames){
-						// count just only-of-type
-						if(this.hasTagName(child, tagNames)){
-							out = child;
-							countOfType++;
-						}
-					}else{
-						// count all elements
-						out = child;
-						countAll++;
-					}
-				}
-			}
-			if(onlyOfType === true){
-				return (countOfType === 1)? out : null;
-			}else{
-				return (countAll === 1)? out : null;
-			}
-		},
-
-
-	   /**
-		 * is a node one of a list of tags
-		 *
-		 * @param  {DOM Node} rootNode
-		 * @param  {Array} tagNames
-		 * @return {Boolean}
-		 */
-		hasTagName: function(node, tagNames){
-			var i = tagNames.length;
-			while(i--) {
-				if(node.tagName.toLowerCase() === tagNames[i]) {
-					return true;
-				}
-			}
-			return false;
-		},
-
-
-	   /**
-		 * abstracts DOM appendChild
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {DOM Node} childNode
-		 * @return {DOM Node}
-		 */
-		appendChild: function(node, childNode){
-			return node.appendChild(childNode);
-		},
-
-
-	   /**
-		 * abstracts DOM removeChild
-		 *
-		 * @param  {DOM Node} childNode
-		 * @return {DOM Node || null}
-		 */
-		removeChild: function(childNode){
-			if (childNode.parentNode) {
-				return childNode.parentNode.removeChild(childNode);
-			}else{
-				return null;
-			}
-		},
-
-
-		/**
-		 * abstracts DOM cloneNode
-		 *
-		 * @param  {DOM Node} node
-		 * @return {DOM Node}
-		 */
-		clone: function(node) {
-			var newNode = node.cloneNode(true);
-			newNode.removeAttribute('id');
-			return newNode;
-		},
-
-
-		/**
-		 * gets the text of a node
-		 *
-		 * @param  {DOM Node} node
-		 * @return {String}
-		 */
-		getElementText: function( node ){
-			if(node && node.data){
-				return node.data;
-			}else{
-				return '';
-			}
-		},
-
-
-		/**
-		 * gets the attributes of a node - ordered by sequence in html
-		 *
-		 * @param  {DOM Node} node
-		 * @return {Array}
-		 */
-		getOrderedAttributes: function( node ){
-			var nodeStr = node.outerHTML,
-				attrs = [];
-
-			for (var i = 0; i < node.attributes.length; i++) {
-				var attr = node.attributes[i];
-					attr.indexNum = nodeStr.indexOf(attr.name);
-
-				attrs.push( attr );
-			}
-			return attrs.sort( modules.utils.sortObjects( 'indexNum' ) );
-		},
-
-
-		/**
-		 * decodes html entities in given text
-		 *
-		 * @param  {DOM Document} doc
-		 * @param  String} text
-		 * @return {String}
-		 */
-		decodeEntities: function( doc, text ){
-			//return text;
-			return doc.createTextNode( text ).nodeValue;
-		},
-
-
-		/**
-		 * clones a DOM document
-		 *
-		 * @param  {DOM Document} document
-		 * @return {DOM Document}
-		 */
-		cloneDocument: function( document ){
-			var newNode,
-				newDocument = null;
-
-			if( this.canCloneDocument( document )){
-				newDocument = document.implementation.createHTMLDocument('');
-				newNode = newDocument.importNode( document.documentElement, true );
-				newDocument.replaceChild(newNode, newDocument.querySelector('html'));
-			}
-			return (newNode && newNode.nodeType && newNode.nodeType === 1)? newDocument : document;
-		},
-
-
-		/**
-		 * can environment clone a DOM document
-		 *
-		 * @param  {DOM Document} document
-		 * @return {Boolean}
-		 */
-		canCloneDocument: function( document ){
-			return (document && document.importNode && document.implementation && document.implementation.createHTMLDocument);
-		},
-
-
-		/**
-		 * get the child index of a node. Used to create a node path
-		 *
-		 *   @param  {DOM Node} node
-		 *   @return {Int}
-		 */
-		getChildIndex: function (node) {
-		  	var parent = node.parentNode,
-		  		i = -1,
-		  		child;
-	  		while (parent && (child = parent.childNodes[++i])){
-				 if (child === node){
-					 return i;
-				 }
-			}
-	  		return -1;
-		},
-
-
-		/**
-		 * get a node's path
-		 *
-		 *   @param  {DOM Node} node
-		 *   @return {Array}
-		 */
-		getNodePath: function  (node) {
-		  	var parent = node.parentNode,
-			  	path = [],
-			  	index = this.getChildIndex(node);
-
-		  if(parent && (path = this.getNodePath(parent))){
-			   if(index > -1){
-				   path.push(index);
-			   }
-		  }
-		  return path;
-		},
-
-
-		/**
-		 * get a node from a path.
-		 *
-		 *   @param  {DOM document} document
-		 *   @param  {Array} path
-		 *   @return {DOM Node}
-		 */
-		getNodeByPath: function (document, path) {
-		  	var node = document.documentElement,
-		  		i = 0,
-		  		index;
-		  while ((index = path[++i]) > -1){
-			  node = node.childNodes[index];
-		  }
-		  return node;
-		},
-
-
-		/**
-		* get an array/nodeList of child nodes
-		*
-		*   @param  {DOM node} node
-		*   @return {Array}
-		*/
-		getChildren: function( node ){
-			return node.children;
-		},
-
-
-		/**
-		* create a node
-		*
-		*   @param  {String} tagName
-		*   @return {DOM node}
-		*/
-		createNode: function( tagName ){
-			return this.document.createElement(tagName);
-		},
-
-
-		/**
-		* create a node with text content
-		*
-		*   @param  {String} tagName
-		*   @param  {String} text
-		*   @return {DOM node}
-		*/
-		createNodeWithText: function( tagName, text ){
-			var node = this.document.createElement(tagName);
-			node.innerHTML = text;
-			return node;
-		}
-
-
-
-	};
-
-
-	modules.url = {
-
-
-		/**
-		 * creates DOM objects needed to resolve URLs
-		 */
+         * get node if it has no siblings of the same type. CSS equivalent is :only-of-type
+         *
+         * @param  {DOM Node} rootNode
+         * @param  {Array} tagNames
+         * @return {DOM Node || null}
+         */
+        getSingleDescendantOfType: function(node, tagNames){
+            return this.getDescendant( node, tagNames, true );
+        },
+
+
+        /**
+         * get child node limited by presence of siblings - either CSS :only-of-type or :only-child
+         *
+         * @param  {DOM Node} rootNode
+         * @param  {Array} tagNames
+         * @return {DOM Node || null}
+         */
+        getDescendant: function( node, tagNames, onlyOfType ){
+            var i = node.children.length,
+                countAll = 0,
+                countOfType = 0,
+                child,
+                out = null;
+
+            while(i--) {
+                child = node.children[i];
+                if(child.nodeType === 1) {
+                    if(tagNames){
+                        // count just only-of-type
+                        if(this.hasTagName(child, tagNames)){
+                            out = child;
+                            countOfType++;
+                        }
+                    }else{
+                        // count all elements
+                        out = child;
+                        countAll++;
+                    }
+                }
+            }
+            if(onlyOfType === true){
+                return (countOfType === 1)? out : null;
+            }else{
+                return (countAll === 1)? out : null;
+            }
+        },
+
+
+       /**
+         * is a node one of a list of tags
+         *
+         * @param  {DOM Node} rootNode
+         * @param  {Array} tagNames
+         * @return {Boolean}
+         */
+        hasTagName: function(node, tagNames){
+            var i = tagNames.length;
+            while(i--) {
+                if(node.tagName.toLowerCase() === tagNames[i]) {
+                    return true;
+                }
+            }
+            return false;
+        },
+
+
+       /**
+         * abstracts DOM appendChild
+         *
+         * @param  {DOM Node} node
+         * @param  {DOM Node} childNode
+         * @return {DOM Node}
+         */
+        appendChild: function(node, childNode){
+            return node.appendChild(childNode);
+        },
+
+
+       /**
+         * abstracts DOM removeChild
+         *
+         * @param  {DOM Node} childNode
+         * @return {DOM Node || null}
+         */
+        removeChild: function(childNode){
+            if (childNode.parentNode) {
+                return childNode.parentNode.removeChild(childNode);
+            }else{
+                return null;
+            }
+        },
+
+
+        /**
+         * abstracts DOM cloneNode
+         *
+         * @param  {DOM Node} node
+         * @return {DOM Node}
+         */
+        clone: function(node) {
+            var newNode = node.cloneNode(true);
+            newNode.removeAttribute('id');
+            return newNode;
+        },
+
+
+        /**
+         * gets the text of a node
+         *
+         * @param  {DOM Node} node
+         * @return {String}
+         */
+        getElementText: function( node ){
+            if(node && node.data){
+                return node.data;
+            }else{
+                return '';
+            }
+        },
+
+
+        /**
+         * gets the attributes of a node - ordered by sequence in html
+         *
+         * @param  {DOM Node} node
+         * @return {Array}
+         */
+        getOrderedAttributes: function( node ){
+            var nodeStr = node.outerHTML,
+                attrs = [];
+
+            for (var i = 0; i < node.attributes.length; i++) {
+                var attr = node.attributes[i];
+                    attr.indexNum = nodeStr.indexOf(attr.name);
+
+                attrs.push( attr );
+            }
+            return attrs.sort( modules.utils.sortObjects( 'indexNum' ) );
+        },
+
+
+        /**
+         * decodes html entities in given text
+         *
+         * @param  {DOM Document} doc
+         * @param  String} text
+         * @return {String}
+         */
+        decodeEntities: function( doc, text ){
+            //return text;
+            return doc.createTextNode( text ).nodeValue;
+        },
+
+
+        /**
+         * clones a DOM document
+         *
+         * @param  {DOM Document} document
+         * @return {DOM Document}
+         */
+        cloneDocument: function( document ){
+            var newNode,
+                newDocument = null;
+
+            if( this.canCloneDocument( document )){
+                newDocument = document.implementation.createHTMLDocument('');
+                newNode = newDocument.importNode( document.documentElement, true );
+                newDocument.replaceChild(newNode, newDocument.querySelector('html'));
+            }
+            return (newNode && newNode.nodeType && newNode.nodeType === 1)? newDocument : document;
+        },
+
+
+        /**
+         * can environment clone a DOM document
+         *
+         * @param  {DOM Document} document
+         * @return {Boolean}
+         */
+        canCloneDocument: function( document ){
+            return (document && document.importNode && document.implementation && document.implementation.createHTMLDocument);
+        },
+
+
+        /**
+         * get the child index of a node. Used to create a node path
+         *
+         *   @param  {DOM Node} node
+         *   @return {Int}
+         */
+        getChildIndex: function (node) {
+            var parent = node.parentNode,
+                i = -1,
+                child;
+            while (parent && (child = parent.childNodes[++i])){
+                 if (child === node){
+                     return i;
+                 }
+            }
+            return -1;
+        },
+
+
+        /**
+         * get a node's path
+         *
+         *   @param  {DOM Node} node
+         *   @return {Array}
+         */
+        getNodePath: function  (node) {
+            var parent = node.parentNode,
+                path = [],
+                index = this.getChildIndex(node);
+
+          if(parent && (path = this.getNodePath(parent))){
+               if(index > -1){
+                   path.push(index);
+               }
+          }
+          return path;
+        },
+
+
+        /**
+         * get a node from a path.
+         *
+         *   @param  {DOM document} document
+         *   @param  {Array} path
+         *   @return {DOM Node}
+         */
+        getNodeByPath: function (document, path) {
+            var node = document.documentElement,
+                i = 0,
+                index;
+          while ((index = path[++i]) > -1){
+              node = node.childNodes[index];
+          }
+          return node;
+        },
+
+
+        /**
+        * get an array/nodeList of child nodes
+        *
+        *   @param  {DOM node} node
+        *   @return {Array}
+        */
+        getChildren: function( node ){
+            return node.children;
+        },
+
+
+        /**
+        * create a node
+        *
+        *   @param  {String} tagName
+        *   @return {DOM node}
+        */
+        createNode: function( tagName ){
+            return this.document.createElement(tagName);
+        },
+
+
+        /**
+        * create a node with text content
+        *
+        *   @param  {String} tagName
+        *   @param  {String} text
+        *   @return {DOM node}
+        */
+        createNodeWithText: function( tagName, text ){
+            var node = this.document.createElement(tagName);
+            node.innerHTML = text;
+            return node;
+        }
+
+
+
+    };
+
+
+    modules.url = {
+
+
+        /**
+         * creates DOM objects needed to resolve URLs
+         */
         init: function(){
             //this._domParser = new DOMParser();
             this._domParser = modules.domUtils.getDOMParser();
             // do not use a head tag it does not work with IE9
             this._html = '<base id="base" href=""></base><a id="link" href=""></a>';
             this._nodes = this._domParser.parseFromString( this._html, 'text/html' );
             this._baseNode =  modules.domUtils.getElementById(this._nodes,'base');
             this._linkNode =  modules.domUtils.getElementById(this._nodes,'link');
         },
 
 
-		/**
-		 * resolves url to absolute version using baseUrl
-		 *
-		 * @param  {String} url
-		 * @param  {String} baseUrl
-		 * @return {String}
-		 */
-		resolve: function(url, baseUrl) {
-			// use modern URL web API where we can
-			if(modules.utils.isString(url) && modules.utils.isString(baseUrl) && url.indexOf('://') === -1){
-				// this try catch is required as IE has an URL object but no constuctor support
-				// http://glennjones.net/articles/the-problem-with-window-url
-				try {
-					var resolved = new URL(url, baseUrl).toString();
-					// deal with early Webkit not throwing an error - for Safari
-					if(resolved === '[object URL]'){
-						resolved = URI.resolve(baseUrl, url);
-					}
-					return resolved;
-				}catch(e){
+        /**
+         * resolves url to absolute version using baseUrl
+         *
+         * @param  {String} url
+         * @param  {String} baseUrl
+         * @return {String}
+         */
+        resolve: function(url, baseUrl) {
+            // use modern URL web API where we can
+            if(modules.utils.isString(url) && modules.utils.isString(baseUrl) && url.indexOf('://') === -1){
+                // this try catch is required as IE has an URL object but no constuctor support
+                // http://glennjones.net/articles/the-problem-with-window-url
+                try {
+                    var resolved = new URL(url, baseUrl).toString();
+                    // deal with early Webkit not throwing an error - for Safari
+                    if(resolved === '[object URL]'){
+                        resolved = URI.resolve(baseUrl, url);
+                    }
+                    return resolved;
+                }catch(e){
                     // otherwise fallback to DOM
                     if(this._domParser === undefined){
                         this.init();
                     }
 
                     // do not use setAttribute it does not work with IE9
                     this._baseNode.href = baseUrl;
                     this._linkNode.href = url;
 
                     // dont use getAttribute as it returns orginal value not resolved
                     return this._linkNode.href;
-				}
-			}else{
-				if(modules.utils.isString(url)){
-					return url;
-				}
-				return '';
-			}
-		},
-
-	};
-
-
-	/**
-	 * constructor
-	 * parses text to find just the date element of an ISO date/time string i.e. 2008-05-01
-	 *
-	 * @param  {String} dateString
-	 * @param  {String} format
-	 * @return {String}
-	 */
-	modules.ISODate = function ( dateString, format ) {
-		this.clear();
-
-		this.format = (format)? format : 'auto'; // auto or W3C or RFC3339 or HTML5
-		this.setFormatSep();
-
-		// optional should be full iso date/time string
-		if(arguments[0]) {
-			this.parse(dateString, format);
-		}
-	};
-
-
-	modules.ISODate.prototype = {
-
-
-		/**
-		 * clear all states
-		 *
-		 */
-		clear: function(){
-			this.clearDate();
-			this.clearTime();
-			this.clearTimeZone();
-			this.setAutoProfileState();
-		},
-
-
-		/**
-		 * clear date states
-		 *
-		 */
-		clearDate: function(){
-			this.dY = -1;
-			this.dM = -1;
-			this.dD = -1;
-			this.dDDD = -1;
-		},
-
-
-		/**
-		 * clear time states
-		 *
-		 */
-		clearTime: function(){
-			this.tH = -1;
-			this.tM = -1;
-			this.tS = -1;
-			this.tD = -1;
-		},
-
-
-		/**
-		 * clear timezone states
-		 *
-		 */
-		clearTimeZone: function(){
-			this.tzH = -1;
-			this.tzM = -1;
-			this.tzPN = '+';
-			this.z = false;
-		},
-
-
-		/**
-		 * resets the auto profile state
-		 *
-		 */
-		setAutoProfileState: function(){
-			this.autoProfile = {
-			   sep: 'T',
-			   dsep: '-',
-			   tsep: ':',
-			   tzsep: ':',
-			   tzZulu: 'Z'
-			};
-		},
-
-
-		/**
-		 * parses text to find ISO date/time string i.e. 2008-05-01T15:45:19Z
-		 *
-		 * @param  {String} dateString
-		 * @param  {String} format
-		 * @return {String}
-		 */
-		parse: function( dateString, format ) {
-			this.clear();
-
-			var parts = [],
-				tzArray = [],
-				position = 0,
-				datePart = '',
-				timePart = '',
-				timeZonePart = '';
-
-			if(format){
-				this.format = format;
-			}
-
-
-
-			// discover date time separtor for auto profile
-			// Set to 'T' by default
-			if(dateString.indexOf('t') > -1) {
-				this.autoProfile.sep = 't';
-			}
-			if(dateString.indexOf('z') > -1) {
-				this.autoProfile.tzZulu = 'z';
-			}
-			if(dateString.indexOf('Z') > -1) {
-				this.autoProfile.tzZulu = 'Z';
-			}
-			if(dateString.toUpperCase().indexOf('T') === -1) {
-				this.autoProfile.sep = ' ';
-			}
-
-
-			dateString = dateString.toUpperCase().replace(' ','T');
-
-			// break on 'T' divider or space
-			if(dateString.indexOf('T') > -1) {
-				parts = dateString.split('T');
-				datePart = parts[0];
-				timePart = parts[1];
-
-				// zulu UTC
-				if(timePart.indexOf( 'Z' ) > -1) {
-					this.z = true;
-				}
-
-				// timezone
-				if(timePart.indexOf( '+' ) > -1 || timePart.indexOf( '-' ) > -1) {
-					tzArray = timePart.split( 'Z' ); // incase of incorrect use of Z
-					timePart = tzArray[0];
-					timeZonePart = tzArray[1];
-
-					// timezone
-					if(timePart.indexOf( '+' ) > -1 || timePart.indexOf( '-' ) > -1) {
-						position = 0;
-
-						if(timePart.indexOf( '+' ) > -1) {
-							position = timePart.indexOf( '+' );
-						} else {
-							position = timePart.indexOf( '-' );
-						}
-
-						timeZonePart = timePart.substring( position, timePart.length );
-						timePart = timePart.substring( 0, position );
-					}
-				}
-
-			} else {
-				datePart = dateString;
-			}
-
-			if(datePart !== '') {
-				this.parseDate( datePart );
-				if(timePart !== '') {
-					this.parseTime( timePart );
-					if(timeZonePart !== '') {
-						this.parseTimeZone( timeZonePart );
-					}
-				}
-			}
-			return this.toString( format );
-		},
-
-
-		/**
-		 * parses text to find just the date element of an ISO date/time string i.e. 2008-05-01
-		 *
-		 * @param  {String} dateString
-		 * @param  {String} format
-		 * @return {String}
-		 */
-		parseDate: function( dateString, format ) {
-			this.clearDate();
-
-			var parts = [];
-
-			// discover timezone separtor for auto profile // default is ':'
-			if(dateString.indexOf('-') === -1) {
-				this.autoProfile.tsep = '';
-			}
-
-			// YYYY-DDD
-			parts = dateString.match( /(\d\d\d\d)-(\d\d\d)/ );
-			if(parts) {
-				if(parts[1]) {
-					this.dY = parts[1];
-				}
-				if(parts[2]) {
-					this.dDDD = parts[2];
-				}
-			}
-
-			if(this.dDDD === -1) {
-				// YYYY-MM-DD ie 2008-05-01 and YYYYMMDD ie 20080501
-				parts = dateString.match( /(\d\d\d\d)?-?(\d\d)?-?(\d\d)?/ );
-				if(parts[1]) {
-					this.dY = parts[1];
-				}
-				if(parts[2]) {
-					this.dM = parts[2];
-				}
-				if(parts[3]) {
-					this.dD = parts[3];
-				}
-			}
-			return this.toString(format);
-		},
-
-
-		/**
-		 * parses text to find just the time element of an ISO date/time string i.e. 13:30:45
-		 *
-		 * @param  {String} timeString
-		 * @param  {String} format
-		 * @return {String}
-		 */
-		parseTime: function( timeString, format ) {
-			this.clearTime();
-			var parts = [];
-
-			// discover date separtor for auto profile // default is ':'
-			if(timeString.indexOf(':') === -1) {
-				this.autoProfile.tsep = '';
-			}
-
-			// finds timezone HH:MM:SS and HHMMSS  ie 13:30:45, 133045 and 13:30:45.0135
-			parts = timeString.match( /(\d\d)?:?(\d\d)?:?(\d\d)?.?([0-9]+)?/ );
-			if(parts[1]) {
-				this.tH = parts[1];
-			}
-			if(parts[2]) {
-				this.tM = parts[2];
-			}
-			if(parts[3]) {
-				this.tS = parts[3];
-			}
-			if(parts[4]) {
-				this.tD = parts[4];
-			}
-			return this.toTimeString(format);
-		},
-
-
-		/**
-		 * parses text to find just the time element of an ISO date/time string i.e. +08:00
-		 *
-		 * @param  {String} timeString
-		 * @param  {String} format
-		 * @return {String}
-		 */
-		parseTimeZone: function( timeString, format ) {
-			this.clearTimeZone();
-			var parts = [];
-
-			if(timeString.toLowerCase() === 'z'){
-				this.z = true;
-				// set case for z
-				this.autoProfile.tzZulu = (timeString === 'z')? 'z' : 'Z';
-			}else{
-
-				// discover timezone separtor for auto profile // default is ':'
-				if(timeString.indexOf(':') === -1) {
-					this.autoProfile.tzsep = '';
-				}
-
-				// finds timezone +HH:MM and +HHMM  ie +13:30 and +1330
-				parts = timeString.match( /([\-\+]{1})?(\d\d)?:?(\d\d)?/ );
-				if(parts[1]) {
-					this.tzPN = parts[1];
-				}
-				if(parts[2]) {
-					this.tzH = parts[2];
-				}
-				if(parts[3]) {
-					this.tzM = parts[3];
-				}
-
-
-			}
-			this.tzZulu = 'z';
-			return this.toTimeString( format );
-		},
-
-
-		/**
-		 * returns ISO date/time string in W3C Note, RFC 3339, HTML5, or auto profile
-		 *
-		 * @param  {String} format
-		 * @return {String}
-		 */
-		toString: function( format ) {
-			var output = '';
-
-			if(format){
-				this.format = format;
-			}
-			this.setFormatSep();
-
-			if(this.dY  > -1) {
-				output = this.dY;
-				if(this.dM > 0 && this.dM < 13) {
-					output += this.dsep + this.dM;
-					if(this.dD > 0 && this.dD < 32) {
-						output += this.dsep + this.dD;
-						if(this.tH > -1 && this.tH < 25) {
-							output += this.sep + this.toTimeString( format );
-						}
-					}
-				}
-				if(this.dDDD > -1) {
-					output += this.dsep + this.dDDD;
-				}
-			} else if(this.tH > -1) {
-				output += this.toTimeString( format );
-			}
-
-			return output;
-		},
-
-
-		/**
-		 * returns just the time string element of an ISO date/time
-		 * in W3C Note, RFC 3339, HTML5, or auto profile
-		 *
-		 * @param  {String} format
-		 * @return {String}
-		 */
-		toTimeString: function( format ) {
-			var out = '';
-
-			if(format){
-				this.format = format;
-			}
-			this.setFormatSep();
-
-			// time can only be created with a full date
-			if(this.tH) {
-				if(this.tH > -1 && this.tH < 25) {
-					out += this.tH;
-					if(this.tM > -1 && this.tM < 61){
-						out += this.tsep + this.tM;
-						if(this.tS > -1 && this.tS < 61){
-							out += this.tsep + this.tS;
-							if(this.tD > -1){
-								out += '.' + this.tD;
-							}
-						}
-					}
-
-
-
-					// time zone offset
-					if(this.z) {
-						out += this.tzZulu;
-					} else {
-						if(this.tzH && this.tzH > -1 && this.tzH < 25) {
-							out += this.tzPN + this.tzH;
-							if(this.tzM > -1 && this.tzM < 61){
-								out += this.tzsep + this.tzM;
-							}
-						}
-					}
-				}
-			}
-			return out;
-		},
-
-
-		/**
-		 * set the current profile to W3C Note, RFC 3339, HTML5, or auto profile
-		 *
-		 */
-		setFormatSep: function() {
-			switch( this.format.toLowerCase() ) {
-				case 'rfc3339':
-					this.sep = 'T';
-					this.dsep = '';
-					this.tsep = '';
-					this.tzsep = '';
-					this.tzZulu = 'Z';
-					break;
-				case 'w3c':
-					this.sep = 'T';
-					this.dsep = '-';
-					this.tsep = ':';
-					this.tzsep = ':';
-					this.tzZulu = 'Z';
-					break;
-				case 'html5':
-					this.sep = ' ';
-					this.dsep = '-';
-					this.tsep = ':';
-					this.tzsep = ':';
-					this.tzZulu = 'Z';
-					break;
-				default:
-					// auto - defined by format of input string
-					this.sep = this.autoProfile.sep;
-					this.dsep = this.autoProfile.dsep;
-					this.tsep = this.autoProfile.tsep;
-					this.tzsep = this.autoProfile.tzsep;
-					this.tzZulu = this.autoProfile.tzZulu;
-			}
-		},
-
-
-		/**
-		 * does current data contain a full date i.e. 2015-03-23
-		 *
-		 * @return {Boolean}
-		 */
-		hasFullDate: function() {
-			return(this.dY !== -1 && this.dM !== -1 && this.dD !== -1);
-		},
-
-
-		/**
-		 * does current data contain a minimum date which is just a year number i.e. 2015
-		 *
-		 * @return {Boolean}
-		 */
-		hasDate: function() {
-			return(this.dY !== -1);
-		},
-
-
-		/**
-		 * does current data contain a minimum time which is just a hour number i.e. 13
-		 *
-		 * @return {Boolean}
-		 */
-		hasTime: function() {
-			return(this.tH !== -1);
-		},
-
-		/**
-		 * does current data contain a minimum timezone i.e. -1 || +1 || z
-		 *
-		 * @return {Boolean}
-		 */
-		hasTimeZone: function() {
-			return(this.tzH !== -1);
-		}
-
-	};
-
-	modules.ISODate.prototype.constructor = modules.ISODate;
-
-
-	modules.dates = {
-
-
-		/**
-		 * does text contain am
-		 *
-		 * @param  {String} text
-		 * @return {Boolean}
-		 */
-		hasAM: function( text ) {
-			text = text.toLowerCase();
-			return(text.indexOf('am') > -1 || text.indexOf('a.m.') > -1);
-		},
-
-
-		/**
-		 * does text contain pm
-		 *
-		 * @param  {String} text
-		 * @return {Boolean}
-		 */
-		hasPM: function( text ) {
-			text = text.toLowerCase();
-			return(text.indexOf('pm') > -1 || text.indexOf('p.m.') > -1);
-		},
-
-
-		/**
-		 * remove am and pm from text and return it
-		 *
-		 * @param  {String} text
-		 * @return {String}
-		 */
-		removeAMPM: function( text ) {
-			return text.replace('pm', '').replace('p.m.', '').replace('am', '').replace('a.m.', '');
-		},
-
-
-	   /**
-		 * simple test of whether ISO date string is a duration  i.e.  PY17M or PW12
-		 *
-		 * @param  {String} text
-		 * @return {Boolean}
-		 */
-		isDuration: function( text ) {
-			if(modules.utils.isString( text )){
-				text = text.toLowerCase();
-				if(modules.utils.startWith(text, 'p') ){
-					return true;
-				}
-			}
-			return false;
-		},
-
-
-	   /**
-		 * is text a time or timezone
-		 * i.e. HH-MM-SS or z+-HH-MM-SS 08:43 | 15:23:00:0567 | 10:34pm | 10:34 p.m. | +01:00:00 | -02:00 | z15:00 | 0843
-		 *
-		 * @param  {String} text
-		 * @return {Boolean}
-		 */
-		isTime: function( text ) {
-			if(modules.utils.isString(text)){
-				text = text.toLowerCase();
-				text = modules.utils.trim( text );
-				// start with timezone char
-				if( text.match(':') && ( modules.utils.startWith(text, 'z') || modules.utils.startWith(text, '-')  || modules.utils.startWith(text, '+') )) {
-					return true;
-				}
-				// has ante meridiem or post meridiem
-				if( text.match(/^[0-9]/) &&
-					( this.hasAM(text) || this.hasPM(text) )) {
-					return true;
-				}
-				// contains time delimiter but not datetime delimiter
-				if( text.match(':') && !text.match(/t|\s/) ) {
-					return true;
-				}
-
-				// if it's a number of 2, 4 or 6 chars
-				if(modules.utils.isNumber(text)){
-					if(text.length === 2 || text.length === 4 || text.length === 6){
-						return true;
-					}
-				}
-			}
-			return false;
-		},
-
-
-		/**
-		 * parses a time from text and returns 24hr time string
-		 * i.e. 5:34am = 05:34:00 and 1:52:04p.m. = 13:52:04
-		 *
-		 * @param  {String} text
-		 * @return {String}
-		 */
-		parseAmPmTime: function( text ) {
-			var out = text,
-				times = [];
-
-			// if the string has a text : or am or pm
-			if(modules.utils.isString(out)) {
-				//text = text.toLowerCase();
-				text = text.replace(/[ ]+/g, '');
-
-				if(text.match(':') || this.hasAM(text) || this.hasPM(text)) {
-
-					if(text.match(':')) {
-						times = text.split(':');
-					} else {
-						// single number text i.e. 5pm
-						times[0] = text;
-						times[0] = this.removeAMPM(times[0]);
-					}
-
-					// change pm hours to 24hr number
-					if(this.hasPM(text)) {
-						if(times[0] < 12) {
-							times[0] = parseInt(times[0], 10) + 12;
-						}
-					}
-
-					// add leading zero's where needed
-					if(times[0] && times[0].length === 1) {
-						times[0] = '0' + times[0];
-					}
-
-					// rejoin text elements together
-					if(times[0]) {
-						text = times.join(':');
-					}
-				}
-			}
-
-			// remove am/pm strings
-			return this.removeAMPM(text);
-		},
-
-
-	   /**
-		 * overlays a time on a date to return the union of the two
-		 *
-		 * @param  {String} date
-		 * @param  {String} time
-		 * @param  {String} format ( Modules.ISODate profile format )
-		 * @return {Object} Modules.ISODate
-		 */
-		dateTimeUnion: function(date, time, format) {
-			var isodate = new modules.ISODate(date, format),
-				isotime = new modules.ISODate();
-
-			isotime.parseTime(this.parseAmPmTime(time), format);
-			if(isodate.hasFullDate() && isotime.hasTime()) {
-				isodate.tH = isotime.tH;
-				isodate.tM = isotime.tM;
-				isodate.tS = isotime.tS;
-				isodate.tD = isotime.tD;
-				return isodate;
-			} else {
-				if(isodate.hasFullDate()){
-					return isodate;
-				}
-				return new modules.ISODate();
-			}
-		},
-
-
-	   /**
-		 * concatenate an array of date and time text fragments to create an ISODate object
-		 * used for microformat value and value-title rules
-		 *
-		 * @param  {Array} arr ( Array of Strings )
-		 * @param  {String} format ( Modules.ISODate profile format )
-		 * @return {Object} Modules.ISODate
-		 */
-		concatFragments: function (arr, format) {
-			var out = new modules.ISODate(),
-				i = 0,
-				value = '';
-
-			// if the fragment already contains a full date just return it once
-			if(arr[0].toUpperCase().match('T')) {
-				return new modules.ISODate(arr[0], format);
-			}else{
-				for(i = 0; i < arr.length; i++) {
-				value = arr[i];
-
-				// date pattern
-				if( value.charAt(4) === '-' && out.hasFullDate() === false ){
-					out.parseDate(value);
-				}
-
-				// time pattern
-				if( (value.indexOf(':') > -1 || modules.utils.isNumber( this.parseAmPmTime(value) )) && out.hasTime() === false ) {
-					// split time and timezone
-					var items = this.splitTimeAndZone(value);
-					value = items[0];
-
-					// parse any use of am/pm
-					value = this.parseAmPmTime(value);
-					out.parseTime(value);
-
-					// parse any timezone
-					if(items.length > 1){
-						 out.parseTimeZone(items[1], format);
-					}
-				}
-
-				// timezone pattern
-				if(value.charAt(0) === '-' || value.charAt(0) === '+' || value.toUpperCase() === 'Z') {
-					if( out.hasTimeZone() === false ){
-						out.parseTimeZone(value);
-					}
-				}
-
-			}
-			return out;
-
-			}
-		},
-
-
-	   /**
-		 * parses text by splitting it into an array of time and timezone strings
-		 *
-		 * @param  {String} text
-		 * @return {Array} Modules.ISODate
-		 */
-		splitTimeAndZone: function ( text ){
-		   var out = [text],
-			   chars = ['-','+','z','Z'],
-			   i = chars.length;
-
-			while (i--) {
-			  if(text.indexOf(chars[i]) > -1){
-				  out[0] = text.slice( 0, text.indexOf(chars[i]) );
-				  out.push( text.slice( text.indexOf(chars[i]) ) );
-				  break;
-			   }
-			}
-		   return out;
-		}
-
-	};
-
-
-	modules.text = {
-
-		// normalised or whitespace or whitespacetrimmed
-		textFormat: 'whitespacetrimmed',
-
-		// block level tags, used to add line returns
-		blockLevelTags: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'hr', 'pre', 'table',
-			'address', 'article', 'aside', 'blockquote', 'caption', 'col', 'colgroup', 'dd', 'div',
-			'dt', 'dir', 'fieldset', 'figcaption', 'figure', 'footer', 'form',  'header', 'hgroup', 'hr',
-			'li', 'map', 'menu', 'nav', 'optgroup', 'option', 'section', 'tbody', 'testarea',
-			'tfoot', 'th', 'thead', 'tr', 'td', 'ul', 'ol', 'dl', 'details'],
-
-		// tags to exclude
-		excludeTags: ['noframe', 'noscript', 'template', 'script', 'style', 'frames', 'frameset'],
-
-
-		/**
-		 * parses the text from the DOM Node
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} textFormat
-		 * @return {String}
-		 */
-		parse: function(doc, node, textFormat){
-			var out;
-			this.textFormat = (textFormat)? textFormat : this.textFormat;
-			if(this.textFormat === 'normalised'){
-				out = this.walkTreeForText( node );
-				if(out !== undefined){
-					return this.normalise( doc, out );
-				}else{
-					return '';
-				}
-			}else{
-			   return this.formatText( doc, modules.domUtils.textContent(node), this.textFormat );
-			}
-		},
-
-
-		/**
-		 * parses the text from a html string
-		 *
-		 * @param  {DOM Document} doc
-		 * @param  {String} text
-		 * @param  {String} textFormat
-		 * @return {String}
-		 */
-		parseText: function( doc, text, textFormat ){
-		   var node = modules.domUtils.createNodeWithText( 'div', text );
-		   return this.parse( doc, node, textFormat );
-		},
-
-
-		/**
-		 * parses the text from a html string - only for whitespace or whitespacetrimmed formats
-		 *
-		 * @param  {String} text
-		 * @param  {String} textFormat
-		 * @return {String}
-		 */
-		formatText: function( doc, text, textFormat ){
-		   this.textFormat = (textFormat)? textFormat : this.textFormat;
-		   if(text){
-			  var out = '',
-				  regex = /(<([^>]+)>)/ig;
-
-			  out = text.replace(regex, '');
-			  if(this.textFormat === 'whitespacetrimmed') {
-				 out = modules.utils.trimWhitespace( out );
-			  }
-
-			  //return entities.decode( out, 2 );
-			  return modules.domUtils.decodeEntities( doc, out );
-		   }else{
-			  return '';
-		   }
-		},
-
-
-		/**
-		 * normalises whitespace in given text
-		 *
-		 * @param  {String} text
-		 * @return {String}
-		 */
-		normalise: function( doc, text ){
-			text = text.replace( /&nbsp;/g, ' ') ;    // exchanges html entity for space into space char
-			text = modules.utils.collapseWhiteSpace( text );     // removes linefeeds, tabs and addtional spaces
-			text = modules.domUtils.decodeEntities( doc, text );  // decode HTML entities
-			text = text.replace( '–', '-' );          // correct dash decoding
-			return modules.utils.trim( text );
-		},
-
-
-		/**
-		 * walks DOM tree parsing the text from DOM Nodes
-		 *
-		 * @param  {DOM Node} node
-		 * @return {String}
-		 */
-		walkTreeForText: function( node ) {
-			var out = '',
-				j = 0;
-
-			if(node.tagName && this.excludeTags.indexOf( node.tagName.toLowerCase() ) > -1){
-				return out;
-			}
-
-			// if node is a text node get its text
-			if(node.nodeType && node.nodeType === 3){
-				out += modules.domUtils.getElementText( node );
-			}
-
-			// get the text of the child nodes
-			if(node.childNodes && node.childNodes.length > 0){
-				for (j = 0; j < node.childNodes.length; j++) {
-					var text = this.walkTreeForText( node.childNodes[j] );
-					if(text !== undefined){
-						out += text;
-					}
-				}
-			}
-
-			// if it's a block level tag add an additional space at the end
-			if(node.tagName && this.blockLevelTags.indexOf( node.tagName.toLowerCase() ) !== -1){
-				out += ' ';
-			}
-
-			return (out === '')? undefined : out ;
-		}
-
-	};
-
-
-	modules.html = {
-
-		// elements which are self-closing
-		selfClosingElt: ['area', 'base', 'br', 'col', 'hr', 'img', 'input', 'link', 'meta', 'param', 'command', 'keygen', 'source'],
-
-
-		/**
-		 * parse the html string from DOM Node
-		 *
-		 * @param  {DOM Node} node
-		 * @return {String}
-		 */
-		parse: function( node ){
-			var out = '',
-				j = 0;
-
-			// we do not want the outer container
-			if(node.childNodes && node.childNodes.length > 0){
-				for (j = 0; j < node.childNodes.length; j++) {
-					var text = this.walkTreeForHtml( node.childNodes[j] );
-					if(text !== undefined){
-						out += text;
-					}
-				}
-			}
-
-			return out;
-		},
-
-
-		/**
-		 * walks the DOM tree parsing the html string from the nodes
-		 *
-		 * @param  {DOM Document} doc
-		 * @param  {DOM Node} node
-		 * @return {String}
-		 */
-		walkTreeForHtml: function( node ) {
-			var out = '',
-				j = 0;
-
-			// if node is a text node get its text
-			if(node.nodeType && node.nodeType === 3){
-				out += modules.domUtils.getElementText( node );
-			}
-
-
-			// exclude text which has been added with include pattern  -
-			if(node.nodeType && node.nodeType === 1 && modules.domUtils.hasAttribute(node, 'data-include') === false){
-
-				// begin tag
-				out += '<' + node.tagName.toLowerCase();
-
-				// add attributes
-				var attrs = modules.domUtils.getOrderedAttributes(node);
-				for (j = 0; j < attrs.length; j++) {
-					out += ' ' + attrs[j].name +  '=' + '"' + attrs[j].value + '"';
-				}
-
-				if(this.selfClosingElt.indexOf(node.tagName.toLowerCase()) === -1){
-					out += '>';
-				}
-
-				// get the text of the child nodes
-				if(node.childNodes && node.childNodes.length > 0){
-
-					for (j = 0; j < node.childNodes.length; j++) {
-						var text = this.walkTreeForHtml( node.childNodes[j] );
-						if(text !== undefined){
-							out += text;
-						}
-					}
-				}
-
-				// end tag
-				if(this.selfClosingElt.indexOf(node.tagName.toLowerCase()) > -1){
-					out += ' />';
-				}else{
-					out += '</' + node.tagName.toLowerCase() + '>';
-				}
-			}
-
-			return (out === '')? undefined : out;
-		}
-
-
-	};
-
-
-	modules.maps['h-adr'] = {
-		root: 'adr',
-		name: 'h-adr',
-		properties: {
-			'post-office-box': {},
-			'street-address': {},
-			'extended-address': {},
-			'locality': {},
-			'region': {},
-			'postal-code': {},
-			'country-name': {}
-		}
-	};
-
-
-	modules.maps['h-card'] =  {
-		root: 'vcard',
-		name: 'h-card',
-		properties: {
-			'fn': {
-				'map': 'p-name'
-			},
-			'adr': {
-				'map': 'p-adr',
-				'uf': ['h-adr']
-			},
-			'agent': {
-				'uf': ['h-card']
-			},
-			'bday': {
-				'map': 'dt-bday'
-			},
-			'class': {},
-			'category': {
-				'map': 'p-category',
-				'relAlt': ['tag']
-			},
-			'email': {
-				'map': 'u-email'
-			},
-			'geo': {
-				'map': 'p-geo',
-				'uf': ['h-geo']
-			},
-			'key': {
-				'map': 'u-key'
-			},
-			'label': {},
-			'logo': {
-				'map': 'u-logo'
-			},
-			'mailer': {},
-			'honorific-prefix': {},
-			'given-name': {},
-			'additional-name': {},
-			'family-name': {},
-			'honorific-suffix': {},
-			'nickname': {},
-			'note': {}, // could be html i.e. e-note
-			'org': {},
-			'p-organization-name': {},
-			'p-organization-unit': {},
-			'photo': {
-				'map': 'u-photo'
-			},
-			'rev': {
-				'map': 'dt-rev'
-			},
-			'role': {},
-			'sequence': {},
-			'sort-string': {},
-			'sound': {
-				'map': 'u-sound'
-			},
-			'title': {
-				'map': 'p-job-title'
-			},
-			'tel': {},
-			'tz': {},
-			'uid': {
-				'map': 'u-uid'
-			},
-			'url': {
-				'map': 'u-url'
-			}
-		}
-	};
-
-
-	modules.maps['h-entry'] = {
-		root: 'hentry',
-		name: 'h-entry',
-		properties: {
-			'entry-title': {
-				'map': 'p-name'
-			},
-			'entry-summary': {
-				'map': 'p-summary'
-			},
-			'entry-content': {
-				'map': 'e-content'
-			},
-			'published': {
-				'map': 'dt-published'
-			},
-			'updated': {
-				'map': 'dt-updated'
-			},
-			'author': {
-				'uf': ['h-card']
-			},
-			'category': {
-				'map': 'p-category',
-				'relAlt': ['tag']
-			},
-			'geo': {
-				'map': 'p-geo',
-				'uf': ['h-geo']
-			},
-			'latitude': {},
-			'longitude': {},
-			'url': {
-				'map': 'u-url',
-				'relAlt': ['bookmark']
-			}
-		}
-	};
-
-
-	modules.maps['h-event'] = {
-		root: 'vevent',
-		name: 'h-event',
-		properties: {
-			'summary': {
-				'map': 'p-name'
-			},
-			'dtstart': {
-				'map': 'dt-start'
-			},
-			'dtend': {
-				'map': 'dt-end'
-			},
-			'description': {},
-			'url': {
-				'map': 'u-url'
-			},
-			'category': {
-				'map': 'p-category',
-				'relAlt': ['tag']
-			},
-			'location': {
-				'uf': ['h-card']
-			},
-			'geo': {
-				'uf': ['h-geo']
-			},
-			'latitude': {},
-			'longitude': {},
-			'duration': {
-				'map': 'dt-duration'
-			},
-			'contact': {
-				'uf': ['h-card']
-			},
-			'organizer': {
-				'uf': ['h-card']},
-			'attendee': {
-				'uf': ['h-card']},
-			'uid': {
-				'map': 'u-uid'
-			},
-			'attach': {
-				'map': 'u-attach'
-			},
-			'status': {},
-			'rdate': {},
-			'rrule': {}
-		}
-	};
-
-
-	modules.maps['h-feed'] = {
-		root: 'hfeed',
-		name: 'h-feed',
-		properties: {
-			'category': {
-				'map': 'p-category',
-				'relAlt': ['tag']
-			},
-			'summary': {
-				'map': 'p-summary'
-			},
-			'author': {
-				'uf': ['h-card']
-			},
-			'url': {
-				'map': 'u-url'
-			},
-			'photo': {
-				'map': 'u-photo'
-			},
-		}
-	};
-
-
-	modules.maps['h-geo'] = {
-		root: 'geo',
-		name: 'h-geo',
-		properties: {
-			'latitude': {},
-			'longitude': {}
-		}
-	};
-
-
-	modules.maps['h-item'] = {
-		root: 'item',
-		name: 'h-item',
-		subTree: false,
-		properties: {
-			'fn': {
-				'map': 'p-name'
-			},
-			'url': {
-				'map': 'u-url'
-			},
-			'photo': {
-				'map': 'u-photo'
-			}
-		}
-	};
-
-
-	modules.maps['h-listing'] = {
-			root: 'hlisting',
-			name: 'h-listing',
-			properties: {
-				'version': {},
-				'lister': {
-					'uf': ['h-card']
-				},
-				'dtlisted': {
-					'map': 'dt-listed'
-				},
-				'dtexpired': {
-					'map': 'dt-expired'
-				},
-				'location': {},
-				'price': {},
-				'item': {
-					'uf': ['h-card','a-adr','h-geo']
-				},
-				'summary': {
-					'map': 'p-name'
-				},
-				'description': {
-					'map': 'e-description'
-				},
-				'listing': {}
-			}
-		};
-
-
-	modules.maps['h-news'] = {
-			root: 'hnews',
-			name: 'h-news',
-			properties: {
-				'entry': {
-					'uf': ['h-entry']
-				},
-				'geo': {
-					'uf': ['h-geo']
-				},
-				'latitude': {},
-				'longitude': {},
-				'source-org': {
-					'uf': ['h-card']
-				},
-				'dateline': {
-					'uf': ['h-card']
-				},
-				'item-license': {
-					'map': 'u-item-license'
-				},
-				'principles': {
-					'map': 'u-principles',
-					'relAlt': ['principles']
-				}
-			}
-		};
-
-
-	modules.maps['h-org'] = {
-		root: 'h-x-org',  // drop this from v1 as it causes issue with fn org hcard pattern
-		name: 'h-org',
-		childStructure: true,
-		properties: {
-			'organization-name': {},
-			'organization-unit': {}
-		}
-	};
-
-
-	modules.maps['h-product'] = {
-			root: 'hproduct',
-			name: 'h-product',
-			properties: {
-				'brand': {
-					'uf': ['h-card']
-				},
-				'category': {
-					'map': 'p-category',
-					'relAlt': ['tag']
-				},
-				'price': {},
-				'description': {
-					'map': 'e-description'
-				},
-				'fn': {
-					'map': 'p-name'
-				},
-				'photo': {
-					'map': 'u-photo'
-				},
-				'url': {
-					'map': 'u-url'
-				},
-				'review': {
-					'uf': ['h-review', 'h-review-aggregate']
-				},
-				'listing': {
-					'uf': ['h-listing']
-				},
-				'identifier': {
-					'map': 'u-identifier'
-				}
-			}
-		};
-
-
-	modules.maps['h-recipe'] = {
-			root: 'hrecipe',
-			name: 'h-recipe',
-			properties: {
-				'fn': {
-					'map': 'p-name'
-				},
-				'ingredient': {
-					'map': 'e-ingredient'
-				},
-				'yield': {},
-				'instructions': {
-					'map': 'e-instructions'
-				},
-				'duration': {
-					'map': 'dt-duration'
-				},
-				'photo': {
-					'map': 'u-photo'
-				},
-				'summary': {},
-				'author': {
-					'uf': ['h-card']
-				},
-				'published': {
-					'map': 'dt-published'
-				},
-				'nutrition': {},
-				'category': {
-					'map': 'p-category',
-					'relAlt': ['tag']
-				},
-			}
-		};
-
-
-	modules.maps['h-resume'] = {
-		root: 'hresume',
-		name: 'h-resume',
-		properties: {
-			'summary': {},
-			'contact': {
-				'uf': ['h-card']
-			},
-			'education': {
-				'uf': ['h-card', 'h-event']
-			},
-			'experience': {
-				'uf': ['h-card', 'h-event']
-			},
-			'skill': {},
-			'affiliation': {
-				'uf': ['h-card']
-			}
-		}
-	};
-
-
-	modules.maps['h-review-aggregate'] = {
-		root: 'hreview-aggregate',
-		name: 'h-review-aggregate',
-		properties: {
-			'summary': {
-				'map': 'p-name'
-			},
-			'item': {
-				'map': 'p-item',
-				'uf': ['h-item', 'h-geo', 'h-adr', 'h-card', 'h-event', 'h-product']
-			},
-			'rating': {},
-			'average': {},
-			'best': {},
-			'worst': {},
-			'count': {},
-			'votes': {},
-			'category': {
-				'map': 'p-category',
-				'relAlt': ['tag']
-			},
-			'url': {
-				'map': 'u-url',
-				'relAlt': ['self', 'bookmark']
-			}
-		}
-	};
-
-
-	modules.maps['h-review'] = {
-		root: 'hreview',
-		name: 'h-review',
-		properties: {
-			'summary': {
-				'map': 'p-name'
-			},
-			'description': {
-				'map': 'e-description'
-			},
-			'item': {
-				'map': 'p-item',
-				'uf': ['h-item', 'h-geo', 'h-adr', 'h-card', 'h-event', 'h-product']
-			},
-			'reviewer': {
-				'uf': ['h-card']
-			},
-			'dtreviewer': {
-				'map': 'dt-reviewer'
-			},
-			'rating': {},
-			'best': {},
-			'worst': {},
-			'category': {
-				'map': 'p-category',
-				'relAlt': ['tag']
-			},
-			'url': {
-				'map': 'u-url',
-				'relAlt': ['self', 'bookmark']
-			}
-		}
-	};
-
-
-	modules.rels = {
-		// xfn
-		'friend': [ 'yes','external'],
-		'acquaintance': [ 'yes','external'],
-		'contact': [ 'yes','external'],
-		'met': [ 'yes','external'],
-		'co-worker': [ 'yes','external'],
-		'colleague': [ 'yes','external'],
-		'co-resident': [ 'yes','external'],
-		'neighbor': [ 'yes','external'],
-		'child': [ 'yes','external'],
-		'parent': [ 'yes','external'],
-		'sibling': [ 'yes','external'],
-		'spouse': [ 'yes','external'],
-		'kin': [ 'yes','external'],
-		'muse': [ 'yes','external'],
-		'crush': [ 'yes','external'],
-		'date': [ 'yes','external'],
-		'sweetheart': [ 'yes','external'],
-		'me': [ 'yes','external'],
-
-		// other rel=*
-		'license': [ 'yes','yes'],
-		'nofollow': [ 'no','external'],
-		'tag': [ 'no','yes'],
-		'self': [ 'no','external'],
-		'bookmark': [ 'no','external'],
-		'author': [ 'no','external'],
-		'home': [ 'no','external'],
-		'directory': [ 'no','external'],
-		'enclosure': [ 'no','external'],
-		'pronunciation': [ 'no','external'],
-		'payment': [ 'no','external'],
-		'principles': [ 'no','external']
-
-	};
+                }
+            }else{
+                if(modules.utils.isString(url)){
+                    return url;
+                }
+                return '';
+            }
+        },
+
+    };
+
+
+    /**
+     * constructor
+     * parses text to find just the date element of an ISO date/time string i.e. 2008-05-01
+     *
+     * @param  {String} dateString
+     * @param  {String} format
+     * @return {String}
+     */
+    modules.ISODate = function ( dateString, format ) {
+        this.clear();
+
+        this.format = (format)? format : 'auto'; // auto or W3C or RFC3339 or HTML5
+        this.setFormatSep();
+
+        // optional should be full iso date/time string
+        if(arguments[0]) {
+            this.parse(dateString, format);
+        }
+    };
+
+
+    modules.ISODate.prototype = {
+
+
+        /**
+         * clear all states
+         *
+         */
+        clear: function(){
+            this.clearDate();
+            this.clearTime();
+            this.clearTimeZone();
+            this.setAutoProfileState();
+        },
+
+
+        /**
+         * clear date states
+         *
+         */
+        clearDate: function(){
+            this.dY = -1;
+            this.dM = -1;
+            this.dD = -1;
+            this.dDDD = -1;
+        },
+
+
+        /**
+         * clear time states
+         *
+         */
+        clearTime: function(){
+            this.tH = -1;
+            this.tM = -1;
+            this.tS = -1;
+            this.tD = -1;
+        },
+
+
+        /**
+         * clear timezone states
+         *
+         */
+        clearTimeZone: function(){
+            this.tzH = -1;
+            this.tzM = -1;
+            this.tzPN = '+';
+            this.z = false;
+        },
+
+
+        /**
+         * resets the auto profile state
+         *
+         */
+        setAutoProfileState: function(){
+            this.autoProfile = {
+               sep: 'T',
+               dsep: '-',
+               tsep: ':',
+               tzsep: ':',
+               tzZulu: 'Z'
+            };
+        },
+
+
+        /**
+         * parses text to find ISO date/time string i.e. 2008-05-01T15:45:19Z
+         *
+         * @param  {String} dateString
+         * @param  {String} format
+         * @return {String}
+         */
+        parse: function( dateString, format ) {
+            this.clear();
+
+            var parts = [],
+                tzArray = [],
+                position = 0,
+                datePart = '',
+                timePart = '',
+                timeZonePart = '';
+
+            if(format){
+                this.format = format;
+            }
+
+
+
+            // discover date time separtor for auto profile
+            // Set to 'T' by default
+            if(dateString.indexOf('t') > -1) {
+                this.autoProfile.sep = 't';
+            }
+            if(dateString.indexOf('z') > -1) {
+                this.autoProfile.tzZulu = 'z';
+            }
+            if(dateString.indexOf('Z') > -1) {
+                this.autoProfile.tzZulu = 'Z';
+            }
+            if(dateString.toUpperCase().indexOf('T') === -1) {
+                this.autoProfile.sep = ' ';
+            }
+
+
+            dateString = dateString.toUpperCase().replace(' ','T');
+
+            // break on 'T' divider or space
+            if(dateString.indexOf('T') > -1) {
+                parts = dateString.split('T');
+                datePart = parts[0];
+                timePart = parts[1];
+
+                // zulu UTC
+                if(timePart.indexOf( 'Z' ) > -1) {
+                    this.z = true;
+                }
+
+                // timezone
+                if(timePart.indexOf( '+' ) > -1 || timePart.indexOf( '-' ) > -1) {
+                    tzArray = timePart.split( 'Z' ); // incase of incorrect use of Z
+                    timePart = tzArray[0];
+                    timeZonePart = tzArray[1];
+
+                    // timezone
+                    if(timePart.indexOf( '+' ) > -1 || timePart.indexOf( '-' ) > -1) {
+                        position = 0;
+
+                        if(timePart.indexOf( '+' ) > -1) {
+                            position = timePart.indexOf( '+' );
+                        } else {
+                            position = timePart.indexOf( '-' );
+                        }
+
+                        timeZonePart = timePart.substring( position, timePart.length );
+                        timePart = timePart.substring( 0, position );
+                    }
+                }
+
+            } else {
+                datePart = dateString;
+            }
+
+            if(datePart !== '') {
+                this.parseDate( datePart );
+                if(timePart !== '') {
+                    this.parseTime( timePart );
+                    if(timeZonePart !== '') {
+                        this.parseTimeZone( timeZonePart );
+                    }
+                }
+            }
+            return this.toString( format );
+        },
+
+
+        /**
+         * parses text to find just the date element of an ISO date/time string i.e. 2008-05-01
+         *
+         * @param  {String} dateString
+         * @param  {String} format
+         * @return {String}
+         */
+        parseDate: function( dateString, format ) {
+            this.clearDate();
+
+            var parts = [];
+
+            // discover timezone separtor for auto profile // default is ':'
+            if(dateString.indexOf('-') === -1) {
+                this.autoProfile.tsep = '';
+            }
+
+            // YYYY-DDD
+            parts = dateString.match( /(\d\d\d\d)-(\d\d\d)/ );
+            if(parts) {
+                if(parts[1]) {
+                    this.dY = parts[1];
+                }
+                if(parts[2]) {
+                    this.dDDD = parts[2];
+                }
+            }
+
+            if(this.dDDD === -1) {
+                // YYYY-MM-DD ie 2008-05-01 and YYYYMMDD ie 20080501
+                parts = dateString.match( /(\d\d\d\d)?-?(\d\d)?-?(\d\d)?/ );
+                if(parts[1]) {
+                    this.dY = parts[1];
+                }
+                if(parts[2]) {
+                    this.dM = parts[2];
+                }
+                if(parts[3]) {
+                    this.dD = parts[3];
+                }
+            }
+            return this.toString(format);
+        },
+
+
+        /**
+         * parses text to find just the time element of an ISO date/time string i.e. 13:30:45
+         *
+         * @param  {String} timeString
+         * @param  {String} format
+         * @return {String}
+         */
+        parseTime: function( timeString, format ) {
+            this.clearTime();
+            var parts = [];
+
+            // discover date separtor for auto profile // default is ':'
+            if(timeString.indexOf(':') === -1) {
+                this.autoProfile.tsep = '';
+            }
+
+            // finds timezone HH:MM:SS and HHMMSS  ie 13:30:45, 133045 and 13:30:45.0135
+            parts = timeString.match( /(\d\d)?:?(\d\d)?:?(\d\d)?.?([0-9]+)?/ );
+            if(parts[1]) {
+                this.tH = parts[1];
+            }
+            if(parts[2]) {
+                this.tM = parts[2];
+            }
+            if(parts[3]) {
+                this.tS = parts[3];
+            }
+            if(parts[4]) {
+                this.tD = parts[4];
+            }
+            return this.toTimeString(format);
+        },
+
+
+        /**
+         * parses text to find just the time element of an ISO date/time string i.e. +08:00
+         *
+         * @param  {String} timeString
+         * @param  {String} format
+         * @return {String}
+         */
+        parseTimeZone: function( timeString, format ) {
+            this.clearTimeZone();
+            var parts = [];
+
+            if(timeString.toLowerCase() === 'z'){
+                this.z = true;
+                // set case for z
+                this.autoProfile.tzZulu = (timeString === 'z')? 'z' : 'Z';
+            }else{
+
+                // discover timezone separtor for auto profile // default is ':'
+                if(timeString.indexOf(':') === -1) {
+                    this.autoProfile.tzsep = '';
+                }
+
+                // finds timezone +HH:MM and +HHMM  ie +13:30 and +1330
+                parts = timeString.match( /([\-\+]{1})?(\d\d)?:?(\d\d)?/ );
+                if(parts[1]) {
+                    this.tzPN = parts[1];
+                }
+                if(parts[2]) {
+                    this.tzH = parts[2];
+                }
+                if(parts[3]) {
+                    this.tzM = parts[3];
+                }
+
+
+            }
+            this.tzZulu = 'z';
+            return this.toTimeString( format );
+        },
+
+
+        /**
+         * returns ISO date/time string in W3C Note, RFC 3339, HTML5, or auto profile
+         *
+         * @param  {String} format
+         * @return {String}
+         */
+        toString: function( format ) {
+            var output = '';
+
+            if(format){
+                this.format = format;
+            }
+            this.setFormatSep();
+
+            if(this.dY  > -1) {
+                output = this.dY;
+                if(this.dM > 0 && this.dM < 13) {
+                    output += this.dsep + this.dM;
+                    if(this.dD > 0 && this.dD < 32) {
+                        output += this.dsep + this.dD;
+                        if(this.tH > -1 && this.tH < 25) {
+                            output += this.sep + this.toTimeString( format );
+                        }
+                    }
+                }
+                if(this.dDDD > -1) {
+                    output += this.dsep + this.dDDD;
+                }
+            } else if(this.tH > -1) {
+                output += this.toTimeString( format );
+            }
+
+            return output;
+        },
+
+
+        /**
+         * returns just the time string element of an ISO date/time
+         * in W3C Note, RFC 3339, HTML5, or auto profile
+         *
+         * @param  {String} format
+         * @return {String}
+         */
+        toTimeString: function( format ) {
+            var out = '';
+
+            if(format){
+                this.format = format;
+            }
+            this.setFormatSep();
+
+            // time can only be created with a full date
+            if(this.tH) {
+                if(this.tH > -1 && this.tH < 25) {
+                    out += this.tH;
+                    if(this.tM > -1 && this.tM < 61){
+                        out += this.tsep + this.tM;
+                        if(this.tS > -1 && this.tS < 61){
+                            out += this.tsep + this.tS;
+                            if(this.tD > -1){
+                                out += '.' + this.tD;
+                            }
+                        }
+                    }
+
+
+
+                    // time zone offset
+                    if(this.z) {
+                        out += this.tzZulu;
+                    } else {
+                        if(this.tzH && this.tzH > -1 && this.tzH < 25) {
+                            out += this.tzPN + this.tzH;
+                            if(this.tzM > -1 && this.tzM < 61){
+                                out += this.tzsep + this.tzM;
+                            }
+                        }
+                    }
+                }
+            }
+            return out;
+        },
+
+
+        /**
+         * set the current profile to W3C Note, RFC 3339, HTML5, or auto profile
+         *
+         */
+        setFormatSep: function() {
+            switch( this.format.toLowerCase() ) {
+                case 'rfc3339':
+                    this.sep = 'T';
+                    this.dsep = '';
+                    this.tsep = '';
+                    this.tzsep = '';
+                    this.tzZulu = 'Z';
+                    break;
+                case 'w3c':
+                    this.sep = 'T';
+                    this.dsep = '-';
+                    this.tsep = ':';
+                    this.tzsep = ':';
+                    this.tzZulu = 'Z';
+                    break;
+                case 'html5':
+                    this.sep = ' ';
+                    this.dsep = '-';
+                    this.tsep = ':';
+                    this.tzsep = ':';
+                    this.tzZulu = 'Z';
+                    break;
+                default:
+                    // auto - defined by format of input string
+                    this.sep = this.autoProfile.sep;
+                    this.dsep = this.autoProfile.dsep;
+                    this.tsep = this.autoProfile.tsep;
+                    this.tzsep = this.autoProfile.tzsep;
+                    this.tzZulu = this.autoProfile.tzZulu;
+            }
+        },
+
+
+        /**
+         * does current data contain a full date i.e. 2015-03-23
+         *
+         * @return {Boolean}
+         */
+        hasFullDate: function() {
+            return(this.dY !== -1 && this.dM !== -1 && this.dD !== -1);
+        },
+
+
+        /**
+         * does current data contain a minimum date which is just a year number i.e. 2015
+         *
+         * @return {Boolean}
+         */
+        hasDate: function() {
+            return(this.dY !== -1);
+        },
+
+
+        /**
+         * does current data contain a minimum time which is just a hour number i.e. 13
+         *
+         * @return {Boolean}
+         */
+        hasTime: function() {
+            return(this.tH !== -1);
+        },
+
+        /**
+         * does current data contain a minimum timezone i.e. -1 || +1 || z
+         *
+         * @return {Boolean}
+         */
+        hasTimeZone: function() {
+            return(this.tzH !== -1);
+        }
+
+    };
+
+    modules.ISODate.prototype.constructor = modules.ISODate;
+
+
+    modules.dates = {
+
+
+        /**
+         * does text contain am
+         *
+         * @param  {String} text
+         * @return {Boolean}
+         */
+        hasAM: function( text ) {
+            text = text.toLowerCase();
+            return(text.indexOf('am') > -1 || text.indexOf('a.m.') > -1);
+        },
+
+
+        /**
+         * does text contain pm
+         *
+         * @param  {String} text
+         * @return {Boolean}
+         */
+        hasPM: function( text ) {
+            text = text.toLowerCase();
+            return(text.indexOf('pm') > -1 || text.indexOf('p.m.') > -1);
+        },
+
+
+        /**
+         * remove am and pm from text and return it
+         *
+         * @param  {String} text
+         * @return {String}
+         */
+        removeAMPM: function( text ) {
+            return text.replace('pm', '').replace('p.m.', '').replace('am', '').replace('a.m.', '');
+        },
+
+
+       /**
+         * simple test of whether ISO date string is a duration  i.e.  PY17M or PW12
+         *
+         * @param  {String} text
+         * @return {Boolean}
+         */
+        isDuration: function( text ) {
+            if(modules.utils.isString( text )){
+                text = text.toLowerCase();
+                if(modules.utils.startWith(text, 'p') ){
+                    return true;
+                }
+            }
+            return false;
+        },
+
+
+       /**
+         * is text a time or timezone
+         * i.e. HH-MM-SS or z+-HH-MM-SS 08:43 | 15:23:00:0567 | 10:34pm | 10:34 p.m. | +01:00:00 | -02:00 | z15:00 | 0843
+         *
+         * @param  {String} text
+         * @return {Boolean}
+         */
+        isTime: function( text ) {
+            if(modules.utils.isString(text)){
+                text = text.toLowerCase();
+                text = modules.utils.trim( text );
+                // start with timezone char
+                if( text.match(':') && ( modules.utils.startWith(text, 'z') || modules.utils.startWith(text, '-')  || modules.utils.startWith(text, '+') )) {
+                    return true;
+                }
+                // has ante meridiem or post meridiem
+                if( text.match(/^[0-9]/) &&
+                    ( this.hasAM(text) || this.hasPM(text) )) {
+                    return true;
+                }
+                // contains time delimiter but not datetime delimiter
+                if( text.match(':') && !text.match(/t|\s/) ) {
+                    return true;
+                }
+
+                // if it's a number of 2, 4 or 6 chars
+                if(modules.utils.isNumber(text)){
+                    if(text.length === 2 || text.length === 4 || text.length === 6){
+                        return true;
+                    }
+                }
+            }
+            return false;
+        },
+
+
+        /**
+         * parses a time from text and returns 24hr time string
+         * i.e. 5:34am = 05:34:00 and 1:52:04p.m. = 13:52:04
+         *
+         * @param  {String} text
+         * @return {String}
+         */
+        parseAmPmTime: function( text ) {
+            var out = text,
+                times = [];
+
+            // if the string has a text : or am or pm
+            if(modules.utils.isString(out)) {
+                //text = text.toLowerCase();
+                text = text.replace(/[ ]+/g, '');
+
+                if(text.match(':') || this.hasAM(text) || this.hasPM(text)) {
+
+                    if(text.match(':')) {
+                        times = text.split(':');
+                    } else {
+                        // single number text i.e. 5pm
+                        times[0] = text;
+                        times[0] = this.removeAMPM(times[0]);
+                    }
+
+                    // change pm hours to 24hr number
+                    if(this.hasPM(text)) {
+                        if(times[0] < 12) {
+                            times[0] = parseInt(times[0], 10) + 12;
+                        }
+                    }
+
+                    // add leading zero's where needed
+                    if(times[0] && times[0].length === 1) {
+                        times[0] = '0' + times[0];
+                    }
+
+                    // rejoin text elements together
+                    if(times[0]) {
+                        text = times.join(':');
+                    }
+                }
+            }
+
+            // remove am/pm strings
+            return this.removeAMPM(text);
+        },
+
+
+       /**
+         * overlays a time on a date to return the union of the two
+         *
+         * @param  {String} date
+         * @param  {String} time
+         * @param  {String} format ( Modules.ISODate profile format )
+         * @return {Object} Modules.ISODate
+         */
+        dateTimeUnion: function(date, time, format) {
+            var isodate = new modules.ISODate(date, format),
+                isotime = new modules.ISODate();
+
+            isotime.parseTime(this.parseAmPmTime(time), format);
+            if(isodate.hasFullDate() && isotime.hasTime()) {
+                isodate.tH = isotime.tH;
+                isodate.tM = isotime.tM;
+                isodate.tS = isotime.tS;
+                isodate.tD = isotime.tD;
+                return isodate;
+            } else {
+                if(isodate.hasFullDate()){
+                    return isodate;
+                }
+                return new modules.ISODate();
+            }
+        },
+
+
+       /**
+         * concatenate an array of date and time text fragments to create an ISODate object
+         * used for microformat value and value-title rules
+         *
+         * @param  {Array} arr ( Array of Strings )
+         * @param  {String} format ( Modules.ISODate profile format )
+         * @return {Object} Modules.ISODate
+         */
+        concatFragments: function (arr, format) {
+            var out = new modules.ISODate(),
+                i = 0,
+                value = '';
+
+            // if the fragment already contains a full date just return it once
+            if(arr[0].toUpperCase().match('T')) {
+                return new modules.ISODate(arr[0], format);
+            }else{
+                for(i = 0; i < arr.length; i++) {
+                value = arr[i];
+
+                // date pattern
+                if( value.charAt(4) === '-' && out.hasFullDate() === false ){
+                    out.parseDate(value);
+                }
+
+                // time pattern
+                if( (value.indexOf(':') > -1 || modules.utils.isNumber( this.parseAmPmTime(value) )) && out.hasTime() === false ) {
+                    // split time and timezone
+                    var items = this.splitTimeAndZone(value);
+                    value = items[0];
+
+                    // parse any use of am/pm
+                    value = this.parseAmPmTime(value);
+                    out.parseTime(value);
+
+                    // parse any timezone
+                    if(items.length > 1){
+                         out.parseTimeZone(items[1], format);
+                    }
+                }
+
+                // timezone pattern
+                if(value.charAt(0) === '-' || value.charAt(0) === '+' || value.toUpperCase() === 'Z') {
+                    if( out.hasTimeZone() === false ){
+                        out.parseTimeZone(value);
+                    }
+                }
+
+            }
+            return out;
+
+            }
+        },
+
+
+       /**
+         * parses text by splitting it into an array of time and timezone strings
+         *
+         * @param  {String} text
+         * @return {Array} Modules.ISODate
+         */
+        splitTimeAndZone: function ( text ){
+           var out = [text],
+               chars = ['-','+','z','Z'],
+               i = chars.length;
+
+            while (i--) {
+              if(text.indexOf(chars[i]) > -1){
+                  out[0] = text.slice( 0, text.indexOf(chars[i]) );
+                  out.push( text.slice( text.indexOf(chars[i]) ) );
+                  break;
+               }
+            }
+           return out;
+        }
+
+    };
+
+
+    modules.text = {
+
+        // normalised or whitespace or whitespacetrimmed
+        textFormat: 'whitespacetrimmed',
+
+        // block level tags, used to add line returns
+        blockLevelTags: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'hr', 'pre', 'table',
+            'address', 'article', 'aside', 'blockquote', 'caption', 'col', 'colgroup', 'dd', 'div',
+            'dt', 'dir', 'fieldset', 'figcaption', 'figure', 'footer', 'form',  'header', 'hgroup', 'hr',
+            'li', 'map', 'menu', 'nav', 'optgroup', 'option', 'section', 'tbody', 'testarea',
+            'tfoot', 'th', 'thead', 'tr', 'td', 'ul', 'ol', 'dl', 'details'],
+
+        // tags to exclude
+        excludeTags: ['noframe', 'noscript', 'template', 'script', 'style', 'frames', 'frameset'],
+
+
+        /**
+         * parses the text from the DOM Node
+         *
+         * @param  {DOM Node} node
+         * @param  {String} textFormat
+         * @return {String}
+         */
+        parse: function(doc, node, textFormat){
+            var out;
+            this.textFormat = (textFormat)? textFormat : this.textFormat;
+            if(this.textFormat === 'normalised'){
+                out = this.walkTreeForText( node );
+                if(out !== undefined){
+                    return this.normalise( doc, out );
+                }else{
+                    return '';
+                }
+            }else{
+               return this.formatText( doc, modules.domUtils.textContent(node), this.textFormat );
+            }
+        },
+
+
+        /**
+         * parses the text from a html string
+         *
+         * @param  {DOM Document} doc
+         * @param  {String} text
+         * @param  {String} textFormat
+         * @return {String}
+         */
+        parseText: function( doc, text, textFormat ){
+           var node = modules.domUtils.createNodeWithText( 'div', text );
+           return this.parse( doc, node, textFormat );
+        },
+
+
+        /**
+         * parses the text from a html string - only for whitespace or whitespacetrimmed formats
+         *
+         * @param  {String} text
+         * @param  {String} textFormat
+         * @return {String}
+         */
+        formatText: function( doc, text, textFormat ){
+           this.textFormat = (textFormat)? textFormat : this.textFormat;
+           if(text){
+              var out = '',
+                  regex = /(<([^>]+)>)/ig;
+
+              out = text.replace(regex, '');
+              if(this.textFormat === 'whitespacetrimmed') {
+                 out = modules.utils.trimWhitespace( out );
+              }
+
+              //return entities.decode( out, 2 );
+              return modules.domUtils.decodeEntities( doc, out );
+           }else{
+              return '';
+           }
+        },
+
+
+        /**
+         * normalises whitespace in given text
+         *
+         * @param  {String} text
+         * @return {String}
+         */
+        normalise: function( doc, text ){
+            text = text.replace( /&nbsp;/g, ' ') ;    // exchanges html entity for space into space char
+            text = modules.utils.collapseWhiteSpace( text );     // removes linefeeds, tabs and addtional spaces
+            text = modules.domUtils.decodeEntities( doc, text );  // decode HTML entities
+            text = text.replace( '–', '-' );          // correct dash decoding
+            return modules.utils.trim( text );
+        },
+
+
+        /**
+         * walks DOM tree parsing the text from DOM Nodes
+         *
+         * @param  {DOM Node} node
+         * @return {String}
+         */
+        walkTreeForText: function( node ) {
+            var out = '',
+                j = 0;
+
+            if(node.tagName && this.excludeTags.indexOf( node.tagName.toLowerCase() ) > -1){
+                return out;
+            }
+
+            // if node is a text node get its text
+            if(node.nodeType && node.nodeType === 3){
+                out += modules.domUtils.getElementText( node );
+            }
+
+            // get the text of the child nodes
+            if(node.childNodes && node.childNodes.length > 0){
+                for (j = 0; j < node.childNodes.length; j++) {
+                    var text = this.walkTreeForText( node.childNodes[j] );
+                    if(text !== undefined){
+                        out += text;
+                    }
+                }
+            }
+
+            // if it's a block level tag add an additional space at the end
+            if(node.tagName && this.blockLevelTags.indexOf( node.tagName.toLowerCase() ) !== -1){
+                out += ' ';
+            }
+
+            return (out === '')? undefined : out ;
+        }
+
+    };
+
+
+    modules.html = {
+
+        // elements which are self-closing
+        selfClosingElt: ['area', 'base', 'br', 'col', 'hr', 'img', 'input', 'link', 'meta', 'param', 'command', 'keygen', 'source'],
+
+
+        /**
+         * parse the html string from DOM Node
+         *
+         * @param  {DOM Node} node
+         * @return {String}
+         */
+        parse: function( node ){
+            var out = '',
+                j = 0;
+
+            // we do not want the outer container
+            if(node.childNodes && node.childNodes.length > 0){
+                for (j = 0; j < node.childNodes.length; j++) {
+                    var text = this.walkTreeForHtml( node.childNodes[j] );
+                    if(text !== undefined){
+                        out += text;
+                    }
+                }
+            }
+
+            return out;
+        },
+
+
+        /**
+         * walks the DOM tree parsing the html string from the nodes
+         *
+         * @param  {DOM Document} doc
+         * @param  {DOM Node} node
+         * @return {String}
+         */
+        walkTreeForHtml: function( node ) {
+            var out = '',
+                j = 0;
+
+            // if node is a text node get its text
+            if(node.nodeType && node.nodeType === 3){
+                out += modules.domUtils.getElementText( node );
+            }
+
+
+            // exclude text which has been added with include pattern  -
+            if(node.nodeType && node.nodeType === 1 && modules.domUtils.hasAttribute(node, 'data-include') === false){
+
+                // begin tag
+                out += '<' + node.tagName.toLowerCase();
+
+                // add attributes
+                var attrs = modules.domUtils.getOrderedAttributes(node);
+                for (j = 0; j < attrs.length; j++) {
+                    out += ' ' + attrs[j].name +  '=' + '"' + attrs[j].value + '"';
+                }
+
+                if(this.selfClosingElt.indexOf(node.tagName.toLowerCase()) === -1){
+                    out += '>';
+                }
+
+                // get the text of the child nodes
+                if(node.childNodes && node.childNodes.length > 0){
+
+                    for (j = 0; j < node.childNodes.length; j++) {
+                        var text = this.walkTreeForHtml( node.childNodes[j] );
+                        if(text !== undefined){
+                            out += text;
+                        }
+                    }
+                }
+
+                // end tag
+                if(this.selfClosingElt.indexOf(node.tagName.toLowerCase()) > -1){
+                    out += ' />';
+                }else{
+                    out += '</' + node.tagName.toLowerCase() + '>';
+                }
+            }
+
+            return (out === '')? undefined : out;
+        }
+
+
+    };
+
+
+    modules.maps['h-adr'] = {
+        root: 'adr',
+        name: 'h-adr',
+        properties: {
+            'post-office-box': {},
+            'street-address': {},
+            'extended-address': {},
+            'locality': {},
+            'region': {},
+            'postal-code': {},
+            'country-name': {}
+        }
+    };
+
+
+    modules.maps['h-card'] =  {
+        root: 'vcard',
+        name: 'h-card',
+        properties: {
+            'fn': {
+                'map': 'p-name'
+            },
+            'adr': {
+                'map': 'p-adr',
+                'uf': ['h-adr']
+            },
+            'agent': {
+                'uf': ['h-card']
+            },
+            'bday': {
+                'map': 'dt-bday'
+            },
+            'class': {},
+            'category': {
+                'map': 'p-category',
+                'relAlt': ['tag']
+            },
+            'email': {
+                'map': 'u-email'
+            },
+            'geo': {
+                'map': 'p-geo',
+                'uf': ['h-geo']
+            },
+            'key': {
+                'map': 'u-key'
+            },
+            'label': {},
+            'logo': {
+                'map': 'u-logo'
+            },
+            'mailer': {},
+            'honorific-prefix': {},
+            'given-name': {},
+            'additional-name': {},
+            'family-name': {},
+            'honorific-suffix': {},
+            'nickname': {},
+            'note': {}, // could be html i.e. e-note
+            'org': {},
+            'p-organization-name': {},
+            'p-organization-unit': {},
+            'photo': {
+                'map': 'u-photo'
+            },
+            'rev': {
+                'map': 'dt-rev'
+            },
+            'role': {},
+            'sequence': {},
+            'sort-string': {},
+            'sound': {
+                'map': 'u-sound'
+            },
+            'title': {
+                'map': 'p-job-title'
+            },
+            'tel': {},
+            'tz': {},
+            'uid': {
+                'map': 'u-uid'
+            },
+            'url': {
+                'map': 'u-url'
+            }
+        }
+    };
+
+
+    modules.maps['h-entry'] = {
+        root: 'hentry',
+        name: 'h-entry',
+        properties: {
+            'entry-title': {
+                'map': 'p-name'
+            },
+            'entry-summary': {
+                'map': 'p-summary'
+            },
+            'entry-content': {
+                'map': 'e-content'
+            },
+            'published': {
+                'map': 'dt-published'
+            },
+            'updated': {
+                'map': 'dt-updated'
+            },
+            'author': {
+                'uf': ['h-card']
+            },
+            'category': {
+                'map': 'p-category',
+                'relAlt': ['tag']
+            },
+            'geo': {
+                'map': 'p-geo',
+                'uf': ['h-geo']
+            },
+            'latitude': {},
+            'longitude': {},
+            'url': {
+                'map': 'u-url',
+                'relAlt': ['bookmark']
+            }
+        }
+    };
+
+
+    modules.maps['h-event'] = {
+        root: 'vevent',
+        name: 'h-event',
+        properties: {
+            'summary': {
+                'map': 'p-name'
+            },
+            'dtstart': {
+                'map': 'dt-start'
+            },
+            'dtend': {
+                'map': 'dt-end'
+            },
+            'description': {},
+            'url': {
+                'map': 'u-url'
+            },
+            'category': {
+                'map': 'p-category',
+                'relAlt': ['tag']
+            },
+            'location': {
+                'uf': ['h-card']
+            },
+            'geo': {
+                'uf': ['h-geo']
+            },
+            'latitude': {},
+            'longitude': {},
+            'duration': {
+                'map': 'dt-duration'
+            },
+            'contact': {
+                'uf': ['h-card']
+            },
+            'organizer': {
+                'uf': ['h-card']},
+            'attendee': {
+                'uf': ['h-card']},
+            'uid': {
+                'map': 'u-uid'
+            },
+            'attach': {
+                'map': 'u-attach'
+            },
+            'status': {},
+            'rdate': {},
+            'rrule': {}
+        }
+    };
+
+
+    modules.maps['h-feed'] = {
+        root: 'hfeed',
+        name: 'h-feed',
+        properties: {
+            'category': {
+                'map': 'p-category',
+                'relAlt': ['tag']
+            },
+            'summary': {
+                'map': 'p-summary'
+            },
+            'author': {
+                'uf': ['h-card']
+            },
+            'url': {
+                'map': 'u-url'
+            },
+            'photo': {
+                'map': 'u-photo'
+            },
+        }
+    };
+
+
+    modules.maps['h-geo'] = {
+        root: 'geo',
+        name: 'h-geo',
+        properties: {
+            'latitude': {},
+            'longitude': {}
+        }
+    };
+
+
+    modules.maps['h-item'] = {
+        root: 'item',
+        name: 'h-item',
+        subTree: false,
+        properties: {
+            'fn': {
+                'map': 'p-name'
+            },
+            'url': {
+                'map': 'u-url'
+            },
+            'photo': {
+                'map': 'u-photo'
+            }
+        }
+    };
+
+
+    modules.maps['h-listing'] = {
+            root: 'hlisting',
+            name: 'h-listing',
+            properties: {
+                'version': {},
+                'lister': {
+                    'uf': ['h-card']
+                },
+                'dtlisted': {
+                    'map': 'dt-listed'
+                },
+                'dtexpired': {
+                    'map': 'dt-expired'
+                },
+                'location': {},
+                'price': {},
+                'item': {
+                    'uf': ['h-card','a-adr','h-geo']
+                },
+                'summary': {
+                    'map': 'p-name'
+                },
+                'description': {
+                    'map': 'e-description'
+                },
+                'listing': {}
+            }
+        };
+
+
+    modules.maps['h-news'] = {
+            root: 'hnews',
+            name: 'h-news',
+            properties: {
+                'entry': {
+                    'uf': ['h-entry']
+                },
+                'geo': {
+                    'uf': ['h-geo']
+                },
+                'latitude': {},
+                'longitude': {},
+                'source-org': {
+                    'uf': ['h-card']
+                },
+                'dateline': {
+                    'uf': ['h-card']
+                },
+                'item-license': {
+                    'map': 'u-item-license'
+                },
+                'principles': {
+                    'map': 'u-principles',
+                    'relAlt': ['principles']
+                }
+            }
+        };
+
+
+    modules.maps['h-org'] = {
+        root: 'h-x-org',  // drop this from v1 as it causes issue with fn org hcard pattern
+        name: 'h-org',
+        childStructure: true,
+        properties: {
+            'organization-name': {},
+            'organization-unit': {}
+        }
+    };
+
+
+    modules.maps['h-product'] = {
+            root: 'hproduct',
+            name: 'h-product',
+            properties: {
+                'brand': {
+                    'uf': ['h-card']
+                },
+                'category': {
+                    'map': 'p-category',
+                    'relAlt': ['tag']
+                },
+                'price': {},
+                'description': {
+                    'map': 'e-description'
+                },
+                'fn': {
+                    'map': 'p-name'
+                },
+                'photo': {
+                    'map': 'u-photo'
+                },
+                'url': {
+                    'map': 'u-url'
+                },
+                'review': {
+                    'uf': ['h-review', 'h-review-aggregate']
+                },
+                'listing': {
+                    'uf': ['h-listing']
+                },
+                'identifier': {
+                    'map': 'u-identifier'
+                }
+            }
+        };
+
+
+    modules.maps['h-recipe'] = {
+            root: 'hrecipe',
+            name: 'h-recipe',
+            properties: {
+                'fn': {
+                    'map': 'p-name'
+                },
+                'ingredient': {
+                    'map': 'e-ingredient'
+                },
+                'yield': {},
+                'instructions': {
+                    'map': 'e-instructions'
+                },
+                'duration': {
+                    'map': 'dt-duration'
+                },
+                'photo': {
+                    'map': 'u-photo'
+                },
+                'summary': {},
+                'author': {
+                    'uf': ['h-card']
+                },
+                'published': {
+                    'map': 'dt-published'
+                },
+                'nutrition': {},
+                'category': {
+                    'map': 'p-category',
+                    'relAlt': ['tag']
+                },
+            }
+        };
+
+
+    modules.maps['h-resume'] = {
+        root: 'hresume',
+        name: 'h-resume',
+        properties: {
+            'summary': {},
+            'contact': {
+                'uf': ['h-card']
+            },
+            'education': {
+                'uf': ['h-card', 'h-event']
+            },
+            'experience': {
+                'uf': ['h-card', 'h-event']
+            },
+            'skill': {},
+            'affiliation': {
+                'uf': ['h-card']
+            }
+        }
+    };
+
+
+    modules.maps['h-review-aggregate'] = {
+        root: 'hreview-aggregate',
+        name: 'h-review-aggregate',
+        properties: {
+            'summary': {
+                'map': 'p-name'
+            },
+            'item': {
+                'map': 'p-item',
+                'uf': ['h-item', 'h-geo', 'h-adr', 'h-card', 'h-event', 'h-product']
+            },
+            'rating': {},
+            'average': {},
+            'best': {},
+            'worst': {},
+            'count': {},
+            'votes': {},
+            'category': {
+                'map': 'p-category',
+                'relAlt': ['tag']
+            },
+            'url': {
+                'map': 'u-url',
+                'relAlt': ['self', 'bookmark']
+            }
+        }
+    };
+
+
+    modules.maps['h-review'] = {
+        root: 'hreview',
+        name: 'h-review',
+        properties: {
+            'summary': {
+                'map': 'p-name'
+            },
+            'description': {
+                'map': 'e-description'
+            },
+            'item': {
+                'map': 'p-item',
+                'uf': ['h-item', 'h-geo', 'h-adr', 'h-card', 'h-event', 'h-product']
+            },
+            'reviewer': {
+                'uf': ['h-card']
+            },
+            'dtreviewer': {
+                'map': 'dt-reviewer'
+            },
+            'rating': {},
+            'best': {},
+            'worst': {},
+            'category': {
+                'map': 'p-category',
+                'relAlt': ['tag']
+            },
+            'url': {
+                'map': 'u-url',
+                'relAlt': ['self', 'bookmark']
+            }
+        }
+    };
+
+
+    modules.rels = {
+        // xfn
+        'friend': [ 'yes','external'],
+        'acquaintance': [ 'yes','external'],
+        'contact': [ 'yes','external'],
+        'met': [ 'yes','external'],
+        'co-worker': [ 'yes','external'],
+        'colleague': [ 'yes','external'],
+        'co-resident': [ 'yes','external'],
+        'neighbor': [ 'yes','external'],
+        'child': [ 'yes','external'],
+        'parent': [ 'yes','external'],
+        'sibling': [ 'yes','external'],
+        'spouse': [ 'yes','external'],
+        'kin': [ 'yes','external'],
+        'muse': [ 'yes','external'],
+        'crush': [ 'yes','external'],
+        'date': [ 'yes','external'],
+        'sweetheart': [ 'yes','external'],
+        'me': [ 'yes','external'],
+
+        // other rel=*
+        'license': [ 'yes','yes'],
+        'nofollow': [ 'no','external'],
+        'tag': [ 'no','yes'],
+        'self': [ 'no','external'],
+        'bookmark': [ 'no','external'],
+        'author': [ 'no','external'],
+        'home': [ 'no','external'],
+        'directory': [ 'no','external'],
+        'enclosure': [ 'no','external'],
+        'pronunciation': [ 'no','external'],
+        'payment': [ 'no','external'],
+        'principles': [ 'no','external']
+
+    };
 
 
 
     var External = {
         version: modules.version,
         livingStandard: modules.livingStandard
     };
 
 
     External.get = function(options){
-    	var parser = new modules.Parser();
+        var parser = new modules.Parser();
         addV1(parser, options);
-    	return parser.get( options );
+        return parser.get( options );
     };
 
 
     External.getParent = function(node, options){
-    	var parser = new modules.Parser();
+        var parser = new modules.Parser();
         addV1(parser, options);
-    	return parser.getParent( node, options );
+        return parser.getParent( node, options );
     };
 
 
     External.count = function(options){
-    	var parser = new modules.Parser();
+        var parser = new modules.Parser();
         addV1(parser, options);
-    	return parser.count( options );
+        return parser.count( options );
     };
 
 
     External.isMicroformat = function( node, options ){
-    	var parser = new modules.Parser();
+        var parser = new modules.Parser();
         addV1(parser, options);
-    	return parser.isMicroformat( node, options );
+        return parser.isMicroformat( node, options );
     };
 
 
     External.hasMicroformats = function( node, options ){
-    	var parser = new modules.Parser();
+        var parser = new modules.Parser();
         addV1(parser, options);
-    	return parser.hasMicroformats( node, options );
+        return parser.hasMicroformats( node, options );
     };
 
 
     function addV1(parser, options){
-		if(options && options.maps){
-			if(Array.isArray(options.maps)){
-				parser.add(options.maps);
-			}else{
-				parser.add([options.maps]);
-			}
-		}
+        if(options && options.maps){
+            if(Array.isArray(options.maps)){
+                parser.add(options.maps);
+            }else{
+                parser.add([options.maps]);
+            }
+        }
     }
 
 
     return External;
 
 
 }));
 try {
--- a/toolkit/components/microformats/test/interface-tests/get-test.js
+++ b/toolkit/components/microformats/test/interface-tests/get-test.js
@@ -542,22 +542,22 @@ describe('Microformat.get', function() {
                     'properties': {
                         'amount': ['36.78']
                     }
                 }],
                 'rels': {},
                 'rel-urls': {}
             };
         var v1Definition = {
-        		root: 'hpayment',
-        		name: 'h-payment',
-        		properties: {
-        			'amount': {}
-        		}
-        	};
+                root: 'hpayment',
+                name: 'h-payment',
+                properties: {
+                    'amount': {}
+                }
+            };
 
 
         doc = document.implementation.createHTMLDocument('New Document');
         node =  document.createElement('div');
         node.innerHTML = altHTML;
         doc.body.appendChild(node);
 
         options ={
--- a/toolkit/components/microformats/test/lib/domutils.js
+++ b/toolkit/components/microformats/test/lib/domutils.js
@@ -8,604 +8,604 @@
    MIT License: https://raw.github.com/glennjones/microformat-shiv/master/license.txt
    Dependencies  utilities.js
 
 */
 
 
 var Modules = (function (modules) {
 
-	modules.domUtils = {
+    modules.domUtils = {
 
-		// blank objects for DOM
-		document: null,
-		rootNode: null,
+        // blank objects for DOM
+        document: null,
+        rootNode: null,
 
 
-	     /**
-		 * gets DOMParser object
-		 *
+        /**
+         * gets DOMParser object
+         *
          * @return {Object || undefined}
-		 */
+         */
         getDOMParser: function () {
             if (typeof DOMParser === undefined) {
                 try {
                     return Components.classes["@mozilla.org/xmlextras/domparser;1"]
                         .createInstance(Components.interfaces.nsIDOMParser);
                 } catch (e) {
                     return undefined;
                 }
             } else {
                 return new DOMParser();
             }
         },
 
 
-	     /**
-		 * configures what are the base DOM objects for parsing
-		 *
-		 * @param  {Object} options
-		 * @return {DOM Node} node
-		 */
-		getDOMContext: function( options ){
+        /**
+         * configures what are the base DOM objects for parsing
+         *
+         * @param  {Object} options
+         * @return {DOM Node} node
+         */
+        getDOMContext: function( options ){
 
-			// if a node is passed
-			if(options.node){
-				this.rootNode = options.node;
-			}
+            // if a node is passed
+            if(options.node){
+                this.rootNode = options.node;
+            }
 
 
-			// if a html string is passed
-			if(options.html){
-				//var domParser = new DOMParser();
+            // if a html string is passed
+            if(options.html){
+                //var domParser = new DOMParser();
                 var domParser = this.getDOMParser();
-       			this.rootNode = domParser.parseFromString( options.html, 'text/html' );
-			}
+                this.rootNode = domParser.parseFromString( options.html, 'text/html' );
+            }
 
 
-			// find top level document from rootnode
-			if(this.rootNode !== null){
-				if(this.rootNode.nodeType === 9){
-					this.document = this.rootNode;
-					this.rootNode = modules.domUtils.querySelector(this.rootNode, 'html');
-				}else{
-					// if it's DOM node get parent DOM Document
-					this.document = modules.domUtils.ownerDocument(this.rootNode);
-				}
-			}
+            // find top level document from rootnode
+            if(this.rootNode !== null){
+                if(this.rootNode.nodeType === 9){
+                    this.document = this.rootNode;
+                    this.rootNode = modules.domUtils.querySelector(this.rootNode, 'html');
+                }else{
+                    // if it's DOM node get parent DOM Document
+                    this.document = modules.domUtils.ownerDocument(this.rootNode);
+                }
+            }
 
 
-			// use global document object
-			if(!this.rootNode && document){
-				this.rootNode = modules.domUtils.querySelector(document, 'html');
-				this.document = document;
-			}
+            // use global document object
+            if(!this.rootNode && document){
+                this.rootNode = modules.domUtils.querySelector(document, 'html');
+                this.document = document;
+            }
 
 
-			if(this.rootNode && this.document){
-				return {document: this.document, rootNode: this.rootNode};
-			}
+            if(this.rootNode && this.document){
+                return {document: this.document, rootNode: this.rootNode};
+            }
 
-			return {document: null, rootNode: null};
-		},
+            return {document: null, rootNode: null};
+        },
 
 
 
-		/**
-		* gets the first DOM node
-		*
-		* @param  {Dom Document}
-		* @return {DOM Node} node
-		*/
-		getTopMostNode: function( node ){
-			//var doc = this.ownerDocument(node);
-			//if(doc && doc.nodeType && doc.nodeType === 9 && doc.documentElement){
-			//	return doc.documentElement;
-			//}
-			return node;
-		},
+       /**
+        * gets the first DOM node
+        *
+        * @param  {Dom Document}
+        * @return {DOM Node} node
+        */
+        getTopMostNode: function( node ){
+            //var doc = this.ownerDocument(node);
+            //if(doc && doc.nodeType && doc.nodeType === 9 && doc.documentElement){
+            //  return doc.documentElement;
+            //}
+            return node;
+        },
 
 
 
-		 /**
-		 * abstracts DOM ownerDocument
-		 *
-		 * @param  {DOM Node} node
-		 * @return {Dom Document}
-		 */
-		ownerDocument: function(node){
-			return node.ownerDocument;
-		},
+        /**
+         * abstracts DOM ownerDocument
+         *
+         * @param  {DOM Node} node
+         * @return {Dom Document}
+         */
+        ownerDocument: function(node){
+            return node.ownerDocument;
+        },
 
 
-		/**
-		 * abstracts DOM textContent
-		 *
-		 * @param  {DOM Node} node
-		 * @return {String}
-		 */
-		textContent: function(node){
-			if(node.textContent){
-				return node.textContent;
-			}else if(node.innerText){
-				return node.innerText;
-			}
-			return '';
-		},
+        /**
+         * abstracts DOM textContent
+         *
+         * @param  {DOM Node} node
+         * @return {String}
+         */
+        textContent: function(node){
+            if(node.textContent){
+                return node.textContent;
+            }else if(node.innerText){
+                return node.innerText;
+            }
+            return '';
+        },
 
 
-		/**
-		 * abstracts DOM innerHTML
-		 *
-		 * @param  {DOM Node} node
-		 * @return {String}
-		 */
-		innerHTML: function(node){
-			return node.innerHTML;
-		},
+        /**
+         * abstracts DOM innerHTML
+         *
+         * @param  {DOM Node} node
+         * @return {String}
+         */
+        innerHTML: function(node){
+            return node.innerHTML;
+        },
+
+
+        /**
+         * abstracts DOM hasAttribute
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @return {Boolean}
+         */
+        hasAttribute: function(node, attributeName) {
+            return node.hasAttribute(attributeName);
+        },
 
 
-		/**
-		 * abstracts DOM hasAttribute
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @return {Boolean}
-		 */
-		hasAttribute: function(node, attributeName) {
-			return node.hasAttribute(attributeName);
-		},
+        /**
+         * does an attribute contain a value
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @param  {String} value
+         * @return {Boolean}
+         */
+        hasAttributeValue: function(node, attributeName, value) {
+            return (this.getAttributeList(node, attributeName).indexOf(value) > -1);
+        },
 
 
-		/**
-		 * does an attribute contain a value
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @param  {String} value
-		 * @return {Boolean}
-		 */
-		hasAttributeValue: function(node, attributeName, value) {
-			return (this.getAttributeList(node, attributeName).indexOf(value) > -1);
-		},
+        /**
+         * abstracts DOM getAttribute
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @return {String || null}
+         */
+        getAttribute: function(node, attributeName) {
+            return node.getAttribute(attributeName);
+        },
 
 
-		/**
-		 * abstracts DOM getAttribute
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @return {String || null}
-		 */
-		getAttribute: function(node, attributeName) {
-			return node.getAttribute(attributeName);
-		},
+        /**
+         * abstracts DOM setAttribute
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @param  {String} attributeValue
+         */
+        setAttribute: function(node, attributeName, attributeValue){
+            node.setAttribute(attributeName, attributeValue);
+        },
 
 
-		/**
-		 * abstracts DOM setAttribute
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @param  {String} attributeValue
-		 */
-		setAttribute: function(node, attributeName, attributeValue){
-			node.setAttribute(attributeName, attributeValue);
-		},
+        /**
+         * abstracts DOM removeAttribute
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         */
+        removeAttribute: function(node, attributeName) {
+            node.removeAttribute(attributeName);
+        },
 
 
-		/**
-		 * abstracts DOM removeAttribute
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 */
-		removeAttribute: function(node, attributeName) {
-			node.removeAttribute(attributeName);
-		},
+        /**
+         * abstracts DOM getElementById
+         *
+         * @param  {DOM Node || DOM Document} node
+         * @param  {String} id
+         * @return {DOM Node}
+         */
+        getElementById: function(docNode, id) {
+            return docNode.querySelector( '#' + id );
+        },
 
 
-		/**
-		 * abstracts DOM getElementById
-		 *
-		 * @param  {DOM Node || DOM Document} node
-		 * @param  {String} id
-		 * @return {DOM Node}
-		 */
-		getElementById: function(docNode, id) {
-			return docNode.querySelector( '#' + id );
-		},
-
-
-		/**
-		 * abstracts DOM querySelector
-		 *
-		 * @param  {DOM Node || DOM Document} node
-		 * @param  {String} selector
-		 * @return {DOM Node}
-		 */
-		querySelector: function(docNode, selector) {
-			return docNode.querySelector( selector );
-		},
+        /**
+         * abstracts DOM querySelector
+         *
+         * @param  {DOM Node || DOM Document} node
+         * @param  {String} selector
+         * @return {DOM Node}
+         */
+        querySelector: function(docNode, selector) {
+            return docNode.querySelector( selector );
+        },
 
 
-		/**
-		 * get value of a Node attribute as an array
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @return {Array}
-		 */
-		getAttributeList: function(node, attributeName) {
-			var out = [],
-				attList;
+        /**
+         * get value of a Node attribute as an array
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @return {Array}
+         */
+        getAttributeList: function(node, attributeName) {
+            var out = [],
+                attList;
 
-			attList = node.getAttribute(attributeName);
-			if(attList && attList !== '') {
-				if(attList.indexOf(' ') > -1) {
-					out = attList.split(' ');
-				} else {
-					out.push(attList);
-				}
-			}
-			return out;
-		},
+            attList = node.getAttribute(attributeName);
+            if(attList && attList !== '') {
+                if(attList.indexOf(' ') > -1) {
+                    out = attList.split(' ');
+                } else {
+                    out.push(attList);
+                }
+            }
+            return out;
+        },
 
 
-		/**
-		 * gets all child nodes with a given attribute
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @return {NodeList}
-		 */
-		getNodesByAttribute: function(node, attributeName) {
-			var selector = '[' + attributeName + ']';
-			return node.querySelectorAll(selector);
-		},
+        /**
+         * gets all child nodes with a given attribute
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @return {NodeList}
+         */
+        getNodesByAttribute: function(node, attributeName) {
+            var selector = '[' + attributeName + ']';
+            return node.querySelectorAll(selector);
+        },
 
 
-		/**
-		 * gets all child nodes with a given attribute containing a given value
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {String} attributeName
-		 * @return {DOM NodeList}
-		 */
-		getNodesByAttributeValue: function(rootNode, name, value) {
-			var arr = [],
-				x = 0,
-				i,
-				out = [];
+        /**
+         * gets all child nodes with a given attribute containing a given value
+         *
+         * @param  {DOM Node} node
+         * @param  {String} attributeName
+         * @return {DOM NodeList}
+         */
+        getNodesByAttributeValue: function(rootNode, name, value) {
+            var arr = [],
+                x = 0,
+                i,
+                out = [];
 
-			arr = this.getNodesByAttribute(rootNode, name);
-			if(arr) {
-				i = arr.length;
-				while(x < i) {
-					if(this.hasAttributeValue(arr[x], name, value)) {
-						out.push(arr[x]);
-					}
-					x++;
-				}
-			}
-			return out;
-		},
+            arr = this.getNodesByAttribute(rootNode, name);
+            if(arr) {
+                i = arr.length;
+                while(x < i) {
+                    if(this.hasAttributeValue(arr[x], name, value)) {
+                        out.push(arr[x]);
+                    }
+                    x++;
+                }
+            }
+            return out;
+        },
 
 
-		/**
-		 * gets attribute value from controlled list of tags
-		 *
-		 * @param  {Array} tagNames
-		 * @param  {String} attributeName
-		 * @return {String || null}
-		 */
-		getAttrValFromTagList: function(node, tagNames, attributeName) {
-			var i = tagNames.length;
+        /**
+         * gets attribute value from controlled list of tags
+         *
+         * @param  {Array} tagNames
+         * @param  {String} attributeName
+         * @return {String || null}
+         */
+        getAttrValFromTagList: function(node, tagNames, attributeName) {
+            var i = tagNames.length;
 
-			while(i--) {
-				if(node.tagName.toLowerCase() === tagNames[i]) {
-					var attrValue = this.getAttribute(node, attributeName);
-					if(attrValue && attrValue !== '') {
-						return attrValue;
-					}
-				}
-			}
-			return null;
-		},
+            while(i--) {
+                if(node.tagName.toLowerCase() === tagNames[i]) {
+                    var attrValue = this.getAttribute(node, attributeName);
+                    if(attrValue && attrValue !== '') {
+                        return attrValue;
+                    }
+                }
+            }
+            return null;
+        },
 
 
-	   /**
-		 * get node if it has no siblings. CSS equivalent is :only-child
-		 *
-		 * @param  {DOM Node} rootNode
-		 * @param  {Array} tagNames
-		 * @return {DOM Node || null}
-		 */
-		getSingleDescendant: function(node){
-			return this.getDescendant( node, null, false );
-		},
+        /**
+         * get node if it has no siblings. CSS equivalent is :only-child
+         *
+         * @param  {DOM Node} rootNode
+         * @param  {Array} tagNames
+         * @return {DOM Node || null}
+         */
+        getSingleDescendant: function(node){
+            return this.getDescendant( node, null, false );
+        },
+
+
+        /**
+         * get node if it has no siblings of the same type. CSS equivalent is :only-of-type
+         *
+         * @param  {DOM Node} rootNode
+         * @param  {Array} tagNames
+         * @return {DOM Node || null}
+         */
+        getSingleDescendantOfType: function(node, tagNames){
+            return this.getDescendant( node, tagNames, true );
+        },
 
 
         /**
-		 * get node if it has no siblings of the same type. CSS equivalent is :only-of-type
-		 *
-		 * @param  {DOM Node} rootNode
-		 * @param  {Array} tagNames
-		 * @return {DOM Node || null}
-		 */
-		getSingleDescendantOfType: function(node, tagNames){
-			return this.getDescendant( node, tagNames, true );
-		},
+         * get child node limited by presence of siblings - either CSS :only-of-type or :only-child
+         *
+         * @param  {DOM Node} rootNode
+         * @param  {Array} tagNames
+         * @return {DOM Node || null}
+         */
+        getDescendant: function( node, tagNames, onlyOfType ){
+            var i = node.children.length,
+                countAll = 0,
+                countOfType = 0,
+                child,
+                out = null;
+
+            while(i--) {
+                child = node.children[i];
+                if(child.nodeType === 1) {
+                    if(tagNames){
+                        // count just only-of-type
+                        if(this.hasTagName(child, tagNames)){
+                            out = child;
+                            countOfType++;
+                        }
+                    }else{
+                        // count all elements
+                        out = child;
+                        countAll++;
+                    }
+                }
+            }
+            if(onlyOfType === true){
+                return (countOfType === 1)? out : null;
+            }else{
+                return (countAll === 1)? out : null;
+            }
+        },
 
 
-	    /**
-		 * get child node limited by presence of siblings - either CSS :only-of-type or :only-child
-		 *
-		 * @param  {DOM Node} rootNode
-		 * @param  {Array} tagNames
-		 * @return {DOM Node || null}
-		 */
-		getDescendant: function( node, tagNames, onlyOfType ){
-			var i = node.children.length,
-				countAll = 0,
-				countOfType = 0,
-				child,
-				out = null;
-
-			while(i--) {
-				child = node.children[i];
-				if(child.nodeType === 1) {
-					if(tagNames){
-						// count just only-of-type
-						if(this.hasTagName(child, tagNames)){
-							out = child;
-							countOfType++;
-						}
-					}else{
-						// count all elements
-						out = child;
-						countAll++;
-					}
-				}
-			}
-			if(onlyOfType === true){
-				return (countOfType === 1)? out : null;
-			}else{
-				return (countAll === 1)? out : null;
-			}
-		},
+        /**
+         * is a node one of a list of tags
+         *
+         * @param  {DOM Node} rootNode
+         * @param  {Array} tagNames
+         * @return {Boolean}
+         */
+        hasTagName: function(node, tagNames){
+            var i = tagNames.length;
+            while(i--) {
+                if(node.tagName.toLowerCase() === tagNames[i]) {
+                    return true;
+                }
+            }
+            return false;
+        },
 
 
-	   /**
-		 * is a node one of a list of tags
-		 *
-		 * @param  {DOM Node} rootNode
-		 * @param  {Array} tagNames
-		 * @return {Boolean}
-		 */
-		hasTagName: function(node, tagNames){
-			var i = tagNames.length;
-			while(i--) {
-				if(node.tagName.toLowerCase() === tagNames[i]) {
-					return true;
-				}
-			}
-			return false;
-		},
+        /**
+         * abstracts DOM appendChild
+         *
+         * @param  {DOM Node} node
+         * @param  {DOM Node} childNode
+         * @return {DOM Node}
+         */
+        appendChild: function(node, childNode){
+            return node.appendChild(childNode);
+        },
 
 
-	   /**
-		 * abstracts DOM appendChild
-		 *
-		 * @param  {DOM Node} node
-		 * @param  {DOM Node} childNode
-		 * @return {DOM Node}
-		 */
-		appendChild: function(node, childNode){
-			return node.appendChild(childNode);
-		},
+        /**
+         * abstracts DOM removeChild
+         *
+         * @param  {DOM Node} childNode
+         * @return {DOM Node || null}
+         */
+        removeChild: function(childNode){
+            if (childNode.parentNode) {
+                return childNode.parentNode.removeChild(childNode);
+            }else{
+                return null;
+            }
+        },
 
 
-	   /**
-		 * abstracts DOM removeChild
-		 *
-		 * @param  {DOM Node} childNode
-		 * @return {DOM Node || null}
-		 */
-		removeChild: function(childNode){
-			if (childNode.parentNode) {
-				return childNode.parentNode.removeChild(childNode);
-			}else{
-				return null;
-			}
-		},
+        /**
+         * abstracts DOM cloneNode
+         *
+         * @param  {DOM Node} node
+         * @return {DOM Node}
+         */
+        clone: function(node) {
+            var newNode = node.cloneNode(true);
+            newNode.removeAttribute('id');
+            return newNode;
+        },
 
 
-		/**
-		 * abstracts DOM cloneNode
-		 *
-		 * @param  {DOM Node} node
-		 * @return {DOM Node}
-		 */
-		clone: function(node) {
-			var newNode = node.cloneNode(true);
-			newNode.removeAttribute('id');
-			return newNode;
-		},
+        /**
+         * gets the text of a node
+         *
+         * @param  {DOM Node} node
+         * @return {String}
+         */
+        getElementText: function( node ){
+            if(node && node.data){
+                return node.data;
+            }else{
+                return '';
+            }
+        },
 
 
-		/**
-		 * gets the text of a node
-		 *
-		 * @param  {DOM Node} node
-		 * @return {String}
-		 */
-		getElementText: function( node ){
-			if(node && node.data){
-				return node.data;
-			}else{
-				return '';
-			}
-		},
+        /**
+         * gets the attributes of a node - ordered by sequence in html
+         *
+         * @param  {DOM Node} node
+         * @return {Array}
+         */
+        getOrderedAttributes: function( node ){
+            var nodeStr = node.outerHTML,
+                attrs = [];
+
+            for (var i = 0; i < node.attributes.length; i++) {
+                var attr = node.attributes[i];
+                    attr.indexNum = nodeStr.indexOf(attr.name);
+
+                attrs.push( attr );
+            }
+            return attrs.sort( modules.utils.sortObjects( 'indexNum' ) );
+        },
 
 
-		/**
-		 * gets the attributes of a node - ordered by sequence in html
-		 *
-		 * @param  {DOM Node} node
-		 * @return {Array}
-		 */
-		getOrderedAttributes: function( node ){
-			var nodeStr = node.outerHTML,
-				attrs = [];
-
-			for (var i = 0; i < node.attributes.length; i++) {
-				var attr = node.attributes[i];
-					attr.indexNum = nodeStr.indexOf(attr.name);
-
-				attrs.push( attr );
-			}
-			return attrs.sort( modules.utils.sortObjects( 'indexNum' ) );
-		},
+        /**
+         * decodes html entities in given text
+         *
+         * @param  {DOM Document} doc
+         * @param  String} text
+         * @return {String}
+         */
+        decodeEntities: function( doc, text ){
+            //return text;
+            return doc.createTextNode( text ).nodeValue;
+        },
 
 
-		/**
-		 * decodes html entities in given text
-		 *
-		 * @param  {DOM Document} doc
-		 * @param  String} text
-		 * @return {String}
-		 */
-		decodeEntities: function( doc, text ){
-			//return text;
-			return doc.createTextNode( text ).nodeValue;
-		},
+        /**
+         * clones a DOM document
+         *
+         * @param  {DOM Document} document
+         * @return {DOM Document}
+         */
+        cloneDocument: function( document ){
+            var newNode,
+                newDocument = null;
+
+            if( this.canCloneDocument( document )){
+                newDocument = document.implementation.createHTMLDocument('');
+                newNode = newDocument.importNode( document.documentElement, true );
+                newDocument.replaceChild(newNode, newDocument.querySelector('html'));
+            }
+            return (newNode && newNode.nodeType && newNode.nodeType === 1)? newDocument : document;
+        },
 
 
-		/**
-		 * clones a DOM document
-		 *
-		 * @param  {DOM Document} document
-		 * @return {DOM Document}
-		 */
-		cloneDocument: function( document ){
-			var newNode,
-				newDocument = null;
-
-			if( this.canCloneDocument( document )){
-				newDocument = document.implementation.createHTMLDocument('');
-				newNode = newDocument.importNode( document.documentElement, true );
-				newDocument.replaceChild(newNode, newDocument.querySelector('html'));
-			}
-			return (newNode && newNode.nodeType && newNode.nodeType === 1)? newDocument : document;
-		},
+        /**
+         * can environment clone a DOM document
+         *
+         * @param  {DOM Document} document
+         * @return {Boolean}
+         */
+        canCloneDocument: function( document ){
+            return (document && document.importNode && document.implementation && document.implementation.createHTMLDocument);
+        },
 
 
-		/**
-		 * can environment clone a DOM document
-		 *
-		 * @param  {DOM Document} document
-		 * @return {Boolean}
-		 */
-		canCloneDocument: function( document ){
-			return (document && document.importNode && document.implementation && document.implementation.createHTMLDocument);
-		},
+        /**
+         * get the child index of a node. Used to create a node path
+         *
+         *   @param  {DOM Node} node
+         *   @return {Int}
+         */
+        getChildIndex: function (node) {
+            var parent = node.parentNode,
+                i = -1,
+                child;
+            while (parent && (child = parent.childNodes[++i])){
+                 if (child === node){
+                     return i;
+                 }
+            }
+            return -1;
+        },
 
 
-		/**
-		 * get the child index of a node. Used to create a node path
-		 *
-		 *   @param  {DOM Node} node
-		 *   @return {Int}
-		 */
-		getChildIndex: function (node) {
-		  	var parent = node.parentNode,
-		  		i = -1,
-		  		child;
-	  		while (parent && (child = parent.childNodes[++i])){
-				 if (child === node){
-					 return i;
-				 }
-			}
-	  		return -1;
-		},
-
+        /**
+         * get a node's path
+         *
+         *   @param  {DOM Node} node
+         *   @return {Array}
+         */
+        getNodePath: function  (node) {
+            var parent = node.parentNode,
+                path = [],
+                index = this.getChildIndex(node);
 
-		/**
-		 * get a node's path
-		 *
-		 *   @param  {DOM Node} node
-		 *   @return {Array}
-		 */
-		getNodePath: function  (node) {
-		  	var parent = node.parentNode,
-			  	path = [],
-			  	index = this.getChildIndex(node);
-
-		  if(parent && (path = this.getNodePath(parent))){
-			   if(index > -1){
-				   path.push(index);
-			   }
-		  }
-		  return path;
-		},
+          if(parent && (path = this.getNodePath(parent))){
+               if(index > -1){
+                   path.push(index);
+               }
+          }
+          return path;
+        },
 
 
-		/**
-		 * get a node from a path.
-		 *
-		 *   @param  {DOM document} document
-		 *   @param  {Array} path
-		 *   @return {DOM Node}
-		 */
-		getNodeByPath: function (document, path) {
-		  	var node = document.documentElement,
-		  		i = 0,
-		  		index;
-		  while ((index = path[++i]) > -1){
-			  node = node.childNodes[index];
-		  }
-		  return node;
-		},
+        /**
+         * get a node from a path.
+         *
+         *   @param  {DOM document} document
+         *   @param  {Array} path
+         *   @return {DOM Node}
+         */
+        getNodeByPath: function (document, path) {
+            var node = document.documentElement,
+                i = 0,
+                index;
+          while ((index = path[++i]) > -1){
+              node = node.childNodes[index];
+          }
+          return node;
+        },
 
 
-		/**
-		* get an array/nodeList of child nodes
-		*
-		*   @param  {DOM node} node
-		*   @return {Array}
-		*/
-		getChildren: function( node ){
-			return node.children;
-		},
+        /**
+         * get an array/nodeList of child nodes
+         *
+         *   @param  {DOM node} node
+         *   @return {Array}
+         */
+        getChildren: function( node ){
+            return node.children;
+        },
 
 
-		/**
-		* create a node
-		*
-		*   @param  {String} tagName
-		*   @return {DOM node}
-		*/
-		createNode: function( tagName ){
-			return this.document.createElement(tagName);
-		},
+        /**
+         * create a node
+         *
+         *   @param  {String} tagName
+         *   @return {DOM node}
+         */
+        createNode: function( tagName ){
+            return this.document.createElement(tagName);
+        },
 
 
-		/**
-		* create a node with text content
-		*
-		*   @param  {String} tagName
-		*   @param  {String} text
-		*   @return {DOM node}
-		*/
-		createNodeWithText: function( tagName, text ){
-			var node = this.document.createElement(tagName);
-			node.innerHTML = text;
-			return node;
-		}
+        /**
+         * create a node with text content
+         *
+         *   @param  {String} tagName
+         *   @param  {String} text
+         *   @return {DOM node}
+         */
+        createNodeWithText: function( tagName, text ){
+            var node = this.document.createElement(tagName);
+            node.innerHTML = text;
+            return node;
+        }
 
 
 
-	};
+    };
 
-	return modules;
+    return modules;
 
 } (Modules || {}));
--- a/toolkit/components/microformats/test/standards-tests/mf-mixed-h-card-mixedpropertries.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-mixed-h-card-mixedpropertries.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<div class=\"h-card\">\n    <p>\n        <a class=\"p-name p-org u-url\" href=\"http://mozilla.org/\">Mozilla Foundation</a>\n        <img class=\"logo\" src=\"../logo.jpg\"/>\n    </p>\n    <p class=\"adr\">\n        <span class=\"street-address\">665 3rd St.</span>  \n        <span class=\"extended-address\">Suite 207</span>  \n        <span class=\"locality\">San Francisco</span>,  \n        <span class=\"region\">CA</span>  \n        <span class=\"postal-code\">94107</span>  \n        <span class=\"p-country-name\">U.S.A.</span>  \n    </p>\n</div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Mozilla Foundation"],"org":["Mozilla Foundation"],"url":["http://mozilla.org/"],"adr":[{"value":"665 3rd St.  \n        Suite 207  \n        San Francisco,  \n        CA  \n        94107  \n        U.S.A.","type":["h-adr"],"properties":{"street-address":["665 3rd St."],"extended-address":["Suite 207"],"locality":["San Francisco"],"region":["CA"],"postal-code":["94107"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('mixedpropertries', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-mixed-h-card-tworoots.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-mixed-h-card-tworoots.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<p class=\"h-card vcard\">Frances Berriman</p>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Frances Berriman"]}}],"rels":{},"rel-urls":{}};
 
    it('tworoots', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-mixed-h-entry-mixedroots.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-mixed-h-entry-mixedroots.js
@@ -11,17 +11,17 @@ describe('h-entry', function() {
    var htmlFragment = "<!-- simplified version of http://aaronparecki.com/notes/2013/10/18/2/realtimeconf-mapattack -->\n<base href=\"http://aaronparecki.com/\" />\n\n<div class=\"h-entry\">\n  <div class=\"h-card vcard author p-author\">\n    <img class=\"photo logo u-photo u-logo\" src=\"https://aaronparecki.com/images/aaronpk.png\" alt=\"Aaron Parecki\"/>\n    <a href=\"https://aaronparecki.com/\" rel=\"author\" class=\"u-url u-uid url\">aaronparecki.com</a>\n    <a class=\"p-name fn value\" href=\"https://aaronparecki.com/\">Aaron Parecki</a>\n    <a href=\"https://plus.google.com/117847912875913905493\" rel=\"author\" class=\"google-profile\">Aaron Parecki</a>\n  </div>\n  <div class=\"entry-content e-content p-name\">Did you play\n    <a href=\"http://twitter.com/playmapattack\">@playmapattack</a>at\n    <a href=\"/tag/realtimeconf\">#<span class=\"p-category\">realtimeconf</span></a>? Here is some more info about how we built it!\n    <a href=\"http://pdx.esri.com/blog/2013/10/17/introducting-mapattack/\"><span class=\"protocol\">http://</span>pdx.esri.com/blog/2013/10/17/introducting-mapattack/</a>\n  </div>\n</div>";
    var expected = {"items":[{"type":["h-entry"],"properties":{"author":[{"value":"aaronparecki.com\n    Aaron Parecki\n    Aaron Parecki","type":["h-card"],"properties":{"photo":["https://aaronparecki.com/images/aaronpk.png"],"logo":["https://aaronparecki.com/images/aaronpk.png"],"url":["https://aaronparecki.com/"],"uid":["https://aaronparecki.com/"],"name":["Aaron Parecki"]}}],"content":[{"value":"Did you play\n    @playmapattackat\n    #realtimeconf? Here is some more info about how we built it!\n    http://pdx.esri.com/blog/2013/10/17/introducting-mapattack/","html":"Did you play\n    <a href=\"http://twitter.com/playmapattack\">@playmapattack</a>at\n    <a href=\"http://aaronparecki.com/tag/realtimeconf\">#<span class=\"p-category\">realtimeconf</span></a>? Here is some more info about how we built it!\n    <a href=\"http://pdx.esri.com/blog/2013/10/17/introducting-mapattack/\"><span class=\"protocol\">http://</span>pdx.esri.com/blog/2013/10/17/introducting-mapattack/</a>\n  "}],"name":["Did you play\n    @playmapattackat\n    #realtimeconf? Here is some more info about how we built it!\n    http://pdx.esri.com/blog/2013/10/17/introducting-mapattack/"],"category":["realtimeconf"]}}],"rels":{"author":["https://aaronparecki.com/","https://plus.google.com/117847912875913905493"]},"rel-urls":{"https://aaronparecki.com/":{"text":"aaronparecki.com","rels":["author"]},"https://plus.google.com/117847912875913905493":{"text":"Aaron Parecki","rels":["author"]}}};
 
    it('mixedroots', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-mixed-h-resume-mixedroots.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-mixed-h-resume-mixedroots.js
@@ -11,17 +11,17 @@ describe('h-resume', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<div class=\"h-resume\">\n    <div class=\"p-contact vcard\">\n        <p class=\"fn\">Tim Berners-Lee</p>\n        <p class=\"title\">Director of the World Wide Web Foundation</p>\n    </div>\n    <p class=\"p-summary\">Invented the World Wide Web.</p><hr />\n    <div class=\"p-experience vevent vcard\">\n        <p class=\"title\">Director</p>\n        <p><a class=\"fn org summary url\" href=\"http://www.webfoundation.org/\">World Wide Web Foundation</a></p>\n        <p>\n            <time class=\"dtstart\" datetime=\"2009-01-18\">Jan 2009</time> – Present\n            <time class=\"duration\" datetime=\"P2Y11M\">(2 years 11 month)</time>\n        </p>\n    </div>\n</div>";
    var expected = {"items":[{"type":["h-resume"],"properties":{"contact":[{"value":"Tim Berners-Lee","type":["h-card"],"properties":{"name":["Tim Berners-Lee"],"job-title":["Director of the World Wide Web Foundation"]}}],"summary":["Invented the World Wide Web."],"experience":[{"value":"World Wide Web Foundation","type":["h-event","h-card"],"properties":{"job-title":["Director"],"name":["World Wide Web Foundation"],"org":["World Wide Web Foundation"],"url":["http://www.webfoundation.org/"],"start":["2009-01-18"],"duration":["P2Y11M"]}}],"name":["Tim Berners-Lee\n        Director of the World Wide Web Foundation\n    \n    Invented the World Wide Web.\n    \n        Director\n        World Wide Web Foundation\n        \n            Jan 2009 – Present\n            (2 years 11 month)"]}}],"rels":{},"rel-urls":{}};
 
    it('mixedroots', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-adr-simpleproperties.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-adr-simpleproperties.js
@@ -11,17 +11,17 @@ describe('adr', function() {
    var htmlFragment = "<p class=\"adr\">\n    <span class=\"street-address\">665 3rd St.</span>  \n    <span class=\"extended-address\">Suite 207</span>  \n    <span class=\"locality\">San Francisco</span>,  \n    <span class=\"region\">CA</span>  \n    <span class=\"postal-code\">94107</span>  \n    <span class=\"country-name\">U.S.A.</span>  \n</p>";
    var expected = {"items":[{"type":["h-adr"],"properties":{"street-address":["665 3rd St."],"extended-address":["Suite 207"],"locality":["San Francisco"],"region":["CA"],"postal-code":["94107"],"country-name":["U.S.A."]}}],"rels":{},"rel-urls":{}};
 
    it('simpleproperties', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-geo-abbrpattern.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-geo-abbrpattern.js
@@ -11,17 +11,17 @@ describe('geo', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<p class=\"geo\">\n <abbr class=\"latitude\" title=\"37.408183\">N 37° 24.491</abbr>,  \n <abbr class=\"longitude\" title=\"-122.13855\">W 122° 08.313</abbr>\n</p>";
    var expected = {"items":[{"type":["h-geo"],"properties":{"latitude":["37.408183"],"longitude":["-122.13855"]}}],"rels":{},"rel-urls":{}};
 
    it('abbrpattern', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-geo-hidden.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-geo-hidden.js
@@ -11,17 +11,17 @@ describe('geo', function() {
    var htmlFragment = "<p>\n    <span class=\"geo\">The Bricklayer's Arms\n        <span class=\"latitude\">\n            <span class=\"value-title\" title=\"51.513458\"> </span> \n        </span>\n        <span class=\"longitude\">\n            <span class=\"value-title\" title=\"-0.14812\"> </span>\n        </span>\n    </span>\n</p>";
    var expected = {"items":[{"type":["h-geo"],"properties":{"latitude":["51.513458"],"longitude":["-0.14812"]}}],"rels":{},"rel-urls":{}};
 
    it('hidden', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-geo-simpleproperties.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-geo-simpleproperties.js
@@ -11,17 +11,17 @@ describe('geo', function() {
    var htmlFragment = "We are meeting at \n<span class=\"geo\"> \n    <span>The Bricklayer's Arms</span>\n    (Geo: <span class=\"latitude\">51.513458</span>:\n    <span class=\"longitude\">-0.14812</span>)\n</span>";
    var expected = {"items":[{"type":["h-geo"],"properties":{"latitude":["51.513458"],"longitude":["-0.14812"]}}],"rels":{},"rel-urls":{}};
 
    it('simpleproperties', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-geo-valuetitleclass.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-geo-valuetitleclass.js
@@ -11,17 +11,17 @@ describe('geo', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<p>\n    <span class=\"geo\">\n        <span class=\"latitude\">\n            <span class=\"value-title\" title=\"51.513458\">N 51° 51.345</span>, \n        </span>\n        <span class=\"longitude\">\n            <span class=\"value-title\" title=\"-0.14812\">W -0° 14.812</span>\n        </span>\n    </span>\n</p>";
    var expected = {"items":[{"type":["h-geo"],"properties":{"latitude":["51.513458"],"longitude":["-0.14812"]}}],"rels":{},"rel-urls":{}};
 
    it('valuetitleclass', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-ampm.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-ampm.js
@@ -11,17 +11,17 @@ describe('hcalendar', function() {
    var htmlFragment = "<div class=\"vevent\">\n    <span class=\"summary\">The 4th Microformat party</span> will be on \n    <ul>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">07:00:00pm \n        </span></li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">07:00:00am \n        </span></li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">07:00pm \n        </span></li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">07pm \n        </span></li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">7pm \n        </span></li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">7:00pm \n        </span></li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">07:00p.m. \n        </span></li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">07:00PM \n        </span></li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">7:00am \n        </span></li>\n    </ul>\n</div>";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["The 4th Microformat party"],"start":["2009-06-26 19:00:00","2009-06-26 07:00:00","2009-06-26 19:00","2009-06-26 19","2009-06-26 19","2009-06-26 19:00","2009-06-26 19:00","2009-06-26 19:00","2009-06-26 07:00"]}}],"rels":{},"rel-urls":{}};
 
    it('ampm', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-attendees.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-attendees.js
@@ -11,17 +11,17 @@ describe('hcalendar', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<div class=\"vevent\">\n    <span class=\"summary\">CPJ Online Press Freedom Summit</span>\n    (<time class=\"dtstart\" datetime=\"2012-10-10\">10 Nov 2012</time>) in\n    <span class=\"location\">San Francisco</span>.\n    Attendees:\n    <ul>\n        <li class=\"attendee vcard\"><span class=\"fn\">Brian Warner</span></li>\n        <li class=\"attendee vcard\"><span class=\"fn\">Kyle Machulis</span></li>\n        <li class=\"attendee vcard\"><span class=\"fn\">Tantek Çelik</span></li>\n        <li class=\"attendee vcard\"><span class=\"fn\">Sid Sutter</span></li>\n    </ul>\n</div>\n";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["CPJ Online Press Freedom Summit"],"start":["2012-10-10"],"location":["San Francisco"],"attendee":[{"value":"Brian Warner","type":["h-card"],"properties":{"name":["Brian Warner"]}},{"value":"Kyle Machulis","type":["h-card"],"properties":{"name":["Kyle Machulis"]}},{"value":"Tantek Çelik","type":["h-card"],"properties":{"name":["Tantek Çelik"]}},{"value":"Sid Sutter","type":["h-card"],"properties":{"name":["Sid Sutter"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('attendees', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-combining.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-combining.js
@@ -11,17 +11,17 @@ describe('hcalendar', function() {
    var htmlFragment = "<div class=\"vevent\">\n  <a class=\"summary url\" href=\"http://indiewebcamp.com/2012\">\n    IndieWebCamp 2012\n  </a>\n  from <time class=\"dtstart\">2012-06-30</time> \n  to <time class=\"dtend\">2012-07-01</time> at \n  <span class=\"location vcard\">\n    <a class=\"fn org url\" href=\"http://geoloqi.com/\">Geoloqi</a>, \n    <span class=\"adr\">\n        <span class=\"street-address\">920 SW 3rd Ave. Suite 400</span>, \n        <span class=\"locality\">Portland</span>, \n        <abbr class=\"region\" title=\"Oregon\">OR</abbr>\n    </span>\n  </span>\n</div>";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["IndieWebCamp 2012"],"url":["http://indiewebcamp.com/2012"],"start":["2012-06-30"],"end":["2012-07-01"],"location":[{"value":"Geoloqi","type":["h-card"],"properties":{"name":["Geoloqi"],"org":["Geoloqi"],"url":["http://geoloqi.com/"],"adr":[{"value":"920 SW 3rd Ave. Suite 400, \n        Portland, \n        OR","type":["h-adr"],"properties":{"street-address":["920 SW 3rd Ave. Suite 400"],"locality":["Portland"],"region":["Oregon"]}}]}}]}}],"rels":{},"rel-urls":{}};
 
    it('combining', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-concatenate.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-concatenate.js
@@ -11,17 +11,17 @@ describe('hcalendar', function() {
    var htmlFragment = "<div class=\"vevent\">\n <span class=\"summary\">The 4th Microformat party</span> will be on \n <span class=\"dtstart\">\n  <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n  <time class=\"value\">19:00</time></span> to \n <span class=\"dtend\"><time class=\"value\">22:00</time></span>.\n</div>";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["The 4th Microformat party"],"start":["2009-06-26 19:00"],"end":["2009-06-26 22:00"]}}],"rels":{},"rel-urls":{}};
 
    it('concatenate', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-time.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcalendar-time.js
@@ -11,17 +11,17 @@ describe('hcalendar', function() {
    var htmlFragment = "<div class=\"vevent\">\n    <span class=\"summary\">The 4th Microformat party</span> will be on \n    <ul>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00:00-08:00</time> \n        </li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00:00-0800</time> \n        </li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00:00+0800</time> \n        </li> \n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00:00Z</time> \n        </li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00:00</time> \n        </li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00-08:00</time> \n        </li> \n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00+08:00</time> \n        </li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00z</time> \n        </li>\n        <li class=\"dtstart\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00</time> \n        </li>  \n        <li>\n            <time class=\"dtend\" datetime=\"2013-034\">3 February 2013</time>\n        </li>              \n    </ul>\n</div>";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["The 4th Microformat party"],"start":["2009-06-26 19:00:00-08:00","2009-06-26 19:00:00-08:00","2009-06-26 19:00:00+08:00","2009-06-26 19:00:00Z","2009-06-26 19:00:00","2009-06-26 19:00-08:00","2009-06-26 19:00+08:00","2009-06-26 19:00Z","2009-06-26 19:00"],"end":["2013-034"]}}],"rels":{},"rel-urls":{}};
 
    it('time', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-email.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-email.js
@@ -11,17 +11,17 @@ describe('hcard', function() {
    var htmlFragment = "<div class=\"vcard\">\n    <span class=\"fn\">John Doe</span> \n    <ul>\n        <li><a class=\"email\" href=\"mailto:john@example.com\">notthis@example.com</a></li>\n        <li>\n            <span class=\"email\">\n                <span class=\"type\">internet</span> \n                <a class=\"value\" href=\"mailto:john@example.com\">notthis@example.com</a>\n            </span>\n        </li> \n        <li><a class=\"email\" href=\"mailto:john@example.com?subject=parser-test\">notthis@example.com</a></li>\n        <li class=\"email\">john@example.com</li>\n    </ul>\n</div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["John Doe"],"email":["mailto:john@example.com","mailto:john@example.com","mailto:john@example.com?subject=parser-test","john@example.com"]}}],"rels":{},"rel-urls":{}};
 
    it('email', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-format.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-format.js
@@ -11,17 +11,17 @@ describe('hcard', function() {
    var htmlFragment = "<p class=\"vcard\">\n    <span class=\"profile-name fn n\">\n        <span class=\" given-name \">John</span> \n        <span class=\"FAMILY-NAME\">Doe</span> \n    </span>\n</p>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["John \n        Doe"],"given-name":["John"]}}],"rels":{},"rel-urls":{}};
 
    it('format', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-hyperlinkedphoto.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-hyperlinkedphoto.js
@@ -11,17 +11,17 @@ describe('hcard', function() {
    var htmlFragment = "<a class=\"vcard\" href=\"http://rohit.khare.org/\">\n        <img alt=\"Rohit Khare\" src=\"images/photo.gif\" />\n</a>";
    var expected = {"items":[{"type":["h-card"],"properties":{}}],"rels":{},"rel-urls":{}};
 
    it('hyperlinkedphoto', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-justahyperlink.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-justahyperlink.js
@@ -11,17 +11,17 @@ describe('hcard', function() {
    var htmlFragment = "<a class=\"vcard\" href=\"http://benward.me/\">Ben Ward</a>";
    var expected = {"items":[{"type":["h-card"],"properties":{}}],"rels":{},"rel-urls":{}};
 
    it('justahyperlink', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-justaname.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-justaname.js
@@ -11,17 +11,17 @@ describe('hcard', function() {
    var htmlFragment = "<p class=\"vcard\">Frances Berriman</p>";
    var expected = {"items":[{"type":["h-card"],"properties":{}}],"rels":{},"rel-urls":{}};
 
    it('justaname', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-multiple.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-multiple.js
@@ -11,17 +11,17 @@ describe('hcard', function() {
    var htmlFragment = "<base href=\"http://example.com\">\n    <div class=\"vcard\">\n    \n    <div class=\"fn n\"><span class=\"given-name\">John</span> <span class=\"family-name\">Doe</span></div>\n    <a class=\"sound\" href=\"http://www.madgex.com/johndoe.mpeg\">Pronunciation of my name</a>\n    <div><img class=\"photo\" src=\"images/photo.gif\" alt=\"Photo of John Doe\" /></div>\n\n    <p>Nicknames:</p>\n    <ul>\n        <li class=\"nickname\">Man with no name</li>\n        <li class=\"nickname\">Lost boy</li>\n    </ul>\n\n    <p>About:</p>\n    <p class=\"note\">John Doe is one of those names you always have issues with.</p>\n    <p class=\"note\">It can be a real problem booking a hotel room with the name John Doe.</p>\n\n    <p>Companies:</p>\n    <div>\n        <img class=\"logo\" src=\"images/logo.gif\" alt=\"Madgex company logo\" />\n        <img class=\"logo\" src=\"images/logo.gif\" alt=\"Web Feet Media company logo\" />\n    </div>\n    <ul>\n        <li><a class=\"url org\" href=\"http://www.madgex.com/\">Madgex</a> <span class=\"title\">Creative Director</span></li>\n        <li><a class=\"url org\" href=\"http://www.webfeetmedia.com/\">Web Feet Media Ltd</a> <span class=\"title\">Owner</span></li>\n    </ul>\n    \n    <p>Tags: \n    <a rel=\"tag\" class=\"category\" href=\"http://en.wikipedia.org/wiki/design\">design</a>, \n    <a rel=\"tag\" class=\"category\" href=\"http://en.wikipedia.org/wiki/development\">development</a> and\n    <a rel=\"tag\" class=\"category\" href=\"http://en.wikipedia.org/wiki/web\">web</a>\n    </p>\n    \n    <p>Phone numbers:</p>\n    <ul>\n        <li class=\"tel\">\n            <span class=\"type\">Work</span> (<span class=\"type\">pref</span>erred):\n            <span class=\"value\">+1 415 555 100</span>\n        </li>\n        <li class=\"tel\"><span class=\"type\">Home</span>: <span class=\"value\">+1 415 555 200</span></li>\n        <li class=\"tel\"><span class=\"type\">Postal</span>: <span class=\"value\">+1 415 555 300</span></li>\n    </ul>\n    \n    <p>Emails:</p>\n    <ul>\n        <li><a class=\"email\" href=\"mailto:john.doe@madgex.com\">John Doe at Madgex</a></li>\n        <li><a class=\"email\" href=\"mailto:john.doe@webfeetmedia.com\">John Doe at Web Feet Media</a></li>\n    </ul>\n    <p>John Doe uses <span class=\"mailer\">PigeonMail 2.1</span> or <span class=\"mailer\">Outlook 2007</span> for email.</p>\n\n    <p>Addresses:</p>\n    <ul>\n        <li class=\"label\">\n            <span class=\"adr\">\n                <span class=\"type\">Work</span>: \n                <span class=\"street-address\">North Street</span>, \n                <span class=\"locality\">Brighton</span>, \n                <span class=\"country-name\">United Kingdom</span>\n            </span>\n            \n        </li>\n        <li class=\"label\">\n            <span class=\"adr\">\n                <span class=\"type\">Home</span>: \n                <span class=\"street-address\">West Street</span>, \n                <span class=\"locality\">Brighton</span>, \n                <span class=\"country-name\">United Kingdom</span>\n            </span>\n        </li>\n    </ul>\n    \n    <p>In emergency contact: <span class=\"agent\">Jane Doe</span> or <span class=\"agent vcard\"><span class=\"fn\">Dave Doe</span></span>.</p>\n    <p>Key: <span class=\"key\">hd02$Gfu*d%dh87KTa2=23934532479</span></p>\n</div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["John Doe"],"given-name":["John"],"family-name":["Doe"],"sound":["http://www.madgex.com/johndoe.mpeg"],"photo":["http://example.com/images/photo.gif"],"nickname":["Man with no name","Lost boy"],"note":["John Doe is one of those names you always have issues with.","It can be a real problem booking a hotel room with the name John Doe."],"logo":["http://example.com/images/logo.gif","http://example.com/images/logo.gif"],"url":["http://www.madgex.com/","http://www.webfeetmedia.com/"],"org":["Madgex","Web Feet Media Ltd"],"job-title":["Creative Director","Owner"],"category":["design","development","web"],"tel":["+1 415 555 100","+1 415 555 200","+1 415 555 300"],"email":["mailto:john.doe@madgex.com","mailto:john.doe@webfeetmedia.com"],"mailer":["PigeonMail 2.1","Outlook 2007"],"label":["Work: \n                North Street, \n                Brighton, \n                United Kingdom","Home: \n                West Street, \n                Brighton, \n                United Kingdom"],"adr":[{"value":"Work: \n                North Street, \n                Brighton, \n                United Kingdom","type":["h-adr"],"properties":{"street-address":["North Street"],"locality":["Brighton"],"country-name":["United Kingdom"]}},{"value":"Home: \n                West Street, \n                Brighton, \n                United Kingdom","type":["h-adr"],"properties":{"street-address":["West Street"],"locality":["Brighton"],"country-name":["United Kingdom"]}}],"agent":["Jane Doe",{"value":"Dave Doe","type":["h-card"],"properties":{"name":["Dave Doe"]}}],"key":["hd02$Gfu*d%dh87KTa2=23934532479"]}}],"rels":{"tag":["http://en.wikipedia.org/wiki/design","http://en.wikipedia.org/wiki/development","http://en.wikipedia.org/wiki/web"]},"rel-urls":{"http://en.wikipedia.org/wiki/design":{"text":"design","rels":["tag"]},"http://en.wikipedia.org/wiki/development":{"text":"development","rels":["tag"]},"http://en.wikipedia.org/wiki/web":{"text":"web","rels":["tag"]}}};
 
    it('multiple', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-name.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-name.js
@@ -11,17 +11,17 @@ describe('hcard', function() {
    var htmlFragment = "<base href=\"http://example.com\">\n<div class=\"vcard\">\n    <div class=\"name\">\n        <span class=\"honorific-prefix\">Dr</span> \n        <span class=\"given-name\">John</span> \n        <abbr class=\"additional-name\" title=\"Peter\">P</abbr>  \n        <span class=\"family-name\">Doe</span> \n        <data class=\"honorific-suffix\" value=\"MSc\"></data>\n        <img class=\"photo honorific-suffix\" src=\"images/logo.gif\" alt=\"PHD\" />\n    </div>\n</div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"honorific-prefix":["Dr"],"given-name":["John"],"additional-name":["Peter"],"family-name":["Doe"],"honorific-suffix":["MSc","PHD"],"photo":["http://example.com/images/logo.gif"]}}],"rels":{},"rel-urls":{}};
 
    it('name', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-single.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hcard-single.js
@@ -11,17 +11,17 @@ describe('hcard', function() {
    var htmlFragment = "<div class=\"vcard\">\n        \n        <div class=\"fn n\"><span class=\"given-name sort-string\">John</span> Doe</div>\n        <div>Birthday: <abbr class=\"bday\" title=\"2000-01-01T00:00:00-08:00\">January 1st, 2000</abbr></div>\n        <div>Role: <span class=\"role\">Designer</span></div>\n        <div>Location: <abbr class=\"geo\" title=\"30.267991;-97.739568\">Brighton</abbr></div>\n        <div>Time zone: <abbr class=\"tz\" title=\"-05:00\">Eastern Standard Time</abbr></div>\n        \n        <div>Profile details:\n            <div>Profile id: <span class=\"uid\">http://example.com/profiles/johndoe</span></div>\n            <div>Details are: <span class=\"class\">Public</span></div>\n            <div>Last updated: <abbr class=\"rev\" title=\"2008-01-01T13:45:00\">January 1st, 2008 - 13:45</abbr></div>\n        </div>\n    </div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["John Doe"],"given-name":["John"],"sort-string":["John"],"bday":["2000-01-01 00:00:00-08:00"],"role":["Designer"],"geo":[{"value":"30.267991;-97.739568","type":["h-geo"],"properties":{"name":["30.267991;-97.739568"]}}],"tz":["-05:00"],"uid":["http://example.com/profiles/johndoe"],"class":["Public"],"rev":["2008-01-01 13:45:00"]}}],"rels":{},"rel-urls":{}};
 
    it('single', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hentry-summarycontent.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hentry-summarycontent.js
@@ -11,17 +11,17 @@ describe('hentry', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<div class=\"hentry\">\n    <h1><a class=\"entry-title\" href=\"http://microformats.org/2012/06/25/microformats-org-at-7\">microformats.org at 7</a></h1>\n    <div class=\"entry-content\">\n        <p class=\"entry-summary\">Last week the microformats.org community \n            celebrated its 7th birthday at a gathering hosted by Mozilla in \n            San Francisco and recognized accomplishments, challenges, and \n            opportunities.</p>\n\n        <p>The microformats tagline “humans first, machines second” \n            forms the basis of many of our \n            <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n            in that regard, we’d like to recognize a few people and \n            thank them for their years of volunteer service </p>\n    </div>  \n    <p>Updated \n        <time class=\"updated\" datetime=\"2012-06-25T17:08:26\">June 25th, 2012</time> by\n        <span class=\"author vcard\"><a class=\"fn url\" href=\"http://tantek.com/\">Tantek</a></span>\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-entry"],"properties":{"name":["microformats.org at 7"],"content":[{"value":"Last week the microformats.org community \n            celebrated its 7th birthday at a gathering hosted by Mozilla in \n            San Francisco and recognized accomplishments, challenges, and \n            opportunities.\n\n        The microformats tagline “humans first, machines second” \n            forms the basis of many of our \n            principles, and \n            in that regard, we’d like to recognize a few people and \n            thank them for their years of volunteer service","html":"\n        <p class=\"entry-summary\">Last week the microformats.org community \n            celebrated its 7th birthday at a gathering hosted by Mozilla in \n            San Francisco and recognized accomplishments, challenges, and \n            opportunities.</p>\n\n        <p>The microformats tagline “humans first, machines second” \n            forms the basis of many of our \n            <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n            in that regard, we’d like to recognize a few people and \n            thank them for their years of volunteer service </p>\n    "}],"summary":["Last week the microformats.org community \n            celebrated its 7th birthday at a gathering hosted by Mozilla in \n            San Francisco and recognized accomplishments, challenges, and \n            opportunities."],"updated":["2012-06-25 17:08:26"],"author":[{"value":"Tantek","type":["h-card"],"properties":{"name":["Tantek"],"url":["http://tantek.com/"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('summarycontent', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hfeed-simple.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hfeed-simple.js
@@ -11,17 +11,17 @@ describe('hfeed', function() {
    var htmlFragment = "<section class=\"hfeed\">\n\t<h1 class=\"name\">Microformats blog</h1>\n\t<span class=\"author vcard\"><a class=\"fn url\" href=\"http://tantek.com/\">Tantek</a></span>\n\t<a class=\"url\" href=\"http://microformats.org/blog\">permlink</a>\n\t<img class=\"photo\" src=\"photo.jpeg\"/>\n\t<p>\n\t\tTags: <a rel=\"tag\" href=\"tags/microformats\">microformats</a>, \n\t\t<a rel=\"tag\" href=\"tags/html\">html</a>\n\t</p>\n\t\n\t<div class=\"hentry\">\n\t    <h1><a class=\"entry-title\" rel=\"bookmark\" href=\"http://microformats.org/2012/06/25/microformats-org-at-7\">microformats.org at 7</a></h1>\n\t    <div class=\"entry-content\">\n\t        <p class=\"entry-summary\">Last week the microformats.org community \n\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t            San Francisco and recognized accomplishments, challenges, and \n\t            opportunities.</p>\n\t\n\t        <p>The microformats tagline “humans first, machines second” \n\t            forms the basis of many of our \n\t            <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n\t            in that regard, we’d like to recognize a few people and \n\t            thank them for their years of volunteer service </p>\n\t    </div>  \n\t    <p>Updated \n\t        <time class=\"updated\" datetime=\"2012-06-25T17:08:26\">June 25th, 2012</time>\n\t    </p>\n\t</div>\n\t\n</section>";
    var expected = {"items":[{"type":["h-feed"],"properties":{"author":[{"value":"Tantek","type":["h-card"],"properties":{"name":["Tantek"],"url":["http://tantek.com/"]}}],"url":["http://microformats.org/blog"],"photo":["http://example.com/photo.jpeg"],"category":["microformats","html"]},"children":[{"value":"microformats.org at 7\n\t    \n\t        Last week the microformats.org community \n\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t            San Francisco and recognized accomplishments, challenges, and \n\t            opportunities.\n\t\n\t        The microformats tagline “humans first, machines second” \n\t            forms the basis of many of our \n\t            principles, and \n\t            in that regard, we’d like to recognize a few people and \n\t            thank them for their years of volunteer service \n\t      \n\t    Updated \n\t        June 25th, 2012","type":["h-entry"],"properties":{"name":["microformats.org at 7"],"url":["http://microformats.org/2012/06/25/microformats-org-at-7"],"content":[{"value":"Last week the microformats.org community \n\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t            San Francisco and recognized accomplishments, challenges, and \n\t            opportunities.\n\t\n\t        The microformats tagline “humans first, machines second” \n\t            forms the basis of many of our \n\t            principles, and \n\t            in that regard, we’d like to recognize a few people and \n\t            thank them for their years of volunteer service","html":"\n\t        <p class=\"entry-summary\">Last week the microformats.org community \n\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t            San Francisco and recognized accomplishments, challenges, and \n\t            opportunities.</p>\n\t\n\t        <p>The microformats tagline “humans first, machines second” \n\t            forms the basis of many of our \n\t            <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n\t            in that regard, we’d like to recognize a few people and \n\t            thank them for their years of volunteer service </p>\n\t    "}],"summary":["Last week the microformats.org community \n\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t            San Francisco and recognized accomplishments, challenges, and \n\t            opportunities."],"updated":["2012-06-25 17:08:26"]}}]}],"rels":{"tag":["http://example.com/tags/microformats","http://example.com/tags/html"],"bookmark":["http://microformats.org/2012/06/25/microformats-org-at-7"]},"rel-urls":{"http://example.com/tags/microformats":{"text":"microformats","rels":["tag"]},"http://example.com/tags/html":{"text":"html","rels":["tag"]},"http://microformats.org/2012/06/25/microformats-org-at-7":{"text":"microformats.org at 7","rels":["bookmark"]}}};
 
    it('simple', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hnews-all.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hnews-all.js
@@ -11,17 +11,17 @@ describe('hnews', function() {
    var htmlFragment = "<div class=\"hnews\">\n    <div class=\"entry hentry\">\n        <h1><a class=\"entry-title\" rel=\"bookmark\" href=\"http://microformats.org/2012/06/25/microformats-org-at-7\">microformats.org at 7</a></h1>\n        <div class=\"entry-content\">\n            <p class=\"entry-summary\">Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.</p>\n\n            <p>The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service </p>\n        </div>  \n        <p>Updated \n            <time class=\"updated\" datetime=\"2012-06-25T17:08:26\">June 25th, 2012</time> by\n            <span class=\"author vcard\"><a class=\"fn url\" href=\"http://tantek.com/\">Tantek</a></span>\n        </p>\n    </div>\n\n    <p>\n        <span class=\"dateline vcard\">\n            <span class=\"adr\">\n                <span class=\"locality\">San Francisco</span>, \n                <span class=\"region\">CA</span> \n            </span>\n        </span>\n        (Geo: <span class=\"geo\">37.774921;-122.445202</span>) \n        <span class=\"source-org vcard\">\n            <a class=\"fn org url\" href=\"http://microformats.org/\">microformats.org</a>\n        </span>\n    </p>\n    <p>\n        <a rel=\"principles\" href=\"http://microformats.org/wiki/Category:public_domain_license\">Publishing policy</a>\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-news"],"properties":{"entry":[{"value":"microformats.org at 7","type":["h-entry"],"properties":{"name":["microformats.org at 7"],"url":["http://microformats.org/2012/06/25/microformats-org-at-7"],"content":[{"value":"Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.\n\n            The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                principles, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service","html":"\n            <p class=\"entry-summary\">Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.</p>\n\n            <p>The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service </p>\n        "}],"summary":["Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities."],"updated":["2012-06-25 17:08:26"],"author":[{"value":"Tantek","type":["h-card"],"properties":{"name":["Tantek"],"url":["http://tantek.com/"]}}]}}],"dateline":[{"value":"San Francisco, \n                CA","type":["h-card"],"properties":{"adr":[{"value":"San Francisco, \n                CA","type":["h-adr"],"properties":{"locality":["San Francisco"],"region":["CA"]}}]}}],"geo":[{"value":"37.774921;-122.445202","type":["h-geo"],"properties":{"name":["37.774921;-122.445202"]}}],"source-org":[{"value":"microformats.org","type":["h-card"],"properties":{"name":["microformats.org"],"org":["microformats.org"],"url":["http://microformats.org/"]}}],"principles":["http://microformats.org/wiki/Category:public_domain_license"]}}],"rels":{"bookmark":["http://microformats.org/2012/06/25/microformats-org-at-7"],"principles":["http://microformats.org/wiki/Category:public_domain_license"]},"rel-urls":{"http://microformats.org/2012/06/25/microformats-org-at-7":{"text":"microformats.org at 7","rels":["bookmark"]},"http://microformats.org/wiki/Category:public_domain_license":{"text":"Publishing policy","rels":["principles"]}}};
 
    it('all', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hnews-minimum.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hnews-minimum.js
@@ -11,17 +11,17 @@ describe('hnews', function() {
    var htmlFragment = "<div class=\"hnews\">\n    <div class=\"entry hentry\">\n        <h1><a class=\"entry-title\" rel=\"bookmark\" href=\"http://microformats.org/2012/06/25/microformats-org-at-7\">microformats.org at 7</a></h1>\n        <div class=\"entry-content\">\n            <p class=\"entry-summary\">Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.</p>\n\n            <p>The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service </p>\n        </div>  \n        <p>Updated \n            <time class=\"updated\" datetime=\"2012-06-25T17:08:26\">June 25th, 2012</time> by\n            <span class=\"author vcard\"><a class=\"fn url\" href=\"http://tantek.com/\">Tantek</a></span>\n        </p>\n    </div>\n\n    <p class=\"source-org vcard\">\n        <a class=\"fn org url\" href=\"http://microformats.org/\">microformats.org</a> \n    </p>\n</div>";
    var expected = {"items":[{"type":["h-news"],"properties":{"entry":[{"value":"microformats.org at 7","type":["h-entry"],"properties":{"name":["microformats.org at 7"],"url":["http://microformats.org/2012/06/25/microformats-org-at-7"],"content":[{"value":"Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.\n\n            The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                principles, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service","html":"\n            <p class=\"entry-summary\">Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.</p>\n\n            <p>The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service </p>\n        "}],"summary":["Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities."],"updated":["2012-06-25 17:08:26"],"author":[{"value":"Tantek","type":["h-card"],"properties":{"name":["Tantek"],"url":["http://tantek.com/"]}}]}}],"source-org":[{"value":"microformats.org","type":["h-card"],"properties":{"name":["microformats.org"],"org":["microformats.org"],"url":["http://microformats.org/"]}}]}}],"rels":{"bookmark":["http://microformats.org/2012/06/25/microformats-org-at-7"]},"rel-urls":{"http://microformats.org/2012/06/25/microformats-org-at-7":{"text":"microformats.org at 7","rels":["bookmark"]}}};
 
    it('minimum', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hproduct-aggregate.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hproduct-aggregate.js
@@ -11,17 +11,17 @@ describe('hproduct', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<div class=\"hproduct\">\n    <h2 class=\"fn\">Raspberry Pi</h2>\n    <img class=\"photo\" src=\"http://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/RaspberryPi.jpg/320px-RaspberryPi.jpg\" />\n    <p class=\"description\">The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It’s a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming.</p>\n    <a class=\"url\" href=\"http://www.raspberrypi.org/\">More info about the Raspberry Pi</a>\n    <p class=\"price\">£29.95</p>\n    <p class=\"review hreview-aggregate\">\n        <span class=\"rating\">\n            <span class=\"average value\">9.2</span> out of \n            <span class=\"best\">10</span> \n            based on <span class=\"count\">178</span> reviews\n        </span>\n    </p>\n    <p>Categories: \n        <a rel=\"tag\" href=\"http://en.wikipedia.org/wiki/computer\" class=\"category\">Computer</a>, \n        <a rel=\"tag\" href=\"http://en.wikipedia.org/wiki/education\" class=\"category\">Education</a>\n    </p>\n    <p class=\"brand vcard\">From: \n        <span class=\"fn org\">The Raspberry Pi Foundation</span> - \n        <span class=\"adr\">\n            <span class=\"locality\">Cambridge</span> \n            <span class=\"country-name\">UK</span>\n        </span>\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-product"],"properties":{"name":["Raspberry Pi"],"photo":["http://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/RaspberryPi.jpg/320px-RaspberryPi.jpg"],"description":[{"value":"The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It’s a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming.","html":"The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It’s a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming."}],"url":["http://www.raspberrypi.org/"],"price":["£29.95"],"review":[{"value":"9.2 out of \n            10 \n            based on 178 reviews","type":["h-review-aggregate"],"properties":{"rating":["9.2"],"average":["9.2"],"best":["10"],"count":["178"]}}],"category":["Computer","Education"],"brand":[{"value":"The Raspberry Pi Foundation","type":["h-card"],"properties":{"name":["The Raspberry Pi Foundation"],"org":["The Raspberry Pi Foundation"],"adr":[{"value":"Cambridge \n            UK","type":["h-adr"],"properties":{"locality":["Cambridge"],"country-name":["UK"]}}]}}]}}],"rels":{"tag":["http://en.wikipedia.org/wiki/computer","http://en.wikipedia.org/wiki/education"]},"rel-urls":{"http://en.wikipedia.org/wiki/computer":{"text":"Computer","rels":["tag"]},"http://en.wikipedia.org/wiki/education":{"text":"Education","rels":["tag"]}}};
 
    it('aggregate', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hproduct-simpleproperties.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hproduct-simpleproperties.js
@@ -11,17 +11,17 @@ describe('hproduct', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<div class=\"hproduct\">\n    <h2 class=\"fn\">Raspberry Pi</h2>\n    <img class=\"photo\" src=\"http://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/RaspberryPi.jpg/320px-RaspberryPi.jpg\" />\n    <p class=\"description\">The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It’s a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming.</p>\n    <a class=\"url\" href=\"http://www.raspberrypi.org/\">More info about the Raspberry Pi</a>\n    <p class=\"price\">£29.95</p>\n    <p class=\"review hreview\"><span class=\"rating\">4.5</span> out of 5</p>\n    <p>Categories: \n        <a rel=\"tag\" href=\"http://en.wikipedia.org/wiki/computer\" class=\"category\">Computer</a>, \n        <a rel=\"tag\" href=\"http://en.wikipedia.org/wiki/education\" class=\"category\">Education</a>\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-product"],"properties":{"name":["Raspberry Pi"],"photo":["http://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/RaspberryPi.jpg/320px-RaspberryPi.jpg"],"description":[{"value":"The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It’s a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming.","html":"The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It’s a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming."}],"url":["http://www.raspberrypi.org/"],"price":["£29.95"],"category":["Computer","Education"],"review":[{"value":"4.5 out of 5","type":["h-review"],"properties":{"rating":["4.5"]}}]}}],"rels":{"tag":["http://en.wikipedia.org/wiki/computer","http://en.wikipedia.org/wiki/education"]},"rel-urls":{"http://en.wikipedia.org/wiki/computer":{"text":"Computer","rels":["tag"]},"http://en.wikipedia.org/wiki/education":{"text":"Education","rels":["tag"]}}};
 
    it('simpleproperties', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hresume-affiliation.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hresume-affiliation.js
@@ -11,17 +11,17 @@ describe('hresume', function() {
    var htmlFragment = "<div class=\"hresume\">\n    <p>\n        <span class=\"contact vcard\"><span class=\"fn\">Tim Berners-Lee</span></span>, \n        <span class=\"summary\">invented the World Wide Web</span>.\n    </p>\n    Belongs to following groups:\n    <p>   \n        <a class=\"affiliation vcard\" href=\"http://www.w3.org/\">\n            <img class=\"fn photo\" alt=\"W3C\" src=\"http://www.w3.org/Icons/WWW/w3c_home_nb.png\" />\n        </a>\n    </p>   \n</div>";
    var expected = {"items":[{"type":["h-resume"],"properties":{"contact":[{"value":"Tim Berners-Lee","type":["h-card"],"properties":{"name":["Tim Berners-Lee"]}}],"summary":["invented the World Wide Web"],"affiliation":[{"type":["h-card"],"properties":{"name":["W3C"],"photo":["http://www.w3.org/Icons/WWW/w3c_home_nb.png"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('affiliation', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hresume-contact.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hresume-contact.js
@@ -11,17 +11,17 @@ describe('hresume', function() {
    var htmlFragment = "<div class=\"hresume\">\n    <div class=\"contact vcard\">\n        <p class=\"fn\">Tim Berners-Lee</p>\n        <p class=\"org\">MIT</p>\n        <p class=\"adr\">\n            <span class=\"street-address\">32 Vassar Street</span>, \n            <span class=\"extended-address\">Room 32-G524</span>, \n            <span class=\"locality\">Cambridge</span>,  \n            <span class=\"region\">MA</span> \n            <span class=\"postal-code\">02139</span>, \n            <span class=\"country-name\">USA</span>.  \n            (<span class=\"type\">Work</span>)\n        </p>\n        <p>Tel:<span class=\"tel\">+1 (617) 253 5702</span></p>\n        <p>Email:<a class=\"email\" href=\"mailto:timbl@w3.org\">timbl@w3.org</a></p>\n    </div>\n    <p class=\"summary\">Invented the World Wide Web.</p>\n</div>";
    var expected = {"items":[{"type":["h-resume"],"properties":{"contact":[{"value":"Tim Berners-Lee","type":["h-card"],"properties":{"name":["Tim Berners-Lee"],"org":["MIT"],"adr":[{"value":"32 Vassar Street, \n            Room 32-G524, \n            Cambridge,  \n            MA \n            02139, \n            USA.  \n            (Work)","type":["h-adr"],"properties":{"street-address":["32 Vassar Street"],"extended-address":["Room 32-G524"],"locality":["Cambridge"],"region":["MA"],"postal-code":["02139"],"country-name":["USA"]}}],"tel":["+1 (617) 253 5702"],"email":["mailto:timbl@w3.org"]}}],"summary":["Invented the World Wide Web."]}}],"rels":{},"rel-urls":{}};
 
    it('contact', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hresume-education.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hresume-education.js
@@ -11,17 +11,17 @@ describe('hresume', function() {
    var htmlFragment = "<div class=\"hresume\">\n    <div class=\"contact vcard\">\n        <p class=\"fn\">Tim Berners-Lee</p>\n        <p class=\"title\">Director of the World Wide Web Foundation</p>\n    </div>\n    <p class=\"summary\">Invented the World Wide Web.</p><hr />\n    <p class=\"education vevent vcard\">\n        <span class=\"fn summary org\">The Queen's College, Oxford University</span>, \n        <span class=\"description\">BA Hons (I) Physics</span> \n        <time class=\"dtstart\" datetime=\"1973-09\">1973</time> –\n        <time class=\"dtend\" datetime=\"1976-06\">1976</time>\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-resume"],"properties":{"contact":[{"value":"Tim Berners-Lee","type":["h-card"],"properties":{"name":["Tim Berners-Lee"],"job-title":["Director of the World Wide Web Foundation"]}}],"summary":["Invented the World Wide Web."],"education":[{"value":"The Queen's College, Oxford University","type":["h-event","h-card"],"properties":{"name":["The Queen's College, Oxford University"],"org":["The Queen's College, Oxford University"],"description":["BA Hons (I) Physics"],"start":["1973-09"],"end":["1976-06"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('education', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hresume-skill.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hresume-skill.js
@@ -11,17 +11,17 @@ describe('hresume', function() {
    var htmlFragment = "<div class=\"hresume\"> \n    <p>\n        <span class=\"contact vcard\"><span class=\"fn\">Tim Berners-Lee</span></span>, \n        <span class=\"summary\">invented the World Wide Web</span>.\n    </p>\n    Skills:     \n    <ul>\n        <li><a class=\"skill\" rel=\"tag\" href=\"http://example.com/skills/informationsystems\">information systems</a></li>\n        <li><a class=\"skill\" rel=\"tag\" href=\"http://example.com/skills/advocacy\">advocacy</a></li>\n        <li><a class=\"skill\" rel=\"tag\" href=\"http://example.com/skills/leadership\">leadership</a></li>\n    </ul>\n</div>";
    var expected = {"items":[{"type":["h-resume"],"properties":{"contact":[{"value":"Tim Berners-Lee","type":["h-card"],"properties":{"name":["Tim Berners-Lee"]}}],"summary":["invented the World Wide Web"],"skill":["information systems","advocacy","leadership"]}}],"rels":{"tag":["http://example.com/skills/informationsystems","http://example.com/skills/advocacy","http://example.com/skills/leadership"]},"rel-urls":{"http://example.com/skills/informationsystems":{"text":"information systems","rels":["tag"]},"http://example.com/skills/advocacy":{"text":"advocacy","rels":["tag"]},"http://example.com/skills/leadership":{"text":"leadership","rels":["tag"]}}};
 
    it('skill', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hresume-work.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hresume-work.js
@@ -11,17 +11,17 @@ describe('hresume', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<div class=\"hresume\">\n    <div class=\"contact vcard\">\n        <p class=\"fn\">Tim Berners-Lee</p>\n        <p class=\"title\">Director of the World Wide Web Foundation</p>\n    </div>\n    <p class=\"summary\">Invented the World Wide Web.</p><hr />\n    <div class=\"experience vevent vcard\">\n        <p class=\"title\">Director</p>\n        <p><a class=\"fn summary org url\" href=\"http://www.webfoundation.org/\">World Wide Web Foundation</a></p>\n        <p>\n            <time class=\"dtstart\" datetime=\"2009-01-18\">Jan 2009</time> – Present\n            <time class=\"duration\" datetime=\"P2Y11M\">(2 years 11 month)</time>\n        </p>\n    </div>\n</div>";
    var expected = {"items":[{"type":["h-resume"],"properties":{"contact":[{"value":"Tim Berners-Lee","type":["h-card"],"properties":{"name":["Tim Berners-Lee"],"job-title":["Director of the World Wide Web Foundation"]}}],"summary":["Invented the World Wide Web."],"experience":[{"value":"World Wide Web Foundation","type":["h-event","h-card"],"properties":{"job-title":["Director"],"name":["World Wide Web Foundation"],"org":["World Wide Web Foundation"],"url":["http://www.webfoundation.org/"],"start":["2009-01-18"],"duration":["P2Y11M"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('work', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hreview-aggregate-hcard.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hreview-aggregate-hcard.js
@@ -11,17 +11,17 @@ describe('hreview-aggregate', function()
    var htmlFragment = "<div class=\"hreview-aggregate\">\n    <div class=\"item vcard\">\n        <h3 class=\"fn org\">Mediterranean Wraps</h3>    \n        <p>\n            <span class=\"adr\">\n                <span class=\"street-address\">433 S California Ave</span>, \n                <span class=\"locality\">Palo Alto</span>, \n                <span class=\"region\">CA</span></span> - \n            \n            <span class=\"tel\">(650) 321-8189</span>\n        </p>\n    </div> \n    <p class=\"rating\">\n        <span class=\"average value\">9.2</span> out of \n        <span class=\"best\">10</span> \n        based on <span class=\"count\">17</span> reviews\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-review-aggregate"],"properties":{"item":[{"value":"Mediterranean Wraps","type":["h-item","h-card"],"properties":{"name":["Mediterranean Wraps"],"org":["Mediterranean Wraps"],"adr":[{"value":"433 S California Ave, \n                Palo Alto, \n                CA","type":["h-adr"],"properties":{"street-address":["433 S California Ave"],"locality":["Palo Alto"],"region":["CA"]}}],"tel":["(650) 321-8189"]}}],"rating":["9.2"],"average":["9.2"],"best":["10"],"count":["17"]}}],"rels":{},"rel-urls":{}};
 
    it('hcard', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hreview-aggregate-justahyperlink.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hreview-aggregate-justahyperlink.js
@@ -11,17 +11,17 @@ describe('hreview-aggregate', function()
    var htmlFragment = "<p class=\"hreview-aggregate\">\n    <span class=\"item\">\n        <a class=\"fn url\" href=\"http://example.com/mediterraneanwraps\">Mediterranean Wraps</a>\n    </span> - Rated: \n    <span class=\"rating\">4.5</span> out of 5 (<span class=\"count\">6</span> reviews)\n</p>";
    var expected = {"items":[{"type":["h-review-aggregate"],"properties":{"item":[{"value":"Mediterranean Wraps","type":["h-item"],"properties":{"name":["Mediterranean Wraps"],"url":["http://example.com/mediterraneanwraps"]}}],"rating":["4.5"],"count":["6"]}}],"rels":{},"rel-urls":{}};
 
    it('justahyperlink', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hreview-aggregate-vevent.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hreview-aggregate-vevent.js
@@ -11,17 +11,17 @@ describe('hreview-aggregate', function()
    var htmlFragment = "<div class=\"hreview-aggregate\">\n    <div class=\"item vevent\">\n        <h3 class=\"summary\">Fullfrontal</h3>\n        <p class=\"description\">A one day JavaScript Conference held in Brighton</p>\n        <p><time class=\"dtstart\" datetime=\"2012-11-09\">9th November 2012</time></p>    \n    </div> \n    \n    <p class=\"rating\">\n        <span class=\"average value\">9.9</span> out of \n        <span class=\"best\">10</span> \n        based on <span class=\"count\">62</span> reviews\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-review-aggregate"],"properties":{"item":[{"value":"Fullfrontal","type":["h-item","h-event"],"properties":{"name":["Fullfrontal"],"description":["A one day JavaScript Conference held in Brighton"],"start":["2012-11-09"]}}],"rating":["9.9"],"average":["9.9"],"best":["10"],"count":["62"]}}],"rels":{},"rel-urls":{}};
 
    it('vevent', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hreview-item.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hreview-item.js
@@ -11,17 +11,17 @@ describe('hreview', function() {
    var htmlFragment = "<base href=\"http://example.com\">\n<div class=\"hreview\">\n    <p class=\"item\">\n        <img class=\"photo\" src=\"images/photo.gif\" />\n        <a class=\"fn url\" href=\"http://example.com/crepeoncole\">Crepes on Cole</a>\n    </p>\n    <p><span class=\"rating\">5</span> out of 5 stars</p>\n</div>";
    var expected = {"items":[{"type":["h-review"],"properties":{"item":[{"value":"Crepes on Cole","type":["h-item"],"properties":{"photo":["http://example.com/images/photo.gif"],"name":["Crepes on Cole"],"url":["http://example.com/crepeoncole"]}}],"rating":["5"]}}],"rels":{},"rel-urls":{}};
 
    it('item', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-hreview-vcard.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-hreview-vcard.js
@@ -11,17 +11,17 @@ describe('hreview', function() {
    var htmlFragment = "<div class=\"hreview\">\n    <span><span class=\"rating\">5</span> out of 5 stars</span>\n    <h4 class=\"summary\">Crepes on Cole is awesome</h4>\n    <span class=\"reviewer vcard\">\n        Reviewer: <span class=\"fn\">Tantek</span> - \n    </span>\n    <time class=\"reviewed\" datetime=\"2005-04-18\">April 18, 2005</time>\n    <div class=\"description\">\n        <p class=\"item vcard\">\n        <span class=\"fn org\">Crepes on Cole</span> is one of the best little \n        creperies in <span class=\"adr\"><span class=\"locality\">San Francisco</span></span>.\n        Excellent food and service. Plenty of tables in a variety of sizes \n        for parties large and small.  Window seating makes for excellent \n        people watching to/from the N-Judah which stops right outside.  \n        I've had many fun social gatherings here, as well as gotten \n        plenty of work done thanks to neighborhood WiFi.\n        </p>\n    </div>\n    <p>Visit date: <span>April 2005</span></p>\n    <p>Food eaten: <a rel=\"tag\" href=\"http://en.wikipedia.org/wiki/crepe\">crepe</a></p>\n    <p>Permanent link for review: <a rel=\"self bookmark\" href=\"http://example.com/crepe\">http://example.com/crepe</a></p>\n    <p><a rel=\"license\" href=\"http://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License\">Creative Commons Attribution-ShareAlike License</a></p>\n</div>";
    var expected = {"items":[{"type":["h-review"],"properties":{"rating":["5"],"name":["Crepes on Cole is awesome"],"reviewer":[{"value":"Tantek","type":["h-card"],"properties":{"name":["Tantek"]}}],"description":[{"value":"Crepes on Cole is one of the best little \n        creperies in San Francisco.\n        Excellent food and service. Plenty of tables in a variety of sizes \n        for parties large and small.  Window seating makes for excellent \n        people watching to/from the N-Judah which stops right outside.  \n        I've had many fun social gatherings here, as well as gotten \n        plenty of work done thanks to neighborhood WiFi.","html":"\n        <p class=\"item vcard\">\n        <span class=\"fn org\">Crepes on Cole</span> is one of the best little \n        creperies in <span class=\"adr\"><span class=\"locality\">San Francisco</span></span>.\n        Excellent food and service. Plenty of tables in a variety of sizes \n        for parties large and small.  Window seating makes for excellent \n        people watching to/from the N-Judah which stops right outside.  \n        I've had many fun social gatherings here, as well as gotten \n        plenty of work done thanks to neighborhood WiFi.\n        </p>\n    "}],"item":[{"value":"Crepes on Cole","type":["h-item","h-card"],"properties":{"name":["Crepes on Cole"],"org":["Crepes on Cole"],"adr":[{"value":"San Francisco","type":["h-adr"],"properties":{"locality":["San Francisco"]}}]}}],"category":["crepe"],"url":["http://example.com/crepe"]}}],"rels":{"tag":["http://en.wikipedia.org/wiki/crepe"],"self":["http://example.com/crepe"],"bookmark":["http://example.com/crepe"],"license":["http://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License"]},"rel-urls":{"http://en.wikipedia.org/wiki/crepe":{"text":"crepe","rels":["tag"]},"http://example.com/crepe":{"text":"http://example.com/crepe","rels":["self","bookmark"]},"http://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License":{"text":"Creative Commons Attribution-ShareAlike License","rels":["license"]}}};
 
    it('vcard', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-includes-hcarditemref.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-includes-hcarditemref.js
@@ -11,17 +11,17 @@ describe('includes', function() {
    var htmlFragment = "<div class=\"vcard\" itemref=\"mozilla-org mozilla-adr\">\n    <span class=\"name\">Brendan Eich</span>\n</div>\n<div class=\"vcard\" itemref=\"mozilla-org mozilla-adr\">\n    <span class=\"name\">Mitchell Baker</span>\n</div>\n\n<p id=\"mozilla-org\" class=\"org\">Mozilla</p>\n<p id=\"mozilla-adr\" class=\"adr\">\n    <span class=\"street-address\">665 3rd St.</span>  \n    <span class=\"extended-address\">Suite 207</span>  \n    <span class=\"locality\">San Francisco</span>,  \n    <span class=\"region\">CA</span>  \n    <span class=\"postal-code\">94107</span>  \n    <span class=\"country-name\">U.S.A.</span>  \n</p>";
    var expected = {"items":[{"type":["h-card"],"properties":{"org":["Mozilla"],"adr":[{"value":"665 3rd St.  \n    Suite 207  \n    San Francisco,  \n    CA  \n    94107  \n    U.S.A.","type":["h-adr"],"properties":{"street-address":["665 3rd St."],"extended-address":["Suite 207"],"locality":["San Francisco"],"region":["CA"],"postal-code":["94107"],"country-name":["U.S.A."]}}]}},{"type":["h-card"],"properties":{"org":["Mozilla"],"adr":[{"value":"665 3rd St.  \n    Suite 207  \n    San Francisco,  \n    CA  \n    94107  \n    U.S.A.","type":["h-adr"],"properties":{"street-address":["665 3rd St."],"extended-address":["Suite 207"],"locality":["San Francisco"],"region":["CA"],"postal-code":["94107"],"country-name":["U.S.A."]}}]}},{"type":["h-adr"],"properties":{"street-address":["665 3rd St."],"extended-address":["Suite 207"],"locality":["San Francisco"],"region":["CA"],"postal-code":["94107"],"country-name":["U.S.A."]}}],"rels":{},"rel-urls":{}};
 
    it('hcarditemref', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-includes-heventitemref.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-includes-heventitemref.js
@@ -11,17 +11,17 @@ describe('includes', function() {
    var htmlFragment = "<div class=\"vevent\" itemref=\"io-session07\">\n    <span class=\"name\">Monetizing Android Apps</span> - spaekers: \n    <span class=\"speaker\">Chrix Finne</span>, \n    <span class=\"speaker\">Kenneth Lui</span> - \n    <span itemref=\"io-location\" class=\"location adr\">\n        <span class=\"extended-address\">Room 10</span>\n    </span>  \n</div>\n<div class=\"vevent\" itemref=\"io-session07\">\n    <span class=\"name\">New Low-Level Media APIs in Android</span> - spaekers: \n    <span class=\"speaker\">Dave Burke</span> -\n    <span itemref=\"io-location\" class=\"location adr\">\n        <span class=\"extended-address\">Room 11</span>\n    </span>  \n</div>\n\n<p id=\"io-session07\">\n    Session 01 is between: \n    <time class=\"dtstart\" datetime=\"2012-06-27T15:45:00-0800\">3:45PM</time> to \n    <time class=\"dtend\" datetime=\"2012-06-27T16:45:00-0800\">4:45PM</time> \n</p>   \n<p id=\"io-location\">\n    <span class=\"extended-address\">Moscone Center</span>,   \n    <span class=\"locality\">San Francisco</span>  \n</p>";
    var expected = {"items":[{"type":["h-event"],"properties":{"location":[{"value":"Room 10\n    \n    Moscone Center,   \n    San Francisco","type":["h-adr"],"properties":{"extended-address":["Room 10","Moscone Center"],"locality":["San Francisco"]}}],"start":["2012-06-27 15:45:00-08:00"],"end":["2012-06-27 16:45:00-08:00"]}},{"type":["h-event"],"properties":{"location":[{"value":"Room 11\n    \n    Moscone Center,   \n    San Francisco","type":["h-adr"],"properties":{"extended-address":["Room 11","Moscone Center"],"locality":["San Francisco"]}}],"start":["2012-06-27 15:45:00-08:00"],"end":["2012-06-27 16:45:00-08:00"]}}],"rels":{},"rel-urls":{}};
 
    it('heventitemref', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-includes-hyperlink.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-includes-hyperlink.js
@@ -11,17 +11,17 @@ describe('includes', function() {
    var htmlFragment = "<div class=\"vcard\">\n    <span class=\"name\">Ben Ward</span>\n    <a class=\"include\" href=\"#twitter\">Twitter</a>\n</div>\n<div class=\"vcard\">\n    <span class=\"name\">Dan Webb</span>\n    <a class=\"include\" href=\"#twitter\">Twitter</a>\n</div>\n\n<div id=\"twitter\">\n    <p class=\"org\">Twitter</p>\n    <p class=\"adr\">\n        <span class=\"street-address\">1355 Market St</span>,\n        <span class=\"locality\">San Francisco</span>, \n        <span class=\"region\">CA</span>\n        <span class=\"postal-code\">94103</span>\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"org":["Twitter"],"adr":[{"value":"1355 Market St,\n        San Francisco, \n        CA\n        94103","type":["h-adr"],"properties":{"street-address":["1355 Market St"],"locality":["San Francisco"],"region":["CA"],"postal-code":["94103"]}}]}},{"type":["h-card"],"properties":{"org":["Twitter"],"adr":[{"value":"1355 Market St,\n        San Francisco, \n        CA\n        94103","type":["h-adr"],"properties":{"street-address":["1355 Market St"],"locality":["San Francisco"],"region":["CA"],"postal-code":["94103"]}}]}},{"type":["h-adr"],"properties":{"street-address":["1355 Market St"],"locality":["San Francisco"],"region":["CA"],"postal-code":["94103"]}}],"rels":{},"rel-urls":{}};
 
    it('hyperlink', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-includes-object.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-includes-object.js
@@ -11,17 +11,17 @@ describe('includes', function() {
    var htmlFragment = "<div class=\"vevent\">\n    <span class=\"name\">HTML5 & CSS3 latest features in action!</span> - \n    <span class=\"speaker\">David Rousset</span> -\n    <time class=\"dtstart\" datetime=\"2012-10-30T11:45:00-08:00\">Tue 11:45am</time>\n    <object data=\"#buildconf\" class=\"include\" type=\"text/html\" height=\"0\" width=\"0\"></object>\n</div>\n<div class=\"vevent\">\n    <span class=\"name\">Building High-Performing JavaScript for Modern Engines</span> -\n    <span class=\"speaker\">John-David Dalton</span> and \n    <span class=\"speaker\">Amanda Silver</span> -\n    <time class=\"dtstart\" datetime=\"2012-10-31T11:15:00-08:00\">Wed 11:15am</time>\n    <object data=\"#buildconf\" class=\"include\" type=\"text/html\" height=\"0\" width=\"0\"></object>\n</div>\n\n\n<div id=\"buildconf\">\n    <p class=\"summary\">Build Conference</p>\n    <p class=\"location adr\">\n        <span class=\"locality\">Redmond</span>, \n        <span class=\"region\">Washington</span>, \n        <span class=\"country-name\">USA</span>\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-event"],"properties":{"start":["2012-10-30 11:45:00-08:00"],"name":["Build Conference"],"location":[{"value":"Redmond, \n        Washington, \n        USA","type":["h-adr"],"properties":{"locality":["Redmond"],"region":["Washington"],"country-name":["USA"]}}]}},{"type":["h-event"],"properties":{"start":["2012-10-31 11:15:00-08:00"],"name":["Build Conference"],"location":[{"value":"Redmond, \n        Washington, \n        USA","type":["h-adr"],"properties":{"locality":["Redmond"],"region":["Washington"],"country-name":["USA"]}}]}},{"type":["h-adr"],"properties":{"locality":["Redmond"],"region":["Washington"],"country-name":["USA"]}}],"rels":{},"rel-urls":{}};
 
    it('object', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v1-includes-table.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v1-includes-table.js
@@ -11,17 +11,17 @@ describe('includes', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<table>\n    <tr>\n        <th id=\"org\"><a class=\"url org\" href=\"http://dev.opera.com/\">Opera</a></th>\n    </tr>\n    <tr>\n        <td class=\"vcard\" headers=\"org\"><span class=\"fn\">Chris Mills</span></td>\n    </tr>\n    <tr>\n        <td class=\"vcard\" headers=\"org\"><span class=\"fn\">Erik Möller</span></td>\n    </tr>\n  </table>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Chris Mills"],"url":["http://dev.opera.com/"],"org":["Opera"]}},{"type":["h-card"],"properties":{"name":["Erik Möller"],"url":["http://dev.opera.com/"],"org":["Opera"]}}],"rels":{},"rel-urls":{}};
 
    it('table', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-adr-geo.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-adr-geo.js
@@ -11,17 +11,17 @@ describe('h-adr', function() {
    var htmlFragment = "<p class=\"h-adr\">\n    <span class=\"p-name\">Bricklayer's Arms</span>\n    <span class=\"p-label\"> \n        <span class=\"p-street-address\">3 Charlotte Road</span>,  \n        <span class=\"p-locality\">City of London</span>,  \n        <span class=\"p-postal-code\">EC2A 3PE</span>, \n        <span class=\"p-country-name\">UK</span> \n    </span> – \n    Geo:(<span class=\"p-geo\">51.526421;-0.081067</span>) \n</p>";
    var expected = {"items":[{"type":["h-adr"],"properties":{"name":["Bricklayer's Arms"],"label":["3 Charlotte Road,  \n        City of London,  \n        EC2A 3PE, \n        UK"],"street-address":["3 Charlotte Road"],"locality":["City of London"],"postal-code":["EC2A 3PE"],"country-name":["UK"],"geo":["51.526421;-0.081067"]}}],"rels":{},"rel-urls":{}};
 
    it('geo', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-adr-geourl.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-adr-geourl.js
@@ -11,17 +11,17 @@ describe('h-adr', function() {
    var htmlFragment = "<p class=\"h-adr\">\n    <a class=\"p-name u-geo\" href=\"geo:51.526421;-0.081067;crs=wgs84;u=40\">Bricklayer's Arms</a>, \n    <span class=\"p-locality\">London</span> \n</p>";
    var expected = {"items":[{"type":["h-adr"],"properties":{"name":["Bricklayer's Arms"],"geo":["geo:51.526421;-0.081067;crs=wgs84;u=40"],"locality":["London"],"url":["geo:51.526421;-0.081067;crs=wgs84;u=40"]}}],"rels":{},"rel-urls":{}};
 
    it('geourl', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-adr-justaname.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-adr-justaname.js
@@ -11,17 +11,17 @@ describe('h-adr', function() {
    var htmlFragment = "<p class=\"h-adr\">665 3rd St. Suite 207 San Francisco, CA 94107 U.S.A.</p>";
    var expected = {"items":[{"type":["h-adr"],"properties":{"name":["665 3rd St. Suite 207 San Francisco, CA 94107 U.S.A."]}}],"rels":{},"rel-urls":{}};
 
    it('justaname', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-adr-simpleproperties.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-adr-simpleproperties.js
@@ -11,17 +11,17 @@ describe('h-adr', function() {
    var htmlFragment = "<p class=\"h-adr\">\n    <span class=\"p-street-address\">665 3rd St.</span>  \n    <span class=\"p-extended-address\">Suite 207</span>  \n    <span class=\"p-locality\">San Francisco</span>,  \n    <span class=\"p-region\">CA</span>  \n    <span class=\"p-postal-code\">94107</span>  \n    <span class=\"p-country-name\">U.S.A.</span>  \n</p>";
    var expected = {"items":[{"type":["h-adr"],"properties":{"street-address":["665 3rd St."],"extended-address":["Suite 207"],"locality":["San Francisco"],"region":["CA"],"postal-code":["94107"],"country-name":["U.S.A."],"name":["665 3rd St.  \n    Suite 207  \n    San Francisco,  \n    CA  \n    94107  \n    U.S.A."]}}],"rels":{},"rel-urls":{}};
 
    it('simpleproperties', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-as-note-note.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-as-note-note.js
@@ -11,17 +11,17 @@ describe('h-as-note', function() {
    var htmlFragment = "<!-- http://tantek.com/2015/152/t2/proud-withknown-indieweb-user-empathy -->\n<base href=\"http://tantek.com/\" />\n\n<li class=\"h-entry hentry h-as-note\">\n   <div>\n      <ul>\n         <li>\n            <a href=\"152/t1/congrats-fellow-elected-w3cab-members\" id=\"previtem\" title=\"View the previous (older) item in the stream.\"\n            rel=\"prev\"><abbr title=\"Previous\">←</abbr></a>\n         </li>\n         <li>\n            <a href=\"152/t3/going-indiewebcamp-2015-portland\" id=\"nextitem\" title=\"View the next (newer) item in the stream\" rel=\"next\"><abbr title=\"Next\">→</abbr></a>\n         </li>\n      </ul>\n   </div>\n   <div>In reply to:\n      <p>\n         <a class=\"u-in-reply-to h-cite\" rel=\"in-reply-to\" href=\"http://werd.io/2015/im-super-proud-of-everything-weve-done-on-withknown-so-far\">http://werd.io/2015/im-super-proud-of-everything-weve-done-on-withknown-so-far</a>\n      </p>\n      <p>\n         <a class=\"u-in-reply-to h-cite\" rel=\"in-reply-to\" href=\"https://twitter.com/benwerd/status/604733231284383744\">https://twitter.com/benwerd/status/604733231284383744</a>\n      </p>\n      <hr>\n   </div>\n   <a href=\"../\" class=\"p-author h-card\" rel=\"author\" title=\"Tantek Çelik\"><img src=\"/images/photo.gif\" alt=\"Tantek Çelik\"></a>\n   <p class=\"p-name entry-title e-content entry-content article\">\n      <a class=\"auto-link h-x-username\" href=\"https://twitter.com/benwerd\">@benwerd</a>\n      <a class=\"auto-link h-x-username\" href=\"https://twitter.com/erinjo\">@erinjo</a>also proud of you &amp;\n      <a class=\"auto-link h-x-username\" href=\"https://twitter.com/withknown\">@withknown</a>— so much #indieweb &amp; especially user empathy. Keep up the great work!</p>\n   <span>\n      <span class=\"dt-published published dt-updated updated\">\n         <time class=\"value\" datetime=\"22:20-0700\">22:20</time>on\n         <time class=\"value\">2015-06-01</time>\n      </span>\n      <span class=\"lt\">(ttk.me t4bT2)</span>using\n      <span class=\"using\">BBEdit</span>\n   </span>\n   <div>\n      <form action=\"http://tantek.com/2015/152/t2/proud-withknown-indieweb-user-empathy\">\n         <div>\n            <label>\n               <span class=\"lt\">URL:</span>\n               <input class=\"u-url url u-uid uid bookmark\" type=\"url\" size=\"70\" style=\"max-width:100%\" value=\"http://tantek.com/2015/152/t2/proud-withknown-indieweb-user-empathy\">\n            </label>\n         </div>\n      </form>\n   </div>\n   <div>\n      <a class=\"u-syndication\" rel=\"syndication\" style=\"float:right;\" href=\"https://twitter.com/t/status/605604965566906369\">\n   <img src=\"/images/photo.gif\" style=\"vertical-align:-30%\" alt=\"\"> \n   View \n      Conversation\n      on Twitter\n</a>\n   </div>\n</li>";
    var expected = {"items":[{"type":["h-entry","h-as-note"],"properties":{"in-reply-to":[{"value":"http://werd.io/2015/im-super-proud-of-everything-weve-done-on-withknown-so-far","type":["h-cite"],"properties":{"name":["http://werd.io/2015/im-super-proud-of-everything-weve-done-on-withknown-so-far"],"url":["http://werd.io/2015/im-super-proud-of-everything-weve-done-on-withknown-so-far"]}},{"value":"https://twitter.com/benwerd/status/604733231284383744","type":["h-cite"],"properties":{"name":["https://twitter.com/benwerd/status/604733231284383744"],"url":["https://twitter.com/benwerd/status/604733231284383744"]}}],"author":[{"type":["h-card"],"properties":{"name":["Tantek Çelik"],"photo":["http://tantek.com/images/photo.gif"],"url":["http://tantek.com/"]}}],"name":["@benwerd\n      @erinjoalso proud of you &\n      @withknown— so much #indieweb & especially user empathy. Keep up the great work!"],"content":[{"value":"@benwerd\n      @erinjoalso proud of you &\n      @withknown— so much #indieweb & especially user empathy. Keep up the great work!","html":"\n      <a class=\"auto-link h-x-username\" href=\"https://twitter.com/benwerd\">@benwerd</a>\n      <a class=\"auto-link h-x-username\" href=\"https://twitter.com/erinjo\">@erinjo</a>also proud of you &\n      <a class=\"auto-link h-x-username\" href=\"https://twitter.com/withknown\">@withknown</a>— so much #indieweb & especially user empathy. Keep up the great work!"}],"published":["2015-06-01 22:20-07:00"],"updated":["2015-06-01 22:20-07:00"],"url":["http://tantek.com/2015/152/t2/proud-withknown-indieweb-user-empathy"],"uid":["http://tantek.com/2015/152/t2/proud-withknown-indieweb-user-empathy"],"syndication":["https://twitter.com/t/status/605604965566906369"]},"children":[{"value":"@benwerd","type":["h-x-username"],"properties":{"name":["@benwerd"],"url":["https://twitter.com/benwerd"]}},{"value":"@erinjo","type":["h-x-username"],"properties":{"name":["@erinjo"],"url":["https://twitter.com/erinjo"]}},{"value":"@withknown","type":["h-x-username"],"properties":{"name":["@withknown"],"url":["https://twitter.com/withknown"]}}]}],"rels":{"prev":["http://tantek.com/152/t1/congrats-fellow-elected-w3cab-members"],"next":["http://tantek.com/152/t3/going-indiewebcamp-2015-portland"],"in-reply-to":["http://werd.io/2015/im-super-proud-of-everything-weve-done-on-withknown-so-far","https://twitter.com/benwerd/status/604733231284383744"],"author":["http://tantek.com/"],"syndication":["https://twitter.com/t/status/605604965566906369"]},"rel-urls":{"http://tantek.com/152/t1/congrats-fellow-elected-w3cab-members":{"title":"View the previous (older) item in the stream.","text":"←","rels":["prev"]},"http://tantek.com/152/t3/going-indiewebcamp-2015-portland":{"title":"View the next (newer) item in the stream","text":"→","rels":["next"]},"http://werd.io/2015/im-super-proud-of-everything-weve-done-on-withknown-so-far":{"text":"http://werd.io/2015/im-super-proud-of-everything-weve-done-on-withknown-so-far","rels":["in-reply-to"]},"https://twitter.com/benwerd/status/604733231284383744":{"text":"https://twitter.com/benwerd/status/604733231284383744","rels":["in-reply-to"]},"http://tantek.com/":{"title":"Tantek Çelik","rels":["author"]},"https://twitter.com/t/status/605604965566906369":{"text":"View \n      Conversation\n      on Twitter","rels":["syndication"]}}};
 
    it('note', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-baseurl.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-baseurl.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<base href=\"http://example.org\"/>\n<div class=\"h-card\">\n  <a class=\"p-name u-url\" href=\"http://blog.lizardwrangler.com/\">Mitchell Baker</a> \n  (<a class=\"p-org h-card\" href=\"bios/mitchell-baker/\">Mozilla Foundation</a>)\n  <img class=\"u-photo\" src=\"images/photo.gif\"/>\n</div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Mitchell Baker"],"url":["http://blog.lizardwrangler.com/"],"org":[{"value":"Mozilla Foundation","type":["h-card"],"properties":{"name":["Mozilla Foundation"],"url":["http://example.org/bios/mitchell-baker/"]}}],"photo":["http://example.org/images/photo.gif"]}}],"rels":{},"rel-urls":{}};
 
    it('baseurl', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-childimplied.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-childimplied.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<a class=\"h-card\" href=\"http://people.opera.com/howcome/\" title=\"Håkon Wium Lie, CTO Opera\">\n  <article>\n     <h2 class=\"p-name\">Håkon Wium Lie</h2>\n     <img src=\"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/H%C3%A5kon-Wium-Lie-2009-03.jpg/215px-H%C3%A5kon-Wium-Lie-2009-03.jpg\" />\n  </article>\n</a>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Håkon Wium Lie"],"photo":["http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/H%C3%A5kon-Wium-Lie-2009-03.jpg/215px-H%C3%A5kon-Wium-Lie-2009-03.jpg"],"url":["http://people.opera.com/howcome/"]}}],"rels":{},"rel-urls":{}};
 
    it('childimplied', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-extendeddescription.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-extendeddescription.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<div class=\"h-card\">\n  <img class=\"u-photo\" alt=\"photo of Mitchell\" src=\"http://blog.mozilla.org/press/files/2012/04/mitchell-baker.jpg\" />\n  <p>\n    <a class=\"p-name u-url\" href=\"http://blog.lizardwrangler.com/\">Mitchell Baker</a>\n    (<a class=\"u-url\" href=\"https://twitter.com/MitchellBaker\">@MitchellBaker</a>)\n    <span class=\"p-org\">Mozilla Foundation</span>\n  </p>\n  <p class=\"p-note\">Mitchell is responsible for setting the direction and scope of the Mozilla Foundation and its activities.</p>\n  <p><span class=\"p-category\">Strategy</span> and <span class=\"p-category\">Leadership</span></p>\n</div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"photo":["http://blog.mozilla.org/press/files/2012/04/mitchell-baker.jpg"],"url":["http://blog.lizardwrangler.com/","https://twitter.com/MitchellBaker"],"name":["Mitchell Baker"],"org":["Mozilla Foundation"],"note":["Mitchell is responsible for setting the direction and scope of the Mozilla Foundation and its activities."],"category":["Strategy","Leadership"]}}],"rels":{},"rel-urls":{}};
 
    it('extendeddescription', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+         	'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-hcard.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-hcard.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<div class=\"h-card\">\n  <a class=\"p-name u-url\" href=\"http://blog.lizardwrangler.com/\">Mitchell Baker</a> \n  (<a class=\"p-org h-card\" href=\"http://mozilla.org/\">Mozilla Foundation</a>)\n</div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"url":["http://blog.lizardwrangler.com/"],"name":["Mitchell Baker"],"org":[{"value":"Mozilla Foundation","type":["h-card"],"properties":{"name":["Mozilla Foundation"],"url":["http://mozilla.org/"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('hcard', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-horghcard.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-horghcard.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<div class=\"h-card\">\n  <a class=\"p-name u-url\" href=\"http://blog.lizardwrangler.com/\">Mitchell Baker</a> \n  (<a class=\"p-org h-card h-org\" href=\"http://mozilla.org/\">Mozilla Foundation</a>)\n</div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Mitchell Baker"],"url":["http://blog.lizardwrangler.com/"],"org":[{"value":"Mozilla Foundation","type":["h-card","h-org"],"properties":{"name":["Mozilla Foundation"],"url":["http://mozilla.org/"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('horghcard', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-hyperlinkedphoto.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-hyperlinkedphoto.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<a class=\"h-card\" href=\"http://rohit.khare.org/\">\n        <img alt=\"Rohit Khare\" src=\"images/photo.gif\" />\n    </a>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Rohit Khare"],"photo":["http://example.com/images/photo.gif"],"url":["http://rohit.khare.org/"]}}],"rels":{},"rel-urls":{}};
 
    it('hyperlinkedphoto', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-impliedname.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-impliedname.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "\n<img class=\"h-card\" src=\"jane.html\" alt=\"Jane Doe\"/>\n<area class=\"h-card\" href=\"jane.html\" alt=\"Jane Doe\"></area>\n<abbr class=\"h-card\" title=\"Jane Doe\">JD</abbr>\n\n<div class=\"h-card\"><img src=\"jane.html\" alt=\"Jane Doe\"/></div>\n<div class=\"h-card\"><area href=\"jane.html\" alt=\"Jane Doe\"></area></div>\n<div class=\"h-card\"><abbr title=\"Jane Doe\">JD</abbr></div>\n\n<div class=\"h-card\"><span><img src=\"jane.html\" alt=\"Jane Doe\"/></span></div>\n<div class=\"h-card\"><span><area href=\"jane.html\" alt=\"Jane Doe\"></area></span></div>\n<div class=\"h-card\"><span><abbr title=\"Jane Doe\">JD</abbr></span></div>\n\n<div class=\"h-card\"><img class=\"h-card\" src=\"john.html\" alt=\"John Doe\"/>Name</div>\n<div class=\"h-card\"><span class=\"h-card\"><img src=\"john.html\" alt=\"John Doe\"/>Name</span></div>\n";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Jane Doe"],"photo":["http://example.com/jane.html"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"url":["http://example.com/jane.html"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"photo":["http://example.com/jane.html"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"url":["http://example.com/jane.html"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"photo":["http://example.com/jane.html"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"url":["http://example.com/jane.html"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"]}},{"type":["h-card"],"properties":{"name":["Name"]},"children":[{"type":["h-card"],"properties":{"name":["John Doe"],"photo":["http://example.com/john.html"]}}]},{"type":["h-card"],"properties":{"name":["Name"]},"children":[{"value":"Name","type":["h-card"],"properties":{"name":["John Doe"],"photo":["http://example.com/john.html"]}}]}],"rels":{},"rel-urls":{}};
 
    it('impliedname', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-impliedphoto.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-impliedphoto.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<img class=\"h-card\" alt=\"Jane Doe\" src=\"jane.jpeg\"/>\n<object class=\"h-card\" data=\"jane.jpeg\"/>Jane Doe</object>\n\n<div class=\"h-card\"><img alt=\"Jane Doe\" src=\"jane.jpeg\"/></div> \n<div class=\"h-card\"><object data=\"jane.jpeg\"/>Jane Doe</object></div> \n\n<div class=\"h-card\"><span><img alt=\"Jane Doe\" src=\"jane.jpeg\"/></span></div> \n<div class=\"h-card\"><span><object data=\"jane.jpeg\"/>Jane Doe</object></span></div> \n\n<div class=\"h-card\"><img class=\"h-card\" alt=\"Jane Doe\" src=\"jane.jpeg\"/>Jane Doe</div> \n<div class=\"h-card\"><span class=\"h-card\"><object data=\"jane.jpeg\"/>Jane Doe</object></span></div> ";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Jane Doe"],"photo":["http://example.com/jane.jpeg"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"photo":["http://example.com/jane.jpeg"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"photo":["http://example.com/jane.jpeg"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"photo":["http://example.com/jane.jpeg"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"photo":["http://example.com/jane.jpeg"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"photo":["http://example.com/jane.jpeg"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"]},"children":[{"type":["h-card"],"properties":{"name":["Jane Doe"],"photo":["http://example.com/jane.jpeg"]}}]},{"type":["h-card"],"properties":{"name":["Jane Doe"]},"children":[{"value":"Jane Doe","type":["h-card"],"properties":{"name":["Jane Doe"],"photo":["http://example.com/jane.jpeg"]}}]}],"rels":{},"rel-urls":{}};
 
    it('impliedphoto', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-impliedurl.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-impliedurl.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<a class=\"h-card\" href=\"jane.html\">Jane Doe</a>\n<area class=\"h-card\" href=\"jane.html\" alt=\"Jane Doe\"/ >\n<div class=\"h-card\" ><a href=\"jane.html\">Jane Doe</a><p></p></div> \n<div class=\"h-card\" ><area href=\"jane.html\">Jane Doe</area><p></p></div>\n<div class=\"h-card\" ><a class=\"h-card\" href=\"jane.html\">Jane Doe</a><p></p></div> ";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Jane Doe"],"url":["http://example.com/jane.html"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"url":["http://example.com/jane.html"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"url":["http://example.com/jane.html"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"],"url":["http://example.com/jane.html"]}},{"type":["h-card"],"properties":{"name":["Jane Doe"]},"children":[{"value":"Jane Doe","type":["h-card"],"properties":{"name":["Jane Doe"],"url":["http://example.com/jane.html"]}}]}],"rels":{},"rel-urls":{}};
 
    it('impliedurl', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-justahyperlink.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-justahyperlink.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<a class=\"h-card\" href=\"http://benward.me/\">Ben Ward</a>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Ben Ward"],"url":["http://benward.me/"]}}],"rels":{},"rel-urls":{}};
 
    it('justahyperlink', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-justaname.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-justaname.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<p class=\"h-card\">Frances Berriman</p>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Frances Berriman"]}}],"rels":{},"rel-urls":{}};
 
    it('justaname', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-nested.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-nested.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<div class=\"h-card\">\n  <a class=\"p-name u-url\" href=\"http://blog.lizardwrangler.com/\">Mitchell Baker</a> \n  (<a class=\"h-org h-card\" href=\"http://mozilla.org/\">Mozilla Foundation</a>)\n</div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Mitchell Baker"],"url":["http://blog.lizardwrangler.com/"]},"children":[{"value":"Mozilla Foundation","type":["h-org","h-card"],"properties":{"name":["Mozilla Foundation"],"url":["http://mozilla.org/"]}}]}],"rels":{},"rel-urls":{}};
 
    it('nested', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-p-property.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-p-property.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<div class=\"h-card\">\n    \n    <span class=\"p-name\">\n        <span class=\"p-given-name value\">John</span> \n        <abbr class=\"p-additional-name\" title=\"Peter\">P</abbr>  \n        <span class=\"p-family-name value \">Doe</span> \n    </span>\n    <data class=\"p-honorific-suffix\" value=\"MSc\"></data>\n    \n    \n    <br class=\"p-honorific-suffix\" />BSc<br />\n    <hr class=\"p-honorific-suffix\" />BA\n    \n    \n    <img class=\"p-honorific-suffix\" src=\"images/logo.gif\" alt=\"PHD\" />\n    <img src=\"images/logo.gif\" alt=\"company logos\" usemap=\"#logomap\" />\n    <map name=\"logomap\">\n        <area class=\"p-org\" shape=\"rect\" coords=\"0,0,82,126\" href=\"madgex.htm\" alt=\"Madgex\" />\n        <area class=\"p-org\" shape=\"circle\" coords=\"90,58,3\" href=\"mozilla.htm\" alt=\"Mozilla\" />\n    </map>\n</div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["John Doe"],"given-name":["John"],"additional-name":["Peter"],"family-name":["Doe"],"honorific-suffix":["MSc","PHD"],"org":["Madgex","Mozilla"]}}],"rels":{},"rel-urls":{}};
 
    it('p-property', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-relativeurls.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-card-relativeurls.js
@@ -11,17 +11,17 @@ describe('h-card', function() {
    var htmlFragment = "<base href=\"http://example.com\" >\n<div class=\"h-card\">\n  <a class=\"p-name u-url\" href=\"http://blog.lizardwrangler.com/\">Mitchell Baker</a> \n  (<a class=\"p-org h-card\" href=\"bios/mitchell-baker/\">Mozilla Foundation</a>)\n  <img class=\"u-photo\" src=\"bios/mitchell-baker/picture.jpeg\"/>\n</div>";
    var expected = {"items":[{"type":["h-card"],"properties":{"name":["Mitchell Baker"],"url":["http://blog.lizardwrangler.com/"],"org":[{"value":"Mozilla Foundation","type":["h-card"],"properties":{"name":["Mozilla Foundation"],"url":["http://example.com/bios/mitchell-baker/"]}}],"photo":["http://example.com/bios/mitchell-baker/picture.jpeg"]}}],"rels":{},"rel-urls":{}};
 
    it('relativeurls', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-impliedvalue-nested.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-impliedvalue-nested.js
@@ -11,17 +11,17 @@ describe('h-entry', function() {
    var htmlFragment = "<div class=\"h-entry\">\n      <div class=\"u-in-reply-to h-cite\">\n            <span class=\"p-author h-card\">\n                  <span class=\"p-name\">Example Author</span>\n                  <a class=\"u-url\" href=\"http://example.com\">Home</a>\n            </span>\n            <a class=\"p-name u-url\" href=\"http://example.com/post\">Example Post</a>\n      </div>\n</div>";
    var expected = {"items":[{"type":["h-entry"],"properties":{"in-reply-to":[{"type":["h-cite"],"properties":{"name":["Example Post"],"url":["http://example.com/post"],"author":[{"type":["h-card"],"properties":{"url":["http://example.com"],"name":["Example Author"]},"value":"Example Author"}]},"value":"http://example.com/post"}],"name":["Example Author\n                  Home\n            \n            Example Post"]}}],"rels":{},"rel-urls":{}};
 
    it('impliedvalue-nested', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-justahyperlink.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-justahyperlink.js
@@ -11,17 +11,17 @@ describe('h-entry', function() {
    var htmlFragment = "<a class=\"h-entry\" href=\"http://microformats.org/2012/06/25/microformats-org-at-7\">microformats.org at 7</a>";
    var expected = {"items":[{"type":["h-entry"],"properties":{"name":["microformats.org at 7"],"url":["http://microformats.org/2012/06/25/microformats-org-at-7"]}}],"rels":{},"rel-urls":{}};
 
    it('justahyperlink', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-justaname.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-justaname.js
@@ -11,17 +11,17 @@ describe('h-entry', function() {
    var htmlFragment = "<p class=\"h-entry\">microformats.org at 7</p>";
    var expected = {"items":[{"type":["h-entry"],"properties":{"name":["microformats.org at 7"]}}],"rels":{},"rel-urls":{}};
 
    it('justaname', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-summarycontent.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-summarycontent.js
@@ -11,17 +11,17 @@ describe('h-entry', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<div class=\"h-entry\">\n    <h1><a class=\"p-name u-url\" href=\"http://microformats.org/2012/06/25/microformats-org-at-7\">microformats.org at 7</a></h1>\n    <div class=\"e-content\">\n        <p class=\"p-summary\">Last week the microformats.org community \n            celebrated its 7th birthday at a gathering hosted by Mozilla in \n            San Francisco and recognized accomplishments, challenges, and \n            opportunities.</p>\n\n        <p>The microformats tagline “humans first, machines second” \n            forms the basis of many of our \n            <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n            in that regard, we’d like to recognize a few people and \n            thank them for their years of volunteer service </p>\n    </div>  \n    <p>Updated \n        <time class=\"dt-updated\" datetime=\"2012-06-25T17:08:26\">June 25th, 2012</time> by\n        <a class=\"p-author h-card\" href=\"http://tantek.com/\">Tantek</a>\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-entry"],"properties":{"url":["http://microformats.org/2012/06/25/microformats-org-at-7"],"name":["microformats.org at 7"],"content":[{"value":"Last week the microformats.org community \n            celebrated its 7th birthday at a gathering hosted by Mozilla in \n            San Francisco and recognized accomplishments, challenges, and \n            opportunities.\n\n        The microformats tagline “humans first, machines second” \n            forms the basis of many of our \n            principles, and \n            in that regard, we’d like to recognize a few people and \n            thank them for their years of volunteer service","html":"\n        <p class=\"p-summary\">Last week the microformats.org community \n            celebrated its 7th birthday at a gathering hosted by Mozilla in \n            San Francisco and recognized accomplishments, challenges, and \n            opportunities.</p>\n\n        <p>The microformats tagline “humans first, machines second” \n            forms the basis of many of our \n            <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n            in that regard, we’d like to recognize a few people and \n            thank them for their years of volunteer service </p>\n    "}],"summary":["Last week the microformats.org community \n            celebrated its 7th birthday at a gathering hosted by Mozilla in \n            San Francisco and recognized accomplishments, challenges, and \n            opportunities."],"updated":["2012-06-25 17:08:26"],"author":[{"value":"Tantek","type":["h-card"],"properties":{"name":["Tantek"],"url":["http://tantek.com/"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('summarycontent', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-u-property.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-u-property.js
@@ -11,17 +11,17 @@ describe('h-entry', function() {
    var htmlFragment = "<base href=\"http://example.com\">\n<div class=\"h-entry\">\n    <p class=\"p-name\">microformats.org at 7</p>\n\n    \n    <p class=\"u-url\">\n      <span class=\"value-title\" title=\"http://microformats.org/\"> </span>\n      Article permalink\n    </p>\n    <p class=\"u-url\">\n        <span class=\"value\">http://microformats.org/</span> - \n        <span class=\"value\">2012/06/25/microformats-org-at-7</span> \n    </p> \n\n    <p><a class=\"u-url\" href=\"http://microformats.org/2012/06/25/microformats-org-at-7\">Article permalink</a></p>\n\n    <img src=\"images/logo.gif\" alt=\"company logos\" usemap=\"#logomap\" />\n    <map name=\"logomap\">\n        <area class=\"u-url\" shape=\"rect\" coords=\"0,0,82,126\" href=\"http://microformats.org/\" alt=\"microformats.org\" />\n    </map>\n\n    <img class=\"u-photo\" src=\"images/logo.gif\" alt=\"company logos\" />\n\n    <object class=\"u-url\" data=\"http://microformats.org/wiki/microformats2-parsing\"></object>\n\n    <abbr class=\"u-url\" title=\"http://microformats.org/wiki/value-class-pattern\">value-class-pattern</abbr> \n    <data class=\"u-url\" value=\"http://microformats.org/wiki/\"></data>\n    <p class=\"u-url\">http://microformats.org/discuss</p>\n</div>";
    var expected = {"items":[{"type":["h-entry"],"properties":{"name":["microformats.org at 7"],"url":["http://microformats.org/","http://microformats.org/2012/06/25/microformats-org-at-7","http://microformats.org/2012/06/25/microformats-org-at-7","http://microformats.org/","http://microformats.org/wiki/microformats2-parsing","http://microformats.org/wiki/value-class-pattern","http://microformats.org/wiki/","http://microformats.org/discuss"],"photo":["http://example.com/images/logo.gif"]}}],"rels":{},"rel-urls":{}};
 
    it('u-property', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-urlincontent.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-entry-urlincontent.js
@@ -11,17 +11,17 @@ describe('h-entry', function() {
    var htmlFragment = "<div class=\"h-entry\">\n    <h1><a class=\"p-name\">Expanding URLs within HTML content</a></h1>\n    <div class=\"e-content\">\n        <ul>\n            <li><a href=\"http://www.w3.org/\">Should not change: http://www.w3.org/</a></li>\n            <li><a href=\"http://example.com/\">Should not change: http://example.com/</a></li>\n            <li><a href=\"test.html\">File relative: test.html = http://example.com/test.html</a></li>\n            <li><a href=\"/test/test.html\">Directory relative: /test/test.html = http://example.com/test/test.html</a></li>\n            <li><a href=\"/test.html\">Relative to root: /test.html = http://example.com/test.html</a></li>\n        </ul>\n        <img src=\"images/photo.gif\" />\n    </div>  \n</div>";
    var expected = {"items":[{"type":["h-entry"],"properties":{"name":["Expanding URLs within HTML content"],"content":[{"value":"Should not change: http://www.w3.org/\n            Should not change: http://example.com/\n            File relative: test.html = http://example.com/test.html\n            Directory relative: /test/test.html = http://example.com/test/test.html\n            Relative to root: /test.html = http://example.com/test.html","html":"\n        <ul>\n            <li><a href=\"http://www.w3.org/\">Should not change: http://www.w3.org/</a></li>\n            <li><a href=\"http://example.com/\">Should not change: http://example.com/</a></li>\n            <li><a href=\"http://example.com/test.html\">File relative: test.html = http://example.com/test.html</a></li>\n            <li><a href=\"http://example.com/test/test.html\">Directory relative: /test/test.html = http://example.com/test/test.html</a></li>\n            <li><a href=\"http://example.com/test.html\">Relative to root: /test.html = http://example.com/test.html</a></li>\n        </ul>\n        <img src=\"http://example.com/images/photo.gif\" />\n    "}]}}],"rels":{},"rel-urls":{}};
 
    it('urlincontent', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-ampm.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-ampm.js
@@ -11,17 +11,17 @@ describe('h-event', function() {
    var htmlFragment = "<span class=\"h-event\">\n    <span class=\"p-name\">The 4th Microformat party</span> will be on \n    <ul>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">07:00:00pm \n        </span></li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">07:00:00am \n        </span></li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">07:00pm \n        </span></li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">07pm \n        </span></li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">7pm \n        </span></li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">7:00pm \n        </span></li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">07:00p.m. \n        </span></li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">07:00PM \n        </span></li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <span class=\"value\">7:00am \n        </span></li>\n    </ul>\n</span>";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["The 4th Microformat party"],"start":["2009-06-26 19:00:00","2009-06-26 07:00:00","2009-06-26 19:00","2009-06-26 19","2009-06-26 19","2009-06-26 19:00","2009-06-26 19:00","2009-06-26 19:00","2009-06-26 07:00"]}}],"rels":{},"rel-urls":{}};
 
    it('ampm', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-attendees.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-attendees.js
@@ -11,17 +11,17 @@ describe('h-event', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<div class=\"h-event\">\n    <span class=\"p-name\">CPJ Online Press Freedom Summit</span>\n    (<time class=\"dt-start\" datetime=\"2012-10-10\">10 Nov 2012</time>) in\n    <span class=\"p-location\">San Francisco</span>.\n    Attendees:\n    <ul>\n        <li class=\"p-attendee h-card\">Brian Warner</li>\n        <li class=\"p-attendee h-card\">Kyle Machulis</li>\n        <li class=\"p-attendee h-card\">Tantek Çelik</li>\n        <li class=\"p-attendee h-card\">Sid Sutter</li>\n    </ul>\n</div>\n";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["CPJ Online Press Freedom Summit"],"start":["2012-10-10"],"location":["San Francisco"],"attendee":[{"value":"Brian Warner","type":["h-card"],"properties":{"name":["Brian Warner"]}},{"value":"Kyle Machulis","type":["h-card"],"properties":{"name":["Kyle Machulis"]}},{"value":"Tantek Çelik","type":["h-card"],"properties":{"name":["Tantek Çelik"]}},{"value":"Sid Sutter","type":["h-card"],"properties":{"name":["Sid Sutter"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('attendees', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-combining.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-combining.js
@@ -11,17 +11,17 @@ describe('h-event', function() {
    var htmlFragment = "<div class=\"h-event\">\n  <a class=\"p-name u-url\" href=\"http://indiewebcamp.com/2012\">\n    IndieWebCamp 2012\n  </a>\n  from <time class=\"dt-start\">2012-06-30</time> \n  to <time class=\"dt-end\">2012-07-01</time> at \n  <span class=\"p-location h-card\">\n    <a class=\"p-name p-org u-url\" href=\"http://geoloqi.com/\">Geoloqi</a>, \n    <span class=\"p-street-address\">920 SW 3rd Ave. Suite 400</span>, \n    <span class=\"p-locality\">Portland</span>, \n    <abbr class=\"p-region\" title=\"Oregon\">OR</abbr>\n  </span>\n</div>";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["IndieWebCamp 2012"],"url":["http://indiewebcamp.com/2012"],"start":["2012-06-30"],"end":["2012-07-01"],"location":[{"value":"Geoloqi","type":["h-card"],"properties":{"name":["Geoloqi"],"org":["Geoloqi"],"url":["http://geoloqi.com/"],"street-address":["920 SW 3rd Ave. Suite 400"],"locality":["Portland"],"region":["Oregon"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('combining', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-concatenate.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-concatenate.js
@@ -11,17 +11,17 @@ describe('h-event', function() {
    var htmlFragment = "<span class=\"h-event\">\n <span class=\"p-name\">The 4th Microformat party</span> will be on \n <span class=\"dt-start\">\n  <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n  <time class=\"value\">19:00</time></span> to \n <span class=\"dt-end\"><time class=\"value\">22:00</time></span>.\n</span>";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["The 4th Microformat party"],"start":["2009-06-26 19:00"],"end":["2009-06-26 22:00"]}}],"rels":{},"rel-urls":{}};
 
    it('concatenate', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-dates.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-dates.js
@@ -11,17 +11,17 @@ describe('h-event', function() {
    var htmlFragment = "<section class=\"h-event\">\n\t<p><span class=\"p-name\">The 4th Microformat party</span> will be on:</p>\n\t<ul>\n\t\t<li><time class=\"dt-start\" datetime=\"2009-06-26T19:00-08:00\">26 July</time></li>\n\t\t<li><time class=\"dt-start\" datetime=\"2009-06-26T19:00-08\">26 July</time></li>\n\t\t<li><time class=\"dt-start\" datetime=\"2009-06-26T19:00-0800\">26 July</time></li>\n\t\t<li><time class=\"dt-start\" datetime=\"2009-06-26T19:00+0800\">26 July</time></li>\n\t\t<li><time class=\"dt-start\" datetime=\"2009-06-26T19:00+08:00\">26 July</time></li>\n\t\t<li><time class=\"dt-start\" datetime=\"2009-06-26T19:00Z\">26 July</time></li>\n\t\t<li><time class=\"dt-start\" datetime=\"2009-06-26t19:00-08:00\">26 July</time></li>\n\t\t<li><time class=\"dt-start\" datetime=\"2009-06-26 19:00:00-08:00\">26 July</time></li>\n\t</ul>\n</section>";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["The 4th Microformat party"],"start":["2009-06-26 19:00-08:00","2009-06-26 19:00-08","2009-06-26 19:00-08:00","2009-06-26 19:00+08:00","2009-06-26 19:00+08:00","2009-06-26 19:00Z","2009-06-26 19:00-08:00","2009-06-26 19:00:00-08:00"]}}],"rels":{},"rel-urls":{}};
 
    it('dates', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-dt-property.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-dt-property.js
@@ -11,17 +11,17 @@ describe('h-event', function() {
    var htmlFragment = "<span class=\"h-event\">\n    <span class=\"p-name\">The party</span> will be on \n    \n    <p class=\"dt-start\">\n      <span class=\"value-title\" title=\"2013-03-14\"> </span>\n      March 14th 2013\n    </p>\n    <p class=\"dt-start\">\n        <time class=\"value\" datetime=\"2013-06-25\">25 July</time>, from\n        <span class=\"value\">07:00:00am \n    </span></p>   \n    \n    <p>\n        <time class=\"dt-start\" datetime=\"2013-06-26\">26 June</time>\n        \n        <ins class=\"dt-start\" datetime=\"2013-06-27\">Just added</ins>, \n        <del class=\"dt-start\" datetime=\"2013-06-28\">Removed</del>\n    </p>\n    <abbr class=\"dt-start\" title=\"2013-06-29\">June 29</abbr> \n    <data class=\"dt-start\" value=\"2013-07-01\"></data>\n    <p class=\"dt-start\">2013-07-02</p>\n    \n</span>";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["The party"],"start":["2013-03-14","2013-06-25 07:00:00","2013-06-26","2013-06-27","2013-06-28","2013-06-29","2013-07-01","2013-07-02"]}}],"rels":{},"rel-urls":{}};
 
    it('dt-property', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-justahyperlink.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-justahyperlink.js
@@ -11,17 +11,17 @@ describe('h-event', function() {
    var htmlFragment = "<a class=\"h-event\" href=\"http://indiewebcamp.com/2012\">IndieWebCamp 2012</a>";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["IndieWebCamp 2012"],"url":["http://indiewebcamp.com/2012"]}}],"rels":{},"rel-urls":{}};
 
    it('justahyperlink', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-justaname.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-justaname.js
@@ -11,17 +11,17 @@ describe('h-event', function() {
    var htmlFragment = "<p class=\"h-event\">IndieWebCamp 2012</p>";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["IndieWebCamp 2012"]}}],"rels":{},"rel-urls":{}};
 
    it('justaname', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-time.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-event-time.js
@@ -11,17 +11,17 @@ describe('h-event', function() {
    var htmlFragment = "<span class=\"h-event\">\n    <span class=\"p-name\">The 4th Microformat party</span> will be on \n    <ul>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00:00-08:00</time> \n        </li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00:00-0800</time> \n        </li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00:00+0800</time> \n        </li> \n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00:00Z</time> \n        </li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00:00</time> \n        </li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00-08:00</time> \n        </li> \n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00+08:00</time> \n        </li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00Z</time> \n        </li>\n        <li class=\"dt-start\">\n            <time class=\"value\" datetime=\"2009-06-26\">26 July</time>, from\n            <time class=\"value\">19:00</time> \n        </li>  \n        <li>\n            <time class=\"dt-end\" datetime=\"2013-034\">3 February 2013</time>\n        </li>\n        <li>\n            <time class=\"dt-end\" datetime=\"2013-06-27 15:34\">26 July 2013</time>\n        </li>              \n    </ul>\n</span>";
    var expected = {"items":[{"type":["h-event"],"properties":{"name":["The 4th Microformat party"],"start":["2009-06-26 19:00:00-08:00","2009-06-26 19:00:00-08:00","2009-06-26 19:00:00+08:00","2009-06-26 19:00:00Z","2009-06-26 19:00:00","2009-06-26 19:00-08:00","2009-06-26 19:00+08:00","2009-06-26 19:00Z","2009-06-26 19:00"],"end":["2013-034","2013-06-27 15:34"]}}],"rels":{},"rel-urls":{}};
 
    it('time', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-feed-implied-title.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-feed-implied-title.js
@@ -11,17 +11,17 @@ describe('h-feed', function() {
    var htmlFragment = "\n<html>\n\t<head>\n\t\t<title>microformats blog</title>\n\t</head>\n\t<body>\n\t<section class=\"h-feed\">\n\t\t\n\t\t<div class=\"h-entry\">\n\t\t    <h1><a class=\"p-name u-url\" href=\"http://microformats.org/2012/06/25/microformats-org-at-7\">microformats.org at 7</a></h1>\n\t\t    <div class=\"e-content\">\n\t\t        <p class=\"p-summary\">Last week the microformats.org community \n\t\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t\t            San Francisco and recognized accomplishments, challenges, and \n\t\t            opportunities.</p>\n\t\t\n\t\t        <p>The microformats tagline “humans first, machines second” \n\t\t            forms the basis of many of our \n\t\t            <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n\t\t            in that regard, we’d like to recognize a few people and \n\t\t            thank them for their years of volunteer service </p>\n\t\t    </div>  \n\t\t    <p>Updated \n\t\t        <time class=\"dt-updated\" datetime=\"2012-06-25T17:08:26\">June 25th, 2012</time>\n\t\t    </p>\n\t\t</div>\n\t\t\n\t</section>\n\t</body>\n</html>";
    var expected = {"items":[{"type":["h-feed"],"properties":{"name":["microformats blog"]},"children":[{"value":"microformats.org at 7\n\t\t    \n\t\t        Last week the microformats.org community \n\t\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t\t            San Francisco and recognized accomplishments, challenges, and \n\t\t            opportunities.\n\t\t\n\t\t        The microformats tagline “humans first, machines second” \n\t\t            forms the basis of many of our \n\t\t            principles, and \n\t\t            in that regard, we’d like to recognize a few people and \n\t\t            thank them for their years of volunteer service \n\t\t      \n\t\t    Updated \n\t\t        June 25th, 2012","type":["h-entry"],"properties":{"name":["microformats.org at 7"],"url":["http://microformats.org/2012/06/25/microformats-org-at-7"],"content":[{"value":"Last week the microformats.org community \n\t\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t\t            San Francisco and recognized accomplishments, challenges, and \n\t\t            opportunities.\n\t\t\n\t\t        The microformats tagline “humans first, machines second” \n\t\t            forms the basis of many of our \n\t\t            principles, and \n\t\t            in that regard, we’d like to recognize a few people and \n\t\t            thank them for their years of volunteer service","html":"\n\t\t        <p class=\"p-summary\">Last week the microformats.org community \n\t\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t\t            San Francisco and recognized accomplishments, challenges, and \n\t\t            opportunities.</p>\n\t\t\n\t\t        <p>The microformats tagline “humans first, machines second” \n\t\t            forms the basis of many of our \n\t\t            <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n\t\t            in that regard, we’d like to recognize a few people and \n\t\t            thank them for their years of volunteer service </p>\n\t\t    "}],"summary":["Last week the microformats.org community \n\t\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t\t            San Francisco and recognized accomplishments, challenges, and \n\t\t            opportunities."],"updated":["2012-06-25 17:08:26"]}}]}],"rels":{},"rel-urls":{}};
 
    it('implied-title', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-feed-simple.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-feed-simple.js
@@ -11,17 +11,17 @@ describe('h-feed', function() {
    var htmlFragment = "<section class=\"h-feed\">\n\t<h1 class=\"p-name\">Microformats blog</h1>\n\t<a class=\"p-author h-card\" href=\"http://tantek.com/\">Tantek</a>\n\t<a class=\"u-url\" href=\"http://microformats.org/blog\">permlink</a>\n\t<img class=\"u-photo\" src=\"photo.jpeg\"/>\n\t\n\t<div class=\"h-entry\">\n\t    <h1><a class=\"p-name u-url\" href=\"http://microformats.org/2012/06/25/microformats-org-at-7\">microformats.org at 7</a></h1>\n\t    <div class=\"e-content\">\n\t        <p class=\"p-summary\">Last week the microformats.org community \n\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t            San Francisco and recognized accomplishments, challenges, and \n\t            opportunities.</p>\n\t\n\t        <p>The microformats tagline “humans first, machines second” \n\t            forms the basis of many of our \n\t            <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n\t            in that regard, we’d like to recognize a few people and \n\t            thank them for their years of volunteer service </p>\n\t    </div>  \n\t    <p>Updated \n\t        <time class=\"dt-updated\" datetime=\"2012-06-25T17:08:26\">June 25th, 2012</time>\n\t    </p>\n\t</div>\n\t\n</section>";
    var expected = {"items":[{"type":["h-feed"],"properties":{"name":["Microformats blog"],"author":[{"value":"Tantek","type":["h-card"],"properties":{"name":["Tantek"],"url":["http://tantek.com/"]}}],"url":["http://microformats.org/blog"],"photo":["http://example.com/photo.jpeg"]},"children":[{"value":"microformats.org at 7\n\t    \n\t        Last week the microformats.org community \n\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t            San Francisco and recognized accomplishments, challenges, and \n\t            opportunities.\n\t\n\t        The microformats tagline “humans first, machines second” \n\t            forms the basis of many of our \n\t            principles, and \n\t            in that regard, we’d like to recognize a few people and \n\t            thank them for their years of volunteer service \n\t      \n\t    Updated \n\t        June 25th, 2012","type":["h-entry"],"properties":{"name":["microformats.org at 7"],"url":["http://microformats.org/2012/06/25/microformats-org-at-7"],"content":[{"value":"Last week the microformats.org community \n\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t            San Francisco and recognized accomplishments, challenges, and \n\t            opportunities.\n\t\n\t        The microformats tagline “humans first, machines second” \n\t            forms the basis of many of our \n\t            principles, and \n\t            in that regard, we’d like to recognize a few people and \n\t            thank them for their years of volunteer service","html":"\n\t        <p class=\"p-summary\">Last week the microformats.org community \n\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t            San Francisco and recognized accomplishments, challenges, and \n\t            opportunities.</p>\n\t\n\t        <p>The microformats tagline “humans first, machines second” \n\t            forms the basis of many of our \n\t            <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n\t            in that regard, we’d like to recognize a few people and \n\t            thank them for their years of volunteer service </p>\n\t    "}],"summary":["Last week the microformats.org community \n\t            celebrated its 7th birthday at a gathering hosted by Mozilla in \n\t            San Francisco and recognized accomplishments, challenges, and \n\t            opportunities."],"updated":["2012-06-25 17:08:26"]}}]}],"rels":{},"rel-urls":{}};
 
    it('simple', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-abbrpattern.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-abbrpattern.js
@@ -11,17 +11,17 @@ describe('h-geo', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<p class=\"h-geo\">\n <abbr class=\"p-latitude\" title=\"37.408183\">N 37° 24.491</abbr>,  \n <abbr class=\"p-longitude\" title=\"-122.13855\">W 122° 08.313</abbr>\n</p>";
    var expected = {"items":[{"type":["h-geo"],"properties":{"latitude":["37.408183"],"longitude":["-122.13855"],"name":["N 37° 24.491,  \n W 122° 08.313"]}}],"rels":{},"rel-urls":{}};
 
    it('abbrpattern', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-altitude.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-altitude.js
@@ -11,17 +11,17 @@ describe('h-geo', function() {
    var htmlFragment = "<p>My favourite hill in the lakes is \n    <span class=\"h-geo\">\n        <span class=\"p-name\">Pen-y-ghent</span> \n        (Geo: <span class=\"p-latitude\">54.155278</span>,\n        <span class=\"p-longitude\">-2.249722</span>). It\n        raises to <span class=\"p-altitude\">694</span>m.\n  </span>\n</p>";
    var expected = {"items":[{"type":["h-geo"],"properties":{"name":["Pen-y-ghent"],"latitude":["54.155278"],"longitude":["-2.249722"],"altitude":["694"]}}],"rels":{},"rel-urls":{}};
 
    it('altitude', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-hidden.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-hidden.js
@@ -11,17 +11,17 @@ describe('h-geo', function() {
    var htmlFragment = "<p>\n    <span class=\"h-geo\">The Bricklayer's Arms\n        <span class=\"p-latitude\">\n            <span class=\"value-title\" title=\"51.513458\"> </span> \n        </span>\n        <span class=\"p-longitude\">\n            <span class=\"value-title\" title=\"-0.14812\"> </span>\n        </span>\n    </span>\n</p>";
    var expected = {"items":[{"type":["h-geo"],"properties":{"latitude":["51.513458"],"longitude":["-0.14812"],"name":["The Bricklayer's Arms"]}}],"rels":{},"rel-urls":{}};
 
    it('hidden', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-justaname.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-justaname.js
@@ -11,17 +11,17 @@ describe('h-geo', function() {
    var htmlFragment = "<p>On my way to The Bricklayer's Arms\n    (Geo: <span class=\"h-geo\">51.513458;-0.14812</span>)\n</p>";
    var expected = {"items":[{"type":["h-geo"],"properties":{"name":["51.513458;-0.14812"]}}],"rels":{},"rel-urls":{}};
 
    it('justaname', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-simpleproperties.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-simpleproperties.js
@@ -11,17 +11,17 @@ describe('h-geo', function() {
    var htmlFragment = "<p class=\"h-geo\">We are meeting at \n    <span class=\"p-name\">The Bricklayer's Arms</span>\n    (Geo: <span class=\"p-latitude\">51.513458</span>:\n    <span class=\"p-longitude\">-0.14812</span>)\n</p>";
    var expected = {"items":[{"type":["h-geo"],"properties":{"name":["The Bricklayer's Arms"],"latitude":["51.513458"],"longitude":["-0.14812"]}}],"rels":{},"rel-urls":{}};
 
    it('simpleproperties', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-valuetitleclass.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-geo-valuetitleclass.js
@@ -11,17 +11,17 @@ describe('h-geo', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<p>\n    <span class=\"h-geo\">\n        <span class=\"p-latitude\">\n            <span class=\"value-title\" title=\"51.513458\">N 51° 51.345</span>, \n        </span>\n        <span class=\"p-longitude\">\n            <span class=\"value-title\" title=\"-0.14812\">W -0° 14.812</span>\n        </span>\n    </span>\n</p>";
    var expected = {"items":[{"type":["h-geo"],"properties":{"latitude":["51.513458"],"longitude":["-0.14812"],"name":["N 51° 51.345, \n        \n        \n            W -0° 14.812"]}}],"rels":{},"rel-urls":{}};
 
    it('valuetitleclass', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-news-all.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-news-all.js
@@ -11,17 +11,17 @@ describe('h-news', function() {
    var htmlFragment = "<div class=\"h-news\">\n    <div class=\"p-entry h-entry\">\n        <h1><a class=\"p-name u-url\" href=\"http://microformats.org/2012/06/25/microformats-org-at-7\">microformats.org at 7</a></h1>\n        <div class=\"e-content\">\n            <p class=\"p-summary\">Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.</p>\n\n            <p>The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service </p>\n        </div>  \n        <p>Updated \n            <time class=\"dt-updated\" datetime=\"2012-06-25T17:08:26\">June 25th, 2012</time> by\n            <a class=\"p-author h-card\" href=\"http://tantek.com/\">Tantek</a>\n        </p>\n    </div>\n\n    <p>\n        <span class=\"p-dateline h-adr\">\n            <span class=\"p-locality\">San Francisco</span>, \n            <span class=\"p-region\">CA</span> \n        </span>\n        (Geo: <span class=\"p-geo\">37.774921;-122.445202</span>) \n        <span class=\"p-source-org h-card\">\n            <a class=\"p-name u-url\" href=\"http://microformats.org/\">microformats.org</a>\n        </span>\n    </p>\n    <p>\n        <a class=\"u-principles\" href=\"http://microformats.org/wiki/Category:public_domain_license\">Publishing policy</a>\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-news"],"properties":{"entry":[{"value":"microformats.org at 7","type":["h-entry"],"properties":{"name":["microformats.org at 7"],"url":["http://microformats.org/2012/06/25/microformats-org-at-7"],"content":[{"value":"Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.\n\n            The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                principles, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service","html":"\n            <p class=\"p-summary\">Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.</p>\n\n            <p>The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service </p>\n        "}],"summary":["Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities."],"updated":["2012-06-25 17:08:26"],"author":[{"value":"Tantek","type":["h-card"],"properties":{"name":["Tantek"],"url":["http://tantek.com/"]}}]}}],"dateline":[{"value":"San Francisco, \n            CA","type":["h-adr"],"properties":{"locality":["San Francisco"],"region":["CA"],"name":["San Francisco, \n            CA"]}}],"geo":["37.774921;-122.445202"],"source-org":[{"value":"microformats.org","type":["h-card"],"properties":{"name":["microformats.org"],"url":["http://microformats.org/"]}}],"principles":["http://microformats.org/wiki/Category:public_domain_license"],"name":["microformats.org at 7\n        \n            Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.\n\n            The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                principles, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service \n          \n        Updated \n            June 25th, 2012 by\n            Tantek\n        \n    \n\n    \n        \n            San Francisco, \n            CA \n        \n        (Geo: 37.774921;-122.445202) \n        \n            microformats.org\n        \n    \n    \n        Publishing policy"]}}],"rels":{},"rel-urls":{}};
 
    it('all', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-news-minimum.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-news-minimum.js
@@ -11,17 +11,17 @@ describe('h-news', function() {
    var htmlFragment = "<div class=\"h-news\">\n    <div class=\"p-entry h-entry\">\n        <h1><a class=\"p-name u-url\" href=\"http://microformats.org/2012/06/25/microformats-org-at-7\">microformats.org at 7</a></h1>\n        <div class=\"e-content\">\n            <p class=\"p-summary\">Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.</p>\n\n            <p>The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service </p>\n        </div>  \n        <p>Updated \n            <time class=\"dt-updated\" datetime=\"2012-06-25T17:08:26\">June 25th, 2012</time> by\n            <a class=\"p-author h-card\" href=\"http://tantek.com/\">Tantek</a>\n        </p>\n    </div>\n    <p>\n        <a class=\"p-source-org h-card\" href=\"http://microformats.org/\">microformats.org</a> \n    </p>\n</div>";
    var expected = {"items":[{"type":["h-news"],"properties":{"entry":[{"value":"microformats.org at 7","type":["h-entry"],"properties":{"name":["microformats.org at 7"],"url":["http://microformats.org/2012/06/25/microformats-org-at-7"],"content":[{"value":"Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.\n\n            The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                principles, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service","html":"\n            <p class=\"p-summary\">Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.</p>\n\n            <p>The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                <a href=\"http://microformats.org/wiki/principles\">principles</a>, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service </p>\n        "}],"summary":["Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities."],"updated":["2012-06-25 17:08:26"],"author":[{"value":"Tantek","type":["h-card"],"properties":{"name":["Tantek"],"url":["http://tantek.com/"]}}]}}],"source-org":[{"value":"microformats.org","type":["h-card"],"properties":{"name":["microformats.org"],"url":["http://microformats.org/"]}}],"name":["microformats.org at 7\n        \n            Last week the microformats.org community \n                celebrated its 7th birthday at a gathering hosted by Mozilla in \n                San Francisco and recognized accomplishments, challenges, and \n                opportunities.\n\n            The microformats tagline “humans first, machines second” \n                forms the basis of many of our \n                principles, and \n                in that regard, we’d like to recognize a few people and \n                thank them for their years of volunteer service \n          \n        Updated \n            June 25th, 2012 by\n            Tantek\n        \n    \n    \n        microformats.org"]}}],"rels":{},"rel-urls":{}};
 
    it('minimum', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-org-hyperlink.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-org-hyperlink.js
@@ -11,17 +11,17 @@ describe('h-org', function() {
    var htmlFragment = "<a class=\"h-org\" href=\"http://mozilla.org/\">Mozilla Foundation</a>";
    var expected = {"items":[{"type":["h-org"],"properties":{"name":["Mozilla Foundation"],"url":["http://mozilla.org/"]}}],"rels":{},"rel-urls":{}};
 
    it('hyperlink', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-org-simple.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-org-simple.js
@@ -11,17 +11,17 @@ describe('h-org', function() {
    var htmlFragment = "<span class=\"h-org\">Mozilla Foundation</span>";
    var expected = {"items":[{"type":["h-org"],"properties":{"name":["Mozilla Foundation"]}}],"rels":{},"rel-urls":{}};
 
    it('simple', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-org-simpleproperties.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-org-simpleproperties.js
@@ -11,17 +11,17 @@ describe('h-org', function() {
    var htmlFragment = "<p class=\"h-org\">\n    <span class=\"p-organization-name\">W3C</span> - \n    <span class=\"p-organization-unit\">CSS Working Group</span>\n</p>";
    var expected = {"items":[{"type":["h-org"],"properties":{"organization-name":["W3C"],"organization-unit":["CSS Working Group"],"name":["W3C - \n    CSS Working Group"]}}],"rels":{},"rel-urls":{}};
 
    it('simpleproperties', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-product-aggregate.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-product-aggregate.js
@@ -11,17 +11,17 @@ describe('h-product', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<div class=\"h-product\">\n    <h2 class=\"p-name\">Raspberry Pi</h2>\n    <img class=\"u-photo\" src=\"http://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/RaspberryPi.jpg/320px-RaspberryPi.jpg\" />\n    <p class=\"e-description\">The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It’s a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming.</p>\n    <a class=\"u-url\" href=\"http://www.raspberrypi.org/\">More info about the Raspberry Pi</a>\n    <p class=\"p-price\">£29.95</p>\n    <p class=\"p-review h-review-aggregate\">\n        <span class=\"p-rating h-rating\">\n            <span class=\"p-average\">9.2</span> out of \n            <span class=\"p-best\">10</span> \n            based on <span class=\"p-count\">178</span> reviews\n        </span>\n    </p>\n    <p>Categories: <span class=\"p-category\">Computer</span>, <span class=\"p-category\">Education</span></p>\n    <p class=\"p-brand h-card\">From: \n        <span class=\"p-name p-org\">The Raspberry Pi Foundation</span> - \n        <span class=\"p-locality\">Cambridge</span> \n        <span class=\"p-country-name\">UK</span>\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-product"],"properties":{"name":["Raspberry Pi"],"photo":["http://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/RaspberryPi.jpg/320px-RaspberryPi.jpg"],"description":[{"value":"The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It’s a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming.","html":"The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It’s a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming."}],"url":["http://www.raspberrypi.org/"],"price":["£29.95"],"review":[{"value":"9.2 out of \n            10 \n            based on 178 reviews","type":["h-review-aggregate"],"properties":{"rating":[{"value":"9.2 out of \n            10 \n            based on 178 reviews","type":["h-rating"],"properties":{"average":["9.2"],"best":["10"],"count":["178"],"name":["9.2 out of \n            10 \n            based on 178 reviews"]}}],"name":["9.2 out of \n            10 \n            based on 178 reviews"]}}],"category":["Computer","Education"],"brand":[{"value":"The Raspberry Pi Foundation","type":["h-card"],"properties":{"name":["The Raspberry Pi Foundation"],"org":["The Raspberry Pi Foundation"],"locality":["Cambridge"],"country-name":["UK"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('aggregate', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-product-justahyperlink.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-product-justahyperlink.js
@@ -11,17 +11,17 @@ describe('h-product', function() {
    var htmlFragment = "<a class=\"h-product\" href=\"http://www.raspberrypi.org/\">Raspberry Pi</a>";
    var expected = {"items":[{"type":["h-product"],"properties":{"name":["Raspberry Pi"],"url":["http://www.raspberrypi.org/"]}}],"rels":{},"rel-urls":{}};
 
    it('justahyperlink', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-product-justaname.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-product-justaname.js
@@ -11,17 +11,17 @@ describe('h-product', function() {
    var htmlFragment = "<p class=\"h-product\">Raspberry Pi</p>";
    var expected = {"items":[{"type":["h-product"],"properties":{"name":["Raspberry Pi"]}}],"rels":{},"rel-urls":{}};
 
    it('justaname', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-product-simpleproperties.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-product-simpleproperties.js
@@ -11,17 +11,17 @@ describe('h-product', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<div class=\"h-product\">\n    <h2 class=\"p-name\">Raspberry Pi</h2>\n    <img class=\"u-photo\" src=\"http://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/RaspberryPi.jpg/320px-RaspberryPi.jpg\" />\n    <p class=\"e-description\">The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It’s a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming.</p>\n    <a class=\"u-url\" href=\"http://www.raspberrypi.org/\">More info about the Raspberry Pi</a>\n    <p class=\"p-price\">£29.95</p>\n    <p class=\"p-review h-review\"><span class=\"p-rating\">4.5</span> out of 5</p>\n    <p>Categories: <span class=\"p-category\">Computer</span>, <span class=\"p-category\">Education</span></p>\n</div>";
    var expected = {"items":[{"type":["h-product"],"properties":{"name":["Raspberry Pi"],"photo":["http://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/RaspberryPi.jpg/320px-RaspberryPi.jpg"],"description":[{"value":"The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It’s a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming.","html":"The Raspberry Pi is a credit-card sized computer that plugs into your TV and a keyboard. It’s a capable little PC which can be used for many of the things that your desktop PC does, like spreadsheets, word-processing and games. It also plays high-definition video. We want to see it being used by kids all over the world to learn programming."}],"url":["http://www.raspberrypi.org/"],"price":["£29.95"],"category":["Computer","Education"],"review":[{"value":"4.5 out of 5","type":["h-review"],"properties":{"rating":["4.5"],"name":["4.5 out of 5"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('simpleproperties', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-recipe-all.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-recipe-all.js
@@ -11,17 +11,17 @@ describe('h-recipe', function() {
    var htmlFragment = "<section class=\"h-recipe\">\n    <h1 class=\"p-name\">Yorkshire Puddings</h1>      \n    <p class=\"p-summary\">Makes <span class=\"p-yield\">6 good sized Yorkshire puddings</span>, the way my mum taught me</p>\n\n\n    <p><img class=\"u-photo\" src=\"http://codebits.glennjones.net/semantic/yorkshire-puddings.jpg\" /></p>\n\n    <span class=\"p-review h-review-aggregate\">\n        <span class=\"p-rating\">\n            <span class=\"p-average\">4.5</span> stars out 5 based on </span>\n            <span class=\"p-count\">35</span> reviews</span>\n         \n    \n\n    <div id=\"ingredients-container\">\n        <h3>Ingredients</h3>\n        <ul>\n            <li class=\"e-ingredient\">1 egg</li>\n            <li class=\"e-ingredient\">75g plain flour</li>\n            <li class=\"e-ingredient\">70ml milk</li>\n            <li class=\"e-ingredient\">60ml water</li>\n            <li class=\"e-ingredient\">Pinch of salt</li>\n        </ul>\n    </div>\n\n    <h3>Time</h3>\n    <ul>\n        <li class=\"prepTime\">Preparation <span class=\"value-title\" title=\"PT0H10M\">10 mins</span></li>\n        <li class=\"cookTime\">Cook <span class=\"value-title\" title=\"PT0H25M\">25 mins</span></li>\n    </ul> \n\n\n    <h3>Instructions</h3>\n    <div class=\"e-instructions\">\n        <ol>\n            <li>Pre-heat oven to 230C or gas mark 8. Pour the vegetable oil evenly into 2 x 4-hole \n            Yorkshire pudding tins and place in the oven to heat through.</li> \n            \n            <li>To make the batter, add all the flour into a bowl and beat in the eggs until smooth. \n            Gradually add the milk and water while beating the mixture. It should be smooth and \n            without lumps. Finally add a pinch of salt.</li>\n            \n            <li>Make sure the oil is piping hot before pouring the batter evenly into the tins. \n            Place in the oven for 20-25 minutes until pudding have risen and look golden brown</li>\n        </ol>\n    </div>\n\n    <h3>Nutrition</h3>\n    <ul id=\"nutrition-list\">\n        <li class=\"p-nutrition\">Calories: <span class=\"calories\">125</span></li>\n        <li class=\"p-nutrition\">Fat: <span class=\"fat\">3.2g</span></li>\n        <li class=\"p-nutrition\">Cholesterol: <span class=\"cholesterol\">77mg</span></li>\n    </ul>\n    <p>(Amount per pudding)</p>\n\n    <p>\n        Published on <time class=\"dt-published\" datetime=\"2011-10-27\">27 Oct 2011</time> by \n        <span class=\"p-author h-card\">\n            <a class=\"p-name u-url\" href=\"http://glennjones.net\">Glenn Jones</a>\n        </span>\n    </p>\n    <a href=\"http://www.flickr.com/photos/dithie/4106528495/\">Photo by dithie</a>\n    </section>";
    var expected = {"items":[{"type":["h-recipe"],"properties":{"name":["Yorkshire Puddings"],"summary":["Makes 6 good sized Yorkshire puddings, the way my mum taught me"],"yield":["6 good sized Yorkshire puddings"],"photo":["http://codebits.glennjones.net/semantic/yorkshire-puddings.jpg"],"review":[{"value":"4.5 stars out 5 based on \n            35 reviews","type":["h-review-aggregate"],"properties":{"rating":["4.5 stars out 5 based on"],"average":["4.5"],"count":["35"],"name":["4.5 stars out 5 based on \n            35 reviews"]}}],"ingredient":[{"value":"1 egg","html":"1 egg"},{"value":"75g plain flour","html":"75g plain flour"},{"value":"70ml milk","html":"70ml milk"},{"value":"60ml water","html":"60ml water"},{"value":"Pinch of salt","html":"Pinch of salt"}],"instructions":[{"value":"Pre-heat oven to 230C or gas mark 8. Pour the vegetable oil evenly into 2 x 4-hole \n            Yorkshire pudding tins and place in the oven to heat through. \n            \n            To make the batter, add all the flour into a bowl and beat in the eggs until smooth. \n            Gradually add the milk and water while beating the mixture. It should be smooth and \n            without lumps. Finally add a pinch of salt.\n            \n            Make sure the oil is piping hot before pouring the batter evenly into the tins. \n            Place in the oven for 20-25 minutes until pudding have risen and look golden brown","html":"\n        <ol>\n            <li>Pre-heat oven to 230C or gas mark 8. Pour the vegetable oil evenly into 2 x 4-hole \n            Yorkshire pudding tins and place in the oven to heat through.</li> \n            \n            <li>To make the batter, add all the flour into a bowl and beat in the eggs until smooth. \n            Gradually add the milk and water while beating the mixture. It should be smooth and \n            without lumps. Finally add a pinch of salt.</li>\n            \n            <li>Make sure the oil is piping hot before pouring the batter evenly into the tins. \n            Place in the oven for 20-25 minutes until pudding have risen and look golden brown</li>\n        </ol>\n    "}],"nutrition":["Calories: 125","Fat: 3.2g","Cholesterol: 77mg"],"published":["2011-10-27"],"author":[{"value":"Glenn Jones","type":["h-card"],"properties":{"name":["Glenn Jones"],"url":["http://glennjones.net"]}}],"url":["http://www.flickr.com/photos/dithie/4106528495/"]}}],"rels":{},"rel-urls":{}};
 
    it('all', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-recipe-minimum.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-recipe-minimum.js
@@ -11,17 +11,17 @@ describe('h-recipe', function() {
    var htmlFragment = "<div class=\"h-recipe\">  \n    <p class=\"p-name\">Toast</p>\n    <ul>\n        <li class=\"e-ingredient\">Slice of bread</li>\n        <li class=\"e-ingredient\">Butter</li>\n    </ul>\n</div>";
    var expected = {"items":[{"type":["h-recipe"],"properties":{"name":["Toast"],"ingredient":[{"value":"Slice of bread","html":"Slice of bread"},{"value":"Butter","html":"Butter"}]}}],"rels":{},"rel-urls":{}};
 
    it('minimum', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-affiliation.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-affiliation.js
@@ -11,17 +11,17 @@ describe('h-resume', function() {
    var htmlFragment = "<div class=\"h-resume\">\n    <p>\n        <span class=\"p-name\">Tim Berners-Lee</span>, \n        <span class=\"p-summary\">invented the World Wide Web</span>. \n    </p> \n    Belongs to following groups:\n    <p>   \n        <a class=\"p-affiliation h-card\" href=\"http://www.w3.org/\">\n            <img class=\"p-name u-photo\" alt=\"W3C\" src=\"http://www.w3.org/Icons/WWW/w3c_home_nb.png\" />\n        </a>\n    </p>   \n</div>";
    var expected = {"items":[{"type":["h-resume"],"properties":{"name":["Tim Berners-Lee"],"summary":["invented the World Wide Web"],"affiliation":[{"type":["h-card"],"properties":{"name":["W3C"],"photo":["http://www.w3.org/Icons/WWW/w3c_home_nb.png"],"url":["http://www.w3.org/"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('affiliation', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-contact.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-contact.js
@@ -11,17 +11,17 @@ describe('h-resume', function() {
    var htmlFragment = "<div class=\"h-resume\">\n    <p class=\"p-name\">Tim Berners-Lee</p>\n    <p class=\"p-summary\">Invented the World Wide Web.</p><hr />\n    <div class=\"p-contact h-card\">\n        <p class=\"p-name\">MIT</p>\n        <p>\n            <span class=\"p-street-address\">32 Vassar Street</span>, \n            <span class=\"p-extended-address\">Room 32-G524</span>, \n            <span class=\"p-locality\">Cambridge</span>,  \n            <span class=\"p-region\">MA</span> \n            <span class=\"p-postal-code\">02139</span>, \n            <span class=\"p-country-name\">USA</span>.\n        </p>\n        <p>Tel:<span class=\"p-tel\">+1 (617) 253 5702</span></p>\n        <p>Email:<a class=\"u-email\" href=\"mailto:timbl@w3.org\">timbl@w3.org</a></p>\n    </div>\n</div>";
    var expected = {"items":[{"type":["h-resume"],"properties":{"name":["Tim Berners-Lee"],"summary":["Invented the World Wide Web."],"contact":[{"value":"MIT","type":["h-card"],"properties":{"name":["MIT"],"street-address":["32 Vassar Street"],"extended-address":["Room 32-G524"],"locality":["Cambridge"],"region":["MA"],"postal-code":["02139"],"country-name":["USA"],"tel":["+1 (617) 253 5702"],"email":["mailto:timbl@w3.org"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('contact', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-education.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-education.js
@@ -11,17 +11,17 @@ describe('h-resume', function() {
    var htmlFragment = "<div class=\"h-resume\">\n    <p class=\"p-name\">Tim Berners-Lee</p>\n    <div class=\"p-contact h-card\">\n        <p class=\"p-title\">Director of the World Wide Web Foundation</p>\n    </div>\n    <p class=\"p-summary\">Invented the World Wide Web.</p><hr />\n    <p class=\"p-education h-event h-card\">\n        <span class=\"p-name p-org\">The Queen's College, Oxford University</span>, \n        <span class=\"p-description\">BA Hons (I) Physics</span> \n        <time class=\"dt-start\" datetime=\"1973-09\">1973</time> –\n        <time class=\"dt-end\" datetime=\"1976-06\">1976</time>\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-resume"],"properties":{"name":["Tim Berners-Lee"],"contact":[{"value":"Director of the World Wide Web Foundation","type":["h-card"],"properties":{"title":["Director of the World Wide Web Foundation"],"name":["Director of the World Wide Web Foundation"]}}],"summary":["Invented the World Wide Web."],"education":[{"value":"The Queen's College, Oxford University","type":["h-event","h-card"],"properties":{"name":["The Queen's College, Oxford University"],"org":["The Queen's College, Oxford University"],"description":["BA Hons (I) Physics"],"start":["1973-09"],"end":["1976-06"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('education', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-justaname.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-justaname.js
@@ -11,17 +11,17 @@ describe('h-resume', function() {
    var htmlFragment = "<p class=\"h-resume\">Tim Berners-Lee, invented the World Wide Web.</p>";
    var expected = {"items":[{"type":["h-resume"],"properties":{"name":["Tim Berners-Lee, invented the World Wide Web."]}}],"rels":{},"rel-urls":{}};
 
    it('justaname', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-skill.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-skill.js
@@ -11,17 +11,17 @@ describe('h-resume', function() {
    var htmlFragment = "<div class=\"h-resume\">\n    <p>\n        <span class=\"p-name\">Tim Berners-Lee</span>, \n        <span class=\"p-summary\">invented the World Wide Web</span>.\n    </p>\n    Skills:     \n    <ul>\n        <li class=\"p-skill\">information systems</li>\n        <li class=\"p-skill\">advocacy</li>\n        <li class=\"p-skill\">leadership</li>\n    <ul>   \n</ul></ul></div>";
    var expected = {"items":[{"type":["h-resume"],"properties":{"name":["Tim Berners-Lee"],"summary":["invented the World Wide Web"],"skill":["information systems","advocacy","leadership"]}}],"rels":{},"rel-urls":{}};
 
    it('skill', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-work.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-resume-work.js
@@ -11,17 +11,17 @@ describe('h-resume', function() {
    var htmlFragment = "<meta charset=\"utf-8\">\n<div class=\"h-resume\">\n    <p class=\"p-name\">Tim Berners-Lee</p>\n    <div class=\"p-contact h-card\">\n        <p class=\"p-title\">Director of the World Wide Web Foundation</p>\n    </div>\n    <p class=\"p-summary\">Invented the World Wide Web.</p><hr />\n    <div class=\"p-experience h-event h-card\">\n        <p class=\"p-title\">Director</p>\n        <p><a class=\"p-name p-org u-url\" href=\"http://www.webfoundation.org/\">World Wide Web Foundation</a></p>\n        <p>\n            <time class=\"dt-start\" datetime=\"2009-01-18\">Jan 2009</time> – Present\n            <time class=\"dt-duration\" datetime=\"P2Y11M\">(2 years 11 month)</time>\n        </p>\n    </div>\n</div>";
    var expected = {"items":[{"type":["h-resume"],"properties":{"name":["Tim Berners-Lee"],"contact":[{"value":"Director of the World Wide Web Foundation","type":["h-card"],"properties":{"title":["Director of the World Wide Web Foundation"],"name":["Director of the World Wide Web Foundation"]}}],"summary":["Invented the World Wide Web."],"experience":[{"value":"World Wide Web Foundation","type":["h-event","h-card"],"properties":{"title":["Director"],"name":["World Wide Web Foundation"],"org":["World Wide Web Foundation"],"url":["http://www.webfoundation.org/"],"start":["2009-01-18"],"duration":["P2Y11M"]}}]}}],"rels":{},"rel-urls":{}};
 
    it('work', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-aggregate-hevent.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-aggregate-hevent.js
@@ -11,17 +11,17 @@ describe('h-review-aggregate', function(
    var htmlFragment = "<div class=\"h-review-aggregate\">\n    <div class=\"p-item h-event\">\n        <h3 class=\"p-name\">Fullfrontal</h3>\n        <p class=\"p-description\">A one day JavaScript Conference held in Brighton</p>\n        <p><time class=\"dt-start\" datetime=\"2012-11-09\">9th November 2012</time></p>    \n    </div> \n    \n    <p class=\"p-rating\">\n        <span class=\"p-average value\">9.9</span> out of \n        <span class=\"p-best\">10</span> \n        based on <span class=\"p-count\">62</span> reviews\n    </p>\n</div>";
    var expected = {"items":[{"type":["h-review-aggregate"],"properties":{"item":[{"value":"Fullfrontal","type":["h-event"],"properties":{"name":["Fullfrontal"],"description":["A one day JavaScript Conference held in Brighton"],"start":["2012-11-09"]}}],"rating":["9.9"],"average":["9.9"],"best":["10"],"count":["62"],"name":["Fullfrontal\n        A one day JavaScript Conference held in Brighton\n        9th November 2012    \n     \n    \n    \n        9.9 out of \n        10 \n        based on 62 reviews"]}}],"rels":{},"rel-urls":{}};
 
    it('hevent', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-aggregate-justahyperlink.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-aggregate-justahyperlink.js
@@ -11,17 +11,17 @@ describe('h-review-aggregate', function(
    var htmlFragment = "<div class=\"h-review-aggregate\">\n    <h3 class=\"p-item h-item\">Mediterranean Wraps</h3>\n     <span class=\"p-summary\">\n        Customers flock to this small restaurant for their \n        tasty falafel and shawerma wraps and welcoming staff.\n    </span>\n    <span class=\"p-rating\">4.5</span> out of 5 \n</div>";
    var expected = {"items":[{"type":["h-review-aggregate"],"properties":{"item":[{"value":"Mediterranean Wraps","type":["h-item"],"properties":{"name":["Mediterranean Wraps"]}}],"summary":["Customers flock to this small restaurant for their \n        tasty falafel and shawerma wraps and welcoming staff."],"rating":["4.5"],"name":["Mediterranean Wraps\n     \n        Customers flock to this small restaurant for their \n        tasty falafel and shawerma wraps and welcoming staff.\n    \n    4.5 out of 5"]}}],"rels":{},"rel-urls":{}};
 
    it('justahyperlink', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-aggregate-simpleproperties.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-aggregate-simpleproperties.js
@@ -11,17 +11,17 @@ describe('h-review-aggregate', function(
    var htmlFragment = "<div class=\"h-review-aggregate\">\n    <div class=\"p-item h-card\">\n        <h3 class=\"p-name\">Mediterranean Wraps</h3>\n        <p>\n            <span class=\"p-street-address\">433 S California Ave</span>, \n            <span class=\"p-locality\">Palo Alto</span>, \n            <span class=\"p-region\">CA</span> - \n            <span class=\"p-tel\">(650) 321-8189</span>\n        </p>\n    </div> \n    <span class=\"p-summary\">Customers flock to this small restaurant for their \n    tasty falafel and shawerma wraps and welcoming staff.</span>\n    <span class=\"p-rating\">\n        <span class=\"p-average value\">9.2</span> out of \n        <span class=\"p-best\">10</span> \n        based on <span class=\"p-count\">17</span> reviews\n    </span>\n</div>";
    var expected = {"items":[{"type":["h-review-aggregate"],"properties":{"item":[{"value":"Mediterranean Wraps","type":["h-card"],"properties":{"name":["Mediterranean Wraps"],"street-address":["433 S California Ave"],"locality":["Palo Alto"],"region":["CA"],"tel":["(650) 321-8189"]}}],"summary":["Customers flock to this small restaurant for their \n    tasty falafel and shawerma wraps and welcoming staff."],"rating":["9.2"],"average":["9.2"],"best":["10"],"count":["17"],"name":["Mediterranean Wraps\n        \n            433 S California Ave, \n            Palo Alto, \n            CA - \n            (650) 321-8189\n        \n     \n    Customers flock to this small restaurant for their \n    tasty falafel and shawerma wraps and welcoming staff.\n    \n        9.2 out of \n        10 \n        based on 17 reviews"]}}],"rels":{},"rel-urls":{}};
 
    it('simpleproperties', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-hyperlink.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-hyperlink.js
@@ -11,17 +11,17 @@ describe('h-review', function() {
    var htmlFragment = "<a class=\"h-review\" href=\"https://plus.google.com/116941523817079328322/about\">Crepes on Cole</a>";
    var expected = {"items":[{"type":["h-review"],"properties":{"name":["Crepes on Cole"],"url":["https://plus.google.com/116941523817079328322/about"]}}],"rels":{},"rel-urls":{}};
 
    it('hyperlink', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-implieditem.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-implieditem.js
@@ -11,17 +11,17 @@ describe('h-review', function() {
    var htmlFragment = "<div class=\"h-review\">\n    <a class=\"p-item h-item\" href=\"http://example.com/crepeoncole\">Crepes on Cole</a>\n    <p><span class=\"p-rating\">4.7</span> out of 5 stars</p>\n</div>";
    var expected = {"items":[{"type":["h-review"],"properties":{"item":[{"value":"Crepes on Cole","type":["h-item"],"properties":{"name":["Crepes on Cole"],"url":["http://example.com/crepeoncole"]}}],"rating":["4.7"],"name":["Crepes on Cole\n    4.7 out of 5 stars"]}}],"rels":{},"rel-urls":{}};
 
    it('implieditem', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-item.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-item.js
@@ -11,17 +11,17 @@ describe('h-review', function() {
    var htmlFragment = "<base href=\"http://example.com\" >\n<div class=\"h-review\">\n    <p class=\"p-item h-item\">\n        <img class=\"u-photo\" src=\"images/photo.gif\" />\n        <a class=\"p-name u-url\" href=\"http://example.com/crepeoncole\">Crepes on Cole</a>\n    </p>\n    <p><span class=\"p-rating\">5</span> out of 5 stars</p>\n</div>";
    var expected = {"items":[{"type":["h-review"],"properties":{"item":[{"value":"Crepes on Cole","type":["h-item"],"properties":{"photo":["http://example.com/images/photo.gif"],"name":["Crepes on Cole"],"url":["http://example.com/crepeoncole"]}}],"rating":["5"],"name":["Crepes on Cole\n    \n    5 out of 5 stars"]}}],"rels":{},"rel-urls":{}};
 
    it('item', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-justaname.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-justaname.js
@@ -11,17 +11,17 @@ describe('h-review', function() {
    var htmlFragment = "<p class=\"h-review\">Crepes on Cole</p>";
    var expected = {"items":[{"type":["h-review"],"properties":{"name":["Crepes on Cole"]}}],"rels":{},"rel-urls":{}};
 
    it('justaname', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-photo.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-photo.js
@@ -11,17 +11,17 @@ describe('h-review', function() {
    var htmlFragment = "<base href=\"http://example.com\" ><img class=\"h-review\" src=\"images/photo.gif\" alt=\"Crepes on Cole\" />";
    var expected = {"items":[{"type":["h-review"],"properties":{"name":["Crepes on Cole"],"photo":["http://example.com/images/photo.gif"]}}],"rels":{},"rel-urls":{}};
 
    it('photo', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-vcard.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-h-review-vcard.js
@@ -11,17 +11,17 @@ describe('h-review', function() {
    var htmlFragment = "<div class=\"h-review\">\n    <span><span class=\"p-rating\">5</span> out of 5 stars</span>\n    <h4 class=\"p-name\">Crepes on Cole is awesome</h4>\n    <span class=\"p-reviewer h-card\">\n        Reviewer: <span class=\"p-name\">Tantek</span> - \n    </span>\n    <time class=\"dt-reviewed\" datetime=\"2005-04-18\">April 18, 2005</time>\n    <div class=\"e-description\">\n        <p class=\"p-item h-card\">\n        <span class=\"p-name p-org\">Crepes on Cole</span> is one of the best little \n        creperies in <span class=\"p-adr h-adr\"><span class=\"p-locality\">San Francisco</span></span>.\n        Excellent food and service. Plenty of tables in a variety of sizes \n        for parties large and small.  Window seating makes for excellent \n        people watching to/from the N-Judah which stops right outside.  \n        I've had many fun social gatherings here, as well as gotten \n        plenty of work done thanks to neighborhood WiFi.\n        </p>\n    </div>\n    <p>Visit date: <span>April 2005</span></p>\n    <p>Food eaten: <a class=\"p-category\" href=\"http://en.wikipedia.org/wiki/crepe\">crepe</a></p>\n    <p>Permanent link for review: <a class=\"u-url\" href=\"http://example.com/crepe\">http://example.com/crepe</a></p>\n    <p><a rel=\"license\" href=\"http://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License\">Creative Commons Attribution-ShareAlike License</a></p>\n</div>";
    var expected = {"items":[{"type":["h-review"],"properties":{"rating":["5"],"name":["Crepes on Cole is awesome"],"reviewer":[{"value":"Tantek","type":["h-card"],"properties":{"name":["Tantek"]}}],"reviewed":["2005-04-18"],"description":[{"value":"Crepes on Cole is one of the best little \n        creperies in San Francisco.\n        Excellent food and service. Plenty of tables in a variety of sizes \n        for parties large and small.  Window seating makes for excellent \n        people watching to/from the N-Judah which stops right outside.  \n        I've had many fun social gatherings here, as well as gotten \n        plenty of work done thanks to neighborhood WiFi.","html":"\n        <p class=\"p-item h-card\">\n        <span class=\"p-name p-org\">Crepes on Cole</span> is one of the best little \n        creperies in <span class=\"p-adr h-adr\"><span class=\"p-locality\">San Francisco</span></span>.\n        Excellent food and service. Plenty of tables in a variety of sizes \n        for parties large and small.  Window seating makes for excellent \n        people watching to/from the N-Judah which stops right outside.  \n        I've had many fun social gatherings here, as well as gotten \n        plenty of work done thanks to neighborhood WiFi.\n        </p>\n    "}],"item":[{"value":"Crepes on Cole","type":["h-card"],"properties":{"name":["Crepes on Cole"],"org":["Crepes on Cole"],"adr":[{"value":"San Francisco","type":["h-adr"],"properties":{"locality":["San Francisco"],"name":["San Francisco"]}}]}}],"category":["crepe"],"url":["http://example.com/crepe"]}}],"rels":{"license":["http://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License"]},"rel-urls":{"http://en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License":{"text":"Creative Commons Attribution-ShareAlike License","rels":["license"]}}};
 
    it('vcard', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-rel-duplicate-rels.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-rel-duplicate-rels.js
@@ -11,17 +11,17 @@ describe('rel', function() {
    var htmlFragment = "<a href=\"http://ma.tt/2015/05/beethoven-mozart-bach/\" \n    title=\"Permalink to Beethoven, Mozart, Bach\" rel=\"bookmark\">\n<time class=\"entry-date\" datetime=\"2015-05-31T22:42:00+00:00\">May 31, 2015</time></a></span>\n<a href=\"http://ma.tt/category/asides/\" rel=\"category tag\">Asides</a>\n<span class=\"author vcard\">\n<a class=\"url fn n\" href=\"http://ma.tt/author/saxmatt/\" \n    title=\"View all posts by Matt\" rel=\"author\">Matt</a></span>\n<span class=\"date\"><a href=\"http://ma.tt/2015/06/jefferson-on-idleness/\" title=\"Permalink to Jefferson on Idleness\" rel=\"bookmark\"><time class=\"entry-date\" datetime=\"2015-06-02T21:26:00+00:00\">June 2, 2015</time></a></span>\n<span class=\"categories-links\"><a href=\"http://ma.tt/category/asides/\" rel=\"category tag\">Asides</a></span>\n<span class=\"author vcard\"><a class=\"url fn n\" href=\"http://ma.tt/author/saxmatt/\" title=\"View all posts by Matt\" rel=\"author\">Matt</a></span>\n";
    var expected = {"rels":{"bookmark":["http://ma.tt/2015/05/beethoven-mozart-bach/","http://ma.tt/2015/06/jefferson-on-idleness/"],"category":["http://ma.tt/category/asides/"],"tag":["http://ma.tt/category/asides/"],"author":["http://ma.tt/author/saxmatt/"]},"items":[{"type":["h-card"],"properties":{"url":["http://ma.tt/author/saxmatt/"],"name":["Matt"]}},{"type":["h-card"],"properties":{"url":["http://ma.tt/author/saxmatt/"],"name":["Matt"]}}],"rel-urls":{"http://ma.tt/category/asides/":{"rels":["category","tag"],"text":"Asides"},"http://ma.tt/author/saxmatt/":{"rels":["author"],"text":"Matt","title":"View all posts by Matt"},"http://ma.tt/2015/05/beethoven-mozart-bach/":{"rels":["bookmark"],"text":"May 31, 2015","title":"Permalink to Beethoven, Mozart, Bach"},"http://ma.tt/2015/06/jefferson-on-idleness/":{"rels":["bookmark"],"text":"June 2, 2015","title":"Permalink to Jefferson on Idleness"}}};
 
    it('duplicate-rels', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-rel-license.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-rel-license.js
@@ -11,17 +11,17 @@ describe('rel', function() {
    var htmlFragment = "<a rel=\"license\" href=\"http://creativecommons.org/licenses/by/2.5/\">cc by 2.5</a>";
    var expected = {"items":[],"rels":{"license":["http://creativecommons.org/licenses/by/2.5/"]},"rel-urls":{"http://creativecommons.org/licenses/by/2.5/":{"text":"cc by 2.5","rels":["license"]}}};
 
    it('license', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-rel-nofollow.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-rel-nofollow.js
@@ -11,17 +11,17 @@ describe('rel', function() {
    var htmlFragment = "<a rel=\"nofollow\" href=\"http://microformats.org/wiki/microformats:copyrights\">Copyrights</a>";
    var expected = {"items":[],"rels":{"nofollow":["http://microformats.org/wiki/microformats:copyrights"]},"rel-urls":{"http://microformats.org/wiki/microformats:copyrights":{"text":"Copyrights","rels":["nofollow"]}}};
 
    it('nofollow', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-rel-rel-urls.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-rel-rel-urls.js
@@ -11,17 +11,17 @@ describe('rel', function() {
    var htmlFragment = "<a rel=\"author\" href=\"http://example.com/a\">author a</a>\n<a rel=\"author\" href=\"http://example.com/b\">author b</a>\n<a rel=\"in-reply-to\" href=\"http://example.com/1\">post 1</a>\n<a rel=\"in-reply-to\" href=\"http://example.com/2\">post 2</a>\n<a rel=\"alternate home\"\n   href=\"http://example.com/fr\"\n   media=\"handheld\"\n   hreflang=\"fr\">French mobile homepage</a>";
    var expected = {"items":[],"rels":{"author":["http://example.com/a","http://example.com/b"],"in-reply-to":["http://example.com/1","http://example.com/2"],"home":["http://example.com/fr"],"alternate":["http://example.com/fr"]},"rel-urls":{"http://example.com/a":{"rels":["author"],"text":"author a"},"http://example.com/b":{"rels":["author"],"text":"author b"},"http://example.com/1":{"rels":["in-reply-to"],"text":"post 1"},"http://example.com/2":{"rels":["in-reply-to"],"text":"post 2"},"http://example.com/fr":{"rels":["alternate","home"],"media":"handheld","hreflang":"fr","text":"French mobile homepage"}}};
 
    it('rel-urls', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-rel-varying-text-duplicate-rels.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-rel-varying-text-duplicate-rels.js
@@ -11,17 +11,17 @@ describe('rel', function() {
    var htmlFragment = "This is a contrived example - not found links like this in the wild:\n<a href=\"http://ma.tt/category/asides/\" rel=\"category tag\">Asides</a>\n<a href=\"http://ma.tt/category/asides/\" rel=\"category tag\">B-sides</a>\n<a href=\"http://ma.tt/category/asides/\" rel=\"category tag\">seasides</a>";
    var expected = {"rels":{"category":["http://ma.tt/category/asides/"],"tag":["http://ma.tt/category/asides/"]},"items":[],"rel-urls":{"http://ma.tt/category/asides/":{"rels":["category","tag"],"text":"Asides"}}};
 
    it('varying-text-duplicate-rels', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-rel-xfn-all.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-rel-xfn-all.js
@@ -11,17 +11,17 @@ describe('rel', function() {
    var htmlFragment = "<ul>\n    <li><a rel=\"friend\" href=\"http://example.com/profile/jane\">jane</a></li>\n    <li><a rel=\"acquaintance\" href=\"http://example.com/profile/jeo\">jeo</a></li>\n    <li><a rel=\"contact\" href=\"http://example.com/profile/lily\">lily</a></li>\n    <li><a rel=\"met\" href=\"http://example.com/profile/oliver\">oliver</a></li>\n    <li><a rel=\"co-worker\" href=\"http://example.com/profile/emily\">emily</a></li>\n    <li><a rel=\"colleague\" href=\"http://example.com/profile/jack\">jack</a></li>\n    <li><a rel=\"neighbor\" href=\"http://example.com/profile/isabella\">isabella</a></li>\n    <li><a rel=\"child\" href=\"http://example.com/profile/harry\">harry</a></li>\n    <li><a rel=\"parent\" href=\"http://example.com/profile/sophia\">sophia</a></li>\n    <li><a rel=\"sibling\" href=\"http://example.com/profile/charlie\">charlie</a></li>\n    <li><a rel=\"spouse\" href=\"http://example.com/profile/olivia\">olivia</a></li>\n    <li><a rel=\"kin\" href=\"http://example.com/profile/james\">james</a></li>\n    <li><a rel=\"muse\" href=\"http://example.com/profile/ava\">ava</a></li>\n    <li><a rel=\"crush\" href=\"http://example.com/profile/joshua\">joshua</a></li>\n    <li><a rel=\"date\" href=\"http://example.com/profile/chloe\">chloe</a></li>\n    <li><a rel=\"sweetheart\" href=\"http://example.com/profile/alfie\">alfie</a></li>\n    <li><a rel=\"me\" href=\"http://example.com/profile/isla\">isla</a></li>\n</ul>";
    var expected = {"items":[],"rels":{"friend":["http://example.com/profile/jane"],"acquaintance":["http://example.com/profile/jeo"],"contact":["http://example.com/profile/lily"],"met":["http://example.com/profile/oliver"],"co-worker":["http://example.com/profile/emily"],"colleague":["http://example.com/profile/jack"],"neighbor":["http://example.com/profile/isabella"],"child":["http://example.com/profile/harry"],"parent":["http://example.com/profile/sophia"],"sibling":["http://example.com/profile/charlie"],"spouse":["http://example.com/profile/olivia"],"kin":["http://example.com/profile/james"],"muse":["http://example.com/profile/ava"],"crush":["http://example.com/profile/joshua"],"date":["http://example.com/profile/chloe"],"sweetheart":["http://example.com/profile/alfie"],"me":["http://example.com/profile/isla"]},"rel-urls":{"http://example.com/profile/jane":{"text":"jane","rels":["friend"]},"http://example.com/profile/jeo":{"text":"jeo","rels":["acquaintance"]},"http://example.com/profile/lily":{"text":"lily","rels":["contact"]},"http://example.com/profile/oliver":{"text":"oliver","rels":["met"]},"http://example.com/profile/emily":{"text":"emily","rels":["co-worker"]},"http://example.com/profile/jack":{"text":"jack","rels":["colleague"]},"http://example.com/profile/isabella":{"text":"isabella","rels":["neighbor"]},"http://example.com/profile/harry":{"text":"harry","rels":["child"]},"http://example.com/profile/sophia":{"text":"sophia","rels":["parent"]},"http://example.com/profile/charlie":{"text":"charlie","rels":["sibling"]},"http://example.com/profile/olivia":{"text":"olivia","rels":["spouse"]},"http://example.com/profile/james":{"text":"james","rels":["kin"]},"http://example.com/profile/ava":{"text":"ava","rels":["muse"]},"http://example.com/profile/joshua":{"text":"joshua","rels":["crush"]},"http://example.com/profile/chloe":{"text":"chloe","rels":["date"]},"http://example.com/profile/alfie":{"text":"alfie","rels":["sweetheart"]},"http://example.com/profile/isla":{"text":"isla","rels":["me"]}}};
 
    it('xfn-all', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+           'document': doc,
+           'node': doc,
+           'baseUrl': 'http://example.com',
+           'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/standards-tests/mf-v2-rel-xfn-elsewhere.js
+++ b/toolkit/components/microformats/test/standards-tests/mf-v2-rel-xfn-elsewhere.js
@@ -11,17 +11,17 @@ describe('rel', function() {
    var htmlFragment = "<ul>\n    <li><a rel=\"me\" href=\"http://twitter.com/glennjones\">twitter</a></li>\n    <li><a rel=\"me\" href=\"http://delicious.com/glennjonesnet/\">delicious</a></li>\n    <li><a rel=\"me\" href=\"https://plus.google.com/u/0/105161464208920272734/about\">google+</a></li>\n    <li><a rel=\"me\" href=\"http://lanyrd.com/people/glennjones/\">lanyrd</a></li>\n    <li><a rel=\"me\" href=\"http://github.com/glennjones\">github</a></li>\n    <li><a rel=\"me\" href=\"http://www.flickr.com/photos/glennjonesnet/\">flickr</a></li>\n    <li><a rel=\"me\" href=\"http://www.linkedin.com/in/glennjones\">linkedin</a></li>\n    <li><a rel=\"me\" href=\"http://www.slideshare.net/glennjones/presentations\">slideshare</a></li>\n</ul>";
    var expected = {"items":[],"rels":{"me":["http://twitter.com/glennjones","http://delicious.com/glennjonesnet/","https://plus.google.com/u/0/105161464208920272734/about","http://lanyrd.com/people/glennjones/","http://github.com/glennjones","http://www.flickr.com/photos/glennjonesnet/","http://www.linkedin.com/in/glennjones","http://www.slideshare.net/glennjones/presentations"]},"rel-urls":{"http://twitter.com/glennjones":{"text":"twitter","rels":["me"]},"http://delicious.com/glennjonesnet/":{"text":"delicious","rels":["me"]},"https://plus.google.com/u/0/105161464208920272734/about":{"text":"google+","rels":["me"]},"http://lanyrd.com/people/glennjones/":{"text":"lanyrd","rels":["me"]},"http://github.com/glennjones":{"text":"github","rels":["me"]},"http://www.flickr.com/photos/glennjonesnet/":{"text":"flickr","rels":["me"]},"http://www.linkedin.com/in/glennjones":{"text":"linkedin","rels":["me"]},"http://www.slideshare.net/glennjones/presentations":{"text":"slideshare","rels":["me"]}}};
 
    it('xfn-elsewhere', function(){
        var doc, dom, node, options, parser, found;
        dom = new DOMParser();
        doc = dom.parseFromString( htmlFragment, 'text/html' );
        options ={
-       		'document': doc,
-       		'node': doc,
-       		'baseUrl': 'http://example.com',
-       		'dateFormat': 'html5'
+          'document': doc,
+          'node': doc,
+          'baseUrl': 'http://example.com',
+          'dateFormat': 'html5'
        };
        found = Microformats.get( options );
        assert.deepEqual(found, expected);
    });
 });
--- a/toolkit/components/microformats/test/static/javascript/count.js
+++ b/toolkit/components/microformats/test/static/javascript/count.js
@@ -1,13 +1,13 @@
 /*!
-	parse
-	Used by http://localhost:3000/
-	Copyright (C) 2010 - 2015 Glenn Jones. All Rights Reserved.
-	MIT License: https://raw.github.com/glennjones/microformat-shiv/master/license.txt
+    parse
+    Used by http://localhost:3000/
+    Copyright (C) 2010 - 2015 Glenn Jones. All Rights Reserved.
+    MIT License: https://raw.github.com/glennjones/microformat-shiv/master/license.txt
 */
 
 window.onload = function() {
 
     var form;
     form= document.getElementById('mf-form');
 
     form.onsubmit = function(e){
@@ -20,20 +20,20 @@ window.onload = function() {
             mfJSON,
             parserJSONElt;
 
         // get data from html
         html = document.getElementById('html').value;
         parserJSONElt = document.querySelector('#parser-json pre code')
 
         // createHTMLDocument is not well support below ie9
-    	doc = document.implementation.createHTMLDocument("New Document");
-    	node =  document.createElement('div');
-    	node.innerHTML = html;
-    	doc.body.appendChild(node);
+        doc = document.implementation.createHTMLDocument("New Document");
+        node =  document.createElement('div');
+        node.innerHTML = html;
+        doc.body.appendChild(node);
 
         options ={
             'node': node
         };
 
         // parse direct into Modules to help debugging
         if(window.Modules){
             var parser = new Modules.Parser();
--- a/toolkit/components/microformats/test/static/javascript/testrunner.js
+++ b/toolkit/components/microformats/test/static/javascript/testrunner.js
@@ -1,23 +1,23 @@
 /*!
-	testrunner
-	Used by http://localhost:3000/testrunner.html
-	Copyright (C) 2010 - 2015 Glenn Jones. All Rights Reserved.
-	MIT License: https://raw.github.com/glennjones/microformat-shiv/master/license.txt
+    testrunner
+    Used by http://localhost:3000/testrunner.html
+    Copyright (C) 2010 - 2015 Glenn Jones. All Rights Reserved.
+    MIT License: https://raw.github.com/glennjones/microformat-shiv/master/license.txt
 */
 
 var options = {
         'baseUrl': 'http://example.com',
         'dateFormat': 'html5',
         'parseLatLonGeo': false
     };
 
 window.onload = function() {
-	var test  = testData.data[0],
+    var test  = testData.data[0],
         versionElt = document.querySelector('#version');
 
     versionElt.innerHTML = 'v' + testData.version;
 
     buildTest( test );
     buildList( testData );
 }
 
@@ -30,33 +30,33 @@ function displayTest(e){
              buildTest( testData.data[i] );
              break;
          }
      }
 }
 
 
 function buildTest( test ){
-	var testDetailElt = document.querySelector('.test-detail'),
+    var testDetailElt = document.querySelector('.test-detail'),
         nameElt = document.querySelector('#test-name'),
-    	htmlElt = document.querySelector('#test-html pre code'),
-    	jsonElt = document.querySelector('#test-json pre code'),
-    	parserElt = document.querySelector('#parser-json pre code'),
-    	diffElt = document.querySelector('#test-diff pre code');
+        htmlElt = document.querySelector('#test-html pre code'),
+        jsonElt = document.querySelector('#test-json pre code'),
+        parserElt = document.querySelector('#parser-json pre code'),
+        diffElt = document.querySelector('#test-diff pre code');
 
-	nameElt.innerHTML = test.name;
-	htmlElt.innerHTML = htmlEscape( test.html );
-	jsonElt.innerHTML = htmlEscape( test.json );
+    nameElt.innerHTML = test.name;
+    htmlElt.innerHTML = htmlEscape( test.html );
+    jsonElt.innerHTML = htmlEscape( test.json );
 
     var dom = new DOMParser();
         doc = dom.parseFromString( test.html, 'text/html' );
 
     options.node = doc;
     var mfJSON = Microformats.get( options );
-	parserElt.innerHTML = htmlEscape( js_beautify( JSON.stringify(mfJSON) ) );
+    parserElt.innerHTML = htmlEscape( js_beautify( JSON.stringify(mfJSON) ) );
 
     // diff json
     var diff = DeepDiff(JSON.parse(test.json),  mfJSON);
     if(diff !== undefined){
        diffElt.innerHTML = htmlEscape( js_beautify( JSON.stringify(diff) ) );
     }else{
        diffElt.innerHTML = '';
     }
--- a/toolkit/components/nsDefaultCLH.js
+++ b/toolkit/components/nsDefaultCLH.js
@@ -90,18 +90,18 @@ nsDefaultCLH.prototype = {
                               prefs.getCharPref("toolkit.singletonWindowType");
       var windowMediator =
                 Components.classes["@mozilla.org/appshell/window-mediator;1"]
                           .getService(Components.interfaces.nsIWindowMediator);
 
       var win = windowMediator.getMostRecentWindow(singletonWindowType);
       if (win) {
         win.focus();
-    	cmdLine.preventDefault = true;
-	  return;
+        cmdLine.preventDefault = true;
+        return;
       }
     }
     catch (e) { }
 
     // if the pref is missing, ignore the exception
     try {
       var chromeURI = prefs.getCharPref("toolkit.defaultChromeURI");
 
--- a/toolkit/components/places/tests/unifiedcomplete/test_416214.js
+++ b/toolkit/components/places/tests/unifiedcomplete/test_416214.js
@@ -28,12 +28,12 @@ add_task(function* test_tag_match_url() 
                       style: [ "bookmark-tag" ] });
   yield addBookmark({ uri: uri2,
                       title: "title",
                       tags: [ "superTag" ],
                       style: [ "bookmark-tag" ] });
   yield check_autocomplete({
     search: "superTag",
     matches: [ { uri: uri1, title: "title", tags: [ "superTag" ], style: [ "bookmark-tag" ] },
-     		   { uri: uri2, title: "title", tags: [ "superTag" ], style: [ "bookmark-tag" ] } ]
+               { uri: uri2, title: "title", tags: [ "superTag" ], style: [ "bookmark-tag" ] } ]
   });
   yield cleanup();
 });