﻿/// <reference name="MicrosoftAjax.js"/>
//Типы данных controlDataType
//none - нет формата
//passport - string 10 symbols, first 4 symbols is seria, other - number
//driving - string 10 symbols, first 4 symbols is seria, other - number

//Внимание. Это некорректно описанный контрол. Его использование требует ряда знания нюансов. Этот контрол д.б. объединён с контролом из OLA

//для работы валидации
//Должны быть описаны следующие переменные:

//Флаги показывающие тип ошибки при заполнении обязательных полей
//fullFilledField = 0;
//notFilledField = 1;
//notFullFilledField = 2;
//notCorrectFilledField = 4;


var AdvancedTextBox = function(inputId, name, number, isRequired, needMaskValidate, waterMarkText, controlDataType, regExp,
								names, minValue, maxValue, validatingChangeTableCSSClass, checkCorrectValueDelegate, checkCorrectValueParam,
								hintBtnControlId/*, hintMessageControlId, hintMessage*/) {
	this._input = $get(inputId);
	this._isRequired = isRequired;
	this._needMaskValidate = needMaskValidate;
	this._name = name + (number > -1 ? ':' + number : '');
	this._regExp = regExp;
	this._minValue = minValue;
	this._maxValue = maxValue;
	this._validateClassAddOn = '-validated';
	this.waterMarkText = waterMarkText;
	this._validatingChangeTableCSSClass = validatingChangeTableCSSClass;
	if (controlDataType && controlDataType != null && controlDataType != '')
		this._controlDataType = controlDataType;
	else
		this._controlDataType = 'none';
	this._names = new Array();
	if (names && names != null && names != '') {
		var mas = names.split(';');
		var i = 0;
		for (i = 0; i < mas.length; i++) this._names.push(mas[i] + (number > -1 ? ':' + number : ''));
	}

	if (minValue && maxValue && this._input) {
		this.addBlurHandler(this, this._checkMinMaxValues);
		//$addHandler($get(inputId), 'blur', Function.createDelegate(this, this._checkMinMaxValues));
	}
	this._checkCorrectValueDelegate = null;
	this._checkCorrectValueParam = null;

	if (checkCorrectValueDelegate) {
		this._checkCorrectValueDelegate = Function.createDelegate(this, checkCorrectValueDelegate);
		this._checkCorrectValueParam = checkCorrectValueParam;
	}

	this._hintBtnControlId = hintBtnControlId && hintBtnControlId != '' ? $get(hintBtnControlId) : null;
	/*this._hintMessageControlId = hintMessageControlId && hintMessageControlId != '' ? $get(hintMessageControlId) : null;
	this._hintMessage = hintMessage;*/
}

AdvancedTextBox.prototype = {
	isFilled: function() {
		return this.checkCorrectFilling(true) == fullFilledField;
	},

	_checkMinMaxValues: function(event) {
		if (this._minValue && this._maxValue) {
			var val = this.getValue();
			if (val == '') {
				this.setValue(this._maxValue);
			}
			else if (this._minValue > val) {
				this.setValue(this._minValue);
			}
			else if (this._maxValue < val) {
				this.setValue(this._maxValue);
			}
		}
	},

	//get и set методы для значений контролов, обязательны для всех контролов, которые могут выходить в панель
	getValue: function() {
		if (this._input.MaskedEditBehavior && !this._input.MaskedEditBehavior.get_MaskDisabled()) {
			if (this._input.MaskedEditBehavior.get_ClearMaskOnLostFocus()) {
				return this._input.MaskedEditBehavior._getClearMask(AjaxControlToolkit.TextBoxWrapper.get_Wrapper(this._input).get_Value());
			}
			else {
				if (this._input.MaskedEditBehavior._EmptyMask == AjaxControlToolkit.TextBoxWrapper.get_Wrapper(this._input).get_Value()) {
					return '';
				}
				else {
					return AjaxControlToolkit.TextBoxWrapper.get_Wrapper(this._input).get_Value();
				}
			}
		}
		if (this._input.TextBoxWatermarkBehavior) {
			return this._input.TextBoxWatermarkBehavior.get_Text();
		}
		return AjaxControlToolkit.TextBoxWrapper.get_Wrapper(this._input).get_Value();
	},

	setValue: function(value) {
		if (this._input.MaskedEditBehavior && !this._input.MaskedEditBehavior.get_MaskDisabled()) {
			this._input.MaskedEditBehavior.loadValue(value.toString(), this._input.MaskedEditBehavior._LogicFirstPos);
			this._input.MaskedEditBehavior._PeforformValidLostFocus(true);
		}
		else {
			AjaxControlToolkit.TextBoxWrapper.get_Wrapper(this._input).set_Value(value);
		}
	},

	_addRemoveValidCssClassPostfix: function(valid, className, validPostfix) {
		var validateIndex = className.lastIndexOf(validPostfix);
		if (valid && validateIndex > -1) {
			return className.substr(0, validateIndex);
		}
		else if (!valid && validateIndex == -1) {
			return className + validPostfix;
		}
		return className;
	},

	markValidationOfTextBox: function(valid) {
		var elem = this._validatingChangeTableCSSClass ? this._input.parentNode.parentNode.parentNode.parentNode : this._input;
		elem.className = this._addRemoveValidCssClassPostfix(valid, elem.className, this._validateClassAddOn);
		if (elem.TextBoxWatermarkBehavior) {
			elem.TextBoxWatermarkBehavior._oldClassName = this._addRemoveValidCssClassPostfix(valid, elem.TextBoxWatermarkBehavior._oldClassName, this._validateClassAddOn);
			elem.TextBoxWatermarkBehavior.set_WatermarkCssClass(this._addRemoveValidCssClassPostfix(valid, elem.TextBoxWatermarkBehavior.get_WatermarkCssClass(), this._validateClassAddOn));
		}
	},

	getNameValue: function() {
		var value = this.getValue().trim();
		switch (this._controlDataType) {
			case 'none':
				return this._name + '=' + value + paramsSeparator;
			case 'passport':
				var seria = value.substring(0, 4);
				var number = value.substring(4);
				return this._names[0] + '=' + seria + paramsSeparator + this._names[1] + '=' + number + paramsSeparator;
			case 'pts':
				var seria = value.substring(0, 4);
				var number = value.substring(4);
				return this._names[0] + '=' + seria + paramsSeparator + this._names[1] + '=' + number + paramsSeparator;
				return result;
			default:
				return this._name + '=' + value + paramsSeparator;
		}
	},

	getTextBox: function() {
		return this._input;
	},

	addBlurHandler: function(object, handler) {
		$addHandler(this._input, 'blur', Function.createDelegate(object, handler));
	},

	addCheckFillingEvent: function(handler) {
		$addHandler(this._input, 'blur', handler);
	},

	clearValidation: function() {
		this.markValidationOfTextBox(true);
	},

	_showHintBtnControl: function(show) {
		if (this._hintBtnControlId) {
			this._hintBtnControlId.style.display = show ? 'block' : "none";
		}
	},

	checkCorrectFilling: function(softly) {
		if (this._isRequired) {
			if (!softly) {
				this._showHintBtnControl(false);
			}
			var value = this.getValue();
			if (value == '') {
				if (!softly) {
					this.markValidationOfTextBox(false);
				}
				return notFilledField;
			}
			if ((this._regExp && !this._regExp.test(value))) {
				if (!softly) {
					this.markValidationOfTextBox(false);
				}
				return notFullFilledField;
			}
			if (this._needMaskValidate && this._input.MaskedEditBehavior && !this._input.MaskedEditBehavior.get_MaskDisabled() &&
					this._input.MaskedEditBehavior._QtdValidInput > value.length) {
				if (!softly) {
					this.markValidationOfTextBox(false);
				}
				return notFullFilledField;
			}

			if (this._checkCorrectValueDelegate && !this._checkCorrectValueDelegate(this._checkCorrectValueParam)) {
				if (!softly) {
					this.markValidationOfTextBox(false);
					this._showHintBtnControl(true);
				}
				return notCorrectFilledField;
			}
			if (!softly) {
				this.markValidationOfTextBox(true);
			}
		}
		return fullFilledField;
	},

	setCheckCorrectValueParam: function(value) {
		this._checkCorrectValueParam = eval(value);
	},

	restoreState: function(state) {
		switch (this._controlDataType) {
			case 'none':
				this.setValue(state[this._name]);
				break;
			case 'passport':
				this.setValue(state[this._names[0]] + state[this._names[1]]);
				break;
			case 'pts':
				this.setValue(state[this._names[0]] + " " + state[this._names[1]]);
				break;
		}
	},

	isRequired: function() {
		return this._isRequired;
	},

	get_name: function() {
		return this._name;
	},

	maskDisable: function(value) {
		if (this._input.MaskedEditBehavior) {
			this._input.MaskedEditBehavior.disable(value);
		}
	},

	focus: function() {
		this._input.focus();
	},

	blur: function() {
		this._input.blur();
	}
}
