/**
 * Settings
 */
mmCompetenceCenterOptions = Object.extend ( {
	idPrefix: 'cc',
	idLevelPrefix: 'ccL',
	idSelectPrefix: 'ccS',
	useCssSelectboxes: false
}, window.mmCompetenceCenterOptions || {} );

mmSelectorBoxOptions = Object.extend ( {
	idPrefix: 'cc',
	idLevelPrefix: 'ccL',
	idAnchorPrefix: 'ccA',
	idListPrefix: 'ccS',
	borderWith: 1
}, window.mmSelectorBoxOptions || {} );

/**
 * CompetencCenter
 */
mmCompetenceCenter = Class.create ();

mmCompetenceCenter.prototype = {
	initialize: function () {
		// hide every element
		$( mmCompetenceCenterOptions.idPrefix ).childElements ().invoke ( 'hide' );
		this._toggle ( '[1]' );
	},

	_toggle: function ( nextLevel ) {
		try {
			$( mmCompetenceCenterOptions.idLevelPrefix + nextLevel ).show();
		}
		catch(e) {
			if (window.debug) {
				alert('1');
				alert(e);
			}
		};
	},

	_reset: function( nextLevel ) {
		levelId = nextLevel.substr(1, nextLevel.length-2);
		ccElements = $( mmCompetenceCenterOptions.idPrefix ).childElements();
		ccElements.each( function ( ccElement ) {
			if( true == ccElement.visible() ) {
				visibleLevelId = ccElement.identify();
				visibleLevelId = visibleLevelId.substr(mmCompetenceCenterOptions.idLevelPrefix.length);
				visibleSelectId = visibleLevelId;
				visibleLevelId = visibleLevelId.substr(1, visibleLevelId.length - 2);
				visibleLevelId = visibleLevelId.split(/\]\[/);
				if( visibleLevelId[0] >= parseInt(levelId.substr(0,1) ) ) {
					ccElement.hide();
					if( visibleSelectId && false == mmCompetenceCenterOptions.useCssSelectboxes ) {
						try {
							$( mmCompetenceCenterOptions.idSelectPrefix + visibleSelectId ).selectedIndex = 0
						}
						catch(e) {
//							if (window.debug) {
								alert(e);
//							}
						};
					}
					else if ( true == mmCompetenceCenterOptions.useCssSelectboxes ) {
						try {
							window.ccSb.resetValue( $( mmSelectorBoxOptions.idAnchorPrefix + visibleSelectId ) );
						}
						catch(e) {
//							if (window.debug) {
								alert(e);
//							}
						};
					} 
				}
			}
		});
	},

	toggle: function ( value ) {
		value = value.split(/,/);
		var returnValue = '';
		value.each ( function( val ) {
			returnValue = returnValue + '[' + val + ']';
		});
		this._toggle( returnValue );
	},

	toggleA: function ( value, element, anchorElement ) {
		if( true == mmCompetenceCenterOptions.useCssSelectboxes ) {
			window.ccSb.selectValue( element, anchorElement );
		}
		this.toggle( value );
	}
}

/**
 * Selectorbox
 */
var mmSelectorBox = Class.create();

mmSelectorBox.prototype = {
	defaultValues: [],

	initialize: function() {
		$$( 'a.selector' ).each( function(Element) {
			this[Element.identify()] = Element.innerHTML;
		}, this.defaultValues);

		this.searchSelectorBoxes();
	},
	
	searchSelectorBoxes: function() {
		this.searchSelectorBoxes = Prototype.emptyFunction;
		
		document.observe('click', (function(event){
			var target = event.findElement('a[rel^=select]');
			if (target) {
				event.stop();
				this.addEvents(target);
			}
		}).bind(this));
	},

	addEvents: function(target){
		elementAnchor = target.id;
		elementId = elementAnchor.substr( mmSelectorBoxOptions.idAnchorPrefix.length );
		elementSelect = mmSelectorBoxOptions.idListPrefix + elementId;
		this.headerSelector = $(elementSelect);
		if (!this.headerSelector) {
			return;
		}
		this.headerSelector.show();
		this.selectorLink = $(elementAnchor);
		this.showSelector(this.selectorLink);
		
		Event.observe(this.selectorLink, 'mouseout', this.delayedHideSelector.bindAsEventListener(this));
		Event.observe(this.headerSelector, 'click', this.hideSelector.bindAsEventListener(this));
		Event.observe(this.headerSelector, 'mouseout', this.delayedHideSelector.bindAsEventListener(this));
		Event.observe(this.headerSelector, 'mouseover', this.clearHideSelector.bindAsEventListener(this));
	},

	selectValue: function( element, anchorElement ) {
		anchorElement.innerHTML = element.innerHTML;
	},

	resetValue: function( anchorElement ) {
		anchorElement.innerHTML = this.defaultValues[anchorElement.identify()];
	},

	showSelector: function(selectorLink) {
		selectorLink.blur();
		this.clearHideSelector();
		if (this.visible) {
			this.hideSelector();
		}
		else {
			var leftBorder = selectorLink.cumulativeOffset()[0];
			var topBorder = selectorLink.cumulativeOffset()[1] + selectorLink.offsetHeight +1;
			this.headerSelector.style.left = (leftBorder) + 'px';
			this.headerSelector.style.top = (topBorder-1) + 'px';
			this.headerSelector.style.width = (selectorLink.offsetWidth - ( parseInt(mmSelectorBoxOptions.borderWith) *2 ) ) + 'px';
			try {
				Effect.Appear(this.headerSelector, {duration:0.3});
			}
			catch(e) {
				Element.show(this.headerSelector);
			}
			this.visible = true;
		}
	},

	hideSelector: function(){
		if (this.visible) {
			try {
				Effect.Fade(this.headerSelector, {duration:0.3});
			}
			catch(e) {
				Element.hide(this.headerSelector);
			}
			this.visible = false;
		}
	},

	delayedHideSelector: function(e) {
		if (this.visible) {
			this.clearHideSelector();
			this.delayID = setTimeout(this.hideSelector.bind(this), 250);
		}
	},

	clearHideSelector: function(){
		if (this.delayID) {
			clearTimeout(this.delayID);
			this.delayID = null;
		}
	}
};

window.debug = true;

new PeriodicalExecuter(function(pe) {
	if (null != $( mmCompetenceCenterOptions.idPrefix ) ) {
		pe.stop();
		window.cc = new mmCompetenceCenter();
		try {
			if(true == mmCompetenceCenterOptions.useCssSelectboxes) {
				window.ccSb = new mmSelectorBox();
			}
		} 
		catch (e) {
			/* NOT DEFINED */
		}
	}
}, 1);

