var globalData;
var doSearchWasClicked = false;
var dataIsLoaded = false;
var isSearchMode = true;

// Centimeters to feet and inches. Ugh! Wish we all used metric.
function cmToImperial(cm) {
	cm = parseInt(cm);
	var inches = cm / 2.54;
	var feet = Math.floor(inches / 12);
	inches = Math.floor(inches % 12);
	return feet + "'" + inches + '"';
}

// Gathers all checked values in a set of inputs into an array.
jQuery.fn.extend({checkedValues: function(){
		var checked = [];
		this.each(function(idx,val) {
			var item = $(val);
			if (item.attr('checked')) {
				checked.push(item.val());
			}
		});
		return checked;
}});
// Returns the intersect between two arrays.
function Intersect(arr1, arr2) {
	var items = [];
	for (idx1 in arr1) {
		if (typeof(arr1[idx1]) !== 'function') {
			if (arr2[arr1[idx1]]) {
				items.push(arr1[idx1]);
			}
		}
	}
	return items;
};
Array.prototype.filter = function(callback) {
	var items = [];
	for (idx in this) {
		if (callback(this[idx])) {
			items.push(this[idx]);
		}
	}
	return items;
};

// Sorts according to several functions.
// Directions array controls ascending v. descending.
function progressiveSort(a, b, funcs, directions) {
	var toReturn = 0;
	var funcIdx = 0;
	while ((toReturn === 0) && (funcIdx < funcs.length)) {
		toReturn = funcs[funcIdx](a, b) * directions[funcIdx];
		++funcIdx;
	}
	return toReturn;
}
// Compare two properties of an object.
function idxSort(a, b, idx) {
	if (a[idx] < b[idx]) return -1;
	if (a[idx] > b[idx]) return 1;
	return 0;
}

/* Sort functions */
function nameSort(a, b) {
	return idxSort(a,b,'name');
}
function heightSort(a, b) {
	return idxSort(a,b,'height');
}
function ageSort(a, b) {
	return idxSort(a,b,'age');
}
var sorters = {
	'age': ageSort,
	'height': heightSort,
	'name': nameSort
};


/* Filter functions */
function makeFilter() {
	var filters = {
		name : $('#nameFilter').data('string'),
		gender : $('#genderOptions input[name="gender"]').checkedValues(),
		ethnicity : $('#ethnicityOptions input[name="ethnicity"]').checkedValues(),
		region : $('#genderOptions input[name="region"]').checkedValues(),
		category : $('#categoryOptions input[name="category"]').checkedValues(),
		minHeight : $('#height-range').slider("values",0),
		maxHeight : $('#height-range').slider("values",1),
		minAge : $('#age-range').slider("values",0),
		maxAge : $('#age-range').slider("values",1)
	};
	return filters;
}






var searchItems = {
	genders: ['male', 'female'],
	regions: ['Utah', 'Idaho'],
	ethnicities: ['Caucasian', 'Hispanic'],
	categories: ['Elite Actors', 'Actors', 'High Fashion Models', 'Promotional Models', 'Models', 'Extras']
};
function nameStartsWith(name, value) {
	if (value.length && value.length > 0) {
		var lowerName = name.toLowerCase();
		var nameParts = lowerName.split(' ');

		for (var i = 0; i < nameParts.length; ++i) {
		 if (nameParts[i].length > 0 && nameParts[i].search(value) === 0) {
		    return true;
		  }
		}
		if (lowerName.search(value) === 0) {
			return true;
		}
		return false;
	} else {
		return true;
	}
}
function talentFilter(t, f) {
	// TODO! Add a filter for website status. 'website', 'standard'
	if (!t || typeof(t) === 'function') {return false;}
	var fName = (f.name || '').toLowerCase();
	return (
		// Age
		(t.age || t.age >= 0) && f.minAge <= t.age && t.age <= f.maxAge &&
		// Height
		t.height && f.minHeight <= t.height && t.height <= f.maxHeight &&
		// Gender
		Intersect(f.gender, t.gender).length > 0 &&
		// Category
		Intersect(f.category, t.category).length > 0 &&
		// Ethnicity
		Intersect(f.ethnicity, t.ethnicity).length > 0 &&
		// Region
		Intersect(f.region, t.region).length > 0 &&
		// Name
		nameStartsWith(t.name, fName)
		);
}

function checkAll(selector) {
	$(selector).attr('checked', 'checked');
	updateList();
	return false;
}
function uncheckAll(selector) {
	$(selector).removeAttr('checked');
	updateList();
	return false;
}



function toggleSearchArea(){
	var searchOptionsAccordian = $('#searchOptionsAccordian');
	var talentDetailArea = $('#talentDetailArea');
	var searchToggle = $('#searchToggle');
	if(isSearchMode) {
		searchOptionsAccordian.hide(500);
		searchToggle.html('Show Search');
		talentDetailArea.show(500);
	} else {
		searchOptionsAccordian.show(500);
		searchToggle.html('Show Talent Details');
		talentDetailArea.hide(500);
	}
	isSearchMode = !isSearchMode;
}
function showTalentDetail() {
	var talent = $(this).data('talent');
	var searchOptionsAccordian = $('#searchOptionsAccordian');
	var talentDetailArea = $('#talentDetailArea');
	if (isSearchMode) {
		toggleSearchArea();
	}
	var newTalentDiv = $(
		'<div class="talentDetails">'+
			'<img class="headshot" src="http://www.crazeagency.com/pict/300px/' + talent.headshot.id 
				+ '" alt="' + talent.headshot.name 
				+ '" onclick="window.open(\'/talent/'+talent.name.replace(' ', '_')+'/\', \'\', \'scrollbars, resizable, height=800,width=950\')'
				+ '"/>'+
			'<h2>' + talent.name + '</h2>'+
			'<p>Age: ' + talent.age + '</p>' +
			'<p>Height: ' + cmToImperial(talent.height) + '</p>' +
		'</div>'
	).hide();
	
	function makeDetails(details) {
		if (!details.detailNodes) {
			var toAppend = '';
			toAppend += 
				'<p>Hair: '
				+ ((!!details.hairLength && (details.hairLength[0] != '-')) ? details.hairLength : ' ') + ' '
				+ ((!!details.hairShade && (details.hairShade[0] != '-')) ? details.hairShade : ' ') + ' '
				+ ((!!details.hairColor && (details.hairColor[0] != '-')) ? details.hairColor : ' ') + ' '
				+ '</p>'
				+ ((!!details.eyes ? ('<p>Eyes: ' + details.eyes + '</p>') : '')) + ' '
				+ ((!!details.shoe ? ('<p>Shoes: ' + details.shoe + '</p>') : '')) + ' '
				+ (!!details.dressJacket ? 
						((talent.gender['female'] ? '<p>Dress: ' : '<p>Jacket: ')
					+ details.dressJacket) : '') + ' '
				+ '</p>'
				;
			if (details.photos && details.photos.length > 1) {
				jQuery.each(details.photos, function(){
					toAppend += '<img class="headshotPreview" src="http://www.crazeagency.com/pict/100px/' + this.file + '"'
							+ ' alt="' + this.description + '"'
							+ ' onclick="' + "$('#talentDetailArea .headshotPreview').parent().children('.headshot').attr('src', 'http://www.crazeagency.com/pict/300px/"+this.file+"')" + '"'
							+ '/>';
				});
			}
			toAppend += '<div class="talentResume">';
			jQuery.each(details.experience, function() {
				toAppend += '<div class="talentExperience">'
					+ '<span class="expDescription">' + this.category + "</span>: "
					+ '<span class="expTitle">' + this.title + "</span> "
					+ '<span class="expRole">' + this.role + "</span> "
					+ '<span class="expCompany">' + this.company + "</span> "
					+ '</div>'
					;
			});
			toAppend += '</div>';
			details.detailNodes = $(toAppend);
		}
		return details.detailNodes;
	}
	
	if (!talent.details) {
		$.get('toJson.php', {talentId:talent.id}, 
			function(details, textStatus){
				talent.details = details;
				newTalentDiv.append(makeDetails(details));
			},
			'json'
		);
	} else {
		newTalentDiv.append(makeDetails(talent.details));
	}
	
	var oldTalentDiv = talentDetailArea.children();
	talentDetailArea.append(newTalentDiv);
	oldTalentDiv.hide();
	newTalentDiv.show();
}

function updateList() {
	if (dataIsLoaded) {
		// Gathering the sort order
		var sorts = [];
		var orders = [];
		$('#sortList li').each(
			 function(i,val){
				sorts.push(sorters[$(val).attr('name')]);
			 }
		);
		$('#sortList li span.ui-icon').each(
			function(i,val) {
				orders.push($(val).hasClass('ui-icon-circle-triangle-n') ? 1 : -1);
			}
		);
		
		// Filtering the data
		var filter = makeFilter();
		var stuff = globalData.filter(function(item){return talentFilter(item, filter);});
		
		
		// Sort the list appropriately
		stuff.sort(
			function(a,b){
				return progressiveSort(a,b,sorts,orders);
			}
		);
		// END_TODO
		
		// Empty the existing list.
		// Iterate through the data and find matching talent.
		// Append the domNode properties to the talent list.
		
		function showDetails() {
			alert($(this).data('talent').name);
		}
		
		$('#talentList > *').hide();
		var talentListNode = $('#talentList');
		var displayed = 0;
		var displayMax = 200;
		jQuery.each(stuff, 
			function(i, val){
				if (displayed >= displayMax) {
					return false;
				}
				++displayed;
				if (val) {
					if (!val.domNode) {
						val.domNode = $(
							'<div id="' + val.id + '">'+
								'<img src="http://www.crazeagency.com/pict/100px/' + val.headshot.id + '" alt="' + val.headshot.name + '"/>'+
								'<h2>' + val.name + '</h2>'+
								'<p><span>' + val.age + '</span>,&nbsp;&nbsp;' +
								'<span>' + cmToImperial(val.height) + '</span></p>' +
							'</div>')
						.data('talent', val)
						.click(showTalentDetail)
						;
					} else {
						val.domNode.show();
					}
					talentListNode.append(val.domNode);
				}
			}
		);
		
		if (displayed < stuff.length) {
			$('#resultCount').html(displayed + ' of ' + stuff.length 
					+ ' results displayed.<br/>Narrow your search.');
		} else {
			$('#resultCount').html(stuff.length + ' results.');
		}
	}
}

// ---------
// Page load
// ---------
$(function() {
	// --------------------------
	// Setting up the search area
	// --------------------------
	var ageSlider = $('#age-range');
	var heightSlider = $("#height-range");
	$('#nameFilter').keyup(function(){
			var _this = $(this);
			_this.data('string', _this.val());
			updateList();
	});
	function updateAge() {
		$("#age").val(ageSlider.slider("values", 0) + " - " + ageSlider.slider("values", 1));
	}
	function updateHeight() {
		$("#height").val(
			cmToImperial(
				heightSlider.slider("values", 0)) 
				+ ' - ' 
				+ cmToImperial(heightSlider.slider("values", 1)
			)
		);
	}
	
	$("#searchOptionsAccordian").accordion();
	$('#sortList').sortable({
		update: function(evt, ui) {
			updateList();
		}
	});
	$('#sortList span.ui-icon').click(function(){
		if ($(this).hasClass("ui-icon-circle-triangle-n")) {
			$(this).removeClass('ui-icon-circle-triangle-n');
			$(this).addClass('ui-icon-circle-triangle-s');
		} else {
			$(this).removeClass('ui-icon-circle-triangle-s');
			$(this).addClass('ui-icon-circle-triangle-n');
		}
		updateList();
	}).hover(
		function() {
			$(this).addClass('ui-hover');
		},
		function() {
			$(this).removeClass('ui-hover');
		}
	);
	ageSlider.slider({
		range: true,
		min: 0,
		max: 90,
		values: [0, 100],
		slide: function(event, ui) {updateAge();},
		change: function(event, ui) {updateList();}
	});
	
	heightSlider.slider({
		range: true,
		min: 61,
		max: 205,
		values: [61, 205],
		slide: function(event, ui) {updateHeight();},
		change: function(event, ui) {updateList();}
	});
	
	// ----------------------------
	// Initializing the search data
	// ----------------------------
	updateAge();
	updateHeight();//*/
	/*
	updateInterface(params) {
		var options = {
			minAge: '',
			maxAge: '',
			minHeight: '',
			maxHeiht: '',
			genders: [],
			ethnicities: [],
			categories: [],
			regions: []
			sortOrder: []
		};
		$extend(options, params);
		
	}
	*/
	
	// ------------------------------------------
	// Loading the data and prompting user search
	// ------------------------------------------
	var overlay = $('#loadingOverlay');
	var searchArea = $('#advancedSearchArea');
	$('#talentDetailArea').hide();
	function DoPreSearch() {
		if (dataIsLoaded) {
			//overlay.hide();
			updateList();
		}
	}
	$('#preSearchButton').click(function(){
		doSearchWasClicked = true;
		DoPreSearch();
		overlay.html('<p>Please be patient while your results are loading.</p>');
	});

	$.get('toJson.php', function(data){
		try {
			globalData = eval(data);
			dataIsLoaded = true;
			DoPreSearch();
		} catch (ex) {
			err = ex;
			alert(err);
		} finally {
		}
	});
	
	
	
	var searchOptionsAccordian = $('#searchOptionsAccordian');
	var talentDetailArea = $('#talentDetailArea');
	$('#searchToggle').click(toggleSearchArea);
});

