(function($){
	$.fn.avaTip = function(){
		return this.each(function() {
			
			var avatar = this;
			var attr = ( $(this).find('a').attr("rel") )? $(this).find('a').attr("rel").split(',',3) : undefined;
			
			if(attr != undefined) {
				
				var name = attr[0];
				var img = attr[1];
				var key = attr[2];
				
				$(this).hover(function(e){

					if (avatar.ignore === true) { return; }
					
					//create html
					var html = '';
					if (img) { html += '<img src="'+img+'" />'; }
					html += '<div class="rollover_content"><p class="name">'+name+'</p></div>';

					
					$("body").append("<div class='avatar_rollover'>" + html + "</div>");
					this.rollover = $('.avatar_rollover:last');
					var rollover = this.rollover;
					
					
					//load additional data via ajax
					if (key && !$(this).data('user')) {
						
						$.post('/ajax/users/getUserData', {'key':key}, function(data) {

							if (data.status == 'error') { return; }
							
							//tell it to ignore updates
							avatar.ignore = true;

							$.fn.avaTip.buildUserStats(rollover,data);
							$(avatar).data('user',data);

							//update position and re-support outtro
							$('body').trigger('mousemove');
							avatar.ignore = false;
							

						}, 'json');
						
					}
					// load additional data without ajax
					if (key && $(this).data('user')) {
						$.fn.avaTip.buildUserStats(rollover,$(this).data('user'));
					}
					
					$(".avatar_rollover").css( $.fn.avaTip.edge(e.pageX,e.pageY) ).fadeIn("slow");
				}, 
				function(){
					$(".avatar_rollover").remove();
				});
				$(this).mousemove(function(e){
					$(".avatar_rollover").css( $.fn.avaTip.edge(e.pageX,e.pageY) ).fadeIn("slow");
				});
			}
		});
	};
	$.fn.avaTip.buildUserStats = function (rollover,data) {

		var html = '<div class="more">';
		if (data.location && data.location != 'null') { html += '<p>'+data.location+'</p>'; }
		html += '<p class="stat">Views: '+data.views_sum+'</p>';
		html += '<p class="stat">Points: '+data.points_sum+'</p>';
		html += '<p class="stat">Friends: '+data.friends_sum+'</p>';
		html += '<p class="stat">Posts: '+data.forum_posts_sum+'</p>';
		html += '</div>';

		$(rollover).find('.rollover_content').append(html);

		//update position and re-support outtro
		$('body').trigger('mousemove');

	};
	$.fn.avaTip.edge = function(pageX,pageY){
		
		// setting up tolerances here should make this configurable 
		var tolerance = {x:240,y:100};
		var $w = $(window);
		// pageX relative to window
		var screenPos = { x:pageX-$w.scrollLeft(), y:pageY-$w.scrollTop() };
		var css = {};
		if ( $w.width() - screenPos.x <= tolerance.x ) { 
			css.left = pageX - 230; 
		} else { 
			css.left = pageX+12; 
		}

		if ( $w.height() - screenPos.y <= tolerance.y ) {
			css.top = pageY - 120;
		} else {
			css.top = pageY+12;
		}
		return css;
	};
})(jQuery);

//--------------
//UTILS

//goto another page
function goto(url) {
	window.location = url;
}

//load a JS include
function require(path) {
	document.write('<script type="text/javascript" src="'+path+'"><\/script>');
}

//call a jsonp API from flash, like for twitter.  Robert has a demo.
function jsonp(api, swf_id) {
	$.getJSON(api, function(data, status) {
		document.getElementById(swf_id).jsonp(data);
	});
}

//--------------
//INITIALIZE

//this adds observers to hooks in pages
$(init);
function init() {

	//toggle the dashboard
	initDashboard();

	//add avatar rollovers
	$('span.avatar_wrapper').avaTip();

	//hide engine messages
	if ($('#engine').length > 0) {
		setTimeout(function() {
			$('#engine:has(.success)').fadeOut();
		}, 10000);
		$('#engine a[name="close"]').click(function(e) {
			e.preventDefault();
			$('#engine').fadeOut();
		});
	}
	
	//make redirect pulldown menus work
	$('select.redirect').change(function() {
		goto($(this).val());
	});
	
	//remove default value on click for login inputs
	$('label[for=email]:hidden').next('input#email').val('Email').focus(function () {
		if ($(this).val() == 'Email') { $(this).val(''); }
    }).blur(function() {
		if ($(this).val() == '') { $(this).val('Email'); }
	});
	$('label[for=password]:hidden').next('input#password').val('Password').focus(function () {
		if ($(this).val() == 'Password') { $(this).val(''); }
    }).blur(function() {
		if ($(this).val() == '') { $(this).val('Password'); }
	});
	
	// Check all
	$('#check_all').click(function() { $("input.mail_options").attr('checked', $('#check_all').is(':checked')); } );
	
}

//show the splash page if they haven't seen it yet
function showSplash(splash_days_till_expire) {
	
	//check if cookie is set
	if (!splash_days_till_expire) splash_days_till_expire = 14;
	if ($.cookie('splash_shown') == 1) return;
	
	//don't show the splash on https pages, this would happen when switching to checkout
	if (window.location.protocol == 'https:') return;
	
	//set cookie and redirect
	$.cookie('splash_shown', 1, { expires: splash_days_till_expire, path: '/' });
	goto('/splash');
}

//--------------
//AVATARS

//init avatar rollovers
function initAvatarRollovers() {

	//rollover
	var over = function(e) {
		
		//don't update while the height changes because of the "more" data
		if (this.ignore == true) return;
		
		//get vars
		var avatar = this;
		var attr = $(this).find('a').attr('rel').split(',');
		var name = attr[0];
		var img = attr[1];
		var key = attr[2];
		
		//create html
		var html = '<div class="avatar_rollover">';
		if (img) html += '<img src="'+img+'" />';
		html += '<div class="rollover_content"><p class="name">'+name+'</p></div>';
		html += '<div class="stem"></div>';
		html += '</div>';
		
		//add popup to dom
		$('body').append(html);
		this.rollover = $('.avatar_rollover:last');
		var rollover = this.rollover;
		
		//fix the width so float isn't weird
		var w = rollover.find('.rollover_content').width();
		if (img) w +=  rollover.find('img').width() + 6; //margin between img and content
		rollover.css('width', w);
				
		//follow the mouse
		this.follow = function(e) {
			
			//cache the mouse position
			if (e.pageX) this.x = e.pageX;
			else x = this.x;
			if (e.pageY) this.y = e.pageY;
			else y = this.y;
			
			//set the background of it based on what side of the screen we're on
			if (this.x < $('body').width()/2) {
				rollover.find('.stem').css({left: 9});
				var x = this.x - 20;
			} else {
				rollover.find('.stem').css({left: rollover.width() - 19});
				var x = this.x - rollover.width() + 8;
			}
			
			//choose positon
			var y = this.y - rollover.height() - 30;
			rollover.css({top: y, left: x});
		}
		$('body').mousemove(this.follow);
		
		//load additional data
		if (key) {
			
			$.post('/ajax/users/getUserData', {'key':key}, function(data) {

				//dont add more if there is no data
				if (data.status == 'error') return;

				//tell it to ignore updates
				avatar.ignore = true;

				//display
				var html = '<div class="more">';
				if (data.location && data.location != 'null') html += '<p>'+data.location+'</p>';
				html += '<p class="stat">Views: '+data.views_sum+'</p>';
				html += '<p class="stat">Points: '+data.points_sum+'</p>';
				html += '<p class="stat">Friends: '+data.friends_sum+'</p>';
				html += '<p class="stat">Posts: '+data.forum_posts_sum+'</p>';
				html += '</div>';
				rollover.find('.rollover_content').append(html);
				var more = $('.avatar_rollover .rollover_content .more');
				
				//update position and re-support outtro
				$('body').trigger('mousemove');
				avatar.ignore = false;
				
			}, 'json');
		}
		
		//animate rollover in
		rollover.fadeOut(0);
		rollover.fadeIn(300);
		
	}
	
	//rollout
	var out = function(e) {
		
		//don't update while the height changes because of the "more" data
		if (this.ignore == true) return;
		
		//hide rollover
		var follow = this.follow;
		this.rollover.stop(true);
		this.rollover.fadeOut(0, function() {
			$(this).remove();
			$('body').unbind('mousemove', follow);
		});
		
	}

	//trigger on hover
	//$('span.avatar_wrapper').hover(over, out);
	
}


//--------------
//DASHBOARD

//init the dashboard
function initDashboard() {

	//get ref
	if ($('#dashboard')) var el = $('#dashboard');
	else return;
	
	//respect choice
	if (!el.find('a.toggle')) return; //if they're not logged in, there won't be this button
	el.find('a.toggle').click(toggleDashboard);
	el.data('offset', el.css('margin-top'));
	if ($.cookie('dashboard_open') == 1) {
		el.css('margin-top','0px');
		el.data('open', 1);
	}
	
}

//toggle dashboard
function toggleDashboard(event) {
	
	//get element
	event.preventDefault();
	var el = $('#dashboard');
	
	//close
	if (el.data('open') == 1) {
		$('#dashboard').animate({marginTop: el.data('offset')}, 300);
		el.data('open', 0);
		
	//open
	} else {
		$('#dashboard').animate({marginTop: '0px'}, 300);
		el.data('open', 1);
	}
	
	//save state
	$.cookie('dashboard_open', el.data('open'), { expires: 14, path: '/' });
}

$(function() {
	// Fancybox
	if($.isFunction($.fn.fancybox)) {
		$.fn.fancybox.defaults.padding = 0;
		$.fn.fancybox.defaults.overlayColor = '#000';
		$.fn.fancybox.defaults.overlayOpacity = 0.8;
		$.fn.fancybox.defaults.centerOnScroll = true;
		$.fn.fancybox.defaults.scroll = false;
		
		$('a[href$=".jpg"],a[href$=".jpeg"],a[href$=".png"],a[href$=".gif"]').not('a[href*="photobucket"],a[href*="imageshack"]').fancybox({
			type			: 'image'
		});
		$('a[href*=".swf"]').fancybox({
			type			: 'swf',
			swf 			: {
				wmode			: 'transparent',
				allowfullscreen	: 'true'
			}
		});
	}
});