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) {
		setAutosuggest(id, list, document.getElementById(id).value, "xml/dependence-cities?cityName=" + value + "&param=" + getUrlParamById(id));
	}
	else {
		setAutosuggest(id, list, document.getElementById(id).value, "xml/dependence-cities?param=" + getUrlParamById(id));		
	}
};

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(!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("xml/dependence-cities?param=" + getUrlParamById(inpId), setFullArr, cityNameInput);
		//var fullArr = getArrFromXML("xml/dependence-cities?param=" + getUrlParamById(inpId));
		/*
		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');
		*/
	}	
	
	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);
		}
		
		autosuggestList.style.display = "none";		
	};
	cityNameInput.onfocus = function() {
		if(!unSetErrStyle(this)) {
			this.value='';
		}
		
		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;

};

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: MyErrorCallback});
    var doc = req.xhRequest.responseXML;
    if (!doc || !doc.firstChild) {
        doc = Spry.Utils.stringToXMLDoc(req.xhRequest.responseText);
        if (!doc || !doc.firstChild) {alert("Failed to get XML document DOM!"); return;}
    }
    var root = doc.documentElement;
	for(var i=0; i < root.getElementsByTagName('c').length; i++) {
		arr.name[i] = root.getElementsByTagName('c')[i].getAttribute('n');
		arr.code[i] = root.getElementsByTagName('c')[i].getAttribute('c');
	}
	
	prnDev('Получил XML от ' + url + '\n< ' + arr.name + ' >\n< ' + arr.code + ' >\n');
	
	return arr;
};

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

getArrFromXMLasyncParse = function(req) {
	var arr = new Array();
	arr.name = new Array();
	arr.code = new Array();
	
	var doc = req.xhRequest.responseXML;
    if (!doc || !doc.firstChild) {
        doc = Spry.Utils.stringToXMLDoc(req.xhRequest.responseText);
        if (!doc || !doc.firstChild) {alert("Failed to get XML document DOM!"); return;}
    }
    var root = doc.documentElement;
	for(var i=0; i < root.getElementsByTagName('c').length; i++) {
		arr.name[i] = root.getElementsByTagName('c')[i].getAttribute('n');
		arr.code[i] = root.getElementsByTagName('c')[i].getAttribute('c');
	}
	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;
	}
};


openDictWin = function(inpId) {
	var url="";
	var dependId = revertId(inpId);
	var dependStr = document.getElementById(dependId).value;
		
	if(checkCityName(dependStr, dependId)) {
		url="lettered-cities?return=" + inpId + "&cityName=" + encodeURIComponent(dependStr);
	}
	else {
		url="lettered-cities?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=200,height=400,left=" + getElementPosition(inpId).left + ",top=" + (getElementPosition(inpId).top+yTop) + ",scrollbars=yes,menubar=no");
	citiesWindow.focus();
};

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');
};

openDictSel = function(inpId) {
	//alert(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);	
		var url="";
	
		/*if(checkCityName(dependStr, dependId)) {
			// Когда известен город отправления (прибытия) - показываем список городов только с отправлением (прибытием) в известный город		
			var shortList = getArrFromXML("xml/dependence-cities?cityName=" + encodeURIComponent(dependStr) + "&param=" + getUrlParamById(inpId)).name;
			var fullList = getArrFromXML("xml/dependence-cities?param=" + getUrlParamById(inpId)).name;		
			for(var i = 0; i < shortList.length; i++) {
				setListItem(dictWin, shortList[i]);
			}
			// Показать все
			setShowFullItem(dictWin, fullList, shortList);
		}
		else {
			//  Когда не известен город отправления (прибытия) - показываем полный список городов		
			var fullList = getArrFromXML("xml/dependence-cities?param=" + getUrlParamById(inpId)).name;		
			for(var i = 0; i < fullList.length; i++) {
				setListItem(dictWin, fullList[i]);
			}
		}*/
			
		if(inpId == "originCityName") {
			var fullList = getArrFromXML("xml/dependence-cities?param=" + getUrlParamById(inpId)).name;
			for(var i = 0; i < fullList.length; i++) {
				setListItem(dictWin, fullList[i]);
			}			
		}
		else {
			var shortList = getArrFromXML("xml/dependence-cities?cityName=" + encodeURIComponent(dependStr) + "&param=" + getUrlParamById(inpId)).name;
			for(var i = 0; i < shortList.length; i++) {
				setListItem(dictWin, shortList[i]);
			}
		}
		Spry.Utils.addEventListener(document.body, "click", function(event) { bodyClick(event); }, false);		
	}
};

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

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, but.offsetWidth, but.offsetHeight)) {
			dictWin.style.display = "none";
		}
	}
};

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

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

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);
};

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);	
};

function getElementPosition(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};
}
