// ####################################
// Класс быстрого редактирования текста
// ####################################
// ---- Надо добавить, минимальное и максимальное значение
function cityFastEdit(obj_path, onChange){
	this.obj = $(obj_path);
	this._start_txt	= '';
	this._edited	= false;
	this._error		= null;
	this.onChange	= onChange || null;
	this.oSpans	= null;
	this.init();
}

cityFastEdit.prototype = {
	// Инициализация объекта
	init : function(){
		var oThis	= this;
		this.oSpans = this.obj.find('span');
		this.oSpans.click(function(){oThis.edit(this)});
	},
	// Начало редактирования
	edit : function(obj){
		if(!this._edited){
			var oThis	= this;
			this._edited	= true;
			obj	= $(obj);
			var txt 	= obj.text();
			var iLen	= txt.length;
			//txt	= this.removeSpace(txt);
			var w	= obj.width() + 12;
			var h	= obj.height() + 2;
			this._start_txt	= txt;
			obj.html('<input type="text" value="' + txt + '">');
			obj.addClass('edited');
			var input	= obj.children();
			input.width(w).height(h).blur(function(){oThis.cancel(this)}).keypress(function(event){return oThis.key_press(event, this)});
			input.keyup(function(event){return oThis.key_up(event, this);}).focus();
		}
	},
	// Обработка нажатых клавиш
	key_press : function(event, obj){
		event	= event || windows.event;
		var ret	= false;
		if(event.which < 65){
			switch(event.which){
				case 48 :
				case 49 :
				case 50 :
				case 51 :
				case 52 :
				case 53 :
				case 54 :
				case 55 :
				case 56 :
				case 8 :
				case 0 :
				case 57 : {
					ret	= true;
					break;
				}
				case 13 : {
					ret	= true;
					this.finish(obj);
					break;
				}
				case 27 : {
					ret	= true;
					this.cancel(obj);
					break;
				}
			}
		}
		return ret;
	},
	// Финальная обработка кнопок и фарматирование суммы
	key_up : function(event, obj){
		event	= event || windows.event;
		obj	= $(obj);
		var value = String(this.removeSpace(obj.val()));
		if(value.charAt(value.length - 1) == '.') return false;
		if(value != ''){
			if(((event.which >= 48) && (event.which <= 56)) || (event.which == 8)){
				value = Number(value);
				obj.val(value.toStr());
			}
		}
		return true;
	},
	// окончание редактирования
	finish : function(obj){
		if(!obj) return;
		var is_ok = true;
		var txt	= Number(this.removeSpace($(obj).val()));
		obj	= $(obj.parentNode);
		// Проверяем данные
		var spans	= this.obj.find('span');
		var value	= Number(obj.attr('keywords'));
		var type = 0;
		if(obj[0] == spans[0]){
			var num	= Number(this.removeSpace($(spans[1]).text()));
			if(txt >= num){
				is_ok = false;
			}
			if(txt < value){
				txt	= value;
			}
		}else{
			type = 1;
			var num	= Number(this.removeSpace($(spans[0]).text()));
			if(txt <= num){
				is_ok = false;
			}
			if(txt > value){
				txt	= value;
			}
		}
		// Если проверку прошли
		if(is_ok){
			this.removeErrorStr(obj);
			this._edited	= false;
			obj.html(txt.toStr());
			obj.removeClass('edited');
			if(txt != Number(this.removeSpace(this._start_txt))){
				if(this.onChange) this.onChange(type, txt);
			}
			this._start_txt	= '';
			
		}else{
			this.obj.append('<div class="error_str">Неверное значение</div>');
			this._error	= this.obj.find('.error_str').css({left: obj[0].offsetLeft, top: obj.height()}).fadeIn('slow');
			obj.addClass('error');
		}
	},
	// отмена редактирования
	cancel : function(obj){
		if(!obj) return;
		this._edited	= false;
		obj	= $(obj).parent();
		this.removeErrorStr(obj);
		obj.html(this._start_txt);
		obj.removeClass('edited');
		this._start_txt	= '';
	},
	// Убираем пробелы в тексте
	removeSpace : function(txt){
		var iLen	= txt.length;
		var new_txt	= ''
		for(var i=0; i<iLen; i++){
			var chr = txt.charAt(i);
			if(chr != ' ') new_txt += chr;
		}
		return new_txt;
	},
	// УБираем ошибку с экрана
	removeErrorStr : function(obj){
		if(this._error){
			obj.removeClass('error');
			var oThis	= this;
			this.obj.find('.error_str').fadeOut('fast', function(){
				oThis.obj.remove('.error_str');
				oThis._error	= null;
			});
		}
	},
	// Устанавливаем минимальное и максимальные значения
	setMinMax : function(iMin, iMax){
		$(this.oSpans[0]).text(iMin.toStr());
		$(this.oSpans[0]).attr('keywords', iMin);
		$(this.oSpans[1]).text(iMax.toStr());
		$(this.oSpans[1]).attr('keywords', iMax);
	}
	
}
