
var gs_addCartId          = 'cartAction';
var gs_containerAddCartId = 'containerCartAction';
var gi_animDuration       = 500;


// ===========
// = Helpers =
// ===========

function unique( arrayName )
{
	// From: http://www.roseindia.net/java/javascript-array/javascript-array-unique.shtml
	var newArray = new Array();
	
	label:for ( var i=0; i<arrayName.length; i++ )
		{  
		for( var j=0; j<newArray.length; j++ )
			{
			if ( newArray[j]==arrayName[i] ) 
			continue label;
			}
		newArray[newArray.length] = arrayName[i];
		}
	return newArray;
}

function removeFromArrayWithValue( aa_array, as_value )
{
	var la_temp = aa_array;
		// la_temp.splice( aa_array.indexOf( as_value.toString() ), 1 );
		la_temp.splice( aa_array.indexOf( as_value ), 1 );
	
	return la_temp;
}

function fade( as_id, as_inOut )
{
	// YUI 3.x
	ls_id = '#' + as_id;
	
	YUI().use( 'node-base', 'anim-base', function(Y) {

		// fade in or out?
		if ( as_inOut == 'in' )
			{
			li_start = 0;
			li_end = 1;
			}
		else
			{
			li_start = 1;
			li_end = 0;
			}

		// set opacity
		Y.one( ls_id ).setStyle( 'opacity', li_start );
				
		// then fade it in
		var lo_yuiAnim = new Y.Anim({
			node: ls_id,
			duration: (gi_animDuration/1250),
			to: { opacity: li_end }
			});

		lo_yuiAnim.run();
		});
}

function setStyle( as_id, as_declaration, as_value )
{
	ls_id = '#' + as_id;
	
	YUI().use( 'node-base', 'anim-base', function(Y) {
		// set style
		Y.one( ls_id ).setStyle( as_declaration, as_value );
		});
}

function setContent( as_elem, as_content )
{
	YUI().use( 'node-base', function(Y) {
		var lo_elem = Y.one( '#' + as_elem );
		
		lo_elem.setContent( as_content );
	});
}


// ==================
// = Main Functions =
// ==================

function loadProgramCookieArray()
{
	// Load up existing values (null if not found)
	var ls_programs = GetCookie( 'programs' );
	var la_return   = new Array();

	// Array-a-fy cookie string
	if ( ls_programs != null )
		{
		// more than one
		if ( ls_programs.indexOf( ',' ) )
			{
			la_return = ls_programs.split( ',' );				
			}
		else la_return = [ls_programs];
		
		// Shock of shocks, IE (as of v8) doesn't support array.map
		if ( Array.map ) la_return = la_return.map( Number );
		}
	else la_return = [];
	
	// Don't return zero
	if ( la_return == 0 ) la_return = [];
	
	return la_return;
}

function changeCartLink( as_action, ai_programId )
{
	var ls_textAdd    = "<a href=\"javascript:interest(" + ai_programId + ");\">Mark as interested</a>";
	var ls_textRemove = "<a href=\"javascript:interest(" + ai_programId + ");\">Remove interest</a>";
	var lo_elem       = document.getElementById( gs_addCartId );
	
	switch ( as_action )
		{
		case 'add':
		fade( gs_addCartId );
		// BetterInnerHTML( lo_elem, ls_textRemove );
		setContent( lo_elem, ls_textRemove )
		break;
		
		case 'remove':
		fade( gs_addCartId );
		// BetterInnerHTML( lo_elem, ls_textAdd );
		setContent( lo_elem, ls_textAdd )
		break;
		
		case 'incart':
		// BetterInnerHTML( lo_elem, ls_textRemove );
		setContent( lo_elem, ls_textRemove )
		break;
		}
}

function setLinkIfInCart( ai_programId )
{
	var la_programs   = loadProgramCookieArray();
	
	// if already in cart
	if ( la_programs.indexOf( ai_programId ) > -1 ) setStyle( gs_containerAddCartId, 'display', 'none' );
	
	// Make list
	updateList();
}

function updateList()
{
	var la_programs   = loadProgramCookieArray();
	
	// Need to use 'node-event-simulate' for some weird IE8 bug
	YUI().use( 'node-event-simulate', 'anim-base', function(Y) {
		var lo_secondary = Y.one( '#secondary' );
		var lo_cartDiv   = lo_secondary.one( '#cart' );

		// Reset display
		lo_cartDiv.setContent( '' );

		// Don't make list if cart empty
		if ( la_programs.length > 0 )
			{
			// list container
			lo_containerDiv = lo_cartDiv.create( '<div id="cartList"></div>' );
			lo_containerDiv.append( lo_containerDiv.create( '<h3>Currently selected:</h3>' ) );
			
			// make UL
			lo_ul = lo_containerDiv.create( '<ul class="fontSlightlySmaller" id="cart"></ul>' );
			lo_containerDiv.append( lo_ul );
			
			// add the LI, with name pulled from ga_bigList
			for ( var i=0; i<la_programs.length; i++ )
				{
				lo_li = lo_ul.create( '<li>' + ga_bigList[ la_programs[i] ] + ' <a title="Remove program" href="javascript:interest(' + la_programs[i] + ');">[x]</a></li>' );
				lo_ul.append( lo_li  );
				};
			
			// make container div
			lo_cartDiv.append( lo_containerDiv );
			
			// footer
			// <hr id="last" /> \
			lo_footer = lo_cartDiv.create( '</div> \
								<p id="finished"><a href="javascript:finished();">I\'m Finished Looking</a></p> \
								<p id="send" class="button"><input type="button" value="Finish My Request &gt;&gt;" onclick="javascript:send();" /></p>'
								);
			lo_cartDiv.append( lo_footer );
			}
		});
}

function updateInterest( as_action, ai_programId )
{
	var ls_return = '';
	var ls_alertMsg = '';
	var la_temp   = loadProgramCookieArray();

	// ADD
	if ( as_action == 'add' )
		{
		// set value if first time loading
		if ( la_temp[0] == undefined )
		 	{
			ls_return = ai_programId;
			
			ls_alertMsg = '- Success! -\n\
You just added a program to your "Currently selected" list.\n\n\
Your list is preserved from page to page. Feel free to find more programs and add them to this list.\n\n\
When finished, click "I\'m Finished Looking" and submit your request';
			}
		else
			{
			// Add selected program
			la_temp.push( ai_programId );

			// Remove dupes
			if ( la_temp.length > 1 ) la_temp = unique( la_temp );
			
			// join
			ls_return = la_temp.join( ',' );
			}
		}
	// REMOVE
	else
		{
		la_temp = removeFromArrayWithValue( la_temp, ai_programId );

		// join
		ls_return = la_temp.join( ',' );
		if ( ls_return == 0 ) ls_return = '';
		}
	
	// set cookie value
	SetCookie( 'programs', ls_return );
	
	// Update dynamic program list
	updateList();
	
	// Show alert msg if there is one
	if ( ls_alertMsg ) alert( ls_alertMsg );
}


// ===========================
// = Client-facing Functions =
// ===========================

// Seriously IE? Seriously?
// http://soledadpenades.com/2007/05/17/arrayindexof-in-internet-explorer/
if( !Array.indexOf )
	{
	Array.prototype.indexOf = function(obj)
		{
		for( var i=0; i<this.length; i++ )
			{
			if(this[i]==obj) return i;
			}
		return -1;
		}
	}

function finished()
{
	// YUI().use( 'node-base', function(Y) {
	// 	var lo_sendButton = Y.one( '#send' );
	// 	
	// 	lo_sendButton
	// 	});

	setStyle( 'send', 'display', 'block' );	
	fade( 'send', 'in' );
}

function send()
{
	var ls_cookie = GetCookie( 'programs' );
	
	if ( ls_cookie == null || ls_cookie == '' ) alert( 'Error: No programs marked. Please choose some programs that interest you, then click on finished link');
	else location.href = 'http://' + location.host + '/volunteer/' + GetCookie( 'programs' );
}

function interest( ai_programId )
{
	var la_programs      = loadProgramCookieArray();
	var lr_programIdPath = new RegExp( "\\/" + ai_programId + "\\/?$" );
	
	// is current id in cart?
	if ( la_programs.indexOf( ai_programId ) > -1 )
		{
		// Remove from cart
		updateInterest( 'remove', ai_programId );
			
		// Only change add/remove link text if we're on that program's page
 		if ( lr_programIdPath.test( document.location.pathname ) )
			{
			setStyle( gs_containerAddCartId, 'display', 'block' );
			fade( gs_addCartId, 'in' );
			}
		}
	else
		{
		// Add to cart
		updateInterest( 'add', ai_programId );
	
		// Only change add/remove link text if we're on that program's page
 		if ( lr_programIdPath.test( document.location.pathname ) )
			{
			fade( gs_addCartId, 'out' );
			setTimeout( "setStyle( '" + gs_containerAddCartId + "', 'display', 'none' );", gi_animDuration );
			}
		}
}

