/*  =================================================   */
/*      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(t.resultIndex > 0 && (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);}}
