$(document).ready(function(){

		var active_taxons = new Array();
		var active_bones = new Array();
		var active_views = new Array();

	function IEdoesntunderstandJSON(simile){
		var json_string = simile.substr(3);
		json_string = json_string.replace('"items":[','[');
		var json_length = (json_string.length - 6);
		json_string = json_string.substring(0,json_length);
		json_string = json_string.concat(']');
		return json_string;
	}

	var JsonDB = {};
	var items = new Object();
	var VisibleImages = 0;
	$.get('comparative.json',function(data){
		items = IEdoesntunderstandJSON(data);
		items = eval('('+items+')');
		JsonDB = new TAFFY(items);
		updateLists(items);
	},'text');

		$('div.lists p').live('click',function(){
			$('div#bone_div').empty();
			var axis = $(this).parent('div').parent('div').attr('id');
			var bone_name = new Array();
			$(this).toggleClass('selected');
			if($(this).hasClass('selected')){
				if(axis == 'taxon'){
					active_taxons.push($(this).text());
				}
				if(axis == 'bone'){
					active_bones.push($(this).text());
				}
				if(axis == 'view'){
					active_views.push($(this).text());
				}	
			}
			else{
				if(axis == 'taxon'){
					remove(active_taxons,exists(active_taxons,$(this).text()));
				}
				if(axis == 'bone'){
					remove(active_bones,exists(active_bones,$(this).text()));
				}
				if(axis == 'view'){
					remove(active_views,exists(active_views,$(this).text()));
				}	
			}
			populateImages();
	});

	$('#large_view').click(function(){
		if(VisibleImages < 60){
			$('#bone_div img').each(function(i,n){
				$(n).attr('src',$(n).attr('src').replace(/thumbnail/g,'viewitem').replace(/_100/g,'_400'));
			});
			$('div.img_desc').show();
		}
		else{
			alert('There are too many images on the page.');
		}
		return false;
	});
	$('#small_view').click(function(){
			$('#bone_div img').each(function(i,n){
				$(n).attr('src',$(n).attr('src').replace(/viewitem/g,'thumbnail').replace(/_400/g,'_100'));
			});
		$('div.img_desc').hide();
		return false;
	});

	$('#reset').click(function(){
		$('div#bone_div').empty();
		$('#visible_images').text('0');
		active_taxons = new Array();
		active_bones = new Array();
		active_views = new Array();
		updateLists(items);
		return false;
	});

	$('div.bone_comp_images img').live('mouseover',function(){
	if($(this).attr('src').search('thumbnail') != -1){
		var html_x = $('div.container').width();
		var html_y = $('body').height();
		var hover_img = $(this).offset();
		var img_x = hover_img.left + 80;
		var img_y = hover_img.top + 80;
		if((img_y + 400) > html_y){
			img_y = img_y - 503;
			if(img_y < 0){
				img_y = 0;
			}
		}	
		if((img_x + 100) > html_x){
			img_x = img_x - 483;
		}	
		$('body').append("<div id='mag_img' style='top:"+img_y+"px;left:"+img_x+"px;'>"+$(this).prev('div').html()+"<img src='"+$(this).attr('src').replace('thumbnail','viewitem').replace('_100','_400')+"'></div>");
		}
	});
	$('div.bone_comp_images img').live('mouseout',function(){
		$('#mag_img').remove();
	});


	function populateImages(){
		var results = new Array();
		var query = new Object();
		VisibleImages = 0;
		if(active_taxons.length){
			query.taxon = active_taxons;
		}
		if(active_bones.length){
			query.bone = active_bones;
		}
		if(active_views.length){
			query.view = active_views;
		}
		if(query.taxon || query.bone || query.view){
			var bones = '';
			$(JsonDB.get(query)).each(function(h,d){
				bones += "<div class='bone_comp_images'><div class='img_desc' style='display:none'><p><span>Taxon: </span>"+d.taxon+"</p><p><span>Bone: </span>"+d.bone+"</p><p><span>View: </span>"+d.view+"</p></div><img onerror='$(this).parent().hide()' src='"+d.thumb+"'></div>";
				VisibleImages += 1;
			});
			$('div#bone_div').append(bones);
			$('#visible_images').text(VisibleImages);
		}
		else{
			$('#visible_images').text('0');
		}
		updateLists(items,query,active_taxons,active_bones,active_views);
	}


	function updateLists(items,query,taxon,bone,view){
		var taxon_list = new Array();
		var bone_list = new Array();
		var view_list = new Array();

		for(var i in items){
			if(exists(taxon_list,items[i].taxon) === false){
				if((!bone || bone.length == 0 || exists(bone,items[i].bone) !== false) && (!view || view.length == 0 || exists(view,items[i].view) !== false)){ 
					taxon_list.push(items[i].taxon);
				}
			}
			if(exists(bone_list,items[i].bone) === false){
				if((!taxon || taxon.length == 0 || exists(taxon,items[i].taxon) !== false) && (!view || view.length == 0 || exists(view,items[i].view) !== false)){ 
					bone_list.push(items[i].bone);
				}
			}
			if(exists(view_list,items[i].view) === false){
				if((!taxon || taxon.length == '' || exists(taxon,items[i].taxon) !== false) && (!bone || bone.length == 0 || exists(bone,items[i].bone) !== false)){ 
					view_list.push(items[i].view);
				}
			}
		}
		bone_list = bone_list.sort();
		taxon_list = taxon_list.sort();
		view_list = view_list.sort();
		$('#taxon').empty();
		for(var m in taxon_list){
			if(taxon && exists(taxon,taxon_list[m]) !== false){
				$('#taxon').append('<div class="lists" title="'+taxon_list[m]+'"><p class="selected">'+taxon_list[m]+'</p></div>');
			}
			else{
				$('#taxon').append('<div class="lists" title="'+taxon_list[m]+'"><p>'+taxon_list[m]+'</p></div>');
			}
		}
		$('#bone').empty();
		for(var m in bone_list){
			if(bone && exists(bone,bone_list[m]) !== false){
				$('#bone').append('<div class="lists" title="'+bone_list[m]+'"><p class="selected">'+bone_list[m]+'</p></div>');
			}
			else{
				$('#bone').append('<div class="lists" title="'+bone_list[m]+'"><p>'+bone_list[m]+'</p></div>');
			}
		}
		$('#view').empty();
		for(var m in view_list){
			if(view && exists(view,view_list[m]) !== false){
				$('#view').append('<div class="lists" title="'+view_list[m]+'"><p class="selected">'+view_list[m]+'</p></div>');
			}
			else{
				$('#view').append('<div class="lists" title="'+view_list[m]+'"><p>'+view_list[m]+'</p></div>');
			}
		}
		delete taxon_list;
		delete bone_list;
		delete view_list;
	}
	function exists(ar,o) {
		for(var i = 0; i < ar.length; i++)
			   if(ar[i] === o)
				        return i;
		return false;
	}
	//courtesy John Resig
	function remove(ar,from, to) {
	  var rest = ar.slice((to || from) + 1 || ar.length);
	  ar.length = from < 0 ? ar.length + from : from;
	  return ar.push.apply(ar, rest);
	};
});
