/* Tests:
  http://dev.buzzfeed.com/bf2/_fixtures?action=setup&path=/bf2/test-inline-media&fixture=users&test=inline_media_social_actions
*/

//have we voted?
//_badge_votes_so_far = new Object();

bf_badge_vote_manager = function() {
	this.VOTE_CONTROLLER = '/buzzfeed/_badge_vote';
	this.VOTE_DEFINITIONS = {
		badge : {
			onSuccess : function(r){badge_vote_manager.badgeResponse(r)},
			onSuccess_flow : function(r, data){badge_vote_manager.flow_badgeResponse(r, data)},
			parameters : {
				badge_id : function(t) {
					if ( t.className.match(/bf_dom/) ) {
						var json = eval('('+t.getAttribute('rel:data')+')');
						return json.vote.badge_id;
					}
					else return t.getAttribute('rel:badge_id');
				}
			},
			success_template : '<a href="/#{username}">#{display_name}</a> thinks #{title} is <a class="badgeword">#{badge}</a>. <span class="ago">just now</span>'
		},
		love_or_hate : {
			onSuccess : function(r){badge_vote_manager.loveHateResponse(r)},
			onSuccess_flow : function(r,data){badge_vote_manager.flow_loveHateResponse(r,data)},
			parameters : {
				value : function(t){ 
					if ( t.className.match(/bf_dom/) ) {
						var json = eval('('+t.getAttribute('rel:data')+')');
						return json.vote.value == 'loves' ? 1 : 0;
					}
					else return t.getAttribute('rel:value') == 'loves' ? 1 : 0 ;
				}
			},
			success_template : '<a href="/#{username}">#{display_name}</a> <span class="feed-#{loves}">&nbsp;</span> #{title}. <span class="ago">just now</span>'
		}
	};
	this.SHARE_TEMPLATE = new Template('\
    <div class="social-message-share section" style="float:left;width:100%;"> \
			<h5 style="margin-bottom:10px;">Share this post and help it go viral:</h5>\
			<div style="float:left;width:60px;margin-right:15px"> \
				<a name="fb_share" type="box_count" share_url="http://www.buzzfeed.com/#{buzz_uri}"></a> \
			</div> \
			<div style="float:left;width:50px;margin-right:15px"> \
				<iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://platform.twitter.com/widgets/tweet_button.html?text=#{buzz_name}&url=http%3A//www.buzzfeed.com/#{buzz_uri}&count=vertical&related=buzzfeed" style="width:60px; height:70px;"></iframe> \
			</div> \
			<div id="div_subadge" style="float:left;width:52px;margin-right:15px"> \
			  <iframe src="http://www.stumbleupon.com/badge/embed/5/?url=http%3A//www.buzzfeed.com/#{buzz_uri}" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:65px; height: 18px;" allowTransparency="true"></iframe> \
			</div> \
			<div style="float:left;width:52px;margin-right:15px"> \
			  <iframe src="http://digg.com/tools/diggthis.php?u=http%3A//www.buzzfeed.com/#{buzz_uri}&amp;t=#{buzz_name}" frameborder="0" height="80" scrolling="no" width="52"></iframe> \
			</div> \
			<div style="float:left;width:69px;margin-right:25px"> \
			  <iframe scrolling="no" height="70" frameborder="0" width="69" src="http://www.reddit.com/static/button/button2.html?t=3&amp;width=69&amp;url=http%3A%2F%2Fwww.buzzfeed.com%2F#{buzz_uri}"></iframe> \
			</div> \
		</div> \
	');
	this.SHARE_THE_LOVE_TEMPLATE = new Template('\
    <div class="social-message-share section"> \
    	<div class="social-message-share-inner"> \
	    	<div class="social-message-share-facebook-box"> \
					<h5>Share this post and help it go viral:</h5> \
					<div class="social-message-share-facebook"><fb:like rel:buzz_id="#{buzz_id}" href="http://www.buzzfeed.com/#{buzz_uri}" show_faces="true" width="280"></fb:like></div> \
				</div> \
				<div class="social-message-share-tweet-box"> \
					<div id="tweet-box-#{buzz_id}"></div> \
				</div> \
				<div class="social-message-share-buttons"> \
					<div> \
						<a name="fb_share" type="box_count" share_url="http://www.buzzfeed.com/#{buzz_uri}"></a> \
					</div> \
					<div class="social-message-share-retweet social-message-share-button"> \
						<iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://platform.twitter.com/widgets/tweet_button.html?text=#{buzz_name}&url=http%3A//www.buzzfeed.com/#{buzz_uri}&count=vertical&related=buzzfeed" style="width:60px; height:70px;"></iframe> \
					</div> \
					<div class="social-message-share-stumble social-message-share-button" id="div_subadge"> \
					  <iframe src="http://www.stumbleupon.com/badge/embed/5/?url=http%3A//www.buzzfeed.com/#{buzz_uri}" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:65px; height: 80px;" allowTransparency="true"></iframe> \
					</div> \
					<div class="social-message-share-digg social-message-share-button" style="width:52px"> \
					  <a class="DiggThisButton DiggMedium" href="http://digg.com/submit?url=http%3A//www.buzzfeed.com/#{buzz_uri}&amp;title=#{buzz_name}"></a> \
					</div> \
					<div class="social-message-share-reddit social-message-share-button"> \
					  <iframe scrolling="no" height="70" frameborder="0" width="69" src="http://www.reddit.com/static/button/button2.html?t=3&amp;width=69&amp;url=http%3A%2F%2Fwww.buzzfeed.com%2F#{buzz_uri}"></iframe> \
					</div> \
				</div> \
				<div class="clear"></div> \
			</div> \
		</div> \
	');
	
	// Success handlers
	this.badgeResponse = function( r ) {
		var json = eval( '('+ r.responseText +')' );
		if ($( 'spinner-badge' ) ) $( 'spinner-badge' ).hide(); 
		if (badge_vote_manager._spinner) {
			$(badge_vote_manager._spinner).hide();
			badge_vote_manager._spinner = null;
		}
		if ( json.success ) {
			BFW_Util.updateInfoCookie({last_active:json.last_active});
			var target = $(json.element_id);
			var parent = target;
			while ( parent.parentNode && !parent.getAttribute( 'rel:buzz_id' ) ) parent = parent.parentNode;
			Event.stopObserving(target, 'click', badge_vote_manager.vote);
			target.removeAttribute('href');
			$(target.parentNode).addClassName('voted');
			if ( json.already_voted ) return badge_vote_manager._already_voted(json);
			var user = new BF_User();
			var vote_category=target.getAttribute('rel:category');
			var vote_definition = badge_vote_manager.VOTE_DEFINITIONS[ vote_category ];
			var template = vote_definition.success_template;
			var data = { 
				username:user.getUserInfo().username, 
				display_name:user.getUserInfo().display_name, 
				title: unescape(parent.getAttribute('rel:buzz_title')),
				uri: parent.getAttribute('rel:buzz_uri'),
				badge: target.getAttribute('rel:badge_name')
			};
			badge_vote_manager._add_response( template, data, {parent_class:['feed-action','feed-badge']} );
			badge_vote_manager._hide_social_messages();
			if (target.getAttribute('rel:message')) $('badge-message').update(unescape(target.getAttribute('rel:message')));
			$('social_message').show();
			$('number_of_contribs_header').show();
			this._update_reaction_count( target.getAttribute('rel:badge_id') );
		}
		else { }
	}

	this.loveHateResponse = function( r ) {
		var json = eval( '('+ r.responseText +')' );
		if ($('spinner-love_or_hate')) $('spinner-love_or_hate').hide(); 
		if (badge_vote_manager._spinner) {
			$(badge_vote_manager._spinner).hide();
			badge_vote_manager._spinner = null;
		}
		if (json.success && json.element_id ) {
			BFW_Util.updateInfoCookie({last_active:json.last_active});
			var target = $(json.element_id);
			if ( target.parentNode.id.match(/(love|hate)_button-\d+/) ) {
				$(target.parentNode).show();
			}
			var parent = target;
			while ( parent.parentNode && !parent.getAttribute( 'rel:buzz_id' ) ) parent = parent.parentNode;
			Event.stopObserving(target, 'click', badge_vote_manager.vote);
			target.removeAttribute('href');
			$(target.parentNode).addClassName('voted');
			if ( json.already_voted ) return badge_vote_manager._already_voted(json);
			var user = new BF_User();
			var vote_category=target.getAttribute('rel:category');
			var vote_definition = badge_vote_manager.VOTE_DEFINITIONS[ vote_category ];
			var template = vote_definition.success_template;
			var data = { 
				display_name:user.getUserInfo().display_name, 
				title: unescape(parent.getAttribute('rel:buzz_title')),
				uri: parent.getAttribute('rel:buzz_uri'),
				loves: target.getAttribute('rel:value')
			};
			var className = data.loves == 'loves' ? 'feed-love' : 'feed-hate';
			badge_vote_manager._hide_social_messages();
			if ( !badge_vote_manager.is_contribution(target) ) {
				badge_vote_manager._add_response( template, data, {parent_class:['feed-action',className]} );
				$('social_message-' + data.loves ).show();
				$('number_of_contribs_header').show();
				this._update_reaction_count( data.loves == 'loves' ? 'love' : 'hate' );
			}
			else {
				var contribution_message = $('social_message-' + parent.getAttribute('rel:buzz_id'));
				var vote_feedback = data.loves == 'loves' ? 'Yeah!' : 'Awww';
				contribution_message.update(vote_feedback);
				contribution_message.show();
			}
		}
		else { }
	}

	this._already_voted = function( json ) {
		badge_vote_manager._hide_social_messages();
		var target = $(json.element_id);
		if ( badge_vote_manager.is_contribution( target ) ) {
			var parent = target;
			while ( parent.parentNode && !parent.getAttribute( 'rel:buzz_id' ) ) parent = parent.parentNode;
			var social_message = $('social_message-' + parent.getAttribute('rel:buzz_id'));
			if ( social_message ) {
				social_message.update('Okay!');
				social_message.style.width = '100%';
				social_message.show();
			}
		}
		else {
			$('social_message-already-voted').show();
		}
	}

	this._add_response = function( template_str, data, args ) {
		var items = {};
		for( var each in data ) {
			items[each] = data[each].replace(/</g,'&lt;').replace(/>/g,'&gt;');
		}
		var template = new Template( template_str );
		var message = template.evaluate( items );
		var li = new Element( 'li', {'class':'feed-action'} );
		$( 'contribution-list' ).insert( {top:li} );
		if ( args && args.parent_class ) {
			var classes = args.parent_class;
			for( var i = 0; i < classes.length; i++ ) {
				li.addClassName( classes[i] );
			}
		}
		li.update( message );
	}

	this._exceeded_maximum_badge_votes = function() {
		var buttons = $$('.vote-badge');
		for ( var i = 0; i < buttons.length; i++ ) {
			Event.stopObserving(buttons[i], 'click', badge_vote_manager.vote);
			buttons[i].observe( 'click', badge_vote_manager._show_vote_exceeded );
		}
		badge_vote_manager._show_vote_exceeded();
	}

	this._show_vote_exceeded = function( e ) {
		if ( typeof e != 'undefined' ) e.stop();
		badge_vote_manager._hide_social_messages();
		$('social_message-badge-votecount-exceeded').show();
	}

	this._hide_social_messages = function() {
		if ($('social_message-badge-votecount-exceeded')) $('social_message-badge-votecount-exceeded').hide();
		if ($('social_message-already-voted')) $('social_message-already-voted').hide();
		if ($('social_message')) $('social_message').hide();
		if ($('social_message-loves')) $('social_message-loves').hide();
		if ($('social_message-hates')) $('social_message-hates').hide();
	}

	// initialize click handler
	this.init = function() {
		// initialize login form
		bf_login.init();
		this.ajax = new BF_Request();

		if ( typeof twttr == 'undefined' ) {
			var script = document.createElement('script');
			script.src = 'http://platform.twitter.com/anywhere.js?id='+BF_STATIC.twitter_api_key+'&v=1';
			script.async = true;
			document.getElementsByTagName('BODY')[0].appendChild(script);
		}

		var user_info = (new BF_User()).getUserInfo();
		if (user_info && typeof user_info.p_disable_reaction != 'undefined' 
			&& user_info.p_disable_reaction == 'true')
		{
			$$('#lovehate_buttons, #badge_voting, .lovehate-buttons').each(function(el) { el.style.visibility = 'hidden'; });
		}
		else
		{
			// set vote observers for anything with class:
			// vote-[category] where category is a key in VOTE_DEFINITIONS.
			// make the element has an ID and set correct category
			for ( var category in badge_vote_manager.VOTE_DEFINITIONS ) {
				var divs = $$('.vote-' + category);
				for ( var i = 0; i < divs.length; i++ ) {
					var div = divs[i];
					if ( div.className.match(/bf_dom/) ) continue;
					div.setAttribute('rel:category', category);
					if (! div.id ) {
						div.id = 'vote-' + category + '-' + parseInt(Math.random() * 10000000);
					}
					div.observe('click', badge_vote_manager.vote);
				}
			}			
		}
		
		var target = $('filter-show_everything');
		var showSortButtons = $$('#contribution-list .contrib').length > 0 && $$('#contribution-list .feed-action').length > 0;
		if ( target ) {
			target.observe('click',function(e){
				e.stop();
				badge_vote_manager._hide_content('feed-action', false);
				badge_vote_manager._hide_content('contrib', false);
				$(e.target.parentNode).addClassName('current');
				$($('filter-hide_contributions').parentNode).removeClassName('current');
				$($('filter-hide_all_votes').parentNode).removeClassName('current');
			});
		}
		target = $('filter-hide_all_votes');
		if (target) {
			if (showSortButtons) target.show();
			target.observe('click',function(e){
				e.stop();
				badge_vote_manager._hide_content('feed-action', true);
				badge_vote_manager._hide_content('contrib', false);
				$(e.target.parentNode).addClassName('current');
				$($('filter-hide_contributions').parentNode).removeClassName('current');
				$($('filter-show_everything').parentNode).removeClassName('current');
			});
		}
		target = $('filter-hide_contributions');
		if (target) {
			if (showSortButtons) target.show();
			target.observe('click',function(e){
				e.stop();
				badge_vote_manager._hide_content('feed-action', false);
				badge_vote_manager._hide_content('contrib', true);
				$(e.target.parentNode).addClassName('current');
				$($('filter-hide_all_votes').parentNode).removeClassName('current');
				$($('filter-show_everything').parentNode).removeClassName('current');
			});
		}
		target = $('number_of_contribs_header');
		if(target && !showSortButtons) { 
			$('number_of_contribs_header').addClassName('no-menu'); 
		}
		target = $('fb-login-again');
		if ( target ){
			target.observe('click',function(e){
				e.stop();
				$('log-into-facebook-again').hide();
			});
		}
		target = $('fb-dont-login-again');
		if ( target ){
			target.observe('click',function(e){
				e.stop();
				$('log-into-facebook-again').hide();
				createCookie('fb-vote-prompt','false');
			});
		}
		var contribs = $$('.contrib');
		for( var i = 0; i < contribs.length; i++ ) {
			var buzz_id = contribs[i].getAttribute('rel:buzz_id');
			if ( buzz_id ) {
				contribs[i].observe( 'mouseout', function(e) {
					var parent = e.target;
					while ( parent.parentNode && !parent.getAttribute('rel:buzz_id') ) parent = parent.parentNode;
					var buzz_id = parent.getAttribute('rel:buzz_id');
					var id = 'tools-' + buzz_id;
					if ( $(id) ) {
						$(id).removeClassName('selected_tools');
					}
				});
				contribs[i].observe( 'mouseover', function(e) {
					var parent = e.target;
					while ( parent.parentNode && !parent.getAttribute('rel:buzz_id') ) parent = parent.parentNode;
					var buzz_id = parent.getAttribute('rel:buzz_id');
					var id = 'tools-' + buzz_id;
					if ( $(id) ) {
						$(id).addClassName('selected_tools');
					}
				});
			}
		}
		if ( document.location.href.match(/#share/) && $('badge_voting') ) {
			var target = $('badge_voting').getElementsByTagName('A')[0];
			if ( !target.id ) target.id = (new Date()).getTime();
			var vote_category = target.getAttribute( 'rel:category' );
			badge_vote_manager.show_sharing_links({element_id:target.id,category:vote_category});
		}
	}

	this._hide_content = function( class_name, hide ) {
		var items = $$('#contribution-list .' + class_name);
		for (var i = 0; i < items.length; i++ ) {
			if (hide) items[i].hide();
			else items[i].show();
		}
	}

	this.show_social_icons = function() {
		if ( typeof ActiveHistory == 'undefined' ) return;
		ActiveHistory.observe( 'visited:digg', function(){ 
			if ($('share_digg_button')) $('share_digg_button').show()
		});
		ActiveHistory.observe( 'visited:twitter', function(){ 
			if ($('share_twitter_button')) $('share_twitter_button').show()
		});
		ActiveHistory.observe( 'visited:reddit', function(){ 
			if ($('share_reddit_button')) $('share_reddit_button').show()
		});
		ActiveHistory.observe( 'visited:stumbleupon', function(){ 
			if ($('share_stumbleupon_button')) $('share_stumbleupon_button').show()
		});
		ActiveHistory.observe( 'visited:delicious', function(){ 
			if ($('share_delicious_button')) $('share_delicious_button').show()
		});
		ActiveHistory.observe( 'visited:fark', function(){ 
			if ($('share_fark_button')) $('share_fark_button').show()
		});
		// ActiveHistory.observe( 'visited:myspace', function(){ 
		// 	if ($('share_myspace_button')) $('share_myspace_button').show()
		// });
	}

	this.flow_vote = function( e, data ) {
		var target = e.target;
		var user = new BF_User();
		var parent = target;
		while ( parent.parentNode && !parent.getAttribute( 'rel:buzz_id' ) ) parent = parent.parentNode;
		data.buzz_id = parent.getAttribute('rel:buzz_id');
		if ( user.isLoggedIn() ) {
			if ( data.category == 'badge' ) {
				var user = new BF_User();
				var user_info = user.getUserInfo();
				if ( typeof _badge_votes_so_far == 'undefined' ) {
					_badge_votes_so_far = {};
				}
				if ( typeof _badge_votes_so_far[data.buzz_id] == 'undefined' ) {
					_badge_votes_so_far[data.buzz_id] = {};
				}
				if ( typeof _badge_votes_so_far != 'undefined' ) {
					if ( typeof _badge_votes_so_far[''+data.buzz_id] == 'undefined' ) {
						_badge_votes_so_far[''+data.buzz_id] = {};
					}
					if ( typeof _badge_votes_so_far[''+data.buzz_id][user_info.username] == 'undefined' ) {
						_badge_votes_so_far[''+data.buzz_id][user_info.username] = 1;
					}
					else {
						_badge_votes_so_far[''+data.buzz_id][user_info.username] += 1;
					}
					if ( _badge_votes_so_far[''+data.buzz_id][user_info.username] >= 4 ) {
						return badge_vote_manager._flow_show_vote_exceeded( data.buzz_id );
					}
				}
			}
			badge_vote_manager._flow_vote( target, data );
		}
		else {
			badge_vote_manager.login( target );
			badge_vote_manager.onLogin = function() { badge_vote_manager._flow_vote( target, data ) };
			badge_vote_manager.onRegister = function() { badge_vote_manager._flow_showRegistrationMessage( data.buzz_id ) };
		}
	}
	
	this._flow_vote = function( target, data ) {
		badge_vote_manager._flow_hide_all_social_messages();
		var parent = target;
		if (!target.id) target.id = 'temp-'+(new Date()).getTime();
		var vote_category = target.getAttribute( 'rel:category' );
		badge_vote_manager.show_sharing_links({element_id:target.id,category:vote_category});
		while ( parent.parentNode && !parent.getAttribute( 'rel:buzz_id' ) ) parent = parent.parentNode;
		data.buzz_id = parent.getAttribute('rel:buzz_id');
		data.buzz_uri = '/' + parent.getAttribute('rel:buzz_uri');
		data.buzz_title = unescape(parent.getAttribute('rel:buzz_title'));
		data.blurb = unescape(parent.getAttribute('rel:blurb'));
		data.image_src = unescape(parent.getAttribute('rel:image_src'));
		data.title_is_excerpt = parent.getAttribute('rel:title_is_excerpt');
		badge_vote_manager._spinner = $( data.buzz_id + '-spinner-' + data.category );
		badge_vote_manager._spinner.show();
		var vote_definition = this.VOTE_DEFINITIONS[ data.category ];
		if (! vote_definition ) return;
		var params = {
			action : 'vote',
			element_id : target.id,
			category : data.category,
			uri : data.buzz_uri,
			buzz_id: data.buzz_id,
			from_page : window.location.href.split('/').pop()
		};
		for( var each in vote_definition.parameters ) {
			params[each]=vote_definition.parameters[each](target);
		}
		badge_vote_manager.ajax.request( this.VOTE_CONTROLLER, {
			method: 'get',
			parameters: params,
			onSuccess: function(r){vote_definition.onSuccess_flow(r,data)}
		});
	}
	
	this.flow_badgeResponse = function( r, data ) {
		var json = eval( '('+ r.responseText +')' );
		if ($( 'spinner-badge' ) ) $( 'spinner-badge' ).hide(); 
		if (badge_vote_manager._spinner) {
			$(badge_vote_manager._spinner).hide();
			badge_vote_manager._spinner = null;
		}
		if ( json.success ) {
			BFW_Util.updateInfoCookie({last_active:json.last_active});
			var user = new BF_User();
			var target = $(json.element_id);
			Event.stopObserving(target, 'click', event_handler._event_handler);
			target.removeAttribute('href');
			$(target.parentNode).addClassName('voted');
			if ( json.already_voted ) {
				badge_vote_manager._flow_already_voted(data.buzz_id);
				return;
			}
			var vote_definition = badge_vote_manager.VOTE_DEFINITIONS[ data.category ];
			data.username = user.getUserInfo().username; 
			data.display_name = user.getUserInfo().display_name;
			data.title = data.buzz_title;
			data.uri = data.buzz_uri;
			data.badge = data.badge_name;
			badge_vote_manager._flow_hide_all_social_messages();
			if (data.message) $(data.buzz_id + '-badge-message').update(unescape(data.message));
			$(data.buzz_id + '-social_message').show();
		}
		else { }
	}

	this.flow_loveHateResponse = function( r, data ) {
		var json = eval( '('+ r.responseText +')' );
		if (badge_vote_manager._spinner) {
			$(badge_vote_manager._spinner).hide();
			badge_vote_manager._spinner = null;
		}
		if (json.success ) {
			var user = new BF_User();
			BFW_Util.updateInfoCookie({last_active:json.last_active});
			var target = $(json.element_id);
			Event.stopObserving(target, 'click', event_handler._event_handler);
			target.removeAttribute('href');
			$(target.parentNode).addClassName('voted');
			if ( json.already_voted ) {
				badge_vote_manager._flow_already_voted(data.buzz_id);
				return;
			}
			var vote_definition = badge_vote_manager.VOTE_DEFINITIONS[ data.category ];
			data.display_name = user.getUserInfo().display_name, 
			data.title = data.buzz_title,
			data.uri = data.buzz_uri,
			data.loves = data.value
			var className = data.loves == 'loves' ? 'feed-love' : 'feed-hate';
			$(data.buzz_id + '-social_message-' + data.loves ).show();
		}
		else { }
	}
	
	this._flow_already_voted = function( buzz_id ) {
		badge_vote_manager._flow_hide_all_social_messages();
		$(buzz_id + '-social_message-already-voted').show();
	}
	
	this._flow_hide_all_social_messages = function() {
		$$('.social-message').each(function(el){el.hide()});
	}
	
	this._flow_show_vote_exceeded = function( buzz_id ) {
		badge_vote_manager._flow_hide_all_social_messages();
		$(buzz_id + '-social_message-badge-votecount-exceeded').show();
	}
	
	this._flow_showRegistrationMessage = function( buzz_id ) {
		var targetParent = $(buzz_id + '-social-actions');
		if ( targetParent ) {
			var div = document.createElement('div');
			div.className = 'section social-message validate';
			var h5 = document.createElement('h5');
			var span = document.createElement('span');
			span.appendChild(document.createTextNode('Please Validate Your Email'));
			h5.appendChild(span);
			var p = document.createElement('p');
			p.appendChild(document.createTextNode('Thanks for registering. Before you can react or contribute we need to quickly validate your email address. We\'ve sent you a confirmation email with instructions. If you don\'t receive the email in a few minutes, please check your spam folder.'));
			div.appendChild(h5);
			div.appendChild(p);
			targetParent.appendChild( div );
		}
		if( $('registration-div') ) $('registration-div').hide();
	}

	this.vote = function( e ) {
		e.stop();
		var user = new BF_User();
		var target = e.target;
		if ( user.isLoggedIn() ) {
			var vote_category = target.getAttribute( 'rel:category' );
			badge_vote_manager.show_sharing_links({element_id:target.id,category:vote_category});
			user_info = user.getUserInfo();
			var fb_vote_prompt = readCookie('fb-vote-prompt');
			badge_vote_manager._vote( target );
		}
		else {
			badge_vote_manager.login( target );
			badge_vote_manager.onLogin = function() { badge_vote_manager._vote( target) };
			badge_vote_manager.onRegister = function() { badge_vote_manager._showRegistrationMessage( target) };
		}
		
	}
	
	this._showRegistrationMessage = function( target ) {
		var parent = target;
		while ( parent.parentNode && !parent.getAttribute( 'rel:buzz_id' ) ) parent = parent.parentNode;
		var buzz_id = parent.getAttribute('rel:buzz_id');
		var targetParent = $('tools-div-' + buzz_id);
		if (! targetParent ) targetParent = $('social-actions');
		if ( targetParent ) {
			var div = document.createElement('div');
			div.className = 'section social-message validate';
			var h5 = document.createElement('h5');
			var span = document.createElement('span');
			// span.setAttribute('style','background:#d51;color:#fff;padding:1px 4px');
			span.appendChild(document.createTextNode('Please Validate Your Email'));
			h5.appendChild(span);
			var p = document.createElement('p');
			p.appendChild(document.createTextNode('Thanks for registering. Before you can react or contribute we need to quickly validate your email address. We\'ve sent you a confirmation email with instructions. If you don\'t receive the email in a few minutes, please check your spam folder.'));
			div.appendChild(h5);
			div.appendChild(p);
			targetParent.appendChild( div );
			if( $('registration-div') ) $('registration-div').hide();
		}
	}

	this._vote = function( target ) {
		var vote_category = target.getAttribute( 'rel:category' );
		if (! vote_category ) return;

		var parent = target;
		while ( parent.parentNode && !parent.getAttribute( 'rel:buzz_id' ) ) parent = parent.parentNode;
		
		var buzz_id = parent.getAttribute('rel:buzz_id');
		if ( vote_category == 'badge' ) {
			if ( typeof _badge_votes_so_far == 'undefined' ) {
				_badge_votes_so_far = {};
				_badge_votes_so_far[buzz_id] = {};
			}
			var user = new BF_User();
			var user_info = user.getUserInfo();
			if ( typeof _badge_votes_so_far != 'undefined' ) {
				if ( typeof _badge_votes_so_far[''+buzz_id][user_info.username] == 'undefined' ) {
					_badge_votes_so_far[''+buzz_id][user_info.username] = 1;
				}
				else {
					_badge_votes_so_far[''+buzz_id][user_info.username] += 1;
				}
				if ( _badge_votes_so_far[''+buzz_id][user_info.username] >= 4 ) {
					return badge_vote_manager._exceeded_maximum_badge_votes();
				}
			}
		}

		if ( badge_vote_manager.is_contribution( target ) ) {
			$('love_button-' + parent.getAttribute('rel:buzz_id')).hide();
			$('hate_button-' + parent.getAttribute('rel:buzz_id')).hide();
			$('social_message-' + parent.getAttribute('rel:buzz_id')).hide();
			badge_vote_manager._spinner = $('spinner-'+parent.getAttribute('rel:buzz_id'));
			$( badge_vote_manager._spinner ).style.width = '100%';
			$( badge_vote_manager._spinner ).show();
		}
		else if ($( 'spinner-' + vote_category ) ) {
			$( 'spinner-' + vote_category ).show();
		}
		var vote_definition = this.VOTE_DEFINITIONS[ vote_category ];
		if (! vote_definition ) return;
		var params = {
			action : 'vote',
			element_id : target.id,
			category : vote_category,
			uri : '/'+parent.getAttribute('rel:buzz_uri'),
			buzz_id: parent.getAttribute('rel:buzz_id')
		};
		for( var each in vote_definition.parameters ) {
			params[each]=vote_definition.parameters[each](target);
		}
		var ajax = new BF_Request();
		ajax.request( this.VOTE_CONTROLLER, {
			method: 'get',
			parameters: params,
			onSuccess: vote_definition.onSuccess
		});
	}
	
	this.simple_love_vote = function(uri,buzz_id) {
		var vote_definition = this.VOTE_DEFINITIONS[ 'love_or_hate' ];
		var params = {
			action : 'vote',
			buzz_id : buzz_id,
			category : 'love_or_hate',
			uri : uri,
			value: 1
		};
		var ajax = new BF_Request();
		ajax.request( this.VOTE_CONTROLLER, {
			method: 'get',
			parameters: params,
			onSuccess: vote_definition.onSuccess
		});
	}
	
	this.is_contribution = function( target ) {	
		var parent = target;
		while ( parent.parentNode && !parent.getAttribute( 'rel:buzz_id' ) ) parent = parent.parentNode;
		return parent.parentNode.className.match(/contribution-lovehate-buttons/) ;
	}

	this.login = function( target ) {
		var registration_div = $('registration-div');
		if( registration_div ) {
			registration_div.parentNode.removeChild( registration_div );
		}
		var login_form_target_str = target.getAttribute('rel:login_form_target') ;
		if ( !login_form_target_str ) {
			var json = eval('('+target.getAttribute('rel:data')+')');
			if ( json ) login_form_target_str = json.vote.login_form_target;
		}
		if ( !login_form_target_str ) login_form_target_str = 'social-actions';
		if ( $(login_form_target_str) ) $(login_form_target_str).appendChild( registration_div );

		var reg = new BF_Register();
		reg.register_handler(false,{action:'badge_vote'});
		reg.fb_register_handler(false,{action:'badge_vote'});
		$('login-submit').value='Sign In';
		$('register-submit').value='Register';
		if ($('preview-again-from-registration')) $('preview-again-from-registration').hide();
		if ($('preview-again-from-login')) $('preview-again-from-login').hide();
		bf_login.args = { action: 'badge_vote' };
		$('registration-div').showOnScreen();
	}
	
	this._update_reaction_count = function(id_prefix) {		
		var id = id_prefix + '-reaction-count';
		var count = $(id).innerHTML.replace(/\s+/g, '');
		var count= parseInt(count);
		if (! isNaN(count)) {
			count++;
			$(id).update(count);
		}
	}
	
	this.show_sharing_links = function(info) {
		// if this is a second vote on the same buzz, don't re-show the sharing links
		if ( !info.category ) info.category = info.element_id.split('-').slice(0,-1).join('-');
		if ( info.category == 'love-button' ) info.category = 'love_or_hate';
		var parent = $(info.element_id);
		while ( (info.buzz_id = parent.getAttribute('rel:buzz_id')) == null && parent.parentNode) parent = parent.parentNode;
		if ( $('generated-sharing-links') && $('generated-sharing-links').getAttribute('rel:buzz_id') == info.buzz_id) return;
		// are sharing links on page?
		var blank = BF_STATIC.image_root + '/static/images/public/backgrounds/trans.gif';
		['default-sharing-links','generated-sharing-links'].each( function(id){
			// if so, set src of all iframes to BF_STATIC.image_root+'/static/images/public/backgrounds/trans.gif'
			// and remove sharing links from DOM
			var el = $(id);
			if (el) {
				var iframes = el.getElementsByTagName('IFRAME');
				for ( var i = 0; i < iframes.length; i++ ) {
					iframes[i].src = blank;
				}
				el.parentNode.removeChild( el );
			}
		});
		// collect data needed for sharing links 
		var data = {image_root:BF_STATIC.image_root};
		while ( (data.buzz_uri = parent.getAttribute('rel:buzz_uri')) == null && parent.parentNode) parent = parent.parentNode;
		while ( (data.buzz_name = parent.getAttribute('rel:buzz_title')) == null && parent.parentNode) parent = parent.parentNode;
		for ( var each in data ) {
			if ( each != 'image_root' && each != 'buzz_name') {
				data[each] = escape(data[each]);
			}
		}
		// generate sharing links snippet from template
		// insert it into the page
		var parent_div = badge_vote_manager.find_parent('div',$(info.element_id));
		if ( parent_div.parentNode.className.match(/contrib/) ) parent_div = parent_div.parentNode;
		else parent_div = parent_div.parentNode.parentNode;
		var div = document.createElement('div');
		div.id = 'generated-sharing-links';
		div.setAttribute('rel:buzz_id',info.buzz_id);
		data.buzz_id = info.element_id.split('-').pop();
		if ( $($(info.element_id).parentNode).parentNode.getAttribute('rel:buzz_id') ) {
			data.buzz_id = $($(info.element_id).parentNode).parentNode.getAttribute('rel:buzz_id');
		}
		var template = badge_vote_manager.SHARE_THE_LOVE_TEMPLATE;
		div.innerHTML = template.evaluate(data);
		// Digg it! button
		(function() {
		var s = document.createElement('SCRIPT'), s1 = document.getElementsByTagName('SCRIPT')[0];
		s.type = 'text/javascript';
		s.async = true;
		s.src = 'http://widgets.digg.com/buttons.js';
		s1.parentNode.insertBefore(s, s1);
		})();
		$(parent_div).appendChild(div);
		FB.XFBML.parse(div);
		var badge_prefix = '';
		if ( $(info.element_id).getAttribute('rel:badge_name') ) {
			badge_prefix = $(info.element_id).getAttribute('rel:badge_name') + '! ';
		}
		else if ($(info.element_id).getAttribute('rel:data')) {
			var json = $(info.element_id).getAttribute('rel:data');
			var obj = eval('('+json+')');
			if ( typeof obj.vote != 'undefined' && typeof obj.vote.badge_name != 'undefined' ) {
				badge_prefix = obj.vote.badge_name + '! ';
			}
		}
		var setup_twitter = function(count,msg){
			if ( typeof twttr != 'undefined' ) {
				twttr.anywhere(function (T) {
					T("#tweet-box-"+data.buzz_id).tweetBox({
						width: 280,
						label: "Share on Twitter",
						defaultContent : msg
					});
				});
			}
			else {
				if ( count < 10 ) {
					window.setTimeout(function(){setup_twitter(count++)},200);
				}
				else {
					//console.warn('twttr took too long to load');
				}
			}
		}
		if ( !Prototype.Browser.IE6 ) {
			new Ajax.Request('/buzzfeed/_short_url',{
				method:'get',
				parameters:{
					buzz_id : data.buzz_id,
					url : 'http://buzzfeed.com/' + data.buzz_uri,
					format : 'json'
				},
				onComplete : function(r){
					var obj = eval('('+r.responseText+')');
					var msg = badge_prefix + unescape(unescape(data.buzz_name)) + ' ' + obj.short_url || 'http://buzzfeed.com/'+data.buzz_uri;
					setup_twitter(0,msg);
				}
			});
		}
	}
	
	this.find_parent = function(tag,el){
		// climb parent till you find specified tag
		if ( el.tagName.toLowerCase() == tag.toLowerCase() ) return el;
		else if (el.parentNode != null) return badge_vote_manager.find_parent( tag, el.parentNode );
		else return console.warn('no ' + tag + ' found in DOM');
	}
}

badge_vote_manager = new bf_badge_vote_manager();
badge_vote_manager.show_social_icons();
BuzzLoader.register( function() {
	badge_vote_manager.init();	
}, 2);

