
/*расширяем объект Function для осуществления наследования*/
Function.prototype.inheritsFrom = function(superClass) {
	var Inheritance = function(){};
	Inheritance.prototype = superClass.prototype;

	this.prototype = new Inheritance();
	this.prototype.constructor = this;
	this.superClass = superClass;
}
/*КЛАСС ПОЛУЧЕНИЯ ГОРОДОВ РОССИИ*/
classRequest=function()
//BEGIN
{
	/*описание св-в*/
	this.status_pos=1;//статуст опр. способ определения координат
	this.textExample='Например: Driver Updater';//тектс подстановки
	this.colorExample='rgb(155, 155, 155)';//цвет подстановки
	this.saveSubmit=0;//сохраняем ф-цию submit
	this.colorFlag=0;//показатель выбранности элемента списка
	this.form=0;//форма

}
	classRequest.cityName='';
	classRequest.cityNameLast='';
	classRequest.selStatStraight=0;//статус прямого прохождения без учета времени нажатия клавиши и слежки процесса отработки запроса 
	classRequest.selStatStartRequest=0;//статус выполненности запроса
	classRequest.selStatProcess=0;//выполненость процесса, удержания запроса
	classRequest.selInpElement=0;//сохраняем элемент inp
	classRequest.selDivElement=0;//сохраняем элемент div
	classRequest.selAllCity=0;//показатель, что все города уже были извлечены
	classRequest.selResResponse='';//результат прошлого запроса
//метод опр. координат и подставляющий плавающ. div-у
classRequest.prototype.changePosition=function(el){

	this.focusExample(el);//сбрасываем альтр. текст
	var elem = jQuery(el.target).get(0);
	
	var objHeight = elem.offsetHeight;//высота
	if (this.status_pos==1){
		var objLeft = this.getPosition(elem).x;
		var objTop =  this.getPosition(elem).y;
	}else{
		var objLeft= elem.offsetLeft;
		var objTop= elem.offsetTop;
	}
	var el_div=jQuery('div.autocomplete');
	 el_div.get(0).style.left=objLeft+'px';//css('left:'+objLeft+'px');не работает в IE
	 el_div.get(0).style.top=objHeight+objTop+'px'; //css('top:'+objHeight+objTop+'px;');не работает в IE
	 classRequest.selDivElement=el_div;
	
}
//координаты по х и по у 
classRequest.prototype.getPosition=function(el) {
    var x = 0;
    var y = 0;
    do{
        x += el.offsetLeft;
        y += el.offsetTop;
    } while(el = el.offsetParent);
    
    return {x:x, y:y};
}

//метод, котор. сбрасывает альтернатив. текст
classRequest.prototype.focusExample=function(el) {
	var elem = jQuery(el.target);
	if (elem.attr('name').indexOf('example')>0){
			var mass_n=elem.attr('name').split('example')[0];
			elem.css('color','black').attr({name: mass_n, value: ''});
	}
	
}
//метод, котор. устанавливает альтернатив. текст
classRequest.prototype.blurExample=function(el) {
	var elem = jQuery(el.target);

	if (elem.get(0).value.length<=1){
		elem.attr({name:elem.attr('name')+'example',value:this.textExample}).css('color',this.colorExample);
	}
	this.handleChangeSub(1);//возращение саб форме
	this.saveSubmit=0
	classRequest.cityNameLast='';//закрываем прошлый запрос для доступа!
	if (classRequest.selDivElement!=0){//закрываем див
		classRequest.selDivElement.slideUp('fast');
	}
	
}
/*SELECTER*/
//начальная
classRequest.prototype.selectCity=function(el){
	//заглушка
if (el.which==13 || el.which==38 || el.which==33 || el.which==40 || el.which==34){	
	return true;
}
	if (classRequest.selStatStraight!=1 && classRequest.selStatProcess==0 ){
		if(el){ 
			this.setString(el);
		}
		classRequest.selStatProcess=1;	
		setTimeout("classRequest.prototype.selectProcessSave();",500);
		return true;
	}
	if(classRequest.selStatProcess==0 && classRequest.selStatStartRequest==0){

		classRequest.selStatStraight=0;
		if(((classRequest.cityName.toLowerCase().indexOf(classRequest.cityNameLast.toLowerCase())!=-1) && classRequest.selAllCity==1 && classRequest.cityNameLast!=='') || classRequest.cityNameLast===classRequest.cityName) {
			return classRequest.prototype.selectSearchResponse();//без запроса к серверу
		}else{

			classRequest.selStatStartRequest=1;
			return classRequest.prototype.selectSendRequest();//запрос к сер
		}
	}
	
	
}
//вспомогательные
classRequest.prototype.getString=function(){
	var elem = jQuery(classRequest.selInpElement);
	var re = /[/_\\]/g;
	return (elem.get(0).value).replace(re, "");// город и обрез лишь символы
}
classRequest.prototype.setString=function(el){
	classRequest.selInpElement=el.target;
	var elem = jQuery(el.target);
	var re = /[/_\\]/g;
	classRequest.cityName=(elem.get(0).value).replace(re, "");//сохраняем город и обрез лишь символы
}

//инспектор запросов, следит за выполнением запросов и если поисковой запрос обнавился она держит до того момента как отрабатет прошлый и посылает на выполнение 
classRequest.prototype.selectProcessSave=function() {
	var cityNameNext=classRequest.prototype.getString();
	if (cityNameNext===classRequest.cityName && classRequest.selStatStartRequest==0 && classRequest.cityName.length>1){
		 classRequest.selStatStraight=1;
		 classRequest.selStatProcess=0;//отработал инспектор запросов
		 classRequest.prototype.selectCity(0);
	}else{//продолжаем слежку
		 classRequest.cityName = cityNameNext;
		  setTimeout("classRequest.prototype.selectProcessSave();",400);
	}
	
}
/*функция срабатывает если строка с запросом увеличивается и известно, что все города получены еще при прошлом запросе
она ищет город из предыдущего запроса*/
classRequest.prototype.selectSearchResponse=function() {
	var result="";	
	var stringArray=classRequest.selResResponse.split("^");		
	var l=stringArray.length;
	for(i=1;i<l;i++){		
		if(!stringArray[i].toLowerCase().indexOf(classRequest.cityName.toLowerCase())){		
			
			result+="<li>"+stringArray[i];		
		}		
	} 	
	//result+="</ul>";	
	classRequest.prototype.selectFullDiv(result);//заполняем див
}

classRequest.prototype.selectSendRequest=function() {
	jQuery.get(
	  '/ajax/ajax_get_text.php',
		{
	    	text:  classRequest.cityName
	  	},
		   classRequest.prototype.selectSendResponse
	);
	classRequest.cityNameLast=classRequest.cityName;//фиксир значение текущего запроса, чтобы его не повторять
}

classRequest.prototype.selectSendResponse=function(data) {

	var result = "";
	var stringArray = data.split("^");
	if (stringArray[1]){
	var l = stringArray.length;
	for(i=1;i<l;i++){
		result+="<li>"+stringArray[i];
	} 	
	
	//result+="</ul>";
	}
	if(stringArray[0]){
		classRequest.selAllCity=stringArray[0];
		classRequest.selResResponse=data;
	}
	
	classRequest.prototype.selectFullDiv(result);//заполняем див

}
classRequest.prototype.selectFullDiv=function(results) {
	classRequest.selDivElement.find('ul').empty();
	if(results.length<10){
		classRequest.selDivElement.slideUp('fast');
	}else{
		classRequest.selDivElement.find('ul').append(results);
		classRequest.selDivElement.slideDown('fast');
		classRequest.selDivElement.find('li').click(function(e){classRequest.prototype.selectChangeValue(e);});//крепим событие к li
	}	
		classRequest.selStatStartRequest=0;//завершаем запрос
		
}
// функция подстановки при выборе из полученых результатов 
classRequest.prototype.selectChangeValue=function(el) {
	var int=jQuery(el.target);
	var t=int.html().split('(')[0];
	
	jQuery(classRequest.selInpElement).attr('value',t);
	classRequest.selDivElement.slideUp('fast');
}

/* end SELECTER*/
//главная
classRequest.prototype.handleKeypress=function(el,forma) {
	 //handleKeypress(list_id, input, event, forma,select_region);
if (el.which==13 || el.which==38 || el.which==33 || el.which==40 || el.which==34){	 
	this.form=document.forms[forma];	
	this.handleChangeSub();
	switch(el.which)
	{
		case 13:
			if (this.colorFlag!=0){
				jQuery(this.colorFlag).click();
				this.colorFlag=0;
				return false;					
			}else{
				return this.handleChangeSub(1);
			}
			return true;
		case 38:    //стрелка вверх
		case 33:	//PageUp
			this.handleKeyDownAndUp('up');
			return true;
		case 40:   //стрелка вниз
		case 34:   //Pagedown
			this.handleKeyDownAndUp('down');
			return true;
		/*case 9:   //TAb
			ds_make_query=1;
			return true;
		*/
	}
}
	return true;
}
//вспомогательные
//повторный вызов возращает submit форме 
classRequest.prototype.handleChangeSub=function(s) {
	 if (this.saveSubmit==0 && s!=1){
 		this.saveSubmit=this.form.onsubmit;
 		this.form.onsubmit=function(){return false};
		return true;
	}
	 if(this.saveSubmit!=0 && s==1){
		this.form.onsubmit=this.saveSubmit;
	}
	
	return true;
}
//управ клав. верх и низ  
classRequest.prototype.handleKeyDownAndUp=function(key) {
			this.colorFlag=0;
			var elem_split=classRequest.selDivElement.find('li').get();
			var r = elem_split.length;
			var t=r;
			var hag_flag=0;
			while(r--){
				if (elem_split[r].className=="current"){
					hag_flag=1;
					//смотря что было нажато
					if (key==='down'){	
						if (r==(t-1)){											
							elem_split[0].className="current";
							elem_split[r].className="";
							this.colorFlag=elem_split[0];
						}else{
							elem_split[r+1].className="current";
							elem_split[r].className="";
							this.colorFlag=elem_split[r+1];
						}
					}else{
						if (r==0){
							elem_split[t-1].className="current";
							elem_split[r].className="";
							this.colorFlag=elem_split[t-1];
						}else{
							elem_split[r-1].className="current";
							elem_split[r].className="";
							this.colorFlag=elem_split[r-1];
						}
					}
					
					break;
				}
			}
			if (hag_flag==0){
				elem_split[0].className="current";
				this.colorFlag=elem_split[0];
			}

	return true;
}

//END



/*менеджеры*/
	var FieldBuilder = function(el,form){
			var field = new classRequest(); 
			jQuery(el).focus(function(e){field.changePosition(e);});
			jQuery(el).blur(function(e){field.blurExample(e);}).blur();
			jQuery(el).keyup(function(e){field.selectCity(e);});
			jQuery(el).keydown(function(e){field.handleKeypress(e,form);});
		
	}
