var H2 = H2 || {};

H2.AcctSearch = function( input_id, output_id, path_to_version, theme ) {
	var _self = this;
	
	this.input_elem = document.getElementById( input_id );
	this.output_elem = document.getElementById( output_id );
	this.path_to_version = path_to_version;
	this.theme = theme;
	
	this.cur_str = '';
	
	this.cur_message = '';
	this.cur_results = [];
	
	this.last_req_time = -1;
	this.num_request = 0;
	this.request_delay = 0;

	this.input_elem.focus();
	
	setTimeout( mkCheck(), 300 );
	this.input_elem.onkeydown = mkCheck();
	function mkCheck() {
		return function() {_self.checkInput()};
	}
	
	this.output_elem.onclick = mkClick();
	function mkClick() {
		return function(evt) { return _self.outputClicked(evt); };
	}
	
	this.outputClicked = function(evt) {
		evt = (evt)? evt : ( (window.event)? window.event : null );
		if( evt ) {
			var elem = (evt.srcElement)? evt.srcElement : evt.target;
			
			if( elem.getAttribute('h2_action') )  {
				var action = elem.getAttribute('h2_action');
				if( action == 'acct_search_close' ) {
					this.output_elem.style.display = 'none';
				}
				return false;
			}
		}
	}
	
	
	this.checkInput = function() {
		
		var new_str = this.input_elem.value;
		
		if( new_str != this.cur_str ) {
			
			this.output_elem.style.display = 'block';
			
			if( !new_str || new_str.length == 0 ) {
				this.cur_results = [];
				this.updateOutputBox( false, 'zero-length' );
				this.cur_str = new_str;
			}
			else if( new_str.length < 3 ) {
				this.cur_results = [];
				this.updateOutputBox( false, 'too-short' );
				this.cur_str = new_str;
			}
			else {
				var cur_time = new Date().getTime();
				if( cur_time > this.last_req_time + this.request_delay ) {
					this.doSearchRequest( new_str );
					this.cur_str = new_str;
					this.updateOutputBox( false, false, true );
				}
			}
		}
		
		setTimeout( mkCheck(), 400 );
	}
	
	this.updateOutputBox = function( results, message, searching ) {
		var html = '';
		
		if( results !== false ) {
			this.cur_results = results;
		}
		
		
		if( this.cur_results.length > 0 ) {

			html += '<div class="acct-search-results-container">';
			
			var num_result = this.cur_results.length;
			var a;
			for( var i=0; i<num_result; i++ ) {
				a = this.cur_results[i];
				
				html += '<a href="'+ url.account(a.key) +'" class="acct-search-result">'
					+'<div class="institution">'+htmlEncode(a.inst)+'</div>'
					+'<div class="dept">'+htmlEncode(a.dept)+'</div>'
					+'</a>';
			}
			html += '</div>';	//results container;
		}

		if( message ) {
			this.cur_message = message;
		}

		html += '<div class="acct-search-msg">'
			+'<div class="acct-search-msg-point" style="background-image: url('+this.path_to_version+'/images/desktop/acct_search_msg_point.gif)">&nbsp;</div>';
		
		html += '<div class="acct-search-head">';
		if( this.cur_results.length == 0 ) {
			html += 'no results';
		}
		else if( this.cur_results.length == 1 ) {
			html += '1 result';
		}
		else {
			html += this.cur_results.length+' results';
		}
		if( searching ) {
			html += ', searching...'
		}
		html += '</div>';
		
		if( this.cur_message == 'zero-length' ) {
			html += '<div>Enter your institution\'s name.</div>';
		}
		else if( this.cur_message == 'too-short' ) {
			html += '<div>Enter at least three characters.</div>'
			html += '<div>Enter your institution\'s name.</div>';
		}
		else if( this.cur_message == 'no-results' ) {
			html += '<div>Enter your institution\'s name.</div>';
			html += '<div>Generic terms like "hospital" and "medicine" will not work.</div>';
			html += '<div>Ask your account administrator if they enabled search.</div>'
		}
		else if( this.cur_message == 'results-ok' ) {
			html += this.theme == 'desktop'
				? '<div>Use "tab" key to select, and "enter" to go.</div>'
				: '<div>Tap to view schedules.</div>'
		}
		
		if( this.theme != 'iph' ) {
			html += '<a href="#" h2_action="acct_search_close">close</a>';
		}
		html += '</div>';
		
		this.output_elem.innerHTML = html;
	}
	
	this.doSearchRequest = function( search_str ) {
		var req_str;
		if( url ) {
			req_str = url.acctSearchAjax( search_str );
		}
		else {
			req_str =  'async=yes&search='+encodeURIComponent(search_str);
		}
		getRequest( 'acctsearch', req_str, mkCallback() );
		function mkCallback() {
			return function( resp_datas ) {_self.doSearchRequest_RH( resp_datas);}
		}
		
		this.last_req_time = new Date().getTime();
		this.num_request++;
		
		if( this.num_request == 1 ) {
			this.request_delay = 200;
		}
	}
	this.doSearchRequest_RH = function( resp_datas ) {
		/////
		var message = 'results-ok';
		var results = resp_datas.accounts;
		if( results.length == 0 ) {
			message = 'no-results'
		}
		
		this.updateOutputBox( results, message, false );
	}
	
	if( this.theme == 'iph' ) {
		this.cur_str = '...';
		this.checkInput();
	}
}

