	
var FADING_IN = 1;
var FADING_OUT = 2;
var OPAQUE = 3;
	
var lastRequestSent;
var ds_initialized = false;
var submit_original;
var selected_item = -1;
var rows = null;
var last_request = null;
var temp_timeout_id = null;
var begin_text = 'Type to begin searching...';
var search_ready = false;

function ds_remove_children(node) {
	if(node.hasChildNodes()) {
		while (node.childNodes.length >= 1) {
			node.removeChild(node.firstChild);       
		} 
	}
	
	node.style.overflowY = 'auto';
	node.style.width = 'auto';
}

function ds_validate() {
	if (!search_ready) {
		alert("Please select a subject before searching.");
		return false;
	}
	return true;
}

function ds_select_item(item_id, description) {
	$('search_term_id').value = description;	
	$('hidden_subject_id').value = item_id;
	ds_remove_children($('ds_results'));
	$('ds_results').style.display = 'none';
	$('search_term_id').style.color = 'black';
	
	search_ready = true;
}

function ds_process_response(response) {
	if (!ds_initialized) return;
	
	var data = response.responseText.evalJSON(true);
	
	if (lastRequestSent != data.search_text) {
		return;
	}
		
	ds_remove_children($('ds_results'));
		
	search_box = $('search_term_id');
	if (search_box != null) {
		if (search_box.value.length < 1) {
			ds_remove_children($('ds_results'));
			$('ds_results').style.display = 'none';
			ds_hide_loading();
			return;
		}
	}	
		
	if (data.results.length == 0) {
		ds_hide_loading();
		if($('search_term_id').value.length == 0) {
			$('ds_results').style.display = 'none';			
		} else {
			$('ds_results').style.display = 'block';
			$('ds_results').style.opacity = 1.0;
			$('ds_results').style.filter = 'alpha(opacity = ' + (100) + ')';
			var noResults = document.createElement('div');		
			noResults.style.textAlign = 'center';
			noResults.innerHTML = '<p style="margin:2px; padding: 5px;"> No subjects matching \'' + $('search_term_id').value + '\' <br/> <a href="/editorial/search_help/"> Help on searching </a></p>';
			$('ds_results').appendChild(noResults);			
		}
		return;
	}

	results_div = $('ds_results');
	results_div.style.display = 'none';
	results_div.style.width = 340 + 'px';
	
	var results_table = document.createElement('table');
	results_table.style.width = '100%';	
	results_table.cellPadding = 0;
	results_table.cellSpacing = 0;
	
	results = data.results
	highlighted_item = null;
	rows = new Object();
	rows.size = results.length;
		
	for(var i = 0; i < results.length; ++i) {
		current = results[i];
			
		if (current == undefined) {
			continue;
		}
		
		var onc = "javascript:ds_select_item('" + current.id + "', '" + current.subject + "');";
		
		var new_row = results_table.insertRow(-1);
		new_row.className = 'dynamic_row';
		
		//Set some properties so that clicking the row will work
		new_row.subject = current.subject;
		new_row.subject_id = current.id;
		new_row.onclick = function() {  ds_select_item(this.subject_id, this.subject); return true; };
		rows[i] = new_row; //Store the row
		
		if (current.highlighted == 1) {
			new_row.style.backgroundColor = '#FECAB8';			
			selected_item = i;
		}
		
		var left_column = new_row.insertCell(-1); //Description column
		var right_column = new_row.insertCell(-1); //Count column
		
		left_column.style.whiteSpace = 'nowrap';
		left_column.className = 'dynamic_row_desc';
		
		right_column.style.whiteSpace = 'nowrap';
		right_column.style.textAlign = 'right';
		right_column.className = 'dynamic_row_count';
		
		left_column.innerHTML = current.description;
		right_column.innerHTML = current.course_count + ' courses';
		
		left_column.setAttribute('onclick', onc);
		right_column.setAttribute('onclick', onc);
		
		//results_table.appendChild(new_row);
	}
	
	var help_row = results_table.insertRow(-1);
	help_row.className = 'dynamic_row';
	
	var col = help_row.insertCell(-1);	
	col.style.textAlign = 'center';
	col.style.padding = 2 + 'px';
	col.colSpan = '2';
	col.innerHTML = '<a href="/editorial/search_help/">Not what you were looking for?</a>';
	
	results_div.appendChild(results_table);
	results_div.style.display = 'block'; //Show the new drop down
	ds_hide_loading();
}

function ds_on_success(response) {
	ds_process_response(response);
}

function ds_on_failure(response) {
	//alert("An error occurred");
}

function ds_key_down(event) {
	if(event.keyCode == 13) {
		if(selected_item > -1 && rows != null) {
			ds_select_item(rows[selected_item].subject_id, rows[selected_item].subject);
			selected_item = -1;
			
			//This prevents the form submitting in this case (in IE)
			event.stop();
		}
	}
	
	if (event.keyCode == 40 && rows != null) {				
		if (selected_item > -1) {
			rows[selected_item].style.backgroundColor = 'white';
		}
				
		selected_item++;
		
		if (selected_item == rows.size) {
			selected_item = rows.size - 1;		
		}
		
		//rows[selected_item].style.backgroundColor = '#CAFEB8';
		rows[selected_item].style.backgroundColor = '#FECAB8';
	}
	
	if (event.keyCode == 38 && rows != null) {
		if (selected_item > -1) {
			rows[selected_item].style.backgroundColor = 'white';
		}
				
		selected_item--;
		
		if (selected_item < -1) {
			selected_item = -1;
		}
		
		if (selected_item > -1 && rows != null) {
			//rows[selected_item].style.backgroundColor = '#CAFEB8';
			rows[selected_item].style.backgroundColor = '#FECAB8';
		}
	}

}

function ds_send_ajax(params) {
	//if (last_request != null) {
	//	last_request.abort();
	//}
	
	new Ajax.Request("/dynamic_course_search/", {method: 'get', parameters: params, onSuccess: ds_on_success} );
}

function ds_fade(element_id, max_opacity) {
	//max_opacity is out of 100
	element = $(element_id);
	
	if (element == null) {
		return;
	}
	
	var time_to_fade = 500.0;
	
	if(element.fade_state == null) {
		element.fade_state = FADING_IN;
		element.style.opacity = 0.0;
		element.style.filter = 'alpha(opacity = ' + (0) + ')';
		element.max_opacity = max_opacity;
		element.last_time = new Date().getTime();
		element.style.display = 'block';
	} else if (element.fade_state == OPAQUE) {
		element.fade_state = FADING_OUT;
		element.last_time = new Date().getTime();
	} else {
		if(element.fade_state == FADING_IN) {
			var current_time = new Date().getTime();
			var opacity = element.style.opacity * 100.0;
			opacity += (element.max_opacity / time_to_fade) * (current_time - element.last_time);
			element.style.opacity = opacity / 100.0;
			element.style.filter = 'alpha(opacity = ' + opacity + ')';
			element.last_time = current_time;
			if (opacity >= element.max_opacity) {
				element.fade_state = OPAQUE;
				element.style.opacity = element.max_opacity / 100.0;
				element.style.filter = 'alpha(opacity = ' + element.max_opacity + ')';
				return;
			}
		} else {
			var current_time = new Date().getTime();
			var opacity = element.style.opacity * 100.0;
			opacity -= (element.max_opacity / time_to_fade) * (current_time - element.last_time);
			element.style.opacity = opacity / 100.0;
			element.style.filter = 'alpha(opacity = ' + opacity + ')';
			element.last_time = current_time;
			if (opacity <= 0) {
				element.fade_state = null;
				element.style.opacity = 1.0
				element.style.filter = 'alpha(opacity = ' + 100 + ')';
				element.style.display = 'none';
				return;
			}
		}
	}
	
	setTimeout("ds_fade('" + element_id + "', " + max_opacity + ")", 33);
}

function ds_display_loading(search_text) {
	loading = $('loading');
	var searching = loading;
	if (loading == null) {
		searching = document.createElement('div');
		searching.style.position = 'absolute';
		searching.style.zIndex = 125;
		searching.style.border = '1px solid gray';
		searching.style.marginLeft = 5 + 'px';		
		searching.style.whiteSpace = 'nowrap';
		searching.setAttribute('id', 'loading');
		searching.style.marginTop = 20 + 'px';
		$('search_term_id').parentNode.insertBefore(searching, document.getElementById('search_term_id'));		
	} 
	
	searching.innerHTML = '<table cellpadding="0" cellspacing="0" id="loading_container"><tr><td class="loading_box"> Finding matches for \'' + search_box.value + '\'... <img src="/images/icon_animated_busy.gif" id="busy_icon" alt="" /></td></tr></table>';

	//If it's already visible do nothing
	if(searching.fade_state == OPAQUE) {
		return;
	}

	//If it's fading out, make it fade in instead
	if(searching.fade_state == FADING_OUT) {
		searching.fade_state = FADING_IN;
		return;
	}
	
	if(searching.fade_state == null) {
		ds_fade("loading", 90);
	}
}

function ds_hide_loading() {
	element = $('loading');
	
	if(element == null) {
		return;
	}
	
	if (element.fade_state == FADING_OUT || element.fade_state == null) {
		return;
	}
	
	if (element.fade_state == FADING_IN) {
		element.fade_state = OPAQUE;
		return;
	}
	
	ds_fade('loading', 90);
}

function ds_send_request(event) {
	if (!ds_initialized) return;
	if (!event) return;
	
	if (event.keyCode == 13 || event.keyCode == 38 || event.keyCode == 40) return; //Ignore ENTER/ARROWS
	
	search_ready = false;
	
	if(temp_timeout_id != -1) {
		clearTimeout(temp_timeout_id);
	}
	
	search_box = $('search_term_id');
	if (search_box != null) {
		if (search_box.value.length < 1) {
			ds_remove_children($('ds_results'));
			$('ds_results').style.display = 'none';
			//$('busy_icon').style.display = 'none';
			return;
		}
		
		//ds_remove_children($('ds_results'));
		ds_display_loading(search_box.value);
					
		lastRequestSent = search_box.value.toLowerCase(); 
		var params = { q : lastRequestSent, r : new Date().getTime() }
								
		//temp_timeout_id = setTimeout(function() { ds_send_ajax(params) }, 150);
		 
		ds_send_ajax(params);		
	} else {
		alert("Search box not present");
	}		
}

function ds_get_top(element) {
	topPos = 0;
	var obj = element;
	while(obj) {
		topPos += obj.offsetTop;
		obj = obj.offsetParent;
	}
	
	return topPos;
}

function ds_get_left(element) {
	leftPos = 0;
	var obj = element;
	while(obj) {
		leftPos += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	
	return leftPos;
}

function ds_focus(event) {
	if (!ds_initialized) {
		return false;
	}
	
	if ($('search_term_id').value == begin_text) {
		$('search_term_id').value = '';
		$('search_term_id').style.color = 'black';
	}
	
	return true;
}

function ds_mouse_down(event) {
	if (!ds_initialized) return false;	
	if ($('search_term_id').value != "") {
		if (search_ready) {
			return false;
		}
	}
	
	if (event == null) {
		event = window.event;
	}
	
	var target = event.target != null ? event.target : event.srcElement;
	
	if (target.id == 'search_term_id' || target.id == 'ds_results') {
		return false;
	}
	
	
	$('search_term_id').value = begin_text;
	$('search_term_id').style.color = 'gray';
	
	$('ds_results').fade_state = OPAQUE;
	$('ds_results').max_opacity = 100;
	$('ds_results').style.opacity = 1.0;
	$('ds_results').style.filter = 'alpha(opacity = ' + 100 + ')';	
	
	ds_fade('ds_results', 100);
	ds_hide_loading();
}

function ds_blur(event) {
	if (!ds_initialized) return false;	
	if ($('search_term_id').value != "") {
		if (search_ready) {
			return false;
		}
	}
	
	$('search_term_id').value = begin_text;
	$('search_term_id').style.color = 'gray';
	
	$('ds_results').fade_state = OPAQUE;
	$('ds_results').max_opacity = 100;
	$('ds_results').style.opacity = 1.0;
	$('ds_results').style.filter = 'alpha(opacity = ' + 100 + ')';	
	
	ds_fade('ds_results', 100);
	ds_hide_loading();
	
	//ds_remove_children($('ds_results'));
	//$('ds_results').style.display = 'none';
	
	return true;
}

function ds_initialize() {
	search_box = $('search_term_id');
	if (search_box == null) {
		return;
	}
	
	//alert("Initialize called");
	$('search_term_id').observe('keyup', ds_send_request);
	$('search_term_id').observe('keydown', ds_key_down);
	$('search_term_id').observe('focus', ds_focus);
	//$('search_term_id').observe('blur', ds_blur);
	document.observe('mousedown', ds_mouse_down);
	
	$('search_term_id').value = begin_text;
	$('search_term_id').style.color = 'gray';
		
	var newDiv = document.createElement('div');
	newDiv.setAttribute('id', 'ds_results');
	//newDiv.style.height = 150 + "px";
	newDiv.style.maxHeight = 450 + "px";
	newDiv.style.maxWidth = 475 + "px";
	newDiv.style.overflowY = "auto";
	//newDiv.style.top = (ds_get_top(search_box) + Element.getHeight(search_box)) + "px";
	//newDiv.style.left = ds_get_left(search_box) + 1 + "px";	
	//newDiv.style.left = 0 + 'px';
	//newDiv.style.top = 0 + 'px';
	newDiv.style.backgroundColor = '#FFFFFF';
	newDiv.style.position = 'absolute';
	newDiv.style.zIndex = 100;	
	newDiv.style.display = 'none';
	newDiv.style.border = "1px solid gray";
	newDiv.style.marginLeft = 5 + 'px';
	newDiv.style.marginTop = 20 + 'px';

	//document.body.appendChild(newDiv);
	$('search_term_id').parentNode.style.zIndex = 1;
	$('search_term_id').parentNode.insertBefore(newDiv, document.getElementById('search_term_id'));	
	
	var newInput = document.createElement('input');
	newInput.type = 'hidden';
	newInput.name = 'subject_id';
	newInput.id = 'hidden_subject_id';
	
	$('search_term_id').parentNode.appendChild(newInput);
	
	ds_initialized = true;
	
	if($('search_term_id').value.length > 0) {
		ds_send_request();
	}
	
	search_ready = false;
}

Event.observe(window, 'load', function() {
	ds_initialize();
});
