          RavelryRecentFOs = function() {
            var projectData = null;
            
            // Dollar and Dollar E convenience
            var $ = function(id) { return document.getElementById(id); };
        
            var $E = function(data) {
                var el;
                if ('string' == typeof data) {
                  el = document.createTextNode(data);
                } else {
                  el = document.createElement(data.tag);
                  delete(data.tag);
                  if ('undefined' != typeof data.children) {
                    for (var i=0, child=null; 'undefined' != typeof (child=data.children[i]); i++) { if (child) { el.appendChild($E(child)); } }
                    delete(data.children);
                  }
                  for (attr in data) { 
                    if (attr == 'style') {
                      for (s in data[attr]) {
                        el.style[s] =  data[attr][s];
                      } 
                    } else if (data[attr]) {
                      el[attr]=data[attr]; 
                    }
                  }
                }
                return el;
            };
            
            return {
              dataReceived: function(data) {
                projectData = data;
              },
        
              draw: function() {
                if (!projectData) return;
                
                var container = $('recentfos');
                   
                var projectsByDate = {};
                var projectDates = [];
                for (var i=0; i < projectData.projects.length; i++) {
                  var project = projectData.projects[i];
                  var date = project.completed;
                  if (!date) date = "2006-01-01";
                  if (!projectsByDate[date]) {
                    projectsByDate[date] = new Array();
                    projectDates.push(date);
                  } 
                  projectsByDate[date].push(project);
                }

                projectDates.sort().reverse();
                var sortedProjects = [];
                for (var i=0; i < projectDates.length; i++) {
                  var currentDate = projectsByDate[projectDates[i]];
                  for (var j=0; j < currentDate.length; j++) {
                    sortedProjects.push(currentDate[j]);
                  }
                }

                for (var i=0; i < 3; i++) {
                  var project = sortedProjects[i];
                  if (project.thumbnail) {
                    var title = { tag: 'a', className: 'rav_title', href: project.url, children: [project.name] };
                    var photo = { tag: 'a', className: 'rav_photo_link', href: project.url, children: [
                        {tag: 'img', src: project.thumbnail.src.replace("s.jpg", "t.jpg") }]
                    };
                    
                var pattern = null;
                if (project.pattern) {
                       pattern = { tag: 'div', className: 'sidebar_detail', children: [ 'Pattern: ',
                          { tag: 'a', href: project.pattern.url, children: [project.pattern.name] }
                          ]
                      };
                  }
                  
                  var yarn = null;
                    if (project.yarns[0]) {
                       yarn = { tag: 'div', className: 'sidebar_detail', children: [ 'Yarn: ',
                          { tag: 'a', href: project.yarns[0].url, children: [project.yarns[0].brand, ' ', project.yarns[0].name] }
                          ]
                      };
                  }
                  
                  var favs = null;
                  if (project.favorited > 0)
                  {
                   favs = { tag: 'div', className: 'rav_favs_fo', children: [
                    { tag: 'a', href: project.url + '/comments', children: [
                        { tag: 'img', src: '/blogimages/heart.png' }] 
                        }, ' ' + project.favorited]
                    };
                  }

                    container.appendChild($E({
                      tag: 'div',
                      className: 'rav_project_fo',
                      children: [ photo, {tag: 'div', className: 'details', children: [title, pattern, yarn]}, favs ]
                    }));

                  }
                }
              }
            }
          }();
