function update_results_per_page() {
	var num_results = parseInt(document.getElementById('hidden_num_results').value);
	var num_per_page = document.getElementById('hidden_results_per_page').value;
	if (isNaN(num_results)) {
		return;
	}
	if(num_per_page =='')
		num_per_page = 0;
	else 
		num_per_page = parseInt(num_per_page);

	var first_pass = true;
	$(".select_results_per_page option").each(function(i){
		var num_results = parseInt(document.getElementById('hidden_num_results').value);
		var num_per_page = document.getElementById('hidden_results_per_page').value;
		if(num_per_page =='')
			num_per_page = 0;
		else 
			num_per_page = parseInt(num_per_page);
		if(parseInt(this.title) !== num_per_page) {
			if(first_pass==true && num_results<=parseInt(this.title)) {
				// must skip hiding for first item, when no options apply 
			}
			else {
				if(parseInt(this.title) == 0) {
					if(num_results<=num_per_page){
						// hide view all link because there is only one page of results
						this.style.display = 'none';
						$("#select_results_per_page").removeOption(this.value); 
					}
				}
				if(parseInt(this.title) >= num_results){
					// hide any results per page options greater than the number of results (unless skipped above intentionally) 
					this.style.display = 'none';
					$("#select_results_per_page").removeOption(this.value); 
				}	
			}	
		}	
		else {
			// skip currently selected item
		}
		first_pass = false;
	});

	$(".results_per_page_item").each(function(i){
		var num_results = parseInt(document.getElementById('hidden_num_results').value);
		var num_per_page = document.getElementById('hidden_results_per_page').value;
		if(num_per_page =='') {
			num_per_page = 0;
		}
		else { 
			num_per_page = parseInt(num_per_page);
		}

		var display = this.title;

		if(parseInt(this.title) == 0) {
			display = 'View All';
			if(num_results<=num_per_page){
				this.innerHTML = this.innerHTML.replace(/<a.*>(.*)<\/a>/i, '<strong>$1</strong>');
				return;
			}
		}
		if(num_per_page==0 && parseInt(this.title)==0) {
			this.innerHTML = this.innerHTML.replace(/<a.*>(.*)<\/a>/i, '<strong>$1</strong>');
		}
		else if(parseInt(this.title) >= num_results){
			// hide any results per page options greater than the number of results (unless skipped above intentionally) 
			this.innerHTML = '';
		}	
		else if(parseInt(this.title)==num_per_page) {
			this.innerHTML = this.innerHTML.replace(/<a.*>(.*)<\/a>/i, '<strong>$1</strong>');
		}
		else {
			this.innerHTML = this.innerHTML.replace(/<strong>(.*)<\/strong>/i, '<a href="#" title="' + display + '" rel="' + this.title + '" onclick="change_limit(this); return false;">$1</a>');
		}
	});
}

$(document).ready(function () {
	update_results_per_page();
});

function stripslashes( str ) {
	return (str+'').replace(/\0/g, '0').replace(/\\([\\'"])/g, '$1');
}
function show_spinner(product_listing) {
   //scroll_to_top();
   var loading_graphic = document.getElementById('loading_graphic');
   product_listing.style.display = 'none';
   loading_graphic.style.display = 'block';
}
var loading = 0;
var anchors = [];

function catch_enter(e) {
	if (e.type == 'keypress' && e.keyCode != 13) {
		return true;
	}
	if (e && e.preventDefault) {
		e.preventDefault();
	}

	filterProducts();
	return false;
}

// create a query string of the variables we want to send for ajax calls to either product_search.php or product_listing.php
function generate_post_vars() {
	var fields = [];
	var search_fields = [];
	var post_variables = '';

	fields[0] = 'category_id';
	fields[1] = 'current_page';
	fields[2] = 'holding_template';
	fields[3] = 'product_cell_template';
	fields[4] = 'navigation_template';
	fields[5] = 'type';
	fields[6] = 'multi_product_ordering';
	fields[7] = 'row_header_template';
	fields[8] = 'row_footer_template';
	fields[9] = 'num_cols';
	fields[10] = 'num_rows';
	fields[11] = 'results_per_page';
	fields[12] = 'order_by';
	fields[13] = 'search_params';
	fields[14] = 'search_holding_template';

	search_fields[0] = 'search_params';
	search_fields[1] = 'product_search_holding_template';
	search_fields[2] = 'saved_search';
	search_fields[3] = 'location';
	search_fields[4] = 'count_disabled';
	search_fields[5] = 'populated_only';
	search_fields[6] = 'youve_selected';
	search_fields[7] = 'product_listing_tag';

	// add fields information to post_variables string
	for (var i=0; i<fields.length; i++) {
		if (post_variables.length > 0) {
			post_variables = post_variables + '&';
		}
		if (fields[i]) {
			var field_name = 'hidden_' + fields[i];
			var this_field = document.getElementById(field_name);
			if (this_field) {
				// only add category_id if using product_listing.php (we will check below for search_params to determine if it is needed) 
				// when using product_search.php send category_id in the search_fields array
				if(field_name == 'hidden_category_id' && this_field.value != '' && document.getElementById('hidden_search_params') != '') {
				}
				else {
					field_value = this_field.value;
					post_variables = post_variables + fields[i] + '=' + escape(field_value);
				}
			}
		}
	}

	// add search_fields information to post_variables string
	var hidden_search_params_empty = false;
	for (var i=0; i<search_fields.length; i++) {
		if (post_variables.length > 0) {
			post_variables = post_variables + '&';
		}
		if (search_fields[i]) {
			var field_name = 'hidden_' + search_fields[i];
			var this_field = document.getElementById(field_name);
			if (this_field) {
				field_value = this_field.value;
				if(field_name == 'hidden_search_params' && field_value == '') {
					hidden_search_params_empty = true;
				}
				post_variables = post_variables + 'search_fields[' + search_fields[i] + ']=' + escape (field_value);
			}
		}
	}
	var my_category_id = document.getElementById('hidden_category_id_div').innerHTML;
	post_variables += '&search_fields[category_id]='+my_category_id;
	// if the search_fields[search_params] are empty, set the category_id value for product_listing
	if(hidden_search_params_empty) {
		post_variables += '&category_id='+my_category_id;
	}
	if (document.getElementById('refine')) {
		post_variables = post_variables + '&refine=' + document.getElementById('refine').value;
	}
	if (document.getElementById('hidden_product_type_id').value != '') {
		post_variables = post_variables + '&product_type_id=' + document.getElementById('hidden_product_type_id').value;
	}
	post_variables = post_variables.replace(/\+/g,'%2B');
	return post_variables;
}

function detect_need_for_product_search_vs_listing(post_vars) {
	// scan hidden_search_params for valid parameters to identify if we should fire product_search.php
	if (document.getElementById('refine') && document.getElementById('refine').value == 'true') {
		return true;
	}
	var is_search = false;
	var this_field = document.getElementById('hidden_search_params');
	if (this_field) {
		var field_value = this_field.value;
		if(field_value != '')
			is_search = true;
	}

	// even if the scan of hidden_search_params returns nothing, we still want to fire product_search.php if we are on the search results page
	if(!is_search) {
		var url = String(window.location);
		if (is_search == false && url.indexOf('index/page/search',0) != -1) {
			is_search = true;
		}
	}

	// if the only search_param is a category_id, use product listing
	if(is_search) {
		try{
			var category_delimiter_str;
			pattern = '%3A%3A';
			var start_delimiter_id = post_vars.indexOf('search_fields[search_params]=');			
			if(start_delimiter_id > -1) {
				var end_delimiter_id = post_vars.indexOf('&', start_delimiter_id);
				if(end_delimiter_id == -1) {
					end_delimiter_id = post_vars.length;
				}
				var category_length = end_delimiter_id-start_delimiter_id-29;
				category_delimiter_str = post_vars.substr(start_delimiter_id+29,category_length);					
			}

			var start = post_vars.indexOf('search_fields[category_id]=');
			if(start > -1) {
				var end = post_vars.indexOf('&', start);
				if(end == -1) {
					end = post_vars.length;
				}
				var category_length = end-start-27;
				var category_id = post_vars.substr(start+27,category_length);			
			}

			if((post_vars.indexOf('search_fields[search_params]=&') > -1 || !(category_delimiter_str.match(pattern))) && category_id > 0) {				
				is_search = false;
			}
		} catch(e) {
		}
	}

	return is_search;
}

function load_results() {
	if (loading == 1) return;
	var init_string = YAHOO.util.History.getBookmarkedState('product_listing');
	var no_search = YAHOO.util.History.getQueryStringParameter('search', init_string) || 'false';
	if (document.getElementById('no_search') && document.getElementById('no_search').value == 'no_search' && no_search == 'false') {
		document.getElementById('no_search').value = 'search';
		return;
	}
	loading = 1;
	var product_listing_table = document.getElementById('product_listing_table') || document.getElementById('search_results');
	show_spinner(product_listing_table);
	post_variables = generate_post_vars();
	if(detect_need_for_product_search_vs_listing(post_variables)) {
		var product_search_form_element = document.getElementById('product_search_form_div');
		var spinner = document.getElementById("loading_graphic");
		YAHOO.util.Connect.asyncRequest("POST", 
				'ajax_targets/product_search.php', 
				{
					success:product_search_returned,
					failure:product_search_failure,
					argument:[product_listing_table, product_search_form_element, spinner]
				}, 
				post_variables);
	} else {
		YAHOO.util.Connect.asyncRequest(
			"POST", 
			'ajax_targets/product_listing.php', 
			{
				success:product_listing_returned,
				failure:product_listing_failure,
				argument:product_listing_table
			}, 
			post_variables
		);
	}
}

function scroll_to_top() {
	if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
		//DOM compliant
		document.body.scrollTop = 0;
		document.body.scrollLeft = 0;
	} 
	else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
		//IE6 standards compliant mode
		document.documentElement.scrollTop = 0;
		document.documentElement.scrollLeft = 0;
	}
}

function change_page2() {
   var init_state = YAHOO.util.History.getBookmarkedState("product_listing");
   document.getElementById('hidden_current_page').value = document.getElementById('current_page').value;
   var current_page = document.getElementById('hidden_current_page').value || "1";
   var results = YAHOO.util.History.getQueryStringParameter('results_per_page', init_state) || document.getElementById('hidden_results_per_page').value || "";
   var order_by = YAHOO.util.History.getQueryStringParameter('order_by', init_state) || document.getElementById('hidden_order_by').value || "";
   var search_params = YAHOO.util.History.getQueryStringParameter('search_params', init_state) || document.getElementById('hidden_search_params').value || "";
   // may need to get_escaped_hidden_search_params
   var state = '?current_page=' + current_page + '&results_per_page=' + results + '&order_by=' + order_by + '&search_params=' + search_params;
   try {
	  YAHOO.util.History.navigate("product_listing", state);
   } catch (e) {
	   load_results();
   }
}

function change_limit(input) {
   document.getElementById('hidden_results_per_page').value = parseInt(input.rel);
   var current_page = "1";
   var results = document.getElementById('hidden_results_per_page').value || "";
   var order_by = document.getElementById('hidden_order_by').value || "";
   var search_params = document.getElementById('hidden_search_params').value || "";
   // may need to get_escaped_hidden_search_params
   var state = '?current_page=' + current_page + '&results_per_page=' + results + '&order_by=' + order_by + '&search_params=' + search_params;
   try {
	  YAHOO.util.History.navigate("product_listing", state);
   } catch (e) {
	   load_results();
   }
}

function get_escaped_hidden_search_params() {
	var new_params = '';
	var params = document.getElementById('hidden_search_params').value || "";
	var params_array = params.split('::');
	var first = true;
	for(i in params_array) {
		if(params_array[i] != '') {
			var param_pieces = params_array[i].split(':');
			var left = true;
			for(j in param_pieces) {
				if(left == true) {
					if(first == true) {
						first = false;
					}
					else {
						new_params = new_params + "::";
					}
					new_params = new_params + param_pieces[j] + ':';
					left = false;
				}
				else {
					new_params = new_params + escape(param_pieces[j]);
				}
			}
		}
	}
	return new_params;
}

function change_order() {
   document.getElementById('hidden_order_by').value = document.getElementById('order_by_clause').value;
   var current_page = document.getElementById('hidden_current_page').value || "1";
   var results = document.getElementById('hidden_results_per_page').value || "";
   var order_by = document.getElementById('hidden_order_by').value || "";
   var search_params = get_escaped_hidden_search_params();
   var state = '?current_page=' + current_page + '&results_per_page=' + results + '&order_by=' + order_by + '&search_params=' + search_params;
   try {
	  YAHOO.util.History.navigate("product_listing", state);
   } catch (e) {
	   load_results();
   }
}

function product_listing_returned(obj) {

	loading = 0;
	var results = eval('('+obj.responseText+')');
	var listing_table = obj.argument;

	listing_table.innerHTML = results.html;

	var search = results.html;
	var script;

	if(search) {
		while( script = search.match(/(<script[^>]+javascript[^>]+>\s*(<!--)?)/i)) {
			search = search.substr(search.indexOf(RegExp.$1) + RegExp.$1.length);

			if (!(endscript = search.match(/((-->)?\s*<\/script>)/))) break;

			block = search.substr(0, search.indexOf(RegExp.$1));
			search = search.substring(block.length + RegExp.$1.length);

			eval(block);
		}
	}

	var loading_graphic = document.getElementById('loading_graphic');
	loading_graphic.style.display = 'none';
	listing_table.style.display = 'block';
	update_results_per_page();
}

function product_listing_failure(obj) {
   loading = 0;
}

function initialize_page_links() {
   var init_state = YAHOO.util.History.getBookmarkedState("product_listing");
   
   bookmarked_current_page = YAHOO.util.History.getQueryStringParameter("current_page", init_state) || YAHOO.util.History.getQueryStringParameter("current_page") || document.getElementById('hidden_current_page').value || "1";

   document.getElementById('hidden_current_page').value = bookmarked_current_page;
}

function initialize_results() {
   var init_state = YAHOO.util.History.getBookmarkedState("product_listing");
   bookmarked_results = YAHOO.util.History.getQueryStringParameter("results_per_page", init_state) || YAHOO.util.History.getQueryStringParameter("results_per_page") || document.getElementById('hidden_results_per_page').value  || "";

   document.getElementById('hidden_results_per_page').value = bookmarked_results;
}

function initialize_order_by() {
   var init_state = YAHOO.util.History.getBookmarkedState("product_listing");
   bookmarked_order_by = YAHOO.util.History.getQueryStringParameter("order_by", init_state) || YAHOO.util.History.getQueryStringParameter("order_by") || document.getElementById('hidden_order_by').value|| "";

   document.getElementById('hidden_order_by').value = bookmarked_order_by;
}

function initialize_search_params(search_params) {
//	if (document.getElementById('hidden_category_id').value == '') {
	try {
		if (!search_params) {
			var init_state = YAHOO.util.History.getBookmarkedState("product_listing");
			var search_params = YAHOO.util.History.getQueryStringParameter("search_params", init_state) || YAHOO.util.History.getQueryStringParameter("search_params") || document.getElementById('hidden_search_params').value || "";
			search_params = search_params.replace(/[^:]*:::/g, '');
			if (search_params.length > 0 && search_params.indexOf(':::') == -1) {
				document.getElementById('hidden_search_params').value = search_params;
				return;
			}
		}
		else {
			search_params += '::';
		}
		document.getElementById('hidden_search_params').value = '';
		var refine = document.getElementById('refine');
		if (refine) {
			refine = refine.value;
		}
		var the_form_obj = document.getElementById('product_search_form');
		if(the_form_obj) {
			var search_form = the_form_obj.elements;
			for (var i = 0; i < search_form.length; i++) {
				if (search_form[i].type == 'checkbox' && search_form[i].checked) {
					search_params += search_form[i].name + ':' + escape(search_form[i].value) + '::';
				}
				else if (search_form[i].type == 'radio' && search_form[i].checked) {
					search_params += search_form[i].name + ':' + escape(search_form[i].value) + '::';
				}
				else if (search_form[i].type == 'select-multiple' || search_form[i].type == 'select-one') {
					var options = search_form[i].options;
					for (var j = 0; j < options.length; j++) {
						if (options[j].selected && options[j].value != '') {
							search_params += search_form[i].name + ':' + escape(options[j].value) + '::';
						}
						else if (options[j].selected && options[j].text != 'Choose...') {
							search_params += search_form[i].name + ':' + escape(options[j].text) + '::';
						}
					}
				}
				else if (search_form[i].type == 'text' && search_form[i].value != '') {
					if (search_form[i].id != 'freetext_search_box') {
						search_params += search_form[i].name + ':' + escape(search_form[i].value) + '::';
					}
					else {
						var field_array = search_form[i].name.split('_NEXTFIELD_');
						for (var j = 0; j < field_array.length; j++) {
							search_params += field_array[j] + ':' + escape(search_form[i].value) + '::';
						}
					}
				}
				else if (search_form[i].type == 'hidden' && search_form[i].value != '' && search_form[i].name != 'refine') {
					if (search_form[i].name.indexOf('_NEXTFIELD_') == -1) {

						search_params += search_form[i].name + ':' + escape(search_form[i].value) + '::';
					}
					else {
						var field_array = search_form[i].name.split('_NEXTFIELD_');
						for (var j = 0; j < field_array.length; j++) {
							search_params += field_array[j] + ':' + escape(search_form[i].value) + '::';
						}
					}
				}
			}
			search_params = search_params.replace(/[^:]*:::/g, '');
			if (search_params.length > 0 && search_params.indexOf(':::') == -1) {
				document.getElementById('hidden_search_params').value = search_params;
			}
		}
	}
	catch (e){
	}
}

function generate_search_params_from_form() {
	var associativeArray = new Object();
	form = document.getElementById('product_search_form');
	inputs = form.elements;
	for (key = 0; key < inputs.length; key++) {
		if (inputs[key].type == 'checkbox') {
		}
		if (inputs[key].type == 'checkbox' && inputs[key].checked) {
			associativeArray[inputs[key].name+ ':' + escape(inputs[key].value)] = inputs[key].name + ':' + escape(inputs[key].value);
		}
		else if (inputs[key].type == 'radio' && inputs[key].checked) {
			associativeArray[inputs[key].name+ ':' + escape(inputs[key].value)] = inputs[key].name + ':' + escape(inputs[key].value);
		}
		else if (inputs[key].type == 'select-multiple' || inputs[key].type == 'select-one') {
			var options = inputs[key].options;
			for (var option_key = 0; option_key < options.length; option_key++) {
				if (options[option_key].selected && options[option_key].value != '') {
					associativeArray[inputs[key].name+ ':' + escape(options[option_key].value)] = inputs[key].name + ':' + escape(options[option_key].value);
				}
			}
		}
		else if (inputs[key].type == 'text' && inputs[key].value != '') {
			if (inputs[key].id != 'freetext_search_box') {
				associativeArray[inputs[key].name+ ':' + escape(inputs[key].value)] = inputs[key].name + ':' + escape(inputs[key].value);
			}
			else {
				var field_array = inputs[key].name.split('_NEXTFIELD_');
				for (var i = 0; i < field_array.length; i++) {
					associativeArray[field_array[i] + ':' + escape(inputs[key].value)] = field_array[i] + ':' + escape(inputs[key].value);
				}
			}
		}
		else if (inputs[key].type == 'hidden' && inputs[key].value != '' && inputs[key].name != 'refine') {
			if (inputs[key].name.indexOf('_NEXTFIELD_') == -1) {
				associativeArray[inputs[key].name+ ':' + escape(inputs[key].value)] = inputs[key].name + ':' + escape(inputs[key].value);
			}
			else {
				var field_array = inputs[key].name.split('_NEXTFIELD_');
				for (var i = 0; i < field_array.length; i++) {
					associativeArray[field_array[i] + ':' + escape(inputs[key].value)] = field_array[i] + ':' + escape(inputs[key].value);
				}
			}
		}
	}

	for(var i=0;i<anchors.length;i++) {
		// add anchors to our associative array
		associativeArray[anchors[i]] = anchors[i];
	}

	var params = '';
	var temp_array = [];
	for(var i in associativeArray) {
		//  skip if blank as blank entries seem to break refreshing the page...
		if(i) {
			// gather array of good params
			temp_array.push(i);
		}
	}
	// split param with delimiter
	params = temp_array.join('::');

	var hidden_search_params = document.getElementById('hidden_search_params');
	hidden_search_params.value = params;
	return params;
}

var in_process_of_altering_anchor_parameters = false;
function addAnchorParameter(anchor){
	if(!in_process_of_altering_anchor_parameters) {
		in_process_of_altering_anchor_parameters = true;
		$('#hidden_category_id').val('');
		anchors.push(anchor.rel + ':' + escape(stripslashes(anchor.rev)));
		$('input#hidden_current_page').attr('value','1');
		return filterProducts();
	}
}

function removeAnchorParameter(anchor){
	if(!in_process_of_altering_anchor_parameters) {
		in_process_of_altering_anchor_parameters = true;
		var buffer = [];
		var against = anchor.rel + ':' + escape(stripslashes(anchor.rev));
		var against2 = anchor.rel + ':' + (stripslashes(anchor.rev));
		for (var i = 0; i < anchors.length; ++i) {
			if (anchors[i] != against && anchors[i] != against2) buffer.push(anchors[i]);
		}
		$('input#hidden_current_page').attr('value','1');
		anchors = buffer;
		return filterProducts();
	}
}

function filterProducts() {
	$('#hidden_category_id').val('');

	initialize_search_params(search_params);
	if (search_params == null) {
		search_params = generate_search_params_from_form();		
	}


	var current_page = document.getElementById('hidden_current_page').value || "1";
	var results = document.getElementById('hidden_results_per_page').value || "";
	var order_by = document.getElementById('hidden_order_by').value || "";
	var search_params = document.getElementById('hidden_search_params').value || "";
   // may need to get_escaped_hidden_search_params
	var state = '?current_page=' + current_page + '&results_per_page=' + results + '&order_by=' + order_by + '&search_params=' + search_params + '&search=true';
	try {
		YAHOO.util.History.navigate("product_listing", state);
	} catch (e) {
		load_results();
	}

}

function product_search_returned(obj) {
   loading = 0;
	var results = eval('('+obj.responseText+')');
	var search_html = results.search_html;
	var form_html = results.form_html;
	var search_div = obj.argument[0];
	var spinner = obj.argument[2];

	if (search_html != false) {
		search_div.innerHTML = search_html;
		
		var search = search_html;
		var script;
		
		while( script = search.match(/(<script[^>]+javascript[^>]+>\s*(<!--)?)/i))
		{
			search = search.substr(search.indexOf(RegExp.$1) + RegExp.$1.length);
		
			if (!(endscript = search.match(/((-->)?\s*<\/script>)/))) break;
		
			block = search.substr(0, search.indexOf(RegExp.$1));
			search = search.substring(block.length + RegExp.$1.length);
		
			eval(block);
		}
	}
	else {
		search_div.innerHTML = 'No products match your criteria.  Please search again.';
	}
	spinner.style.display = "none";
	search_div.style.display = "block";

	if (form_html != '') {
		
		var search = form_html;
		var script;
		
		var form_div = obj.argument[1];

		var new_div = document.createElement('div');

		new_div.innerHTML = form_html;
		form_div.innerHTML = '';
		form_div.appendChild(new_div);

		while( script = search.match(/(<script[^>]+javascript[^>]+>\s*(<!--)?)/i))
		{
			search = search.substr(search.indexOf(RegExp.$1) + RegExp.$1.length);
		
			if (!(endscript = search.match(/((-->)?\s*<\/script>)/))) break;
		
			block = search.substr(0, search.indexOf(RegExp.$1));
			search = search.substring(block.length + RegExp.$1.length);
		
			eval(block);
		}
	} else {
	}
	if(in_process_of_altering_anchor_parameters) {
		in_process_of_altering_anchor_parameters = false;
	}
	update_results_per_page();
}

function product_search_failure() {
	loading = 0;
	if(in_process_of_altering_anchor_parameters) {
		in_process_of_altering_anchor_parameters = false;
	}
}

function register_autocomplete(entity, search_field, limit) {
	var search_params = generate_search_params_from_form();
	$('#' + entity + search_field).autocomplete('ajax_targets/autocomplete.php', {
		max: limit,
		width: 200,
		extraParams: {
			entity: entity,
			field: search_field,
			search_params: search_params,
			search_id: document.getElementById('hidden_saved_search').value
		}
	});
}



// get state from history manager
init_state = YAHOO.util.History.getBookmarkedState("product_listing");
// load parameters from this state if available, if not load from query string if available, if not load from document hiddens if available, if not load defaults.
init_results = YAHOO.util.History.getQueryStringParameter("results_per_page") || document.getElementById('hidden_results_per_page').value || '';
init_current_page = YAHOO.util.History.getQueryStringParameter("current_page", init_state) || YAHOO.util.History.getQueryStringParameter("current_page") || document.getElementById('hidden_current_page').value || "-1";
init_order_by = YAHOO.util.History.getQueryStringParameter("order_by", init_state) || YAHOO.util.History.getQueryStringParameter("order_by") || document.getElementById('hidden_order_by').value || "";
init_search_params = YAHOO.util.History.getQueryStringParameter("search_params", init_state) || YAHOO.util.History.getQueryStringParameter("search_params") || "";


// if init_search_params is empty (aka no search params variable in the url after the #product_listing) look through the hidden form element 'search_params' and grab the freetext params if they are set.
// this ensures that when we hit the back button and return to a page displaying full text search results, that the system state is not confused.
if(init_search_params == '') {
	if(document.getElementById('hidden_search_params').value != '') {
		var temp = new Array();
		var subtemp = new Array();
		temp = document.getElementById('hidden_search_params').value.split('::');
		for(var i=0;i<temp.length;i++) {
			subtemp = temp[i].split(':');
			if(subtemp[0] == 'fulltext' || subtemp[0] == 'FullText') {
				init_search_params = temp[i];
			}
		}
	}
}

//init_search_params = YAHOO.util.History.getQueryStringParameter("search_params", init_state) || YAHOO.util.History.getQueryStringParameter("search_params") || document.getElementById('hidden_search_params').value || "";


// register the function to handle history navigate requests
YAHOO.util.History.register("product_listing", init_current_page, function (state) {
	if(state == -1) {
		window.location = window.location;
	}
	if (state == init_current_page) { 
		document.getElementById('hidden_current_page').value = 1;
		document.getElementById('hidden_results_per_page').value = init_results;
		document.getElementById('hidden_order_by').value = init_order_by;
		document.getElementById('hidden_search_params').value = init_search_params;
	}
	else {
		// load parameters from state, store in hiddens for load_results function call.
		var current_page = YAHOO.util.History.getQueryStringParameter('current_page', state);
		var results = YAHOO.util.History.getQueryStringParameter('results_per_page', state);
		var order_by = YAHOO.util.History.getQueryStringParameter('order_by', state);
		var search_params = YAHOO.util.History.getQueryStringParameter('search_params', state);
		document.getElementById('hidden_current_page').value = current_page;
		document.getElementById('hidden_results_per_page').value = results;
		document.getElementById('hidden_order_by').value = order_by;
		document.getElementById('hidden_search_params').value = search_params;
	}

	// rebuild the anchors array (used to build new search params when clicking anchor links) from the current search params
	// this was added because the back button was not removing items from the anchors array which caused incorrect behavior at times.
	anchors = new Array();
	var temp = new Array();
	var pieces = new Array();
	if (document.getElementById('hidden_search_params').value.length > 0) {
		temp = document.getElementById('hidden_search_params').value.split('::');
		for(var i=0;i<temp.length;i++) {
			pieces = temp[i].split(':');
			if(temp[i] != '') {
				anchors.push(pieces[0]+':'+escape(pieces[1]));
			}
		}
	}
	load_results();
});

// Use the Browser History Manager onReady method to initialize the application.
YAHOO.util.Event.onDOMReady(function () {
	var init_string = YAHOO.util.History.getBookmarkedState('product_listing');
	
	/////////// attempt to detect whether the bookmarked state variables (aka vars in the URL after the #product_listing) match what we have already understood to be the state variables.
	/////////// if they are different we know that we need an ajax call to make the results correct.
	// load vars from yahoo history manager
	var bookmarked_search_params = YAHOO.util.History.getQueryStringParameter('search_params',init_string);
	var bookmarked_current_page = YAHOO.util.History.getQueryStringParameter('current_page',init_string);
	var bookmarked_results_per_page = YAHOO.util.History.getQueryStringParameter('results_per_page',init_string);
	var bookmarked_order_by = YAHOO.util.History.getQueryStringParameter('order_by',init_string);
	// load values from query string
	var current_search_params = YAHOO.util.History.getQueryStringParameter('search_params');
	var current_current_page = YAHOO.util.History.getQueryStringParameter('current_page');
	var current_results_per_page = YAHOO.util.History.getQueryStringParameter('results_per_page');
	var current_order_by = YAHOO.util.History.getQueryStringParameter('order_by');

	// modify null values to be empty strings
	if(!current_search_params)
		current_search_params = '';
	if(!current_current_page)
		current_current_page = '';
	if(!current_results_per_page)
		current_results_per_page = '';
	if(!current_order_by)
		current_order_by = '';
	if(!bookmarked_search_params)
		bookmarked_search_params = '';
	if(!bookmarked_current_page)
		bookmarked_current_page = '';
	if(!bookmarked_results_per_page)
		bookmarked_results_per_page = '';
	if(!bookmarked_order_by)
		bookmarked_order_by = '';
	
	// identify if the bookmarked values are set and different from the form values
	var unrecognized_bookmarked_data = false;
	if(bookmarked_search_params != '') {
		if(current_search_params != bookmarked_search_params) {
			unrecognized_bookmarked_data = true;
		}
	}
	if(bookmarked_current_page != '') {
		if(current_current_page != bookmarked_current_page) {
			unrecognized_bookmarked_data = true;
		}
	}
	if(bookmarked_results_per_page != '') {
		if(current_results_per_page != bookmarked_results_per_page) {
			unrecognized_bookmarked_data = true;
		}
	}
	if(bookmarked_order_by != '') {
		if(current_order_by != bookmarked_order_by) {
			unrecognized_bookmarked_data = true;
		}
	}
	
	initialize_page_links();
	initialize_results();
	initialize_order_by();
	initialize_search_params('');

	var current_page = document.getElementById('hidden_current_page').value || "1";

	try {
		var search_params = document.getElementById('hidden_search_params').value;
	}
	catch (e) {
	 	var search_params = '';
	}
	if(init_search_params == '') {
		init_search_params = search_params;
	}

	// build the anchors array containing all individual search params
	anchors = new Array();
	var temp = new Array();
	var pieces = new Array();
	if (search_params.length > 0) {
		temp = search_params.split('::');
		for(var i=0;i<temp.length;i++) {
			pieces = temp[i].split(':');
			if(temp[i] != '') {
				anchors.push(pieces[0]+':'+escape(pieces[1]));
			}
		}
	}
	
	// review the anchors array to see if it contains any search criteria other than category (since if it only contains a category we probably won't fire ajax)
	found_non_category_search_param = false;
	for(var i=0;i<anchors.length;i++) {
		var pieces = anchors[i].split(':');
		if(pieces[0] != '' && pieces[0] != 'Category_DELIMITER_id') {
			found_non_category_search_param = true;
		}
	}
	// if we haven't just rendered results (just_drew_results is set by the product listing plugin) OR we have unrecognized bookmark data, then attempt to render results with ajax
	if(window.just_drew_results != true || unrecognized_bookmarked_data == true) {
		var results = document.getElementById('hidden_results_per_page').value || "";
		var order_by = document.getElementById('hidden_order_by').value || "";

		// may need to get_escaped_hidden_search_params
		var state = '?current_page=' + current_page + '&results_per_page=' + results + '&order_by=' + order_by + '&search_params=' + search_params;

		try {
			YAHOO.util.History.navigate("product_listing", state);
			load_results();
		} 
		catch (e) {
			load_results();
		}
	}
});


// Initialize the browser history management library.
try {
   YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
} catch (e) {
   document.getElementById('hidden_current_page').value = init_current_page;
   document.getElementById('hidden_results_per_page').value = init_results;
   document.getElementById('hidden_order_by').value = init_order_by;
   document.getElementById('hidden_search_params').value = init_search_params;
   load_results();
}
