(function($){

    /* Очищаем select */
    $.fn.clearSelect = function() {
        return this.each(function(){
            /* Проверяем является ли элемент select`ом */
            if(this.tagName=='SELECT') {
				
                this.options.length = 0;
				//
                /* Блокируем на время заполнения */
                $(this).attr('disabled','disabled');
            }
        });
    }

    /* Удаляем старшие элементы */
    $.fn.clearField = function(selector) {
			
        /**
         * Ищем все элементы следующие за вызывавшим
         * и удовлеторяющие переданному селектору
         */
        this.nextAll(selector).remove();
        return this;
    }

    /* Заполняем select переданными данными */
    $.fn.fillSelect = function(dataArray) {
        return this.clearSelect().each(function(){
            /* Проверяем является ли элемент select`ом */
            if(this.tagName=='SELECT') {
                var currentSelect = this;
					//alert(this.name);
				if(this.name=='category_category_0') select_first=select_second;
				if(this.name=='category_NaN') select_first=select_third;
                /* Добавляем пунтк меню "Выбрать..." */
                var start = new Option(select_first, '-1');

                /* Устанавливаем этот option первым в списке */
                if($.support.cssFloat) {					
						//alert(currentSelect.name); //name select'a - ex. category_0;
                    currentSelect.add(start, null);
					
                } else {
                    currentSelect.add(start);
                }
                $.each(dataArray,function(index,data){
                    /* Если определено 'name' */
                    if(data.name) {
						//alert(data.name);
                        /* Создаем новый option */
                        var option = new Option(data.name,data.id);
                        /* Добавляем новый option к select`у */
                        if($.support.cssFloat) {
                            currentSelect.add(option, null);
                        } else {
                            currentSelect.add(option);
                        }
                    }

                });
                /* Выделяем первый элемент списка */

                
				if(selected_category!='-1'){
					search.category_0.value=selected_category; //чтобы отображалась категория текущего раздела.
				}
				else{
					$(this).removeAttr('disabled').find('option:first').attr('selected', 'selected');
				}
            }
        });
    }
})(jQuery);

/* Функция отсылает ajax-запрос */
function getCategory(pcategory, level) {
	
    $.ajax({
        url: 'ajax/list.php',
        type: 'POST',
        data: 'pcategory='+ pcategory +'&level='+ level,
        dataType: 'JSON',
        timeout: 5000,
        beforeSend: function(){
            // Блокируем все необходимы select`ы
            $('select[name^=category_]').attr('disabled', 'disabled');
        },
        complete: function(){            // Снимаем блокировку
            $('select[name^=category_]').removeAttr('disabled');
        },
        success: function(response){
            var data = eval('('+ response +')');
            // Если количество категорий в ответе 0 либо не определено
            if(data.count === 'undefined' || data.count == 0) {
                // просто удаляет старшие уровни каскада
                $('select[name=category_'+ (data.level - 1) +']')
                    .clearField('select[name^=category]')
                    .clearField('div');
                return false;
            }
            if( $('select[name=category_'+ data.level +']').length ) {
                // Если select этого уровня уже существует
                // мы должны удалить все старшие select`ы,
                // очистить старые данные и заполнить новым контентом
                $('select[name=category_'+ data.level +']')
                    .clearField('select[name^=category]')
                    .clearField('span')
                    .fillSelect(data.item);
            } else {
                // Если select этого уровня не существует,
                // мы должны его создать и заполнить данными
                $('#categories select:last').after('<div><select name="category_'+ data.level +'"" style="width: 150px; margin-bottom: 5px;" ></select></div>');
                $('select[name=category_'+ data.level +']').fillSelect(data.item);
            }

            /* Сбрасываем старый обработчик */
            $('select[name=category_'+ data.level +']').unbind('change');
            /* Вешаем новый */
				var cur_category='category_'+ data.level;
				if(selected_category!='-1' && cur_category=='category_0'){
					return clickEvent($(this), cur_category);
				}
				else{
					$('select[name=category_'+ data.level +']').change(function(){return clickEvent($(this), cur_category);});
				}

            return false;
        },
        error: function(){
            // Сообщаем пользователю, что произошла ошибка
            $('#msg').append('<p>Some error with categories. Please, try later ;)</p>');
            return false;
        }
    });
	
}

/* Добавляем обработчик событий при изменении пункта списка */
function clickEvent(select, cur_category)
{ 
	if(selected_category!='-1' && cur_category=='category_0'){
		var id=selected_category;
		var level='category_0';
	}
	else if(selected_category!='-1' && cur_category=='category_1'){
		var id=selected_category;
		var level='category_1';
	}
	else{
		if (id == '-1') {
    		select.clearField('select[name^=category]').clearField('span');
    		return false;
		}
		var id = select.find('option:selected').attr('value'); 		
		var level = parseInt(select.attr('name').replace('category_', '')) + 1;
	}
	
    return getCategory(id, level);
}

$(document).ready(function(){
    /* Развешиваем обработчики */
  /* $('select[name^=category] option').live("click", function(){
        var select = $(this).parents('select');
        var level = parseInt(select.attr('name').replace('category_', '')) + 1;
        return getCategory(select.find('option:selected').attr('value'), level);
    })
*/
    /* Получаем список категорий */
    getCategory(0, 0);
	
});





