/**
* Javascript
* JS: Base
*
* @author Heiko Pfefferkorn (i-fabrik GmbH)
* @copyright 2009 i-fabrik GmbH
* @version $Id: core.js,v 1.5 2009-12-15 10:42:05 daniel Exp $
*
*/


/*
Element - Implements
*/

Element.implement({

	/*
	Property: addClasses
		Mehreren CSS-Klassennamen, wenn noch nicht vorhanden, einem Element hinzufügen.

	Arguments:
		classField - Array; die hinzuzufügenden Klassennamen

	Example:
		<div id="myElement" class="testClass"></div>
		$('myElement').addClasses(['newClass', ['newClass2']]); //<div id="myElement" class="testClass newClass newClass2"></div>
	*/

	addClasses: function(classNames) {
		if(classNames.length > 0) {
			if(typeof(classNames) != 'object')
				classNames = [classNames];

			for(var i = 0; i < classNames.length; i++) {
				if(!this.hasClass(classNames[i]))
					this.className = (this.className + ' ' + classNames[i]).clean();
			}
		}

		return this;
	},


	/*
	Property: removeClasses
		Funktionsweise wie <Element.addClasses>, nur werden hier die betreffenden CSS-Klassenname  entfernt.
	*/

	removeClasses: function(classNames) {
		if(classNames.length > 0) {
			if(typeof(classNames) != 'object')
				classNames = [classNames];

			for(var i = 0; i < classNames.length; i++)
				this.className = this.className.replace(new RegExp('(^|\\s)' + classNames[i] + '(?:\\s|$)'), '$1').clean();
		}

		return this;
	}

});


/*
Element - Events
*/

// 'keyEnter'
Element.Events.pressEnter = {
	base     : 'keydown',
	condition: function(e) {
		return (e.key == 'enter');
	}
};

// 'keyDelete'
Element.Events.keyDelete = {
	base     : 'keydown',
	condition: function(e) {
		return (e.key == 'delete');
	}
};

// 'keyBackspace'
Element.Events.keyBackspace = {
	base     : 'keydown',
	condition: function(e) {
		return (e.key == 'backspace');
	}
};




/*
Site UI

Website script options and script pool.
*/

var SiteUI = {
	options: {
		highslide          : {},
		skin               : 'standard',
		skinPath           : 'resources/themes/standard/',
		searchDefaultPhrase: 'Suchbegriff',
		searchMinQuery     : 3
	},

	/*
	...
	*/

	standardEvents: {
		e: function(s) { // mouseenter
			if(!this.focused)
				this.addClass(s + 'hovered');
		},

		l: function(s) { // mouseleave
			var f = [s + 'hovered', s + 'active'];

			if(!this.focused)
				f.include(s + 'focused');

			this.removeClasses(f);
		},

		f: function(s) { // focus
			this.focused = true;
			this.addClass(s + 'focused');
		},

		b: function(s) { // blur
			this.focused = false;
			this.removeClasses([s + 'hovered', s + 'focused']);
		},

		a: function(s) { // mousedown, keydown
			this.addClass(s + 'active');
		}
	},

	/*
	...
	*/

	formDefaultValueEvent: function(arr) {

		arr.each(function(el) {
			var def_value = el.get('title');

			if(def_value && def_value.clean() != '') {
				el.set('title', '');
				var value = el.get('value');

				if(value.clean() == '')
					el.set('value', def_value);

				el.addEvents({
					'focus': function(e) {
						if(this.value == def_value)
							this.value = '';
					},
					'blur': function(e) {
						if(this.value.clean() == '')
							this.value = def_value;
					}
				});
			}
		});

	},

	/*
	Append image blocks events (mouseover, mouseout).
	*/

	appendImageBlocks: function(blocks) {

		if($defined(blocks)) {

			// Only elements without class 'iBlock-clean'.
			blocks = blocks.filter(function(el) {
				return (!el.hasClass('iBlock-clean'));
			});

			if(blocks) {

				blocks.addEvents({
					'mouseenter': function(ev) {
						if(!this.hasClass('iBlock-hovered'))
							this.addClass('iBlock-hovered');
					},
					'mouseleave': function(ev) {
						this.removeClass('iBlock-hovered');
					}
				});

			}

		}

	},

	/*
	Initialize tooltip instances.
	*/

	tTipsAppend: function(hash) {
		checkedHash = hash.filter(function(item) {
			return ($defined(item.selector) && item.selector != '') ? true : false;
		});

		checkedHash.each(function(data, type) {

			// Initialize new tip instance.
			// ----------------------------

			SiteUI['ttips' + type.capitalize()] = new Tips([], $merge({
				className: 'ttips-' + type.toLowerCase(),
				offsets  : {
					x: 20,
					y: 10
				},
				onShow: function(tip) {
					tip.setStyle('opacity', .8);
				},
				onHide: function(tip) {
					tip.setStyle('opacity', 0);
				}
			}, data.options || {}));


			// Get elements an attach to new tip instance.
			// -------------------------------------------

			$$(data.selector).each(function(el) {

				var ti    = ''
				var tx    = ''
				var title = ($chk(el.get('title'))) ? el.get('title').clean() : null;

				if(title) {
					if(title.contains('::')) {
						var parts = $A(title.split('::'));

						if(parts.length > 1) {
							ti = parts[0].clean();
							tx = parts[1].clean();
						} else
							tx = parts[0].clean();
					} else
						tx = title.clean();

					if(ti != '' || tx != '') {
						el.store('tip:title', ti);
						el.store('tip:text', tx);

						// Attach new tip.
						SiteUI['ttips' + type.capitalize()].attach(el);
					}

					el.set('title', '');
				}
			});

		});

		SiteUI.tTipsCleanupInlineElements(checkedHash);
	},

	/*
	Detach all inline-element-tooltips from tooltip element.
	*/

	tTipsCleanupInlineElements: function(hash) {
		var allTypes = checkedHash.getKeys();

		hash.each(function(data, type) {
			$$(data.selector).each(function(el) {

				allTypes.each(function(type_to_detach) {
					if(type_to_detach != type) {
						el.getElements(hash.get(type_to_detach).selector).each(function(el_to_detach) {
							SiteUI['ttips' + type_to_detach.capitalize()].detach(el_to_detach);
						});
					}
				});
			});
		});
	},

	/*
	...
	*/

	flashMovie: new Hash(),
	appendFlashMovie: function(co, url, options) {

		if($defined(co)) {

			var yt_opt = $merge({
				id       : 'ytmov_' + Math.round(Math.random() * 999),
				container: co,
				params   : {
					allowScriptAccess: 'always',
					quality          : 'high',
					swLiveConnect    : false,
					wMode            : 'opaque'
				}
			}, options||{})

			var yt_mov = new Swiff(url, yt_opt);

			SiteUI.flashMovie.set(yt_opt.id, yt_mov);

		}

	}

};


var SiteUI_Init = new Hash({

	/*
	Initialize main actions (extend options, ...).
	*/

	init_main: function() {

		// Site options.
		// -------------

		SiteUI.options = $merge(SiteUI.options, SiteUI_Options||{});


		// Include some little opera specific styles.
		// ------------------------------------------

//		if(Browser.Engine.presto) {
//
//			new Asset.css('resources/styles/hacks/opera.css');
//
//		}


		// Navigation.
		// -----------

		// Main menu.
		if($defined(document.id('MainMenu')) && document.id('MainMenu').getElement('ul')) {

			var m_it = document.id('MainMenu').getElement('ul').getChildren('li');

			if($defined(m_it)) {

				m_it.filter(function(el) {

					return (el.getElement('a') || el.getElement('ul')) ? true : false;

				}).each(function(item, i) {

//				m_it.each(function(item, i) {

					item.addEvents({
						'mouseenter': SiteUI.standardEvents.e.bind(item, ''),
						'mouseleave': SiteUI.standardEvents.l.bind(item, '')/*,
						'focus'     : SiteUI.standardEvents.f.bind(item, ''),
						'blur'      : SiteUI.standardEvents.b.bind(item, '')*/
					});

				});

			}

		}

		// Service menu (head).
		if($defined(document.id('ServiceMenu')) && document.id('ServiceMenu').getElement('ul')) {

			var s_it = document.id('ServiceMenu').getElement('ul').getChildren('li');

			if($defined(s_it)) {

				s_it.filter(function(el) {

					return (el.getElement('a') || el.getElement('ul')) ? true : false;

				}).each(function(item, i) {

					item.addEvents({
						'mouseenter': SiteUI.standardEvents.e.bind(item, ''),
						'mouseleave': SiteUI.standardEvents.l.bind(item, '')/*,
						'focus'     : SiteUI.standardEvents.f.bind(item, ''),
						'blur'      : SiteUI.standardEvents.b.bind(item, '')*/
					});

				});

			}

		}


		// PNG Elements.
		// -------------

//		if(Browser.Engine.trident && Browser.Engine.version <= 4 && $defined('DD_belatedPNG')) {
//
//			DD_belatedPNG.fix('.ilnk');
//
//		}

	},

	/*
	Init: 'Highslide-Feature' und Bildblöcke.
	*/

	init_hs_and_images: function() {

		// Highslideobjekt /-definitionen anhand der Seitenoptionen anpassen/erweitern.
		if(typeof(hs) != 'undefined') {

			$extend(hs, $merge({
				graphicsDir   : SiteUI.options.skinPath + 'highslide/',
				outlineType   : null,
				loadingOpacity: 0.75,
				lang          : {
					focusTitle     : 'in den Vordergrund',
					fullExpandText : 'Originalgr&ouml;&szlig;e',
					fullExpandTitle: 'Originalgröße',

					closeText      : 'Schlie&szlig;en',
					closeTitle     : 'ESC-Taste (Schließen)',

					creditsText    : '',
					creditsTitle   : '',

					loadingText    : 'Lade ...',
					loadingTitle   : 'Mausklick - Abbruch',

					moveText       : 'Verschieben',
					moveTitle      : 'Verschieben',
					nextText       : 'Vor',
					nextTitle      : 'Pfeiltaste rechts (Vor)',

					pauseText      : 'Pause',
					pauseTitle     : 'Leertaste (Pause)',

					playText       : 'Abspielen',
					playTitle      : 'Leertaste (Abspielen)',

					previousText   : 'Zur&uuml;ck',
					previousTitle  : 'Pfeiltaste links (Zurück)',

					resizeTitle    : 'Größe anpassen',
					restoreTitle   : 'Mausklick - Schließen, Drag & Drop - Verschieben, Pfeiltasten - Blättern'
				}

			}, SiteUI.options.highslide||{}));

			// Kontrollbar anbinden?
			if($defined(hs.addSlideshow)) {

				hs.addSlideshow($merge({
					//slideshowGroup: 'group1',
					interval      : 5000,
					repeat        : false,
					useControls   : true,
					fixedControls : 'fit',
					overlayOptions: {
						opacity       : .6,
						position      : 'bottom center',
						hideOnMouseOut: true
					}
				}, hs.addSlideshow||{}));

			}

		}

		// Bildblöcke.
		SiteUI.appendImageBlocks($$('span.iBlock'));

	},

	/*
	Init: Tooltips.
	*/

	init_tooltips: function() {

		var tipsHash = new Hash({
		    'default'  : {
		    	'selector': '.tooltip',
		    	'options' : {
		    		className: 'tooltipsEnabled'
		    	}
		    },
		    'special'  : {
		    	'selector': '.tooltip2',
		    	'options' : {
		    		className: 'tooltipsEnabled2'
		    	}
		    }/*,
		    'attention': {
		    	'selector': '.tooltip_attention',
		    	'options' : {
		    		className: 'ttips-attention'
		    	}
		    },
		    'markup'   : {
		    	'selector': 'cite',
		    	'options' : {
					className: 'ttips-markup',
					offsets  : {
						x: 15,
						y: 10
					}
		    	}
		    }*/
		});

		SiteUI.tTipsAppend(tipsHash);

	},

	/*
	Init: Snippets :).
	*/

	init_some_snippets: function() {

		// Form input field - Toggle default value.
		SiteUI.formDefaultValueEvent($$('input.add-default'));

	}

});


window.addEvent('domready', SiteUI_Init.run.bind(SiteUI_Init));

