function DynamicFormChanger(type, elementsPostfix) {
	//used for adding commercial
	if (type !== 'search') {
		type = 'edit';
	}
	if (typeof(elementsPostfix) == 'undefined') {
		elementsPostfix = '';
	}
	this.type = type;
	this.elementsPostfix = elementsPostfix;
	this.isMillionareSelected = false;
	this.fields = ['country', 'region', 'region-district','city', 'city-district', 'city-micro-district'];
	this.millionareFieldName = 'region';
	this.ajaxNames = {
					  region : 'getregions',
					  "region-district" : 'getregiondistricts',
					  city : "getregiondistrictcities", 
					  "city-district" : "getcitydistricts",
					  "city-micro-district" : "getcitymicrodistricts"
	};
	
	this.fieldsObjects = new Array;
	
	this.rowsObjects = new Array;
	this.callbacks = new Array;
	this.fillObjects();
	$('.hidden-field').hide().find('select').attr('disabled', 'disabled');
	this.bindChangeFunctions();
	
	
}

DynamicFormChanger.prototype.fillObjects = function() {
	if (this.type == 'edit') {
		var i;
		for (i in this.fields) {
			this.rowsObjects[this.fields[i]]= $('#'+this.fields[i]+'TRow'+this.elementsPostfix);
		}
	}
	var i;
	for (i in this.fields) {
		this.fieldsObjects[this.fields[i]]= $('select#'+this.fields[i]+this.elementsPostfix);
	}
}

DynamicFormChanger.prototype.setRequired = function(field, value) {
	if (typeof(this.fieldsObjects[field]) != 'undefined') {
		if (value != true){ 
			this.fieldsObjects[field].removeClass('req');
			if (this.type == 'edit') this.rowsObjects[field].find('.legend .reqired').remove();
		}
		else
		{
			this.fieldsObjects[field].addClass('req');
			if (this.type == 'edit') {
				this.rowsObjects[field].find('.legend .reqired').remove();
				this.rowsObjects[field].find('.legend').prepend($('<span class="reqired">*&nbsp;</span>'));
			}
		}
	}
}

DynamicFormChanger.prototype.bindChangeFunctions = function() {
	var i;
	for (i in this.fields) {
		if (this.fieldsObjects[this.fields[i]].size() > 0) {
			this.fieldsObjects[this.fields[i]].get(0).fname = this.fields[i];
			var dfc = this;
			this.fieldsObjects[this.fields[i]].change(function(){
				dfc.changeField($(this).get(0).fname);
			});
		}
	}
}

// returns array of child fields (which stands after selected)
DynamicFormChanger.prototype.getChilds = function(fieldName) {
	var result = new Array;
	var i;
	var isChilds = false;
	for (i in this.fields) {
		if (isChilds == true) {
			result.push(this.fields[i]);
		} else {
			if (this.fields[i] == fieldName) isChilds = true;
		}
	}
	return result;
}

DynamicFormChanger.prototype.hideChilds = function(fieldName) {
	var childs = this.getChilds(fieldName);
	for (i in childs) {
		this.fieldsObjects[childs[i]].hide();
	}	
}

DynamicFormChanger.prototype.addChangeCallback = function(fieldName, func) {
	this.callbacks[fieldName] = func;
}

DynamicFormChanger.prototype.addAllFieldsChangeCallback = function(func) {
	this.callbacks['fieldChange'] = func;
}

DynamicFormChanger.prototype.addFieldShowCallback = function(func) {
	this.callbacks['fieldShow'] = func;
}

DynamicFormChanger.prototype.changeField = function(fieldName) {
	var childs = this.getChilds(fieldName);
	var childsCopy = this.getChilds(fieldName);
	
	var i;
	for (i in childs) {
		if (this.type == 'edit') this.rowsObjects[childs[i]].hide();
		if (this.type == 'search') this.fieldsObjects[childs[i]].hide();
		this.fieldsObjects[childs[i]].attr('disabled','disabled');
	}
	var childFieldName = childs.shift();
	if ($(this.fieldsObjects[fieldName]).val() < 0) {
		childs.shift(); 
		childFieldName = childs.shift(); 
	} 
	if (typeof(childFieldName) !== 'undefined' && $(this.fieldsObjects[fieldName]).val() != '') {
		var dfc = this;
		urlRoot = urlRoot.replace(/\/admin\//, '/');
		$.getJSON(urlRoot+"rpc/"+this.ajaxNames[childFieldName]+".php",{id: $(this.fieldsObjects[fieldName]).val()}, function(j){
	  		    var options = '';
	    		  for (var i = 0; i < j.length; i++) {
	  			      options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
	   			   }
	   			   if (j.length > 1) {
	   			   		dfc.fieldsObjects[childFieldName].html(options);
						if (dfc.type == 'edit') dfc.rowsObjects[childFieldName].show();
						if (dfc.type == 'search') dfc.fieldsObjects[childFieldName].show();
						dfc.fieldsObjects[childFieldName].attr('disabled','');
						if (typeof(dfc.callbacks['fieldShow']) == 'function') dfc.callbacks['fieldShow'].call(dfc,childs);
	   			   }
  		});
	}
	if (typeof(this.callbacks[fieldName]) == 'function') this.callbacks[fieldName].call(this,childsCopy);
	if (typeof(this.callbacks['fieldChange']) == 'function') this.callbacks['fieldChange'].call(this,childsCopy);
}