/**
 * remy sharp / http://remysharp.com
 * Twitter / @rem
 * http://remysharp.com/2007/05/18/add-twitter-to-your-blog-step-by-step/
 *
 * @params
 *   cssIdOfContainer: e.g. twitters
 *   options: 
 *       {
 *           id: {String} username,
 *           count: {Int} 1-20, defaults to 1 - max limit 200
 *           prefix: {String} '%name% said', defaults to blank
 *           clearContents: {Boolean} true, removes contents of element specified in cssIdOfContainer, defaults to true
 *           ignoreReplies: {Boolean}, skips over tweets starting with '@', defaults to false
 *           template: {String} HTML template to use for LI element (see URL above for examples), defaults to predefined template
 *           bigTemplate: {Boolean} bigger default template - similar to twitter's rendered view
 *           enableLinks: {Boolean} linkifies text, defaults to true,
 *           newwindow {Boolean} opens links in new window, defaults to false
 *           timeout: {Int} How long before triggering onTimeout, defaults to 10 seconds if onTimeout is set
 *           onTimeoutCancel: {Boolean} Completely cancel twitter call if timedout, defaults to false
 *           onTimeout: {Function} Function to run when the timeout occurs. Function is bound to element specified with 
 *           cssIdOfContainer (i.e. 'this' keyword)
 *           includeRT: {Boolean} Whether to include retweets, defaults to false
 *           callback: {Function} Callback function once the render is complete, doesn't fire on timeout
 *
 *      CURRENTLY DISABLED DUE TO CHANGE IN TWITTER API:
 *           withFriends: {Boolean} includes friend's status
 *
 *       }
 *
 * @license MIT (MIT-LICENSE.txt)
 * @version 1.13.3 - ify now supports lists
 * @date $Date: 2010-02-24 23:51:23 +0000 (Wed, 24 Feb 2010) $
 */

// to protect variables from resetting if included more than once
if (typeof getTwitters !== 'function') (function () {

var twitterjs = {},
    guid = 0;

// https://github.com/ded/domready - cheers @ded
!function (context, doc) {
  var fns = [], ol, fn, f = false,
      testEl = doc.documentElement,
      hack = testEl.doScroll,
      domContentLoaded = 'DOMContentLoaded',
      addEventListener = 'addEventListener',
      onreadystatechange = 'onreadystatechange',
      loaded = /^loade|c/.test(doc.readyState);

  function flush(i) {
    loaded = 1;
    while (i = fns.shift()) { i() }
  }
  doc[addEventListener] && doc[addEventListener](domContentLoaded, fn = function () {
    doc.removeEventListener(domContentLoaded, fn, f);
    flush();
  }, f);


  hack && doc.attachEvent(onreadystatechange, (ol = function () {
    if (/^c/.test(doc.readyState)) {
      doc.detachEvent(onreadystatechange, ol);
      flush();
    }
  }));

  context['domReady'] = hack ?
    function (fn) {
      self != top ?
        loaded ? fn() : fns.push(fn) :
        function () {
          try {
            testEl.doScroll('left');
          } catch (e) {
            return setTimeout(function() { domReady(fn) }, 50);
          }
          fn();
        }()
    } :
    function (fn) {
      loaded ? fn() : fns.push(fn);
    };

}(twitterjs, document);

window.getTwitters = function (target, id, count, options) {
  guid++;

  if (typeof id == 'object') {
    options = id;
    id = options.id;
    count = options.count;
  } 

  // defaulting options
  if (!count) count = 1;
  
  if (options) {
    options.count = count;
  } else {
    options = {};
  }
  
  if (!options.timeout && typeof options.onTimeout == 'function') {
    options.timeout = 10;
  }
  
  if (typeof options.clearContents == 'undefined') {
    options.clearContents = true;
  }
  
  // need to make these global since we can't pass in to the twitter callback
  options.twitterTarget = target;
  
  // default enable links
  if (typeof options.enableLinks == 'undefined') options.enableLinks = true;

  // check out the mad currying!
  twitterjs.domReady((function(options, guid) {
    return function () {
      function render(tweet) {
        var text = options.enableLinks ? twitterlib.ify.clean(twitterlib.expandLinks(tweet)) : twitterlib.expandLinks(tweet);
        
        var html = '<li>';
        
        if (options.prefix) {
          html += '<li><span className="twitterPrefix">';
          html += options.prefix.replace(/%(.*?)%/g, function (m, l) {
              return tweet.user[l];
          });
          html += ' </span></li>'; // space on purpose
        }
        
        html += '<span className="twitterStatus">' + twitterlib.time.relative(tweet.created_at) + '</span> ';
        html += '<span className="twitterTime">' + tweet.text + '</span>';
        
        if (options.newwindow) {
            html = html.replace(/<a href/gi, '<a target="_blank" href');
        }
        
        return html;
      }      
      
      function getTweets() {
        options.target = document.getElementById(options.twitterTarget);
        // if the element isn't on the DOM, don't bother
        if (!options.target) {
          return;
        }

        var tlOptions = {
          limit: count
        }

        if (tlOptions.includeRT) {
          tlOptions.include_rts = true;
        }

        if (options.timeout) {
          window['twitterTimeout' + guid] = setTimeout(function () {
            // cancel callback
            twitterlib.cancel(); // FIXME would be nice if we could be specific about which to cancel
            options.onTimeout.call(options.target);
          }, options.timeout * 1000);
        }
        
        // by default we list the user timeline
        var searchMethod = 'timeline';
        
        // if they pass a hashtag - run a search
        if (id.indexOf('#') === 0 || options.search === true) searchMethod = 'search';
        
        // check for list, like: rem/family
        if (id.indexOf('/') !== -1) searchMethod = 'list';
        
        if (options.ignoreReplies) {
          tlOptions.filter = '-@';
        }

        twitterlib.cache(true); // just to speed things up
        twitterlib[searchMethod](id, tlOptions, function (tweets, tlOptions) {
          var html = [],
              max = tweets.length > options.count ? options.count : tweets.length;

          html = ['<ul>'];

          for (var i = 0; i < max; i++) {
            // backward compatible hacks for old twitter.js
            tweets[i].time = twitterlib.time.relative(tweets[i].created_at);
            for (var key in tweets[i].user) {
                tweets[i]['user_' + key] = tweets[i].user[key];
            }
            
            if (options.template) {
              html.push('<li>' + options.template.replace(/%([a-z_\-\.]*)%/ig, function (m, l) {
                var r = tweets[i][l] + "" || "";
                if (l == 'text') r = twitterlib.expandLinks(tweets[i]);
                if (l == 'text' && options.enableLinks) r = twitterlib.ify.clean(r);
                return r;
              }) + '</li>');
            } else if (options.bigTemplate) {
              html.push(twitterlib.render(tweets[i]));
            } else {
              html.push(render(tweets[i]));
            }
          }

          html.push('</ul>');
          
          if (options.clearContents) {
            options.target.innerHTML = html.join('');            
          } else {
            options.target.innerHTML += html.join('');
          }
          
          options.callback && options.callback(tweets);
        });
      }
      
      
      // wait for twitterlib to be loaded
      if (typeof twitterlib !== 'function') {
        // load twitterlib and then run init
        setTimeout(function () {
          var script = document.createElement('script');
          script.onload = script.onreadystatechange = getTweets;
          script.src = 'http://remy.github.com/twitterlib/twitterlib.js';

          var head = document.head || document.getElementsByTagName('head')[0];
          head.insertBefore(script, head.firstChild);
        }, 0);
      } else {
        getTweets();
      }
    };
  })(options, guid));
};

})();























