var checklist 			= false;
var gmap 				= false;
var arr_ignore_keys 	= ['pro_division','pro_district','subrb_name','listing_type_id','listing_sub_type_id','listing_type','listing_sub_type'];
var	obj_image_index		= {};

/** User functions ******************************************/

// Save listing
function save_listing(link, id) 
{
	link.firstChild.nodeValue = 'Adding...';

	$.post (
		'/account/save-listing',
		{ listing_id: id },
		function(resp) {
			link.firstChild.nodeValue = 'Added to My Property! Click to view.';
			link.href = '/account/my-property';
			link.onclick = null;
			link.className += link.className ? ' added' : 'added';
		}
	);

	return false;
}

// Save open home
function save_open_home(link, id) 
{
	link.firstChild.nodeValue = 'Adding...';

	$.post (
		'/account/save-open-home',
		{ open_home_id: id },
		function(resp) {
			link.firstChild.nodeValue = 'Added to My Open Homes List! Click to view.';
			link.href = '/account/my-property';
			link.onclick = null;
			link.className += link.className ? ' added' : 'added';
		}
	);

	return false;
}

// Feature listing
function feature_listing(link, id)
{
	link.firstChild.nodeValue = 'Adding...';

	$.get (
		link.href,
		{},
		function(resp) {

			if (resp == "1") {

				link.firstChild.nodeValue 	= 'Listing featured.';
				link.onclick 				= null;
				link.className 				+= link.className ? ' added' : 'added';

			} 
			else {
				alert (resp);
			}
		}
	);

	return false;
}

// Save notes
function save_notes(link, id) 
{
	link.firstChild.nodeValue = 'Saving...';

	var notes = document.getElementById('notes-'+id).value;

	$.post (
		'/account/saved-listings?edit=' + id,
		{ notes: notes },
		function (resp) {
			link.firstChild.nodeValue = 'Notes saved.';
		}
	);

	return false;
}

/** Image loading ******************************************/

// Image switcher
function image_switcher() 
{
	$(".imgThumbs li a").click(function() {

		var pri = document.getElementById('primary-image');

		pri.href 			= this.href;
		pri.firstChild.src 	= this.firstChild.src.replace('photos2','photos');
		pri.firstChild.alt 	= this.firstChild.alt;

		return false;
		
	});
}

/** Node Handling ******************************************/

function Node(id, label) 
{
	this.id 		= id;
	this.label 		= label;
	this.children 	= [];
}

function deleteChildNodes(parent) 
{
	if(parent == undefined || parent == null) return;
	while (parent.firstChild) parent.removeChild (parent.firstChild);
}

function createElement(type, name, checked) 
{
	var element = null;

	try {
		element = document.createElement('<input type="'+type+'" name="'+name+'"'+(checked ? ' checked="checked"' : '')+'>');
	} catch (e) {}

	if(!element || element.nodeName != 'INPUT') {
	
		element 			= document.createElement('input');
		element.type 		= type;
		element.name 		= name;
		element.checked 	= checked;
		
	}

	return element;
}

function nodeChecklist(nodes, element_id, checked_id) 
{
	var element = document.getElementById(element_id);

	if (nodes.length > 0) {

		var ul = $.UL({id: element_id, className: 'checklist'});

		for (var i = 0; i < nodes.length; i++) {

			var label = document.createElement ('label');
			label.setAttribute ('for', element_id + '_' + nodes[i].id);

			var input = createElement ('checkbox', 'subrb_name[]', false);
			input.id = element_id + '_' + nodes[i].id;
			input.value = nodes[i].id;
			input.checked = (checked_id && nodes[i].id == checked_id);

			label.appendChild (input);

			label.appendChild (
				document.createTextNode (' ' + nodes[i].label)
			);

			label.onmouseover = function() { this.className = 'hover' }
			label.onmouseout = function() { this.className = '' }

			ul.appendChild ($.LI( {}, label ));

		}

		element.parentNode.replaceChild (ul, element);

	} else {

		var p = $.P( {id: element_id}, 'Please select a region and pro_district' );

		element.parentNode.replaceChild (p, element);

	}

	return true;
}

function nodeSelectBox(nodes, element_id, selected_id, all_text, disabled, exclude) 
{
	var element = document.getElementById(element_id);

	if(element) {

		var select = $.SELECT({id: element_id, name: element_id});
		var child_nodes = [];

		select.appendChild ($.OPTION({
			text: all_text,
			innerText: all_text,
			value: '',
			selected: !selected_id
		}));

		for (var i = 0; i < nodes.length; i++) {

			if(exclude instanceof Array && exclude.length) {
				if(exclude.in_array(nodes[i].label)) {
					continue;
				}
			}

			var selected = (selected_id && nodes[i].id == selected_id);

			if (selected)
				child_nodes = nodes[i].children;

			select.appendChild ($.OPTION({
				text: nodes[i].label,
				innerText: nodes[i].label,
				value: nodes[i].id,
				selected: selected
			}));

		}

		if (disabled)
			select.disabled = true;

		element.parentNode.replaceChild (select, element);

		return child_nodes;

	}

	return false;
}

/** Search ******************************************/

function changeRegion () 
{
	var pro_districts 	= [];
	var pro_division 	= this.options[this.selectedIndex].value;

	for (var i = 0; i < regions.length; i++) {
		if (regions[i].id == pro_division) pro_districts = regions[i].children;
	}

	nodeSelectBox(pro_districts, 'pro_district', false, 'All Districts', !pro_division);

	if (is_property) {

		$("#pro_district").change(changepro_district);

		if(checklist)	nodeChecklist ([], 'subrb_name');
		else			nodeSelectBox ([], 'subrb_name', false, 'All suburbs', true);

	}
}

function changepro_district () 
{
	var suburbs 		= [];
	var pro_district 	= this.options[this.selectedIndex].value;
	var region 			= document.getElementById('pro_division');
	var pro_division 		= region.options[region.selectedIndex].value;

	for(var i = 0; i < regions.length; i++) {

		if (regions[i].id == pro_division) {

			for (var j = 0; j < regions[i].children.length; j++) {
				if (regions[i].children[j].id == pro_district) suburbs = regions[i].children[j].children;
			}

		}

	}

	if (checklist)	nodeChecklist (suburbs, 'subrb_name');
	else			nodeSelectBox (suburbs, 'subrb_name', false, 'All suburbs', !pro_district);
}

function initialize_search(params, exclude_regions) {

	is_property 	= (params.listing_type_id != 4);
	is_lifestyle 	= (params.listing_sub_type_id == 5);

	var pro_districts = nodeSelectBox(regions, 'pro_division', params.pro_division, 'All Divisions', false, exclude_regions);
	$("#pro_division").change(changeRegion);

	var suburbs = nodeSelectBox(pro_districts, 'pro_district', params.pro_district, 'All Districts', !params.pro_division);
	$("#pro_district").change(changepro_district);


	if (is_property) {

		if (checklist)
			nodeChecklist (suburbs, 'subrb_name', params.subrb_name);
		else
			nodeSelectBox (suburbs, 'subrb_name', params.subrb_name, 'All suburbs', (!params.pro_division || !params.pro_district));

	}

	var listing_sub_types = [];

	// TODO: optimize this into a recurisve function
	for(var i = 0; i < listing_types.length; i++) {

		if(listing_types[i].id == params.listing_type_id) {

			var listing_sub_types = listing_types[i].children;

			for(var j = 0; j < listing_sub_types.length; j++) {

				var children = listing_sub_types[j].children;

				if(children.length >= 1) {
					if(listing_sub_types[j].id == params.listing_sub_type_id) {
						listing_sub_types = children;
						break;
					}

					for(var k = 0; k < children.length; k++) {
						if(children[k].id == params.listing_sub_type_id) {
							listing_sub_types = children;
							break;
						}
					}
				}
			}
		}
	}

	if(is_property) 	nodeSelectBox(listing_sub_types, 'listing_sub_type_id', params.listing_sub_type_id, 'Any property type', false);
	else 				nodeSelectBox(listing_sub_types, 'listing_sub_type_id', params.listing_sub_type_id, 'Any business type', false);
}

function setFlashMapLocation(pro_division, pro_district) 
{
	if(pro_district) {

		var rewrite_url = "/ajax/suburbs?get_rewrite=true&pro_division="+pro_division+"&pro_district="+pro_district;

		$.get(rewrite_url, function(data) {
		
			if(data != 'false')	redirect('/'+search_params.listing_type+'/all/'+data+'/map/');
			else 				redirect ('/'+search_params.listing_type+'/all/map?pro_division='+pro_division+'&pro_district='+pro_district);
			
		});
	}
}

function submit_search(url) 
{
	var arr_elements = [];
	
	$('#search select').each(function() {if(element = format_element($(this))) arr_elements.push(element)});
	$('#search input').each(function() {if(element = format_element($(this))) arr_elements.push(element)});
	
	redirect(url+'?'+arr_elements.join('&'));
}

function show_search() 
{
	$("#flash-map").hide();
	$("#search").show();
	$(".tab-search").css({background: 'url(/img/template/tab-search-on.png) no-repeat'});
	$(".tab-search a").css({color: '#127BA8'});
	$(".tab-map").css({background: 'url(/img/template/tab-map-off.png) no-repeat'});
	$(".tab-map a").css({color: '#559FC2'});

	return false;
}

function show_map() 
{
	$("#flash-map").show();
	$("#search").hide();
	$(".tab-search").css({background: 'url(/img/template/tab-search-off.png) no-repeat'});
	$(".tab-search a").css({color: '#559FC2'});
	$(".tab-map").css({background: 'url(/img/template/tab-map-on.png) no-repeat'});
	$(".tab-map a").css({color: '#127BA8'});

	return false;
}

function initialize_tabs() 
{
	show_search();
	$(".tab-search a").click(function() { show_search() });
	$(".tab-map a").click(function() { show_map() });
}

/** Tools ******************************************/

function initialize_tools() 
{
	// Map toggle
	$(".listings-map a").bind('click',function() {
		$("#map-container").toggle();
		if($("#map-container").css('display') != 'none') loadMap();
		return false;
	});
	
	// Locations show
	$('a#slick-show').click(function() {
		$('#locations').show('fast');
		$('a#slick-show').hide();
		$('a#slick-hide').show();
		$.post(
			'/ajax/set-session-variables',
			{ collapse_listings: 0 }
		);
		return false;
	});
	
	//Locations hide
	$('a#slick-hide').click(function() {
		$('#locations').hide('fast');
		$('a#slick-show').show();
		$('a#slick-hide').hide();
		$.post(
			'/ajax/set-session-variables',
			{ collapse_listings: 1 }
		);
		return false;
	});
}

/** Login form ******************************************/

function initialize_login_form() 
{
	$("#account-login").submit(function() {

		var email 		= $("#account-login #email").val();
		var password 	= $("#account-login #password").val();
		var auto_login 	= $("#account-login #auto_login").val();

		$.post (
			'/ajax/login',
			{ email: email, password: password, auto_login: auto_login },
			function(resp) {
				if(resp.search(/error/i) != -1) {
					alert(resp);
				} 
				else {
					$("#my-property").html(resp);
				}
			}
		);

		return false;

	});
}

/** Property Filters ******************************************/

// Map filter keys
var filter_keys = {
	price:				['min_price', 'max_price'],
	land_area_sq_m:		['min_land_area_sq_m', 'max_land_area_sq_m'],
	floor_area_sq_m:	['min_floor_area_sq_m', 'max_floor_area_sq_m'],
	num_bedrooms:		['num_bedrooms', 'min_bedrooms']
};

// Map filter types
var filter_types = {
	range:	['price', 'land_area_sq_m', 'floor_area_sq_m'],
	floor:	['num_bedrooms']
}

function format_params(name, value)
{	
	var obj_formatted	= {};

	for(var prop in filter_types) {
	
		if(filter_types[prop].in_array(name)) {
			
			var arr_keys		= filter_keys[name];
			var arr_pieces 		= value.split('|');
			
			switch(prop) {
				case 'floor':
					if(arr_pieces[1] == undefined) obj_formatted[arr_keys[0]] = arr_pieces[0];
					if(arr_pieces[1] != undefined) obj_formatted[arr_keys[1]] = arr_pieces[0];
					break;
				default:
					if(arr_pieces[0] != '') obj_formatted[arr_keys[0]] = arr_pieces[0];
					if(arr_pieces[1] != '') obj_formatted[arr_keys[1]] = arr_pieces[1];
			}
			
			return obj_formatted;
	
		}
	}

	obj_formatted[name] = value;
	
	return obj_formatted;
}

function format_element(element)
{
	var value 	= element.attr('value');
	var name 	= element.attr('name');
	var type	= element.attr('type');

	if(type == 'checkbox') {
		if(!element.attr('checked')) return;
	}

	if(!value || value == '') return;

	obj_formatted = format_params(name, value);
	arr_formatted = [];
	
	for(var prop in obj_formatted) {
		arr_formatted.push(prop+'='+obj_formatted[prop]);
	}
	
	return arr_formatted.join('&');
}

function submit_filter_form() 
{
	var arr_pairs 			= [];
	
	// Format params
	$('#filters select').each(function() {

		var key = $(this).attr('name').replace(/(min|max|num)_/, '');

		arr_ignore_keys.push(key);
		arr_ignore_keys.push("min_"+key);
		arr_ignore_keys.push("max_"+key);
		arr_ignore_keys.push("num_"+key);
		
		if(pair = format_element($(this))) arr_pairs.push(pair);

	});
	
	// Add any additional params
	for(var key in search_params) {
		if(!arr_ignore_keys.in_array(key)) arr_pairs.push(key+"="+encodeURIComponent(search_params[key]));
	}

	// Redirect
	redirect(browse_url+'?'+arr_pairs.join('&'));
}

// Get selected filter params
function get_filter_menu_params()
{
	var obj_params = {};

	$('#mapFilters .active').each(function(){
				
		var name 			= $(this).parent().parent().attr('id');
		var value			= $(this).attr('href');
		
		// Workaround for search filter clash
		if(name == 'listing_sub_type') {
			name = 'listing_sub_type_id';
		}
		
		if(!value) return delete(search_params[name]);

		var obj_formatted = format_params(name, value);
		
		for(var prop in obj_formatted) {
			obj_params[prop] = obj_formatted[prop];
		}
		
	});

	return obj_params;
}

// Hide/show filter menu
function toggle_filter_menu(level)
{
	if(level == 'property') 	$('#mapFilters').show('fast');
	else						$('#mapFilters').hide('fast');
}

// Refresh map on filter click
function on_filter_click(caller, speed, gmap)
{
	// If being called by filter link
	if(caller) {
		
		var menu 	= $(caller).parents('.catContent').get(0);
		var list	= $(caller).parents('dl').get(0);
		
		$('.selected', $(menu)).html('&raquo; '+$(caller).html());
		$('.active', $(list)).toggleClass('active');
		$(caller).toggleClass('active');

		toggle_menu_state($(menu), speed, 'close');
		
	}
	
	var obj_filter_params = get_filter_menu_params();
	
	// Set additional params
	for(var prop in search_params) if(!obj_filter_params[prop]) obj_filter_params[prop] = search_params[prop];

	if(gmap) {
		gmap.clearOverlays();
		loadListings(gmap, obj_filter_params);
	}
	
	return false;
}

// Open/close filter menu
function toggle_menu_state(menu, speed, state) 
{
	switch(state) {
		case 'close':
			$(menu).animate({marginTop: '-240px'}, speed, 'swing', function(){$(menu).next('.btOpen').toggle()});
			break;
		default:
			$(menu).animate({marginTop: '0px'}, speed, 'swing');
			$(menu).next('.btOpen').toggle();
	}
	
	return false;
}

// Clear filters
function clear_menu_filters(filter, speed, gmap) 
{
	$('dl .active', filter).each(function(){$(this).removeClass()});
	$('dl', filter).each(function(){$(this).next('.selected').html('&raquo; '+$('a:first', $(this)).addClass('active').html())});
	
	return on_filter_click(false, speed, gmap);
}

// Add click handlers to menu
function initialize_filter_menu(arr_items, speed, gmap)
{
	for(var i = 0; i < arr_items.length; i++) {

		if(!$(arr_items[i]).length) continue;
		
		// Add click handlers
		$(arr_items[i]+' .btOpen').click(function(){return toggle_menu_state($(this).prev('.catContent'), speed, 'open')});
		$(arr_items[i]+' .btClose').click(function(){return toggle_menu_state($(this).parent('.catContent'),  speed, 'close')});
		$(arr_items[i]+' dl dd a').each(function(){$(this).click(function(){return on_filter_click($(this), speed, gmap);})});
		
	}
	
	// Clear filters
	$('#mapFilters .clearFilters').click(function(){return clear_menu_filters($('#mapFilters'), speed, gmap)});
}

/** Initialize ******************************************/

$(window).load(function()
{
	$('#filters select').change(submit_filter_form);
	
	initialize_tabs();
	initialize_tools();
	initialize_search(search_params, exclude_regions);
	initialize_tab_menu();
	
	if(!active){
		initialize_login_form();
	}
	
	if((screen.width >= 800) && (screen.height >= 600) && (screen.width < 1024)) {
		appendStylesheet('/css/800.css', 'screen');
	}
});
