var FormBlocker = {
    form: null,
    date_day_select: null,
    date_month_select: null,
    date_year_select: null,
    tariff_ranges: null,
    url: '/search/',
    
    init: function(form) {
        FormBlocker.form = $(form);
        
        $$('#'+FormBlocker.form.identify()+' select').each(function(el) {
        	FormBlocker.reserveSelectElement(el);
        });
        
        FormBlocker.blockSelectRangeValues('price-min-hour', 'price-max-hour');
        FormBlocker.blockSelectRangeValues('price-min-order', 'price-max-order');
        Event.observe('price-min-hour', 'change', function(){FormBlocker.blockSelectRangeValues('price-min-hour', 'price-max-hour');});
        Event.observe('price-max-hour', 'change', function(){FormBlocker.blockSelectRangeValues('price-min-hour', 'price-max-hour');});

        Event.observe('price-min-order', 'change', function(){FormBlocker.blockSelectRangeValues('price-min-order', 'price-max-order');});
        Event.observe('price-max-order', 'change', function(){FormBlocker.blockSelectRangeValues('price-min-order', 'price-max-order');});
        
        //Event.observe('seats-min', 'change', function(){FormBlocker.blockSelectRangeValues('seats-min', 'seats-max');});
        //Event.observe('seats-max', 'change', function(){FormBlocker.blockSelectRangeValues('seats-min', 'seats-max');});

        //Event.observe('car-year-min', 'change', function(){FormBlocker.blockSelectRangeValues('car-year-min', 'car-year-max');});
        //Event.observe('car-year-max', 'change', function(){FormBlocker.blockSelectRangeValues('car-year-min', 'car-year-max');});
       
        $$('#'+FormBlocker.form.identify()+' .form-reset').each( function(el) {
	        Event.observe(el, 'click', FormBlocker.reset);
        });
        
        FormBlocker.date_day_select   = FormBlocker.form.down('select[name=day_order]');
        FormBlocker.date_month_select = FormBlocker.form.down('select[name=month_order]');
        FormBlocker.date_year_select  = FormBlocker.form.down('select[name=year_order]');
        
        Event.observe(FormBlocker.date_day_select, 'change', function(){FormBlocker.blockDates('year');});
        Event.observe(FormBlocker.date_month_select, 'change', function(){FormBlocker.blockDates('year');});
        Event.observe(FormBlocker.date_year_select, 'change', function(){FormBlocker.blockDates('year');});
        
        Event.observe(FormBlocker.form, 'submit', FormBlocker.eventSubmit);
        
        $$('.checkable').each( function(el){
        	Event.observe(el, 'change', FormBlocker.blockUnavailableFields);
        });
        
        FormBlocker.blockUnavailableFields();
    },
    
    eventSubmit: function(e) {
        // check if date is set (only when price is entered)
        var current_price_type = FormBlocker.detectCurrentPriceType();
        if (   ($F('price-min-'+current_price_type)!='' || $F('price-min-'+current_price_type)!='')
        	&& ($F(FormBlocker.date_day_select)=='' || $F(FormBlocker.date_month_select)=='' || $F(FormBlocker.date_year_select)=='')) {
        	alert('Выберите, пожалуйста, день заказа');
        	Event.stop(e);
        	return false;
        }
        else {
        	return true;
        }
    },


    blockUnavailableFields: function() {
        // get data from form
        var br = $F('brand-selector');
        var url = FormBlocker.url + '?action=get_possible_values' + 
            '&car_type=' + $F('car-type-selector') +
            '&brand=' + br +
            (br!='' ? ('&model='+$F('models-'+br)) : '') +
            '&seats_min=' + $F('seats-min') +
            '&seats_max=' + $F('seats-max') +
            '&cabin=' + $F('cabin') +
            '&car_year_min=' + $F('car-year-min') +
            '&car_year_max=' + $F('car-year-max') +
            '&colors[0]=' + $F('color-0') +
            '&colors[1]=' + $F('color-1');
        
        // request possible values for fields
        new Ajax.Request(url, {
        	method: 'get',
        	onComplete: function(transport) {
        		eval('var element_data='+ transport.responseText + ';');
        		FormBlocker.updateFields(element_data);
        	}
        });
    },
    
    updateFields: function(element_data) {
    	//var id_to_skip = $(element_to_skip).identify();
        for (id in element_data) {
            if (id=='models') {
            	$$('.model-selector select').each( function(el) {
            		FormBlocker.setUnblockedOptions(el, element_data[id]);
            	});
            }
            else {
        		FormBlocker.setUnblockedOptions($(id), element_data[id]);
        	}
        }
    },
    
    detectCurrentPriceType: function() {
        if (!$('prices-hour').hasClassName('hidden')) {
            return 'hour';
        }
        else if (!$('prices-order').hasClassName('hidden')) {
            return 'order';
        }
        else if (!$('prices-day').hasClassName('hidden')) {
            return 'day';
        }
        else {
            return 'hour';
        }
    },
    
    blockSelectRangeValues: function(min_field, max_field) {
        min_field = $(min_field);
        max_field = $(max_field);
        
        var min_value = $F(min_field);
        var max_value = $F(max_field);
        
        if (min_value.indexOf('min')!==-1) {
            $$('#' + max_field.identify() + ' option').each( function(el) {
	            if (el.value!='') {
	                FormBlocker.blockOption(el);
	            }
            });
        }
        else if (max_value.indexOf('min')!==-1) {
            $$('#' + min_field.identify() + ' option').each( function(el) {
	            if (el.value!='') {
	                FormBlocker.blockOption(el);
	            }
            });
        }
        else {
	        min_value = parseInt(min_value);
	        max_value = parseInt(max_value);
	        
	        FormBlocker.restoreSelectElement(max_field);
            FormBlocker.restoreSelectElement(min_field);
	        if (min_value!=='') {
	            $$('#' + max_field.identify() + ' option').each( function(el) {
	                if (el.value!=='' && parseInt(el.value)<min_value) {
	                	FormBlocker.blockOption(el);
	                }
	                //else {
	                //	FormBlocker.unblockOption(el);
	                //}
	            });
	        }
	        
	        if (max_value!=='') {
	            $$('#' + min_field.identify() + ' option').each( function(el) {
	                if (el.value!=='' && parseInt(el.value)>max_value) {
	                	FormBlocker.blockOption(el);
	                }
	                //else {
	                //	FormBlocker.unblockOption(el);
	                //}
	            });
	        }
        }
    },
    
    blockDates: function(field) {
        //FormBlocker.date_day_select
        //FormBlocker.date_month_select
        //FormBlocker.date_year_select
        var options = null;
        var block = null;
        if (field=='year') {
            // remove years
            FormBlocker.restoreSelectElement(FormBlocker.date_year_select);
            options = FormBlocker.date_year_select.childElements();
            for (i=0; i<options.length; i++) {
                if (options[i].value!='') {
	                block = true;
                    // check each range
                    for (j=0; j<FormBlocker.tariff_ranges.length; j++) {
                        if (options[i].value>=FormBlocker.tariff_ranges[j].start.getFullYear() && options[i].value<=FormBlocker.tariff_ranges[j].end.getFullYear()) {
                            block = false;
                        }
                    }
                    
                    if (block && FormBlocker.date_year_select.selectedIndex==i) {
                        FormBlocker.date_year_select.selectedIndex = 0;
                        FormBlocker.blockOption(options[i]);
                    }
                    else if (block) {
                        FormBlocker.blockOption(options[i]);
                    }
                    //else {
                    //	FormBlocker.unblockOption(options[i]);
                    //}
                }
            }
            
            // remove months
            FormBlocker.restoreSelectElement(FormBlocker.date_month_select);
            options = FormBlocker.date_month_select.childElements();
            var current_year = $F(FormBlocker.date_year_select);
            if (current_year!='') {
	            for (i=0; i<options.length; i++) {
	                if (options[i].value!='') {
		                block = true;
	                    // check each range
	                    var test_date = FormBlocker.createDateObject(current_year, options[i].value-1, 1);
	                    for (j=0; j<FormBlocker.tariff_ranges.length; j++) {
	                        var compare_start = FormBlocker.createDateObject(FormBlocker.tariff_ranges[j].start.getFullYear(), FormBlocker.tariff_ranges[j].start.getMonth(), 1);
	                        var compare_end = FormBlocker.createDateObject(FormBlocker.tariff_ranges[j].end.getFullYear(), FormBlocker.tariff_ranges[j].end.getMonth(), 1);

	                        if (test_date>=compare_start && test_date<=compare_end) {
	                            block = false;
	                        }
	                    }
	                    
	                    if (block && FormBlocker.date_month_select.selectedIndex==i) {
	                        FormBlocker.date_month_select.selectedIndex = 0;
	                        FormBlocker.blockOption(options[i]);
	                    }
	                    else if (block) {
	                        FormBlocker.blockOption(options[i]);
	                    }
	                    //else {
	                    //	FormBlocker.unblockOption(options[i]);
	                    //}
	                }
                }
            }
            
            // remove days for selected month
            FormBlocker.restoreSelectElement(FormBlocker.date_day_select);
            options = FormBlocker.date_day_select.childElements();
            var current_month = $F(FormBlocker.date_month_select);
            if (current_year!='' && current_month!='') {
	            for (i=0; i<options.length; i++) {
	                if (options[i].value!='') {
		                block = true;
	                    // check each range
	                    var test_date = FormBlocker.createDateObject(current_year, current_month-1, options[i].value);
	                    if (test_date.getDate()==options[i].value) {
		                    for (j=0; j<FormBlocker.tariff_ranges.length; j++) {
		                        var compare_start = FormBlocker.createDateObject(FormBlocker.tariff_ranges[j].start.getFullYear(), FormBlocker.tariff_ranges[j].start.getMonth(), FormBlocker.tariff_ranges[j].start.getDate());
		                        var compare_end = FormBlocker.createDateObject(FormBlocker.tariff_ranges[j].end.getFullYear(), FormBlocker.tariff_ranges[j].end.getMonth(), FormBlocker.tariff_ranges[j].end.getDate());

		                        if (test_date>=compare_start && test_date<=compare_end) {
		                            block = false;
		                        }
	                        else {
	                            //alert(test_date + ' vs ' + compare_start + ' and ' + compare_end);
	                            //return;
	                        }
		                    }
	                    }
		                    
	                    if (block && FormBlocker.date_day_select.selectedIndex==i) {
	                        FormBlocker.date_day_select.selectedIndex = 0;
	                        FormBlocker.blockOption(options[i]);
	                    }
	                    else if (block) {
	                        FormBlocker.blockOption(options[i]);
	                    }
	                    //else {
	                    //	FormBlocker.unblockOption(options[i]);
	                    //}
	                }
                }
            }
        }
    },
    
    setUnblockedOptions: function(select_el, available_options) {
        FormBlocker.restoreSelectElement(select_el);
        
        var options = select_el.childElements();
        for (i=0; i<options.length; i++) {
            if (options[i].value!='') {
	            blocked = true;
	            for (j=0; j<available_options.length; j++) {
	                if (options[i].value==available_options[j]) {
	                    blocked = false;
	                }
	            }
	            
	            if (blocked) {
	            	FormBlocker.blockOption(options[i]);
	            }
            }
        }
    },
    
    reserveSelectElement: function(select_element) {
    	if (typeof FormBlocker.reservedOptions == 'undefined') {
    		FormBlocker.reservedOptions = new Array();
    	}
    	FormBlocker.reservedOptions[select_element.identify()] = select_element.innerHTML;
    },
    
    restoreSelectElement: function(select_element) {
    	select_element = $(select_element);
    	var sid = select_element.identify();
    	var selected_option_value = select_element.options[select_element.selectedIndex].value;
    	if (typeof FormBlocker.reservedOptions[sid] != 'undefined') {
	    	select_element.update(FormBlocker.reservedOptions[sid]);
	    	select_element.options[0].selected=true;
	    	//select_element.selectedIndex = 0;
	    	for (i=0; i<select_element.options.length; i++) {
	    		if (select_element.options[i].value == selected_option_value) {
	    			select_element.options[i].selected = true;
	    		} 
	    		else {
	    			select_element.options[i].selected = false;
	    		}
	    	}
    	}
    },
    
    blockOption: function(el) {
        var ih = el.innerHTML;
        var sel_id = $(el.parentNode).identify();
    	$(el).remove();
    },
    
    /*
    unblockOption: function(el) {
        el = $(el);
        if (el.hasClassName('blocked')) {
            el.removeClassName('blocked');
        }
        el.show();
        el.disabled = false;
    },
    */
    
    unblockAll: function() {
        $$('#'+FormBlocker.form.identify()+' select').each(function(el) {
            //FormBlocker.unblockOption(el);
            FormBlocker.restoreSelectElement(el);
        });
    },
    
    reset: function() {
        FormBlocker.unblockAll();
        $$('#'+FormBlocker.form.identify()+' select').each(function(el) {
            if (el.name=='year_order') {
                el.selectedIndex=1;
            }
            else {
                el.selectedIndex=0;
            }
        });
        $$('#'+FormBlocker.form.identify()+' input[type=text]').each(function(el) {
            if (el.name=='duration') {
            	el.value='6';
            }
            else {
            	el.value='';
            }
        });
        FormBlocker.blockDates('year');
        hide_model_selectors();
    },
    
    // js representation of month! 0-11
    createDateObject: function(year, month, day) {
    	var date_obj = new Date();
    	date_obj.setFullYear(year, month, day);
		date_obj.setHours(0);
		date_obj.setMinutes(0);
		date_obj.setSeconds(0);
		date_obj.setMilliseconds(0);
		return date_obj;
    }
};


var FilterBlocker = {
    form: null,
    url: '/search/',
    
    brand_id: '',
    model_id: '',
    car_type_id: '',
    
    
    init: function(form) {
        FilterBlocker.form = $(form);
        
        $$('#'+FilterBlocker.form.identify()+' select').each(function(el) {
        	FilterBlocker.reserveSelectElement(el);
        	if (el.hasClassName('checkable')) {
	        	Event.observe(el, 'change', FilterBlocker.blockUnavailableFields);
        	}
        });
        
       
        $$('#'+FilterBlocker.form.identify()+' .filter-reset').each( function(el) {
	        Event.observe(el, 'click', FilterBlocker.reset);
        });
        
        FilterBlocker.blockUnavailableFields();
    },

    blockUnavailableFields: function() {
        // get data from form
        var br = $F('brand-selector');
        var url = FilterBlocker.url + '?action=get_possible_filter_values' + 
            '&car_type=' + FilterBlocker.car_type_id +
            '&brand=' + FilterBlocker.brand_id +
            '&model=' + FilterBlocker.model_id +
            '&seats=' + $F('filter-seats') +
            '&color=' + $F('filter-color') +
            '&karaoke=' + $F('filter-karaoke');
        
        // request possible values for fields
        new Ajax.Request(url, {
        	method: 'get',
        	onComplete: function(transport) {
        		eval('var element_data='+ transport.responseText + ';');
        		FilterBlocker.updateFields(element_data);
        	}
        });
    },
    
    updateFields: function(element_data) {
    	//var id_to_skip = $(element_to_skip).identify();
        for (id in element_data) {
            FilterBlocker.setUnblockedOptions($(id), element_data[id]);
        }
    },
    
    
    setUnblockedOptions: function(select_el, available_options) {
        FilterBlocker.restoreSelectElement(select_el);
        
        var options = select_el.childElements();
        for (i=0; i<options.length; i++) {
            if (options[i].value!='') {
	            blocked = true;
	            for (j=0; j<available_options.length; j++) {
	                if (options[i].value==available_options[j]) {
	                    blocked = false;
	                }
	            }
	            
	            if (blocked) {
	            	FilterBlocker.blockOption(options[i]);
	            }
            }
        }
    },
    
    reserveSelectElement: function(select_element) {
    	if (typeof FilterBlocker.reservedOptions == 'undefined') {
    		FilterBlocker.reservedOptions = new Array();
    	}
    	FilterBlocker.reservedOptions[select_element.identify()] = select_element.innerHTML;
    },
    
    restoreSelectElement: function(select_element) {
    	select_element = $(select_element);
    	var sid = select_element.identify();
    	var selected_option_value = select_element.options[select_element.selectedIndex].value;
    	if (typeof FilterBlocker.reservedOptions[sid] != 'undefined') {
	    	select_element.update(FilterBlocker.reservedOptions[sid]);
	    	select_element.options[0].selected=true;
	    	//select_element.selectedIndex = 0;
	    	for (i=0; i<select_element.options.length; i++) {
	    		if (select_element.options[i].value == selected_option_value) {
	    			select_element.options[i].selected = true;
	    		} 
	    		else {
	    			select_element.options[i].selected = false;
	    		}
	    	}
    	}
    },
    
    blockOption: function(el) {
        var ih = el.innerHTML;
        var sel_id = $(el.parentNode).identify();
    	$(el).remove();
    },
    
    unblockAll: function() {
        $$('#'+FilterBlocker.form.identify()+' select').each(function(el) {
            FilterBlocker.restoreSelectElement(el);
        });
    },
    
    reset: function() {
        FilterBlocker.unblockAll();
        $$('#'+FilterBlocker.form.identify()+' select').each(function(el) {
            el.selectedIndex=0;
        });
        $$('#'+FilterBlocker.form.identify()+' input[type=text]').each(function(el) {
           	el.value='';
        });
        hide_model_selectors();
    }
    
};


// Brands and models
function set_models_block() {
    var active_brand = $F('brand-selector');
    hide_model_selectors();
    if (active_brand!='') {
       show_model_selector(active_brand);
    }
}
function hide_model_selectors() {
    $$('.model-selector select').each(function(el) {
    	el.disabled = true;
    });
    $$('.model-selector').each(function(el) {
    	el.addClassName('hidden');
    });
}
function show_model_selector(brand_id) {
    $$('#models-block-'+brand_id+' select').each(function(el) {
    	el.disabled = false;
    });
    $$('#models-block-'+brand_id).each(function(el) {
    	el.removeClassName('hidden');
    });
}

function toggle_event_selector()
{
    var active_type = $F('car-type-selector');
    if (typeof bus_types[active_type] != 'undefined') {
        $$('.buses-only').each(function (el) {el.removeClassName('hidden')});
        $$('.buses-only input[type=radio]').each(function (el) {el.disabled=false});
    }
    else {
        $$('.buses-only').each(function (el) {el.addClassName('hidden')});
        $$('.buses-only input[type=radio]').each(function (el) {el.disabled=true});
    }
}

// Price types
function set_price_by_hour() {
	$('prices-hour').removeClassName('hidden');
	$('prices-day').hide();
	$('prices-order').hide();
	$$('#prices-day input, #prices-day select, #prices-order input, #prices-order select').each(function(el){el.disabled=true});
	$('prices-hour').show();
	$$('#prices-hour input, #prices-hour select').each(function(el){el.disabled=false});
	
	$$('.price-hour').each(function(el){el.show()});
	$$('.price-day, .price-order').each(function(el){el.hide()});
	
	$$('#toggle-price-hour').each(function(el) {
		el.removeClassName('off');
		el.addClassName('on');
	});
	$$('#toggle-price-day, #toggle-price-order').each(function(el) {
		el.removeClassName('on');
		el.addClassName('off');
	});
}
function set_price_by_day() {
	$('prices-day').removeClassName('hidden');
	$('prices-day').show();
	$$('#prices-day input, #prices-day select').each(function(el){el.disabled=false});
	$('prices-hour').hide();
	$('prices-order').hide();
	$$('#prices-hour input, #prices-hour select, #prices-order input, #prices-order select').each(function(el){el.disabled=true});
	
	$$('.price-day').each(function(el){el.show()});
	$$('.price-hour, .price-order').each(function(el){el.hide()});
	
	$$('#toggle-price-day').each(function(el) {
		el.removeClassName('off');
		el.addClassName('on');
	});
	$$('#toggle-price-hour, #toggle-price-order').each(function(el) {
		el.removeClassName('on');
		el.addClassName('off');
	});
}
function set_price_by_order() {
	$('prices-order').removeClassName('hidden');
	$('prices-order').show();
	$$('#prices-order input, #prices-order select').each(function(el){el.disabled=false});
	$('prices-hour').hide();
	$('prices-day').hide();
	$$('#prices-hour input, #prices-hour select, #prices-day input, #prices-day select').each(function(el){el.disabled=true});
	
	$$('.price-order').each(function(el){el.show()});
	$$('.price-hour, .price-day').each(function(el){el.hide()});

	$$('#toggle-price-order').each(function(el) {
		el.removeClassName('off');
		el.addClassName('on');
	});
	$$('#toggle-price-day, #toggle-price-hour').each(function(el) {
		el.removeClassName('on');
		el.addClassName('off');
	});
}


// Show / Hide search form
var FormHider = {
	default_full_height: '175px',
	default_collapsed_height: '28px',
	
	full_hider_height: null,
	collapsed_hider_height: null,
	
	hider: null,
	
	init: function() {
	    FormHider.hider = $('form-hider');
	    if (!$('hidden-form-activator').hasClassName('enabled')) {
	        FormHider.storeFullHeight();
	        FormHider.collapsed_hider_height = FormHider.default_collapsed_height;
	    }
	    else {
	    	FormHider.full_hider_height = FormHider.default_full_height;
	        FormHider.collapsed_hider_height = FormHider.hider.getHeight()+'px';
	    }
	    
	    Event.observe($('hidden-form-activator'), 'click', FormHider.showFull);
	    $$('form.search select').each(function(el) {
		    Event.observe(el, 'click', FormHider.showFull);
	    });
	    Event.observe($('form-show-btn'), 'click', FormHider.showFull);
	    Event.observe($('form-hide-btn'), 'click', FormHider.collapse);
	},
	
	storeFullHeight: function() {
		FormHider.full_hider_height = FormHider.hider.getHeight()+'px';
	},
	
	showFull: function() {
        if (!$('hidden-form-activator').hasClassName('enabled')) {
            return false;
        }
        
        // form
        $('hidden-form-activator').removeClassName('enabled');
        FormHider.hider.setStyle({height: FormHider.collapsed_hider_height});
        new Effect.Morph(FormHider.hider, {
        	style: 'height: '+FormHider.full_hider_height,
        	afterFinish: FormHider._showFullFinish,
        	duration: 0.5
        });
        
        // buttons
        Effect.Shrink($('form-show-btn'), {direction: 'top-left', duration: 0.2});
		$('form-hide-btn').hide();
		$('form-hide-btn').removeClassName('hidden');
		Effect.Grow($('form-hide-btn'), {direction: 'top-left'});
	},
	
	_showFullFinish: function() {
		FormHider.hider.removeClassName('closed'); 
		FormHider.hider.setStyle({height: '', overflow: ''});
	},
	
	collapse: function() {
		// form
		FormHider.storeFullHeight();
		FormHider.hider.setStyle({height: FormHider.full_hider_height, overflow: 'hidden'});

		new Effect.Morph(FormHider.hider, {
			style: 'height: '+FormHider.collapsed_hider_height,
			afterFinish: FormHider._collapseFinish,
			duration: 0.5
		});
		$('hidden-form-activator').addClassName('enabled');
			        
		// buttons
		Effect.Shrink($('form-hide-btn'), {direction: 'top-left', duration: 0.2});
		Effect.Grow($('form-show-btn'), {direction: 'top-left'});
	},
	
	_collapseFinish: function() {
		FormHider.hider.addClassName('closed'); 
		FormHider.hider.setStyle({height: '', overflow: ''});
	},
	
	toggleControls: function() {
		if ($('form-hide-btn').visible() && !$('form-hide-btn').hasClassName('hidden') ) {
			$('form-hide-btn').hide();
			$('form-show-btn').removeClassName('hidden');
			$('form-show-btn').show();
		}
		else {
			$('form-show-btn').hide();
			$('form-hide-btn').removeClassName('hidden');
			$('form-hide-btn').show();
		}
	}
};