var mf_class = 'mf_input';
var form_showed = false;
var region_changed_manually = false;

/*
	function forms query string and submits form

	only fields that has class mf_class are submitted

	Initially form is submitted in such a strange way because we wanted to remove some ambiguities of field names.
	Currently this cause can be irrelevant and form may be simply submitted.
*/
function search_submit() {
	if (!check_required_fields(true)) {
		return;
	}

	jQuery('.submit_button').hide();
	jQuery('.submitted_message').show();

	var data = jQuery('.' + mf_class).serialize();
	data += add_multiselect('otype_div');
	var cid = jQuery('#country').val();
	if (cid == 'c_58') {
		data += add_multiselect('region_div');
		data += add_multiselect('district_spb_div');
		data += add_multiselect('metro_div');
		data += add_multiselect('district_lenobl_div');
	}
	data += add_multiselect('district_common_div');
	data += add_multiselect('housetype');
	if (get_checked_value('.etype_radio') == 'com') {
		data += add_multiselect('purpose_div');
	}
	data += add_multiselect('build_quarter');
	data += add_multiselect('build_year');
	window.location.href = jQuery('#main_search_form').attr('action') + '?' + data;
}


/*
	function stops form submission
*/
function cancel_search() {
	window.stop();
	jQuery('.submitted_message').hide();
	jQuery('.submit_button').show();
	jQuery('.search_cancelled_message').show();
	setTimeout(function() {
		jQuery('.search_cancelled_message').slideUp("slow");
	},3000);
	return false;
}


/*
	function initializes not filled required fields to be visually selected (see CSS class 'required-not-set')
*/
function init_required_fields() {
	var val = get_checked_value('.op_radio');
	if (!val) {
		jQuery('.op_radio').parent().addClass('required-not-set');
	}
	var val = get_checked_value('.etype_radio');
	if (!val) {
		jQuery('.etype_radio').parent().addClass('required-not-set');
	}
}


/*
	functions checks that all required fields are filled before submit
*/
function check_required_fields(show) {

	var val = get_checked_value('.op_radio');
	if (!val) {
		if (show) {
			jQuery('.op_radio_warning').show();
			jQuery(window).scrollTop(jQuery('.op_radio_warning').offset().top-50);
		}
		return false;
	}

	var val = get_checked_value('.etype_radio');
	if (!val) {
		if (show) {
			jQuery('.etype_radio_warning').show();
			jQuery(window).scrollTop(jQuery('.etype_radio_warning').offset().top-50);
		}
		return false;
	}
	return true;
/* */
}

function set_required_fields(op,etype) {

	if (op) {
		jQuery('#op_'+op).attr('checked','checked');
	}
	if (etype) {
		jQuery('#etype_'+etype).attr('checked','checked');
	}
/* */
}


function required_fields_filled() {

	var rf = check_required_fields(false);
	if (!rf) {
		var h = window.location.hash;
		if (h.length <= 0) {
			return false;
		}
		if (h.indexOf('#') == 0) {
			 h = h.substring(1,h.length);
		}
		var op = '';
		var etype = '';
		var novo = false;
		switch(h) {
			case 'zhil': op = 'sale';      etype = 'zhil'; break;
			case 'ard':  op = 'rent';      etype = 'zhil'; break;
			case 'com':  op = 'sale';      etype = 'com';  break;
			case 'zag':  op = 'sale';      etype = 'zag';  break;
			case 'cot':  op = 'rent';      etype = 'zag';  break;
			case 'cotl': op = 'rent';      etype = 'zag';  break;
			case 'cotd': op = 'rentdaily'; etype = 'zag';  break;
			case 'dol':  op = 'sale';      etype = 'zhil'; novo = true; break;
			default: break;
		}

		if (op && etype) {
			set_required_fields(op,etype);
			if (novo) {
				jQuery('#neworold_new').attr('checked','checked');
			}
			rf = true;
		}

		
	}

	if (rf) {

		// do heavy initializations and DOM lookups only once
		if (!form_showed) {

			form_showed = true;

			// show all form fields that depend on estate type and operation
			jQuery('.required-set').show();

			// hide help message
			jQuery('#fill_all_required_warning').hide();

			// initialize all multiselect lists
			var msoptions = {
				selectAll: false,
				noneSelected: "выбрать из списка",
				oneOrMoreSelected: "*"
			}
			jQuery('#district_common, #housetype, #purpose, #zag_purpose, #metro').multiSelect(msoptions);
			jQuery('#build_quarter, #build_year').multiSelect({
				selectAll: true,
				selectAllText: "все",
				noneSelected: '-',
				oneOrMoreSelected: '*'
			});
			jQuery('#build_type').multiSelect({
				selectAll: false,
				noneSelected: 'не важно',
				oneOrMoreSelected: '*'
			},function() { build_type_change(0); } );
			jQuery('#build_quarter').css('width','50px');
			jQuery('#build_year').css('width','90px');
			jQuery('#otype').multiSelect(msoptions,function(cbox) { otype_change(cbox); } );
			jQuery('#region').multiSelect(msoptions,function() { region_change(); } );


			// emulate some events

			op_change();
			otype_change();
			country_change();

			etype_change();

			neworold_change();
			build_type_change(1);
			otype_change();


		}

		return true;
	}
	return false;
}

/*
	country change handler
*/
function country_change() {
	var cid = jQuery('#country').val() || 'c_58';

	// 58 - Russia ID in database, c_58 - value in SELECT tag for Russia
	if (cid == 'c_58') {
		jQuery('.foreign').hide().removeClass(mf_class);
		jQuery('.foreign input, .foreign select').removeClass(mf_class);
		jQuery('.russia').fadeIn("fast").addClass(mf_class);
		region_change();
	} else {
		jQuery('.russia').hide();
		jQuery('.russia input, .russia select').removeClass(mf_class);
		jQuery('.foreign').fadeIn("fast");
	}
}

/*
	region change handler
*/
function region_change() {

	if (!region_changed_manually) {
		region_reset();
	}

/*
	var reg = get_checked_value('.region_radio');
	if (reg) {
		jQuery('.lenobl, .spb').hide().removeClass(mf_class);

		if (reg == 'spb') {
			jQuery('.lenobl').hide().removeClass(mf_class);
			jQuery('.spb').show().addClass(mf_class);
		} else if (reg == 'lenobl') {
			jQuery('.spb').hide().removeClass(mf_class);
			jQuery('.lenobl').show().addClass(mf_class);
		} else {
			jQuery('.lenobl, .spb').hide().removeClass(mf_class);
		}
	}
*/




	var rspb = jQuery('#region_spb');
	var rlenobl = jQuery('#region_lenobl');
	var rother = jQuery('#region_other');
	var rforeign = jQuery('#region_foreign');

	// quick and dirty check if we are in short search form
	if (rspb && rlenobl && rother && rforeign) {
		// the following block of code suits for region checkboxes (short search form)
		jQuery('.spb, .lenobl, .other, .foreign').hide().removeClass(mf_class);
		if (rspb.attr('checked')) { jQuery('.spb').show().addClass(mf_class); }
		if (rlenobl.attr('checked')) { jQuery('.lenobl').show().addClass(mf_class); }
		if (rother.attr('checked')) { jQuery('.other').show().addClass(mf_class); } 
		if (rforeign.attr('checked')) { jQuery('.foreign').show().addClass(mf_class); }
	} else {
		// the following block of code suits for region multiselect created with jquery.multiselect plugin (full search form)
		jQuery('.lenobl, .spb, .metro').hide().removeClass(mf_class);

		jQuery('#region_div label.checked input').each(function(i,e) {
			var v = jQuery(e).val();
			var et = v.substring(0,v.indexOf('_'));
			var id = parseInt(v.substring(v.indexOf('_')+1,v.length));
			if (id > 0) {
				if (id == 6) {
					jQuery(".spb").show().addClass(mf_class);
					jQuery(".metro").show().addClass(mf_class);
				} else if (id == 2) {
					jQuery('.lenobl').show().addClass(mf_class);
				}
			}
		});
	}


/*
	var rid = jQuery("#region").val();

	// 6 - SPb ID in database, 2 - Lenobl ID
	if (rid == 'r_6') {
		jQuery('.lenobl').hide().removeClass(mf_class);
		jQuery(".spb").show().addClass(mf_class);
		jQuery(".metro").show().addClass(mf_class);
	} else {
		if (rid == 'r_2') {
			jQuery('.lenobl').show().addClass(mf_class);
		} else {
			jQuery('.lenobl').hide().removeClass(mf_class);
		}
		jQuery('.spb').hide().removeClass(mf_class);
		jQuery(".metro").hide().removeClass(mf_class);
	}
*/

}


function region_click() {
	region_changed_manually = true;
	region_change();
}

function region_reset() {
	if (region_changed_manually) { return; }

	var etype = get_checked_value('.etype_radio');
	if (etype == 'zhil') {
		jQuery('#region_spb').attr('checked',true);
		jQuery('#region_lenobl, #region_other, #region_foreign').attr('checked',false);
	} else if (etype == 'zag') {
		jQuery('#region_lenobl').attr('checked',true);
		jQuery('#region_spb, #region_other, #region_foreign').attr('checked',false);

	} else if (etype == 'com') {
		jQuery('#region_spb, #region_lenobl').attr('checked',true);
		jQuery('#region_other, #region_foreign').attr('checked',false);
	}
}

/*
	object type change handler
		argument 'cbox' is obsolete and should be removed

		shows and hides some layers that depend on object type selected
*/
function otype_change(cbox) {
	// get currently selected estate type
	etype = get_checked_value('.etype_radio');
	
	// traverse through selected object types
	var found = 0;
	var froom = 0;
	jQuery('#otype_div label.checked input').each(function(i,e) {
		var v = jQuery(e).val();
		// each object type value has syntax <letter>_<id>
		// here we retrieve this <id>
		var et = v.substring(0,v.indexOf('_'));
		var id = parseInt(v.substring(v.indexOf('_')+1,v.length));
		if (id > 0) {
			// if selected object type is one of those that can have rooms, show related layers
			if ( (id == 80) || (id == 81) || (id == 83) || (id == 1009) || (id == 1006) || (id == 1001) || (id == 1216) || (id == 1008) || (id == 1007) ) {
				// object can have rooms
				jQuery('.rooms').show();
				found++;
			}
			// if selected object type is 'room', show related layers, else hide them
			if (id == 81) {
				jQuery('.room').show();
				froom++;
			} else {
				if (froom < 0) {
					jQuery('.room').hide();
				}
			}
		}
	});

	// if 'room' was not selected, hide related layers
	if (froom <= 0) {
		jQuery('.room').hide();
	}
}



/*
	estate type change handler
		estate type can be either 'zhil', 'zag' or 'com' - zhilaya, zagorodnaya, commercheskaya
		it is selected via radio buttons
*/
function etype_change() {
	// remove possible warning about not filled required field
	jQuery('.etype_radio_warning').hide();
	jQuery('.etype_radio').parent().removeClass('required-not-set');

	// get current radio button value
	var et = get_checked_value('.etype_radio');

	if (et == 'com') {
		jQuery('#op_rentdaily').attr('disabled',true).attr('checked',false).attr('title','Выберите другой тип недвижимости');
	} else {
		jQuery('#op_rentdaily').attr('disabled',false).attr('title','');
	}

	if (!required_fields_filled()) {
		return;
	}


	// set appropriate label text
	if (et == 'zhil') {
		jQuery('#multirooms_label').html('квартире');
	} else if (et == 'zag') {
		jQuery('#multirooms_label').html('доме');
	}

	// filter object type list according to selected estate type
	var otchecked = 0;
	jQuery('#otype_div label input').each(function(i,e) {
		var v = jQuery(e).val();
		var etype = v.substring(0,v.indexOf('_'));
		if (etype.indexOf(et) >= 0) {
			jQuery(e).parent().show();
			if (jQuery(e).parent().hasClass('checked')) {
				otchecked++;
			}
		} else {
			jQuery(e).attr('checked','').parent().hide().removeClass("checked");
//			jQuery(e).attr('checked','');
		}
	});
	// if nothing is selected then set empty text
	if (otchecked <= 0) {
		jQuery('#otype_div a.multiSelect span').html('выбрать из списка');
		jQuery('#otype_div a.multiSelect').attr('title','выбрать из списка');
	}


	// hide and show layers depending on estate type
	if (et == 'zhil') {
		jQuery('.zag, .com').hide().removeClass(mf_class);
		jQuery('.zag input, .zag select, .com input, .com select').removeClass(mf_class);
		jQuery('.zhil').show().addClass(mf_class);
		jQuery('.zhil input, .zhil select').addClass(mf_class);
		set_selected_by_id('region','r_6');
		region_change();
		otype_change();
	} else if (et == 'zag') {
		jQuery('.zhil, .com').hide().removeClass(mf_class);
		jQuery('.zhil input, .zhil select, .com input, .com select').removeClass(mf_class);
		jQuery('.zag').show().addClass(mf_class);
		jQuery('.zag input, .zag select').addClass(mf_class);
		set_selected_by_id('region','r_2');
		region_change();
		otype_change();
	} else if (et == 'com') {
		jQuery('.zag, .zhil').hide().removeClass(mf_class);
		jQuery('.zhil input, .zhil select, .zag input, .zag select').removeClass(mf_class);
		jQuery('.com').show().addClass(mf_class);
		jQuery('.com input, .com select').addClass(mf_class);
		region_change();
		otype_change();
	}

	// emulate some events
	build_type_change(1);
}

function op_change() {
	jQuery('.op_radio_warning').hide();
	jQuery('.op_radio').parent().removeClass('required-not-set');

	var op = get_checked_value('.op_radio');

	if (op == 'rentdaily') {
		jQuery('#etype_com').attr('disabled',true).attr('checked',false).attr('title','Выберите другую операцию с недвижимостью');
	} else {
		jQuery('#etype_com').attr('disabled',false).attr('title','');
	}


	if (!required_fields_filled()) {
		return;
	}

	if (op == 'sale') {
		jQuery('.rent, .rentdaily').hide().removeClass(mf_class);
		jQuery('.rent input, .rent textarea, .rentdaily input, .rentdaily textarea').removeClass(mf_class);
		jQuery('.sale').show().addClass(mf_class);
		jQuery('.sale input .sale textarea').addClass(mf_class);
		jQuery('#price_header').html('Стоимость продажи');
		jQuery('#price_label').html('тыс. руб.');
	} else if (op == 'rent') {
		jQuery('.sale, .rentdaily').hide().removeClass(mf_class);
		jQuery('.sale input, .sale textarea, .rentdaily input, .rentdaily textarea').removeClass(mf_class);
		jQuery('.rent').show().addClass(mf_class);
		jQuery('.rent input, .rent textarea').addClass(mf_class);
		jQuery('#price_header').html('Стоимость аренды в месяц');
		jQuery('#price_label').html('руб/месяц');
	} else if (op == 'rentdaily') {
		jQuery('.rent, .sale').hide().removeClass(mf_class);
		jQuery('.rent input, .rent textarea, .sale input, .sale textarea').removeClass(mf_class);
		jQuery('.rentdaily').show().addClass(mf_class);
		jQuery('.rentdaily input, .rentdaily textarea').addClass(mf_class);
		jQuery('#price_header').html('Стоимость аренды в день');
		jQuery('#price_label').html('руб/день');
	}
	build_type_change(1);
}

function ot_change() {
	var hide = 0;
	var ot = get_checked_value('.ot_radio');
	var pw = jQuery('#photocat_warning');
	if (ot == 'c') {
		if (hide) {
			pw.show();
		} else {
			pw.fadeIn('fast');
		}
	} else {
		if (hide) {
			pw.hide();
		} else {
			pw.slideUp('fast');
		}
	}
}

function build_type_change(hide) {
	var btc = get_checked_value('.build_type_radio');
	if (!btc) {
		jQuery('#build_type_div label.checked input').each(function(i,e) {
			var v = jQuery(e).val();
			if (v == 'date') {
				btc = 'date';
			}
		});
	}
	var dd = jQuery('.dol_date');

	if (btc == 'date') {
		if (hide) {
			dd.show();
		} else {
			dd.fadeIn('fast');
		}
	} else {
		if (hide) {
			dd.hide();
		} else {
			dd.slideUp('fast');
		}
	}
}

function neworold_change() {
	var noo = get_checked_value('.neworold_radio');
	if (noo == 'new') {
		jQuery('.dol').fadeIn('fast');
		build_type_change(1);
	} else {
		jQuery('.dol').slideUp('fast');
	}
}

function get_selected_value(list) {
        if (list != null) {
                var i = list.selectedIndex;
                if (i<0) { return };
                return list.options[i].value;
        }
        return null;
}

function get_selected_value_by_id(div) {
        return get_selected_value(document.getElementById(div));
}

function get_checked_value(elems) {
        var found;
        jQuery(elems).each(function(i,elem) {
                if (jQuery(this).attr("checked")) {
                        found = jQuery(this).val();
                        return false; // this return is inside inner function
                }               
        });
        return found;
}

function set_selected(list,val) {
        if (list != null) {
                for (var i = 0; i<list.length; i++) {
                        if (list[i].value == val) {
                                list.selectedIndex = i;
                                break;
                        }
                }
        }
}

function set_selected_by_id(div,val) {
        set_selected(document.getElementById(div),val);
}

function add_multiselect(div) {
	var ser = serialize_multiselect(div);
	if (ser.length > 0) {
		return '&' + ser;
	}
	return '';
}

function serialize_multiselect(div) {
	var ser = '';
	var name = jQuery('#'+div+' a.multiSelect').attr('id');
	jQuery('#'+div+' label.checked input').each(function(i,e) {
		ser += name+'%5B%5D='+jQuery(e).val()+'&';   // %5B%5D are url-encoded [] - for PHP to recognize arrays
	});
	ser = ser.substring(0,ser.length-1);
	return ser;
}






