/* Tests:
  http://bf2.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(/behavior/) ) {
						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(/behavior/) ) {
						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>'
		}
	};

	// 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') );
			Facebook.postToWall('badge', {
				uri:data.uri,
				title:data.title,
				description:data.badge,
				blurb:unescape(parent.getAttribute('rel:blurb')),
				image_src:parent.getAttribute('rel:image_src'),
				title_is_excerpt: parent.getAttribute('rel:title_is_excerpt')
			});
		}
		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 ) {
			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();
			}
			Facebook.postToWall('love_hate', {
				uri:data.uri,
				title:data.title,
				description:data.loves,
				blurb:unescape(parent.getAttribute('rel:blurb')),
				image_src:parent.getAttribute('rel:image_src'),
				title_is_excerpt: parent.getAttribute('rel:title_is_excerpt')
			});
		}
		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();

		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(/behavior/) ) 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');
					}
				});
			}
		}
	}

	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' ) {
					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();
		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();
			Facebook.postToWall('badge', {
				uri:data.uri,
				title:data.title,
				description:data.badge,
				blurb:data.blurb,
				image_src:data.image_src,
				title_is_excerpt: data.title_is_exerpt
			});
		}
		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();
			Facebook.postToWall('love_hate', {
				uri:data.uri,
				title:data.title,
				description:data.loves,
				blurb:data.blurb,
				image_src:data.image_src,
				title_is_excerpt: data.title_is_excerpt
			});
		}
		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() ) {
			user_info = user.getUserInfo();
			var fb_vote_prompt = readCookie('fb-vote-prompt');
			// Prompt FB-registered users to log into FB if they're not already
			if ( fb_vote_prompt==null && user_info.registration_path=='buzzfeed' && (Facebook.uid=="" || Facebook.uid==null) && user_info.is_facebook_user=="true"){
				if ( badge_vote_manager.is_contribution( target ) ) {
					var prompt = $('log-into-facebook-again');
					var parent_should_be = $(target.getAttribute('rel:login_form_target'));
					prompt.parentNode.removeChild( prompt );
					parent_should_be.appendChild( prompt );
				}
				else {
					var prompt = $('log-into-facebook-again');
					var parent_should_be = $('social-actions');
					prompt.parentNode.removeChild( prompt );
					parent_should_be.appendChild( prompt );
				}
				$('log-into-facebook-again').show();
				Facebook.observe('user_logged_in', function(){badge_vote_manager._vote(target)});
				$('fb-dont-login-again').observe('click',function(){badge_vote_manager._vote(target)});
			}
			else {
				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' ) {
			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.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);
		}
	}
}

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

