/*	=================================================	*/
/*		HYJAX Hyatt Ajax Object							*/
/*		By: Aaron Glenn									*/
/*		Usage: AutoComplete								*/
/*		Dependencies: Prototype.js						*/
/*	==================================================	*/


function HYJAX(){

		// Properties
		// =============================================================================
		var t = this;

		// Configuration
		t.searchBoxDefaultValue = 'City, State, Country or Hotel Name';
		t.pollingFrequency = 500; // Milliseconds
		t.hideDelay = 300; // Milliseconds

		// Placeholders
		t.currentNode = '';
		t.replacedNode = '';


		// Methods
		// ==============================================================================

		// CORE XML HTTP Function
		t.ajaxCall = function (url, method, node, vars){

			var content='Data Error';
			var xmlhttp=false;
			/*@cc_on @*/
			/*@if (@_jscript_version >= 5)
				try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {
				try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");} catch (E) {
			   xmlhttp = false;
			  }
			 }
			@end @*/
			if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
			  xmlhttp = new XMLHttpRequest();
			}
			xmlhttp.open(method, url, true);
			if(method == 'POST'){xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');}
			xmlhttp.onreadystatechange=function() {
			if (xmlhttp.readyState==4) {
				content = xmlhttp.responseText;
				HYJAX.content = xmlhttp.responseText;
				HYJAX.ajaxCallback(node, content);
				}
			}
			if(vars==''){vars=null;}
			xmlhttp.send(vars);
		}

		// AJAX Callback Function
		t.ajaxCallback = function(targetNode, nodeContent){
			t.resultNode = targetNode;
			t.resultNode.innerHTML = nodeContent;
			t.resultLinks = t.resultNode.getElementsByTagName('a');
			t.resultIndex = -1;
			t.showResults();
		}


		// Intercept Submit
		t.interceptSubmit = function(){
			var form = t.currentNode.getElementsByTagName('form')[0];
			if(form){
				form.onsubmit = function(){
					var to = this.action;
					var vars = t.buildVars(this);
					var confirm = t.ajaxCall(to, 'POST', t.currentNode, vars);
					if(confirm){t.resetAdmin();}
					return false;
				}
			}
		}

		// Utility Helpers
		t.encode = function(sStr){return escape(sStr).replace(/\+/g, '%2C').replace(/\"/g,'%22').replace(/\'/g, '%27');}
		t.unencode = function(){}
		t.cancelAction = function(){
			t.currentNode.innerHTML = t.replacedNode.innerHTML;
			t.currentNode.childNodes[0].focus();
		}

		// Focus Input
		t.focusInput = function(){
			inputs = t.currentNode.getElementsByTagName('input');
			if(inputs){inputs[0].focus();}
		}

		// Capture & Respond to User Input
		t.captureKeyPress = function(event){
			if(t.polling){

				// Event code/constants from Prototype.js
				var key = event.which || event.keyCode;
				switch(key) {

				    // Pressing Return fills searchbox
					case Event.KEY_RETURN:
					case Event.KEY_TAB:

						// if link exists in array -> fire it's onclick listener
						if(link = t.resultLinks[t.resultIndex]){link.onclick();
							Event.stop(event);
							return false;
						}else{
							// Allow normal form submission
							 t.stopSuggest();
							 return;
						}

					// Esc hides/cancels Auto Suggest
					case Event.KEY_ESC:
						 t.stopSuggest();
						 Event.stop(event);
						 return;

				    // Left and Right do nothing
					case Event.KEY_LEFT:
				    case Event.KEY_RIGHT:
					 	 return;

					// Up selects the previous result
				    case Event.KEY_UP:
						 t.highlightPrevResult();
						 if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
						 return;

					// Down selects the next result
				    case Event.KEY_DOWN:
						 t.highlightNextResult();
						 if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
						 return;
				  }
			}
		//This gets executed when the page is not fully loaded t.initsuggest forces the loading
			else {
			t.initSuggest();
			}
		}



		// Display Highlighted Link base on array index
		t.highlightNextResult = function(){
			if(t.resultIndex < t.resultLinks.length-1){t.resultIndex += 1;}
			t.clearResultHighlighting();
			if(t.resultLinks[t.resultIndex]){
				t.resultLinks[t.resultIndex].className = 'active';
			}
		}

		// Display Highlighted Link base on array index
		t.highlightPrevResult = function(){
			if(t.resultIndex > 0){t.resultIndex -= 1;}
			t.clearResultHighlighting();
			if(t.resultLinks[t.resultIndex]){
				t.resultLinks[t.resultIndex].className = 'active';
			}
		}

		// Remove Highlighting
		t.clearResultHighlighting = function(){
			for(var i=0; i<t.resultLinks.length; i++){
				t.resultLinks[i].className = '';
			}
			//t.resultIndex = 0;
		}

		// Check to see if there are valid results
		t.validResults = function(){
			var resultLI = t.resultNode.getElementsByTagName('ul')[0].getElementsByTagName('li')[0];
			return ((t.resultNode.innerHTML != '') && resultLI);
		}

		// Populate Search Field with given string
		t.fillSearchBox = function(string){
			//HM-54 :passing the entering string without splitting
				t.searchBox.value = string;
				t.lastSearchString = string;
				//t.stopSuggest();
				t.cleanResults();
		}

		// Polling method. Used in setinterval and set to t.polling
		// Make AJAX call if searchString isn't blank and has changed since last time
		t.pollSuggest = function(){
			var searchStr = t.searchBox.value;
			if(searchStr.indexOf('Hyatt') != -1){searchStr.replace(/'Hyatt'/, '');}
			if(t.lastSearchString != searchStr && searchStr != '' && t.polling){
				t.lastSearchString = searchStr;
				t.ajaxCall('/hyatt/ajax/hotel-auto-suggest.jsp?s='+searchStr+'&l=oltrta,co,st,ca&c=10', 'GET', t.resultNode, null);
			}
			if(searchStr == ''){
				t.cleanResults();
			}
		}

		// Initialize Polling if searchString is not the default value
		t.initSuggest = function(){
			if(t.searchBox.value != t.searchBoxDefaultValue && t.resultNode.innerHTML != ''){
				t.showResults();
			}
			t.polling = window.setInterval('HYJAX.pollSuggest()', t.pollingFrequency);
		}


		// Remove Polling and hide results
		t.stopSuggest = function(){
			t.polling = false;
			clearInterval(t.polling);
			t.cleanResults();
		}

		// Clear and Hide Results Div
		t.cleanResults = function(){
			t.resultNode.innerHTML = '';
			t.resultNode.style.display = 'none';
		}

		// Display Results Div if valid results exist
		t.showResults = function(){
			if(t.validResults()){
				t.resultNode.style.display = 'block';
			}else{
				t.cleanResults();
			}
		}

		// Create A Container and Results Div to Show/Hide
		t.createResultsDiv = function(){
			var relative_div = document.createElement('div');
			relative_div.id = 'auto-suggest-container';
			//relative_div.style.display = 'none';

			var results_div = document.createElement('div');
			results_div.id = 'auto-suggest';
			results_div.style.display = 'none';
			relative_div.appendChild(results_div);

			t.searchBox.parentNode.insertBefore(relative_div, t.searchBox.nextSibling);
			t.searchBox.setAttribute('autocomplete', 'off');

			t.resultNode = results_div;
			return t.resultNode;
		}

		// Set up Event Handlers etc.
		t.assignSuggest = function(){
			t.searchBox.onfocus = function(){t.initSuggest();}
			t.searchBox.onblur = function(){setTimeout(t.stopSuggest, t.hideDelay);}

			// Event.observe is from Prototype.js - This is now a dependency - AG 10.18.2006
			// =============================================================================
			// Respond to user keyboard navigation - Up/Down/Enter/Esc
			Event.observe(t.searchBox, "keypress", t.captureKeyPress.bindAsEventListener(t));

			// Clear Highlighting when mouse is over the results
			Event.observe(t.resultNode, "mouseover", t.clearResultHighlighting.bindAsEventListener(t));
		}


		// Constructor - Look for input with searchTerms id and assign behaviours
		// =========================================================================
		t.init = function(){
			t.searchBoxes = $$('.auto-suggest');
			if(t.searchBoxes[0]){t.searchBox = t.searchBoxes[0];}
			t.searchBoxDefaultValue = t.searchBox.value;
			if(t.searchBox){
				t.createResultsDiv();
				t.assignSuggest();
				t.cleanResults();
			}
		}

	}

var HYJAX = new HYJAX();

addEvent(window, 'load', HYJAX.init);











// Utility Functions
// =========================================================================

function addEvent( obj, type, fn ) {
  if ( obj.attachEvent ) {
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
    obj.attachEvent( 'on'+type, obj[type+fn] );
  } else
    obj.addEventListener( type, fn, false );
}

// Firebug Console Wrapper for IE
var console = (console)?console:{log: function(message){alert(message);}}
