(function (window, undefined) {
	var _$cache = {};
	window._$ = function (selector) {
		if (_$cache[selector] == undefined) {
			_$cache[selector] = $(selector);
		}
		return _$cache[selector];
	}
	window._$delete = function (selector) {
		var reg = new RegExp("^"+selector.replace(/([.-])/g, '\\$1')+".*");
		for (var i in _$cache) {
			if (reg.test(i)) {
				try {
					delete(_$cache[i]);
				} catch (e) {
					_$cache[i] = undefined;
				}
			}
		}
	}

	var _timers = {};
	window.ct = function (timer) {
		if (/dbg=1/.test(document.location.search)) {
			console.time(timer);
		}
	}
	window.cte = function (timer) {
		if (/dbg=1/.test(document.location.search)) {
			console.timeEnd(timer);
		}
	}
})(window);

var aDependency = new Array();
var sDependantStyle = 'disabled';	// or hidden
var bHideSteps = false;
var iCurrentStep = 1;
var aFieldsSaved = new Array();

$(document).ready(function() {
	$('form.x_forms').each(function(index) {
		var $this = $(this);
		setTimeout(function(){_initForm($this)}, 50);
	});
//	$('form.x_forms').listenForChange();
});

function _initForm ($this) {
			var formId = $this.attr('id');
			if($this.attr('depended-style')){
				sDependantStyle = $this.attr('depended-style');
			}
			if($this.attr('step-style')){
				bHideSteps = true;
				hideAllStepsAfterCurrent();
			}

			$this.find('dl.required select').change(function() {
				validateRequired($(this));
				validateFormBasic(formId);
			});
			$this.find('input[format="email"]')
				.keyup(function() {
					validateEmail($(this));
					validateFormBasic(formId);
				}).change(function() {
					validateEmail($(this));
					validateFormBasic(formId);
				});
			$this.find('input[format="string"]')
				.keyup(function() {
					validateString($(this));
					validateFormBasic(formId);
				})
				.change(function() {
					validateString($(this));
					validateFormBasic(formId);
				});
			$this.find('input[format="russtring"]')
				.keyup(function() {
					validateRusString($(this));
					validateFormBasic(formId);
				})
				.change(function() {
					validateRusString($(this));
					validateFormBasic(formId);
				});
			$this.find('input[format="engstring"]')
				.keyup(function() {
					validateEngString($(this));
					validateFormBasic(formId);
				})
				.change(function() {
					validateEngString($(this));
					validateFormBasic(formId);
				});
			$this.find('input[format="card_holder"]')
				.keyup(function() {
					validateCardHolder($(this));
					validateFormBasic(formId);
				})
				.change(function() {
					validateCardHolder($(this));
					validateFormBasic(formId);
				});
			$this.find('input[format="integer"]')
				.keyup(function() {
					validateInteger($(this));
					validateFormBasic(formId);
				})
				.change(function() {
					validateInteger($(this));
					validateFormBasic(formId);
				});
			$this.find('dl[checkbox_min] input,dl[checkbox_max] input').click(function() {
				validateCheckboxes($(this).parent().parent());
				validateFormBasic(formId);
			});
			$this.find('input.x_sDay,input.x_sYear').keyup(function() {
				validateDate($(this).parent());
				validateFormBasic(formId);
			});
			$this.find('select.x_sMonth').change(function() {
				validateDate($(this).parent());
				validateFormBasic(formId);
			});
			$this.find('input.phone,input.phone_code').keyup(function() {
				validatePhone($(this).parent());
				validateFormBasic(formId);
			});
			$this.find('input.phone').blur(function() {
				formatPhone($(this), true);
			});
			$this.find('input[format="passport"]')
				.keyup(function() {
					validatePassport($(this));
					validateFormBasic(formId);
				})
				.change(function() {
					validatePassport($(this));
					validateFormBasic(formId);
				})
				.blur(function() {
					formatPassport($(this), true);
				});
			$this.find('input[format="card_code"]')
				.keyup(function() {
					validateCardCode($(this));
					validateFormBasic(formId);
				})
				.change(function() {
					validateCardCode($(this));
					validateFormBasic(formId);
				})
				.blur(function() {
					formatCardCode($(this), true);
				});
			$this.find('dl.starselector').each(function() {
				toggleStarSelectors($(this), formId);
			});
			$this.find('input.date').each(function() {
				if($(this).val() != ''){
					fillDateValue($(this));
				}
			});
			$this.find('dl.required input')
				.keyup(function() {
					validateRequired($(this));
					validateFormBasic(formId);
				})
				.change(function() {
					validateRequired($(this));
					validateFormBasic(formId);
				})
				.click(function() {
					validateRequired($(this));
					validateFormBasic(formId);
				});
			$this.find('input.phone').each(function(index) {
				initPhone($(this));
			});
			$this.find('input.passport_code_long').each(function(index) {
				initPassport($(this));
			});
			$this.find('input.card_code').each(function(index) {
				initCardCode($(this));
			});
			$this.find('input[min],input[minlength],input[max]')
				.keyup(function() {
					validateLength($(this));
					validateFormBasic(formId);
				})
				.change(function() {
					validateLength($(this));
					validateFormBasic(formId);
				})
				.blur(function() {
					validateLength($(this));
					validateFormBasic(formId);
				});

			$this.submit(function() {
				validateFormFull(formId);
				if($(this).find('button:submit').attr('disabled')){
					return false;
				}else{
					return true;
				}
			});
			makeDependencies($this, formId);
	//		validateFormBasic(formId);
			validateFormFull(formId);
}

function validateFormFull(formId){
	var $form = _$('#' + formId);
	$form.find('dl.required input,dl.required select').each(function() {
		validateRequired($(this));
	});
	$form.find('input[format="email"]').each(function() {
		validateEmail($(this));
	});
	$form.find('input[format="string"]').each(function() {
		validateString($(this));
	});
	$form.find('input[format="russtring"]').each(function() {
		validateRusString($(this));
	});
	$form.find('input[format="engstring"]').each(function() {
		validateEngString($(this));
	});
	$form.find('input[format="card_holder"]').each(function() {
		validateCardHolder($(this));
	});
	$form.find('input[format="integer"]').each(function() {
		validateInteger($(this));
	});
	$form.find('input[format="passport"]').each(function() {
		validatePassport($(this));
	});
	$form.find('input[format="card_code"]').each(function() {
		validateCardCode($(this));
	});
	$form.find('input[min],input[minlength],input[max]').each(function() {
		validateLength($(this));
	});

	// ??? $(this)
	$form.find('dl[checkbox_min] input,dl[checkbox_max] input').click(function() {
		validateCheckboxes($(this).parent().parent());
	});
	$form.find('input.x_sDay').each(function() {
		validateDate($(this).parent());
	});
	$form.find('input.phone').each(function() {
		validatePhone($(this).parent());
	});

	checkDependencies('', formId);
	validateFormBasic(formId);
}

function validateFormBasic(formId){
	var iRequired = 0;
	var iError = 0;

	var $form = _$('#' + formId);

	if($form.find('fieldset').length){
		$form.find('fieldset:visible').each(function(index) {
			var $this = $(this);
			iRequired += $this.find('dl.required:not(.disabled):visible').length;
			iError += $this.find('dl.invalid:not(.disabled):visible').length;
		});
	}else{
		iRequired = $form.find('dl.required:not(.disabled):visible').length;
		iError = $form.find('dl.invalid:not(.disabled):visible').length;
	}


	if(iRequired > 0 || iError > 0){
		$form.find('input:submit').attr('disabled', 'disabled');
	}else{
		$form.find('input:submit').attr('disabled', '');
	}

	if(bHideSteps){
		activateSteps(formId);
	}

    return (iRequired + iError);
}

function validateRequired(field){

	var sValue;

	if($(field).attr('value')){
		sValue = $(field).val().trim();
	}else{
		sValue = 1;
	}

	var dl = $(field).parent().parent();

	if($(field).is(':checkbox')){
		if(dl.find('input:checked').length == 0){
			sValue = '';
		}

		dl = $(field).parents('dl');
	}
	if($(field).is(':radio')){
		if($(field).parents('dd').find('input:checked').length == 0){
			sValue = '';
		}
		dl = $(field).parents('dl');
	}

	if($(field).hasClass('x_sMonth') || $(field).hasClass('x_sDay') || $(field).hasClass('x_sYear') || $(field).hasClass('phone_code') || $(field).hasClass('phone')){
		sValue = '';
		$(field).parent().find('input:text').each(function(index) {
			if($(this).val().length > 0){
				sValue = $(this).val();
			}
		});
	}
	if($(field).hasClass('x_sMonth') || $(field).hasClass('x_sDay') || $(field).hasClass('x_sYear')){
		sValue = "";
		$(field).parents("dd.input").find(".x_sYear, .x_sDay, .x_sMonth").each(function(){
			sValue += ""+this.value;
		});
		dl = $(field).parent().parent().parent();
	}

	if(sValue.length > 0){
		$(dl).removeClass('required');
		$(dl).addClass('required-ok');
	}else{
		$(dl).addClass('required');
		$(dl).removeClass('required-ok');
	}

	if($(dl).attr('required-group')){
		var sGroupName = $(dl).attr('required-group');
		var iGroupMin = $(dl).attr('required-group-min');

		$('form.x_forms').find('dl[required-group="'+ sGroupName +'"].required-group').each(function() {
			if(!($(this).hasClass('required-ok'))){
				$(this).addClass('required');
			}
			$(this).removeClass('required-group');
		});

		var iGroupFilled = $('form.x_forms').find('dl[required-group="'+ sGroupName +'"]:not(.required)').length;

		if(iGroupFilled >= iGroupMin){
			$('form.x_forms').find('dl[required-group="'+ sGroupName +'"]').each(function() {
				$(this).removeClass('required');
				$(this).addClass('required-group');
			});
		}
	}
}

function validateEmail(field){
	if($(field).val().length > 0){
		var sValue = $(field).val().replace( /[^\w\-\d\.@]/g, "" );
		sValue = sValue.replace( /^[^a-z\d]/i, "" );
		sValue = sValue.replace( /(@.*)@/g, "$1" );
		sValue = sValue.replace( /@\./, "@" );
		sValue = sValue.replace( /[^\w\d\-\.@]/g, "" );
		if( $(field).val() != sValue ) $(field).val(sValue);

		var x_mask = new RegExp( ".+@.*\\.[A-Za-z]{2,4}" );
		if($(field).val().match(x_mask)){
			$(field).parent().parent().removeClass('invalid');
		}else{
			$(field).parent().parent().addClass('invalid');
		}
	}else{
		$(field).parent().parent().removeClass('invalid');
	}
}

function validateString(field){
	var sValue = $(field).val().replace( /[^A-Za-zÀ-ßà-ÿ¨¸\- ]/g, "" );
	if( $(field).val() != sValue ) $(field).val(sValue);
}

function validateRusString(field){
	var sValue = $(field).val().replace( /[^À-ßà-ÿ¨¸\- ]/g, "" );
	if( $(field).val() != sValue ) $(field).val(sValue);
}

function validateEngString(field){
	var sValue = $(field).val().replace( /[^A-Za-z\-]/g, "" );
	if( $(field).val() != sValue ) $(field).val(sValue);
}

function validateCardHolder(field){
	var sValue = $(field).val().replace( /[^A-Za-z\- ]/g, "" );
	sValue = sValue.toUpperCase();
	if( $(field).val() != sValue ) $(field).val(sValue);
}

function validateInteger(field){
	var sValue = $(field).val().replace( /[^0-9\.,]/g, "" );
	if( $(field).val() != sValue ) $(field).val(sValue);
}

function validateLength(field){
	var bError = false;
	var sValue = $(field).val().trim();
	var iValue = parseInt(sValue);
	var i = 0;
	if(sValue.length > 0){
		if($(field).attr('minlength') && $(field).val().trim().length < $(field).attr('minlength')){
			bError = true;
		}
		if($(field).attr('min')){
			if(parseInt($(field).attr('min')))
				i = parseInt($(field).attr('min'));
			else{
				if($($(field).attr('min')).val().trim().length > 0)
					i = parseInt($($(field).attr('min')).val().trim());
				else
					i = 0;
			}
			if(iValue < i){
				bError = true;
			}
		}
		if($(field).attr('max')){
			if(parseInt($(field).attr('max')))
				i = parseInt($(field).attr('max'));
			else{
				if($(field).attr('max') != 'now' && $($(field).attr('max')).val().trim().length > 0)
					i = parseInt($($(field).attr('max')).val().trim());
				else
					i = 0;
			}
			if(iValue > i){
				bError = true;
			}
		}
	}

	if(bError){
		$(field).parent().parent().addClass('invalid');
	}else{
		$(field).parent().parent().removeClass('invalid');
	}
}

function validatePhone(field){
	var sValue = $(field).find('.phone_code').val().replace( /[^0-9]- /g, "" );
	if( $(field).find('.phone_code').val() != sValue ) $(field).find('.phone_code').val(sValue);

	formatPhone($(field).find('.phone'), false);

	//	we want to count integers only
	var sPhone = $(field).find('.phone').val().trim();
	sPhone = sPhone.replace( /[^0-9]/g, "" );

	var sPhoneCode = $(field).find('.phone_code').val().trim();

	if(sPhone.length + sPhoneCode.length == 10 || (sPhoneCode.length == 0 && sPhone.length == 0)){
		$(field).parent().removeClass('invalid');
	}else{
		$(field).parent().addClass('invalid');
	}
}

function shouldFormat( valueOld, valueNew ){
	if(valueOld){
		if(valueOld.length > valueNew.length){
			return false;
		}else{
			if(valueNew != valueOld && valueNew.substring(0, valueOld.length) == valueOld){
				return true;
			}else{
				return false;
			}
		}
	}else{
		return true;
	}
}

//	convert XXXXXXX to XXX-XX-XX on fly
function formatPhone( input, bBlur ){
	if(bBlur || shouldFormat(aFieldsSaved[$(input).attr('id')], $(input).val())){
		var sValue = $(input).val().replace( /[^0-9]/g, "" );
		var iFirstDash = 0;
		var iSecondDash = 0;
		var sValueResult = '';

		var iCodeLength = $(input).parent().find('.phone_code').val().length;
		if(iCodeLength <= 3){
			iFirstDash = 3;
			iSecondDash = 5;
		}
		if(iCodeLength == 4 || iCodeLength == 5){
			iFirstDash = 2;
			iSecondDash = 4;
		}
		if(iCodeLength == 5){
			iFirstDash = 1;
			iSecondDash = 3;
		}

		if(sValue.length >= iSecondDash && iSecondDash > 0){
			sValueResult = sValue.substring(0,iFirstDash) + '-' + sValue.substring(iFirstDash,(iFirstDash+2)) + '-' + sValue.substring((iSecondDash),(iSecondDash+2));
		}else{
			if(sValue.length >= iFirstDash){
				sValueResult = sValue.substring(0,iFirstDash) + '-' + sValue.substring(iFirstDash,(iFirstDash+2));
			}
		}
		if(sValueResult.length > 0 && $(input).val() != sValueResult){
			var sLastSymbol = $(input).val().substring($(input).val().length-1, $(input).val().length);
			if(!(sValueResult.length == ($(input).val().length-1) && (sLastSymbol == '-' || sLastSymbol == ' '))){
				if($(input).attr('maxlength') > 0 && sValueResult.length > $(input).attr('maxlength')){
					sValueResult = sValueResult.substring(0, $(input).attr('maxlength'));
				}
				$(input).val(sValueResult);
			}
		}
	}

	aFieldsSaved[$(input).attr('id')] = $(input).val();
}

//	convert XXXXXXX to XXX-XX-XX on fly
function formatPhoneOld( input ){
	var sValue = $(input).val().replace( /[^0-9]/g, "" );
	var iFirstDash = 0;
	var iSecondDash = 0;
	var sValueResult = '';

	if(sValue.length >= 5){
		iFirstDash = sValue.length - 4;
		iSecondDash = iFirstDash + 2;

		sValueResult = sValue.substring(0,iFirstDash) + '-' + sValue.substring(iFirstDash,(iFirstDash+2)) + '-' + sValue.substring((iSecondDash),(iSecondDash+2));
	}
	if(sValue.length == 4){
		sValueResult = sValue.substring(0,2) + '-' + sValue.substring(2,4);
	}

	if(sValueResult.length > 0 && $(input).val() != sValueResult){
		$(input).val(sValueResult);
	}
}

function initPhone(field){
	var sValue = $(field).val();
	var bInited = false;
	sValue = sValue.replace( /[^0-9 ]/g, "" );

	if(sValue.length > 0){
		var aPhone = sValue.split(' ');

		if(aPhone.length == 2){
			//	prev don't work in IE correctly
			$(field).parent().find('.phone_code').val(aPhone[0]);
			$(field).val(aPhone[1]);
			bInited = true;
		}
	}
	if(!bInited){
		$(field).val(sValue);
	}
	formatPhone($(field), true);

	$(field).attr('maxlength', '9');
}

function initCardCode(field){
	formatCardCode(field, true);
}

function formatCardCode(field, bBlur){
	if(bBlur || shouldFormat(aFieldsSaved[$(field).attr('id')], $(field).val())){
		var sValue = $(field).val().replace( /[^0-9]/g, "" );
		var sResult = '';
		for (var i=4; i <= sValue.length; i+=4) {
			sResult += sValue.substring(i-4, i) + ' ';
		};
		sResult += sValue.substring(i-4, sValue.length);

		if($(field).val() != sResult){
			var sLastSymbol = $(field).val().substring($(field).val().length-1, $(field).val().length);
			if(!(sResult.length == ($(field).val().length-1) && sLastSymbol == ' ')){
				if($(field).attr('maxlength') > 0 && sResult.length > $(field).attr('maxlength')){
					sResult = sResult.substring(0, $(field).attr('maxlength'));
				}
				$(field).val(sResult);
			}
		}
	}

	aFieldsSaved[$(field).attr('id')] = $(field).val();
}

function validateCardCode(field){
	formatCardCode($(field), false);
}

function initPassport(field){
	formatPassport(field, true);
}

function formatPassport( field, bBlur ){
	if(bBlur || shouldFormat(aFieldsSaved[$(field).attr('id')], $(field).val())){
		var sValue = $(field).val().replace( /[^0-9]/g, "" );;
		if(sValue.length >= 2){
			sValue = sValue.substring(0,2) + ' ' + sValue.substring(2, sValue.length);
		}
		if(sValue.length >= 5){
			sValue = sValue.substring(0,5) + ' ' + sValue.substring(5, sValue.length);
		}

		if($(field).val() != sValue){
			var sLastSymbol = $(field).val().substring($(field).val().length-1, $(field).val().length);
			if(!(sValue.length == ($(field).val().length-1) && sLastSymbol == ' ')){
				if($(field).attr('maxlength') > 0 && sValue.length > $(field).attr('maxlength')){
					sValue = sValue.substring(0, $(field).attr('maxlength'));
				}
				$(field).val(sValue);
			}
		}
	}

	aFieldsSaved[$(field).attr('id')] = $(field).val();
}

function validatePassport(field){
	formatPassport($(field), false);
	var sValue = $(field).val().replace( /[^0-9]/g, "" );

	if(sValue.length != 10){
		$(field).parent().parent().addClass('invalid');
	}else{
		$(field).parent().parent().removeClass('invalid');
	}
}

function validateCheckboxes(dd){
	var dl = $(dd).parent();
	var iMin = $(dl).attr('checkbox_min');
	var iMax = $(dl).attr('checkbox_max');
	var iSelected = $(dd).find('input:checked').length;

	var bError = false;

	if(iMax && iSelected && iSelected > iMax){
		bError = true;
	}
	if(iMin && iSelected && iSelected < iMin){
		bError = true;
	}

	if(bError){
		$(dl).addClass('invalid');
	}else{
		$(dl).removeClass('invalid');
	}
}

function validateDate(field){
	var field = $(field).parent();

	var sValue = $(field).find('.x_sDay').val().replace( /[^0-9-]/g, "" );
	if( $(field).find('.x_sDay').val() != sValue ) $(field).find('.x_sDay').val(sValue);

	var sValue = $(field).find('.x_sYear').val().replace( /[^0-9-]/g, "" );
	if( $(field).find('.x_sYear').val() != sValue ) $(field).find('.x_sYear').val(sValue);

	var bError = false;

	var dtDate = new Date( $(field).find('input.x_sYear').val(), $(field).find('select').val() - 1, $(field).find('input.x_sDay').val() );
	if(!(dtDate.getDate() == $(field).find('input.x_sDay').val() && dtDate.getMonth() == ($(field).find('select').val() - 1) && dtDate.getFullYear() == $(field).find('input.x_sYear').val())){
		bError = true;
	}{
		var min = $(field).find('input[type="hidden"]').attr('min');
		var max = $(field).find('input[type="hidden"]').attr('max');

		var dMin = dateFromString(min);
		var dMax = dateFromString(max);

		if((dMin != '' && dtDate < dMin) || (dMax != '' && dtDate > dMax)){
			bError = true;
		}
	}

	if(bError){
		$(field).parent().addClass('invalid');
	}else{
		$(field).parent().removeClass('invalid');
		$(field).find('input[type="hidden"]').val(dateToString(dtDate));
	}
}

function dateToString ( dDate ){
// var month = dDate.getMonth() + 1;
// var day = dDate.getDate();
// if(month < 10){month = month + '0';}
// if(day < 10){day = day + '0';}

	return(dDate.getDate() + '.' + (dDate.getMonth()+1) + '.' + dDate.getFullYear());
//	return(dDate.getFullYear()+'-'+ month +'-'+ day);
}

//	creates date object from string like '1990-12-31' or 'now' or '#id'
function dateFromString( sqlString ){
	if(sqlString){
		var dd = sqlString.split('-');
		if(dd.length == 3){
			return(new Date(dd[0], (dd[1]-1), dd[2]));
		}else{
			if(sqlString == 'now'){
				return(new Date());
			}else if (sqlString != '' && sqlString.substring(0,1) == '#'){
				var date = $(sqlString).val();
				dd = date.split('.');
				if(dd.length == 3){
					return(new Date(dd[2], (dd[1]-1), dd[0]));
				}else{
					return '';
				}
			}else{
				return '';
			}
		}
	}else{
		return '';
	}
}

function makeDependencies( form, formId ){
	$(form).find('depended').each(function() {
		if($(this).attr('value') == ''){
			sMode = 'd-value';
		}else{
			sMode = $(this).attr('mode');
		}

		aDependency.push([$(this).attr('from'), $(this).attr('to'), $(this).attr('value'), sMode, $(this).attr('inverse')]);
	});

	var aFilled = new Array();

	for(var i=0; i < aDependency.length; i++){
		if(!contains(aFilled, aDependency[i][0])){
			aFilled.push(aDependency[i][0]);

			$('form *[name="'+ aDependency[i][0] +'"]').change(function() {
				checkDependencies($(this).attr('name'), formId);
			});
			$('form *[name="'+ aDependency[i][0] +'"]:checkbox').click(function() {
				checkDependencies($(this).attr('name'), formId);
			});
			$('form *[name="'+ aDependency[i][0] +'"]:radio').click(function() {
				checkDependencies($(this).attr('name'), formId);
			});
		}
	}
}

function checkDependencies( sName, formId ){
	var aThisDependants = new Array();

	//	1. Build an array fields, depending from id
	for(var i=0; i < aDependency.length; i++){
		if(aDependency[i][0] == sName || sName == ''){
			if(!contains(aThisDependants, aDependency[i][1])){
				aThisDependants.push(aDependency[i][1]);
			}
		}
	}

	//	2. Validate each one of them
	for(var i=0; i < aThisDependants.length; i++){
		validateDependencies(aThisDependants[i]);
	}

	validateFormBasic(formId);
}

//	Check if all fields are filled in
function validateDependencies( id ){
	var bActive = 0;
	var bInverse = 0;


	for(var i=0; i < aDependency.length; i++){
		if(aDependency[i][1] == id){
			if(aDependency[i][3] == 'd-value'){
				bActive = 1;
				filterSelectByDValue(aDependency[i][0], aDependency[i][1]);
			}else{
				if((aDependency[i][3] == 'and' && bActive) || aDependency[i][3] != 'and'){

					//	If we passed previous check, we clear passed state
					if(aDependency[i][3] == 'and'){
						bActive = 0;
					}

					var aValue = aDependency[i][2].split('|');

					for(var x=0; x < aValue.length; x++){
						if($('form *[name="'+ aDependency[i][0] +'"]').is(':checkbox') || $('form *[name="'+ aDependency[i][0] +'"]').is(':radio')){

							$('form *[name="'+ aDependency[i][0] +'"]:checked').each(function(index) {
								if($(this).attr('value') == aValue[x]){
									bActive = 1;
								}
							});

						}else{
							if($('#' + aDependency[i][0]).val() == aValue[x]){
								bActive = 1;
							}
						}
					}

					if(aDependency[i][4] == 'true'){	//inverse
						bInverse = 1;
					}
				}
			}
		}
	}

	if(bInverse){
		if(bActive){
			bActive = 0;
		}else{
			bActive = 1;
		}
	}

	if($('#' + id).is('fieldset')){
		toggleFieldset($('#' + id), bActive);
	}else{
		if($('form input[name="'+ id +'"]:first').is(':radio') || $('form input[name="'+ id +'"]:first').is(':checkbox')){
			toggleRadio(id , bActive);
		}else{
			toggleField($('#' + id), bActive);
		}
	}

}

function toggleRadio( sName, bActive ){
	var oField = $('form input[name="'+ sName +'"]:first').parents('dl');

	if(bActive){
		if(sDependantStyle == 'disabled'){
			$(oField).removeClass('disabled');
			$(oField).find('input,select,textarea').attr('disabled', '');
			$(oField).find('dl').removeClass('disabled', '');
		}else{
			$(oField).show();
			$(oField).find('dl').show();
		}
	}else{
		if(sDependantStyle == 'disabled'){
			$(oField).addClass('disabled');
			$(oField).find('input,select,textarea').attr('disabled', 'disabled');
			$(oField).find('dl').addClass('disabled');
		}else{
			$(oField).hide();
			$(oField).find('dl').hide();
		}
	}
}

function toggleFieldset( oField, bActive ){
	if(bActive){
		if(sDependantStyle == 'disabled'){
			$(oField).removeClass('disabled');
			$(oField).find('input,select,textarea').attr('disabled', '');
			$(oField).find('dl').removeClass('disabled', '');
		}else{
			$(oField).show();
			$(oField).find('dl').show();
		}
	}else{
		if(sDependantStyle == 'disabled'){
			$(oField).addClass('disabled');
			$(oField).find('input,select,textarea').attr('disabled', 'disabled');
			$(oField).find('dl').addClass('disabled');
		}else{
			$(oField).hide();
			$(oField).find('dl').hide();
		}
	}

	validateDependencies('');
}

function toggleField( oField, bActive ){
	var bMultiple = 0;

	if($(oField).hasClass('phone') || $(oField).hasClass('date')){
		bMultiple = 1;
	}

	if(bActive){
		if(sDependantStyle == 'disabled'){
			$(oField).attr('disabled', '');
			$(oField).parent().parent().removeClass('disabled');
			if(bMultiple){
				$(oField).parent().find('input,select').attr('disabled', '');
			}
		}else{
			$(oField).parent().parent().show();
		}
	}else{
		if(sDependantStyle == 'disabled'){
			$(oField).attr('disabled', 'disabled');
			$(oField).parent().parent().addClass('disabled');
			if(bMultiple){
				$(oField).parent().find('input,select').attr('disabled', 'disabled');
			}
		}else{
			$(oField).parent().parent().hide();
		}
	}
}

function filterSelectByDValue(selectSourceId, selectTargetId){
	var sSourceValue = $('#' + selectSourceId).val();

	if($('#' + selectTargetId).length == 0 && $('input[name="'+selectTargetId+'"]').is(':radio')){
		filterRadioByDValue(selectSourceId, selectTargetId);
	}else{
		var oTarget = $('#'+selectTargetId);
		var sTargetSelectedValue = $(oTarget).val();
		oTarget.html('');

		$('#'+selectTargetId+'-d-source option').each(function() {
			if($(this).attr('d-value') == sSourceValue || !$(this).attr('d-value')){
				oTarget.append('<option value="'+ $(this).attr('value') +'">'+ $(this).html() +'</option>');
			}
		});

		$('#'+selectTargetId).change();
		if(sTargetSelectedValue != null)
			oTarget.val(sTargetSelectedValue);

		if($('#' + selectTargetId).hasClass('popup-selector')){
			updatePopupSelector(selectTargetId);
		}
	}
}

function filterRadioByDValue(selectSourceId, selectTargetId){
	var sSourceValue = $('#' + selectSourceId).val();

	var oTargetDD = $('input[name="'+selectTargetId+'"]').parent().parent();
	$(oTargetDD).find('div.selector').each(function() {
		if($(this).attr('d-value') == sSourceValue || !$(this).attr('d-value')){
			$(this).show();
		}else{
			$(this).hide();
		}
	});
}

function contains(aFilled, field){
	var bFound = 0;
	for(var x=0; x < aFilled.length; x++){
		if(aFilled[x] == field){
			bFound = 1;
			break;
		}
	}

	return(bFound);
}

/* Work with steps */

function hideAllStepsAfterCurrent(){
	$('fieldset.step').each(function(index) {
		var sId = $(this).attr('id');
		var iId = sId.substring(4,sId.length);
		if(iId > iCurrentStep){
			$(this).hide();
		}
	});
}

function activateSteps(formId){
	var iRequired = 0;
	var iError = 0;

	$('form#' + formId + ' fieldset.step').each(function(index) {
		if($(this).attr('goto')){
			iRequired = $(this).find('dl.required:not(.disabled):visible').length;
			iError = $(this).find('dl.invalid:not(.disabled):visible').length;

			if(iRequired == 0 && iError == 0){
				$('form#' + formId + ' #step' + $(this).attr('goto')).show();
			}
		}
	});

	fixStepNumbers(formId);
}

function fixStepNumbers(formId){
	$('form#' + formId + ' fieldset.step:visible').each(function(index) {
		$(this).find('div.number').text(index+1);
	});
}

/* /Work with steps */


/* Starselector */

function toggleStarSelectors(dl, formId){
	$(dl).find('img').mouseover(function() {
		showStars($(this));
	});
	$(dl).find('img').click(function() {
		setStars($(this));
	});
	$(dl).find('div.star-bg').mouseout(function() {
		restoreStars($(this));
	});
}

function showStars( img )
{
	var className = $(img).attr('class');
	var position = className.substring(5);	//	number of star in group

	$(img).parent().find('img').each(function(index) {
		if(index < position){
			$(this).attr('src', '/f/1/i/i-star-'+ (index + 1) +'.gif');
		}else{
			$(this).attr('src', '/f/1/global/d-t.gif');
		}
	});
}

//	show currently checked amount of stars
function restoreStars( div )
{
	var id = $(div).attr('id').substring(5);
	var stars = $('#'+id).val();

	$(div).find('img').each(function(index) {
		if(index < stars){
			$(this).attr('src', '/f/1/i/i-star-'+ (index + 1) +'.gif');
		}else{
			$(this).attr('src', '/f/1/global/d-t.gif');
		}
	});
}

function setStars( img )
{
	var className = $(img).attr('class');
	var position = className.substring(5);	//	number of star in group
	var id = $(img).parent().attr('id').substring(5);
	$('#'+id).val(position);
	$('#'+id).change();
}

/* /Starselector */

function fillDateValue( oHidden ){
	var value = $(oHidden).val();
	aValue = value.split('.');
	$(oHidden).parent().find('.x_sDay').val(aValue[0]*1);
	$(oHidden).parent().find('.x_sMonth').val(aValue[1]*1);
	$(oHidden).parent().find('.x_sYear').val(aValue[2]*1);
}


/* Safari autofill */

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
};

//	Enabling auto-fill validation in Safari
(function($) {
	$.fn.listenForChange = function(options) {
		settings = $.extend({
			interval: 200 // in microseconds
		}, options);

		var jquery_object = this;
		var current_focus = null;

		jquery_object.filter(":input").add(":input", jquery_object).focus( function() {
			current_focus = this;
		}).blur( function() {
			current_focus = null;
		});

		setInterval(function() {
			// allow
			jquery_object.filter(":input").add(":input", jquery_object).each(function() {
				// set data cache on element to input value if not yet set
				if ($(this).data('change_listener') == undefined) {
					$(this).data('change_listener', $(this).val());
					return;
				}
				// return if the value matches the cache
				if ($(this).data('change_listener') == $(this).val()) {
					return;
				}
				// ignore if element is in focus (since change event will fire on blur)
				if (this == current_focus) {
					return;
				}
				// if we make it here, manually fire the change event and set the new value
				$(this).trigger('keyup');
				$(this).data('change_listener', $(this).val());
			});
		}, settings.interval);
		return this;
	};
})(jQuery);

/* /Safari autofill */

