var OF_Find = Class.create({
	initialize: function(identifier) {
		this.identifier = identifier;
		this.prolist = new OF_ProList();
		this.pros = [];
		this.selected_pros = [];
		this.current_sort = {sort: undefined, sort_direction: undefined};
		this.processing_filter = false;
		this.processing_select = false;
		this.queue_filter = $H();
		this.queue_select = $H();
	},

	draw_pro_list: function() {
		var pro_list = $('finder_pro_list');
		if (pro_list) {
			// Remove Tip observers for existing rendered pros. This fixes an
			// issue where it would take a long time to navigate away from this
			// page due to there being a ton of left over observers having to be
			// cleaned up all at once
			if ($$('.unobservable_tip')) {
				$$('.unobservable_tip').each(function(tip_event) { Tips.remove(tip_event); })
			}

			// Clear list (skipping the first row since its the header row)
			var children = pro_list.childElements();
			children.each(function(pro, index) { if (index == 0) return; pro.remove(); });

			// Uncheck select all when list is redrawn
			if ($('select_all_pros')) {
				$('select_all_pros').checked = false;
			}

			// Add pros to list
			if (count(this.pros) > 0) {
				// Determine if we have PowerMatch scores yet
				if ($('pro_list_powermatch_score_sort') &&
					$('pro_list_powermatch_score_noscore')
					) {
					if ($H(this.pros).values().first().data.powermatch == null) {
						$('pro_list_powermatch_score_sort').hide();
						$('pro_list_powermatch_score_noscore').show();
					} else {
						$('pro_list_powermatch_score_sort').show();
						$('pro_list_powermatch_score_noscore').hide();
					}
				}

				// Loop through each pro and add them to the list
				var index = 0;
				for (var i in this.pros) {
					pro_list.appendChild(this.draw_pro(this.pros[i], ++index));
				}
			} else {
				var pro_row = new Element('tr');
				var no_pros = new Element('td', {'colspan': '8', 'style': 'color:red;'});
				no_pros.update('No search results found. Please adjust your search criteria to broaden your search.');
				pro_row.appendChild(no_pros);
				pro_list.appendChild(pro_row);
			}

			resize_ajax_activity_indicator();
		}
	},

	draw_pro: function(pro_obj, index) {
		var pro_rows = new Element('tbody', {'id': 'pro_' + pro_obj.get_data('uid')});
		if ((index % 2) == 0) {
			pro_rows.addClassName('rowBg');
		}
		if (find_logged_in && pro_obj.get_data('private') == true) {
			pro_rows.addClassName('highlighted');
		}
		var pro_row = new Element('tr');
		pro_row.addClassName('topRow');

		if (find_displaymode == 'create_work_order') {
			var pro_select = new Element('td');
			if (pro_obj.get_data('unavailable') != null) {
				pro_rows.addClassName('not_available');
			} else {
				pro_select.addClassName('pro_list_select_pro');
				pro_select.update('<input type="checkbox" name="selected_pros[]" id="selected_pros_' + pro_obj.get_data('uid') + '" onclick="javascript:finder.toggle_pro(\'' + pro_obj.get_data('uid') + '\');" />');

				if (pro_obj.get_data('previously_routed')) {
					pro_select.insert('<div class="previously_sent">Previously Sent<\/div>');
				}
			}
			pro_row.appendChild(pro_select);
		}

		var pro_details = new Element('td');
		pro_details.addClassName('pro_list_details');
		pro_details.update('<div class="name"><a href="javascript:void(0);" onclick="javascript:show_pro_profile(' + pro_obj.get_data('uid') + '); return false;">' + pro_obj.get_data('name') + '<\/a> <span class="prouid nowrap">(ID: ' + pro_obj.get_data('uid') + ')<\/span><\/div>');
		if (pro_obj.get_data('bg_checked') == '1') {
			pro_details.insert('<a href="http://help.onforce.com/buyers/questions/176" onclick="javascript:window.open(this.href, \'help\'); return false;"><img src="/images/bgchecked_sm.gif" alt="Background Check Passed" height="18" width="22" /></a> ');
		}
		if (pro_obj.get_data('drug_tested') == '1') {
			pro_details.insert('<a href="http://help.onforce.com/buyers/questions/177" onclick="javascript:window.open(this.href, \'help\'); return false;"><img src="/images/drugtested_sm.gif" alt="Drug Test Passed" height="18" width="32" /></a> ');
		}
		if (find_recognition_levels[pro_obj.get_data('recognitionlevelid')]) {
			if (find_recognition_levels[pro_obj.get_data('recognitionlevelid')].smallicon) {
				if (pro_obj.get_data('recognitionlevelid') == 3) {
					pro_details.insert('<a href="http://help.onforce.com/buyers/questions/126" onclick="javascript:window.open(this.href, \'help\'); return false;"><img src="/images/recognitionlevels/' + find_recognition_levels[pro_obj.get_data('recognitionlevelid')].smallicon + '" alt="' + find_recognition_levels[pro_obj.get_data('recognitionlevelid')].recognitionlevel + '" /></a> ');
				} else {
					pro_details.insert('<img src="/images/recognitionlevels/' + find_recognition_levels[pro_obj.get_data('recognitionlevelid')].smallicon + '" alt="' + find_recognition_levels[pro_obj.get_data('recognitionlevelid')].recognitionlevel + '" /> ');
				}
			}
		}
		if (pro_obj.get_data('insured') == '1') {
			pro_details.insert('<a href="http://help.onforce.com/buyers/questions/192" onclick="javascript:window.open(this.href, \'help\'); return false;"><img src="/images/insured_sm.png" alt="Insured" height="20" width="20" /></a> ');
		}
		if (pro_obj.get_data('licensed') == '1') {
			pro_details.insert('<a href="http://help.onforce.com/buyers/questions/200" onclick="javascript:window.open(this.href, \'help\'); return false;"><img src="/images/licensed.png" height="18" width="22" title="Licensed" alt="Licensed" /></a> ');
		}

		pro_row.appendChild(pro_details);

		if (find_logged_in)
		{
			var pro_powermatch = new Element('td');
			if (pro_obj.get_data('powermatch') != null) {
				pro_powermatch.addClassName('pro_list_powermatch_score');
				var score = pro_obj.get_data('powermatch');
				if (pro_obj.get_data('oldschool_pm') != null)
				{
					score += " / " + pro_obj.get_data('oldschool_pm');
				}
				pro_powermatch.update(score);
			} else {
				pro_powermatch.addClassName('why_no_powermatch');
				pro_powermatch.update('&mdash;');
			}
			pro_row.appendChild(pro_powermatch);
		}

		var pro_feedback = new Element('td');
		pro_feedback.addClassName('pro_list_feedback');
		if (pro_obj.get_data('feedback') > 0) {
			var imagestr = '';

			imagestr+= '<span class="feedback_widget">';
			imagestr+= '<img src="/images/spacer.gif" class="feedback_image feedback_positive" />';
			imagestr+= round_number((pro_obj.get_data('recommended') * 100), 1) + '% Positive ';
			imagestr+= '<span class="feedback_widget_count">(<a href="javascript:void(0);" onclick="javascript:show_pro_profile(' + pro_obj.get_data('uid') + '); return false;">' + addCommas(pro_obj.get_data('feedback')) + '<\/a>)<\/span>';
			imagestr+= '<\/span>';
			if (find_logged_in) {
				if (pro_obj.get_data('myfeedback') > 0) {
					imagestr+= '<br \/>';
					imagestr+= '<span class="myfeedback_widget">';
					imagestr+= '<img src="/images/spacer.gif" class="feedback_image" />';
					imagestr+= round_number((pro_obj.get_data('myrecommended') * 100), 1) + '% Positive with me ';
					imagestr+= '<span class="myfeedback_widget_count">(<a href="javascript:void(0);" onclick="javascript:show_pro_profile(' + pro_obj.get_data('uid') + ', \'myfeedback\'); return false;">' + addCommas(pro_obj.get_data('myfeedback')) + '<\/a>)<\/span>';
					imagestr+= '<\/span>';
				}
			}
			if (pro_obj.get_data('categoryfeedback') > 0 &&
			    typeof find_task_list[pro_obj.get_data('categoryfeedback_marketplaces')] != 'undefined'
			    ) {
				var selected_category_lvl2 = find_task_list[pro_obj.get_data('categoryfeedback_marketplaces')].lvl2s[pro_obj.get_data('categoryfeedback_workorderobjectid')];
				if (typeof selected_category_lvl2 != 'undefined') {
					imagestr+= '<br \/>';
					imagestr+= '<span class="myfeedback_widget">';
					imagestr+= '<img src="/images/spacer.gif" class="feedback_image" />';
					imagestr+= addCommas(pro_obj.get_data('categoryfeedback')) + ' Review' + ((pro_obj.get_data('categoryfeedback') != 1) ? 's' : '') + ' in ' + selected_category_lvl2.name;
					imagestr+= '<\/span>';
				}
			}

			pro_feedback.insert('<div class="ratings">' + imagestr + '<\/div>');
		}
		pro_row.appendChild(pro_feedback);

		var pro_workorders = new Element('td');
		pro_workorders.addClassName('pro_list_workorders');
		pro_workorders.update(addCommas(pro_obj.get_data('wosclosed')));
		if (find_logged_in && pro_obj.get_data('my_wosclosed') > 0) {
			pro_workorders.insert('<br \/><small>(' + addCommas(pro_obj.get_data('my_wosclosed')) + ' with me)<\/small>');
		}
		pro_row.appendChild(pro_workorders);

		var pro_location = new Element('td');
		pro_location.addClassName('pro_list_location');
		pro_location.update(pro_obj.get_data('location'));
		if (pro_obj.get_data('dist') != null) {
			pro_location.insert('<br \/><small>(' + pro_obj.get_data('dist') + ' ' + find_dist_units + ')<\/small>');
		}
		if (pro_obj.get_data('dist') != null && parseFloat(pro_obj.get_data('dist')) > parseFloat(pro_obj.get_data('range_standard'))) {
			var ext_str = '<br \/><small class="alert" style="line-height:120%;"><a href="http://help.onforce.com/buyers/questions/199" target="_blank">pro\'s standard<br \/>range is ';
			ext_str+= parseFloat(pro_obj.get_data('range_standard'));
			ext_str+= ' ' + find_dist_units + '<\/a><\/small>';
			pro_location.insert(ext_str);
		}
		pro_row.appendChild(pro_location);

		pro_rows.appendChild(pro_row);

		var pro_row = new Element('tr');
		pro_row.addClassName('bottomRow');
		if (find_displaymode == 'create_work_order') {
			var spacer = new Element('td');
			pro_row.appendChild(spacer);
		}

		var pro_meta = new Element('td', {'colspan': 5});
		if (find_logged_in && pro_obj.get_data('private') == true) {
			pro_meta.insert('<span class="private_pro">(Private Pro)</span>');
			pro_meta.insert('<br \/>');
		}
		var certs = pro_obj.get_data('certs');
		var certs_str = this.draw_pro_certs(certs, 3);
		if (certs_str != '') {
			pro_meta.insert('<strong>Certifications:<\/strong> ' + certs_str + ' ');
			if (count(certs) > 3) {
				var view_all_link = new Element('a', {'href': 'javascript:void(0);',
													  'id': 'view_all_certs_' + pro_obj.get_data('uid'),
													  'class': 'unobservable_tip'
													  }
												);
				new Tip(view_all_link, this.draw_pro_certs(certs), {title: 'Certifications', style: 'onforce', showOn: 'click', hook: {target: 'topLeft', tip: 'topRight'}, stem: 'rightTop', width: 150, hideOn: {element: 'closeButton', event: 'click'}, closeButton: true});
				view_all_link.update('view all &raquo;');
				pro_meta.appendChild(view_all_link);
			}
			pro_meta.insert('<br \/>');
		}
		if (find_logged_in) {
			var lists = pro_obj.get_data('lists');
			pro_meta.insert('<strong>My Lists:<\/strong> ');
			var lists_str = this.draw_pro_lists(lists, 3);
			if (lists_str != '') {
				pro_meta.insert(lists_str);
				if (pro_obj.get_data('ppn') == true) {
					pro_meta.insert(', PPN');
				}
				pro_meta.insert(' ');
				if (count(lists) > 3) {
					var view_all_link = new Element('a', {'href': 'javascript:void(0);',
														  'id': 'view_all_lists_' + pro_obj.get_data('uid'),
														  'class': 'unobservable_tip'
														  }
													);
					new Tip(view_all_link, this.draw_pro_lists(lists), {title: 'Lists', style: 'onforce', showOn: 'click', hook: {target: 'topLeft', tip: 'topRight'}, stem: 'rightTop', width: 200, hideOn: {element: 'closeButton', event: 'click'}, closeButton: true});
					view_all_link.update('View all &raquo;');
					pro_meta.appendChild(view_all_link);
					pro_meta.insert(' ');
				}
			} else if (pro_obj.get_data('ppn') == true) {
				pro_meta.insert('PPN ');
			}
			if (find_can_edit_lists) {
				pro_meta.insert('<a href="javascript:void(0);" onclick="javascript:show_add_to_list(' + pro_obj.get_data('uid') + '); return false;">Add to list<\/a>');
				pro_meta.insert('<br \/>');
			}
		}
		if (pro_obj.get_data('unavailable') != null) {
			var why_link = new Element('a', {'href': 'javascript:void(0);', 'class': 'unobservable_tip'});
			new Tip(why_link, pro_obj.get_data('unavailable'), {title: 'No longer available', style: 'onforce', showOn: 'click', width: 250, hideOn: {element: 'closeButton', event: 'click'}, closeButton: true});
			why_link.update('Why?');
			pro_meta.insert('<strong>No longer available (<\/strong>');
			pro_meta.insert(why_link);
			pro_meta.insert('<strong>)<\/strong>');
		}

		if (pro_obj.get_data('siteactivityscore')) {
			pro_meta.insert('<small>Site Activity Score: ' + pro_obj.get_data('siteactivityscore') + '</small>');
		}

		pro_row.appendChild(pro_meta);

		pro_rows.appendChild(pro_row);

		return pro_rows;
	},

	draw_pro_certs: function(certs, limit) {
		var cnt = 0;
		var str = '';
		var total_records = count(certs);
		for (var i in certs) {
			if (typeof find_certifications[i] != 'undefined') {
				++cnt;
				str+= find_certifications[i].name + ' (' + addCommas(certs[i]) + ')';
				if (typeof limit != 'undefined' && cnt >= limit) {
					break;
				}
				if (cnt < total_records) {
					str+= ', ';
				}
			}
		}
		return str;
	},

	draw_pro_lists: function(lists, limit) {
		var cnt = 0;
		var str = '';
		for (var i = 0, size = lists.length; i < size; i++) {
			++cnt;
			str+= lists[i];
			if (typeof limit != 'undefined' && cnt >= limit) {
				break;
			}
			if (cnt < size) {
				str+= ', ';
			}
		}
		return str;
	},

	sort_list: function(sort_column, default_order) {
		if (this.current_sort.sort != sort_column) {
			if (typeof default_order == 'undefined') {
				default_order = 'ASC';
			}
			this.apply_filter({'sort': sort_column, sort_direction: default_order});
		} else {
			if (this.current_sort.sort_direction == 'ASC') {
				this.apply_filter({'sort': sort_column, sort_direction: 'DESC'});
			} else {
				this.apply_filter({'sort': sort_column, sort_direction: 'ASC'});
			}
		}
	},

	build_paging: function(start, total, results_per_page) {
		var find_paging_obj  = $('find_paging');
		var find_paging_obj2 = $('find_paging2');
		if (!find_paging_obj || !find_paging_obj2) {
			return false;
		}

		var current_page = new Number(start) + 1;
		var num_records = total;
		var num_per_page = results_per_page;
		var page_set = 5;

		var num_pages = (num_records != 0) ? Math.ceil(num_records / num_per_page) : 1;

		var num_pages_per_set = (num_pages < page_set) ? num_pages : page_set;
		var page_padding = Math.floor(num_pages_per_set / 2);

		if (current_page - page_padding < 1) {
			var page_start = 0;
			var page_end = num_pages_per_set;
		} else if (current_page + page_padding > num_pages) {
			var page_start = num_pages - num_pages_per_set;
			var page_end = num_pages;
		} else {
			var page_start = current_page - page_padding - 1;
			var page_end = current_page + page_padding;
		}

		var html_code = '';
		if (num_pages > 1) {
			if (current_page != 1) {
				html_code+= '<a href="javascript:void(0);" onclick="javascript:finder.change_page(0); return false;">First</a> ';
				html_code+= '<a href="javascript:void(0);" onclick="javascript:finder.change_page(' + (current_page - 2) + '); return false;">Prev</a> ';
			}
			for (var i = page_start; i < page_end; i++) {
				var page_num = (i + 1);
				if (page_num == current_page) {
					html_code+= page_num + ' ';
				} else {
					html_code+= '<a href="javascript:void(0);" onclick="javascript:finder.change_page(' + (page_num - 1) + '); return false;">' + page_num + '</a> ';
				}
			}
			if (current_page != num_pages) {
				html_code+= '<a href="javascript:void(0);" onclick="javascript:finder.change_page(' + (current_page) + '); return false;">Next</a> ';
				html_code+= '<a href="javascript:void(0);" onclick="javascript:finder.change_page(' + (num_pages - 1) + '); return false;">Last</a> ';
			}
		} else {
			html_code+= '&nbsp;';
		}

		find_paging_obj.update(html_code);
		find_paging_obj2.update(html_code);

		return true;
	},

	change_page: function(page) {
		this.apply_filter({'pagenum': page});
	},

	toggle_pro: function(id) {
		var state = this.selected_pros.indexOf(id) == -1;
		this.toggle_pro_interface(id, state);
		var h = new Hash();
		h.set('ids[' + id + ']', (state ? 'add' : 'remove'));
		this.select_pros(h);
	},

	toggle_all_pros: function() {
		var select_all_pros_obj = $('select_all_pros');
		if (select_all_pros_obj) {
			var ids = $H();
			var checked_state = select_all_pros_obj.checked;
			for (var i in this.pros) {
				// Don't count unavailable pros
				if (this.pros[i].get_data('unavailable') == null) {
					this.toggle_pro_interface(i, checked_state);
					var h = new Hash();
					h.set('ids[' + i + ']', (checked_state ? 'add' : 'remove'));
					ids = ids.merge(h);
				}
			}
			this.select_pros(ids);
		}
	},

	toggle_pro_interface: function(id, state) {
		id = id + '';
		var pro_row = $('pro_' + id);
		var chkbox = $('selected_pros_' + id);
		if (!state) {
			if (pro_row && chkbox) {
				pro_row.removeClassName('selected_pro');
				chkbox.checked = false;
			}
			this.selected_pros = this.selected_pros.without(id);
		} else {
			if (pro_row && chkbox) {
				pro_row.addClassName('selected_pro');
				chkbox.checked = true;
			}
			if (this.selected_pros.indexOf(id) == -1) {
				this.selected_pros[this.selected_pros.size()] = id;
			}
		}
		if ($('num_selected_pros')) {
			if (this.selected_pros.size()) {
				$('num_selected_pros').update('<a href="javascript:void(0);" onclick="javascript:show_selected_pros(); return false;">' + this.selected_pros.size() + ' pro' + (this.selected_pros.size() != 1 ? 's' : '') + '</a>');
			} else {
				$('num_selected_pros').update('0 pros');
			}
		}
		if ($('selected_pros_ids')) {
			$('selected_pros_ids').value = this.selected_pros.join(', ');
		}
	},

	select_pros: function(ids) {
		// Check if there is a pending request
		if (this.processing_select == true) {
			// Add to the queue
			this.queue_select = this.queue_select.merge(ids);
		} else {
			// Set processing flag
			this.processing_select = true;

			// Reset queue
			this.queue_select = $H();

			// Prepare request parameters
			var params = $H({'identifier': this.identifier, 'output_type': 'ajax', 'rand': generate_random_str(10)});
			params = params.merge(ids);

			// Make server request
			new Ajax.Request('/?page=search_select', {
				method: 'post',
				parameters: params,
				onSuccess: (this.callback_select_pros).bind(this),
				onFailure: handle_failure,
				onException: handle_exception
			});
		}
	},

	callback_select_pros: function(transport) {
		// Reset processing flag
		this.processing_select = false;

		// If there are any queued requests, process them
		if (this.queue_select.keys().size() > 0) {
			this.select_pros(this.queue_select);
		}
	},

	filter_distance: function(dist) {
		if (typeof $('filter_distance_value') == 'undefined') {
			return;
		}

		this.change_distance(dist);
		$('filter_distance_value').value = dist;

		if (dist >= find_max_dist || dist <= 0) {
			dist = find_max_dist;
		}

		this.apply_filter({'filters[distance][value]': dist, 'filters[distance][action]':'add'});
	},

	change_distance: function(dist) {
		$('distance_filter').update(dist + ' ' + find_dist_units + '.');
	},

	filter_category_lvl1: function(id) {
		this.apply_filter({'filters[category_lvl1][value]': id, 'filters[category_lvl1][action]': 'add'});
	},

	filter_category_lvl2: function(id) {
		this.apply_filter({'filters[category_lvl2][value]': id, 'filters[category_lvl2][action]': 'add'});
	},

	filter_category_lvl3: function(id) {
		this.apply_filter({'filters[category_lvl3][value]': id, 'filters[category_lvl3][action]': 'add'});
	},

	clear_filter_categories: function() {
		this.apply_filter({'filters[category_lvl1][action]': 'remove',
						   'filters[category_lvl2][action]': 'remove',
						   'filters[category_lvl3][action]': 'remove'
						   }
						  );
		$('workorder_service_breadcrumbs').update('Get better results by editing your search on the right.');
	},

	filter_attribute_lvl1: function(id) {
		this.apply_filter({'filters[attribute_lvl1][value]': id, 'filters[attribute_lvl1][action]': 'add'});
	},

	clear_filter_attribute_lvl1: function() {
		this.apply_filter({'filters[attribute_lvl1][action]': 'remove'});
	},

	filter_os: function(id) {
		this.apply_filter({'filters[os][value]': id, 'filters[os][action]': 'add'});
	},

	clear_filter_os: function() {
		this.apply_filter({'filters[os][action]': 'remove'});
	},

	filter_brand: function(id) {
		this.apply_filter({'filters[brand][value]': id, 'filters[brand][action]': 'add'});
	},

	clear_filter_brand: function() {
		this.apply_filter({'filters[brand][action]': 'remove'});
	},

	filter_list: function(id) {
		this.apply_filter({'filters[list][value]': id, 'filters[list][action]': 'add'});
	},

	clear_filter_list: function() {
		this.apply_filter({'filters[list][action]': 'remove'});
	},

	filter_ppn: function() {
		this.apply_filter({'filters[ppn][action]': ($('filters_ppn').checked ? 'add' : 'remove')});
	},

	filter_previously_used: function() {
		this.apply_filter({'filters[previouslyused][action]': (($('filters_previously_used').checked) ? 'add' : 'remove')});
		if ($('filters_previously_used_loc')) {
			if (!($('filters_previously_used').checked)) {
				this.apply_filter({'filters[previouslyusedlocation][action]': 'remove'});
				$('filters_previously_used_loc_container').hide();
			}
			else {
				$('filters_previously_used_loc_container').show();
			}

			$('filters_previously_used_loc').disabled = !($('filters_previously_used').checked);
		}
	},

	filter_previously_used_loc: function() {
		this.apply_filter({'filters[previouslyusedlocation][action]': ($('filters_previously_used_loc').checked ? 'add' : 'remove')});
		$('filters_previously_used').disabled = $('filters_previously_used_loc').checked;

		// Needs to be display if its enabled
		if ($('filters_previously_used_loc').checked) {
			$('filters_previously_used_loc_container').show();
		}
	},

	filter_drug_tested: function() {
		this.apply_filter({'filters[drugtest][action]': ($('filters_drug_tested').checked ? 'add' : 'remove')});
	},

	filter_powerpro: function() {
		this.apply_filter({'filters[recognitionlevel][value]': 3, 'filters[recognitionlevel][action]': ($('filters_powerpro').checked ? 'add' : 'remove')});
	},

	filter_background_checked: function() {
		this.apply_filter({'filters[backgroundcheck][action]': ($('filters_bg_checked').checked ? 'add' : 'remove')});
	},

	clear_filter_checkboxes: function() {
		var filters = new Hash();

		if ($('filters_ppn') && !$('filters_ppn').disabled) {
			$('filters_ppn').checked = false;
			filters.set('filters[ppn][action]', 'remove');
		}
		if ($('filters_previously_used_loc') && !$('filters_previously_used_loc').disabled) {
			$('filters_previously_used_loc').checked = false;
			filters.set('filters[previouslyusedlocation][action]', 'remove');
			$('filters_previously_used').disabled = false;
		}
		if ($('filters_previously_used') && !$('filters_previously_used').disabled) {
			$('filters_previously_used').checked = false;
			filters.set('filters[previouslyused][action]', 'remove');
		}
		if ($('filters_drug_tested') && !$('filters_drug_tested').disabled) {
			$('filters_drug_tested').checked = false;
			filters.set('filters[drugtest][action]', 'remove');
		}
		if ($('filters_powerpro') && !$('filters_powerpro').disabled) {
			$('filters_powerpro').checked = false;
			filters.set('filters[recognitionlevel][action]', 'remove');
		}
		if ($('filters_bg_checked') && !$('filters_bg_checked').disabled) {
			$('filters_bg_checked').checked = false;
			filters.set('filters[backgroundcheck][action]', 'remove');
		}

		this.apply_filter(filters);
	},

	filter_proids: function() {
		this.apply_filter({'filters[proids][value]': $('pro_ids').value, 'filters[proids][action]': ($('pro_ids').value != '' ? 'add' : 'remove')});
	},

	clear_filter_proids: function() {
		$('pro_ids').value = '';
		this.apply_filter({'filters[proids][action]': 'remove'});
	},

	filter_certifier: function(id) {
		this.apply_filter({'filters[certifier][value]': id, 'filters[certifier][action]': 'add'});
	},

	filter_certification: function(id) {
		this.apply_filter({'filters[certification][value]': id, 'filters[certification][action]': 'add'});
	},

	clear_filter_certification: function() {
		this.apply_filter({'filters[certifier][action]': 'remove',
						   'filters[certification][action]': 'remove'
						   }
						  );
	},

	filter_language: function(id) {
		this.apply_filter({'filters[language][value]': id, 'filters[language][action]': 'add'});
	},

	clear_filter_language: function() {
		this.apply_filter({'filters[language][action]': 'remove'});
	},

	filter_insurance: function(id) {
		if (id.checked) {
			this.apply_filter({'filters[insurance][value]': id.getValue(), 'filters[insurance][action]': 'add'});
		} else {
			this.apply_filter({'filters[insurance][action]': 'remove'});
		}
	},

	clear_filter_insurance: function() {
		this.apply_filter({'filters[insurance][action]': 'remove'});
		this.apply_filter({'filters[insurance_eo][action]': 'remove'});
		this.apply_filter({'filters[insurance_gl][action]': 'remove'});
	},

 	filter_insurance_gl: function(id) {
		if (id.checked) {
			this.apply_filter({'filters[insurance_gl][value]': id.getValue(), 'filters[insurance_gl][action]': 'add'});
		} else {
			this.apply_filter({'filters[insurance_gl][action]': 'remove'});
		}
	},

 	filter_insurance_eo: function(id) {
		if (id.checked) {
			this.apply_filter({'filters[insurance_eo][value]': id.getValue(), 'filters[insurance_eo][action]': 'add'});
		} else {
			this.apply_filter({'filters[insurance_eo][action]': 'remove'});
		}
	},

	results_per_page: function(num) {
		this.apply_filter({'results_per_page': num});
	},

	apply_filter: function(filter) {
		// Hide any visible tips when a filter is applied
		Tips.hideAll();

		resize_ajax_activity_indicator();
		$('ajax_loading_indicator').show();

		// Check if there is a pending request
		if (this.processing_filter == true) {
			// Add to the queue
			this.queue_filter = this.queue_filter.merge(filter);
		} else {
			// Set processing flag
			this.processing_filter = true;

			// Reset queue
			this.queue_filter = $H();

			// Prepare request parameters
			var params = $H({'identifier': this.identifier, 'output_type': 'ajax', 'rand': generate_random_str(10)});
			params = params.merge(filter);

			// Make server request
			new Ajax.Request('/?page=search_filter', {
				method: 'post',
				parameters: params,
				onSuccess: (this.callback_apply_filter).bind(this),
				onFailure: handle_failure,
				onException: handle_exception
			});
		}
	},

	callback_apply_filter: function(transport) {
		if (transport.responseText) {
			var json = transport.responseText.evalJSON();

			this.pros = this.prolist.objectify(json.pros);
			this.draw_pro_list();

			var selected_pros = $H(json.selected_pros).values();
			for (var i = 0, size = count(selected_pros); i < size; i++) {
				this.toggle_pro_interface(selected_pros[i], true);
			}

			$('pros_record_start').update(addCommas(json.page_start));
			$('pros_record_end').update(addCommas(json.page_end));
			$('pros_record_total').update(addCommas(json.total));

			$('pros_record_start2').update(addCommas(json.page_start));
			$('pros_record_end2').update(addCommas(json.page_end));
			$('pros_record_total2').update(addCommas(json.total));

			if ($('pros_record_total3')) {
				$('pros_record_total3').update('<span>' + addCommas(json.total) + '<\/span> service professional' + (json.total != 1 ? 's' : '') + ' found');
			}

			if ($('max_distance') != null) {
				$('max_distance').update(json.max_distance);
				$('max_distance').fire('slider:update');
			}

			this.build_paging(json.page, json.total, json.results_per_page);

			//omniture stuff that doesn't work in the callback_redraw_filters()
			s.prop5 = s.prop36 = s.eVar36 = new String(json.total);
			s.prop34 = s.eVar34 = new Number(json.page) + 1;

			this.current_sort = {'sort': json.sort, sort_direction: json.sort_direction};
			var sort_arrows = $$('img.sort_arrow');
			var sort_arrow_obj = $('sort_arrow_' + this.current_sort.sort);
			for (var i = 0, size = sort_arrows.size(); i < size; i++) {
				sort_arrows[i].src = '/images/spacer.gif';
			}
			if (sort_arrow_obj) {
				if (this.current_sort.sort_direction == 'ASC') {
					sort_arrow_obj.src = '/images/sort_asc.gif';
				} else {
					sort_arrow_obj.src = '/images/sort_desc.gif';
				}
			}

			// Reset processing flag
			this.processing_filter = false;

			// If there are any queued requests, process them
			if (this.queue_filter.keys().size() > 0) {
				this.apply_filter(this.queue_filter);
			} else {
				// Only redraw filters if there are no more queued
				// filter requests
				if (json.filters_changed != 0) {
					this.redraw_filters();
				} else {
					$('ajax_loading_indicator').hide();
				}
			}
		}
	},

	redraw_filters: function() {
		new Ajax.Request('/?page=search_redraw', {
			method: 'post',
			parameters: {'identifier': this.identifier, 'output_type': 'ajax', 'rand': generate_random_str(10)},
			onSuccess: (this.callback_redraw_filters).bind(this),
			onFailure: handle_failure,
			onException: handle_exception
		});
	},

	callback_redraw_filters: function(transport) {
		if (transport.responseText) {
			var json = transport.responseText.evalJSON();
			var filter_list = new OF_Filters(json.filters, json.applied_filters);
			var applied_filter_list = [];
			filter_list.redraw_all();
			$('ajax_loading_indicator').hide();
			find_num_redraws++;
		}
	}
});

var OF_ProList = Class.create({
	objectify: function(data) {
		var pro_objs = {};

		if (data) {
			for (var i = 0, size = data.size(); i < size; i++) {
				if (data[i]) {
					var pro_obj = new OF_Pro(data[i]);
					pro_objs[pro_obj.get_data('uid')] = pro_obj;
				}
			}
		}

		return pro_objs;
	}
});

var OF_Pro = Class.create({
	initialize: function(data) {
		this.data = data;
	},

	get_data: function(key) {
		return this.data[key];
	}
});

var OF_Filters = Class.create({
	initialize: function(filters, applied_filters) {
		if (typeof filters != 'undefined') {
			this.filters = filters;
		} else {
			this.filters = {};
		}
		if (typeof applied_filters != 'undefined') {
			this.applied_filters = applied_filters;
		} else {
			this.applied_filters = {};
		}
	},

	breadcrumbs: {},

	update_breadcrumbs: function(type, value) {
		var elem = $('workorder_service_breadcrumbs');
		if (!elem) {
			return;
		}

		// Keep the value passed.
		this.breadcrumbs[type] = value;

		// Only keep one of OS or Brand.
		if (type === 'os') {
			delete this.breadcrumbs['brand'];
		} else if (type === 'brand') {
			delete this.breadcrumbs['os'];
		}

		var caption = '';
		if (this.breadcrumbs['category_lvl1'] !== undefined) {
			caption = this.breadcrumbs['category_lvl1'];
		}
		if (this.breadcrumbs['category_lvl2'] !== undefined) {
			caption +=  ' :: ' + this.breadcrumbs['category_lvl2'];
		}
		if (this.breadcrumbs['category_lvl3'] !== undefined) {
			caption +=  ' :: ' + this.breadcrumbs['category_lvl3'];
		}
		if (this.breadcrumbs['attribute_lvl1'] !== undefined) {
			caption +=  ' :: ' + this.breadcrumbs['attribute_lvl1'];
		}
		if (this.breadcrumbs['os'] !== undefined) {
			caption +=  ' :: ' + this.breadcrumbs['os'];
		}
		if (this.breadcrumbs['brand'] !== undefined) {
			caption +=  ' :: ' + this.breadcrumbs['brand'];
		}

		// Update the caption on the page.
		elem.update('<span class="green">' + caption + '<\/span>');
	},

	redraw_all: function() {
		// Remove Tip observers for "view more" filter links. This fixes an
		// issue where it would take a long time to navigate away from this
		// page due to there being a ton of left over observers having to be
		// cleaned up all at once
		if ($$('.view_more')) {
			$$('.view_more').each(function(tip_event) { Tips.remove(tip_event); })
		}

		// Clear these breadcrumb values.
		delete this.breadcrumbs['category_lvl1'];
		delete this.breadcrumbs['category_lvl2'];
		delete this.breadcrumbs['category_lvl3'];
		delete this.breadcrumbs['attribute_lvl1'];
		delete this.breadcrumbs['os'];
		delete this.breadcrumbs['brand'];

		this.redraw_categories();
		this.redraw_attribute_lvl1s();
		this.redraw_oses();
		this.redraw_brands();
		this.redraw_pro_lists();
		this.redraw_filter_checkboxes();
		this.redraw_certifications();
		this.redraw_languages();

		if ($('filter_distance_value')) {
			$('filter_distance_value').value = this.applied_filters.distance;
			update_slider();
		}
	},

	redraw_categories: function() {
		var container = $('find_categories_filter');
		var filter = $('find_categories_filter_list');
		var clear = $('find_categories_filter_clear');
		if (container && filter && clear) {
			// Build list
			filter.update('');
			if (count(find_task_list) > 0) {

				// Draw category level 1's
				clear.hide();
				var list1_obj = new Element('ul');
				for (var i in find_task_list) {
					var item1_obj = new Element('li');
					if (this.applied_filters.category_lvl1 == i && !this.applied_filters.category_lvl2) {
						item1_obj.update('<span class="applied_filter">' + find_task_list[i].name + '<\/span> ');
					} else {
						item1_obj.update('<a href="javascript:void(0);" onclick="javascript:finder.filter_category_lvl1(' + i + '); return false;">' + find_task_list[i].name + '<\/a> ');
					}
					if (this.filters.categories && this.filters.categories[i]) {
						item1_obj.insert('<span class="pro_count">(' + addCommas(this.filters.categories[i].count) + ')<\/span>');
					} else {
						item1_obj.insert('<span class="pro_count">(0)<\/span>');
					}

					if (this.applied_filters.category_lvl1 == i) {
						this.update_breadcrumbs('category_lvl1', find_task_list[i].name);
						clear.show();
						// Draw category level 2's
						var list2_obj = new Element('ul');
						for (var j in find_task_list[i].lvl2s) {
							if ((!this.applied_filters.category_lvl2 && this.filters.categories && this.filters.categories[i] && this.filters.categories[i].category_lvl2s[j]) || this.applied_filters.category_lvl2 == j) {
								var item2_obj = new Element('li');
								if (this.applied_filters.category_lvl2 == j && !this.applied_filters.category_lvl3) {
									item2_obj.update('<span class="applied_filter">' + find_task_list[i].lvl2s[j].name + '<\/span> ');
								} else {
									item2_obj.update('<a href="javascript:void(0);" onclick="javascript:finder.filter_category_lvl2(' + j + '); return false;">' + find_task_list[i].lvl2s[j].name + '<\/a> ');
								}
								if (this.filters.categories && this.filters.categories[i] && this.filters.categories[i].category_lvl2s[j]) {
									item2_obj.insert('<span class="pro_count">(' + addCommas(this.filters.categories[i].category_lvl2s[j].count) + ')<\/span>');
								} else {
									item2_obj.insert('<span class="pro_count">(0)<\/span>');
								}

								if (this.applied_filters.category_lvl2 == j) {
									this.update_breadcrumbs('category_lvl2', find_task_list[i].lvl2s[j].name);
									if (Object.keys(find_task_list[i].lvl2s[j].lvl3s).indexOf('0') == -1) {
										var list3_obj = new Element('ul');
										for (var k in find_task_list[i].lvl2s[j].lvl3s) {
											if ((!this.applied_filters.category_lvl3 && this.filters.categories && this.filters.categories[i] && this.filters.categories[i].category_lvl2s[j] &&  this.filters.categories[i].category_lvl2s[j].category_lvl3s[k]) || this.applied_filters.category_lvl3 == k) {
												var item3_obj = new Element('li');
												if (this.applied_filters.category_lvl3 == k) {
													this.update_breadcrumbs('category_lvl3', find_task_list[i].lvl2s[j].lvl3s[k].name);
													item3_obj.update('<span class="applied_filter">' + find_task_list[i].lvl2s[j].lvl3s[k].name + '<\/span> ');
												} else {
													item3_obj.update('<a href="javascript:void(0);" onclick="javascript:finder.filter_category_lvl3(' + k + '); return false;">' + find_task_list[i].lvl2s[j].lvl3s[k].name + '<\/a> ');
												}
												if (this.filters.categories && this.filters.categories[i] && this.filters.categories[i].category_lvl2s[j] && this.filters.categories[i].category_lvl2s[j].category_lvl3s[k]) {
													item3_obj.insert('<span class="pro_count">(' + addCommas(this.filters.categories[i].category_lvl2s[j].category_lvl3s[k]) + ')<\/span>');
												} else {
													item3_obj.insert('<span class="pro_count">(0)<\/span>');
												}
												list3_obj.appendChild(item3_obj);
											}
										}
										item2_obj.appendChild(list3_obj);
									}
								}
								list2_obj.appendChild(item2_obj);
							}
						}
						item1_obj.appendChild(list2_obj);
					}
					list1_obj.appendChild(item1_obj);
				}
				filter.appendChild(list1_obj);
				container.show();
			} else {
				container.hide();
			}
		}
	},

	redraw_attribute_lvl1s: function() {
		// Build task list
		var container = $('find_categories_task');
		var filter = $('find_categories_task_list');
		var clear = $('find_categories_task_clear');
		if (container && filter && clear) {
			filter.update('');
			container.hide();
			if (this.applied_filters.attribute_lvl1 && find_attribute_lvl1[this.applied_filters.category_lvl1][this.applied_filters.attribute_lvl1]) {
				filter.update('<span class="applied_filter">' + find_attribute_lvl1[this.applied_filters.category_lvl1][this.applied_filters.attribute_lvl1] + '<\/span> ');
				if (this.filters.attribute_lvl1s) {
					this.update_breadcrumbs('attribute_lvl1', find_attribute_lvl1[this.applied_filters.category_lvl1][this.applied_filters.attribute_lvl1]);
					filter.insert('<span class="pro_count">(' + addCommas(this.filters.attribute_lvl1s[this.applied_filters.attribute_lvl1]) + ')<\/span>');
				} else {
					filter.insert('<span class="pro_count">(0)<\/span>');
				}
				clear.show();
				container.show();
			} else {
				clear.hide();
				if (this.filters.attribute_lvl1s &&
					count(this.filters.attribute_lvl1s) > 0
					) {
					var list_obj = new Element('ul');
					for (var i in this.filters.attribute_lvl1s) {
						var item_obj = new Element('li');
						item_obj.update('<a href="javascript:void(0);" onclick="javascript:finder.filter_attribute_lvl1(' + i + '); return false;">' + find_attribute_lvl1[this.applied_filters.category_lvl1][i] + '</a> ');
						item_obj.insert('<span class="pro_count">(' + addCommas(this.filters.attribute_lvl1s[i]) + ')<\/span>');
						list_obj.appendChild(item_obj);
					}
					filter.appendChild(list_obj);
					container.show();
				}
			}
		}
	},

	redraw_oses: function() {
		// Build operating system list
		var container = $('find_categories_os');
		var filter = $('find_categories_os_list');
		var clear = $('find_categories_os_clear');
		if (container && filter && clear) {
			filter.update('');
			container.hide();
			if (this.applied_filters.os && find_oses[this.applied_filters.os]) {
				// Update the OS part of the task breadcrumbs.
				this.update_breadcrumbs('os', find_oses[this.applied_filters.os]);

				filter.update('<span class="applied_filter">' + find_oses[this.applied_filters.os] + '<\/span> ');
				if (this.filters.oses && this.filters.oses[this.applied_filters.os]) {
					filter.insert('<span class="pro_count">(' + this.filters.oses[this.applied_filters.os] + ')<\/span>');
				} else if (find_oses[this.applied_filters.os] != 'Other') {
					filter.insert('<span class="pro_count">(0)<\/span>');
				}
				clear.show();
				container.show();
			} else {
				clear.hide();
				if (this.filters.oses &&
					count(this.filters.oses) > 0
					) {
					var list_obj = new Element('ul');
					var cnt = 0;
					for (var i in this.filters.oses) {
						var item_obj = new Element('li');
						item_obj.update('<a href="javascript:void(0);" onclick="javascript:finder.filter_os(' + i + '); return false;">' + find_oses[i] + '</a> ');
						item_obj.insert('<span class="pro_count">(' + addCommas(this.filters.oses[i]) + ')<\/span>');
						list_obj.appendChild(item_obj);
						cnt++;
						if (cnt >= 3) {
							break;
						}
					}
					filter.appendChild(list_obj);

					// Generate "more" flyout
					var total_rows = count(this.filters.oses);
					if (total_rows > 3) {
						var view_all_link = new Element('a', {'href': 'javascript:void(0);', 'class': 'view_more arrow_bullets_orange'});
						var more_content = '<ul class="find_filter_popup_lists">';
						var rows_per_column = (total_rows / Math.ceil(total_rows / 30));
						var row_count = 0;
						$H(find_oses).each((function(pair) {
							if (this.filters.oses[pair.key]) {
								more_content+= '<li>';
								more_content+= '<a href="javascript:void(0);" onclick="javascript:finder.filter_os(' + pair.key + '); return false;">' + find_oses[pair.key] + '</a> ';
								more_content+= '<span class="pro_count">(' + addCommas(this.filters.oses[pair.key]) + ')<\/span>';
								more_content+= '</li>';
								row_count++;
								if (row_count >= rows_per_column) {
									row_count = 0;
									more_content+= '</ul>';
									more_content+= '<ul class="find_filter_popup_lists">';
								}
							}
						}).bind(this));
						more_content+= '</ul>';
						new Tip(view_all_link, more_content, {title: 'Operating Systems', style: 'onforce', showOn: 'click', hook: {target: 'leftMiddle', tip: 'topRight'}, stem: 'rightTop', hideOn: {element: 'closeButton', event: 'click'}, closeButton: true});
						view_all_link.update('More');
						filter.appendChild(view_all_link);
					}

					container.show();
				}
			}
		}
	},

	redraw_brands: function() {
		// Build brands list
		var container = $('find_categories_brand');
		var filter = $('find_categories_brand_list');
		var clear = $('find_categories_brand_clear');
		if (container && filter && clear) {
			filter.update('');
			container.hide();
			if (this.applied_filters.brand && find_brands[this.applied_filters.brand]) {
				// Update the brands part of the task breadcrumbs.
				this.update_breadcrumbs('brand', find_brands[this.applied_filters.brand]);

				filter.update('<span class="applied_filter">' + find_brands[this.applied_filters.brand] + '<\/span> ');
				if (this.filters.brands && this.filters.brands[this.applied_filters.brand]) {
					filter.insert('<span class="pro_count">(' + this.filters.brands[this.applied_filters.brand] + ')<\/span>');
				} else if (find_brands[this.applied_filters.brand] != 'Other') {
					filter.insert('<span class="pro_count">(0)<\/span>');
				}
				clear.show();
				container.show();
			} else {
				clear.hide();
				if (this.filters.brands &&
					count(this.filters.brands) > 0
					) {
					var list_obj = new Element('ul');
					var cnt = 0;
					for (var i in this.filters.brands) {
						var item_obj = new Element('li');
						item_obj.update('<a href="javascript:void(0);" onclick="javascript:finder.filter_brand(' + i + '); return false;">' + find_brands[i] + '</a> ');
						item_obj.insert('<span class="pro_count">(' + addCommas(this.filters.brands[i]) + ')<\/span>');
						list_obj.appendChild(item_obj);
						cnt++;
						if (cnt >= 3) {
							break;
						}
					}
					filter.appendChild(list_obj);

					// Generate "more" flyout
					var total_rows = count(this.filters.brands);
					if (total_rows > 3) {
						var view_all_link = new Element('a', {'href': 'javascript:void(0);', 'class': 'view_more arrow_bullets_orange'});
						var more_content = '<ul class="find_filter_popup_lists">';
						var rows_per_column = (total_rows / Math.ceil(total_rows / 30));
						var row_count = 0;
						$H(find_brands).each((function(pair) {
							if (this.filters.brands[pair.key]) {
								more_content+= '<li>';
								more_content+= '<a href="javascript:void(0);" onclick="javascript:finder.filter_brand(' + pair.key + '); return false;">' + find_brands[pair.key] + '</a> ';
								more_content+= '<span class="pro_count">(' + addCommas(this.filters.brands[pair.key]) + ')<\/span>';
								more_content+= '</li>';
								row_count++;
								if (row_count >= rows_per_column) {
									row_count = 0;
									more_content+= '</ul>';
									more_content+= '<ul class="find_filter_popup_lists">';
								}
							}
						}).bind(this));
						more_content+= '</ul>';
						new Tip(view_all_link, more_content, {title: 'Brands', style: 'onforce', showOn: 'click', hook: {target: 'leftMiddle', tip: 'topRight'}, stem: 'rightTop', hideOn: {element: 'closeButton', event: 'click'}, closeButton: true});
						view_all_link.update('More');
						filter.appendChild(view_all_link);
					}

					container.show();
				}
			}
		}
	},

	redraw_pro_lists: function() {
		var container = $('find_pro_lists');
		var filter = $('find_pro_lists_list');
		var clear = $('find_lists_filter_clear');
		if (container && filter && clear) {
			if (this.applied_filters.list && this.filters.lists) {
				filter.update('<span class="applied_filter">' + this.applied_filters.list + '<\/span> ');
				filter.insert('<span class="pro_count">(' + (this.filters.lists[this.applied_filters.list] ? addCommas(this.filters.lists[this.applied_filters.list]) : 0) + ')<\/span>');
				clear.show();
				container.show();
			} else {
				clear.hide();
				// Build list
				filter.update('');
				if (this.filters.lists &&
					count(this.filters.lists) > 0
					) {
					var cnt = 0;
					var list_obj = new Element('ul');
					for (var i in this.filters.lists) {
						var item_obj = new Element('li');
						item_obj.update('<a href="javascript:void(0);" onclick="javascript:finder.filter_list(\'' + i + '\'); return false;">' + i + '<\/a> ');
						item_obj.insert('<span class="pro_count">(' + (this.filters.lists[i] ? addCommas(this.filters.lists[i]) : 0) + ')<\/span>');
						list_obj.appendChild(item_obj);
						cnt++;
						if (cnt >= 3) {
							break;
						}
					}
					filter.appendChild(list_obj);

					// Generate "more" flyout
					var total_rows = count(this.filters.lists);
					if (total_rows > 3) {
						var view_all_link = new Element('a', {'href': 'javascript:void(0);', 'class': 'view_more arrow_bullets_orange'});
						var more_content = '<ul class="find_filter_popup_lists">';
						var rows_per_column = (total_rows / Math.ceil(total_rows / 30));
						var row_count = 0;
						$H(find_lists).each((function(pair) {
							if (this.filters.lists[pair.value]) {
								more_content+= '<li>';
								more_content+= '<a href="javascript:void(0);" onclick="javascript:finder.filter_list(\'' + pair.value + '\'); return false;">' + pair.value + '</a> ';
								more_content+= '<span class="pro_count">(' + addCommas(this.filters.lists[pair.value]) + ')<\/span>';
								more_content+= '</li>';
								row_count++;
								if (row_count >= rows_per_column) {
									row_count = 0;
									more_content+= '</ul>';
									more_content+= '<ul class="find_filter_popup_lists">';
								}
							}
						}).bind(this));
						more_content+= '</ul>';
						new Tip(view_all_link, more_content, {title: 'My Pro Lists', style: 'onforce', showOn: 'click', hook: {target: 'leftMiddle', tip: 'topRight'}, stem: 'rightTop', hideOn: {element: 'closeButton', event: 'click'}, closeButton: true});
						view_all_link.update('More');
						filter.appendChild(view_all_link);
					}

					container.show();
				} else {
					container.hide();
				}
			}
		}
	},

	redraw_filter_checkboxes: function() {
		if ($('find_checkboxes_filter_clear')) {
			$('find_checkboxes_filter_clear').hide();
		}
		if (this.applied_filters.ppn && this.applied_filters.ppn == true) {
			if ($('filters_ppn')) {
				$('filters_ppn').checked = true;
			}
			if ($('filters_ppn_label')) {
				$('filters_ppn_label').addClassName('applied_filter');
			}
			$('find_checkboxes_filter_clear').show();
		} else {
			if ($('filters_ppn_label')) {
				$('filters_ppn_label').removeClassName('applied_filter');
			}
		}
		if (this.applied_filters.previouslyused && this.applied_filters.previouslyused == true) {
			if ($('filters_previously_used')) {
				$('filters_previously_used').checked = true;
			}
			if ($('filters_previously_used_label')) {
				$('filters_previously_used_label').addClassName('applied_filter');
			}
			$('find_checkboxes_filter_clear').show();

			if ($('filters_previously_used_loc_container')) {
				$('filters_previously_used_loc_container').show();
			}
		} else {
			if ($('filters_previously_used_label')) {
				$('filters_previously_used_label').removeClassName('applied_filter');
			}

			if ($('filters_previously_used_loc_label')) {
				$('filters_previously_used_loc_label').removeClassName('applied_filter');
			}
			if ($('filters_previously_used_loc_container')) {
				$('filters_previously_used_loc_container').hide();
			}
		}
		if (this.applied_filters.previouslyusedlocation && this.applied_filters.previouslyusedlocation == true) {
			if ($('filters_previously_used_loc')) {
				$('filters_previously_used_loc').checked = true;
				$('filters_previously_used').checked = true;
				$('filters_previously_used').disabled = true;
			}
			if ($('filters_previously_used_loc_label')) {
				$('filters_previously_used_loc_label').addClassName('applied_filter');
			}

			if ($('find_checkboxes_filter_clear'))
			{
				$('find_checkboxes_filter_clear').show();
			}
		} else {
			if ($('filters_previously_used_loc_label')) {
				$('filters_previously_used_loc_label').removeClassName('applied_filter');
			}
		}
		if (this.applied_filters.drugtest && this.applied_filters.drugtest == true) {
			if ($('filters_drug_tested')) {
				$('filters_drug_tested').checked = true;
			}
			if ($('filters_drug_tested_label')) {
				$('filters_drug_tested_label').addClassName('applied_filter');
			}
			$('find_checkboxes_filter_clear').show();
		} else {
			if ($('filters_drug_tested_label')) {
				$('filters_drug_tested_label').removeClassName('applied_filter');
			}
		}
		if (this.applied_filters.recognitionlevel && this.applied_filters.recognitionlevel == 3) {
			if ($('filters_powerpro')) {
				$('filters_powerpro').checked = true;
			}
			if ($('filters_powerpro_label')) {
				$('filters_powerpro_label').addClassName('applied_filter');
			}
			$('find_checkboxes_filter_clear').show();
		} else {
			if ($('filters_powerpro_label')) {
				$('filters_powerpro_label').removeClassName('applied_filter');
			}
		}
		if (this.applied_filters.backgroundcheck && this.applied_filters.backgroundcheck == true) {
			if ($('filters_bg_checked')) {
				$('filters_bg_checked').checked = true;
			}
			if ($('filters_bg_checked_label')) {
				$('filters_bg_checked_label').addClassName('applied_filter');
			}
			$('find_checkboxes_filter_clear').show();
		} else {
			if ($('filters_bg_checked_label')) {
				$('filters_bg_checked_label').removeClassName('applied_filter');
			}
		}
		if (this.applied_filters.proids) {
			if ($('pro_ids')) {
				$('pro_ids').value = this.applied_filters.proids;
			}
			$('find_proids_filter_clear').show();
		} else {
			$('find_proids_filter_clear').hide();
		}
		if (this.applied_filters.insurance && this.applied_filters.insurance == 'any') {
			if ($('filters_insurance_any')) {
				$('filters_insurance_any').checked = true;
			}
			if ($('filters_insurance_any_label')) {
				$('filters_insurance_any_label').addClassName('applied_filter');
			}
			if ($('find_insurance_filter_clear')) {
				$('find_insurance_filter_clear').show();
			}
		} else {
			if ($('filters_insurance_any')) {
				$('filters_insurance_any').checked = false;
			}
			if ($('filters_insurance_any_label')) {
				$('filters_insurance_any_label').removeClassName('applied_filter');
			}
		}
		if (this.applied_filters.insurance_gl && this.applied_filters.insurance_gl == 500000) {
			if ($('filters_insurance_gl_5')) {
				$('filters_insurance_gl_5').checked = true;
			}
			if ($('filters_insurance_gl_5_label')) {
				$('filters_insurance_gl_5_label').addClassName('applied_filter');
			}
			if ($('filters_insurance_gl_10')) {
				$('filters_insurance_gl_10').checked = false;
			}
			if ($('filters_insurance_gl_10_label')) {
				$('filters_insurance_gl_10_label').removeClassName('applied_filter');
			}
			if ($('find_insurance_filter_clear')) {
				$('find_insurance_filter_clear').show();
			}
		} else if (this.applied_filters.insurance_gl && this.applied_filters.insurance_gl == 1000000) {
			if ($('filters_insurance_gl_5')) {
				$('filters_insurance_gl_5').checked = false;
			}
			if ($('filters_insurance_gl_5_label')) {
				$('filters_insurance_gl_5_label').removeClassName('applied_filter');
			}
			if ($('filters_insurance_gl_10')) {
				$('filters_insurance_gl_10').checked = true;
			}
			if ($('filters_insurance_gl_10_label')) {
				$('filters_insurance_gl_10_label').addClassName('applied_filter');
			}
			$('find_insurance_filter_clear').show();
		} else {
			if ($('filters_insurance_gl_5')) {
				$('filters_insurance_gl_5').checked = false;
			}
			if ($('filters_insurance_gl_5_label')) {
				$('filters_insurance_gl_5_label').removeClassName('applied_filter');
			}
			if ($('filters_insurance_gl_10')) {
				$('filters_insurance_gl_10').checked = false;
			}
			if ($('filters_insurance_gl_10_label')) {
				$('filters_insurance_gl_10_label').removeClassName('applied_filter');
			}
		}
		if (this.applied_filters.insurance_eo && this.applied_filters.insurance_eo == 500000) {
			if ($('filters_insurance_eo_5')) {
				$('filters_insurance_eo_5').checked = true;
			}
			if ($('filters_insurance_eo_5_label')) {
				$('filters_insurance_eo_5_label').addClassName('applied_filter');
			}
			if ($('filters_insurance_eo_10')) {
				$('filters_insurance_eo_10').checked = false;
			}
			if ($('filters_insurance_eo_10_label')) {
				$('filters_insurance_eo_10_label').removeClassName('applied_filter');
			}
			if ($('find_insurance_filter_clear')) {
				$('find_insurance_filter_clear').show();
			}
		} else if (this.applied_filters.insurance_eo && this.applied_filters.insurance_eo == 1000000) {
			if ($('filters_insurance_eo_5')) {
				$('filters_insurance_eo_5').checked = false;
			}
			if ($('filters_insurance_eo_5_label')) {
				$('filters_insurance_eo_5_label').removeClassName('applied_filter');
			}
			if ($('filters_insurance_eo_10')) {
				$('filters_insurance_eo_10').checked = true;
			}
			if ($('filters_insurance_eo_10_label')) {
				$('filters_insurance_eo_10_label').addClassName('applied_filter');
			}
			if ($('find_insurance_filter_clear')) {
				$('find_insurance_filter_clear').show();
			}
		} else {
			if ($('filters_insurance_eo_5')) {
				$('filters_insurance_eo_5').checked = false;
			}
			if ($('filters_insurance_eo_5_label')) {
				$('filters_insurance_eo_5_label').removeClassName('applied_filter');
			}
			if ($('filters_insurance_eo_10')) {
				$('filters_insurance_eo_10').checked = false;
			}
			if ($('filters_insurance_eo_10_label')) {
				$('filters_insurance_eo_10_label').removeClassName('applied_filter');
			}
		}
		if (!this.applied_filters.insurance && !this.applied_filters.insurance_gl && !this.applied_filters.insurance_eo) {
			if ($('find_insurance_filter_clear')) {
				$('find_insurance_filter_clear').hide();
			}
		}
	},

	redraw_certifications: function() {
		var container = $('find_certifications_filter');
		var filter = $('find_certifications_filter_list');
		var clear = $('find_certifications_filter_clear');
		if (container && filter && clear) {
			if (this.applied_filters.certifier && find_certifications[this.applied_filters.certifier]) {
				clear.show();
				// Build list
				filter.update('');
				var list_obj = new Element('ul');
				var item_obj = new Element('li');
				item_obj.update('<span class="applied_filter">' + find_certifications[this.applied_filters.certifier].name + '<\/span> ');
				var cnt = 0;
				if (this.applied_filters.certification && find_certifications[this.applied_filters.certifier].certs[this.applied_filters.certification]) {
					var list2_obj = new Element('ul');
					var item2_obj = new Element('li');
					item2_obj.update('<span class="applied_filter">' + find_certifications[this.applied_filters.certifier].certs[this.applied_filters.certification] + '<\/span> ');
					list2_obj.appendChild(item2_obj);
					item_obj.appendChild(list2_obj);
				} else {
					if (this.filters.certifications && this.filters.certifications[this.applied_filters.certifier]) {
						var list2_obj = new Element('ul');
						for (var i in this.filters.certifications[this.applied_filters.certifier].certifications) {
							var item2_obj = new Element('li');
							item2_obj.update('<a href="javascript:void(0);" onclick="javascript:finder.filter_certification(' + i + '); return false;">' + find_certifications[this.applied_filters.certifier].certs[i] + '</a> ');
							list2_obj.appendChild(item2_obj);
							cnt++;
							if (cnt >= 3) {
								break;
							}
						}
						item_obj.appendChild(list2_obj);
					}
				}
				list_obj.appendChild(item_obj);
				filter.appendChild(list_obj);

				// Generate "more" flyout
				if (!this.applied_filters.certification && this.filters.certifications && this.filters.certifications[this.applied_filters.certifier]) {
					var total_rows = count(this.filters.certifications[this.applied_filters.certifier].certifications);
					if (total_rows > 3) {
						var view_all_link = new Element('a', {'href': 'javascript:void(0);', 'class': 'view_more arrow_bullets_orange'});
						var more_content = '<ul class="find_filter_popup_lists">';
						var rows_per_column = (total_rows / Math.ceil(total_rows / 30));
						var row_count = 0;
						$H(find_certifications[this.applied_filters.certifier].certs).each((function(pair) {
							if (this.filters.certifications[this.applied_filters.certifier].certifications[pair.key]) {
								more_content+= '<li><a href="javascript:void(0);" onclick="javascript:finder.filter_certification(' + pair.key + '); return false;">' + find_certifications[this.applied_filters.certifier].certs[pair.key] + '</a></li>';
								row_count++;
								if (row_count >= rows_per_column) {
									row_count = 0;
									more_content+= '</ul>';
									more_content+= '<ul class="find_filter_popup_lists">';
								}
							}
						}).bind(this));
						more_content+= '</ul>';
						new Tip(view_all_link, more_content, {title: 'Certifications', style: 'onforce', showOn: 'click', hook: {target: 'leftMiddle', tip: 'topRight'}, stem: 'rightTop', hideOn: {element: 'closeButton', event: 'click'}, closeButton: true});
						view_all_link.update('More');
						filter.appendChild(view_all_link);
					}
				}

				container.show();
			} else {
				clear.hide();
				// Build list
				filter.update('');
				if (count(this.filters.certifications) > 0) {
					var cnt = 0;
					var list_obj = new Element('ul');
					for (var i in this.filters.certifications) {
						var item_obj = new Element('li');
						item_obj.update('<a href="javascript:void(0);" onclick="javascript:finder.filter_certifier(' + i + '); return false;">' + find_certifications[i].name + '</a> ');
						//item_obj.insert('<span class="pro_count">(' + addCommas(this.filters.certifications[i].count) + ')<\/span>');
						list_obj.appendChild(item_obj);
						cnt++;
						if (cnt >= 3) {
							break;
						}
					}
					filter.appendChild(list_obj);

					// Generate "more" flyout
					var total_rows = count(this.filters.certifications);
					if (total_rows > 3) {
						var view_all_link = new Element('a', {'href': 'javascript:void(0);', 'class': 'view_more arrow_bullets_orange'});
						var more_content = '<ul class="find_filter_popup_lists">';
						var rows_per_column = (total_rows / Math.ceil(total_rows / 30));
						var row_count = 0;
						$H(find_certifications).each((function(pair) {
							if (this.filters.certifications[pair.key]) {
								more_content+= '<li><a href="javascript:void(0);" onclick="javascript:finder.filter_certifier(' + pair.key + '); return false;">' + find_certifications[pair.key].name + '</a></li>';
								row_count++;
								if (row_count >= rows_per_column) {
									row_count = 0;
									more_content+= '</ul>';
									more_content+= '<ul class="find_filter_popup_lists">';
								}
							}
						}).bind(this));
						more_content+= '</ul>';
						new Tip(view_all_link, more_content, {title: 'Certifiers', style: 'onforce', showOn: 'click', hook: {target: 'leftMiddle', tip: 'topRight'}, stem: 'rightTop', hideOn: {element: 'closeButton', event: 'click'}, closeButton: true});
						view_all_link.update('More');
						filter.appendChild(view_all_link);
					}

					container.show();
				} else {
					container.hide();
				}
			}
		}
	},

	redraw_languages: function() {
		var container = $('find_language_filter');
		var filter = $('find_language_filter_list');
		var clear = $('find_language_filter_clear');
		if (container && filter && clear) {
			if (this.applied_filters.language && find_languages[this.applied_filters.language]) {
				clear.show();
				filter.update('<span class="applied_filter">' + find_languages[this.applied_filters.language] + '<\/span> ');
				container.show();
			} else {
				clear.hide();
				// Build list
				filter.update('');
				if (count(this.filters.language) > 0) {
					var cnt = 0;
					var list_obj = new Element('ul');
					for (var i in this.filters.language) {
						var item_obj = new Element('li');
						item_obj.update('<a href="javascript:void(0);" onclick="javascript:finder.filter_language(' + i + '); return false;">' + find_languages[i] + '<\/a> ');
						list_obj.appendChild(item_obj);
						cnt++;
						if (cnt >= 3) {
							break;
						}
					}
					filter.appendChild(list_obj);

					// Generate "more" flyout
					var total_rows = count(this.filters.language);
					if (total_rows > 3) {
						var view_all_link = new Element('a', {'href': 'javascript:void(0);', 'class': 'view_more arrow_bullets_orange'});
						var more_content = '<ul class="find_filter_popup_lists">';
						var rows_per_column = (total_rows / Math.ceil(total_rows / 30));
						var row_count = 0;
						$H(find_languages).each((function(pair) {
							if (this.filters.language[pair.key]) {
								more_content+= '<li><a href="javascript:void(0);" onclick="javascript:finder.filter_language(' + pair.key + '); return false;">' + find_languages[pair.key] + '</a></li>';
								row_count++;
								if (row_count >= rows_per_column) {
									row_count = 0;
									more_content+= '</ul>';
									more_content+= '<ul class="find_filter_popup_lists">';
								}
							}
						}).bind(this));
						more_content+= '</ul>';
						new Tip(view_all_link, more_content, {title: 'Languages', style: 'onforce', showOn: 'click', hook: {target: 'leftMiddle', tip: 'topRight'}, stem: 'rightTop', hideOn: {element: 'closeButton', event: 'click'}, closeButton: true});
						view_all_link.update('More');
						filter.appendChild(view_all_link);
					}

					container.show();
				} else {
					container.hide();
				}
			}
		}
	}
});

function show_selected_pros() {
	var url = '/?page=selected_pros&identifier=' + find_identifier;
	jQuery.fn.colorbox({href:url, width:'900px', height:'500px', iframe:true, speed:0, overlayClose:false, opacity:0.5, title:'My Selected Pros'});
}

function show_pro_profile(proid, display) {
	var url = '/?page=pro_view&id=' + proid + '&popup=1&identifier=' + find_identifier;
	if (typeof display != 'undefined') {
		url+= '&display=' + display;
	}
	jQuery.fn.colorbox({href:url, width:'900px', height:'500px', iframe:true, speed:0, overlayClose:false, opacity:0.5, title:'Pro Profile'});
}

function show_add_to_list(proid) {
	var url = '/?page=buyer_list_add_pro&proid=' + proid;
	jQuery.fn.colorbox({href:url, width:'300px', height:'260px', iframe:true, speed:0, overlayClose:false, opacity:0.5, title:'Add to List'});
}

function resize_ajax_activity_indicator() {
	if ($('finder_pro_list') && $('ajax_loading_indicator')) {
		var offset = $('finder_pro_list').cumulativeOffset();
		$('ajax_loading_indicator').style.left = offset[0] + 'px';
		$('ajax_loading_indicator').style.top = offset[1] + 'px';
		$('ajax_loading_indicator').style.width = $('finder_pro_list').getWidth() + 'px';
		$('ajax_loading_indicator').style.height = $('finder_pro_list').getHeight() + 'px';
	}
}

function handle_exception(requester, e) {
	// Reset server request queue
	finder.processing_filter = false;
	finder.processing_select = false;

	if (find_debug_mode) {
		var msg = 'EXCEPTION\n';
		msg+= '---------------------------------\n';
		msg+= 'NAME: ' + e.name + '\n';
		msg+= 'MESSAGE: ' + e.message + '\n';
		alert(msg);
	}
}

function handle_failure() {
	if (find_debug_mode) {
		alert('Connection failure');
	}
}

function count(arr) {
	var cnt = 0;
	for (var i in arr) {
		if (!is_callable(arr[i])) {
			cnt++;
		}
	}
	return cnt;
}

function is_callable(a) {
	return (typeof a == 'function');
}

function location_autocomplete_lookup(searchString, suggest) {
	var url = '/?page=location_suggest';
	new Ajax.Request(url, {
		parameters: {location: searchString, output_type: 'ajax', rand: generate_random_str(10)},
		onSuccess: function(response) {suggest(response.responseJSON.locations);}
	});
}

var find_task_list = undefined;
var find_attribute_lvl1 = undefined;
var find_certifications = undefined;
var find_languages = undefined;
var find_brands = undefined;
var find_oses = undefined;
var find_lists = undefined;
var find_max_dist = undefined;
var find_dist_units = undefined;
var find_recognition_levels = undefined;
var find_can_edit_lists = false;
var find_logged_in = false;
var find_debug_mode = false;
var find_num_redraws = 0;
var find_displaymode = undefined;
var find_location_suggestion_queue = new Array();
