var couldProcess = false;
var RESPONS_START=0 // неинициализированный
var RESPONS_LODING=1 // загрузка
var RESPONS_LOAD=2 // загруженный
var RESPONS_INT=3 // интерактивный
var RESPONS_COMPLETE=4 // завершенный (в нашем примере внимание фокусируется на этом состоянии.)
var RULE_SEND=0;
var RULE_TAKE=1;
var userText='';
var curentNumLightElement=-1;
var countElementInMenu=9;

var httpRequester;// = getHTTPRequestObject();
try {httpRequester = new ActiveXObject("Msxml2.XMLHTTP");}
catch(e){
	try{httpRequester = new ActiveXObject("Microsoft.XMLHTTP");}
	catch(f){
		httpRequester = null;}
}
if(!httpRequester && typeof(XMLHttpRequest) != 'undefined'){
	httpRequester = new XMLHttpRequest();
}




function arrowEvent(event,object)
{
	if(document.getElementById(object.id+'_menu').style.display=='none')return;
	if(event.keyCode==38)
	{
	    if(curentNumLightElement==0)
		{
			lighting(object.id,-1);
        	object.value=userText;
		}
		else
		{
			if(curentNumLightElement==-1)
			{				lighting(object.id,countElementInMenu);
			}
			else
			{
				lighting(object.id,curentNumLightElement-1);
            }
			elli=document.getElementById(object.id+'_el_'+curentNumLightElement);
			object.value= elli.innerHTML;


		}


	}

	if(event.keyCode==40)
	{
		if(curentNumLightElement==countElementInMenu)
		{
        	lighting(object.id,-1);
        	object.value=userText;

		}
		else
		{
			lighting(object.id,curentNumLightElement+1);

			elli=document.getElementById(object.id+'_el_'+curentNumLightElement);
			object.value= elli.innerHTML;



		}
	}}
function lighting(id,num)
{
	if(curentNumLightElement!=-1)
		document.getElementById(id+'_el_'+curentNumLightElement).style.backgroundColor='';
    if(num!=-1)
		document.getElementById(id+'_el_'+num).style.backgroundColor='#aaaaff';

	curentNumLightElement=num;
}

function getStreet(object)
{
    if(document.getElementById('formCard_geografija_1').value==10184)
    	object.geoid=10184
    else
		object.geoid=document.getElementById('formCard_geografija_2').value;

	userText=object.value;
	if (!couldProcess && httpRequester && object.geoid) {


		var request = JSON.stringify(object,Array('name','id','value','geoid'));
	    httpRequester.open("POST",  'http://'+location.host+'/ru/data/ajaxstreet.html',true);
	    httpRequester.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

	    httpRequester.onreadystatechange = processResponse;
	    couldProcess = true;
	    httpRequester.send('reqvest='+request);
  	}
}

function drowAjaxMenu(object)
{
	menuContent=document.getElementById(object.id+'_menu_content')
	if(menuContent.innerHTML!=object.list)
		menuContent.innerHTML=object.list;


	if(menuContent.innerHTML=='')
		hidenElement(object.id+'_menu');
	else
		displayElement(object.id+'_menu');
}
function displayMenuContent(id)
{
	menuContent=document.getElementById(id+'_menu_content');
		menuContent.style.zIndex=15;
	if(menuContent.innerHTML!='')
	{
		displayElement(id+'_menu')
	}
}
function hidenElement(id)
{
	element=document.getElementById(id);
	setTimeout("element.style.display='none'",200);
}
function displayElement(id)
{
	document.getElementById(id).style.display='block';
    document.getElementById(id).style.zIndex=14;
}


function setValue(id,value)
{
	document.getElementById(id).value=value;
}

function eventRule(event,object,rule)
{
	var ua = navigator.userAgent.toLowerCase();
	isIE6 = ((ua.indexOf("msie 6.0;") != -1 || ua.indexOf("msie 5.5;") != -1 || ua.indexOf("msie 5.0;") != -1) && (ua.indexOf("opera") == -1 && ua.indexOf("webtv") == -1));
	if(isIE6 )return false;

	if(event.type=='keyup')
	{		//document.title='key='+event.keyCode+'  num='+curentNumLightElement+'  cou='+countElementInMenu;

	}
	if(event.type=='keyup' && (event.keyCode==38 || event.keyCode==40))
    {
        arrowEvent(event,object);
	}
	else if(event.type=='keyup' && event.keyCode==13)
	{
		checkButtonClick=false		document.getElementById(object.id+'_menu').style.display='none';
	}
 	else
 	{
 		ajaxRule(object,rule);
 	}
}

function ajaxRule(object,rule)
{
	var ua = navigator.userAgent.toLowerCase();
	isIE6 = ((ua.indexOf("msie 6.0;") != -1 || ua.indexOf("msie 5.5;") != -1 || ua.indexOf("msie 5.0;") != -1) && (ua.indexOf("opera") == -1 && ua.indexOf("webtv") == -1));
	if(isIE6 )return false;

	if(rule==RULE_SEND)
	{
		if(object.name)
		switch (object.name)
		{
		case  'street':
				getStreet(object);
		break;
		}
	}
	else if(rule==RULE_TAKE)
	{
 		object = JSON.parse(unescape(object));
		if(object.name)
		switch (object.name)
		{
			case  'street':
			{				curentNumLightElement=-1;
				countElementInMenu=object.count-1;
				drowAjaxMenu(object);
			}
		}
	}
}


function getHTTPRequestObject() {
  var xmlHttpRequest;
  if (!xmlHttpRequest && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlHttpRequest = new XMLHttpRequest();
    } catch (exception) {
      xmlHttpRequest = false;
    }
  }
  return xmlHttpRequest;
}

function processResponse() {

  if ( httpRequester.readyState == RESPONS_COMPLETE ) {
    if ( httpRequester.responseText.indexOf('invalid') == -1 ) {

	  couldProcess = false
	  ajaxRule(httpRequester.responseText,RULE_TAKE);

    }
  }
}
function getXmlHttpRequest()
{
	var httpRequest = null;
	try
	{
		httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch (e)
	{
		try
		{
			httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (e)
		{
			httpRequest = null;
		}
	}
	if (!httpRequest && typeof XMLHttpRequest != "undefined")
	{
		httpRequest = new XMLHttpRequest();
	}
	return httpRequest;
}

function getUrlSync(url)
{
	return getUrl(url, false, null);
}

function getUrlAsync(url, handleStateChange)
{
	return getUrl(url, true, handleStateChange);
}

// call a url
function getUrl(url, async, handleStateChange) {
	var xmlHttpReq = getXmlHttpRequest();

	if (!xmlHttpReq)
		return;

	if (handleStateChange)
	{
		xmlHttpReq.onreadystatechange = function()
			{
				handleStateChange(xmlHttpReq);
			};
	}
	else
	{
		xmlHttpReq.onreadystatechange = function() {;}
	}

	xmlHttpReq.open("GET", url, async);
	xmlHttpReq.send(null);
}

function postUrl(url, data, async, stateChangeCallback)
{ 
	
	var xmlHttpReq = getXmlHttpRequest(); 
	
	if (!xmlHttpReq)
		return;
	//alert(data);
	xmlHttpReq.open("POST", url, async);
	
	xmlHttpReq.onreadystatechange = function()
		{
			stateChangeCallback(xmlHttpReq);
		};
	xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	xmlHttpReq.send(data);
	//alert ('url: ' + url + 'data: ' + data);
}

function urlEncodeDict(dict)
{ 
	var result = "";
	for (var i=0; i<dict.length; i++) {
		result += "&" + encodeURIComponent(dict[i].name) + "=" + encodeURIComponent(dict[i].value);
	}
	return result;
}

function execOnSuccess(stateChangeCallback)
{
	return function(xmlHttpReq)
		{
			if (xmlHttpReq.readyState == 4 &&
					xmlHttpReq.status == 200)
				stateChangeCallback(xmlHttpReq);
			//alert(xmlHttpReq + " " + xmlHttpReq.readyState + " " + xmlHttpReq.status);
		};
}


function postFormByForm(form, async, successCallback) {
	var formVars = new Array();
	for (var i = 0; i < form.elements.length; i++)
	{
		var formElement = form.elements[i];
		
		// Special handling for checkboxes (we need an array of selected checkboxes..)!
		if(formElement.type=='checkbox' && !formElement.checked) {
			continue;
		} 
		var v=new Object;
		v.name=formElement.name;
		v.value=formElement.value;
		formVars.push(v);		
	} 
	postUrl(form.action, urlEncodeDict(formVars), async, execOnSuccess(successCallback));
}

function postForm(formName, async, successCallback)
{
	// postFormByName
	var form = document.forms[formName];
	return postFormByForm(form, async, successCallback);
}

function replaceDivContents(xmlHttpRequest, dstDivId)
{
	var dstDiv = document.getElementById(dstDivId);
	dstDiv.innerHTML = xmlHttpRequest.responseText;
}


function getUrlXMLResponseCallback(xmlHttpReq) {
	if(xmlHttpReq.responseXML == null) {
		alert("Error while processing your request.");
		return;
	}
	var root_node = getRootNode(xmlHttpReq);
	var return_code = getNodeValue(root_node, 'return_code');
	//alert("return code " + return_code);

	if(return_code == 0) {
		redirect_val = getNodeValue(root_node, 'redirect_on_success');
		if(redirect_val != null) {
			window.location=redirect_val;
		} else {
			success_message = getNodeValue(root_node, 'success_message');
			if (success_message != null) {
				alert(success_message);
			}
			if(this.successCallback != null) {
				this.successCallback(xmlHttpReq);
			}
		}
	} else {
		var error_msg = getNodeValue(root_node, 'error_message');
		if (error_msg == null || error_msg.length == 0) {
			error_msg = "An error occured while performing this operation.";
		}
		alert(error_msg)
	}
}

function getUrlXMLResponseCallbackFillDiv(xmlHttpReq) {
	getUrlXMLResponseCallback(xmlHttpReq);
	document.getElementById(this.div_id).innerHTML=getNodeValue(xmlHttpReq.responseXML, "html_content");
}

function getNodeValue(obj,tag)
{
	node=obj.getElementsByTagName(tag);
	if(node!=null && node.length>0) {
		return node[0].firstChild.nodeValue;
	} else {
		return null;
	}
}

function getRootNode(xmlHttpReq) {
	return xmlHttpReq.responseXML.getElementsByTagName('root')[0];
}

function getUrlXMLResponse(url, successCallback) {
	this.successCallback = successCallback;
	this.urlResponseCallback = getUrlXMLResponseCallback;
	getUrl(url, true, execOnSuccess(this.urlResponseCallback)) 
}

function getUrlXMLResponseAndFillDiv(url, div_id, successCallback) {
	this.successCallback = successCallback;
	this.urlResponseCallback = getUrlXMLResponseCallbackFillDiv;
	this.div_id = div_id;
	getUrl(url, true, execOnSuccess(this.urlResponseCallback)) 
}

function postUrlXMLResponse(url, data, successCallback) {
	this.successCallback = successCallback;
	this.urlResponseCallback = getUrlXMLResponseCallback;
	postUrl(url, data, true, execOnSuccess(this.urlResponseCallback))
}
// ANGUS - This appears to be unused...
function confirmAndPostUrlXMLResponse(url, confirmMessage, data, successCallback) {
	if (confirm(confirmMessage)) {
		postUrlXMLResponse(url, data, successCallback);
	}
}

function postFormXMLResponse(formName, successCallback) {
	this.successCallback = successCallback;
	postForm(formName, true, execOnSuccess(getUrlXMLResponseCallback))
}