var CategoryNavigation = new Class( {
	Implements: [Options],
	
	options: {
		'openerOpenImage': 'plus.gif',
		'openerCloseImage': 'minus.gif',
		'openerSelector': '.category-opener',
		'getIDFromOpener': function( id ) {
			return id.replace( 'categoryOpener', '' );
		},
		'checkboxSelector': '.category-checkbox',
		'getIDFromCheckbox': function( id ) {
			return id.replace( 'map-category', '' );
		},
		'getSubcategoryBlock': function( id ) {
			return $( 'subcategories' + id );
		},
		'subcategorycheckboxSelector': '.subcategory-checkbox',
		'hideCSSClass': 'hide',
		'showAllElementID': 'showAllSubcategories',
		'hideAllElementID': 'hideAllSubcategories'
	},

	initialize: function( options ) {
		this.setOptions( options );
		
		this.openers = $$( this.options.openerSelector );
		this.installOpeners();
		
		this.checkboxes = $$( this.options.checkboxSelector );
		this.installCheckboxes();
	},
	
	installOpeners: function() {
		allSlides = [];
		this.openers.each( function( opener, index ) {
			var categoryID       = this.options.getIDFromOpener( opener.get( 'id' ) );
			var subcategoryBlock = this.options.getSubcategoryBlock( categoryID );
			var slide = new Fx.Slide( subcategoryBlock );
			opener.addEvent( 'click', function() {
				if( slide.open ) {
					opener.set( 'src', this.options.openerOpenImage )
				} else {
					opener.set( 'src', this.options.openerCloseImage )
				}
				
				slide.toggle();
			}.bind( this ) );		
			if( subcategoryBlock.hasClass( 'hide' ) ) {
				slide.hide();
				subcategoryBlock.removeClass( 'hide' );
			}
			allSlides[index] = slide;
		}.bind( this ) );
		
		var el = $( this.options.showAllElementID );
		el.addEvent( 'click', function( e ) {
			allSlides.each( function( slide, index ) {
				slide.show();
				this.openers[ index ].set( 'src', this.options.openerCloseImage );
			}.bind( this ) );
		}.bind( this ) );
		var el = $( this.options.hideAllElementID );
		el.addEvent( 'click', function( e ) {
			allSlides.each( function( slide, index ) {
				slide.hide();
				this.openers[ index ].set( 'src', this.options.openerOpenImage );
			}.bind( this ) );
		}.bind( this ) );
	},

	installCheckboxes: function() {
		this.checkboxes.each( function( checkbox ) {
			checkbox.addEvent( 'click', function() {
				var categoryID = this.options.getIDFromCheckbox( checkbox.get( 'id' ) );
				var subcategoryBlock = this.options.getSubcategoryBlock( categoryID );
				var childCheckboxes  = subcategoryBlock.getChildren( this.options.subcategorycheckboxSelector );
				childCheckboxes.each( function( childcheckbox ) {
					childcheckbox.set( 'checked', checkbox.checked );
				} );
			}.bind( this ) );
		}.bind( this ) );
	}
} );
