function address_init( form_id, area_id, defaults )
{
	$(function(){
		var $form = $('#' + form_id);
		var $container = $form.find('div.kladr_area_block');
		var $postal_code = $form.find('input[name="postindex"]');
		var address_wait = '<img id="kladr_address_wait" src="/img/ajax_loading.gif" alt="Загрузка…" \/>';
		
		var postal_code_current = $postal_code.val();
		
		$postal_code.keyup( function() {
			var postal_code = $(this).val();
			if ( ( postal_code.length == 6 ) && ( parseInt( postal_code ) == postal_code ) && ( postal_code != postal_code_current ) ) {
				build_path( {'postal_code':postal_code} ); postal_code_current = postal_code;
			}
		});
		
		function build_path( param ) {
			$postal_code.attr('readonly', '1');
			$container.find('div.kladr_element').remove();
			$container.append(address_wait);
			window.setTimeout(function() {
				$.get('/personal/kladr/get_area_path', param, function(data){
					var parent_area_id = 0;
					for ( var area_index in data ) {
						append_select( parent_area_id, data[area_index] );
						parent_area_id = data[area_index];
					}
					append_select( parent_area_id, 0 );
					$postal_code.attr('readonly', '');
				}, 'json');
			}, 0);
		}
		
		function build_init_path( param, defaults ) {
			$postal_code.attr('readonly', '1');
			$container.find('div.kladr_element').remove();
			$container.append(address_wait);
			window.setTimeout(function() {
				$.get('/personal/kladr/get_area_path', param, function(data){
					var parent_area_id = 0;
					for ( var area_index in data ) {
						append_select( parent_area_id, data[area_index] );
						parent_area_id = data[area_index];
					}
					append_select( parent_area_id, 0 );
					$postal_code.attr('readonly', '');
					
					jQuery.each( defaults, function (id, value) {
						$('#'+id).val(value);
					} );
					
				}, 'json');
			}, 0);
		}

		function append_select( area_id, curr_id ){
			$container.find('div.kladr_element:last').append(address_wait);
			$.ajax( { type: 'get', url: '/personal/kladr/get_child_areas', dataType: 'json',
				data: { 'area_id':area_id }, async: false, success: function(data){
					$('#kladr_address_wait').remove();
					if ( data.areas.length )
					{
						var select = '<div class="kladr_element"><select class="kladr_area" name="kladr_area[]" parent_has_streets="'+data.has_streets+'"><option value="">нет</option>';
						var areas = data.areas;
						for ( var area_index in areas )
						{
							select += '<option value="' + areas[area_index].id + '"' +
								( areas[area_index].id == curr_id ? ' selected="selected"' : '' ) + '>' +
									areas[area_index].title + '</option>';
						}
						select += '</select></div>';
						$container.append( select );
						$container.find('select.kladr_area:last').change( function(data) {
							$('#kladr_street_name').flushCache().val('');
							$('#kladr_code').val('');
							
							$(this).parent().nextAll('div.kladr_element').remove();
							var curr_id = $(this).find('option').eq( $(this).context.selectedIndex ).val();
							
							if ( curr_id )
							{
								append_select( curr_id, '' );
							}
							else
							{
								if ( $(this).attr('parent_has_streets') );
									$('#kladr_street_block').show();
							}
						});
					}
					
					$('#kladr_street_name').flushCache().val('');
					$('#kladr_code').val('');
					if (data.has_streets) {  $('#kladr_street_block').show(); } else { $('#kladr_street_block').hide(); }
				}
			});
		}

		$('#kladr_street_name').autocomplete( '/personal/kladr/get_area_streets', {
			extraParams: {
				area_id: function() { return $('select.kladr_area[value!=""]:last').val(); }
			},
			formatItem: function(row, i, n, value) { return row[0]; },
			formatMatch: function(row, i, n, value) { return row[0]; },
			formatResult: function(row, i, n, value) { return row[0]; }
		} ).result( function(event, row, value) {
			$('#kladr_code').val(row[2]);
		});

		build_init_path( {'area_id':area_id}, defaults );
	});
}