if (typeof console == "undefined") var console = { log: function() {} };

/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
var hexcase=0;function hex_md5(a){return rstr2hex(rstr_md5(str2rstr_utf8(a)))}function hex_hmac_md5(a,b){return rstr2hex(rstr_hmac_md5(str2rstr_utf8(a),str2rstr_utf8(b)))}function md5_vm_test(){return hex_md5("abc").toLowerCase()=="900150983cd24fb0d6963f7d28e17f72"}function rstr_md5(a){return binl2rstr(binl_md5(rstr2binl(a),a.length*8))}function rstr_hmac_md5(c,f){var e=rstr2binl(c);if(e.length>16){e=binl_md5(e,c.length*8)}var a=Array(16),d=Array(16);for(var b=0;b<16;b++){a[b]=e[b]^909522486;d[b]=e[b]^1549556828}var g=binl_md5(a.concat(rstr2binl(f)),512+f.length*8);return binl2rstr(binl_md5(d.concat(g),512+128))}function rstr2hex(c){try{hexcase}catch(g){hexcase=0}var f=hexcase?"0123456789ABCDEF":"0123456789abcdef";var b="";var a;for(var d=0;d<c.length;d++){a=c.charCodeAt(d);b+=f.charAt((a>>>4)&15)+f.charAt(a&15)}return b}function str2rstr_utf8(c){var b="";var d=-1;var a,e;while(++d<c.length){a=c.charCodeAt(d);e=d+1<c.length?c.charCodeAt(d+1):0;if(55296<=a&&a<=56319&&56320<=e&&e<=57343){a=65536+((a&1023)<<10)+(e&1023);d++}if(a<=127){b+=String.fromCharCode(a)}else{if(a<=2047){b+=String.fromCharCode(192|((a>>>6)&31),128|(a&63))}else{if(a<=65535){b+=String.fromCharCode(224|((a>>>12)&15),128|((a>>>6)&63),128|(a&63))}else{if(a<=2097151){b+=String.fromCharCode(240|((a>>>18)&7),128|((a>>>12)&63),128|((a>>>6)&63),128|(a&63))}}}}}return b}function rstr2binl(b){var a=Array(b.length>>2);for(var c=0;c<a.length;c++){a[c]=0}for(var c=0;c<b.length*8;c+=8){a[c>>5]|=(b.charCodeAt(c/8)&255)<<(c%32)}return a}function binl2rstr(b){var a="";for(var c=0;c<b.length*32;c+=8){a+=String.fromCharCode((b[c>>5]>>>(c%32))&255)}return a}function binl_md5(p,k){p[k>>5]|=128<<((k)%32);p[(((k+64)>>>9)<<4)+14]=k;var o=1732584193;var n=-271733879;var m=-1732584194;var l=271733878;for(var g=0;g<p.length;g+=16){var j=o;var h=n;var f=m;var e=l;o=md5_ff(o,n,m,l,p[g+0],7,-680876936);l=md5_ff(l,o,n,m,p[g+1],12,-389564586);m=md5_ff(m,l,o,n,p[g+2],17,606105819);n=md5_ff(n,m,l,o,p[g+3],22,-1044525330);o=md5_ff(o,n,m,l,p[g+4],7,-176418897);l=md5_ff(l,o,n,m,p[g+5],12,1200080426);m=md5_ff(m,l,o,n,p[g+6],17,-1473231341);n=md5_ff(n,m,l,o,p[g+7],22,-45705983);o=md5_ff(o,n,m,l,p[g+8],7,1770035416);l=md5_ff(l,o,n,m,p[g+9],12,-1958414417);m=md5_ff(m,l,o,n,p[g+10],17,-42063);n=md5_ff(n,m,l,o,p[g+11],22,-1990404162);o=md5_ff(o,n,m,l,p[g+12],7,1804603682);l=md5_ff(l,o,n,m,p[g+13],12,-40341101);m=md5_ff(m,l,o,n,p[g+14],17,-1502002290);n=md5_ff(n,m,l,o,p[g+15],22,1236535329);o=md5_gg(o,n,m,l,p[g+1],5,-165796510);l=md5_gg(l,o,n,m,p[g+6],9,-1069501632);m=md5_gg(m,l,o,n,p[g+11],14,643717713);n=md5_gg(n,m,l,o,p[g+0],20,-373897302);o=md5_gg(o,n,m,l,p[g+5],5,-701558691);l=md5_gg(l,o,n,m,p[g+10],9,38016083);m=md5_gg(m,l,o,n,p[g+15],14,-660478335);n=md5_gg(n,m,l,o,p[g+4],20,-405537848);o=md5_gg(o,n,m,l,p[g+9],5,568446438);l=md5_gg(l,o,n,m,p[g+14],9,-1019803690);m=md5_gg(m,l,o,n,p[g+3],14,-187363961);n=md5_gg(n,m,l,o,p[g+8],20,1163531501);o=md5_gg(o,n,m,l,p[g+13],5,-1444681467);l=md5_gg(l,o,n,m,p[g+2],9,-51403784);m=md5_gg(m,l,o,n,p[g+7],14,1735328473);n=md5_gg(n,m,l,o,p[g+12],20,-1926607734);o=md5_hh(o,n,m,l,p[g+5],4,-378558);l=md5_hh(l,o,n,m,p[g+8],11,-2022574463);m=md5_hh(m,l,o,n,p[g+11],16,1839030562);n=md5_hh(n,m,l,o,p[g+14],23,-35309556);o=md5_hh(o,n,m,l,p[g+1],4,-1530992060);l=md5_hh(l,o,n,m,p[g+4],11,1272893353);m=md5_hh(m,l,o,n,p[g+7],16,-155497632);n=md5_hh(n,m,l,o,p[g+10],23,-1094730640);o=md5_hh(o,n,m,l,p[g+13],4,681279174);l=md5_hh(l,o,n,m,p[g+0],11,-358537222);m=md5_hh(m,l,o,n,p[g+3],16,-722521979);n=md5_hh(n,m,l,o,p[g+6],23,76029189);o=md5_hh(o,n,m,l,p[g+9],4,-640364487);l=md5_hh(l,o,n,m,p[g+12],11,-421815835);m=md5_hh(m,l,o,n,p[g+15],16,530742520);n=md5_hh(n,m,l,o,p[g+2],23,-995338651);o=md5_ii(o,n,m,l,p[g+0],6,-198630844);l=md5_ii(l,o,n,m,p[g+7],10,1126891415);m=md5_ii(m,l,o,n,p[g+14],15,-1416354905);n=md5_ii(n,m,l,o,p[g+5],21,-57434055);o=md5_ii(o,n,m,l,p[g+12],6,1700485571);l=md5_ii(l,o,n,m,p[g+3],10,-1894986606);m=md5_ii(m,l,o,n,p[g+10],15,-1051523);n=md5_ii(n,m,l,o,p[g+1],21,-2054922799);o=md5_ii(o,n,m,l,p[g+8],6,1873313359);l=md5_ii(l,o,n,m,p[g+15],10,-30611744);m=md5_ii(m,l,o,n,p[g+6],15,-1560198380);n=md5_ii(n,m,l,o,p[g+13],21,1309151649);o=md5_ii(o,n,m,l,p[g+4],6,-145523070);l=md5_ii(l,o,n,m,p[g+11],10,-1120210379);m=md5_ii(m,l,o,n,p[g+2],15,718787259);n=md5_ii(n,m,l,o,p[g+9],21,-343485551);o=safe_add(o,j);n=safe_add(n,h);m=safe_add(m,f);l=safe_add(l,e)}return Array(o,n,m,l)}function md5_cmn(h,e,d,c,g,f){return safe_add(bit_rol(safe_add(safe_add(e,h),safe_add(c,f)),g),d)}function md5_ff(g,f,k,j,e,i,h){return md5_cmn((f&k)|((~f)&j),g,f,e,i,h)}function md5_gg(g,f,k,j,e,i,h){return md5_cmn((f&j)|(k&(~j)),g,f,e,i,h)}function md5_hh(g,f,k,j,e,i,h){return md5_cmn(f^k^j,g,f,e,i,h)}function md5_ii(g,f,k,j,e,i,h){return md5_cmn(k^(f|(~j)),g,f,e,i,h)}function safe_add(a,d){var c=(a&65535)+(d&65535);var b=(a>>16)+(d>>16)+(c>>16);return(b<<16)|(c&65535)}function bit_rol(a,b){return(a<<b)|(a>>>(32-b))};

/**
*
*  Javascript sprintf
*  http://www.webtoolkit.info/
*
*
**/
 
sprintfWrapper = {
 
	init : function () {
 
		if (typeof arguments == "undefined") { return null; }
		if (arguments.length < 1) { return null; }
		if (typeof arguments[0] != "string") { return null; }
		if (typeof RegExp == "undefined") { return null; }
 
		var string = arguments[0];
		var exp = new RegExp(/(%([%]|(\-)?(\+|\x20)?(0)?(\d+)?(\.(\d)?)?([bcdfosxX])))/g);
		var matches = new Array();
		var strings = new Array();
		var convCount = 0;
		var stringPosStart = 0;
		var stringPosEnd = 0;
		var matchPosEnd = 0;
		var newString = '';
		var match = null;
 
		while (match = exp.exec(string)) {
			if (match[9]) { convCount += 1; }
 
			stringPosStart = matchPosEnd;
			stringPosEnd = exp.lastIndex - match[0].length;
			strings[strings.length] = string.substring(stringPosStart, stringPosEnd);
 
			matchPosEnd = exp.lastIndex;
			matches[matches.length] = {
				match: match[0],
				left: match[3] ? true : false,
				sign: match[4] || '',
				pad: match[5] || ' ',
				min: match[6] || 0,
				precision: match[8],
				code: match[9] || '%',
				negative: parseInt(arguments[convCount]) < 0 ? true : false,
				argument: String(arguments[convCount])
			};
		}
		strings[strings.length] = string.substring(matchPosEnd);
 
		if (matches.length == 0) { return string; }
		if ((arguments.length - 1) < convCount) { return null; }
 
		var code = null;
		var match = null;
		var i = null;
 
		for (i=0; i<matches.length; i++) {
 
			if (matches[i].code == '%') { substitution = '%' }
			else if (matches[i].code == 'b') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(2));
				substitution = sprintfWrapper.convert(matches[i], true);
			}
			else if (matches[i].code == 'c') {
				matches[i].argument = String(String.fromCharCode(parseInt(Math.abs(parseInt(matches[i].argument)))));
				substitution = sprintfWrapper.convert(matches[i], true);
			}
			else if (matches[i].code == 'd') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)));
				substitution = sprintfWrapper.convert(matches[i]);
			}
			else if (matches[i].code == 'f') {
				matches[i].argument = String(Math.abs(parseFloat(matches[i].argument)).toFixed(matches[i].precision ? matches[i].precision : 6));
				substitution = sprintfWrapper.convert(matches[i]);
			}
			else if (matches[i].code == 'o') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(8));
				substitution = sprintfWrapper.convert(matches[i]);
			}
			else if (matches[i].code == 's') {
				matches[i].argument = matches[i].argument.substring(0, matches[i].precision ? matches[i].precision : matches[i].argument.length)
				substitution = sprintfWrapper.convert(matches[i], true);
			}
			else if (matches[i].code == 'x') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16));
				substitution = sprintfWrapper.convert(matches[i]);
			}
			else if (matches[i].code == 'X') {
				matches[i].argument = String(Math.abs(parseInt(matches[i].argument)).toString(16));
				substitution = sprintfWrapper.convert(matches[i]).toUpperCase();
			}
			else {
				substitution = matches[i].match;
			}
 
			newString += strings[i];
			newString += substitution;
 
		}
		newString += strings[i];
 
		return newString;
 
	},
 
	convert : function(match, nosign){
		if (nosign) {
			match.sign = '';
		} else {
			match.sign = match.negative ? '-' : match.sign;
		}
		var l = match.min - match.argument.length + 1 - match.sign.length;
		var pad = new Array(l < 0 ? 0 : l).join(match.pad);
		if (!match.left) {
			if (match.pad == "0" || nosign) {
				return match.sign + pad + match.argument;
			} else {
				return pad + match.sign + match.argument;
			}
		} else {
			if (match.pad == "0" || nosign) {
				return match.sign + match.argument + pad.replace(/0/g, ' ');
			} else {
				return match.sign + match.argument + pad;
			}
		}
	}
}
 
sprintf = sprintfWrapper.init;

if(!window['live']) {
  window['live'] = {};
  var live = window['live'];
}

$.browser.mobile = (navigator.userAgent.toLowerCase().match('iphone') || navigator.userAgent.toLowerCase().match('ipod') || navigator.userAgent.toLowerCase().match('android') || navigator.userAgent.toLowerCase().match('palm'));

(function($){

  $(document).ready(function() {
    live.updater();
    live.links();
    if(live.flashVersion() < 10) {
      $('#video object, #video embed').hide()
      if(!$.browser.mobile) {
        $('#video').prepend('<p><a href="http://get.adobe.com/flashplayer/">Please upgrade to Flash 10 to view the stream.</a></p>');
      }
    }
  });
  
  live.flashVersion = function() { 
    // ie 
    try { 
      try { 
        // avoid fp6 minor version lookup issues 
        // see: http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/ 
        var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6'); 
        try { axo.AllowScriptAccess = 'always'; } 
        catch(e) { return '6'; } 
      } catch(e) {} 
      try {
        return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1].split(',').shift(); 
      } catch(e) {
        throw e;
      }
    // other browsers 
    } catch(e) { 
      try { 
        if(navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin){ 
          return (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1].split(',').shift(); 
        } 
      } catch(e) {} 
    } 
    return false; 
  } 

  live.updater = function() {
    live.updater.since_ids = {};
    live.updater.since_ids.onlocation = 0;
    live.updater.since_ids.twitter = 0;

    live.updater.blacklist = {};
    live.updater.blacklist.flickr = [];
    live.updater.blacklist.twitter = [];
    
    live.updater.updateBlacklists(function() {
      live.updater.twitter();
      live.updater.flickr();
	  	live.updater.slideshare();
    });
    setInterval(function() {
      $('ol#posts li.new').removeClass('new');
      live.updater.updateBlacklists(function() {
        live.updater.twitter();
        live.updater.flickr();
				live.updater.slideshare();
      });
    }, 60 * 1000);
  }
  
  live.updater.twitter = function() {
    $('li[id^=tweet]').each(function() {
      if($.inArray($(this).attr('id').replace('tweet-',''), live.updater.blacklist.twitter) != -1 || $.inArray($(this).find('.author a').text(), live.updater.blacklist.twitter) != -1) { $(this).hide(); return true; } else { $(this).show(); }
    });
    $.getJSON(
      'http://search.twitter.com/search.json?&callback=?',
      {
        'q': 'barcampchatt',
        'since_id': live.updater.since_ids.twitter
      },
      function(data) {
        try {
          var tweets = data.results;
          live.updater.since_ids.twitter = data.max_id;
          $.each(tweets, function() {
            var tweet = this;
            if($.inArray(tweet.id, live.updater.blacklist.twitter) != -1 || $.inArray(tweet.from_user, live.updater.blacklist.twitter) != -1) { $('li#tweet-' + tweet.id).remove(); return true; }
            var li = $(jQuery('<li />'));
            var timestamp = Date.parse(tweet.created_at.replace(/-/g,' '));
            li.attr({
              'id': 'tweet-' + tweet.id,
              'timestamp': timestamp
            });
            li.addClass('twitter').addClass('new');
            li.html('<span class="service-icon" title="Twitter"></span><span class="author"><a href="http://twitter.com/' + tweet.from_user + '/" target="_blank">' + tweet.from_user + '</a><img src="' + tweet.profile_image_url + '" /></span><span class="published" rel="' + tweet.created_at.replace(/-/g, ' ') + '">' + tweet.created_at.replace(/-/g, ' ') + '</span><p>' + tweet.text + '</p>');
            live.updater.addItem(li);
          });
          live.relativeTimestamps();
        } catch(err) {
          console.log(err);
        }
      }
    );
  }
  
  live.updater.flickr = function() {
    var icon_url = 'http://farm%d.static.flickr.com/%d/buddyicons/%s.jpg';
    var photo_url = 'http://farm%d.static.flickr.com/%d/%d_%s_m.jpg';
    $.getJSON('http://api.flickr.com/services/rest/?&jsoncallback=?',
      {
        'api_key':          'e26fab7b9d7e059e45d58f2c6feec99e',
        'method':           'flickr.photos.search',
        'tags':             'barcampchatt',
        'format':           'json',
        'safe_search':      1,
        'content_type':     4,
        'extras':           'owner_name,icon_server,date_upload',
        'privacy_filter':   1
      },
      function(data) {
        try {
          var photos = data.photos.photo;
          $.each(photos, function() {
            var photo = this;
            if($.inArray(photo.id, live.updater.blacklist.flickr) != -1 || $.inArray(photo.owner, live.updater.blacklist.flickr) != -1) { $('li#photo-' + photo.id).remove(); return true; }
            if($('li#photo-' + photo.id).size()) { return true; }
            var li = $(jQuery('<li />'));
            var timestamp = photo.dateupload * 1000; // convert to milliseconds for js
            li.attr({
              'id': 'photo-' + photo.id,
              'timestamp': timestamp
            });
            li.addClass('flickr').addClass('new');
            li.html('<span class="service-icon" title="Flickr"></span><span class="author"><a href="http://flickr.com/photos/' + photo.owner + '/" target="_blank">' + photo.ownername + '</a><img src="' + (photo.iconfarm ? sprintf(icon_url, photo.iconfarm, photo.iconserver, photo.owner) : 'http://www.flickr.com/images/buddyicon.jpg')+ '" /></span><span class="published" rel="' + (new Date(timestamp)) + '">' + (new Date(timestamp)) + '</span><p><a href="http://flickr.com/photos/' + photo.owner + '/' + photo.id + '/" title="View Photos" target="_blank"><img src="' + sprintf(photo_url, photo.farm, photo.server, photo.id, photo.secret) + '" /></a></p>');
            live.updater.addItem(li);
          });
          live.relativeTimestamps();
        } catch(e) {
          console.log(e)
        }
      }
    );
  }

  live.updater.slideshare = function() {
		$.ajax({
			'url': '/ss-feed/',
			'success': function(data) {
				$(data).find('item').each(function() {
          var slideshow = $(this);
          if($('li#slideshow-' + hex_md5(slideshow.find('guid').text())).size()) { return true; }
          var li = $(jQuery('<li />'));
          var timestamp = Date.parse(slideshow.find('pubDate').text().replace(/-/g,' '));
					var datetime = new Date(timestamp);
          li.attr({
            'id': 'slideshow-' + hex_md5(slideshow.find('guid').text()),
            'timestamp': timestamp
          });
          li.addClass('slideshare').addClass('new');
          li.html('<span class="service-icon" title="Slideshare"></span><span class="author"><a href="http://slideshare.com/' + $(this.childNodes[15].childNodes[5]).text() + '/" target="_blank">' + $(this.childNodes[15].childNodes[5]).text() + '</a></span><span class="published" rel="' + datetime + '">' + datetime + '</span><p><a href="' + slideshow.find('link').text() + '" title="View Presentation" target="_blank"><strong>' + slideshow.find('title').text() + '</strong></a><br />' + $(this.childNodes[15].childNodes[7]).text() + '</p>');
          live.updater.addItem(li);
				});
			},
			'cache': false,
			'dataType': 'xml'
		});
  }
  
  live.updater.addItem = function(item) {
    if(typeof item != 'object') { return; }
    item.hide();
    var closest = $('ol#posts > li').filter(function() { return $(this).attr('timestamp') < item.attr('timestamp')}).eq(0);
    if(closest.size()) {
      closest.before(item);
    } else {
      $('ol#posts').append(item);
    }
    if($('ol#posts li').size() > 1) {
      item.slideDown('normal');
    } else {
      item.show();
    }
  }
  
  live.relativeTimestamps = function() {
    var now = Date.parse(new Date());
    
    $('span.published').each(function() {
      var span = $(this);
      var timestamp = Date.parse(span.attr('rel'));
      var diff = now - timestamp;
      var nicetext = "";
      time = {};
      time.year =   Math.floor( diff / 31536000000 ); // 365 days. Fuck leap year.;
      time.month =  Math.floor( ( diff - ( time.year * 31536000000 ) ) / 2592000000 ); // Assuming a month is 30 days. Close enough.;
      time.week =   Math.floor( ( diff - ( time.year * 31536000000 ) - ( time.month * 2592000000 ) ) / 604800000 );
      time.day =    Math.floor( ( diff - ( time.year * 31536000000 ) - ( time.month * 2592000000 ) - ( time.week * 604800000 ) ) / 86400000 );
      time.hour =   Math.floor( ( diff - ( time.year * 31536000000 ) - ( time.month * 2592000000 ) - ( time.week * 604800000 ) - ( time.day * 86400000 ) ) / 3600000);
      time.minute = Math.round( ( diff - ( time.year * 31536000000 ) - ( time.month * 2592000000 ) - ( time.week * 604800000 ) - ( time.day * 86400000 ) - ( time.hour * 3600000 ) ) / 60000 );
      
      for(var key in time) {
        if(time[key] > 0) {
          switch(key) {
            case 'minute':
              if ( time.month > 0 || time.year > 0  || time.hour > 12 || time.week > 0 || time.day > 0 ) { continue; }
            case 'hour':
              if( time.week > 0 || time.month > 0 || time.year > 0 ) { continue; }
            case 'day':
              if( time.year > 0 || ( time.week > 0 && time.month > 0 ) ) { continue; }
            default:
              // keep going
          }
          nicetext = nicetext + " " + time[key] + " " + key + (time[key] > 1 ? "s," : ",");
        }
      }
      if(diff <= 30000) {
        nicetext = "now"
      } else if(nicetext == "") {
        nicetext = span.text();
      } else {
        nicetext = nicetext.substr(0,nicetext.length - 1) + " ago";
      }
      
      span.text(nicetext);
    });
  }
  
  live.links = function() {
    var disqusLink = $('a[rel=disqus]');
    disqusLink.click(function(c) {
      c.preventDefault();
      window.open($(this).attr('href'), 'disqus_popup', 'width=500,height=400,toolbar=no,top=100,screenY=100,left=560,screenX=560,directories=no,location=no');
    });
  }
  
  live.updater.updateBlacklists = function(data) {
    if(typeof data == 'undefined' || typeof data == 'function') { // this is the intervaled ping. grab the json file. run the callback if given.
      $.getJSON('http://media.dryan.com.s3.amazonaws.com/js/blacklists.json?callback=?',
        {},
        function() {
          // do nothing, the parent function will get called by the file
        }
      );
      if(typeof data == 'function') { // do the callback
        data();
      }
    } else { // this is the json results. update the arrays.
      try {
        live.updater.blacklist = data.blacklists;
      } catch(e) {
        console.log(e);
      }
    }
  }
  
})(jQuery);