var UP=38;var DOWN=40;var ESC=27;var ENTER=13; var TAB=9;
var searchInProgress = false;
var __ajaxTimer;
var __timerId;
var __keyPressed=0;
var __timeout = 100;
var keyArr;
var arrowIndex=-1;
var suggest_cache = {};
var startTime=null;
var responseTime=null;

function xajax_getCities(elem, val){
  var tjHttp = new TJ_HTTP();
  var airportOnly = $(elem).getAttribute('airportCitiesOnly')?1:0;
  tjHttp.getAsync('/i/citysuggest.php?e='+elem+'&v='+escape(val)+'&a='+airportOnly, function(responseText)
    {
	  urchinTracker("/ajax/citysuggest");
      eval("window.response = "+responseText);
      var response = window.response;
      suggestValues(response.elementId, response.values, response.keys, response.searchValue);
    });
}
function autoSuggestFocus(elementId) {
    var element = $(elementId);
    if (element.getAttribute('programFocus') == 'yes') {
       element.setAttribute('programFocus', '');
       return;
    }
    if (element.value == element.getAttribute("info")) {
        element.value = "";
        if (element.getAttribute('mtd') != 'City')
            element.onkeyup();
    } else {
        element.select();
        if (element.getAttribute("autoSuggestOnFocus") == element.value && element.value != element.getAttribute("oldValue")) {
            if (element.onkeyup)
                element.onkeyup();
        } else if (element.onkeyup && element.value != "" && element.value != element.getAttribute("oldValue")) {
            var newValue = element.value;
            newValue = newValue.substring(0,3);
        	element.setAttribute('goBackMode', 'yes');
            if (element.getAttribute('cache') == 1) {
              var key = element.getAttribute('mtd')+"_"+newValue.replace(/[^a-z0-9]/gi,'_');
              if (typeof(suggest_cache[key]) != 'undefined') {
                suggestValues(elementId, suggest_cache[key].values, suggest_cache[key].keys, newValue);
                return;
              }
            }
            var jsNewValue = newValue.replace(/\\/g,"\\\\");
            eval("xajax_"+element.getAttribute("mtd")+"('"+elementId+"','"+jsNewValue+"')");
        }
    }
    element.className = element.className.replace("infoText", "");
}

function searchSuggest(elementId, method, timeout, event) {
	var keyPressed = 0;
	if (window.event) keyPressed = window.event.keyCode;  else keyPressed = !event?0:event.which;
    var element = $(elementId);
    var newValue = $(elementId).value;
    if (!timeout) newTimeout=__timeout; else newTimeout = timeout;
    if (keyPressed == ENTER) {
      if (element.getAttribute('onenter')) {
	    element.blur();
        eval(element.getAttribute('onenter'));
        return;
      }
    }
	if (element.getAttribute("oldValue") == newValue && newValue != "") { 
	   return;
	}
    __keyPressed = new Date().getTime();
    
	if (searchInProgress) {
		waitForSearchCompletion(elementId, method, timeout);
		return;
	}
    
    clearTimeout(__ajaxTimer);
	__ajaxTimer = setTimeout(
        function() {
        	$(elementId).setAttribute("oldValue", newValue);
        	$(elementId+"_id").value = "";
            if (element.getAttribute('cache') == 1) {
              var key = element.getAttribute('mtd')+"_"+newValue.replace(/[^a-z0-9]/gi,'_');
              if (typeof(suggest_cache[key]) != 'undefined') {
                suggestValues(elementId, suggest_cache[key].values, suggest_cache[key].keys, newValue);
          	    __ajaxTimer = null;
                return;
              }
            }
  	        searchInProgress=true;
        	var jsNewValue = newValue.replace(/\\/g,"\\\\");
        	jsNewValue = jsNewValue.replace(/'/g,"\\'");
        	eval(method+"('"+elementId+"','"+jsNewValue+"')");
        	__ajaxTimer = null;
        }	
     	, timeout);
}

function waitForSearchCompletion(elementId, method, timeout, waitCount) {
    if (!waitCount) waitCount = 0;
	clearTimeout(__timerId);
	if (!searchInProgress || waitCount > 50) {
	  searchInProgress = false;
	  searchSuggest(elementId, method, timeout);
	  __timerId = null;
	} else {
	  waitCount++;
   	  __timerId = setTimeout("waitForSearchCompletion('"+elementId+"','"+method+"',"+timeout+","+waitCount+")", timeout);
   	}
}

function suggestValues(elementId, values, keys, searchValue) {
    hideOtherSuggest(elementId);
	arrowIndex=-1;
	if (typeof(values) != 'object') {
    	var valArr = values.split("|");
   	    keyArr = keys.split("|");
    } else {
        var valArr = values;
        keyArr = keys;
    }
	var element = $(elementId);
	if (element.getAttribute('cache') == 1) {
	  suggest_cache[element.getAttribute('mtd')+"_"+searchValue.replace(/[^a-z0-9]/gi,'_')] = {'values':values,'keys':keys};
	}
	var idiv = $(elementId+"_suggest");
	var sDivContent = "";
	idiv.innerHTML="";
	var defaultSet = false;
	if (element.getAttribute('mtd') == 'CityXX' && element.getAttribute('goBackMode') != "yes" && !__timerId) {
    	var lowerCityName = element.value.toLowerCase().trim();
    	if (lowerCityName != "") {
        	if (lowerCityName.indexOf(",") < 0) lowerCityName = lowerCityName+",";
        	for (var i=0;i < valArr.length;i++) {
        	  var valWithoutHighlight = valArr[i].replace(/<\/?SPAN>/gi,"").toLowerCase();
        	  if (valWithoutHighlight.startsWith(lowerCityName) || valWithoutHighlight.indexOf("("+lowerCityName.replace(",","")+")") >= 0 || valArr.length == 2) {
            	  setAutoSuggestValue(elementId, keyArr[0], valArr[0].replace(/<\/?SPAN>/gi,""));
                  hideSuggest(elementId);
              	  defaultSet = true;
              	  searchInProgress = false;
              	  return;
        	  }
        	}
    	}
	}
	element.setAttribute('goBackMode', '');
	
	for(var i=0; i < valArr.length; i++) {
	    if (valArr[i] == '') continue;
        var actualText = valArr[i].replace(/<\/?SPAN>/gi,"");
        actualText = actualText.replace(/[^a-zA-Z]/gi,"");
        
        var suggest = '<div onmouseover="javascript:suggestOver(this,'+i+', 1);" id="'+elementId+'_options_'+keyArr[i]+'" ';
        suggest += 'onmouseout="javascript:suggestOut(this,'+i+');" ';
        suggest += 'onclick="javascript:setSearch(\''+elementId+'\',this.innerHTML,\''+keyArr[i]+'\');" ';
        suggest += 'class="suggest_link" secondId="'+elementId+'_'+actualText+'">' ;
        suggest += valArr[i];
        suggest += '</div>\n';
        sDivContent += suggest;
	}
	if (element.getAttribute("noAdd") != "1") {
	    var method = element.getAttribute("mtd");
		sDivContent += eval("get"+method+"AddLink('"+elementId+"')");
	}
	if (sDivContent != "") { 
    	//sDivContent = '<div class="closeSuggest"><a href="#" onclick="hideOtherSuggest(null);return false;"><img src="/i/images/close.gif"/></a></div>'+sDivContent;		
    	if (IsIE()) { 
    		sInnerHtml = "<div id='" + elementId + "_suggest_content'>";
    		sInnerHtml += sDivContent;
    		sInnerHtml += "</div>";
    		sInnerHtml += "<iframe id='" + elementId + "_suggest_iframe' src='/i/blank.html' frameborder='1' scrolling='no'></iframe>";
    		idiv.innerHTML = sInnerHtml;
    		var divContent=$(elementId + "_suggest_content");
    		var divIframe=$(elementId + "_suggest_iframe");
    				
    		divContent.className="suggestOverBase";
    		idiv.className="suggestBase";
    
    		if (divContent.offsetHeight >= 200) {
    			divContent.style.height = "200px";
    		} else {
    			divContent.style.height = divContent.offsetHeight+'px';
    		}
    		divContent.style.width = (divContent.offsetWidth+20)+"px";
    		divContent.style.overflow = "auto";
    		
    		divIframe.style.width = (divContent.offsetWidth) + 'px';
    		divIframe.style.height = divContent.offsetHeight + 'px';
    		divIframe.marginTop = "-" + divContent.offsetHeight + 'px';
    	}
    	else {
    		sInnerHtml=sDivContent;
    		idiv.innerHTML = sInnerHtml;
    		idiv.className="suggest_box visible";
    	}
    	element.onkeydown = keyDown;
    	if (valArr.length > 0) {
    //    	typeAhead(elementId, keyArr, valArr);
        }
    } else {
      hideSuggest(elementId);
    }
	searchInProgress=false;
}

function typeAhead(elementId, keyArr, valueArr) {
    var element = $(elementId);
    var idElement = $(elementId+"_id");
    for (var i=0;i<keyArr.length;i++) {
        key = keyArr[i];
        value = valueArr[i];
    	value = value.replace(/<\/?SPAN>/gi,"");
        if (value.toLowerCase().startsWith(element.value.toLowerCase())) {
            if (element.createTextRange || element.setSelectionRange){
                var iLen = element.value.length; 
                element.setAttribute("typedValue", element.value);
                element.value = value; 
                selectRange(element, iLen, value.length);
                idElement.value = key;
                element.setAttribute("oldValue", value);
            }
            return;
        }
    }
}

function selectRange(element, iStart, iLength) {
    //use text ranges for Internet Explorer
    if (element.createTextRange) {
        var oRange = element.createTextRange(); 
        oRange.moveStart("character", iStart); 
        oRange.moveEnd("character", iLength - element.value.length);      
        oRange.select();
        
    //use setSelectionRange() for Mozilla
    } else if (element.setSelectionRange) {
        element.setSelectionRange(iStart, iLength);
    }     

    //set focus back to the textbox
    element.focus();      
}


function getCityAddLink(elementId){
    var element = $(elementId);
    if (element.value.trim != "")
        return '<div id="'+elementId+'_add" class="suggest_link"><a href="#" onfocus="this.blur();" onclick="addAutoSuggestItem(\''+elementId+'\');return false;">Can\'t find a city? Add it -> <span>'+element.value+'</span></a></div>';
}

function getTagAddLink(elementId){
    var element = $(elementId);
    if (element.value.trim() != "")
        return '<div class="suggest_link"><a href="#" onfocus="this.blur();" onclick="addAutoSuggestItem(\''+elementId+'\');return false;">can\'t find the right label? Add it -> <span>'+element.value+'</span></a></div>';
    else
        return '<div class="suggest_link"><a href="#" onfocus="this.blur();" onclick="addAutoSuggestItem(\''+elementId+'\');return false;">Can\'t find the right label? Add new >> </a></div>';
}

function getVenueAddLink(elementId){
    var element = $(elementId);
    if (element.value.trim() != "")
        return '<div class="suggest_link"><a href="#" onfocus="this.blur();" onclick="addAutoSuggestItem(\''+elementId+'\');return false;">can\'t find the right Venue? Add it -> <span>'+element.value+'</span></a></div>';
    else
        return '<div class="suggest_link"><a href="#" onfocus="this.blur();" onclick="addAutoSuggestItem(\''+elementId+'\');return false;">Can\'t find the right Venue? Add new >> </a></div>';
}

function addAutoSuggestItem(elementId) {
    eval("suggestAdd"+$(elementId).getAttribute("mtd")+"('"+elementId+"')");
}

function suggestAddCity(elementId) {
	var element = $(elementId);
	hideSuggest(elementId);
	openPlainWindow('/city/add?cityname='+element.value+'&elementId='+elementId, 500, 400);
}

function suggestAddTag(elementId) {
	var element = $(elementId);
	hideSuggest(elementId);
	var value = element.value;
	if (value == element.getAttribute("info"))
	   value = "";
	openPlainWindow('/tag/add?tagname='+value+'&elementId='+elementId+'&tagType='+element.getAttribute('tagType'), 500, 400);
}

function suggestAddVenue(elementId) {
	var element = $(elementId);
	hideSuggest(elementId);
	var value = element.value;
	if (value == element.getAttribute("info"))
	   value = "";
	openPlainWindow('/venue/add?name='+value+'&elementId='+elementId, 500, 400);
}

function setAutoSuggestValue(elementId, id, value) {
	if ($(elementId)) {
		$(elementId).value = value;
		$(elementId).setAttribute("oldValue", value);
		$(elementId+"_id").value = id;
	}
}

window.setAutoSuggestValue = setAutoSuggestValue;

function keyDown(e) { 
	var keyPressed = 0;
	if (document.all) keyPressed = window.event.keyCode;  else keyPressed = e.which;
	switch(keyPressed){
		case UP: arrowSelection(this,'UP');break;
		case DOWN: arrowSelection(this,'DOWN');break;
		case TAB: 
		case ENTER: 
		        if (this.value != this.getAttribute("oldValue")) {
		           return true;
		        }
		        var element = this;
		        var fn = function() {
                	if (searchInProgress || __ajaxTimer) {
                   	   setTimeout(fn, 100);
                   	   return;
                   	}                    
                   	if (arrowIndex == -1) arrowIndex = 0;
    				if(arrowIndex >= 0 && arrowIndex < keyArr.length ){ 
    					var tempObj=document.getElementById(element.id+'_options_'+keyArr[arrowIndex]);
    					if (!tempObj) 
        					hideSuggest(element.id);
    		            else {
    		                setSearch(element.id, tempObj.innerHTML, keyArr[arrowIndex]);
    		                if (keyPressed == ENTER) {
    		                  if (element.getAttribute('onenter')) {
                        	    element.blur();
    		                    eval(element.getAttribute('onenter'));
    		                  }
    		                }
    		            }
    		        } 
		        }
		        fn();
				return false; 
		case ESC:hideSuggest(this.id);break;
		default: break;
	}
}

function lostFocus(id, loopCount) {
    if (!loopCount) loopCount=1;
	if ((searchInProgress || __ajaxTimer) && loopCount < 50) {
	   loopCount++;
   	   setTimeout("lostFocus('"+id+"',"+loopCount+");", 100);
   	   return;
   	}
    if (arrowIndex == -1) arrowIndex = 0;
	if(arrowIndex >= 0 && keyArr && arrowIndex < keyArr.length ){ 
	  var tempObj=document.getElementById(id+'_options_'+keyArr[arrowIndex]);
	  if (tempObj) 
        setSearch(id, tempObj.innerHTML, keyArr[arrowIndex]);
    }
	setTimeout('hideSuggest("'+id+'");', 500);
}

function arrowSelection(obj,index) { 
    if (!keyArr) return;
	var suggestboxoldid;
	var arrLen = keyArr.length -1;
	var newArrowIndex = arrowIndex;
	if(index=='DOWN') {
		newArrowIndex++;
	} else {
		newArrowIndex--;
	}
    if(newArrowIndex < 0) return; 
    if (newArrowIndex > arrLen) {
      if ($(obj.id+"_add")) $(obj.id+"_add").scrollIntoView(false);
	  return;
	} 
	suggestbox=$(obj.id+'_options_'+keyArr[newArrowIndex]);	
	suggestOver(suggestbox,newArrowIndex);
}

function suggestOver(div_value,indexVal, bymouse) { 
    if (!keyArr) return;
    var tmpIndex=arrowIndex<0?0:arrowIndex;
    if (div_value) {
        var suggestboxold=$(div_value.id.replace("_"+keyArr[indexVal], "_"+keyArr[tmpIndex]));
    	suggestOut(suggestboxold);
	}
	arrowIndex=indexVal;
	div_value.className = 'suggest_link_over';
	if (!bymouse)
       	div_value.scrollIntoView(false);
}

function suggestOut(div_value) {
	arrowIndex=-1;
	if (div_value)
    	div_value.className = 'suggest_link';
}

function setSearch(elementId, displayValue, displayKey) {
	displayValue = displayValue.replace(/<\/?SPAN>/gi,"");
	$(elementId).value = displayValue;
	$(elementId).setAttribute("oldValue", displayValue);
	$(elementId+"_id").value = displayKey;
	hideSuggest(elementId);
}

function hideSuggest(elementId) {
    var element = $(elementId);
	$(elementId+"_suggest").className = 'suggest_box';
	element.onkeydown = null;
	if (element.value.trim() == "" && element.getAttribute("info") != null) {
	   element.value = element.getAttribute("info");
       element.className = element.className + " infoText";
    } 
    keyArr = null;
    arrowIndex = -1;
}

function hideOtherSuggest(excludeElementId) {
    try {
        var textBoxes = document.getElementsByTagName("input");
        for(var i=0;i<textBoxes.length;i++) {
           if (textBoxes[i].type == "text" && textBoxes[i].id != excludeElementId && $(textBoxes[i].id+"_suggest")) {
              hideSuggest(textBoxes[i].id);
           }
        }
    } catch(e) {}
}

function showSuggest(elementId) {
    if($(elementId+"_suggest").innerHTML != "") {
    	$(elementId+"_suggest").className = 'suggestBase';
    	$(elementId).onkeydown = keyDown;
	}
}

function IsIE() {
	return ( navigator.appName=="Microsoft Internet Explorer" ); 
}
	
function IsNav() {
	return ( navigator.appName=="Netscape" );
}
