ZForms.Builder.prototype.extractParamsFromElement = function(oElement) {

	var oResult = oElement.onclick instanceof Function? oElement.onclick() || {} : {};
	if(!oResult.oOptions){
		oResult.oOptions = {};
	}
	var s = oElement.getAttribute('placeholder');
	if(s){
		oResult.oOptions.sPlaceHolder = s;
	}

	var oParams = oElement.nextSibling;
	while(
		oParams
		&& (
			!oParams.tagName
			|| oParams.tagName.toLowerCase() != 'dl'
		)
	){
		oParams = oParams.nextSibling;
	}
	if(oParams && oParams.nodeType == 1 && oParams.tagName.toLowerCase() == 'dl'){
		var oParamsTermins = oParams.getElementsByTagName('dt');
		for(var i = 0, bParams = false, sTermin, sDefinitions, oDefinition, oSlider; i < oParamsTermins.length; i++){
			sTermin = oParamsTermins[i].innerHTML;
			sDefinitions = [];
			oDefinition = oParamsTermins[i].nextSibling;
			while(
				oDefinition
				&& (
					!oDefinition.tagName
					|| oDefinition.tagName.toLowerCase() != 'dt'
				)
			){
				if(oDefinition.nodeType == 1){
					sDefinitions[sDefinitions.length] = oDefinition.innerHTML;
				}
				oDefinition = oDefinition.nextSibling;
			}
			if(sTermin.indexOf('required') > -1 && !oResult.oRequired){
				bParams = true;
				oResult.oRequired = {};
			}else if(sTermin.indexOf('valid') > -1 && !oResult.oValid){
				bParams = true;
				oResult.oValid = {};
			}
			if(oResult.oOptions && oResult.oOptions.aSlideRules){
				if(!oResult.oOptions.aSlideRules[oSlider.i + 1]){
					oResult.oOptions.aSlideRules[oSlider.i + 1] = {};
				}
				switch(sTermin){
					case 'value':
						oResult.oOptions.aSlideRules[oSlider.iValue].dValue = sDefinitions[0] * 1;
						oSlider.i = oSlider.iValue++;
						break;
					case 'min':
						oResult.oOptions.aSlideRules[0].dValue = sDefinitions[0] * 1;
						oResult.oOptions.aSlideRules[0].dPercent = 0;
						break;
					case 'max':
						oSlider.dMax_value = sDefinitions[0] * 1;
						break;
					case 'percent':
						oResult.oOptions.aSlideRules[oSlider.iPercent].dPercent = sDefinitions[0] * 1;
						oSlider.i = oSlider.iPercent++;
						break;
					case 'step':
						oResult.oOptions.aSlideRules[oSlider.iStep].dStep = sDefinitions[0] * 1;
						oSlider.i = oSlider.iStep++;
						break;
					case 'max_label':
						oSlider.sMax_label = sDefinitions[0];
						break;
					case 'min_label':
						oResult.oOptions.aSlideRules[0].sLabel = sDefinitions[0];
						break;
					case 'label':
						oResult.oOptions.aSlideRules[oSlider.iLabel].sLabel = sDefinitions[0];
						oSlider.i = oSlider.iLabel++;
						break;
				}
			}else{
				switch(sTermin){
					case 'slider':
					case 'slidervertical':
						oSlider = {
							i: 0,
							iValue: 0,
							iPercent: 0,
							iStep: 0,
							iLabel: 0
						};
						oResult.sType = sTermin;
						oResult.oOptions.aSlideRules = [{}];
						bParams = true;
						break;
					case 'type':
						switch(sDefinitions[0]){
							case 'email':
								if(!oResult.oValid){
									oResult.oValid = {};
								}
								oResult.oValid.sType = 'email';
								break;
							case 'checkbox':
								oResult.sType = 'checkboxgroup';
								break;
							case 'radio':
								oResult.sType = 'radiobuttongroup';
								break;
							default:
								oResult.sType = sDefinitions[0];
						}
						var s = sDefinitions.join('-');
						if(s.match(/(^|-)(number|float|negative)($|-)/)){
							oResult.sType = 'number';
							if(s.match(/(^|-)(float)($|-)/)){
								oResult.oOptions.bFloat = true;
							}
							if(s.match(/(^|-)(negative)($|-)/)){
								oResult.oOptions.bNegative = true;
							}
						}
						bParams = true;
						break;
					case 'valid':
						oResult.oValid.rPattern = eval(sDefinitions[0]);
						break;
					case 'class_from':
					case 'and_class_from':
					case 'or_class_from':
						if(!oResult.oDependedClasses){
							oResult.oDependedClasses = {aFrom: [], sLogic: 'or'};
						}
						if(sTermin.indexOf('and_') == 0){
							oResult.oDependedClasses.sLogic = 'and';
						}
						var iFrom = oResult.oDependedClasses.aFrom.length;
						oResult.oDependedClasses.aFrom[iFrom] = { aData: [], sName: sDefinitions[0] };
						for(var ii = 1; ii < sDefinitions.length; ii += 2) {
							oResult.oDependedClasses.aFrom[iFrom].aData.push([sDefinitions[ii], sDefinitions[ii + 1]]);
						}
						bParams = true;
						break;
					case 'depended_from':
					case 'and_depended_from':
					case 'or_depended_from':
						if(!oResult.oEnabled){
							oResult.oEnabled = {aFrom: [], sLogic: 'or'};
						}
						if(sTermin.indexOf('and_') == 0){
							oResult.oEnabled.sLogic = 'and';
						}
						var iFrom = oResult.oEnabled.aFrom.length;
						oResult.oEnabled.aFrom[iFrom] = { sName: sDefinitions[0], rPattern: get_pattern_value(sDefinitions[1]) };
						bParams = true;
						break;
					case 'options_depended_from':
						oResult.oDependedOptions = {sName: sDefinitions[0], aData: []};
						for(var ii = 1; ii < sDefinitions.length; ii += 2){
							oResult.oDependedOptions.aData[oResult.oDependedOptions.aData.length] = [get_pattern_value(sDefinitions[ii]), get_pattern_value(sDefinitions[ii + 1])];
						}
						bParams = true;
						break;
					case 'required_min':
						oResult.oRequired.iMin = sDefinitions[0];
						break;
					case 'required_from':
						// TODO: Обязательное заполнение
						break;
					case 'submit':
					case 'submit_button':
						bParams = true;
						oResult.oOptions = {
							bUpdatableSubmit : true,
							bCheckForValid   : false,
							bCheckForChanged : false,
							bPreventSubmit   : false
						};
						for(var ii = 0; ii < sDefinitions.length; ii++){
							switch(sDefinitions[ii]){
								case 'valid':
									oResult.oOptions.bCheckForValid = true;
									break;
								case 'changed':
									oResult.oOptions.bCheckForChanged = true;
									break;
								case 'enabled':
									oResult.oOptions.bUpdatableSubmit = true;
									break;
								case 'prevent':
									oResult.oOptions.bPreventSubmit = true;
									break;
							}
						}
						break;
				}
			}
		}
		if(oResult.oOptions && oResult.oOptions.aSlideRules){
			oResult.oOptions.aSlideRules.pop();
			if(!oResult.oOptions.aSlideRules[0].dStep){
				oResult.oOptions.aSlideRules[0].dStep = 1;
			}
			if(oSlider.dMax_value){
				var dParts = (oSlider.dMax_value - oResult.oOptions.aSlideRules[0].dValue) / oResult.oOptions.aSlideRules[0].dStep;
				for(var d = oResult.oOptions.aSlideRules[0].dValue + oResult.oOptions.aSlideRules[0].dStep, ii = 1; d <= oSlider.dMax_value; d += oResult.oOptions.aSlideRules[0].dStep, ii++){
					oResult.oOptions.aSlideRules[ii] = {
						dValue: d,
						dPercent: ii * 100 / dParts,
						dStep: oResult.oOptions.aSlideRules[0].dStep,
						sLabel: d
					};
				}
			}
			for(ii = 0; ii < oResult.oOptions.aSlideRules.length; ii++){
				if(!oResult.oOptions.aSlideRules[ii].dPercent){
					oResult.oOptions.aSlideRules[ii].dPercent = ii * 100 / oResult.oOptions.aSlideRules.length;
				}
				if(!oResult.oOptions.aSlideRules[ii].dStep){
					oResult.oOptions.aSlideRules[ii].dStep = oResult.oOptions.aSlideRules[0].dStep;
				}
				if(!oResult.oOptions.aSlideRules[ii].sLabel){
					oResult.oOptions.aSlideRules[ii].sLabel = oResult.oOptions.aSlideRules[ii].dValue;
				}
			}
			oResult.oOptions.aSlideRules[oResult.oOptions.aSlideRules.length - 1].dPercent = 100;
			if(oSlider.sMax_label){
				oResult.oOptions.aSlideRules[oResult.oOptions.aSlideRules.length - 1].sLabel = oSlider.sMax_label;
			}
		}
		if(bParams){
			oParams.parentNode.removeChild(oParams);
		}
	}

	oResult.sType = oResult.sType || this.extractTypeFromElement(oElement);

	oElement.onclick = null;
	oElement.removeAttribute('onclick');

	return oResult;

	function get_pattern_value(s){
		if(s){
			if(s.match(/^\/.+\/$/)){
				return eval(s);
			}else{
				return s;
			}
		}else{
			return /./;
		}
	}

};

