RavelryThingRD = function() {
    var progressData = 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 {
      progressReceived: function(data) {
        progressData = data;
      },

      /*
        Allowed options are: color, width, height, photos (true/false), 
        projects (list of permalinks for specific projects). For example:
        drawProgressBars({color: 'red', width: 200, height: 20});
        RD: added pattern (true/false), designer (true/false), yarn (true/false)
      */
      drawProgressBars: function(options) {
        if (!progressData) return;
        
        if (!options) options = {};
        if ('number' == typeof options.height) options.height += 'px';
        if (!options.height) options.height = '1.3em';
        if (!options.width) options.width = 100;
        if (!options.color) options.color = 'lightgreen';
        if (!options.container) options.container = 'rav_progress_bars';
        
        var container = $(options.container);
        if (!container) {
          // using unicode to keep Blogger happy 
          document.write("\u003cdiv id='" + options.container + "'\u003e\u003c/div\u003e");
          container = $(options.container);
        }
        
        var selectedProjects = progressData.projects;
        if (options.projects) {
          // user has selected individual projects
          var projectsById = new Object();
          for (var i=0; i < selectedProjects.length; i++) {
            projectsById[selectedProjects[i].permalink] = selectedProjects[i];
          }
          selectedProjects = new Array();
          for (var i=0; i < options.projects.length; i++) {
            var project = projectsById[options.projects[i]];
            if (project) {
              selectedProjects.push(project);
            }
          }
        }
        
        for (var i=0; i < selectedProjects.length; i++) {
          var project = selectedProjects[i];
          var filledStyle = { width: Math.round((project.progress/100) * options.width) + 'px', height: options.height, backgroundColor: options.color};
          var barStyle = { width: (options.width) + 'px', height: options.height};
          var className = 'rav_project'
          
          var photo = null;
          if (options.photos && project.thumbnail) {
            className += ' rav_project_with_photos';
            if (project.thumbnail.flickrUrl == "#") {
            photo = { tag: 'a', className: 'rav_photo_link', href: project.thumbnail.src.replace("_square",""), children: [
                {tag: 'img', src: project.thumbnail.src, alt: 'project image' }
              ]
            }; } else {
            photo = { tag: 'a', className: 'rav_photo_link', href: project.thumbnail.flickrUrl, children: [
                {tag: 'img', src: project.thumbnail.src, alt: 'project image' }
              ]
            }; }            
          }
          
          var title = null;
          if (options.title != false) {
            title = { tag: 'h3', children: [
              { tag: 'a', className: 'rav_title', href: project.url, children: [project.name] }
              ] };
          }
          
          var pattern = null;
          if (options.pattern != false) {
            if (project.pattern) {
              pattern = { tag: 'div', className: 'rav_pattern', children: [
                  { tag: 'a', href: project.pattern.url, children: [project.pattern.name] }
                ] };
            } else {           
               pattern = { tag: 'div', className: 'rav_pattern', children: 'my own' }
            }
         }
            
          var designer = null;
          if (options.designer != false) {
            if (project.pattern && project.pattern.designer) {
              designer = { tag: 'div', className: 'rav_designer', children: [
                           { tag: 'a', href: project.pattern.designer.url, children: [project.pattern.designer.name] }
                ] };
            } else {           
               designer = { tag: 'div', className: 'rav_designer', children: 'me' }
            }
          }
                  
          var yarn = null;
          if (options.yarn != false) {
            if (project.yarns[0]) {
                yarn = { tag: 'div', className: 'rav_yarn', children: [
                  { tag: 'a', href: project.yarns[0].url, children: [project.yarns[0].brand, ' ', project.yarns[0].name] }
              ]};
            }
          }
                               
          container.appendChild($E({
            tag: 'div',
            className: className,
            children: [ title, photo,
              { tag: 'div', className: 'rav_progress_bar_wrapper', style: barStyle, children: [
                { tag: 'div', className: 'rav_progress_bar', style: barStyle, children: [
                  {tag: 'div', className: 'rav_progress_filled', style: filledStyle},
                  {tag: 'div', className: 'rav_progress_text', style: barStyle, 
                    children: [ project.progress + '%' ]}
                ]}
              ]},
               {tag: 'div', className: 'rav_details', children: [pattern, designer, yarn]}]
          }));
        }
      }
    }
}();
  
RavelryGalleryRD = 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;
      },
        
      /*
        Default sort is by completion date, if avilable. "null" projects will end up at the bottom
        Allowed options are: container="gallery" (id of div to put the gallery in);  
        drawGallery();
      */

      drawGallery: function(options) {
        if (!projectData) return;
               
        if (!options) options = {};
        if (!options.container) options.container = 'gallery';
        
        var container = $(options.container);
        if (!container) {
          // using unicode to keep Blogger happy 
          document.write("\u003cdiv id='" + options.container + "'\u003e\u003c/div\u003e");
          container = $(options.container);
        }
           
        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 = "";
          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 < sortedProjects.length; i++) {
          var project = sortedProjects[i];
          if (project.thumbnail) {
          var title = null;
          if (options.title != false) {
            title = { tag: 'h3', children: [
              { tag: 'a', className: 'rav_title', href: project.url, children: [project.name] }
              ] };
          }
          
          var pattern = null;
          if (options.pattern != false) {
            if (project.pattern) {
              pattern = { tag: 'div', className: 'rav_pattern', children: [
                  { tag: 'a', href: project.pattern.url, children: [project.pattern.name] }
                ] };
            } else {           
               pattern = { tag: 'div', className: 'rav_pattern', children: 'my own' }
            }
         }
            
          var designer = null;
          if (options.designer != false) {
            if (project.pattern && project.pattern.designer) {
              designer = { tag: 'div', className: 'rav_designer', children: [
                           { tag: 'a', href: project.pattern.designer.url, children: [project.pattern.designer.name] }
                ] };
            } else {           
               designer = { tag: 'div', className: 'rav_designer', children: 'me' }
            }
          }
                  
          var yarn = null;
          if (options.yarn != false) {
            if (project.yarns[0]) {
                yarn = { tag: 'div', className: 'rav_yarn', children: [
                  { tag: 'a', href: project.yarns[0].url, children: [project.yarns[0].brand, ' ', project.yarns[0].name] }
              ]};
            }
          }
          
          var needles = null;
          if (options.needles != false) {
            if (project.needles[0]) {
                 needles = { tag: 'div', className: 'rav_needles', children: [project.needles[0].name]}
               }
             }
             
           var blogposts = null;
           if (options.blogposts != false) {
             if (project.blogPosts[0]) {
                blogposts = { tag: 'div', className: 'rav_posts', children: [
                  { tag: 'a', href: project.blogPosts[0].url, children: [project.blogPosts[0].title] }
              ]};
              var j=1;
              while (project.blogPosts[j]) {
                 postinfo = {tag: 'a', href: project.blogPosts[j].url, children: [project.blogPosts[j].title]};
                 blogposts += postinfo;
                 j++;
                 }
             }
            }
             
            var date = { tag: 'span', className: 'rav_completed', 
            children: "completed " + project.completed };
            if (project.thumbnail.flickrUrl == "#") {
            var photo = { tag: 'a', className: 'rav_photo_link', rel: 'lightbox', href: project.thumbnail.src.replace("_square",""), children: [
              {tag: 'img', src: project.thumbnail.src, alt: 'project image' }]
            }; } else {
              var photo = { tag: 'a', className: 'rav_photo_link', href: project.thumbnail.flickrUrl, children: [
                {tag: 'img', src: project.thumbnail.src, alt: 'project image' }]
              }; }           

          container.appendChild($E({
             tag: 'div',
             className: 'rav_project',
             children: [ title, photo, {tag: 'div', className: 'rav_details', 
             children: [date, pattern, designer, yarn, needles, blogposts]}]
          }));

        }
      }
    }
  }
}();