/*
**
** Filename	: jquery.manheim.advsearch.js
** 
** Description	: Provides an accordion for the head of the advsearch page
** 
** Usage:
** 
** $Id: jquery.manheim.advsearch.js,v 1.18 2010-07-16 12:14:40 rshaw Exp $
*/

// Accordion handlers
jQuery.manheimAdvsearch = {


	// Links used to populate the accordions
	accord_poplinks: {
		sale_variant:        '?rm=populate_tab;tab=sale_variant',
		vehicle_type_desc:   '?rm=populate_tab;tab=vehicle_type_desc',
		make:                '?rm=populate_tab;tab=make',
		model:               '?rm=populate_tab;tab=model',
		subseries:           '?rm=populate_tab;tab=subseries',
		body_style_desc:     '?rm=populate_tab;tab=body_style_desc',
		displacement:        '?rm=populate_tab;tab=displacement',
		fuel_type_name:      '?rm=populate_tab;tab=fuel_type_name',
		transmission_name:   '?rm=populate_tab;tab=transmission_name',
		age_class:           '?rm=populate_tab;tab=age_class',
		odometer_label:      '?rm=populate_tab;tab=odometer_label',
		mileage_class:       '?rm=populate_tab;tab=mileage_class',
		auction_name:        '?rm=populate_tab;tab=auction_name',
		consignor_name:      '?rm=populate_tab;tab=consignor_name'
	},

	// Links used to populate the accordions
	accord_defaults: {
		vehicle_type_desc:   'Car'
	},

	a_accPopParams: {},
	a_accDepCrit:{},
	a_accDepCritOld:{},
	a_accHeader: {},


	s_accHeadOnUrl:  "?rm=accheader_only_on",
	s_accHeadOffUrl: "?rm=accheader_only_off",

	s_summUpdOnUrl:  "?rm=summary_only_on",
	s_summUpdOffUrl: "?rm=summary_only_off",

	s_accFooterOnUrl:  "?rm=accheader_only_on",
	s_accFooterOffUrl: "?rm=accheader_only_off",

	i_accSem: {},

	s_critSumm: "",
	s_accClicked: "",
	s_accOpen: "",
	s_accRemClicked: "",

	time_lastChanged: 250,
	time_updateAperture: 120000,
	i_retryMax: 50,			// This mult. by time_lastChanged is the internal network timeout value
	dat_lastChanged: null,
	i_updatesRunningSem: 0,
	b_updateSummary: false,



	initialize: function() 
	{

		/* Stops the init being called for search panel pages */
		if(jQuery("#advsearch_accord_div").length==0)
		{
			return;
		} 

		jQuery.manheimAdvsearch.i_updatesRunningSem=0;



		jQuery("#advsearch_accord_div").accordion(
			{
				active: true,
				autoHeight: false,
				collapsible: true ,
				header: 'h3'
			}
		);

		/* init the accord */

		jQuery("#advsearch_accord_div h3 ").click(function(e)
		{

			var clicked = $(this).next("div").attr('id');


			jQuery('a.ad-minus').removeClass('current');
			jQuery(this).children('a.ad-minus').addClass('current');

			jQuery(this).children('a.ad-minus').toggleClass('minus-button').toggleClass('add-button');
			jQuery('a.minus-button:not(.current)').addClass('add-button').removeClass('minus-button');

			//jQuery(this).children('a.remove-button').toggle();


			if(jQuery.manheimAdvsearch.s_accOpen==clicked)
			{
				jQuery.manheimAdvsearch.s_accOpen="";
				jQuery.manheimAdvsearch.s_accClicked="";
			}
			else
			{
				jQuery.manheimAdvsearch.s_accClicked=clicked;
				jQuery.manheimAdvsearch.s_accOpen=clicked;
			}

			jQuery.manheimAdvsearch.procCriteria('check');
			this.blur();
		});

		jQuery.each(this.accord_poplinks,
			function(i, getUrl)
			{
				jQuery.manheimAdvsearch.a_accPopParams[i]="";
				jQuery.manheimAdvsearch.a_accDepCrit[i]="";
				jQuery.manheimAdvsearch.a_accDepCritOld[i]="";
				jQuery.manheimAdvsearch.a_accHeader[i]="";
				jQuery.manheimAdvsearch.i_accSem[i]=0;
				jQuery.manheimAdvsearch.s_curAccord="";

				var remButName='#'+i+'_remove';


				// Set the click events on the accord buttons
				jQuery(remButName).click(
					function(e)
					{
						jQuery('#'+i+' input:checkbox:checked').each(
							function(par_iter,par_val)
							{
								this.checked=false;
							}
						);
						jQuery.manheimAdvsearch.s_accRemClicked=i;
						jQuery.manheimAdvsearch.procCriteria('check');
					}
				);
			}
		);
		this.procCriteria('restore');
		this.advsearchUpdateTimer();


	},

	SetTimer: function()
	{
		jQuery.manheimAdvsearch.dat_lastChanged=(new Date()).getTime();
	},

	
	/*
	** advsearchUpdateTimer:
	**
	**
	** Controls the background timer
	** 
	** Passed in: p_accord
	** Returned byref: 
	**
	*/
    advsearchUpdateTimer: function()
	{
		var b_returnVal=true;
		if (jQuery.manheimAdvsearch.dat_lastChanged != null)
		{
			var curTime= (new Date()).getTime();
			var timeDiff= curTime - jQuery.manheimAdvsearch.dat_lastChanged;


			if (timeDiff >= jQuery.manheimAdvsearch.time_updateAperture)
			{
				i_returnVal=jQuery.manheimAdvsearch.procCriteria('force');
				jQuery.manheimAdvsearch.SetTimer();
			}
			else if(timeDiff >= jQuery.manheimAdvsearch.time_lastChanged)
			{
				i_returnVal=jQuery.manheimAdvsearch.procCriteria('check');
				jQuery.manheimAdvsearch.SetTimer();
			}
		}
		// Set our internal repr. of the timer position.
		jQuery.manheimAdvsearch.SetTimer();
		window.setTimeout( 
			function()
			{
				jQuery.manheimAdvsearch.advsearchUpdateTimer()
			},
			jQuery.manheimAdvsearch.time_lastChanged
		);
    },

	//
	// timer event callback for accordion checkboxes
	//
	// Periodically called to check the accordion states and updates the trimmings.
	// 
	// Updates:
	//  links to search
	//  accordion "remove" button
	//  summary search panel
	//
	procCriteria: function(p_action)
	{
		var s_summaryParams="";
		var b_returnVal=false;

		if(p_action=='restore')
		{
			var i_nParams=jQuery.manheimAdvsearch.updateAccords(p_action);


		}

		if(p_action=='force')
		{
			// Set the state of the data object so that it updates all accords.
			jQuery.manheimAdvsearch.forceUpdate();
		}
		if(p_action!="restore")
		{
			jQuery.manheimAdvsearch.updateAccords(p_action);
		}

		return true;


	},//  procCriteria(p_accord,p_searchCrit,cb)


	/*
	** readCriteria:
	**
	**
	**
	** Passed in: p_accord
	** Returned byref: p_accChecks,p_accParams
	**
	** p_accChecks are the checks in the passed accord section
	** p_accParams are the params required to populate the passed accord (summ of previous accords)
	*/

	readCriteria: function(p_searchString,p_accName)
	{
		var accHeader="";
		var accChecks="";
		var accCritParam;
		var paramCount=0;

		jQuery(p_searchString).each
		(
			function(par_iter,par_val)
			{
				if(par_val.checked == true)
				{
					if(! par_val.value.match("rm"))
					{
						if(accHeader == "")
						{
							accHeader=par_val.value;
						}
						else
						{
							accHeader+=', '+par_val.value;
						}

						accChecks=accChecks+";"+p_accName+"="+par_val.value;
						paramCount++;
					}
				}
			}
		);
/*		if(accChecks=="")
		{
			accChecks=p_prevCrit;
		}*/
			
		// Only update the list of details in the accord header if the ajax isnt running
		if(!this.isRunning())
		{
			jQuery.manheimAdvsearch.a_accHeader[p_accName]=accHeader;
			if(jQuery.manheimAdvsearch.a_accHeader[p_accName] != "")
			{
				jQuery('#'+p_accName+'_headinfo').html('('+jQuery.manheimAdvsearch.a_accHeader[p_accName]+')');
				jQuery('#'+p_accName+'_remove').show();
			}
			else
			{
				jQuery('#'+p_accName+'_headinfo').html('');
				jQuery('#'+p_accName+'_remove').hide();
			}
		}
		else
		{
			if(jQuery.manheimAdvsearch.a_accHeader[p_accName] != "")
			{
				jQuery('#'+p_accName+'_headinfo').html('(...)');
			}
		}
			
		jQuery.manheimAdvsearch.a_accPopParams[p_accName]=accChecks;
		jQuery.manheimAdvsearch.a_accHeader[p_accName]=accHeader;

		return paramCount;
	},


	readParam: function(p_searchString,p_accName)
	{
		var accHeader="";
		var accChecks="";
		var accCritParam;
		var paramCount=0;

		jQuery(p_searchString).each
		(
			function(par_iter,par_val)
			{
				par_val.checked=true;
				if(! par_val.value.match("rm"))
				{
					if(accHeader == "")
					{
						accHeader=par_val.value;
					}
					else
					{
						accHeader+=', '+par_val.value;
					}

					accChecks=accChecks+";"+p_accName+"="+par_val.value;
					paramCount++;
				}
			}
		);
/*		if(accChecks=="")
		{
			accChecks=p_prevCrit;
		}*/
			
		// Only update the list of details in the accord header if the ajax isnt running
		if(!this.isRunning())
		{
			jQuery.manheimAdvsearch.a_accHeader[p_accName]=accHeader;
			if(jQuery.manheimAdvsearch.a_accHeader[p_accName] != "")
			{
				jQuery('#'+p_accName+'_headinfo').html('('+jQuery.manheimAdvsearch.a_accHeader[p_accName]+')');
				jQuery('#'+p_accName+'_remove').show();
			}
			else
			{
				jQuery('#'+p_accName+'_headinfo').html('');
				jQuery('#'+p_accName+'_remove').hide();
			}
		}
		else
		{
			if(jQuery.manheimAdvsearch.a_accHeader[p_accName] != "")
			{
				jQuery('#'+p_accName+'_headinfo').html('(...)');
			}
		}
			
		jQuery.manheimAdvsearch.a_accPopParams[p_accName]=accChecks;
		jQuery.manheimAdvsearch.a_accDepCrit[p_accName]=accChecks;
		jQuery.manheimAdvsearch.a_accDepCritOld[p_accName]="RESET";
		jQuery.manheimAdvsearch.a_accHeader[p_accName]=accHeader;

		return paramCount;
	},

	/*
	** farmParams:
	**
	**
	** Reads params from hidden fields
	** 
	**
	** Passed in: p_accord
	** Returned byref: p_accChecks,p_accParams
	**
	*/

	farmParams: function()
	{
		var totCrit="";
		var paramCount=0;
		// Drive the loop with what we expect to be there

		jQuery.each(this.accord_poplinks,
			function(p_critName, p_param)
			{
				paramCount+=jQuery.manheimAdvsearch.readParam('input:hidden[name='+p_critName+']',p_critName);
				totCrit+=jQuery.manheimAdvsearch.getCrit(p_critName);
			}
		);

		jQuery.each(this.accord_poplinks,
			function(p_critName, p_param)
			{
				jQuery.manheimAdvsearch.a_accDepCrit[p_critName]=totCrit;
			}

		);
		jQuery.manheimAdvsearch.s_critSumm=totCrit;

		return paramCount;
	},

	/*
	** farmAccords:
	**
	**
	** Reads params from hidden fields
	** 
	** Apes farmAccords.
	**
	** Passed in: p_accord
	** Returned byref: p_accChecks,p_accParams
	**
	** p_accChecks are the checks in the passed accord section
	** p_accParams are the params required to populate the passed accord (summ of previous accords)
	*/

	farmAccords: function()
	{
		var totCrit="";
		var paramCount=0;
		// Drive the loop with what we expect to be there

		jQuery.each(this.accord_poplinks,
			function(p_critName, p_param)
			{

				// This is diff in the panel code - here it is one level higher.
				jQuery.manheimAdvsearch.readCriteria('#'+ p_critName+' input:checkbox:checked',p_critName);
				totCrit+=jQuery.manheimAdvsearch.getCrit(p_critName);
			}

		);

		// Populate all the deps with the complete search string
		// (legacy construct to implement independent dependencies between the panels,
		// 		left in as its easier)

		jQuery.each(this.accord_poplinks,
			function(p_critName, p_param)
			{
				// Previously populated in readCriteria, panel by panel 
				jQuery.manheimAdvsearch.a_accDepCrit[p_critName]=totCrit;
			}

		);
		// Overall summary criteria (now same as panel crit)
		jQuery.manheimAdvsearch.s_critSumm=totCrit;



		return;
	},
	/*
	** setOldAccordParam:
	**
	**
	** Reads crit
	** 
	**
	** Passed in: p_accord
	**
	*/

	setOldAccordParam: function(p_accName)
	{
		this.a_accDepCritOld[p_accName]=this.a_accDepCrit[p_accName];
	},

	/*
	** forceUpdate:
	**
	**
	** Reads crit
	** 
	**
	** Passed in: p_accord
	**
	*/

	forceUpdate: function()
	{

		jQuery.each(this.accord_poplinks,
			function(p_critName, p_param)
			{

				jQuery.manheimAdvsearch.a_accDepCritOld[p_critName]="RESET";
				jQuery.manheimAdvsearch.s_critSumm="RESET";
			}
		);
		jQuery.manheimAdvsearch.b_updateSummary=true;
	},

	/*
	** isReadyForUpdate:
	**
	**
	** Reads crit
	** 
	**
	** Passed in: p_accord
	**
	*/
	isReadyForUpdate: function(p_accName)
	{
		return (jQuery.manheimAdvsearch.a_accDepCrit[p_accName]!=jQuery.manheimAdvsearch.a_accDepCritOld[p_accName]);
	},




	/*
	** getCrit:
	**
	**
	** Reads crit
	** 
	**
	** Passed in: p_accord
	**
	*/

	getCrit: function(p_accName)
	{
		if(this.a_accPopParams[p_accName]!=null)
		{
			return this.a_accPopParams[p_accName];
		}
		else
		{
			return "";
		}
	},

	/*
	** isRunning:
	**
	**
	** Process semaphores
	** 
	**
	** Passed in: 
	**
	*/
	isRunning: function()
	{

		var b_retVal=false;
		jQuery.each(jQuery.manheimAdvsearch.i_accSem,
			function(i, semVal)
			{
				if(jQuery.manheimAdvsearch.i_accSem[i]>0)
				{
					b_retVal=true;
					if(jQuery.manheimAdvsearch.i_accSem[i] > jQuery.manheimAdvsearch.i_retryMax)
					{
						jQuery.manheimAdvsearch.i_accSem[i]=0;
					}
					// "break" the "each"
					return false;
				}
			}
		);
		return b_retVal;
	},

	/*
	** updateAccords:
	**
	**
	** Reads crit
	** 
	**
	** Passed in: p_accord
	**
	*/
	updateAccords:function(p_action)
	{
		var i_returnVal=0;
		if(!this.isRunning())
		{
			var curOpen=jQuery.manheimAdvsearch.s_accOpen;
			var curClicked=jQuery.manheimAdvsearch.s_accClicked;
			var remClicked=jQuery.manheimAdvsearch.s_accRemClicked;

			// Re-read the page state on 'force' and 'check'
			if(p_action!='restore')
			{
				jQuery.manheimAdvsearch.farmAccords();
			}
			else // read the page state from hidden params on 'restore'
			{
				i_returnVal=jQuery.manheimAdvsearch.farmParams();
			}

			// Hacks to re-implement dependency
			var b_afterCurrentAcc=false;
			var b_removeClicked=false;

			if(remClicked!="")
			{
				if(curOpen!="")
				{
					curClicked=curOpen;
				}
				else
				{
					curClicked=remClicked;
				}
				jQuery.manheimAdvsearch.s_accRemClicked="";
			}
			if(curClicked!="")
			{

				jQuery.manheimAdvsearch.getAccordData(curClicked);

			}
			else if(curOpen!="")
			{
				if(jQuery.manheimAdvsearch.isReadyForUpdate(curOpen))
				{
					jQuery.manheimAdvsearch.getHeaders();
					jQuery.manheimAdvsearch.setOldAccordParam(curOpen);
				}

			}
			else if(p_action=='restore')
			{
				jQuery.manheimAdvsearch.restoreParams();
			}
		}

		return i_returnVal;
	},

	getHeaders:function()
	{
		var tmpParam=jQuery.manheimAdvsearch.s_critSumm;

		jQuery.get(jQuery.manheimAdvsearch.s_summUpdOnUrl+tmpParam,
			function(onData)
			{
				jQuery('#advsearch_summary_div').html(onData);

				// Populate and re-enable the accord header

				jQuery.get(jQuery.manheimAdvsearch.s_accHeadOnUrl+tmpParam,
					function(onData)
					{ 
						jQuery('#advsearch_accheader_div').html(onData);
					}
				);
			}
		);
	},

	getAccordData:function(p_accName)
	{
		jQuery.manheimAdvsearch.i_accSem[p_accName]++;
		jQuery.manheimAdvsearch.i_updatesRunningSem++;



		jQuery('#'+p_accName).html('Please wait...');
		jQuery.manheimAdvsearch.SetTimer();



		var checkCount=jQuery('#'+p_accName+' input:checkbox:checked').length;


		jQuery.manheimAdvsearch.b_updateSummary=true;
		jQuery.manheimAdvsearch.s_accClicked="";
		jQuery.manheimAdvsearch.setOldAccordParam(p_accName);


		jQuery.get(jQuery.manheimAdvsearch.s_summUpdOffUrl,
			function(summOffData)
			{

				jQuery('#advsearch_summary_div').html(summOffData);


				jQuery.get(jQuery.manheimAdvsearch.s_accHeadOffUrl,
					function(headOffData)
					{

						jQuery('#advsearch_accheader_div').html(headOffData);


						jQuery.get(
							jQuery.manheimAdvsearch.accord_poplinks[p_accName] + jQuery.manheimAdvsearch.a_accDepCrit[p_accName],
							function(data)
							{ 
								jQuery('#'+p_accName).html(data);


								var tmpParam=jQuery.manheimAdvsearch.s_critSumm;

								jQuery.get(jQuery.manheimAdvsearch.s_summUpdOnUrl+tmpParam,
									function(onData)
									{
										jQuery('#advsearch_summary_div').html(onData);


										jQuery.get(jQuery.manheimAdvsearch.s_accHeadOnUrl+tmpParam,
											function(onData)
											{ 
												jQuery('#advsearch_accheader_div').html(onData);
												jQuery.manheimAdvsearch.i_accSem[p_accName]--;
												jQuery.manheimAdvsearch.i_updatesRunningSem--;
												jQuery.manheimAdvsearch.SetTimer();
											}
										);
									}
								);
							}
						);
					}
				);
			}
		);

	},
	restoreParams:function()
	{
		jQuery.each(this.accord_poplinks,
			function(p_accName,p_critParam)
			{

				jQuery.manheimAdvsearch.i_accSem[p_accName]++;
				jQuery.manheimAdvsearch.i_updatesRunningSem++;



				jQuery('#'+p_accName).html('Please wait...');
				jQuery.manheimAdvsearch.SetTimer();



				jQuery.manheimAdvsearch.b_updateSummary=true;
				jQuery.manheimAdvsearch.s_accClicked="";
				jQuery.manheimAdvsearch.setOldAccordParam(p_accName);


				jQuery.get(
					jQuery.manheimAdvsearch.accord_poplinks[p_accName] + jQuery.manheimAdvsearch.a_accDepCrit[p_accName],
					function(data)
					{ 
						jQuery('#'+p_accName).html(data);

						jQuery.manheimAdvsearch.i_accSem[p_accName]--;
						jQuery.manheimAdvsearch.i_updatesRunningSem--;
						if(jQuery.manheimAdvsearch.i_updatesRunningSem==0)
						{
							jQuery.manheimAdvsearch.getHeaders();
						}

						jQuery.manheimAdvsearch.SetTimer();
					}
				);

			}
		);
	},

	/*
	** Dump the criteria tables
	*/
	dumpCritParams: function()
	{

		console.log("dumpCritParams:vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
		// Dump em all at once
		jQuery.each(this.accord_poplinks,
			function(p_critName,p_critParam)
			{
				console.log("dumpCritParams:accPopParams ["+p_critName+"]["+jQuery.manheimAdvsearch.a_accPopParams[p_critName]+"]");
				console.log("dumpCritParams:accHeader    ["+p_critName+"]["+jQuery.manheimAdvsearch.a_accHeader[p_critName]+"]");
				console.log("dumpCritParams:accDepCrit   ["+p_critName+"]["+jQuery.manheimAdvsearch.a_accDepCrit[p_critName]+"]");
				console.log("dumpCritParams:accDepCritOld["+p_critName+"]["+jQuery.manheimAdvsearch.a_accDepCritOld[p_critName]+"]");
				console.log("dumpCritParams:accSem       ["+p_critName+"]["+jQuery.manheimAdvsearch.i_accSem[p_critName]+"]");

			}
		);
		console.log("dumpCritParams:^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");

		return;
	}

}


//
// READY
//
/*jQuery(document).ready(function(){
jQuery.manheimAdvsearch.initialize();

});
*/
