var TipBox = function(e, html) {
	var $ = jQuery;

	var klass = this;
	var attached_element = e;
	var enabled = true;
	var element = $('<div class="tip_box"><div class="inner"/><div class="bottom"/></div>');

	var initialize = function() {
        element.css('visibility', 'hidden');
	    klass.setHtml(html);
    	element.appendTo('#search');
		element.click(function() {
			klass.hide();
		});	
    };
    
    var calculateHeight = function() {
        var height = 0;
        element.children().each(function() {
            height = height + $(this).outerHeight();
        });
        return height;
    };

	this.setHtml = function(html) {
	    element.find('.inner').html(html);
	};
	
	this.show = function() {
		if (enabled) {
			var offset = $(attached_element).position();
			var height = calculateHeight();
			var top = offset.top - height - 3;
			var left = offset.left + ($(attached_element).width() / 2) - (element.width() / 2);
		    element.css({
		        height: height,
		        visibility: 'visible',
		        top: top,
		        left: left
		    }).hide().fadeIn(1500);
		}
	};
	
	this.hide = function() {
		element.fadeOut(1500, function() {
			$(this).css('visibility', 'hidden').show();
		});
	};
	
	this.enable = function(e) {
		enabled = e;
	};

	initialize();
};

var Listing = new function() {
	var $ = jQuery;
	
	return {
		formatDaysOnMarket: function(days) {
			if (days == null) { return ''; }
			else { return 'Days on site: ' + days; }
		},
		formatTitle: function(string) {
			if (string == null) { return ''; }
			string = string.toLowerCase();
			string = string.replace(/\b(\w)/g,
			function (w, p1) { return p1.toUpperCase(); });
			return string;
		},
		formatOpenHouses: function(open_house_dates) {
			if (open_house_dates == null) { return ''; }
			date = open_house_dates[0];

            var string = '<strong>Open House:</strong> ' + date.d;
            if (date.t != '') string += ', <strong>' + date.t + '</strong>';
            
			if (open_house_dates.length > 1) {
				string += '<br /><small>More dates in details</small>';
			}
			return string;
		},
		formatCurrency: function(num) {
			if (isNaN(num)) { return num; }
			num = num.toString().replace(/\$|\,/g,'');
			if (isNaN(num)) { num = '0'; }
			sign = (num == (num = Math.abs(num)));
			num = Math.floor(num*100+0.50000000001);
			num = Math.floor(num/100).toString();
			for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
			num = num.substring(0,num.length-(4*i+3))+','+
			num.substring(num.length-(4*i+3));
			return (((sign)?'':'-') + '$' + num);
		},
		formatPropertyClass: function(property_class_id) {
			switch (property_class_id) {
		      case 1:
				return 'Single Family';
		      case 2:
				return 'Condo/Townhouse';
		      case 3:
				return 'Residential Income';
		      case 4:
				return 'Mobile Home';
		      case 5:
				return 'Lotsreturn  and Land';
		      case 6:
				return 'Commercial Lots and Land';
		      case 7:
				return 'Commercial Industrial';
		      default:
		        return 'Any';
			}
		},
		formatStatusCode: function(status_code) {
			switch (status_code) {
				case 1:
					return 'Active';
				case 2:
					return 'Pending';
				case 3:
					return 'Pending';
				case 4:
					return 'Pending';
				case 5:
					return 'Sold';
				case 6:
					return 'Expired';
				case 7:
					return 'Cancelled';
				case 8:
					return 'Withdrawn';
				default:
					return 'Unknown';
			}
		},
		formatDataSourceIcon: function(data_source_id) {
			switch (data_source_id) {
				case 1:
					return '<img src="/images/providers/reil_ble.gif"/>';
				case 2:
					return '<img src="/images/providers/maxebrd.jpg"/>';
				case 3:
					return '<img src="/images/providers/cf_logo_cma.png" width="74" height="15"/>';
				case 4:
					return '<img src="/images/providers/sbmls.png" width="40" height="15"/>';
                case 5:
					return '<img src="/images/providers/abor.gif" width="36" height="15"/>';
                case 6:
					return '<img src="/images/providers/metrolist.jpg" width="43" height="15"/>';
                case 7:
					return '<img src="/images/providers/socal_mls.gif" width="18" height="15"/>';
                case 8:
                    return '<img src="/images/providers/bareis.jpg" width="34" height="15"/>';
                case 9:
                    return '<img src="/images/providers/sfar.jpg" width="40" height="15"/>';
                case 14:
                    return '<img src="/images/providers/tsmls.png" width="20" height="15"/>';
                case 17:
                    return '<img src="/images/providers/wpmls.png" width="35" height="15"/>';
                case 18:
                    return '<img src="/images/providers/fmls.png" width="35" height="15"/>';
				default:
					return '';
			}
		},
		isValidValue: function(value) {
			return !((value == null) || (value == 0));
		},
		basicDetails: function(listing) {
			var details = {};
			if (Listing.isValidValue(listing.f)) { $.extend(details, { 'bedrooms': listing.f }); }
			if (Listing.isValidValue(listing.g)) { $.extend(details, { 'baths': listing.g }); }
			if (Listing.isValidValue(listing.h)) { $.extend(details, { 'sqft.': listing.h }); }
			if (Listing.isValidValue(listing.i)) { $.extend(details, { 'lot sqft.': listing.i }); }
			return details;
		},
		formattedDetails: function(details_arr) {
			details = '';
			for (detail in details_arr) {
				details = details + '<span>'+details_arr[detail]+' '+detail+'</span>';
			}
			return details;
		},
		formattedDetailsTable: function(details_arr) {
			details = '';
			for (detail in details_arr) {
				details = details + '<tr><td class="detail">'+Listing.formatTitle(detail)+'</td><td class="value">'+details_arr[detail]+'</td></tr>';
			}
			return '<table class="basic_table_info" border="0" cellspacing="0" cellpadding="0">'+details+'</table>';
		}
	};
};
var Search = new Singleton(function($) {
	var klass = this;
	
	this.active			= [];
	this.active_count	= 0;
	this.current_page   = 0;
	this.current_slide  = {};
	this.pagination		= 20;
	this.initialSlide   = '';
	this.defaultOptions = [];
	
	this.maxListings;
	this.previous_view;
	this.current_view;
	this.changedLocation;
    this.propertyAlertTip;

	this.methods({
	    getListingData: function(field) {
			var results = $.ajax({
				url: '/searches/listing_data',
				data: {
					awesome_search: $('#search_awesome_search').val(),
					field: field
				},
				dataType: 'json',
				async: false
			 }).responseText;
			
			return eval(results);
		},
		getListingAreas: function() {
			return this.getListingData('listing_area');
		},
		updateCustomJavascript: function(element, custom_function) {
            element.find(':input.multiSelect').val('Loading...');
            var options = eval(custom_function);
			// If the multi select already exists
			var old_values;
			if (element.find('select.multiselect').length == 0) { old_values = Search.recreateMultiSelect(element); }
			else { old_values = []; }
			if (old_values.length == 0) { old_values = element.find('span.saved_values').text().split(', '); }
			
			var select = element.find('select.multiselect').removeOption(/./);
			for (var i = 0, l = options.length; i < l; i++) {
				var selected = ($.inArray(options[i][0] + '', old_values) == -1) ? false : true;
				select.addOption(options[i][0], options[i][1], selected);
			}
			
			element.find('select.multiselect').multiSelect({ inputClass: 'value' });
			element.find('div.multiSelectOptions').bgiframe();	
		},
		updateAllCustomJavascript: function() {
			$('#advanced_search_values li.advanced_search_item').each(function() {
				var custom_function = $(this).find('.custom_javascript').text();
				if (custom_function != '') {
					Search.updateCustomJavascript($(this), custom_function);
				}
			});
		},
		removeAllCustomJavascript: function() {
			$('#advanced_search_values li.advanced_search_item').each(function() {
				var custom_function = $(this).find('.custom_javascript').text();
				if (custom_function != '') {
				    Search.filters.removeFromSearch($(this));
				}
			});
			Search.listings.filter();
		},
		recreateMultiSelect: function(element) {
			var option_id = element.find('input.option_id').val();
			var old_values = $.map(element.find('.multiSelectOptions input').serializeArray(), function(i) { return i.value; });
			element.find('input.multiSelect, div.multiSelectOptions').remove();
			element.find('.custom_javascript').before($('<select multiple="multiple"/>').attr({
				id: 'search_advanced_value_attributes_'+option_id+'_value',
				name: 'search[advanced_value_attributes]['+option_id+'][value][]',
				'class': 'value multiselect'
			}));
			return old_values;
		},
		switchView: function(view, do_not_load) {
		    if (view != klass.current_view) {
    		    if (!klass.current_view) { klass.current_view = view; }

    			if (view == 'single') {
    				$('#listings .h1 .pagination').hide();
    			}
    			else {
    				$('#listings .h1 .pagination').show();
    			}
			    
			    if (klass.current_view) {
        			element = $('#' + klass.current_view + '_listings');
        			element.parent().height(element.height()).end().fadeOut(700);
        			$('#' + view + '_listings').fadeIn(700, function() { element.parent().height('auto'); Search.fixHeight(); });
        			klass.previous_view = klass.current_view;
			    }
			    
    			klass.current_view = view;
    			Search.fixView();
    			
    			if (!do_not_load) {
        			Search.listings.load(Search.active, view);
    			}
    		}
		},
		fixView: function() {
		    switch (Search.current_view) {
    			case 'map':
    			    $('#google_street_map').hide();
    			    $('#google_map').appendTo($('#map_listings')).css('margin', '0px auto')
    				.effect('size', { to: { height: 600, width: 800 }, scale: 'box' }, 1000, function() {
    					SearchMap.resize();
    				});
    				break;
    			case 'gallery':
    			    $('#google_map').appendTo($('#gallery_listings')).css('margin', '15px 0px')
    				.effect('size', { to: { height: 450, width: 430 }, scale: 'box' }, 1000, function() {
    					SearchMap.resize();
    				});
    				break;
    		}
		},
		setSort: function(value) {
			$('#search_sort_by').val(value);
			var optgroup = $('#sort_listings').find('option[value='+value+']').parent().attr('label');
			$('#sort_listings').prev('.sort_text').text('Sort by ' + optgroup + ': ');
		},
		setSlide: function(element) {
			klass.current_slide.link = element.attr('rel');
			klass.current_slide.hash = element.attr('href');
			$('#search_content .slide_container').find('.active').removeClass('active');
			$(klass.current_slide.hash).addClass('active');
		},
		loadSlide: function(element) {		
			var content = $(element).children('.content');
			if (content.html() == '') {
				content.append('<img src="/images/loading_icons/loading_ffffff.gif" style="display: block; margin: 15px auto"/>');
				$.getScript(klass.current_slide.link);
			}
			else { Search.fixHeight(); }
			return false;
		},
		fixHeight: function() {
			var height = $('#search_content div.slide.active').outerHeight();
			$('#search_content').animate({ height: height }, 1000);
		},
		submitAwesomeSearch: function() {
		    $('#search_awesome_search').val($('#awesome_search').val());
		    Search.changedLocation = true;
            Search.listings.filter();
		},
		moveSliders: function(values) {
			$('#search_min_price').selectOptions(values.min_price + '', true).change();
			$('#search_max_price').selectOptions(values.max_price + '', true).change();
			Search.filters.displaySliderValues($('#basic_options .option.price'));
			
			$('#search_min_beds').selectOptions(values.min_beds + '', true).change();
			$('#search_max_beds').selectOptions(values.max_beds + '', true).change();
			Search.filters.displaySliderValues($('#basic_options .option.bedrooms'));
			
			$('#search_min_baths').selectOptions(values.min_baths + '', true).change();
			$('#search_max_baths').selectOptions(values.max_baths + '', true).change();
			Search.filters.displaySliderValues($('#basic_options .option.baths'));
		},
		toggleCheckbox: function(element) {
        	var element = jQuery(element);
        	if (element.attr('checked')) {
        		element.attr('value', '1');
        		element.next().removeAttr('name');
        	}
        	else {
        		var elem_name = element.attr('name');
        		element.attr('value', '0');
        		element.next().attr('name', elem_name);
        	}
        }
	});
});

Search.namespace('listings', function($) {
    this.temp_html = [];
    this.callbacks = {
        before: {
            gallery: function() {
                SearchMap.properties.hideActive();
            },
            map: function() {
                SearchMap.properties.hideActive();
            }
        },
        after: {
            single: function() {
                Search.listings.details(Search.active[0].k);
            },
            list: function() {
                $('#list_listings ul').html(Search.listings.temp_html.join(''));
                $('#list_listings ul .courtesy_of:empty, #list_listings ul .open_houses:empty').hide();
    			$('#list_listings ul li.search_result[data_source=2] .days_on_site').hide();
                Search.listings.temp_html.length = 0;
            },
            gallery: function() {
                $('#gallery_listings ul').html(Search.listings.temp_html.join(''));
                Search.listings.temp_html.length = 0;
                SearchMap.properties.popUpFirstActive();
            },
            map: function() {
                SearchMap.properties.popUpFirstActive();
            }
        }
    };
    
    this.methods({
        details: function(listing_id_or_url) {
    		var url;
    		if (isNaN(listing_id_or_url)) { url = listing_id_or_url; }
    		else { url = '/searches/listings/' + listing_id_or_url; }
		
    		Search.switchView('single', true);
    		var container = $('#single_listings .listing_viewer');
    		container.html('<div class="loading"/>').load(url, function() {
    			container.find('.basic_info').after('<ul class="thumbnails"/>');
    			container.find('.photos').cycle({
    			    fx:     'fade',
    			    speed:  'slow',
    			    timeout: 0,
    			    pager:  container.find('.thumbnails'),

    			    // callback fn that creates a thumbnail to use as pager anchor 
    			    pagerAnchorBuilder: function(idx, slide) {
    					var img = $(slide).find('img');
    					return '<li><a href="#"><img src="' + img.attr("src") + '" width="50" height="50" /></a></li>';
    			    }
    			});

    			container.find('img').error(function() {	
    				$(this).attr('src', '/images/listings/nopic.png');
    			});

    			// Buttons
    			container.find('.secondary_links a.print').click(function() {
    				var print_window = window.open($(this).attr('href'));
    				print_window.onload = function() {
    					print_window.print();
    					print_window.close();
    				};
    				return false;
    			});

    			container.find('.links').show();

    			Search.fixHeight();
    		});
    	},
        clear: function(view) {
    		switch (view) {
    			case 'list':
    			    $('#search_content #list_listings ul').empty();
    			    break;
    			case 'gallery':
    			    $('#search_content #gallery_listings ul').empty();
                default: SearchMap.properties.hideActive();
    		}
    		Search.active.length = 0;
    		Search.listings.update(0, 0);
    	},
    	add: function(listing, view) {
    		switch (view) {
    			case 'list':
    				Search.listings.addToList(listing);
    				break;
    			case 'map':
    				Search.listings.addToMap(listing);
    				break;
    			case 'gallery':
                    Search.listings.addToMap(listing);
    				Search.listings.addToGallery(listing);
    				break;
    		}
    	},
    	addToList: function(listing) {
    	    var element = ' \
			<li class="search_result" data_source="'+listing.p+'"> \
				<div class="photo"> \
					<a href="/searches/listings/'+listing.k+'" class="view_listing_details"><img src="'+listing.j+'"/></a> \
				</div> \
				<div class="basic_info"> \
					'+Listing.formattedDetails(Listing.basicDetails(listing))+' \
				</div> \
				<div class="address"> \
					<span class="street">'+Listing.formatTitle(listing.a)+'</span> \
					<span class="city">'+listing.b+', '+listing.c+' '+listing.d+'</span> \
				</div> \
				<div class="additional_info"> \
					<span class="price">'+Listing.formatCurrency(listing.e)+'</span> \
					<span class="status">'+Listing.formatStatusCode(listing.o)+'</span> \
					<span class="days_on_site">'+Listing.formatDaysOnMarket(listing.q)+'</span> \
				</div> \
				<div class="courtesy_of">'+Listing.formatTitle(listing.n)+'</div> \
				<div class="open_houses">'+Listing.formatOpenHouses(listing.t)+'</div> \
				<div class="courtesy_of_img">'+Listing.formatDataSourceIcon(listing.p)+'</div> \
				<div class="links"> \
					<a href="/searches/saved_listings?listing[real_estate_id]='+listing.k+'" class="save_listing">Save to Favorites</a> \
					<a href="/searches/listings/'+listing.k+'" class="view_listing_details">View Details</a> \
					<a href="#" real_estate_id="'+listing.k+'" class="view_listing_map">View on Map</a> \
				</div> \
			</li>';
            Search.listings.temp_html.push(element);
    	},
    	addToMap: function(listing) {
    		SearchMap.properties.show(listing);
    	},
    	addToGallery: function(listing) {
    		var element = ' \
    		<li class="search_result"> \
    			<a class="view_listing_map" href="#" real_estate_id="'+listing.k+'"> \
    				<div class="photo"> \
    					<img src="'+listing.j+'"/> \
    				</div> \
    				<div class="basic_info"> \
    					<span>'+Listing.formatCurrency(listing.e)+'</span><br />\
    					<span>'+listing.f+' bd /</span> \
    					<span>'+listing.g+' ba</span> \
    				</div> \
    			</a> \
    		</li>';
    		Search.listings.temp_html.push(element);
    	},
        // Shows the loading screen
    	wait: function() {
    	    var message = '<img src="/images/loading_icons/loading_dark_transparent.gif" alt="loading" />Loading Results';
            $('#search_content').block({ message: message });
    	},
        // Hide the loading screen
    	resume: function() {
    	    $('#search_content').block('destroy');    	    
    	    if (Search.changedLocation) {
				if (AjaxLogin.loggedIn == false) { Search.propertyAlertTip.show(); }
    	    }
    	    Search.changedLocation = false;
    	},
        // Downloads and stores listings
    	filter: function(page) {
            Search.listings.wait();
    	    page = (page || 0);
    	    
            // Update the custom JS before we serialize the params
    	    if (Search.changedLocation) { Search.updateAllCustomJavascript(); }
    	    
    	    var params = $('#search_form').serialize() + '&page=' + page;
    	    
            // After we serialize the params, disable the form
    	    $('#search_form :input').attr('disabled', true);
    	    
                        
            $.getJSON('/searches/listings', params, function(data) {				
                Search.active_count = data.total;
                if (Search.active_count == 0) {
                    alert('Your search returned no results');
                    Search.listings.clear(Search.current_view);
                }
                else {
                    Search.listings.load(data.listings, Search.current_view);
                    Search.listings.update(page, Search.active_count);
                }
                $('#search_form :input').removeAttr('disabled');
                Search.listings.resume();
            });
    	},
    	runCallback: function(when, view) {
            var callback = this.callbacks[when][view];
            if ($.isFunction(callback)) { callback(); }
    	},
        // Adds the listings to the page
    	load: function(listings, view) {
    	    if (listings.length == 0) { return; }
    	    
    	    // Run before callback
            Search.listings.runCallback('before', Search.current_view);
            
            // Add listings to the page
    		for (var i = 0, length = listings.length; i < length; i++) {
                Search.listings.add(listings[i], Search.current_view);
    		}
    		
    		Search.active = listings;
		
            // Run after callback
            Search.listings.runCallback('after', Search.current_view);
    	},
        // Updates other elements on the page like number statistics
    	update: function(page, count) {
    	    // Show Results count
    		if (count == 0) {
    		    var results = '0';
    		}
    		else {
    		    var start = page * Search.pagination;
                var end = ((start + Search.pagination) > count ? count : start + Search.pagination);
    		    var results = (start + 1) + ' - ' + end;
    		}
		
    		$('#result_count .filtered_results').text(results);
    		$('#result_count .all_results').text(count);
    		$('#result_count').effect('highlight', {}, 1000);
    		
    		
            // Show pagination
    		$('#listings .pagination').pagination(Search.active_count, {
    		    current_page: page,
    			items_per_page: Search.pagination,
    			num_edge_entries: 1,
    			num_display_entries: 3,
    			ellipse_text: null,
    			callback: Search.listings.filter
    		});
					
    		Search.fixHeight();
    		
            // Show max listing notice
            if (Search.maxListings) {
                if (count == Search.maxListings) { $('#listings > .notice').show('slow'); }
                else { $('#listings > .notice').hide('slow'); }
            }
		
    		// Show results if not on page
    		if ($('#listings.slide.active').length == 0) {
    		    if (Search.initialSlide == '') {
    		        $('a[href=#listings]').click();
    		    }
    		    else {
    		        Search.initialSlide = '';
    		    }
    		}
    	},
    	save: function(element) {
    		$.ajax({
    			type: 'POST',
    			url: $(element).attr('href'),
    			dataType: 'script'
    		});
    	},
    	showOnMap: function(property_id) {
    		if (Search.current_slide.hash != '#listings') { $('a[href=#listings]').click(); }
    		
    		if ((Search.current_view != 'map') && (Search.current_view != 'gallery')) {
                Search.switchView('map');
    		}
    		
    		SearchMap.properties.showPopUp(property_id);
    	}
    });
});

Search.namespace('filters', function($) {
	this.methods({
	    addInitial: function() {
			if ($('.advanced_search_item').length > 0) { $('#basic_options .show_filters').trigger('click'); }
		},
	    addCallback: function(element) {
			var custom_function = element.find('.custom_javascript').text();
			if (custom_function != '') { Search.updateCustomJavascript(element, custom_function); }
			else { element.find('select.multiselect').multiSelect({ inputClass: 'value' }); }
			var value = element.find(':input.value').val();
			if (value != '') { Search.listings.filter(); }
		},
		addToSearch: function(element) {
			Search.filters.disableOption(element);
			var element_id = element.attr('id').slice(7);
			var value_elements = {};
			
			function addCallback() {
				// Insert element
				$('#advanced_search_values li:first').after(value_elements[element_id]);
				
				// Fix checkboxes
				$('#advanced_search_values li input.auto_checkbox').each(function() { Search.toggleCheckbox(this); });
				
				Search.filters.addCallback($('#advanced_search_values li.advanced_search_item:first'));
				
				delete value_elements[element_id];
			}

			$.get('/searches/add_advanced_value', { advanced_option_id: element_id }, function(advanced_value) {
				value_elements[element_id] = advanced_value;
				$('#advanced_search_values li.loader.loading').hide(1, function() {
					$(this).removeClass('loading');
					addCallback();
				});
			});

			$('#advanced_search_values li.loader').show('slow', function() {
				element.effect('transfer', { to: '#advanced_search_values li.loader', easing: 'easeInOutBack' }, 1000, function() {
					// If we have the data from the server
					if (value_elements[element_id]) {
						$('#advanced_search_values li.loader').removeClass('loading').hide();
						addCallback();
					}
					// Else set status to loading
					else { $('#advanced_search_values li.loader').addClass('loading'); }
				});
			});
		},
		removeFromSearch: function(element, readd) {
		    element.find(':input').attr('disabled', true);
			element.hide('drop', { easing: 'easeInOutBack' }, 1000, function() {
				filter = element.find('.filter').text();				
				var parent = element.parent();
				element.remove();
				var option_id = element.find('.option_id').val();
				var option_element = '#advanced_search_options #option_' + option_id;
				Search.filters.enableOption($(option_element));
				
				if (readd == true) { Search.filters.addToSearch($(option_element)); }
			});
		},
		removeAllFromSearch: function(element) {
			element.find('li.advanced_search_item').each(function(i) {
				Search.filters.removeFromSearch($(this));
			});
			
			$('#basic_options div.option:not(.buttons)').each(function() {
				$(this).find('select:first').selectOptions('0', true);
				$(this).find('select:last').selectOptions('Up', true);
			});
			
			Search.listings.filter();
		},
		resetAdvanced: function(element) {
			element.find('li.advanced_search_item').each(function(i) {
				// If a default option
				var option_id = parseInt($(this).find('.option_id').val(), 10);
				if ($.inArray(option_id, Search.defaultOptions) != -1) { Search.filters.removeFromSearch($(this), true); }
				else { Search.filters.removeFromSearch($(this), false); }
			});
			Search.listings.filter();
		},
		disableUsedOptions: function(element) {
			element.each(function(i) {
				var option_id = $(this).find('.option_id').val();
				var option_element = '#advanced_search_options #option_' + option_id;
				Search.filters.disableOption($(option_element));
			});
		},
		enableOption: function(element) {
			element.removeClass('disabled').addClass('add');
		},
		disableOption: function(element) {
			element.removeClass('add').addClass('disabled');
		},
		getSliderValues: function(element) {
			var lower = element.find('select:first').val();
			var upper = element.find('select:last').val();
			
			return { lower: lower, upper: upper };
		},
		displaySliderValues: function(element) {
			var values = Search.filters.getSliderValues(element);
			if (element.hasClass('price')) {
				element.find('.value .upper').text(Listing.formatCurrency(values.upper));
				element.find('.value .lower').text(Listing.formatCurrency(values.lower));
			}
			else {
				element.find('.value .upper').text(values.upper);
				element.find('.value .lower').text(values.lower);
			}
		}
	});
});

jQuery(document).ready(function($) {
    
	// UI Configuration	
	$('#search_api_dialog').dialog({
		modal: true,
		bgiframe: true,
		title: 'Search API URL',
		resizable: false,
		autoOpen: false,
		height: 180,
		width: 550
	}).show();
	$('#edit_alert_frequency_dialog').dialog({
		modal: true,
		bgiframe: true,
		title: 'Edit Frequency',
		resizable: false,
		autoOpen: false,
		height: 'auto',
		width: 'auto',
		buttons: {
		    Save: function() { $(this).find('form').ajaxSubmit({ dataType: "script" }); },
		    Close: function() { $(this).dialog('close'); }
		}
	});
	$('#request_viewing_dialog').dialog({
		modal: true,
		bgiframe: true,
		title: 'Request Viewing',
		resizable: false,
		autoOpen: false,
		height: 'auto',
		width: 360,
		buttons: {
		    Send: function() { $(this).find('form').trigger('submit'); },
		    Close: function() { $(this).dialog('close'); }
		}
	});

	$('#advanced_search_options').treeview({
		animated: 'slow'
	});
	
	// jQuery UI Sliders
	$('#basic_options div.option:not(.buttons)').each(function() {
		$(this).find('select').selectToUISlider({ labels: 0 });
        
		var slider = $(this).find('.ui-slider');
		
		slider.slider('option', 'change', function(e, ui) {
		    if (e.originalEvent) { Search.listings.filter(); }
		});

		// Call the plugin function first, then add our function
		var plugin_slide_function = slider.slider('option', 'slide');
		slider.slider('option', 'slide', function(e, ui) {
			plugin_slide_function.call(this, e, ui);
			Search.filters.displaySliderValues($(this).parents('.option'));
		});
		
		Search.filters.displaySliderValues($(this));
	});
	

	// Event Bindings
	// -- When clicking build search url
	$('#build_search_api_link').click(function() {
		var container = $('#search_api_dialog').dialog('open');
		container.loading('show').end().find('.inner').hide();
		$.get($(this).attr('href'), $('#search_form').serialize() + '&search_view=' + Search.current_view, function(data) {
			container.find('textarea').val(unescape(data));
			container.loading('hide').end().find('.inner').show();
		});
		return false;
	});
	// -- When adding an advanced filter
	$('#advanced_search_options span.advanced_option.add').livequery('click', function() {
		Search.filters.addToSearch($(this));
	});
	// -- When removing an advanced filter
	$('#advanced_search_values .remove').livequery('click', function() {
		Search.filters.removeFromSearch($(this).parent());
		Search.listings.filter();
	});
	// -- When clicking a checkbox in an advanced filter
	$('#advanced_search_values li input.auto_checkbox').livequery('click', function() { Search.toggleCheckbox(this); });
	// -- When toggling the advanced filter view
	$('#basic_options .buttons a:not(.reset)').livequery('click', function(event) {
	    if (event.originalEvent) { Search.propertyAlertTip.hide(); }
		if ($(this).hasClass('show_filters')) {
			$(this).removeClass('show_filters').addClass('hide_filters').text('Less Filters');
			$('#advanced_search').show('blind', { direction: 'vertical', easing: 'easeOutBounce' }, 1000);
		}
		else {
			$(this).removeClass('hide_filters').addClass('show_filters').text('More Filters');
			$('#advanced_search').hide('blind', { direction: 'vertical', easing: 'easeOutBounce' }, 1000);
		}
		return false;
	});
	// -- When reseting search
	$('#basic_options .buttons a.reset').livequery('click', function() {
		Search.resetDefaultFilters();
		return false;
	});
	// -- When clicking List/Map/Gallery view
	$('#listings .h1 .links a').click(function() {
		var view = $(this).attr('icon');
		Search.switchView(view);
		return false;
	});
	// -- When clicking Back to Listings under single property view
	$('#single_listings .go_to_previous_view').click(function() {
		Search.switchView(Search.previous_view);
		return false;
	});
	// -- When clicking on the google map street view/map view
	$('#toggle_google_map a').click(function() {
		var clicked = this;
		var element = $('#map_listings > div:visible:not(#toggle_google_map)');
		element.fadeOut(700);
		element.siblings(':not(#toggle_google_map):first').fadeIn(700, function() {
			if ($(clicked).is('a[href=#show_map_view]')) { }
			if ($(clicked).is('a[href=#show_street_view]')) {
				SearchMap.street_view.show();
			}
		});
		return false;
	});
	// -- When saving a search
	$('#save_search_link').bind('login', function() {
		$.ajax({
			type: 'POST',
			url: $(this).attr('href'),
			data: $('#search_form').serialize(),
			dataType: 'script'
		});
		return false;
	});
	// -- When saving a property alert
	$('#save_alert_link').bind('login', function() {
		Search.propertyAlertTip.hide();
		$.ajax({
			type: 'POST',
			url: $(this).attr('href'),
			data: $('#search_form').serialize(),
			dataType: 'script'
		});
		return false;
	});
	// -- When disabling all property alert
	$('#disable_alerts').livequery('click', function() {
		$.ajax({
			type: 'POST',
			url: $(this).attr('href'),
			dataType: 'script'
		});
		return false;
	});
	// -- When saving an alert
	$('#my_searches a.alert').livequery('click', function() {
		$.ajax({
			type: 'POST',
			url: $(this).attr('href'),
			dataType: 'script'
		});
		return false;
	});
	// -- When toggline/editing an alert
	$('#my_searches a.toggle, #my_searches a.edit').livequery('click', function() {
		$.ajax({
			type: 'GET',
			url: $(this).attr('href'),
			dataType: 'script'
		});
		return false;
	});
	
	// -- When saving a listing
	$('.save_listing').livequery('click', function() {
		Search.listings.save(this);
		return false;
	});
	// -- When requesting a listing
	$('.view_listing_details').livequery('click', function() {
		Search.listings.details($(this).attr('href'));
		return false;
	});
	// -- When requesting a listing for map
	$('.view_listing_map').livequery('click', function() {
		Search.listings.showOnMap($(this).attr('real_estate_id'));
		return false;
	});
	// -- When deleting a search or favorite listing or property alert
	$('#my_searches a.delete, #my_favorites a.delete, #property_alerts a.delete').livequery('click', function() {
		$.ajax({
			type: 'DELETE',
			url: $(this).attr('href'),
			dataType: 'script'
		});
		$(this).parents('tr:first').remove();
		return false;
	});

	// -- When typing in a number field
	$('input.numbers_only').livequery('keypress', function(e) {
		//if the letter is not digit then display error and don't type anything
		if( e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57))
		{
			if ($(this).next().length == 0) {
				$(this).after('<span></span>').next().addClass('msg').text('Digits Only').show().fadeOut(1200, function() { $(this).remove(); });
			}
			return false;
		}
	});
	// -- When editing an advanced search value. Click needed for IE
	$('.advanced_value :checkbox').livequery('click', function() {
	    Search.listings.filter();
	});
	$('.advanced_value :input:not(:checkbox)').livequery('change', function() {
	    Search.listings.filter();
	});
	// -- When submitting an Awesome Search
	$('#search_form input[type=submit]').click(function() {
		Search.submitAwesomeSearch();
		return false;
	});
	// -- When changing the sort options
	$('#sort_listings').change(function() {
		Search.setSort($(this).val());
		Search.listings.filter();
	});
	// -- Saved Search: When updating an email
	$('form.email_form input[type=submit]').livequery('click', function() {
		$.ajax({
			type: 'PUT',
			url: '/searches/property_alerts/update_email',
			data: { email: $('#alert_email').val() },
			dataType: 'script'
		});
		return false;
	});
	// -- Turn any link into an AJAX call
	$('a.ajax').livequery('click', function() {
		$.getScript($(this).attr('href'));
		return false;
	});

	// Execute on load
	Search.filters.disableUsedOptions($('#advanced_search_values li'));
	$('#advanced_search_values li input.auto_checkbox').each(function() { Search.toggleCheckbox(this); });
	$('#current_options select.multiselect').multiSelect({ inputClass: 'value' });
	
	$('#list_listings img').livequery('error', function() {	
		$(this).attr('src', '/images/listings/nopic.png');
	});
	
	$('.tooltip').css('opacity', 0.8);
    Search.filters.addInitial();
	Search.setSort($('#sort_listings').val());
	$('img[src*=.png]').ifixpng(); 
	
	var slides = $('.slide_container').children('div');
	$('.slide_container').width(slides.eq(0).outerWidth() * slides.length);

	$('#search_links').localScroll({
		target: $('#search_content'),
		axis: 'x',
		event: 'login',
		onBefore: function() {
			$(this).parents('ul').find('.active').removeClass('active');
			$(this).parents('li').addClass('active');
			Search.setSlide($(this));
		},
		onAfter: function(element) {
			Search.loadSlide(element);
		}
	});	
		
	// Pass a click as a login for the listings button
	$('#search_links a[href=#listings]').click(function() { $(this).trigger('login'); return false; });
	
	Search.propertyAlertTip = new TipBox($('#search_links .save_links').get(), '<p><strong>Want to stay updated with the latest listings?</strong></p><p class="subtle">Sign up to receive automated emails when listings in your search criteria hit the market.</p>');
	
	Search.submitAwesomeSearch();
});
