var NXC = NXC || {};
NXC.Meta = new Class( {

	Implements: [Options, Events],

	options:{
		'markedKeywordClass'          : 'nxc-meta-keyword-selected',
		'checkboxesNameBase'          : 'ContentObjectAttribute_option_selected_array_',
		'disabledSelectAnchorClass'   : 'nxc-meta-select-keyword-not-active',
		'disabledUnselectAnchorClass' : 'nxc-meta-unselect-keyword-not-active',
		'keywordDragClass'            : 'nxc-meta-keyword-drag',
		'groupDragClass'              : 'nxc-meta-group-drag',
		'sliderSpeed'                 : 250
	},

	attributeID                : false,
	checkboxesContainer        : false,
	checkboxes                 : [],
	selectedKeywordsContainer  : false,
	selectedKeywords           : [],
	selectedKeywordGroupTitles : [],
	keywordsContainer          : false,
	keywords                   : [],
	keywordGroupTitles         : [],
	selectKeywordAnchor        : false,
	unselectKeywordAnchor      : false,

	initialize: function( attributeID, options ) {
		this.attributeID                = attributeID;
		this.checkboxesContainer        = document.id( 'nxc-meta-checkboxes-' + this.attributeID );
		this.checkboxes                 = this.checkboxesContainer.getElements( 'input.nxc-meta-checkbox' );
		this.selectedKeywordsContainer  = document.id( 'nxc-meta-selected-keywords-' + this.attributeID );
		this.selectedKeywords           = this.selectedKeywordsContainer.getElements( 'div.nxc-meta-keyword' );
		this.selectedKeywordGroupTitles = this.selectedKeywordsContainer.getElements( 'div.nxc-meta-keyword-group-title' );
		this.keywordsContainer          = document.id( 'nxc-meta-keywords-list-' + this.attributeID );
		this.keywords                   = this.keywordsContainer.getElements( 'div.nxc-meta-keyword' );
		this.keywordGroupTitles         = this.keywordsContainer.getElements( 'div.nxc-meta-keyword-group-title' );
		this.selectKeywordAnchor        = document.id( 'nxc-meta-select-keyword-' + this.attributeID );
		this.unselectKeywordAnchor      = document.id( 'nxc-meta-unselect-keyword-' + this.attributeID );

		this.setOptions( options );

		this.installGroupsAccording();
		this.installKeywordSelection();
		this.installSelectKeyword();
		this.installUnselectKeyword();
		this.installKeywordsDrag();
		this.installGroupsDrag();
		
		this.addEvent( 'selectKeywords', function() {
			this.updateSelectionAnchors();
			this.checkKeywordGroups();		
		}.bind( this ) );

		this.addEvent( 'unselectKeywords', function() {
			this.updateSelectionAnchors();
			this.checkKeywordGroups();
		}.bind( this ) );
	},

	installGroupsAccording: function() {
		this.selectedKeywordGroupTitles.each( function( el ) {
			var groupBlock = document.id( 'nxc-meta-selected-keyword-group-' + el.get( 'id' ).replace( 'nxc-meta-selected-keyword-group-title-', '' ) );
			this.installGroupAccording( el, groupBlock );
		}.bind( this ) );

		this.keywordGroupTitles.each( function( el ) {
			var groupBlock = document.id( 'nxc-meta-keyword-group-' + el.get( 'id' ).replace( 'nxc-meta-keyword-group-title-', '' ) );
			this.installGroupAccording( el, groupBlock );
		}.bind( this ) );
	},

	installGroupAccording: function( title, block ) {
		title.store( 'groupBlock', block );
		title.store( 'groupBlockSlide', new Fx.Slide( block, { 'duration': this.options.sliderSpeed } ) );

		title.addEvent( 'click', function() {
			title.retrieve( 'groupBlockSlide' ).toggle();
		} );
	},

	installKeywordSelection: function() {
		[].extend( this.selectedKeywords ).extend( this.keywords ).each( function( el ) {
			el.addEvent( 'click', function( e ) {
				e.stop();
				el.toggleClass( this.options.markedKeywordClass );
			}.bind( this ) );
		}.bind( this ) );
	},

	installSelectKeyword: function() {
		this.selectKeywordAnchor.addEvent( 'click', function( e ) {
			e.stop();
			var markedKeywords = this.getMarkedKeywords( this.keywordsContainer );
			markedKeywords.each( function( keyword ) {
				this.selectKeyword( keyword );
			}.bind( this ) );

			this.fireEvent( 'selectKeywords' );
		}.bind( this ) );
	},

	selectKeyword: function( el ) {
		el.removeClass( this.options.markedKeywordClass );

		var id = el.get( 'id' ).replace( 'nxc-meta-keyword-' + this.attributeID + '-', '' );
		selectedKeyword = document.id( 'nxc-meta-selected-keyword-' + this.attributeID + '-' + id );
		selectedKeyword.setStyle( 'display', 'block' );

		el.setStyle( 'display', 'none' );

		var checkbox = document.id( this.options.checkboxesNameBase + this.attributeID + '[' + id + ']' );
		checkbox.set( 'checked', true );		
	},

	installUnselectKeyword: function() {
		this.unselectKeywordAnchor.addEvent( 'click', function( e ) {
			e.stop();
			var markedKeywords = this.getMarkedKeywords( this.selectedKeywordsContainer );
			markedKeywords.each( function( selectedKeyword ) {
				this.unselectKeyword( selectedKeyword );
			}.bind( this ) );

			this.fireEvent( 'unselectKeywords' );
		}.bind( this ) );
	},
	
	unselectKeyword: function( el ) {
		el.removeClass( this.options.markedKeywordClass );
		
		var id      = el.get( 'id' ).replace( 'nxc-meta-selected-keyword-' + this.attributeID + '-', '' );
		var keyword = document.id( 'nxc-meta-keyword-' + this.attributeID + '-' + id );
		keyword.setStyle( 'display', 'block' );

		el.setStyle( 'display', 'none' );

		var checkbox = document.id( this.options.checkboxesNameBase + this.attributeID + '[' + id + ']' );
		checkbox.set( 'checked', false );	
	},

	updateSelectionAnchors: function() {
		if( this.getAvailableKeywords( this.selectedKeywords ).length == 0 ) {
			this.unselectKeywordAnchor.addClass( this.options.disabledUnselectAnchorClass );
		} else {
			this.unselectKeywordAnchor.removeClass( this.options.disabledUnselectAnchorClass );
		}

		if( this.getAvailableKeywords( this.keywords ).length == 0 ) {
			this.selectKeywordAnchor.addClass( this.options.disabledSelectAnchorClass );
		} else {
			this.selectKeywordAnchor.removeClass( this.options.disabledSelectAnchorClass );
		}
	},

	getMarkedKeywords: function( container ) {
		return container.getElements( '.' + this.options.markedKeywordClass );
	},

	getAvailableKeywords: function( keywords ) {
		var ret = [];
		keywords.each( function( el ) {
			if( el.getStyle( 'display' ) != 'none' ) {
				ret.include( el );
			}
		} );
		return ret;
	},

	checkKeywordGroups: function() {
		[].extend( this.selectedKeywordGroupTitles ).extend( this.keywordGroupTitles ).each( function( groupTitle ) {
			var availableKeywords = 0;
			var groupBlock        = groupTitle.retrieve( 'groupBlock' );
			groupTitle.retrieve( 'groupBlock' ).getElements( 'div.nxc-meta-keyword' ).each( function( el ) {
				if( el.getStyle( 'display' ) != 'none' ) {
					availableKeywords++;
				}
			} );

			var style = ( availableKeywords == 0 ) ? 'none' : 'block';
			groupTitle.setStyle( 'display', style );
			groupBlock.setStyle( 'display', style );
			groupBlock.getParent().setStyle( 'display', style );
			if( groupTitle.retrieve( 'groupBlockSlide' ).open == true ) {
				groupBlock.getParent().setStyle( 'height', groupBlock.getStyle( 'height' ).toInt() + 'px' );
			} 
		} );
	},

	installKeywordsDrag: function() {
		[].extend( this.selectedKeywords ).extend( this.keywords ).each( function( el ) {
			el.addEvent( 'mousedown', function( e ) {
				if( e.control == false ) {
					return false;
				}

				e.stop();

				var clone = el.clone().addClass( this.options.keywordDragClass ).setStyles( el.getCoordinates() ).inject( document.body ).store( 'originalID', el.get( 'id' ) );
				
				var droppable = ( el.get( 'id' ).indexOf( 'selected' ) == -1 ) ? this.selectedKeywordsContainer : this.keywordsContainer;
				var drag      = clone.makeDraggable( {
					'droppables': [droppable],
					'onDrop': function( element, droppable, event ) {
						if ( droppable ) {
							var originalElement = document.id( element.retrieve( 'originalID' ) );
							if( originalElement.get( 'id' ).indexOf( 'selected' ) == -1 ) {
								this.selectKeyword( originalElement );
								this.fireEvent( 'selectKeywords' );	
							} else {
								this.unselectKeyword( originalElement );
								this.fireEvent( 'unselectKeywords' );
							}
						}
						element.destroy();
					}.bind( this )
				} );
				drag.start( e );
			}.bind( this ) );
		}.bind( this ) );
	},

	installGroupsDrag: function() {
		[].extend( this.selectedKeywordGroupTitles ).extend( this.keywordGroupTitles ).each( function( el ) {
			el.addEvent( 'mousedown', function( e ) {
				if( e.control == false ) {
					return false;
				}
				e.stop();

				var coords = el.getParent().getCoordinates();
				var clone  = el.getParent().clone().addClass( this.options.groupDragClass ).setStyles( coords ).inject( document.body );
				var keywordIDs = [];
				el.retrieve( 'groupBlock' ).getElements( 'div.nxc-meta-keyword' ).each( function( keyword ) {
					keywordIDs.include( keyword.get( 'id' ) );
				} );
				clone.store( 'keywordIDs', keywordIDs );
				
				var droppable;
				if( el.getParent().getParent().get( 'id' ).indexOf( 'selected' ) == -1 ) {
					clone.store( 'select', true );
					droppable = this.selectedKeywordsContainer
				} else {
					clone.store( 'select', false );
					droppable = this.keywordsContainer;
				}

				var drag = clone.makeDraggable( {
					'droppables': [droppable],
					'onDrop': function( element, droppable, event ) {
						if ( droppable ) {							
							var keywordIDs = element.retrieve( 'keywordIDs' );
							if( element.retrieve( 'select', false ) === true ) {
								keywordIDs.each( function( keyword ) {
									this.selectKeyword( document.id( keyword ) );
								}.bind( this ) );
								this.fireEvent( 'selectKeywords' );	
							} else {
								keywordIDs.each( function( keyword ) {
									this.unselectKeyword( document.id( keyword ) );
								}.bind( this ) );
								this.fireEvent( 'unselectKeywords' );
							}
						}
						element.destroy();
					}.bind( this )
				} );
				drag.start( e );
			}.bind( this ) );
		}.bind( this ) );
	}
} );