prnDev = function(str) {
/*
	if(!document.getElementById('myTrace')) {
		var myTrace = document.createElement('textarea');
		myTrace.id = "myTrace";
		document.getElementById('sirena_inside_block').appendChild(myTrace);
	}
	
	str = decodeURIComponent(str);

	var old = document.getElementById('myTrace').value;
	document.getElementById('myTrace').value = str + "\n" + old;
*/
};

resetAutosuggest = function(otherId, value) {
			
	prnDev('преставил autosuggest для инпута \'' + otherId + '\' в значение \'' +  value + '\'\n');
			
	if(otherId == 'originCityName') {
		var id = 'destinationCityName';
		var list = 'destinationCityAutosuggestList'
	}
	else if(otherId == 'destinationCityName') {
		var id = 'originCityName';
		var list = 'originCityAutosuggestList';
	}
	value = encodeURIComponent(value);
	if(useDependenceCities == "true") {
		setAutosuggest(id, list, document.getElementById(id).value, "json/dependence-cities?isBooking=true&cityName=" + value + "&param=" + getUrlParamById(id) + "&type=json");
	}
	else if(useDependenceCities == "false") {
		setAutosuggest(id, list, document.getElementById(id).value, "json/dependence-cities?isBooking=true&param=" + getUrlParamById(id) + "&type=json");
	}
	else if(useDependenceCities == "originOnly") {
        if(id == 'originCityName') {
            setAutosuggest(id, list, document.getElementById(id).value, "json/dependence-cities?isBooking=true&param=" + getUrlParamById(id) + "&type=json");
        }
        else if(id == 'destinationCityName') {
            setAutosuggest(id, list, document.getElementById(id).value, "json/dependence-cities?isBooking=true&cityName=" + value + "&param=" + getUrlParamById(id) + "&type=json");
        }
    }
};

var setAutosuggest = function(inpId, listId, defCity, xmlUrl) {
	
    //var cityListVariant = new Array();
	var cityNameInput = document.getElementById(inpId);
	var autosuggestList = document.getElementById(listId);
	var cityNameDict = document.getElementById(inpId + 'Dict');
	
	// По клику на справочник
	switch (document.getElementById("citiesListStyle").value) {
		case "window":
			cityNameDict.onclick = function() {
				// Снимаем подсветку
				unSetErrStyle(cityNameInput);
				// открываем оконце
				openDictWin(inpId);
			};
		break;
		case "select":
			if(Globals.isIE6()) {
				cityNameDict.onclick = function() {
					// Снимаем подсветку
					unSetErrStyle(cityNameInput);
					// открываем оконце
					openDictWin(inpId);
				};
			}
			else {
				cityNameDict.onclick = function() {
					// Снимаем подсветку
					unSetErrStyle(cityNameInput);
					// открываем селект
					openDictSel(inpId);
				};
			}
		break;
		case "gmap":
			cityNameDict.onclick = function() {
				// Снимаем подсветку
				unSetErrStyle(cityNameInput);
				// открываем карту
				openGMapWin(inpId);
			};
		break;
	}

	if(autosuggestList) {
	
	if(!document.getElementById(inpId + '-tmp')) {
		var tmpInp = document.createElement('input');
		tmpInp.id = inpId + '-tmp';
		tmpInp.type = 'hidden';
		tmpInp.value = '';
		
		cityNameInput.parentNode.appendChild(tmpInp);
	}

	if(!document.getElementById(inpId + '-cityNameList')) {
		getArrFromXMLasync("json/dependence-cities?isBooking=true&param=" + getUrlParamById(inpId) + "&type=json", setFullArr, cityNameInput);
	}	
	
	var cityUserVariant = defCity;
	cityNameInput.value = cityUserVariant;
	
	cityNameInput.onblur = function() {
	// когда потерян фокус ввода
		if(this.value=='') {
		// если инпут пуст			
				if(getTmp(this) == '') {
				// если прежде корректных значений не было
					this.value=defCity;
				}
				else {
				// если прежде было корректное значение
					this.value = getTmp(this);
				}			
		}
		else if(checkCityName(this.value, this.id)) {
		// если город введён правильно
				if(getTmp(this) == '') {
				// если прежде корректных значений не было
					setTmp(this);
					resetAutosuggest(this.id, this.value);
				}
				else if(getTmp(this) != this.value) {
				// если прежде было другое значение
					setTmp(this);
					resetAutosuggest(this.id, this.value);
				}
		}
		else if(checkCityCode(this.value, this.id)) {
		// если код города введён правильно
				this.value = getCityNameByCode(this.value, this.id);
			
				if(getTmp(this) == '') {
				// если прежде корректных значений не было
					setTmp(this);
					resetAutosuggest(this.id, this.value);
				}
				else if(getTmp(this) != this.value) {
				// если прежде было другое значение
					setTmp(this);
					resetAutosuggest(this.id, this.value);
				}			
		}
		else {
		// если введена фигня
				setErrStyle(this);
		}
		
		if(autosuggestList) autosuggestList.style.display = "none";
	};
	cityNameInput.onfocus = function() {
		if(!unSetErrStyle(this)) {
			this.value='';
		}
		
		if(autosuggestList) autosuggestList.style.width = (this.offsetWidth-2) + "px";
		
		var cityListVariant;
        if(useDependenceCities) {
			cityListVariant = getArrFromXML(xmlUrl);
		}
		else {
			cityListVariant = getTmpList(this);
		}
		
		this.onkeypress  = function(event) {
			if(!event)event=window.event;
			var key = event.keyCode;
			if(key == 40) {
				return false;
			}
			if(key == 13) {
				return false;
			}			
		};
		this.onkeyup  = function(event) {
			//this.value = this.value.toUpperCase();
			if (!event)event=window.event;
			var key = event.keyCode;
			cityUserVariant = this.value.toUpperCase();
			if(cityUserVariant != '' && cityListVariant && cityListVariant.name) {
				var tmpArr = getArrToUser(cityListVariant, cityUserVariant);
				if(!tmpArr.name[0]) autosuggestList.style.display = "none";
				else {
					if(autosuggestList.style.display != "block") autosuggestList.style.display = "block";
					if(key == 38 || key == 40) {
						moveHover(autosuggestList, key);
						return false;
					}
					else if(key == 13) {
						setInpValue(cityNameInput, autosuggestList);
						return false;
					}
					else {
						printTmpArr(tmpArr, autosuggestList);
						return false;
					}
				}
			}
			else autosuggestList.style.display = "none";
			return false;
		};
	};
}
};

setFullArr = function(fullArr, cityNameInput) {

	var inpId = cityNameInput.id;

	var cityNameListInp = document.createElement('input');
	cityNameListInp.id = inpId + '-cityNameList';
	cityNameListInp.type = 'hidden';
	cityNameListInp.value = fullArr.name;

	var cityCodeListInp = document.createElement('input');
	cityCodeListInp.id = inpId + '-cityCodeList';
	cityCodeListInp.type = 'hidden';
	cityCodeListInp.value = fullArr.code;

	cityNameInput.parentNode.appendChild(cityNameListInp);
	cityNameInput.parentNode.appendChild(cityCodeListInp);

	prnDev('записал все возможные города для \'' + inpId + '\'\n< ' +  cityNameListInp.value + '>\n');
	prnDev('записал все возможные коды города для \'' + inpId + '\'\n< ' +  cityCodeListInp.value + '>\n');	

};

setTmp  = function(input) {
	document.getElementById(input.id + '-tmp').value = input.value;
	prnDev('пишу tmp \'' + document.getElementById(input.id + '-tmp').value + '\'\n');

};

getTmp  = function(input) {	
	prnDev('читаю tmp \'' + document.getElementById(input.id + '-tmp').value + '\'\n');
	return document.getElementById(input.id + '-tmp').value;
};

getTmpList  = function(input) {	
	var arr = new Array();
	var nameEle = document.getElementById(input.id + '-cityNameList');
	var codeEle = document.getElementById(input.id + '-cityCodeList');
	if(nameEle) {
		arr.name = nameEle.value.split(',');
	}
	if(codeEle) {
		arr.code = codeEle.value.split(',');
	}

	return arr;

};

var getArrFromXML = function(url) {
	var arr = new Array();
	arr.name = new Array();
	arr.code = new Array();
	var req = Spry.Utils.loadURL("GET", url, false, null, { errorCallback: getOldArr});
	if(req) {

		eval("var obj = " + req.xhRequest.responseText);

        var i=0;
        for(var part in obj) {
            for(var city in obj[part]) {
                arr.name[i] = city;
                arr.code[i] = obj[part][city];
                i++;
            }
        }

		prnDev('Получил XML от ' + url + '\n< ' + arr.name + ' >\n< ' + arr.code + ' >\n');

		return arr;

	}
	else {
		return null;
	}
};

var getOldArr = function(req) {
	// Не загружено - статус
	if(req.xhRequest.status != "200") {
		var inpID = "";
		var listID = "";
		if(req.url.indexOf("origin") != -1) {
			inpID = "originCityName";
			listID = "originCityAutosuggestList";
		}
		if(req.url.indexOf("destination") != -1) {
			inpID = "destinationCityName";
			listID = "destinationCityAutosuggestList";
		}		
		if(inpID != "") {
			tmpList = getTmpList(document.getElementById(inpID));
			dictWin = document.getElementById(listID);
			dictWin.style.display = "block";
			showDictError(dictWin, req.xhRequest.status);
			for(var i = 0; i < tmpList.name.length; i++) {
				setListItem(dictWin, tmpList.name[i]);
			}
		}
	}
};

var dependenceCitiesServletBusy = false;
var delayActionTmp = false;

getArrFromXMLasync = function(url, callback, cityNameInput) {
    if(dependenceCitiesServletBusy) {
        delayActionTmp = {};
        delayActionTmp.url = url;
        delayActionTmp.callback = callback;
        delayActionTmp.cityNameInput = cityNameInput;
    }
    else {
        dependenceCitiesServletBusy = true;
	    var req = Spry.Utils.loadURL("GET", url, true, getArrFromXMLasyncParse, { errorCallback: MyErrorCallback, lastCallback: callback, input: cityNameInput });
    }
};

getArrFromXMLasyncParse = function(req) {

    if(dependenceCitiesServletBusy) {
        dependenceCitiesServletBusy = false;
        if(delayActionTmp) {
            getArrFromXMLasync(delayActionTmp.url, delayActionTmp.callback, delayActionTmp.cityNameInput);
            delayActionTmp = false;
        }
    }

	var arr = new Array();
	arr.name = new Array();
	arr.code = new Array();
	
	eval("var obj = " + req.xhRequest.responseText);

    var i=0;
    for(var part in obj) {
        for(var city in obj[part]) {
            arr.name[i] = city;
            arr.code[i] = obj[part][city];
            i++;
        }
    }

	req.lastCallback(arr, req.input);
};

MyErrorCallback = function(req) {
	/*if(req.userData)
	  alert(req.userData.msg);
  else alert(123);*/
};

getArrToUser = function(fullArr, userStr) {
	var shortArr = new Array();
	shortArr.name = new Array();
	shortArr.code = new Array();
	var j = 0;
	for(var i=0; i < fullArr.name.length; i++ ) {
		if(fullArr.name[i].toUpperCase().indexOf(userStr) == 0 || fullArr.code[i].indexOf(userStr) == 0) {
			var re = new RegExp("(" + userStr + ")", "i");
			shortArr.name[j] = fullArr.name[i].replace(re, "<b>$1</b>");
			shortArr.code[j] = fullArr.code[i].replace(re, "<b>$1</b>");
			j++;
		}

	}
	return shortArr;
};

printTmpArr = function(arr, ul) {
	clearList(ul);
	for(var i=0; i < arr.name.length; i++) {
		setListItem(ul, arr.name[i], arr.code[i]);
	}
};

clearList = function(list) {
	if(list.firstChild) {
		list.removeChild(list.firstChild);
		clearList(list);
	}
};

setListItem = function(list, cityName, cityCode) {
	var item = document.createElement('li');
	if(cityCode) {
		item.innerHTML = cityName + '<span>' + cityCode + '</span>';
	}
	else {
		item.innerHTML = cityName;
	}
	item.onmousedown = function() {
		setInpValue(list.parentNode.getElementsByTagName('input')[0], list);
	};
	item.onmouseover = function() {
		for(var i=0; i < list.childNodes.length; i++) {
			if(list.childNodes[i].className == 'act') list.childNodes[i].className = ''; 
		}		
		this.className = 'act';
	};
	item.onmouseout = function() {
		this.className = '';
	};
	list.appendChild(item);
};

moveHover = function(list, key) {
	var isFresh = true;
	var actNum = -1;
	for(var i=0; i < list.childNodes.length; i++) {
		if(list.childNodes[i].className == 'act') {
			isFresh = false;
			actNum = i;
		}
	}
	if(isFresh) list.firstChild.className = 'act';
	if(actNum != -1) {
		list.childNodes[actNum].className = '';
		if(key == 40) {
			if(actNum + 1 == list.childNodes.length) list.childNodes[0].className = 'act';
			else list.childNodes[actNum + 1].className = 'act';
		}
		if(key == 38) {
			if(actNum == 0) list.childNodes[list.childNodes.length - 1].className = 'act';
			else list.childNodes[actNum - 1].className = 'act';
		}
	}

};

getHoverStr = function(list) {
	for(var i=0; i < list.childNodes.length; i++) {
		if(list.childNodes[i].className == 'act') {
			var textStr = list.childNodes[i].innerHTML;
			textStr = textStr.replace(/<\/?b>/gim, "");
			textStr = textStr.replace(/<span>\D*<\/span>/gim, "");
			return textStr;
		}		
	}
	return false;
};

setInpValue = function(inp, list) {
	var hoverStr = getHoverStr(list);
	if(hoverStr) {
		inp.value = hoverStr;
		prnDev('поставил значение \'' + inp.value + '\' в ' + inp.id + '\n');
	}	
	
	list.style.display = "none";
};

getUrlParamById = function(id) {
	if(id == "originCityName") return "origin";
	if(id == "destinationCityName") return "destination";
};

revertParam = function(str) {
	if(str == "origin") return "destination";
	else return "origin";
};

revertId = function(str) {
	if(str == "originCityName") return "destinationCityName";
	else return "originCityName";
};


checkCityName = function(cityName, inpId) {
	if(document.getElementById(inpId + '-cityNameList')) {
		var nameArr = document.getElementById(inpId + '-cityNameList').value.split(',');
	
		for(var i=0; i < nameArr.length; i++) {
			if(nameArr[i].toUpperCase() == cityName.toUpperCase()) {
				return true;
			}
		}
	}
	return false;
};

checkCityCode = function(cityCode, inpId) {
	if(cityCode.length == 3) {
		var codeArr = document.getElementById(inpId + '-cityCodeList').value.split(',');
		for(var i=0; i < codeArr.length; i++) {
			if(codeArr[i] == cityCode.toUpperCase()) {
				return true;
			}
		}
		return false;
	}
	else {
		return false;
	}
};

getCityNameByCode = function(cityCode, inpId) {
	var codeArr = document.getElementById(inpId + '-cityCodeList').value.split(',');
	var nameArr = document.getElementById(inpId + '-cityNameList').value.split(',');
	for(var i=0; i < codeArr.length; i++) {
		if(codeArr[i] == cityCode.toUpperCase()) {
			return nameArr[i];
		}
	}
};

getCityCodeByName = function(cityName, inpId) {
	var codeArr = document.getElementById(inpId + '-cityCodeList').value.split(',');
	var nameArr = document.getElementById(inpId + '-cityNameList').value.split(',');
	for(var i=0; i < nameArr.length; i++) {
		if(nameArr[i].toUpperCase() == cityName.toUpperCase()) {
			return codeArr[i];
		}
	}
	return false;
};

setErrStyle = function(node) {
	node.className += ' inpErr';
};

unSetErrStyle = function(node) {
	if(/ inpErr/.test(node.className)) {
		node.className = node.className.replace(' inpErr', '');
		return true;
	}
	else {
		return false;
	}
};


var openDictWin = function(inpId) {
	var url="";
	var dependId = revertId(inpId);
	var dependStr = document.getElementById(dependId).value;
		
	if(checkCityName(dependStr, dependId)) {
		url="lettered-cities?isBooking=true&return=" + inpId + "&cityName=" + encodeURIComponent(dependStr);
	}
	else {
		url="lettered-cities?isBooking=true&return=" + inpId;
	}

	var yTop=120;
	if(navigator.userAgent.indexOf("Opera")!=-1) {
		yTop=55;
	}
	if(navigator.userAgent.indexOf("Mozilla")!=-1) {
		yTop=130;
	}
	var citiesWindow = window.open(url,"clientWindow","width=220,height=400,left=" + getElementPosition(inpId).left + ",top=" + (getElementPosition(inpId).top+yTop) + ",scrollbars=yes,menubar=no");
	citiesWindow.focus();
};

var openGMapWin = function() {
	var url = "/gmap/pages/gmap.jsf?set";
	var departureCity;
	var arrivalCity;

	departureCity = Spry.$("originCityName").value;
	arrivalCity = Spry.$("destinationCityName").value;

	var departureCityCode = getCityCodeByName(departureCity, "originCityName");
	var arrivalCityCode = getCityCodeByName(arrivalCity, "destinationCityName");
	if(departureCityCode && arrivalCityCode) {
		url += "&departureCity=" + encodeURI(departureCityCode) + "&arrivalCity=" + encodeURI(arrivalCityCode);
	}
	window.open(url, 'gmap', 'width=800, height=600');
};

var openDictSel = function(inpId) {
	// если открыто др окошко - мочим
	var dependId = revertId(inpId);
	var dependStr = document.getElementById(dependId).value;
	var dependDictWin = initDictWin(dependId);
	if(dependDictWin.style && dependDictWin.style.display == "block") {
		dependDictWin.style.display = "none";
	}
	// готовим окошко
	dictWin = initDictWin(inpId);
		
	if(dictWin.style.display == "block") {
		dictWin.style.display = "none";
		return false;
	}
	else {
		dictWin.style.display = "block";
		clearList(dictWin);
		showDictWaiting(dictWin);
		var url="";
		if(useDependenceCities == "true") {
		    fillList(inpId, dictWin, dependStr);
        }
        else if(useDependenceCities == "false") {
            fillList(inpId, dictWin, false);
        }
        else if(useDependenceCities == "originOnly") {

		    if(inpId == "originCityName") {
		        fillList(inpId, dictWin, false);
		    }
		    else {
		        fillList(inpId, dictWin, dependStr);
		    }

        }
		Spry.Utils.addEventListener(document.body, "click", function(event) { bodyClick(event); }, false);
	}
};

var fillList = function(inpId, dictWin, dependStr) {
	var list;
	if(dependStr) {
	    list = getArrFromXML("json/dependence-cities?isBooking=true&cityName=" + encodeURIComponent(dependStr) + "&param=" + getUrlParamById(inpId) + "&type=json").name;
    }
    else {
        list = getArrFromXML("json/dependence-cities?isBooking=true&param=" + getUrlParamById(inpId) + "&type=json").name;
    }
	hideDictWaiting(dictWin);
	for(var i = 0; i < list.length; i++) {
        setListItem(document.getElementById(dictWin.id), list[i]);
   }
};

var showDictWaiting = function(dictWin) {
	var waitingItem = document.createElement("li");
	waitingItem.id = dictWin.id + "Waiting";
	waitingItem.appendChild(document.createTextNode(dictLoadMessage));
	dictWin.appendChild(waitingItem);
};

var showDictError = function(dictWin, status) {
	var errorItem = document.createElement("li");
	errorItem.id = dictWin.id + "Error";
	errorItem.appendChild(document.createTextNode(dictErrorMessage + " - [" + status + "]"));
	dictWin.appendChild(errorItem);
};

var hideDictWaiting = function(dictWin) {
	var waitingItem = document.getElementById(dictWin.id + "Waiting");
	dictWin.removeChild(waitingItem);
};

function onMapSubmit(departure, arrival) {
	obj = document.getElementById('originCityName');
	if (obj != null)
		obj.value = departure;
	obj = document.getElementById('destinationCityName');
	if (obj != null)
		obj.value = arrival;
}
	
var initGMapBut = function() {
	Spry.$("gmap-link").style.display = "block";
	Spry.$("gmap-but").style.display = "block";
};

var bodyClick = function(event) {
	var pos = getElementPosition(dictWin.id);
	if(!checkHover(event.clientX, event.clientY, pos.left, pos.top, dictWin.offsetWidth, dictWin.offsetHeight)) {
		var but = document.getElementById(dictWin.parentNode.getElementsByTagName('input')[0].id + 'Dict');
		var butPos = getElementPosition(but.id);
		//if(!checkHover(event.clientX, event.clientY, butPos.left,butPos.top-10, but.offsetWidth, but.offsetHeight+10)) {
			//dictWin.style.display = "none";
		//}
	}
	else {
        dictWin.style.display = "none";
    }
};

var checkHover = function(mouseX, mouseY, eleLeft, eleTop, eleWidth, eleHeight) {
	// Если мышь на элементе
	if(mouseX >= eleLeft && mouseX <= (eleLeft+eleWidth) && mouseY >= eleTop && mouseY <= (eleTop+eleHeight)) {
		return true;
	}
	// Если вне
	else {
		return false;
	}
};

var initDictWin = function(inpId) {
	var inp = document.getElementById(inpId);
	var dictWin = inp.parentNode.getElementsByTagName('ol')[0];	
	return dictWin;
};

var setShowFullItem = function(dictWin, fullList, shortList) {
	var item = document.createElement('li');
	item.id = 'lstArrDwn';
	var msg = document.getElementById("showAllCitiesMes").value;
	item.innerHTML = '<img src="../img/s.gif" alt="' + msg + '" title="' + msg + '" />';

	item.onmousedown = function() {
		clearList(dictWin);
		for(var i = 0; i < fullList.length; i++) {
			setListItem(dictWin, fullList[i]);
		}
		setShowShortItem(dictWin, fullList, shortList);
	};
	item.onmouseover = function() {
		for(var i=0; i < dictWin.childNodes.length; i++) {
			if(dictWin.childNodes[i].className == 'act') dictWin.childNodes[i].className = ''; 
		}		
		this.className = 'act';
	};
	item.onmouseout = function() {
		this.className = '';
	};
	dictWin.appendChild(item);
};

var setShowShortItem = function(dictWin, fullList, shortList) {
	var item = document.createElement('li');
	item.id = 'lstArrUp';
    var msg;
	switch (dictWin.id) {
		case "destinationCityAutosuggestList":
			msg = document.getElementById("showForArrCitiesMes").value + document.getElementById("originCityName").value;
		break;
		case "originCityAutosuggestList":
			msg = document.getElementById("showForDepCitiesMes").value + document.getElementById("destinationCityName").value;
		break;
	}	
			
	item.innerHTML = "<img src='../img/s.gif' alt='" + msg + "' title='" + msg + "' />";
			
	item.onmousedown = function() {
		clearList(dictWin);
		for(var i = 0; i < shortList.length; i++) {
			setListItem(dictWin, shortList[i]);
		}
		setShowFullItem(dictWin, fullList, shortList);
	};
	item.onmouseover = function() {
		for(var i=0; i < dictWin.childNodes.length; i++) {
			if(dictWin.childNodes[i].className == 'act') dictWin.childNodes[i].className = ''; 
		}		
		this.className = 'act';
	};
	item.onmouseout = function() {
		this.className = '';
	};
	dictWin.appendChild(item);	
};

var getElementPosition = function(elemId) {
	var elem = document.getElementById(elemId);
    var l = 0;
    var t = 0;
    while (elem)
    {
        l += elem.offsetLeft;
        t += elem.offsetTop;
        elem = elem.offsetParent;
    }
    return {"left":l, "top":t};
};


