var j = jQuery.noConflict();

var ES = function () {
	return {
		jsReady: false,
		$e: function (e) {return j(e.target)}
	}
}();
var JB  = null;//reference to job board instance for Flash player calls
j(document).ready( function () {
	var o = {
		container: '.carouselContainer',
		prevButtonContainer: '.carousel .previous',
		nextButtonContainer: '.carousel .next'
	};
	JB = JobBoard.Setup(o);
	ES.jsReady = true;
});

var JobBoard = function () {
	//set config params
	this.$Container = null;
	this.$JobContainers = null;
	this.$NextButton = null;
	this.$PrevButton = null;
	this.$JobFilter = null;
	this.CurrentPlayerButton = null;
	this.Visible =  null;
	this.CurrentPage = 1;
	this.StoredFilterIndex = null;
	this.Jobs = [];
	this.JobPostingService = '/my_esession/job_board/jobBoardService.php';
	//this.JobPostingService = 'data/job_board_data.txt';
	this.FilterCookieName = 'jobFilter';
	this.FlashPlayerControlSelector = '.jobPosting li.playSample a';
	this.Forward = 'forward';
	this.Backward = 'backward';
	this.Direction = this.Forward;
	this.JobTemplate = '<div class="imageContainer"><img src="images/testuser.jpg" class="userImage" alt="User icon" width="78" height="73" /></div><div class="userName"></div><div class="jobType"><div class="title">Wants to Hire:</div> <span class="jobDesc">Drummer</span></div><div class="price">Budget: <span class="budget"></span></div><ul class="clr"><li class="playSample"><a href="#" title="Play demo MP3">Play demo MP3</a></li><li class="viewDetails"><a href="#">View job details</a></li><li class="respond" title="Negotiate for this Job"><a href="#">Negotiate for this Job</a></li></ul><div class="expires">Expires: <span class="deadline">04/27/2009</span></div><div class="tooltip"><div class="top clr"></div><div class="content clr"><div><dl class="projectOwner"><dt>Project Owner</dt><dd></dd></dl><dl class="project"><dt>Project</dt><dd></dd></dl></div><dl class="song"><dt>Song</dt><dd></dd></dl><dl class="budget"><dt>Budget</dt><dd></dd></dl><dl class="expertise"><dt>Expertise</dt><dd></dd></dl><dl class="dueDate"><dt>Due</dt><dd></dd></dl><dl class="purpose"><dt>Purpose</dt><dd></dd></dl><dl class="subCategory"><dt>Sub-Categories</dt><dd></dd></dl><dl class="notes"><dt>Notes</dt><dd></dd></dl></div></div>';
	this.EmptyPostTemplate = '<div class="imageContainer"><img src="/home/images/jobboard/esessionUser.png" class="userImage" alt="User icon" width="78" height="73" /></div><div class="message"><p class="title">Click here to post a job!</p><p class="body">Reach thousands of eSession Talent Members</p><p class="body">Get the tracks you need on budget and on time on the eSession Job Board</p></div>';
	return this;
};

JobBoard.Setup = function (o) {
	var jb = new JobBoard();
	jb.$Container = j(o.container);
	jb.$JobContainers = jb.$Container.find('ul li.jobPosting');
	if (jb.$Container.length == 0 || jb.$JobContainers.length == 0) return;
	jb.Visible = jb.$JobContainers.length;
	jb.StoredFilterIndex = jb.GetFilterCookieIndex();
	jb.$JobFilter = jb.InitJobFilter();
	jb.InitNavigation(o);
	jb.InitDetailTooltips();
	jb.InitFlashAudioPlayer();
	jb.GetMoreJobs();
	j('.evtPostJob').live('click', function () {window.location = 'http://' + window.location.host + '/songpage/songpagetabs/songteam/accept/index.php?postJob=true';});
	return jb;
};

JobBoard.prototype = {
	GetUIFilterIndex : function () {
	return this.$JobFilter.find(':selected').val();
	//return this.$JobFilter[0].selectedIndex;
	},
	
	GetFilterCookieIndex : function () {
		if (document.cookie.length == 0) return null;
		var pattern = this.FilterCookieName + '=',
			c_start = document.cookie.indexOf(this.FilterCookieName + '=');
		if (c_start!=-1) { 
		    c_start = c_start + this.FilterCookieName.length + 1; 
		    var c_end=document.cookie.indexOf(";",c_start);
		    if (c_end==-1) c_end = document.cookie.length;
		    return unescape(document.cookie.substring(c_start,c_end).replace(pattern, ''));
		}
	},
	
	SetFilterCookie : function () {
		var exdate = new Date();
		exdate.setDate(exdate.getDate() + 30);
		var temp = this.FilterCookieName + '=' + escape(this.GetUIFilterIndex()) + ';expires=' + exdate.toGMTString();
		document.cookie = temp;
	},
	
	FilterJobs : function () {//process and update jobs on filter change
		var jb = this;
		if ( jb.GetUIFilterIndex() == jb.StoredFilterIndex) return;
		jb.Direction = jb.Forward;
		jb.SetFilterCookie();
		jb.GetMoreJobs();
	},
	
	UpdateJobDisplay : function (/*startIndex*/response) {
		var jb = this;
		var $ul = jb.$Container.find('ul:first'),
			pos = $ul.offset(),
			direction = jb.Direction == jb.Forward? '':'-';
		$ul.css({position:'absolute',left:0}).animate({left:direction+jb.$Container.width()}, 500, null, function () {
			jb.$JobContainers.removeClass('evtPostJob');
			if (response.jobs.length < 4) jb.$JobContainers.slice(response.jobs.length, 4).addClass('evtPostJob').html(jb.EmptyPostTemplate);
			j.each(response.jobs, function(i,o) {
						jb.PopulateJobTemplate(jb.$JobContainers.eq(i), response.jobs[i]);
			});
			if (j('ie, ie8').length > 0) $ul.css({left:0, position: 'static'});
			else $ul.css({opacity:0, left:0, position: 'static'}).fadeTo(600, 1);
		});
		jb.StoredFilterIndex = jb.GetUIFilterIndex();
	},
	
	PopulateJobTemplate : function ($cont, jobData) {
		$cont.html(this.JobTemplate);
		$cont.find('.projectOwner dd').html(jobData.firstName + ' ' + jobData.lastName);
		$cont.find('.userName').html(jobData.firstName + '<br />' + jobData.lastName);
		$cont.find('.price .budget').html('$'+jobData.budget);
		$cont.find('.expires .deadline').html(jobData.deadline);
		$cont.find('.jobType .jobDesc').html(jobData.userType);
		$cont.find('.project dd').html(jobData.projectName);
		$cont.find('.notes dd').html(jobData.notes);
		$cont.find('.song dd').html(jobData.songName);
		$cont.find('.purpose dd').html(jobData.purpose);
		$cont.find('.expertise dd').html(jobData.userType);
		$cont.find('.dueDate dd').html(jobData.deadline);
		$cont.find('.budget dd').html('$'+jobData.budget);
		$cont.find('.playSample a').attr('href',jobData.mp3);
		$cont.find('.userImage').attr('src',jobData.userImage);
		$cont.find('.subCategory dd').html(jobData.subCategory);
		$cont.find('.respond a').attr('href', jobData.respondLink);
	},

	GetMoreJobs : function (page) {
		var jb = this,
			page = typeof page === undefined? 1 : page? page:1;
			qs = '?page=' +page+ '&qty=' + jb.Visible+ '&filter=' + jb.GetUIFilterIndex(),
			url = jb.JobPostingService + qs;
		j.ajax({
			dataType: 'json',
			type: 'get',
			cache: false,
			url: url,
			success: function(response){
				jb.UpdateJobDisplay(response);
				jb.CurrentPage = response.page;
			},
			error: function (xhr, status, error) {
				//alert('Ajax call error: ' + status);
			}
		});
	},

	InitNavigation : function (o) {
		var jb = this;
		jb.$NextButton = j(o.nextButtonContainer + ' a');
		jb.$PrevButton = j(o.prevButtonContainer + ' a');
		if (jb.$NextButton.length == 0 || jb.$PrevButton.length == 0) return;
		jb.$NextButton.live('click', function (e) {
			e.preventDefault();
			jb.ProcessClick(jb.Forward);
		});
		jb.$PrevButton.live('click', function (e) {
			e.preventDefault();
			jb.ProcessClick(jb.Backward);
		});
	},
	
	ProcessClick : function (direction){
		var jb = this;
		if (jb.FlashAudioPlayer && j('li.playSample a').hasClass('playing, paused, buffering')) jb.FlashAudioPlayer.playMP3('');//stops the player
		jb.GetMoreJobs(parseInt(jb.CurrentPage) + parseInt(direction == jb.Forward? 1:-1));
		jb.Direction = direction;
	},
	
	InitDetailTooltips : function(){
		var jb = this;
		/*j('.jobPosting .viewDetails').hoverIntent({
			over: function(e){
				jb.ShowTooltip(ES.$e(e))
			},
			out: function(e){
				jb.HideTooltip(ES.$e(e))
			},
			sensitivity: 200,
			interval: 200,
			timeout: 10
		});
		*/
		
		j('.jobPosting .viewDetails').live('mouseover', function (e) {
			jb.ShowTooltip(ES.$e(e));
		});
		j('.jobPosting .viewDetails').live('mouseout', function (e) {
			jb.HideTooltip(ES.$e(e));
		});
		j('#jobBoard').append('<div class="tooltipContainer"></div>');
		jb.TooltipContainer = j('#jobBoard').find('.tooltipContainer');
	},

	ShowTooltip : function ($e) {
		var $tt = $e.parents('.jobPosting').find('.tooltip'),
			jb = this;
		jb.TooltipContainer.html($tt.html());		
		var	ttContainer = jb.TooltipContainer,
			targetOffset = $e.offset(),
			parentOffset = jb.$Container.offset(),
			top =  targetOffset.top - ttContainer.height() - 5,
			left = targetOffset.left - ttContainer.width()/2 + $e.width()/2;
		jb.TooltipContainer.css({'top':top,'left':left, 'display': 'block', 'opacity':0}).fadeTo(200, .95);
	},

	HideTooltip : function ($e) {
		this.TooltipContainer.fadeOut(200);
	},

	InitFlashAudioPlayer : function () {	
		var flashvars = {};
		
		var params = {};
		params.scale = "noscale";
		params.salign = "lt";
		params.wmode = "window";
		params.bgcolor = "#FFFFFF";
		params.allowscriptaccess = "always";
		//params.allownetworking = "all";
	
		var attributes = {};
		attributes.id = "mediaPlayer";
		swfobject.embedSWF("flash/eSession_tinyAudioPlayer.swf", "flashAudioPlayer", "1", "1", "9.0.0.0", false, flashvars, params, attributes);
	},

	InitFlashControls : function () {
		var jb = this;
		j('li.playSample a').live('click', function (e) {
			e.preventDefault();
			var $button = j(this),
				file = $button.attr('href');
			if (jb.CurrentPlayerButton && jb.CurrentPlayerButton[0] != $button[0]) jb.ResetFlashControls();
			jb.CurrentPlayerButton = $button;
			jb.FlashAudioPlayer.playMP3(file);
		});	
	},

	ResetFlashControls : function () {
		j(this.FlashPlayerControlSelector).removeClass('paused buffering playing');
	},

	InitJobFilter : function () {
		var jb = this,
			$this = j('.origSelect'),
			$sel = $this.find('select'),
			html = ['<div class="peSelect"><div class="peButtonCont"><a href="#" class="peButton">Select one&hellip;</a></div><div class="peSubmitCont"></div><ul class="closed">'],
			defaultIndex = null;
		$sel.find('option').each(function (i,o) {
			if (j(this).val() == jb.StoredFilterIndex) defaultIndex = i;
		});
		
		if (defaultIndex) $sel[0].selectedIndex = defaultIndex;
	    
		var temp = $sel.find('option').not('.choose').each(function() {
	        html.push('<li><a href="#" title="' + j(this).attr('value') + '" class="peOption">' + j(this).html() + '</a></li>');
	    });
	    if ($sel.find('option:selected').length == 1)
	        html.push('</ul></div>');
	    $sel.siblings('input.cta').andSelf().addClass('hidden');
	    $sel.after(html.join(''));
	    var $selectedOption = $sel.find('option:selected');
	    if ($selectedOption.length == 1) $this.find('.peButton').html($selectedOption.html());
		
		j('.peButton').live('click', function(e) {
			e.preventDefault();
	        var $e = ES.$e(e),
				$ul = $e.parents('.peSelect').find('ul');
	        $ul.toggleClass('closed');
	    });
		
		j('.peOption').live('click', function (e) {
			e.preventDefault();
	        var $e = ES.$e(e),
				$parent = $e.parents('.origSelect');
	        $parent.find('select option[value=' + $e.attr('title') + ']')[0].selected = true;//set selected option in original select menu
	        $parent.find('input.cta').val($e.attr('title'));
	        $parent.find('a.peButton').html($e.html());
			$parent.find('.peSelect ul').toggleClass('closed');
			jb.FilterJobs();//this needs to be called after the selected option is set
		});
		
		$this.find('.peSubmit').click(function(e) {
			e.preventDefault();
			var $e = ES.$e(e);
	        $e.parents('.origSelect').find('input.cta').trigger('click');
	    });
		return $sel;
	}
};
	
			// ------- functions called by ActionScript -------
			
			// Flash calls this on a timer until you set jsReady in pageInit
			function isReady()
			{
				return ES.jsReady;
			}
			function onFlashReady()
			{
				JB.FlashAudioPlayer = j('#mediaPlayer')[0];
				JB.InitFlashControls();
			}
			
			// Flash calls this when it's buffering audio, and may call it after starting to play and has run out of buffer
			function onFlashBuffering()
			{
				JB.CurrentPlayerButton.addClass('buffering').removeClass('paused playing');
			}
			function onFlashPlaying()
			{
				JB.CurrentPlayerButton.addClass('playing').removeClass('paused buffering');
			}
			function onFlashPaused()
			{
				JB.CurrentPlayerButton.addClass('paused').removeClass('playing buffering');
			}		


(function($) {
	$.fn.extend({
		pause: function(milli,type) {
			milli = milli || 1000;
			type = type || "fx";
			return this.queue(type,function(){
				var self = this;
				setTimeout(function(){
					$(self).dequeue();
				},milli);
			});
		},
		clearQueue: function(type) {
			return this.each(function(){
				type = type || "fx";
				if(this.queue && this.queue[type]) {
					this.queue[type].length = 0;
				}
			});
		},
		unpause: $.fn.clearQueue
	});
})(jQuery);
						
						
						