/**
 * Multicall General Javascript. Put any site-wide 'onDocReady' functions here.
 *
 * @author     Mike Barnlund <mike@chaordix.com>
 */

var isPanelOpen = false;

formid = '';

$(document).ready(function() {

	// ======================== Login Panel Control =========================== //
	$(".followbutton").click( function() { return onItemFollow(this); } );
	// ======================== Login Panel Control ===========================

	// Anything with the 'loginprompt' class opens the panel
	$(".loginprompt").click( function(e) { openPanel(); e.stopImmediatePropagation(); return false; });

	// Collapse Panel with the 'close' link
	$("#close").click( function() { closePanel(); });

	// ======================== Profile Commands ==============================

	// Show profile commands when the user hovers over the avatar
	$('#avatarwrapper').hover(
		function() { $(this).children('#profilecommands').stop(false,true).animate({bottom:-10},{duration:700, easing:'easeOutElastic'}); },
		function() { $(this).children('#profilecommands').stop(false,true).animate({bottom:-32},{duration:700, easing:'easeOutQuart'}); }
	);

	// ======================== Required Form Fields ==============================

	$('label.required').prepend('<span class="require">* </span>')

	// ======================== Prize Description =============================

	// Show prize description when the user hovers over a prize summary
	$('.prize').hover(
		function() {
			if (!$.browser.msie) { $(this).children('.prize-tip').fadeIn('fast'); }
			else $(this).children('.prize-tip').show();
		},

		function() {
			if (!$.browser.msie) { $(this).children('.prize-tip').fadeOut('fast'); }
			else $(this).children('.prize-tip').hide();
		}
	);

	// ========================== Help Text Control ===========================

	// Elements (input, textarea, select) inside a .helpcontainer show the help text
	var helpContainers = '.helpcontainer input, .helpcontainer textarea, .helpcontainer select';
	$(helpContainers).focus( function() { $(this).siblings('.help').fadeIn(300); } );
	$(helpContainers).blur( function() { $(this).siblings('.help').fadeOut(300); } );

	// ========================== Voting Widget Control =======================

	$( '.activevote' ).click( function() { return onVoteClick(this); } );

	// ========================== jGrowl Form Errors ==========================

	if ( $( '.form_errors li' ).length > 0 ) {
		$.jGrowl( '<div class="errors"><label class="error">Submission Error</label>' + $( '.form_errors' ).html() + '</div>', { sticky: true } );
	}

	// ========================= Close Notifications ==========================

	/* -- One day, when we use AJAX here, re-enable this.
	$('.closenotification').click(
		function () {
			$('#notification').fadeOut(
				function() {
					$('#activecall').removeClass('sbcontent right');
				}
			)
		}
	);
	*/

	// ====================== Admin Reports ================================

	$('table.altrows tr:odd td').addClass('alt');

	// ====================== Drop Down Admin Menu ============================

	//match parent width
	$( '.down-list' ).width( $( '.dropdown-menu' ).width() );

	//show on hover
	$( '.dropdown-menu' ).hover( function () {
			$('.menu-first', this).addClass('slide-down');
			$('.down-list', this).slideDown(200);
		},
		function () {
			obj = this;
			$('.down-list', this).slideUp(200, function(){ $('.menu-first', obj).removeClass('slide-down'); });
		}
	);

	//animate item on hover
	$( '.down-list a').hover(
		function() {
			$(this).animate( { width: "107px" }, 150 );
		},
		function() {
			$(this).animate( { width: "100px" }, 150 );
		}
	);

	// ======================= Sharing Widget =================================

	$( '.sharelink' ).hover(
		function () {
			$( '.sharepopup' ).fadeIn(100);
		},
		function () {
			$( '.sharepopup' ).fadeOut(100);
		}
	);

	$( '.sharecontent input' ).click( function() { $( this ).select(); } );

	// ====================== Points Breakdown ================================

	var bdownVisible = false;

	$( '#bdownbutton' ).click( function() {
		if (bdownVisible == false) {
			var distance = $( '.slider .points' ).css( 'height' );
			$('.slider').animate( { 'top': '-' + distance }, 500 );
			$( '#bdownbutton' ).html('see points total');
		} else {
			$( '.slider' ).animate( { 'top': '0' }, 500 );
			$( '#bdownbutton' ).html('see points breakdown');
		}
		bdownVisible = !bdownVisible
	} );

	// ====================== List Sorting Widget ================================

	$(".sort-list dt a").click(function() {
	    $(".sort-list dd ul").toggle();
		return false;
	});
	$(".sort-list dd ul li a").click(function() {
	    $(".sort-list dd ul").hide();
	});

	// ====================== Top Navigation ================================

	$("#left-nav li:last-child").addClass('last');


	$("#top-nav dl dt a").click(function() {
	    $("#top-nav dl dd").toggle();
		$("#top-nav dt").addClass('over');
		return false;
	});
	$("#top-nav dl dd ul li a").click(function() {
	    $("#top-nav dl dd").hide();
		$("#top-nav dt").removeClass('over');
	});

	// ======================= Prize =============================

	// Show prize description when the user hovers over a prize summary
	$('.prize').hover(
		function() {
			if (!$.browser.msie) { $(this).children('.prize-tip').fadeIn('fast'); }
			else $(this).children('.prize-tip').show();
		},

		function() {
			if (!$.browser.msie) { $(this).children('.prize-tip').fadeOut('fast'); }
			else $(this).children('.prize-tip').hide();
		}
	);

	// ======================= Profile Popup ===============================

	$( '.showpopup' ).hover( function() {
		var popup = getPopup();
		$( this ).append( popup );

		var height = $( this ).children( 'img' ).height();
		var width = $( this ).children( 'img' ).width();

		popup.css( 'width', width );
		popup.css( 'height', height );

		if (!$.browser.msie) popup.fadeIn( 150 );
		else popup.show();
	} );

	$( '.showpopup' ).mouseleave( function() {
		var popupImage = getPopup();
		popupImage.hide();
	} );

	$( '.showpopup' ).click( function() {
		var id = $( this ).attr( 'id' );
		//Get our popup
		var popup = $( '#profilepopup_' + id );

		//Locate the clicked element
		position = new Object();
		position.top = $( this ).offset().top;
		position.left = $( this ).offset().left;

		//Position the popup directly over the clicked element
		popup.css( 'top', position.top );
		popup.css( 'left', position.left );

		//show our popup
		if (!$.browser.msie) popup.fadeIn( 100 );
		else popup.show();
		return false;
	} );

	$( '.profilepopup' ).mouseleave( function() {
		var popup = this;
		if (!$.browser.msie) var fadepopup = function() { $( popup ).fadeOut( 100 ); };
		else var fadepopup = function() { $( popup ).hide(); };
		setTimeout( fadepopup, 500 );
	} );

	/* ======================= Inbox =========================== */
	$( 'table.inbox td' ).css( 'cursor', 'pointer' );
	$( 'table.inbox td:not( .checkbox )' ).click( function() {
		//grab the link to the appropriate view message page
		var subjectcell = ( $( this ).hasClass( 'subject' ) ? $( this ) : $( this ).siblings( '.subject' ) );

		var goto = subjectcell.children( 'a' )[0].href;

		window.location = goto;
	} );

	/* ====================== Message Threads ========================= */

	$( 'div.msgcollapsed' ).click( function() {
		$( this ).parent().removeClass( 'collapsed' ).addClass( 'expanded' );
	} );

	$( 'div.subject' ).click( function() {
		$( this ).parents( 'div.expanded' ).removeClass( 'expanded' ).addClass( 'collapsed' );
	} );

	/* ======================= Member Management ======================= */

	/* ======================= Forms ======================= */
	$(document).ajaxError(function() {
		if( formid !== undefined ){
			fakeSubmitForm( formid );
		}
	});

	$( 'form.form_check' ).submit( function(e) {
			if( formid == "#" + $( this ).attr("id") ){
				// if we've already checked the form, clear the key and submit
				formid = '';
				return true;
			}

			var formdata = $( this ).serialize() + "&formcheck=1";
			$(this).children(':label').removeClass( "error" );
			$('span.error').remove();
			formid = "#" + $( this ).attr("id");
			$.post(
					$( this ).action,
					formdata,
					function(data){
						if( data.form_is_complete == false ){
							var error_list = '';
							for ( var key in data['errors'] ) {
								$( "#label_" + key ).addClass( "error" );
								$( "#label_" + key ).append(
									" <span class=\"error\" id=\"error_" + key + "\">" + data['errors'][key] + "</span>"
								);
								error_list = error_list + "<li>" + data['errors'][key] + "</li>"
							}
							$.jGrowl( '<div class="errors"><label class="error">Submission Error</label><ul>' + error_list + '</ul></div>', { sticky: true } );
							formid = '';
						} else {
							fakeSubmitForm( formid );
						}
					},
					"json"
			);
			e.stopImmediatePropagation();
			return false;
		}
	);

});

// we need to be able to submit a form without actually clicking the submit button(s)
function fakeSubmitForm(formid, button_id) {
	// fake button already exists?
	var _fake_button_id = '_fake_button_id' + formid;

	// look for first submit button
	var _fake_button = function (button) {
		// if we already have a fake button for this form, override value
		if ($('#' + _fake_button_id).length) {
			$('#' + _fake_button_id).val($(button).attr('name'));
		} else {
			$(formid).prepend( '<input id="' + _fake_button_id + '" type="hidden" value="' + $(button).val() + '" name="' + $(button).attr('name') + '" />');
		}
	};

	// were we passed a button?
	if (button_id) {
		_fake_button($('#' + button_id));
	} else {
		// no button passsed, default to first button
		$(formid + ' button').each(function (i, button) {
			if (!$(button).attr('value')) {
				return;
			}
			_fake_button(button);
			return false;
		});
	}
	$(formid).submit();
}

/*
* Returns an image element singleton for placement on a popup avatar
*/
var _popupImg = null;
function getPopup( width, height) {
	if ( _popupImg == null ) {
		_popupImg = $( '<div style="width: 0; height: 0" class="black50p"><img style="padding: 2px; float:right" src="/assets/img/silk/information.png"/></div>' );
		_popupImg.css( 'position', 'absolute' );
		_popupImg.css( 'top', '1px' );
		_popupImg.css( 'left', '1px' );
		_popupImg.css( 'z-index', '99' );
		_popupImg.hide();
		//_popupImg.insertBefore( document.body.firstChild );
	}
	return _popupImg;
}

/* when you click away from the sort menu it dissapears */
$(document).bind('click', function(e) {
    var $clicked = $(e.target);
    if (! $clicked.parents().hasClass("drop"))
        $("#top-nav dl dd").hide();
		$("#top-nav dt").removeClass('over');
});

/* when you click away from the sort menu it dissapears */
$(document).bind('click', function(e) {
    var $clicked = $(e.target);
    if (! $clicked.parents().hasClass("sort-list"))
        $(".sort-list dd ul").hide();
});

function onVoteClick(voteContainer) {
	var clickedThumb = $(voteContainer).children('.hasvoted');
	var isNewVote = !($(clickedThumb).is(':visible'));

	// if they aren't logged in, don't process click.
	var link = $(voteContainer).attr('href')
	if( null != link.match( 'login' ) )
		return true;

	var link = $(voteContainer).attr('href')
	if( null != link.match( 'login' ) )
		return true;

	//fade back in the white thumbs (skips visible ones)
	if (isNewVote) {
		$(voteContainer).parent().find('.hasvoted:visible').fadeOut();
		$(clickedThumb).fadeIn();
	}

	$.ajax({
	  url: $(voteContainer).attr('href'),
	  success: function(data) {
		//update voter count or dimension breakdown

		var dump = '';
		for ( var dimension in data['dimension_breakdown'] ) {
			var dimensiondata = data['dimension_breakdown'][dimension];
			for ( var votelevel in dimensiondata ) {
				if ( dimensiondata[votelevel] == 'total' ) break;
				$( '#dimension' + dimension + ' .' + votelevel + ' .votecount' ).text( dimensiondata[votelevel] );
			}
		}

		$('.total-voters').text( data['voter_count'] + ' Reviews' );
		$('.vote-widget .score').text( data['new_score'] );
	  },
	  error: function(obj, error, exception) {
		//alert('Error: ' + error + '\nException: ' + exception);
	  },
	 dataType: 'json'

	});

	return false;
}

function openPanel() {
	if (!isPanelOpen) {
		$("div#panel").slideDown("slow", function() {
			$('#log').focus();
		});
		$("#toggle a").toggle();
		isPanelOpen = true;
	}
}

function closePanel() {
	if (isPanelOpen) {
		$("div#panel").slideUp("slow");
		$("#toggle a").toggle();
		isPanelOpen = false;
	}
}

function onItemFollow( container ) {
	var url = $(container).attr('href');

	$.ajax({
		url: url,
		success: function(data) {
			if ( data.result == 'Success' ) {

				var icon = '';

				switch ( data.type ) {
					case 'call':
						icon = '<b></b>';
						break;
					case 'idea':
						icon = '<i></i>';
						break;
					case 'member':
						icon = '<u></u>';
						break;
				}

				var text = '';

				if ( data.action == 'attach' ) {
					text = 'Unfollow';
					container.setAttribute('href', data.url );
					$( container ).removeClass( 'follow' );
					$( container ).addClass( 'unfollow' );
				} else if ( data.action == 'detach' ) {
					text = 'Follow';
					container.setAttribute('href', data.url );
					$( container ).removeClass( 'unfollow' );
					$( container ).addClass( 'follow' );
				}

				//see if we've got the inner span button
				var innerSpan = $( container ).find('span span')[0];

				var buttonContainer = ( innerSpan == null ) ? container : innerSpan;
				buttonContainer.innerHTML = icon + text;

				if ( typeof data._notice != 'undefined' ) {
					var len = data._notice.length;
					for ( var i = 0; i < len; ++i ) {
						$.jGrowl(data._notice[i]);
					}
				}
			} else {
				$.jGrowl( 'We encountered an error following this. Please refresh and try again.' );
			}
		},
		error: function(obj, error, exception) {
			$.jGrowl( error );
		},
		dataType: 'json'
	});

	return false;
}
