GM = {};

GM.Checkbox = new Class({
	
	Implements: Events

	// Attribute
	,_inputElement: null
	,_checkboxDiv: null
	,_options: null
	
	/**
	 * @param Element inputElement	Checkbox Input Element aus dem eine grafische Checkbox erstellt werden soll
	 * @param object customOptions	
	 */
	,initialize: function( inputElement, customOptions ) {
		this._inputElement = inputElement;

		this._options = new Hash({
				'baseClass': 'gmCheckbox',	// Basis CSS Klasse für Checkbox DIV (muss Hintergrunbild der deaktivierten Checkbox enthalten)
				'classChecked': 'checked',	// CSS Klasse für aktivierte Checkbox 
				'extraCssClasses': ''		// Optionale zusätzliche CSS Klasse(n) 
		});
		if ( $defined( customOptions ) && $type( customOptions ) == 'object' ) {
			customOptions = new Hash( customOptions );
			this._options = customOptions.combine( this._options );
		}
		
		var checkboxStatus = this.getIsChecked()? this._options.classChecked:'';
		
		this._checkboxDiv = new Element( 'div', {
			'class': this._options.baseClass + ' ' + checkboxStatus + ' ' + this._options.extraCssClasses,
			'events': {
		        'click': this._clickEvent.bindWithEvent( this )
		    }
		});
		
		this._checkboxDiv.inject( inputElement, 'after' );
		inputElement.inject( this._checkboxDiv );
	}

	,_clickEvent: function( event ) {
		if ( event.target != this._inputElement ) {
			// Div geklickt
			this.toggleCheckbox();
		} else {
			// Label geklickt
			this._setCssCheckboxStatus( this.getIsChecked() );
		}
		this.fireEvent( 'change' );
	}
	
	,getIsChecked: function() {
		return this._inputElement.get( 'checked' );
	}
	
	,_setCssCheckboxStatus: function ( newValue ) {
		this._checkboxDiv.removeClass( this._options.classChecked );
		if ( newValue ) {
			this._checkboxDiv.addClass( this._options.classChecked );
		}
	}
	
	,setIsChecked: function( value ) {
		this._setCssCheckboxStatus( value );
		this._inputElement.set( 'checked', value );
	}
	
	,toggleCheckbox: function() {
		this.setIsChecked( !this.getIsChecked() );
	}
});