var BagFinder = {
	mode: null,
	
	cssPath: '.bagfinder .content .options li',
	cache: {},
	
	states: {laptop: 0, dslr: 0}, //0 = closed, 1 = opened
	
	laptopCacheOptions: {},
	dslrCacheOptions: {},
	
	init: function() {
		/* populate cache, so we don't have to retrieve all elements all the time */
		var x = $$(this.cssPath);
		if( x.length < 2 ) { return false; }
		
		x.each((function(e) {
			this.cache['li_' + e.className] = $(e);
		}).bind(this));
		
		/* now start observing */
		this.cache['li_laptop'].getElementsBySelector('a').first().observe('click', this.onLaptopMenuClick.bind(this));
		this.cache['li_dslr'].getElementsBySelector('a').first().observe('click', this.onDslrMenuClick.bind(this));

		this.cache['li_laptop'].getElementsBySelector('.cauta').first().observe('click', this.onLaptopSearch.bind(this));
		this.cache['li_laptop'].getElementsBySelector('.anuleaza').first().observe('click', this.onLaptopCancel.bind(this));

		this.cache['li_dslr'].getElementsBySelector('.cauta').first().observe('click', this.onDslrSearch.bind(this));
		this.cache['li_dslr'].getElementsBySelector('.anuleaza').first().observe('click', this.onDslrCancel.bind(this));
		
		/* add observers on all form items */
		$('bfl_model').observe('change', this.onChangeLaptopModel.bind(this));
		$('bfl_type').observe('change', this.onChangeLaptopBagType.bind(this));
		$('bfl_brand').observe('change', this.onChangeLaptopBrand.bind(this));
		$('bfl_price').observe('change', this.onChangeLaptopPrice.bind(this));
		$('bfl_dslr').observe('click', this.onChangeLaptopDslr.bind(this));
		
		
		$('bfd_model').observe('change', this.onChangeDslrModel.bind(this));
		$('bfd_type').observe('change', this.onChangeDslrBagType.bind(this));
		$('bfd_brand').observe('change', this.onChangeDslrBrand.bind(this));
		$('bfd_price').observe('change', this.onChangeDslrPrice.bind(this));
		$('bfd_diag').observe('change', this.onChangeDslrLaptopDiag.bind(this));

		this.laptopCacheOptions = {
			laptop_diags: this.extractOptionsFromDropdown('bfl_model'),
			bag_types   : this.extractOptionsFromDropdown('bfl_type'),
			brands      : this.extractOptionsFromDropdown('bfl_brand'),
			prices      : this.extractOptionsFromDropdown('bfl_price')
		};
		this.dslrCacheOptions = {
			laptop_diags: this.extractOptionsFromDropdown('bfd_diag'),
			dslr_fits   : this.extractOptionsFromDropdown('bfd_model'),
			bag_types   : this.extractOptionsFromDropdown('bfd_type'),
			brands      : this.extractOptionsFromDropdown('bfd_brand'),
			prices      : this.extractOptionsFromDropdown('bfd_price')
		};
		
		if( this.mode == 'laptop' ) {
			this.openMenu( 'laptop' );
			this.states.laptop = 1 - this.states.laptop;
		}
		else if( this.mode == 'dslr' ) {
			this.openMenu( 'dslr' );
			this.states.dslr = 1 - this.states.dslr;
		}
	},
	
	
	onLaptopMenuClick: function(event) {
		event.stop();
		if( !this.states.laptop ) {
			this.openMenu( 'laptop' );
		}
		else {
			this.closeMenu( 'laptop' );
		}
		this.states.laptop = 1 - this.states.laptop;
	},
	
	
	onDslrMenuClick: function(event) {
		event.stop();
		if( !this.states.dslr ) {
			this.openMenu( 'dslr' );
		}
		else {
			this.closeMenu( 'dslr' );
		}
		this.states.dslr = 1 - this.states.dslr;
	},
	
	
	openMenu: function(klass) {
		this.hideAll();
		this.showItem( klass );
		this.cache['li_' + klass].getElementsBySelector('.menu').first().setStyle({display: 'block'}); 
	},


	closeMenu: function(klass) {
		this.cache['li_' + klass].getElementsBySelector('.menu').first().setStyle({display: ''});
		this.showAll();
	},


	hideAll: function() {
		$H(this.cache).values().invoke('hide');
	},
	
	
	showAll: function() {
		$H(this.cache).values().invoke('show');
	},
	
	
	showItem: function(klass) {
		this.cache['li_' + klass].show();
	},
	
	onLaptopSearch: function(event) {
		event.stop();
		var params = {};
		
		var model = $F($('bfl_model'));
		if( model > 0 ) {
			params.model = model; 
		}
		
		var type = $F($('bfl_type'));
		if( type > 0 ) {
			params.type = type;
		}
		
		var brand = $F($('bfl_brand'));
		if( brand > 0 ) {
			params.brand = brand;
		}
		
		var price = $F($('bfl_price'));
		if( price > 0 ) {
			params.price = price;
		}
		
		if( $('bfl_dslr').checked ) {
			params.dslr = 1;
		}

		document.location = '/bag-chooser/find/laptop?' + $H(params).toQueryString();
		return;
	},

	onLaptopCancel: function(event) {
		event.stop();
		this.closeMenu('laptop');
		this.states.laptop = 1 - this.states.laptop;
		this.restoreDefaults('laptop');
	},

	onDslrSearch: function(event) {
		event.stop();
		var params = {};
		
		var model = $F($('bfd_model'));
		if( model > 0 ) {
			params.model = model; 
		}
		
		var type = $F($('bfd_type'));
		if( type > 0 ) {
			params.type = type;
		}
		
		var brand = $F($('bfd_brand'));
		if( brand > 0 ) {
			params.brand = brand;
		}
		
		var price = $F($('bfd_price'));
		if( price > 0 ) {
			params.price = price;
		}
		
		var diag = $F($('bfd_diag'));
		if( diag > 0 ) {
			params.laptop = diag;
		}

		document.location = '/bag-chooser/find/dslr?' + $H(params).toQueryString();
		return;
	},

	onDslrCancel: function(event) {
		event.stop();
		this.closeMenu('dslr');
		this.states.dslr = 1 - this.states.dslr;
		this.restoreDefaults('dslr');
	},
	
	restoreDefaults: function( mode ) {
		switch( mode ) {
			case 'laptop':
				this.resetDropdown('bfl_model',this.laptopCacheOptions.laptop_diags);
				this.resetDropdown('bfl_type', this.laptopCacheOptions.bag_types);
				this.resetDropdown('bfl_brand', this.laptopCacheOptions.brands);
				this.resetDropdown('bfl_price', this.laptopCacheOptions.prices);
				$('bfl_dslr').checked = false;
				$('bfl_dslr').disabled = false;
				break;
			
			case 'dslr':
				this.resetDropdown('bfd_model', this.dslrCacheOptions.dslr_fits);
				this.resetDropdown('bfd_diag', this.dslrCacheOptions.laptop_diags);
				this.resetDropdown('bfd_type', this.dslrCacheOptions.bag_types);
				this.resetDropdown('bfd_brand', this.dslrCacheOptions.brands);
				this.resetDropdown('bfd_price', this.dslrCacheOptions.prices);
				$('bfd_diag').disabled = false;
				break;
			
			default:
				return;
		}
	},
	
	optionChange: function(box, container) {
		var params = {fit: box};
		var request = false;

		switch( box ) {
			case 'laptop':		
				if( $('bfl_model').getValue() ) {
					params.diag_fit = $('bfl_model').getValue();
				}
				if( $('bfl_type').getValue() ) {
					params.bag_type = $('bfl_type').getValue();
				}
				if( $('bfl_brand').getValue() ) {
					params.brand = $('bfl_brand').getValue();
				}
				if( $('bfl_price').getValue() ) {
					params.price = $('bfl_price').getValue();
				}
				if( $('bfl_dslr').getValue() ) {
					params.dslr_also = 1;
				}
				break;

			case 'dslr':
				if( $('bfd_model').getValue() ) {
					params.dslr_fit = $('bfd_model').getValue();
				}
				if( $('bfd_type').getValue() ) {
					params.bag_type = $('bfd_type').getValue();
				}
				if( $('bfd_brand').getValue() ) {
					params.brand = $('bfd_brand').getValue();
				}
				if( $('bfd_price').getValue() ) {
					params.price = $('bfd_price').getValue();
				}
				if( $('bfd_diag').getValue() ) {
					params.diag_fit = $('bfd_diag').getValue();
				}
				break;			
		}
	
		var that = this;
		$$('.bagfinder .ajaxLoader').first().setStyle({display: 'block'});
		new Ajax.Request('/bag-chooser/load', {
				method: 'get',
				parameters: params,
				onComplete: that.processResponse.bind(this)
		});
	},
	
	processResponse: function(r) {
		$$('.bagfinder .ajaxLoader').first().setStyle({display: 'none'});
		if( !('object' == typeof r.responseJSON) || $H(r.responseJSON).size() < 1 ) { return; }
		var box = r.responseJSON.original_request;
		//r.responseJSON.fit
		if( 'laptop' == box ) {
			this.populateDropdownFromJson('bfl_type', r.responseJSON.tip_geanta);
			this.populateDropdownFromJson('bfl_brand', r.responseJSON.brand);
			this.populateDropdownFromJson('bfl_model', r.responseJSON.diagonal_fit);
			this.populateDropdownFromJson('bfl_price', r.responseJSON.price);
			
			var dslrOptions = r.responseJSON.potrivit_pt_dslr;
			if( ('function' == typeof dslrOptions.size && dslrOptions.size() > 0) || ('undefined' == typeof dslrOptions.size && $H(dslrOptions).size() > 0) ) {
				$('bfl_dslr').disabled = false;
			}
			else {
				$('bfl_dslr').disabled = 'disabled';
				$('bfl_dslr').checked = false;
			}
		}
		else {
			this.populateDropdownFromJson('bfd_type', r.responseJSON.tip_geanta);
			this.populateDropdownFromJson('bfd_brand', r.responseJSON.brand);
			this.populateDropdownFromJson('bfd_price', r.responseJSON.price);
			this.populateDropdownFromJson('bfd_model', r.responseJSON.potrivit_pt_dslr);
			
			var diags = r.responseJSON.diagonal_fit; 
			if( ('function' == typeof diags.size && diags.size() > 0) || ('undefined' == typeof diags.size && $H(diags).size() > 0) ) {
				$('bfd_diag').disabled = false;
				this.populateDropdownFromJson('bfd_diag', r.responseJSON.diagonal_fit);
			}
			else {
				$('bfd_diag').disabled = 'disabled';
			}
		}
	},
	
	onChangeLaptopModel: function() { this.optionChange('laptop', 'bfl_model'); },
	onChangeLaptopBagType: function() { this.optionChange('laptop', 'bfl_type'); },
	onChangeLaptopBrand: function() { this.optionChange('laptop', 'bfl_brand'); },
	onChangeLaptopPrice: function() { this.optionChange('laptop', 'bfl_price'); },
	onChangeLaptopDslr: function() { this.optionChange('laptop', 'bfl_dslr'); },
	
	onChangeDslrModel: function() { this.optionChange('dslr', 'bfd_model'); },
	onChangeDslrBagType: function() { this.optionChange('dslr', 'bfd_type'); },
	onChangeDslrBrand: function() { this.optionChange('dslr', 'bfd_brand'); },
	onChangeDslrPrice: function() { this.optionChange('dslr', 'bfd_price'); },
	onChangeDslrLaptopDiag: function() { this.optionChange('dslr', 'bfd_diag'); },
	
	populateDropdownFromJson: function( dd, json ) {
		var defaultValue = $(dd).options[0];
		$(dd).options.length = 0;
		$(dd).options[0] = defaultValue;
		var l = 1;
		if( $H(json).size() < 1 ) { return; }
		else if( $H(json).size() < 2 ) {
			$H(json).each(function(e) {
				$(dd).options[l] = new Option( e[1], e[0], true );
				l++;
			});
			$(dd).selectedIndex = 1;
		}
		else {
			$H(json).each(function(e) {
				$(dd).options[l] = new Option( e[1], e[0] );
				l++;
			});
			$(dd).selectedIndex = 0;
		}
	},
	
	extractOptionsFromDropdown: function( dd ) {
		if( $(dd).options.length < 1 ) { return []; }
		var ret = [], arr = $(dd).options, n = arr.length;
		for(var k = 0; k < n; k++) {
			ret.push(arr[k]);
		}
		
		return ret;
	},
	
	resetDropdown: function( dd, data ) {
		if( !data || data.length < 1 ) { return; }
		$(dd).options.length = 0;
		var index = 0;
		data.each(function(e) {
			$(dd).options[index++] = e; 
		});
		$(dd).selectedIndex = 0;
	}
	
};

document.observe('dom:loaded', function() { BagFinder.init(); });