function TwitterWidget(username, feedCount, varname, destId, imgId, usePaging) 
{
     var items = new Array(); 
     var itemIndex = 0;
     var itemsCount = 0;
     var pagingId = varname + "_" + username + "_div";
     
     this.Init = function(obj)
     {
          if(document.addEventListener)
          {
               window.addEventListener("load", obj.LoadItems, false);
          }
          else if(document.attachEvent)
          {
               window.attachEvent("onload", obj.LoadItems);
          }
     }
     
     this.MoveNext = function()
     {
          itemIndex++;
          if(itemIndex >= itemsCount)
          {
               itemIndex = 0;
          }
          _displayPagedItem();
     }
     
     this.MovePrevious = function()
     {
          itemIndex--;
          if(itemIndex < 0)
          {
               itemIndex = itemsCount-1;
          }
          _displayPagedItem();
     }
     
     this.LoadItems = function()
     {
          var url = "http://twitter.com/status/user_timeline/" + 
               username + 
               ".json?count=" + feedCount + "&callback=?";
          $.getJSON(url, 
               function(data)
               {
                    var userName;
                    var userSrc;
                    
                    $.each(data, 
                         function(i, item) 
                         {
                              userName = item.user["screen_name"];
                              userSrc = item.user["profile_image_url"];
                              
                              items[itemsCount] = "" + 
                                   item.text.linkify() + " " +
                                   "<span class='twitter_created_at'>" + 
                                   _relative_time(item.created_at) + 
                                   " via " + item.source + 
                                   "</span>";
                              itemsCount++;
                         }
                    );
                    
                    if(usePaging)
                    {
                         _buildPagingFeedDisplay(destId, userName, userSrc, items, imgId);
                    }
                    else
                    {
                         _buildBasicFeedDisplay(destId, userName, userSrc, items, imgId);
                    }
               }
          );
     }
     
     function _buildBasicFeedDisplay(destId, userName, userSrc, items, imgId)
     {
          var obj = document.getElementById(destId);
          if(obj)
          {
               var html = "<ul>";
               for(var x = 0; x < items.length; x++)
               {
                    html += "<li>" + items[x] + "</li>";
               }
               html += "</ul>";
               
               obj.innerHTML = html;
          }
          _setupUserImage(imgId, userName, userSrc);
     }
     
     function _buildPagingFeedDisplay(destId, userName, userSrc, items, imgId)
     {
          var obj = document.getElementById(destId);
          if(obj)
          {
               var innerDiv = document.createElement("div");
               var controlsDiv = document.createElement("div");
                              
               innerDiv.innerHTML = items[0];
               innerDiv.id = pagingId;
               
               controlsDiv.innerHTML = "" +
                    "<div style=\"float:left; font-weight:bold; cursor:pointer;\" onclick=\"" + varname + ".MovePrevious();\"><< Prev</div>" + 
                    "<div style=\"float:right; font-weight:bold; cursor:pointer;\" onclick=\"" + varname + ".MoveNext();\">Next >></div>" +
                    
                    "<div style=\"clear:both;></div>"
               controlsDiv.style.position = "absolute";
               controlsDiv.style.bottom = "8px";
               controlsDiv.style.width = "150px";
               controlsDiv.style.marginTop = "0";
               controlsDiv.style.marginBottom = "0";
               controlsDiv.style.marginLeft = "auto";
               controlsDiv.style.marginRight = "auto";
               obj.appendChild(innerDiv);
               obj.appendChild(controlsDiv);
          }
          _setupUserImage(imgId, userName, userSrc);
     }
     
     function _displayPagedItem()
     {
          var obj = document.getElementById(pagingId);
          if(obj)
          {
               obj.innerHTML = items[itemIndex];
          }
     }
     
     function _setupUserImage(imgId, userName, userSrc)
     {
          if(imgId)
          {
               var img = document.getElementById(imgId);
               if(img)
               {
                    img.src = userSrc;
                    img.alt = userName;
               }
          }
     }

     function _relative_time(time_value) 
     {
          var values = time_value.split(" ");
          time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
          
          var parsed_date = Date.parse(time_value);
          var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
          var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
          delta = delta + (relative_to.getTimezoneOffset() * 60);
          
          var r = '';
          if (delta < 60) 
          {
               r = 'a minute ago';
          } 
          else if(delta < 120) 
          {
               r = 'couple of minutes ago';
          } 
          else if(delta < (45*60)) 
          {
               r = (parseInt(delta / 60)).toString() + ' minutes ago';
          } 
          else if(delta < (90*60)) 
          {
               r = 'an hour ago';
          } 
          else if(delta < (24*60*60)) 
          {
               r = '' + (parseInt(delta / 3600)).toString() + ' hours ago';
          } 
          else if(delta < (48*60*60)) 
          {
               r = '1 day ago';
          } 
          else 
          {
               r = (parseInt(delta / 86400)).toString() + ' days ago';
          }

          return r;
     }

     function twitter_callback ()
     {
          return true;
     }
}

String.prototype.linkify = function() 
{
     return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, 
          function(m) 
          {
               return m.link(m);
          }
     );
}; 
