﻿Element.implement({
	/* fix mouseenter + mousemove bug in association with dom-api */
	hasChild: function(el){
		el = document.id(el, true);
		if (!el) return false;
		if (Browser.Engine.webkit && Browser.Engine.version < 420) return $A(this.getElementsByTagName(el.tagName)).contains(el);
		/* set this.contains to null if var is dom-api function  */
		if($type(this.contains) == 'function')
			this.contains = null;
		return (this.contains) ? (this != el && this.contains(el)) : !!(this.compareDocumentPosition(el) & 16);
	},
	grabProperty: function(property,elSource){
		if(elSource.getProperty(property).length){
			this.setProperty(property,elSource.getProperty(property));
			elSource.removeProperty(property);
		}
		return this;
	},
	blink: function(value,duration,property){
		if(!$defined(property))property='background-color';
		var oldVal = this.getStyle(property);
		this.set('tween',{durration:duration,link:'chain'});
		this.tween(property,value);
		this.tween(property,oldVal);
	}
});

Array.implement({
	isLast: function(value){
		var idx = this.indexOf(value);
		if(idx+1 >= this.length || idx == -1){
			return true;
		}else{
			return false;
		}
	},
	getNextIndex: function(value){
		var idx = this.indexOf(value);
		if(idx+1 >= this.length || idx == -1){
			return 0;
		}else{
			return idx+1;
		}
	},
	getNextValue: function(value){
		return this[this.getNextIndex(value)];
	},
	getPrevIndex: function(value){
		var idx = this.indexOf(value);
		if(idx < 0){
			return this.length-1;
		}else{
			return idx-1;
		}
	},
	getPrevValue: function(value){
		return this[this.getPrevIndex(value)];
	},
	getFirstValue: function(){
		if(this.length){
			return this[0];
		}else{
			return null;
		}
	},
	getLastValue: function(){
		if(this.length){
			return this[this.length-1];
		}else{
			return null;
		}
	}
});




/**
 * Class Extension to add the function dev, which checks if an variable is defined.
 * @class Defined
 * @author MPE
 */
var Defined = new Class(
	/** @lends Defined */
	{
	/**
	 * check if an variable is defined
	 * @param (Any) vari Variable to check if it's defined
	 * @param (Any) def Default value to use if vari is not defined
	 * @return (Any) The variable if defined or the default value if not
	 * @type Any
	 * @author MPE
	 */
	def: function(vari,def){
		if($defined(vari)){
			return vari;
		}else{
			return def;
		}
	}
});

window.oSolar = {
	c:{},
	o:{},
	fn:{},
	events:new Events(),
	params:{},
	data:{}
};

oSolar.c.NaviSlide = new Class({
	Extends:Fx.Slide,
	initialize: function(element, options){
		this.parent(element, options);
		this[this.options.mode+'Offset']();
		this.element.store('wrapper', this.wrapper).setStyle('height', 0);
	},
	verticalOffset: function(){
		this.offset = this.element.offsetHeight;
	},

	horizontalOffset: function(){
		this.offset = this.element.offsetWidth;
	},
	
	vertical: function(){
		this.margin = 'height';
		this.layout = 'height';
	},

	horizontal: function(){
		this.margin = 'margin-left';
		this.layout = 'width';
	}
});


oSolar.c.MainNavi = new Class({
	Implements: [Options, Events, Chain],
	options: {
		classes:{
			smallresults:'.smallresults'
		},
		slideDurarion:900  /** 2010-05-27 - SL AD - Wert von 800 auf 900ms geï¿½ndert */
	},
	initialize: function(selector,options){
		this.setOptions(options);
		
		this.naviSections = new Hash();
		this.currentOpen = null;
		
		$$(selector).each(function(el){
			var tgshort = el.get('id');
			var elSlider = $$('.menuDropdown[rel=' + tgshort + ']');
			if(elSlider.length){
				el.addEvent('mouseenter',this.slideIn.bind(this,tgshort));
				el.addEvent('mouseleave',this.slideOutTimer.bind(this,tgshort));
				elSlider[0].addEvent('mouseenter',this.slideIn.bind(this,tgshort));
				elSlider[0].addEvent('mouseleave',this.slideOutTimer.bind(this,tgshort));
				var slideFx = new oSolar.c.NaviSlide($(elSlider[0]), {
				    transition: Fx.Transitions.Quart.easeOut,
				    link:'chain',
				    duration:this.options.slideDurarion
				});
				
				slideFx.wrapper.setStyle('width',elSlider[0].getSize().x);
				slideFx.wrapper.addClass('sliderWrapper');
				this.naviSections.set(tgshort,{'elAnchor':el,'elSlider':elSlider[0],'tgshort':tgshort,'fx':slideFx,'timer':null});
				slideFx.addEvent('complete',function(el){
					if(this.to[1]){
						document.id(el).getParent().setStyle('height',this.to[1]);
					}
				});
				
			}
			elSlider.setStyle('visibility','visible');
		},this);
	},
	slideIn: function(tgshort){
		if(this.naviSections.has(tgshort) && this.currentOpen != tgshort){
			var oCont = this.naviSections.get(tgshort);
			this.moveSlider(oCont);
			if(this.currentOpen)this.slideOut(this.currentOpen);
			oCont.fx.cancel();
			$clear(oCont.timer);
			if(this.currentOpen){
				oCont.fx.slideIn('vertical');
			}else{
				oCont.timer = oCont.fx.slideIn.delay(200,oCont.fx,'vertical'); /** 2010-05-27 - SL AD - Wert von 50 auf 400ms geï¿½ndert */
			}
			this.currentOpen = tgshort;
		}else if(this.naviSections.has(tgshort)){
			var oCont = this.naviSections.get(tgshort);
			$clear(oCont.timer);
		}
	},
	slideOutTimer: function(tgshort){
		if(this.naviSections.has(tgshort) && this.currentOpen == tgshort){
			var oCont = this.naviSections.get(tgshort);
			$clear(oCont.timer);
			oCont.timer = this.slideOut.delay(10,this,arguments);
		}
	},
	slideOut: function(tgshort){
		if(this.naviSections.has(tgshort) && this.currentOpen == tgshort){
			var oCont = this.naviSections.get(tgshort);
			$clear(oCont.timer);
			oCont.fx.cancel();
			oCont.fx.slideOut('vertical');
			this.currentOpen = null;
		}
	},
	moveSlider: function(oCont){
		var oNaviContainer = oCont.elAnchor.getPosition();
		var iMaxWidth = oCont.elAnchor.getParent().getDimensions().x; 
		var SliderDim = oCont.elSlider.getDimensions();
		var iMoveLeft = oNaviContainer.x-oCont.elAnchor.getParent().getPosition().x;
		if(SliderDim.width+iMoveLeft > iMaxWidth){
			iMoveLeft = iMaxWidth-SliderDim.width;
		}
		oCont.elSlider.getParent().setStyle('margin-left',iMoveLeft);
	}
});

oSolar.c.Haendlersuche = new Class({
	Implements: [Options, Events],
	options: {
		searchurl:'',
		resultSubstitute:{'relpath':''},
		classes:{
			smallresults:'.smallresults'
		},
		resultCount:2,
		displaytype:'sat',
		langId:2,
		sLinkMainAppJson:{}
	},
	initialize: function(el,options){
		this.setOptions(options);

		this.el = $(el);
		this.form = this.el.getElement('form');
		this.elErrors = null;
		this.form.addEvent('submit',this.search.bindWithEvent(this));
		this.loading = new Element('DIV',{'class':'loading'}).inject(this.form,'after');
		this.elResults = this.el.getElement('.smallresults');
	},
	validate:function(){
		
		var iPostcode = this.form.iPostcode.value.trim();
		var iRadius = this.form.iRadius.value;
		var iCountry = this.getSelectValue(this.form.iCountry);
		var aError = [];
		switch(iCountry){			
			case "14":
			var oSubsitute = {'country':this.options.txt.austria,'zip':iPostcode};
			break;
			
			case "79":
			var oSubsitute = {'country':this.options.txt.germany,'zip':iPostcode};
			break;
			
			case "142":
			var oSubsitute = {'country':this.options.txt.nederland,'zip':iPostcode};
			break;
			
			case "21":
			var oSubsitute = {'country':this.options.txt.beglien,'zip':iPostcode};
			break;					
		}
		
		this.clearErrors();
		if(iCountry != '142'){
			if(!iPostcode.test("^[0-9]*$")){
				aError.push({el:this.form.iPostcode,txt:this.options.aErrorTxt.postcodeNumeric.substitute(oSubsitute)});
			}			
		}
		
		if(!iRadius.length){
			aError.push({el:this.form.iRadius,txt:this.options.aErrorTxt.radius.substitute(oSubsitute)});
		}
		
		if(iCountry == '14'){
			// AT Validation
			if(iPostcode.length != 4){
				aError.push({el:this.form.iPostcode,txt:this.options.aErrorTxt.postcode_at.substitute(oSubsitute)});
			}
		}else if(iCountry == '79'){
			// DE Validation
			if(iPostcode.length != 5){
				aError.push({el:this.form.iPostcode,txt:this.options.aErrorTxt.postcode_de.substitute(oSubsitute)});
			}
		}
		else if(iCountry == '142'){
			// NL Validation
			if(iPostcode.length != 7){
				aError.push({el:this.form.iPostcode,txt:this.options.aErrorTxt.postcode_nl.substitute(oSubsitute)});
			}
		}
		else if(iCountry == '21'){
			// BE Validation
			if(iPostcode.length != 4){
				aError.push({el:this.form.iPostcode,txt:this.options.aErrorTxt.postcode_be.substitute(oSubsitute)});
			}
		}
		else{
			aError.push({el:this.form.iCountry,txt:this.options.aErrorTxt.country.substitute(oSubsitute)});
		}
		
		if(aError.length){
			this.renderErrors(aError);
			return false;
		}else{
			
			return true;
		}	
	},
	getSelectValue: function(formElements){
		var sRetrun = "";
		for (idx = 0; idx<formElements.length;++idx ){
			if(formElements[idx].checked)return document.id(formElements[idx]).get('value');
		}
		return sRetrun;
	},
	search:function(evnt){
		new Event(evnt).stop();
		
		if(!this.validate())return false;
		
		if(this.options.displaytype == 'sat'){
			this.showLoading();
			
			var jsonRequest = new Request.JSON({
				url: this.options.searchurl,
				onSuccess: this.renderResult.bind(this)
			}).get(this.form);
			
		}else{
			this.setTargetLink();
			this.form.submit();
		}
	},
	renderResult:function(oData){		
		this.hideLoading();
		var iCountry = this.getSelectValue(this.form.iCountry);			
		switch(iCountry){
			case "79":
			var dealer = this.options.txt.radius+'<br /><br />';
			nodealer = this.options.txt.entireDirectories + ' »';
			route = this.options.txt.route;
			break;
			
			case "14":
			var dealer = this.options.txt.radius+'<br /><br />';
			nodealer = this.options.txt.entireDirectories + ' »';
			route = this.options.txt.route;
			break;	
								
			case "142":
			var dealer = this.options.txt.radius+'<br /><br />';
			nodealer = this.options.txt.entireDirectories + ' »';
			route = this.options.txt.route;
			break;
						
			case "21":
			var dealer = this.options.txt.radius+'<br /><br />';
			nodealer = this.options.txt.entireDirectories + ' »';
			route = this.options.txt.route;
			break;			
		}
		
		this.elResults.empty();			
			if(!$defined(oData.DATA)){
				var sClass = 'result';
				if($defined(oData.ERRORMESSAGE)){
					dealer = oData.ERRORMESSAGE + '<br /><br />';
				}
				dealer +=	'<a href="'+ oData.MAPLINK+'">'+nodealer+'</a>';
				this.elResults.adopt(new Element('DIV',{'class':sClass,'html':dealer}));
			}else{		
				oData.DATA.DEALER_ID.each(function(DEALER_ID,idx){
					if(this.options.resultCount > idx){
						var sClass = 'result';
						var url = oData.DATA.INTERNET[idx];
						if (oData.DATA.INTERNET[idx].substring(0,4) !== 'http'){
							url = 'http://' + oData.DATA.INTERNET[idx]; //add http if not exists 
						}
						if(idx == 0)sClass += ' first';						
						var dealer = '<div class="reswrp" rel="[\''+oData.DATA.ADDRESS[idx]+'+'+oData.DATA.POSTCODE[idx]+'+'+oData.DATA.CITY[idx]+'\','+ oData.DATA.DEALER_ID[idx] +']">';
							dealer +=	'<div class="img"><img src="/apps/dealerloc/data/'+ oData.DATA.FILEPATH[idx] +'/'+ oData.DATA.FILENAME[idx] +'"></div>';
							dealer +=	'<h4 class="title" >'+oData.DATA.DEALERNAME[idx]+'</h4>';
							dealer +=	'<p class="adress">'+oData.DATA.ADDRESS[idx]+'<br />'+oData.DATA.POSTCODE[idx]+' '+oData.DATA.CITY[idx]+'</p>';
							dealer +=	'<p class="inet"><a href="mailto:' +oData.DATA.EMAIL[idx]+ '">' +oData.DATA.EMAIL[idx]+ '</a><br /><a href="' +url+ '" target="_blank">'+oData.DATA.INTERNET[idx]+'</a></p>';
							dealer +=	'<p class="dist">' + this.options.txt.distance + ': ' + oData.DATA.DISTANCE[idx] +' km | ';
							dealer +=	'<a href="http://maps.google.'+ this.options.txt.topLevelDomain +'/maps?saddr='+this.form.iPostcode.value.trim()+'&daddr='+ oData.DATA.ADDRESS[idx] +', '+ oData.DATA.POSTCODE[idx] +'+'+ oData.DATA.CITY[idx] +'&z=15" target="_blank">'+route+'</a><br />';																
							dealer += 	'<span class="card"><a href="#">'+ this.options.txt.showOnMap +'</a></span>',								
							dealer +=	'</p></div>';															
						this.elResults.adopt(new Element('DIV',{'class':sClass,'html':dealer}));
					}
				},this);
				if(this.options.resultCount < oData.DATA.DEALER_ID.length){			
					var elA = new Element('A',{'class':'moreResults','text':this.options.txt.morelink,'href':'javascript: void(0);'}).addEvent('click',(function(){this.setTargetLink();this.form.submit();}).bind(this));
					this.elResults.adopt(new Element('DIV',{'class':'footer'}).adopt(elA));
				}
			}			
	},
	clearErrors: function(){
		if(this.elErrors){
			this.elErrors.destroy();
			this.elErrors = null;
		}
	},
	renderErrors: function(aErrors){
		this.elErrors = new Element('DIV',{'class':'errors'});
		this.form.getElements('select,input,textarea').each(function(el){el.removeClass('error')},this);
		aErrors.each(function(oErr){
			oErr.el.addClass('error')
			this.elErrors.adopt(new Element('span',{'class':'error','html':'- ' + oErr.txt}));
		},this);
		this.elErrors.inject(this.form,'top');
	},
	showLoading:function(){
		this.loading.show();
	},
	hideLoading:function(){
		this.loading.hide();
	},
	setTargetLink:function(){
		var iCountry = this.getSelectValue(this.form.iCountry);
		this.form.action = this.options.sLinkMainAppJson[this.options.langId][iCountry];
	}
});

oSolar.c.TabManager = new Class({
	Implements: [Events, Options, Chain],
	options: {
		iStartTab : 1,
		changeEvent: 'click',
		setAfterInit: true,
		css:{
			activeSwitch: 'tab_active',
			firstSwitch: 'first',
			lastSwitch: 'last',
			activeContent: 'tab_active',
			firstContent: 'first',
			lastContent: 'last'
		}
	},
	initialize: function(oDCtabs,oDCtabcontens,options){
		this.setOptions(options);
		// check Input Data
		if($type(oDCtabs) == 'string'){
			this.tabSw = $$(oDCtabs);
		}else if($type(oDCtabs) == 'collection' || $type(oDCtabs) == 'element' || $type(oDCtabs) == 'array'){
			this.tabSw = oDCtabs;
		}else{
			// exit quitely
			if($defined('console')){console.log('Argument oDCtabs is not a string, element or elementcollection');}
			return false;			
		}
		if($type(oDCtabcontens) == 'string'){
			this.tabCont = $$(oDCtabcontens);
		}else if($type(oDCtabcontens) == 'collection' || $type(oDCtabcontens) == 'element' || $type(oDCtabcontens) == 'array'){
			this.tabCont = oDCtabcontens;
		}else{
			// exit quitely
			if($defined('console')){console.log('Argument oDCtabcontens is not a string, element or elementcollection');}
			return false;			
		}

		// check count of Tabs
		this.iCount = this.tabSw.length;
		if(this.tabCont.length < this.iCount){
			this.iCount = this.tabCont.length;
		}
		
		// set current tab
		this.iCurr = this.options.iStartTab;
		if(this.iCurr > this.iCount){
			this.iCurr = 1;
			if($defined('console')){console.log('Option iStartTab is invalid. Not enough tabs availible');}
		}
		this.iCurr --;
		
		// set special css classes
		this.tabSw.each(function(e,i,a){
			if(this.options.css.firstSwitch.length && i == 0){
				e.addClass(this.options.css.firstSwitch);
			}
			if(this.options.css.lastSwitch.length && i+1 == a.length){
				e.addClass(this.options.css.lastSwitch);
			}
			e.addEvent(this.options.changeEvent, this.set.bindWithEvent(this, i+1));
		},this);
		this.tabCont.each(function(e,i,a){
			if(this.options.css.firstContent.length && i == 0){
				e.addClass(this.options.css.firstContent);
			}
			if(this.options.css.lastContent.length && i+1 == a.length){
				e.addClass(this.options.css.lastContent);
			}
		},this);
		
		if(this.options.setAfterInit)
			this.set(this.iCurr.toInt()+1);
	},
	_onBeforSet: function(iNr){
		if(this.tabCont[iNr])
			this.fireEvent('beforeSet',[iNr, this.tabCont[iNr]]);
	},
	_onAfterSet: function(iNr){
		if(this.tabCont[iNr])
			this.fireEvent('afterSet', [iNr, this.tabCont[iNr]]);
	},
	set: function(evnt,nr){
		var iNr = arguments[arguments.length-1]-1;
		if(iNr < this.iCount){
		 this.chain(
			this._onBeforSet(iNr),
			this.setRunner(evnt,iNr),
			this._onAfterSet(iNr)
		 );
		 this.callChain();
		}
	},
	setRunner: function(evnt,iNr){
		if(iNr < this.iCount){
			this.tabSw.each(function(e,i,a){
				if(this.options.css.activeSwitch.length){
					if(i == iNr){
						e.addClass(this.options.css.activeSwitch);
					}else{
						e.removeClass(this.options.css.activeSwitch);
					}
				}
			},this);
			this.tabCont.each(function(e,i,a){
				if(i != iNr){
					e.setStyle('display','none');
				}else{
					e.setStyle('display','block');
				}
				if(this.options.css.activeSwitch.length){
					if(i == iNr){
						e.addClass(this.options.css.activeContent);
					}else{
						e.removeClass(this.options.css.activeContent);
					}
				}
			},this);
			this.iCurr = iNr;
		}
	}
});

oSolar.c.SimpleCarousel = new Class({
	Implements: [Events, Options, Chain],
	options: {
		changeEvent: 'click',
		css:{
		}
	},
	initialize: function(oContentEls,oBttNext,oBttPrev,options){
		if($type(oContentEls) == 'string'){
			this.contentEls = $$(oContentEls);
		}else if($type(oContentEls) == 'collection' || $type(oContentEls) == 'element' || $type(oContentEls) == 'array'){
			this.contentEls = oContentEls;
		}else{
			// exit quitely
			if($defined('console')){console.log('Argument oContentEls is not a string, element or elementcollection');}
			return false;			
		}
		if($type(oBttNext) == 'string'){
			this.oBttNext = $(oBttNext);
		}else if($type(oBttNext) == 'element'){
			this.oBttNext = oBttNext;
		}else{
			// exit quitely
			if($defined('console')){console.log('Argument oBttNext is not a string or element');}
			return false;			
		}
		if($type(oBttPrev) == 'string'){
			this.oBttPrev = $(oBttPrev);
		}else if($type(oBttPrev) == 'element'){
			this.oBttPrev = oBttPrev;
		}else{
			// exit quitely
			if($defined('console')){console.log('Argument oBttPrev is not a string or element');}
			return false;			
		}
		
		if(this.contentEls.length){
			this.contentEls.each(function(el,idx){
				if(idx > 0){
					el.setStyles({'visibility':'hidden','opacity':0,'display':'none'});
				}else{
					el.setStyles({'visibility':'visible','opacity':1,'display':'block'});
				}
				el.set('tween',{
					'duration':1000,
					'link':'chain',
					"onComplete":(function(el){
						if(el.getStyle('visibility') == 'hidden')el.setStyles({'visibility':'hidden','opacity':0,'display':'none'});
					}).bind(this),
					"onStart":(function(el){
						if(el.getStyle('visibility') == 'hidden')el.setStyles({'visibility':'visible','opacity':0,'display':'block'});
					}).bind(this)
				});
			},this);
			this.current = 0;
			this.count = this.contentEls.length;
			
			this.oBttNext.addEvent('click',this.next.bind(this));
			this.oBttPrev.addEvent('click',this.prev.bind(this));
		}else{
			this.oBttNext.destroy();
			this.oBttPrev.destroy();
			return false;
		}
	},
	next: function(){
		var iNext = this.current+1;
		if(iNext >= this.count){
			iNext = 0;
		}
		this.fadeToElement(iNext);
	},
	prev: function(){
		var iPrev = this.current-1;
		if(iPrev < 0){
			iPrev = this.count-1;
		}
		this.fadeToElement(iPrev);
	},
	fadeToElement: function(contentIndex){
		this.chain(
			this._onBeforFade(this.current,contentIndex),
			this._fadeEl(this.current,0),
			this._fadeEl(contentIndex,1),
			this._onAfterFade(this.current,contentIndex),
			this._setCurrentIndex(contentIndex)
		);
		this.callChain();
	},
	_onBeforFade: function(currentIndex,nextIndex){
		this.fireEvent('beforeFade',[currentIndex,nextIndex]);
	},
	_onAfterFade: function(currentIndex,nextIndex){
		this.fireEvent('afterFade', [currentIndex,nextIndex]);
	},
	_fadeEl : function(contentIndex,status){
		if(status){
			this.contentEls[contentIndex].fade('in');
		}else{
			this.contentEls[contentIndex].fade('out');
		}
	},
	_setCurrentIndex : function(contentIndex){
		this.current = contentIndex;
	}
});	

oSolar.c.products = {};
oSolar.c.products.Gallery = new Class(
	/** @lends oSolar.c.products.Gallery.prototype */
	{
	Implements: [Options,Events,Defined,Chain],
	options:{
		viewmode:0,
		relpathToImages:'',
		relpath:'',
		startWith:{
			'image_ID':0,
			'album_ID':0,
			'slideshow_ID':0
		},
		versionKey:{
			thumb:'',
			big:''
		},
		classes:{
			bigImageWrp:null,
			imgText:null
		},
		startImgId:106,
		albumOpacityOff:0.4,
		automaticnext:6000,
		fadeduration:800,
		textfadedelay:800,
		textfadeopacity:0.5,
		techImgMode:false,
		dataJSONUrl:''
	},
	/**
	 * Solarlux product gallery widget 
	 * @constructs
	 * @param {Element|String} el Id-String or HTML Element holding the gallery 
	 * @param {Object} data Server generated data as JS object.
	 * @param {Object} options behavior and dyn. data options 
	 * @option {String} relpathToImages relative path to the images
	 * @option {Object} startWith object with image_ID,album_ID and slideshow_ID. It defines the viewing type and start image
	 * @option {Object} classes object CSS selectors to get DOM node references
	 * @author MPE
	 * @memberOf oSolar.c.products
	 */
	initialize: function(el,options){
		this.setOptions(options);
		this.element = $(el);
		var oJSONReq = new Request.JSON({url: this.options.dataJSONUrl, onSuccess: this.initializeAfterLoad.bind(this), encoding: 'UTF-8'});
		oJSONReq.get();
	},
	initializeAfterLoad: function(data,str){
		this.data = data;
		
		this.images = new Hash(this.data.IMAGES); 
		this.firstRun = false;
		
		this.currImage = this.options.startWith.image_ID;
		this.currAlbum = this.options.startWith.album_ID;
		this.currSlideshow = this.options.startWith.slideshow_ID;
		this.type = 'image';
		if(this.options.startWith.album_ID){
			this.type = 'album';
		}
		if(this.options.startWith.slideshow_ID){
			this.type = 'slideshow';
		}
		
		this.images.each(function(image,key){
			image.assetThumb = new Asset.image(this.options.relpathToImages + image.VERSIONS[this.options.versionKey.thumb].PATH);
			image.assetBig = new Asset.image(this.options.relpathToImages + image.VERSIONS[this.options.versionKey.big].PATH);
		},this);
		
		this.elBigImgWrp = this.element.getElement(this.options.classes.bigImageWrp);
		this.elImgText = this.element.getElement(this.options.classes.imgText);
		if(this.elBigImgWrp){
			this._setImageLink();
			this.elBigImgWrp.addEvent('mouseenter',this.stopAutoNext.bind(this,'mouseenter'));
			this.elBigImgWrp.addEvent('mouseleave',this.resetAutoNext.bind(this,'mouseleave'));
			
			this.elBigImg = this.element.getElement(this.options.classes.bigImageWrp + ' img');
			this.elBigImgTxt = this.element.getElement(this.options.classes.bigImageWrp + ' ' + this.options.classes.imgText +'Txt');
			this.elBigImgWrp.set('tween', {link:'chain',duration: (this.options.fadeduration/2).toInt()});
			
			this.element.getElements('.imageswitch , .albumswitch').each(function(element,idx){
				var oElData = JSON.decode(element.get('rel'));
				if(element.hasClass('albumswitch')){
					this.data.ALBUMS[oElData.album_ID].button = element;
					element.addEvent('click',this.open.bind(this,{'album_ID':oElData.album_ID}));
				}
				if(element.hasClass('imageswitch')){
					this.data.IMAGES[oElData.image_ID].button = element;
					element.addEvent('click',this.open.bind(this,{'image_ID':oElData.image_ID}));
				}
			},this);
		}
		if(this.type != 'image'){
			this.showAlbum(this.currAlbum);
		}else{
			this.showImage(this.currImage, false);
		}
		
		oSolar.events.addEvent('lightboxOpen',this.stopAutoNext.bind(this,'lightboxOpen'));
		oSolar.events.addEvent('lightboxClose',this.resetAutoNext.bind(this,'lightboxClose'));
		
		this.startAutoNext();
	},
	stopAutoNext: function stopAutoNext(){
		$clear(this.periodic);
	},
	startAutoNext: function(){
		this.periodic = this.next.delay(this.options.automaticnext,this);
	},
	resetAutoNext: function(){
		this.stopAutoNext();
		this.startAutoNext();
	},
	/**
	 * Mootools standard function to retrieve the main widget element  
	 * @member oSolar.c.products.Gallery
	 * @author MPE
	 */
	toElement: function(){
		return this.el;
	},
	/**
	 * open a special image 
	 * @member oSolar.c.products.Gallery
	 * @param {Object} oSetIds Object with image, album or slideshow id  
	 * @author MPE
	 */
	open : function(oSetIds){
		oSetIds = $merge({'image_ID':0,'album_ID':0,'slideshow_ID':0},oSetIds);
		if(oSetIds.slideshow_ID){
			this.currSlideshow = oSetIds.slideshow_ID;
			this.showSlideshow(oSetIds.slideshow_ID);
			oSetIds.album_ID = this.data.SLIDESHOWS[this.currSlideshow].ALBUMS.getFistValue();
		}
		if(oSetIds.album_ID){
			if(this.currAlbum != oSetIds.album_ID){
				this.currAlbum = oSetIds.album_ID;
				this.showAlbum(oSetIds.album_ID);
				var aImages = this.data.ALBUMS[oSetIds.album_ID].IMAGES;
				oSetIds.image_ID = aImages[0];
			}else{
				this.next();
			}
		}
		if(oSetIds.image_ID){
			this.currImage = oSetIds.image_ID;
			this.showImage(oSetIds.image_ID);
		}
	},
	/**
	 * show slideshow and/or set it to active
	 * @member oSolar.c.products.Gallery
	 * @param {Numeric} slideshow_ID Id of slideshow to show  
	 * @author MPE
	 */
	showSlideshow : function(slideshow_ID){
	},
	/**
	 * show album and/or set it to active
	 * @member oSolar.c.products.Gallery
	 * @param {Numeric} album_ID Id of album to show  
	 * @author MPE
	 */
	showAlbum : function(album_ID){
		for(var iAlbum_ID in this.data.ALBUMS){
			if(this.data.ALBUMS[iAlbum_ID].button){
				if(iAlbum_ID != album_ID){
					this.data.ALBUMS[iAlbum_ID].button.tween('opacity', this.options.albumOpacityOff);
				}else{
					this.data.ALBUMS[iAlbum_ID].button.tween('opacity', 1);
				}
			}
		}
		
	},
	/**
	 * show image and/or set it to active
	 * @member oSolar.c.products.Gallery
	 * @param {Numeric} image_ID Id of album to show  
	 * @author MPE
	 */
	showImage : function(image_ID,bUpdateBigImage){
		bUpdateBigImage = this.def(bUpdateBigImage,true);
		for(var iImage_ID in this.data.IMAGES){
			if(this.data.IMAGES[iImage_ID].button){
				
				if(this.data.IMAGES[iImage_ID].button != this.data.IMAGES[image_ID].button){
					this.data.IMAGES[iImage_ID].button.tween('opacity', this.options.albumOpacityOff);
				}else{
					this.data.IMAGES[iImage_ID].button.tween('opacity', 1);
				}
			}
		}
		if(bUpdateBigImage)
			this._fadeBigImage(this.data.IMAGES[image_ID].assetBig,this.data.IMAGES[image_ID].DESCRIPTION);
	},
	/**
	 * change big image to next image  
	 * @member oSolar.c.products.Gallery
	 * @author MPE
	 */
	next : function(){
		this.stopAutoNext();
		var bLastImage=false;
		var bLastAlbum=false;
		var oldImage = this.currImage;
		var oldAlbum = this.currAlbum;
		var oldSlideshow = this.currSlideshow;
		var newAnchor = null;
		
		// get respectively the next image, album, slideshow
		if(this.type != 'image'){
			if(this.data.ALBUMS[this.currAlbum].IMAGES.isLast(this.currImage)){
				bLastImage = true;
			}
			if(bLastImage){
				
				if(this.type == 'slideshow'){
					if(this.data.SLIDESHOWS[this.currSlideshow].ALBUMS.isLast(this.currAlbum)){
						bLastAlbum = true;
					}
					this.currAlbum = this.data.SLIDESHOWS[this.currSlideshow].ALBUMS.getNextValue(this.currAlbum);
				}else{
					this.currAlbum = this.data.ALBUMSSORTING.getNextValue(this.currAlbum);
				}
			}
			if(this.type == 'slideshow'){
				if(bLastAlbum){
					this.currSlideshow = this.data.SLIDESHOWSSORTING.getNextValue(this.currSlideshow);
				}
			}
			this.currImage = this.data.ALBUMS[this.currAlbum].IMAGES.getNextValue(this.currImage);
		}else{
			if(this.firstRun && this.options.startImgId && this.data.IMAGESSORTING.indexOf(this.options.startImgId) >= 0){
				this.currImage = this.options.startImgId;
			}else{
				this.currImage = this.data.IMAGESSORTING.getNextValue(this.currImage);
			}
		}
		if(oldSlideshow != this.currSlideshow){
			this.showSlidshow(this.currSlideshow);
		}
		if(oldAlbum != this.currAlbum){
			this.showAlbum(this.currAlbum);
			this._setImageLink();
		}
		if(oldImage != this.currImage){
			this.showImage(this.currImage);
		}
		this.firstRun = false;
	},
	_fadeBigImage: function(newImage,newDesc){
		var textfadeopacity = this.options.textfadeopacity;
		var textfadedelay = this.options.textfadedelay;
		var eldesc = this.elBigImgTxt;
		var elImg = this.elBigImg;
		//eldesc.fade('out').get('tween').chain((function(desc){this.getElement('.imgdescTxt').set('html',desc);}).pass(newDesc,eldesc));
		this.elBigImgWrp.fade('out').get('tween').chain(
			 function(){elImg.set('src',newImage.get('src'));eldesc.set('html',newDesc);this.callChain();}
			,function(){ this.element.fade('in');}
			//,function(){ eldesc.fade.delay(textfadedelay,eldesc,textfadeopacity);}
		);
		this.resetAutoNext();
	},
	_setImageLink: function(){
		this.elBigImgWrp.removeEvents('click');
		if(this.options.viewmode > 0){
			if($defined(this.data.ALBUMS[this.currAlbum]) && this.data.ALBUMS[this.currAlbum].PAGELINK_INT.length){
				//this.elBigImgWrp.addEvent('click',(function(){document.location.href = this.options.relpath + this.data.ALBUMS[this.currAlbum].PAGELINK_INT}).bind(this));
				this.elBigImgWrp.addEvent('click',(function(){
					var iPageID = 0; 
					iPageID = this.data.ALBUMS[this.currAlbum].PAGELINK_INT.match(/[0-9]{3,}/);
					contensActPage('openpage',iPageID[0],{linktype:1,params:{startimage:this.currImage}});}).bind(this));
			}else{
				this.elBigImgWrp.addEvent('click',this.next.bind(this));
			}			
		} else {
			if($defined(this.data.ALBUMS[this.currAlbum]) && this.data.ALBUMS[this.currAlbum].PAGELINK.length){
				this.elBigImgWrp.addEvent('click',(function(){document.location.href = this.options.relpath + this.data.ALBUMS[this.currAlbum].PAGELINK + '?startimage='+this.currImage}).bind(this));
			}else{
				this.elBigImgWrp.addEvent('click',this.next.bind(this));
			}	
		}
	}
});
oSolar.c.products.Gallery.Scroller = new Class({
	Extends: oSolar.c.products.Gallery,
	options:{
		scroller:{
			itemWidth:70,
			itemMargin:5,
			iElementCount:0,
			iElementsShown:5
		}
	},
	initialize: function(el,data,options){
		this.setOptions(options);
		this.element = $(el);
		this.scroller = {
			Wrp:this.element.getElement('.scrollerWrp'),
			Cont:this.element.getElement('.scrollerCont')
		};
		
		/*
		this.scrollerSizes = {
			xWrp:this.scroller.Wrp.getSize().x,
			xCont:this.scroller.Cont.getSize().x,
			xMaxTr: (this.options.scroller.iElementCount-this.options.scroller.iElementsShown)+(this.options.scroller.iElementsShown/2),
			xPadMid:(this.scroller.Wrp.getSize().x/2-(this.options.scroller.itemWidth+this.options.scroller.itemMargin)/2).toInt()
		};
		*/
		
		this.parent(el,data,options);
		/* mra - set scrollerSizes after this.parent() */
		this.scrollerSizes = {
			xWrp:this.scroller.Wrp.getSize().x,
			xCont:this.scroller.Cont.getSize().x,
			xMaxTr: (this.options.scroller.iElementCount-this.options.scroller.iElementsShown)+(this.options.scroller.iElementsShown/2),
			xPadMid:(this.scroller.Wrp.getSize().x/2-(this.options.scroller.itemWidth+this.options.scroller.itemMargin)/2).toInt()
		};
		
	},
	/**
	 * show album and/or set it to active
	 * @member oSolar.c.products.Gallery
	 * @param {Numeric} album_ID Id of album to show  
	 * @author MPE
	 */
	showAlbum : function(album_ID){
		this.parent(album_ID);
		if(this.type == 'album'){
			var btt = this.data.ALBUMS[album_ID].button;
			var idx = this.data.ALBUMSSORTING.indexOf(album_ID);
			this.scrollTo(idx);
		}
	},
	showImage : function(image_ID,bUpdateBigImage){
		this.parent(image_ID,bUpdateBigImage);
		if(this.type == 'image'){
			var btt = this.data.IMAGES[image_ID].button;
			var idx = this.data.IMAGESSORTING.indexOf(image_ID);
			this.scrollTo(idx);
		}
	},
	scrollTo : function(idx){
		var bEnd = false;
		if(idx+1 > this.scrollerSizes.xMaxTr ){
			idx = this.scrollerSizes.xMaxTr;
			bEnd = true;
		}
		var iMove = idx*this.options.scroller.itemWidth + idx*this.options.scroller.itemMargin;
		if(bEnd){
			iMove = this.scrollerSizes.xCont-this.scrollerSizes.xWrp;
		}else if(iMove-this.scrollerSizes.xPadMid > 0){
			iMove = iMove-this.scrollerSizes.xPadMid;
		}else{
			iMove = 0;
		}
		this.scroller.Cont.tween('margin-left',iMove*-1);
	},
	move: function(dir){
		var iCurrScroll = this.scroller.Cont.getStyle('margin-left').toInt();
		var itemWidth = (this.options.scroller.itemWidth+this.options.scroller.itemMargin);
		var iNewScroll = iCurrScroll + dir*itemWidth;
		var iMaxScroll = (this.scrollerSizes.xCont-this.scrollerSizes.xWrp)*-1;
		if( iNewScroll > -5 ){
			iNewScroll = 0;
		}
		if( iNewScroll < iMaxScroll ){
			iNewScroll = iMaxScroll
		}
		this.scroller.Cont.tween('margin-left',iNewScroll);
	}
});



/*
 *
 * Only Used for internal Functions
 * 
 */

oSolar.c.Tagging = new Class(
	/** @lends oSolar.c.Tagging.prototype */
	{
	Implements: [Options,Events,Defined],
	options:{
		remote:{
		},
		classes:{
			classExtension:null
		},
		aElsToHide:[]
	},
	/**
	 * Tagging Widget to convert a input field to a tagging field in facebook-style 
	 * @constructs
	 * @param {Element|String} el Id-String or HTML Element which will be converted 
	 * @param {Object} options Behavoir options for Tagging-Widget
	 * @option {Element[]} aElsToHide Array of Elements that will be hidden on init
	 * @author MPE
	 * @memberOf msa.c.Tagging
	 */
	initialize: function(el,options){
		this.setOptions(options);
		this.el = $(el);
		
		this.tags = new Array();
		this.tagEls = new Array();
		
		var aTags = this.readTagsFromValue();
		// generate elements
		this.elWrp = new Element('DIV',{'class':'taggingWrp'}).inject(this.el,'before');
		if($defined(this.preInit)){
			this.preInit();
		}
		new Element('DIV',{'class':'clear'}).inject(this.elWrp);

		if(this.options.classes.classExtension){
			this.elWrp.addClass(this.options.classes.classExtension);
		}
		
		// hide std. form element
		this.el.hide();
		for(var idxEls = 0; idxEls < this.options.aElsToHide.length; idxEls++ ){
			$(this.options.aElsToHide[idxEls]).hide();
		}
		
		aTags.each(function(tag){
			this.add(tag,false);
		},this);
		this.el.store('tagging',this);
	},
	/**
	 * clear tagging and reload the data from the formfield  
	 * @member msa.c.Tagging
	 * @author MPE
	 */
	reinit: function(aTags){
		this.clear();
		aTags = this.def(aTags,this.readTagsFromValue());
		if($defined(aTags)){
			for(var idxTags = 0; idxTags < aTags.length; idxTags++ ){
				this.add(aTags[idxTags],false);
			}
		}
	},
	/**
	 * read input value and convert it to a Array of tags  
	 * @member msa.c.Tagging
	 * @return {Array} Tags from input
	 * @type Array
	 * @author MPE
	 */
	readTagsFromValue: function(){
		var aTags = new Array();
		var sValue = this.el.get('value');
		if(sValue){
			if(new String(sValue).contains('[')){
				aTags = eval('([' + sValue + '])');
			}else{
				aTags = sValue.split(',');
			}
		}
		return aTags;
	},
	/**
	 * add a Element to the Tagging field
	 * @param {String} sText Text to add to the tagging
	 * @param {Number} [id] ID as Number to use as form value. If not defined the sText is used  
	 * @member msa.c.Tagging
	 * @author MPE
	 */
	add: function(){
		var params = Array.link(Array.flatten(arguments), {id: Number.type, sText: String.type});
		var sText = params.sText.trim();
		var elTagWrp;
		if($defined(params.id)){
			var id = params.id;
		}else{
			var id = sText;
		}
		if(this.tags.indexOf(id) < 0){
			elTagWrp = new Element('DIV',{'class':'tag'});
			elTagWrp.inject(this.elWrp.getElement('input, .clear'),'before');
			new Element('DIV',{'class':'close'}).inject(elTagWrp).addEvent('click',this.remove.bind(this,[id,elTagWrp]));
			new Element('SPAN',{'class':'title','text':unescape(sText)}).inject(elTagWrp);
			this.tags.push(id);
			this.tagEls.push(elTagWrp);
			this.write();
			this.fireEvent('addDone');
		}else{
			elTagWrp = this.tagEls[this.tags.indexOf(id)];
			elTagWrp.blink('#FF575A',1000);
		}
		return {'element':elTagWrp,'id':id};
	},
	/**
	 * clear the Tagging field. All elements and data will be removed
	 * @member msa.c.Tagging
	 * @author MPE
	 */
	clear: function(){
		this.tags = new Array();
		for(var idx = 0;idx < this.tagEls.length; idx++){
			try{
			this.tagEls[idx].destroy();
			}catch(e){}
		}
	},
	/**
	 * remove a element form the Tagging field.
	 * @param {String} [sText] Text of tag to remove. If not passed the param "id" hat to be passed.
	 * @param {Number} [id] ID as Number of the tag to remove. If not passed the param "sText" hat to be passed.
	 * @param {Element} [tag] Element that will be removed
	 * @member msa.c.Tagging
	 * @author MPE
	 */
	remove: function(){
		var params = Array.link(Array.flatten(arguments), {id: Number.type, sText: String.type, tag: Element.type});
		
		if($defined(params.sText)){
			var sText = params.sText.trim();
		}
		if($defined(params.id)){
			var id = params.id;
			
		}else{
			var id = sText;
		}
		if(!$defined(params.tag))params.tag = this.tagEls[this.tags.indexOf(params.id)];
		$(params.tag).destroy();
		this.tags.erase(id);
		this.tagEls.erase(params.tag);
		this.write();
	},
	/**
	 * write the tag-values to the hidden form-field 
	 * @member msa.c.Tagging
	 * @author MPE
	 */
	write: function(){
		this.el.set('value',this.tags);
	},
	/**
	 * retrieve a array of tag values
	 * @member msa.c.Tagging
	 * @return {Array} Tag values currently placed in tagging field
	 * @type Array
	 * @author MPE
	 */
	getTags: function(){
		return this.tags;
	},
	/**
	 * retrieve a array of tag values
	 * @member msa.c.Tagging
	 * @param {String|Number} id The id to search for.  
	 * @return {Object} a Object with the structure element and id.
	 * @type Object
	 * @author MPE
	 */
	getTagById: function(id){
		var idx = this.tags.indexOf(id);
		if(idx > -1){
			return {'id':id,'element':this.tagEls[idx]};
		}else{
			return null;
		}
	}
});

/**************************************************************

Script		: multiBox
Version		: 1.4
Authors		: Samuel Birch
Desc		: Supports jpg, gif, png, flash, flv, mov, wmv, mp3, html, iframe
Licence		: Open Source MIT Licence


**************************************************************/

var multiBox = new Class({
	Implements:[Options,Events],
	getOptions: function(){
		return {
			initialWidth: 250,
			initialHeight: 250,
			container: document.body, //this will need to be setup to the box open in relation to this.
			overlay: false, //this will be a reference to an overlay instance. - TODO: implement below.
			contentColor: '#FFF',
			showNumbers: true,
			showControls: true,
			//showThumbnails: false,
			//autoPlay: false,
			//waitDuration: 2000,
			descClassName: false,
			descMinWidth: 400,
			descMaxWidth: 600,
			movieWidth: 400,
			movieHeight: 300,
			offset: {x:0, y:0},
			fixedTop: false,
			path: 'files/',
			_onOpen: (function(){oSolar.events.fireEvent('lightboxOpen');}),
			_onClose: (function(){oSolar.events.fireEvent('lightboxClose');}),
			openFromLink: true
			//relativeToWindow: true
		};
	},
	
	initialize: function(className, options){
		this.setOptions(this.getOptions(), options);
		
		this.openClosePos = {};
		this.timer = 0;
		this.contentToLoad = {};
		this.index = 0;
		this.opened = false;
		this.contentObj = {};
		this.containerDefaults = {};
		this.createArray = [];
		
		if(this.options.useOverlay){
			this.overlay = new Overlay({container: this.options.container, onClick:this.close.bind(this)});
		}
		this.overlay = this.options.overlay;
		if(this.overlay){
			this.overlay.setOnClick(this.close.bind(this));
		}
		
		if($type(className) == 'string'){
			this.content = $$('.'+className);
		}else if($type(className) == 'collection' || $type(className) == 'array'){
			this.content = className;
		}
		if(this.options.descClassName){
			this.descriptions = $$('.'+this.options.descClassName);
			this.descriptions.each(function(el){
				el.setStyle('display', 'none');
			});
		}
		
		this.container = new Element('div').addClass('MultiBoxContainer').injectInside(this.options.container);
		this.iframe = new Element('iframe').setProperties({
			'id': 'multiBoxIframe',
			'name': 'mulitBoxIframe',
			'src': 'javascript:void(0);',
			'frameborder': 0,
			'scrolling': 'no'
		}).setStyles({
			'position': 'absolute',
			'top': -20,
			'left': -20,
			'filter': 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)',
			'opacity': 0
		}).inject(this.container);
		this.box = new Element('div').addClass('MultiBoxContent').inject(this.container);
		
		this.closeButton = new Element('div').addClass('MultiBoxClose').inject(this.container).addEvent('click', this.close.bind(this));
		
		this.controlsContainer = new Element('div').addClass('MultiBoxControlsContainer').inject(this.container);
		this.controls = new Element('div').addClass('MultiBoxControls').inject(this.controlsContainer);
		
		this.previousButton = new Element('div').addClass('MultiBoxPrevious').inject(this.controls).addEvent('click', this.previous.bind(this));
		this.nextButton = new Element('div').addClass('MultiBoxNext').inject(this.controls).addEvent('click', this.next.bind(this));
		
		this.title = new Element('div').addClass('MultiBoxTitle').inject(this.controls);
		this.titleMargin = this.title.getStyle('margin-left');
		this.number = new Element('div').addClass('MultiBoxNumber').inject(this.controls);
		this.description = new Element('div').addClass('MultiBoxDescription').inject(this.controls);
		
		
		
		if(this.content.length == 1){
			this.title.setStyles({
				'margin-left': 0
			});
			this.description.setStyles({
				'margin-left': 0
			});
			this.previousButton.setStyle('display', 'none');
			this.nextButton.setStyle('display', 'none');
			this.number.setStyle('display', 'none');
		}
		
		new Element('div').setStyle('clear', 'both').inject(this.controls);
		
		this.content.each(function(el,i){
			el.index = i;
			el.addEvent('click', function(e){
				new Event(e).stop();
				this.open(el);
			}.bind(this));
			if(el.href.indexOf('#') > -1){
				el.content = $(el.href.substr(el.href.indexOf('#')+1));
				if(el.content){el.content.setStyle('display','none');}
			}
		}, this);
		
		this.containerEffects = new Fx.Morph(this.container, {duration: 400, transition: Fx.Transitions.Sine.easeInOut});
		this.iframeEffects = new Fx.Morph(this.iframe, {duration: 400, transition: Fx.Transitions.Sine.easeInOut});
		this.controlEffects = new Fx.Morph(this.controlsContainer, {duration: 300, transition: Fx.Transitions.Sine.easeInOut});
		
		this.reset();
	},
	
	setContentType: function(link){
		var str = link.href.substr(link.href.lastIndexOf('.')+1).toLowerCase();
		var contentOptions = {};
		if($chk(link.rel)){
			var optArr = link.rel.split(',');
			optArr.each(function(el){
				var ta = el.split(':');
				contentOptions[ta[0]] = ta[1];
			});
		}
		
		if(contentOptions.type != undefined){
			str = contentOptions.type;
		}
		
		this.contentObj = {};
		this.contentObj.url = link.href;
		this.contentObj.src = link.href;
		this.contentObj.xH = 0;
		
		if(contentOptions.width){
			this.contentObj.width = contentOptions.width;
		}else{
			this.contentObj.width = this.options.movieWidth;
		}
		if(contentOptions.height){
			this.contentObj.height = contentOptions.height;	
		}else{
			this.contentObj.height = this.options.movieHeight;
		}
		if(contentOptions.panel){
			this.panelPosition = contentOptions.panel;
		}else{
			this.panelPosition = this.options.panel;
		}
		
		switch(str){
			case 'jpg':
			case 'image':
			case 'gif':
			case 'png':
				this.type = 'image';
				break;
			case 'swf':
				this.type = 'flash';
				break;
			case 'youtube':
				this.type = 'youtube';
				break;
			case 'flv':
				this.type = 'flashVideo';
				this.contentObj.xH = 70;
				break;
			case 'mov':
				this.type = 'quicktime';
				break;
			case 'wmv':
				this.type = 'windowsMedia';
				break;
			case 'rv':
			case 'rm':
			case 'rmvb':
				this.type = 'real';
				break;
			case 'mp3':
				this.type = 'flashMp3';
				this.contentObj.width = 320;
				this.contentObj.height = 70;
				break;
			case 'element':
				this.type = 'htmlelement';
				this.elementContent = link.content;
				this.elementContent.setStyles({
					display: 'block',
					opacity: 0
				});
	
				if(this.elementContent.getStyle('width') != 'auto'){
					this.contentObj.width = this.elementContent.getStyle('width');
				}
				
				this.contentObj.height = this.elementContent.getSize().y;
				this.elementContent.setStyles({
					display: 'none',
					opacity: 1
				});
				break;
				
			default:
				
				this.type = 'iframe';
				if(contentOptions.ajax){
					this.type = 'ajax';
				}
				break;
		}
	},
	
	reset: function(){
		this.container.setStyles({
			'opacity': 0,
			'display': 'none'
		});
		this.controlsContainer.setStyles({
			'height': 0
		});
		this.removeContent();
		this.previousButton.removeClass('MultiBoxButtonDisabled');
		this.nextButton.removeClass('MultiBoxButtonDisabled');
		this.opened = false;
	},
	
	getOpenClosePos: function(el){
		if (this.options.openFromLink) {
			if (el.getFirst()) {
				var w = el.getFirst().getCoordinates().width - (this.container.getStyle('border').toInt() * 2);
				if (w < 0) {
					w = 0
				}
				var h = el.getFirst().getCoordinates().height - (this.container.getStyle('border').toInt() * 2);
				if (h < 0) {
					h = 0
				}
				this.openClosePos = {
					width: w,
					height: h,
					top: el.getFirst().getCoordinates().top,
					left: el.getFirst().getCoordinates().left
				};
			}
			else {
				var w = el.getCoordinates().width - (this.container.getStyle('border').toInt() * 2);
				if (w < 0) {
					w = 0
				}
				var h = el.getCoordinates().height - (this.container.getStyle('border').toInt() * 2);
				if (h < 0) {
					h = 0
				}
				this.openClosePos = {
					width: w,
					height: h,
					top: el.getCoordinates().top,
					left: el.getCoordinates().left
				};
			}
		}else{
			var border = this.container.getStyle('border').toInt();
			
			if(this.options.fixedTop){
				var top = this.options.fixedTop;
			}else{
				var top = ((window.getHeight()/2)-(this.options.initialHeight/2) - border)+this.options.offset.y;
			}
			this.openClosePos = {
				width: this.options.initialWidth,
				height: this.options.initialHeight,
				top: top,
				left: ((window.getWidth()/2)-(this.options.initialWidth/2)-border)+this.options.offset.x
			};
		}
		return this.openClosePos;
	},
	
	open: function(el){
		this.options._onOpen();
	
		this.index = this.content.indexOf(el);
		
		this.openId = el.getProperty('id');
		
		var border = this.container.getStyle('border').toInt();
		
		if(!this.opened){
			this.opened = true;
			
			if(this.options.overlay){
				this.overlay.show();
			}
	
			this.container.setStyles(this.getOpenClosePos(el));
			this.container.setStyles({
				opacity: 0,
				display: 'block'
			});
			
			if(this.options.fixedTop){
				var top = this.options.fixedTop;
			}else{
				var top = ((window.getHeight()/2)-(this.options.initialHeight/2) - border)+this.options.offset.y;
			}
			
			
			this.containerEffects.start({
				width: this.options.initialWidth,
				height: this.options.initialHeight,
				top: top,
				left: ((window.getWidth()/2)-(this.options.initialWidth/2)-border)+this.options.offset.x,
				opacity: [0, 1]
			});
			
			this.load(this.index);
		
		}else{
			if (this.options.showControls) {
				this.hideControls();
			}
			this.getOpenClosePos(this.content[this.index]);
			this.timer = this.hideContent.bind(this).delay(500);
			this.timer = this.load.pass(this.index, this).delay(1100);
			
		}
		
	},
	
	create: function(obj){
		/*
		obj = {
			url: 'myurl',  *
			title: 'my title',
			description: 'my description',
			type: 'image',
			width: 400,
			height: 300
		}
		*/
		if(this.createArray.contains(obj.url)){
			var index = this.createArray.indexOf(obj.url);
			var a = this.content[index];
		}else{
			
			var id = 'mbDirect_' + $time();
			var rel = [];
			if(obj.type){rel.push('type:'+obj.type)}
			if(obj.width){rel.push('width:'+obj.width)}
			if(obj.height){rel.push('height:'+obj.height)}
			
			var a = new Element('a', {
				'href': obj.url,
				'id': id,
				'title': obj.title || '',
				'rel': rel.join(',')
			});
			var desc = new Element('div', {
				'class': id,
				'html': obj.description || ''
			})
		
			this.createArray.push(obj.url);
			this.content.push(a);
			var index = this.content.length-1;
			
			if(this.options.descClassName){
				this.descriptions.include(desc);
			}
		}
		this.open(a);
	},
	
	getContent: function(index){
		this.setContentType(this.content[index]);
		var desc = false;
		if(this.options.descClassName){
		this.descriptions.each(function(el,i){
			if(el.hasClass(this.openId)){
				desc = el.clone();
			}
		},this);
		}
		this.contentToLoad = {
			title: this.content[index].title || '&nbsp;',
			desc: desc,
			number: index+1
		};
	},
	
	close: function(){
		if(this.options.overlay){
			this.overlay.hide();
		}
		if (this.options.showControls) {
			this.hideControls();
		}
		this.hideContent();
		this.containerEffects.cancel();
		this.zoomOut.bind(this).delay(500);
		this.options._onClose();
	},
	
	zoomOut: function(){
		this.iframeEffects.start({
			width: this.openClosePos.width,
			height: this.openClosePos.height
		});
		this.containerEffects.start({
			width: this.openClosePos.width,
			height: this.openClosePos.height,
			top: this.openClosePos.top,
			left: this.openClosePos.left,
			opacity: 0
		});
		this.reset.bind(this).delay(500);
	},
	
	load: function(index){
		this.box.addClass('MultiBoxLoading');
		this.getContent(index);
		if(this.type == 'image'){
			var xH = this.contentObj.xH;
			this.contentObj = new Asset.image(this.content[index].href, {onload: this.resize.bind(this)});
			this.contentObj.xH = xH;
		}else{
			this.resize();
		}
	},
	
	resize: function(){
		if(this.tempSRC != this.contentObj.src){
			
			var border = this.container.getStyle('border').toInt();
			
			if (this.options.fixedTop) {
				var top = this.options.fixedTop;
			}
			else {
				var top = ((window.getHeight() / 2) - ((Number(this.contentObj.height) + this.contentObj.xH) / 2) - border + window.getScrollTop()) + this.options.offset.y;
			}
			var left = ((window.getWidth() / 2) - (this.contentObj.width.toInt() / 2) - border) + this.options.offset.x;
			if (top < 0) {
				top = 0
			}
			if (left < 0) {
				left = 0
			}
			
			this.containerEffects.cancel();
			this.containerEffects.start({
				width: this.contentObj.width,
				height: Number(this.contentObj.height) + this.contentObj.xH,
				top: top,
				left: left,
				opacity: 1
			});
			this.iframeEffects.start({
				width: Number(this.contentObj.width) + (border*2),
				height: Number(this.contentObj.height) + this.contentObj.xH + (border*2)
			});
			this.timer = this.showContent.bind(this).delay(500);
			this.tempSRC = this.contentObj.src;
		}
	},
	
	showContent: function(){
		this.tempSRC = '';
		this.box.removeClass('MultiBoxLoading');
		this.removeContent();
		
		this.contentContainer = new Element('div').setProperties({id: 'MultiBoxContentContainer'}).setStyles({opacity: 0, width: this.contentObj.width, height: (Number(this.contentObj.height)+this.contentObj.xH)}).injectInside(this.box);
		
		if(this.type == 'image'){
			this.contentObj.injectInside(this.contentContainer);
			
		}else if(this.type == 'iframe'){
			new Element('iframe').setProperties({
				id: 'iFrame'+new Date().getTime(), 
				width: this.contentObj.width,
				height: this.contentObj.height,
				src: this.contentObj.url,
				frameborder: 0,
				scrolling: 'auto'
			}).injectInside(this.contentContainer);
			
		}else if(this.type == 'htmlelement'){
			this.elementContent.clone().setStyle('display','block').injectInside(this.contentContainer);
			
		}else if(this.type == 'ajax'){
			new Request.HTML({
				update: $('MultiBoxContentContainer'),
				autoCancel: true
			}).get(this.contentObj.url);
			
		}else{
			var obj = this.createEmbedObject().injectInside(this.contentContainer);
			if(this.str != ''){
				$('MultiBoxMediaObject').innerHTML = this.str;
			}
		}
		
		this.contentEffects = new Fx.Morph(this.contentContainer, {duration: 500, transition: Fx.Transitions.linear});
		this.contentEffects.start({
			opacity: 1
		});
		
		this.title.set('html', this.contentToLoad.title);
		if(this.content.length > 1){
			this.number.set('html', this.contentToLoad.number+' / '+this.content.length);
		}else{
			this.number.set('html','');
		}
		if (this.options.descClassName) {
			if (this.description.getFirst()) {
				this.description.getFirst().destroy();
			}
			if(this.contentToLoad.desc){
				this.contentToLoad.desc.inject(this.description).setStyles({
					display: 'block'
				});
			}
		}
		//this.removeContent.bind(this).delay(500);
		if (this.options.showControls) {
			if(this.contentToLoad.title != '&nbsp;' || this.content.length > 1){
				this.timer = this.showControls.bind(this).delay(800);
			}
		}
	},
	
	hideContent: function(){
		this.box.addClass('MultiBoxLoading');
		this.contentEffects.start({
			opacity: 0
		});
		this.removeContent.bind(this).delay(500);
	},
	
	removeContent: function(){
		if($('MultiBoxMediaObject')){
			$('MultiBoxMediaObject').empty();
			$('MultiBoxMediaObject').destroy();
		}
		if($('MultiBoxContentContainer')){
			//$('MultiBoxContentContainer').empty();
			$('MultiBoxContentContainer').destroy();	
		}
	},
	
	showControls: function(){
		this.clicked = false;
		
		if(this.container.getStyle('height') != 'auto'){
			this.containerDefaults.height = this.container.getStyle('height')
			this.containerDefaults.backgroundColor = this.options.contentColor;
		}
		
		this.container.setStyles({
			//'backgroundColor': this.controls.getStyle('backgroundColor'),
			'height': 'auto'
		});
		
		if(this.content.length > 1){
			this.previousButton.setStyle('visibility', 'visible');
			this.nextButton.setStyle('visibility', 'visible');
			this.title.setStyle('margin-left', this.titleMargin);
			
			if(this.contentToLoad.number == 1){
				this.previousButton.addClass('MultiBoxPreviousDisabled');
			}else{
				this.previousButton.removeClass('MultiBoxPreviousDisabled');
			}
			if(this.contentToLoad.number == this.content.length){
				this.nextButton.addClass('MultiBoxNextDisabled');
			}else{
				this.nextButton.removeClass('MultiBoxNextDisabled');
			}
		}else{
			this.previousButton.setStyle('visibility', 'hidden');
			this.nextButton.setStyle('visibility', 'hidden');
			this.title.setStyle('margin-left', 0);
		}
		
		this.controlEffects.start({'height': this.controls.getCoordinates().height});
		this.iframeEffects.start({'height': this.iframe.getStyle('height').toInt()+this.controls.getStyle('height').toInt()});
		
		if(this.options.overlay){
			this.options.overlay.position();
		}
	
	},
	
	hideControls: function(num){
		this.iframeEffects.start({'height': this.iframe.getStyle('height').toInt()-this.controls.getStyle('height').toInt()});
		this.controlEffects.start({'height': 0}).chain(function(){
			this.container.setStyles(this.containerDefaults);
		}.bind(this));
	},
	
	showThumbnails: function(){
		
	},
	
	next: function(){
		if(this.index < this.content.length-1){
			this.index++;
			this.openId = this.content[this.index].getProperty('id');
			if (this.options.showControls) {
				this.hideControls();
			}
			this.getOpenClosePos(this.content[this.index]);
			//this.getContent(this.index);
			this.timer = this.hideContent.bind(this).delay(500);
			this.timer = this.load.pass(this.index, this).delay(1100);
		}
	},
	
	previous: function(){
		if(this.index > 0){
			this.index--;
			this.openId = this.content[this.index].getProperty('id');
			if (this.options.showControls) {
				this.hideControls();
			}
			this.getOpenClosePos(this.content[this.index]);
			//this.getContent(this.index);
			this.timer = this.hideContent.bind(this).delay(500);
			this.timer = this.load.pass(this.index, this).delay(1000);
		}
	},
	
	createEmbedObject: function(){
		if(this.type == 'flash'){
			var url = this.contentObj.url;
			
			var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});
			this.str = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" '
			this.str += 'width="'+this.contentObj.width+'" ';
			this.str += 'height="'+this.contentObj.height+'" ';
			this.str += 'title="MultiBoxMedia">';
				this.str += '<param name="movie" value="'+url+'" />'
				this.str += '<param name="quality" value="high" />';
				this.str += '<embed src="'+url+'" ';
				this.str += 'quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" ';
				this.str += 'width="'+this.contentObj.width+'" ';
				this.str += 'height="'+this.contentObj.height+'"></embed>';
			this.str += '</object>';
			
		}
		
		if(this.type == 'youtube'){
			var url = this.contentObj.url;
			
			var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});
			this.str = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" '
			this.str += 'width="'+this.contentObj.width+'" ';
			this.str += 'height="'+this.contentObj.height+'" ';
			this.str += 'title="MultiBoxMedia">';
				this.str += '<param name="movie" value="'+url+'" />'
				this.str += '<param name="quality" value="high" />';
				this.str += '<param name="allowFullScreen" value="true"></param>';
				this.str += '<embed src="'+url+'" ';
				this.str += 'quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" ';
				this.str += 'allowfullscreen="true" ';
				this.str += 'width="'+this.contentObj.width+'" ';
				this.str += 'height="'+this.contentObj.height+'"></embed>';
			this.str += '</object>';
			
		}
		
		if(this.type == 'flashVideo'){
			//var url = this.contentObj.url.substring(0, this.contentObj.url.lastIndexOf('.'));
			var url = this.contentObj.url;
			
			var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});
			this.str = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" '
			this.str += 'width="'+this.contentObj.width+'" ';
			this.str += 'height="'+(Number(this.contentObj.height)+this.contentObj.xH)+'" ';
			this.str += 'title="MultiBoxMedia">';
				this.str += '<param name="movie" value="'+this.options.path+'flvplayer.swf" />'
				this.str += '<param name="quality" value="high" />';
				this.str += '<param name="salign" value="TL" />';
				this.str += '<param name="scale" value="noScale" />';
				this.str += '<param name="FlashVars" value="path='+url+'" />';
				this.str += '<embed src="'+this.options.path+'flvplayer.swf" ';
				this.str += 'quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" ';
				this.str += 'width="'+this.contentObj.width+'" ';
				this.str += 'height="'+(Number(this.contentObj.height)+this.contentObj.xH)+'"';
				this.str += 'salign="TL" ';
				this.str += 'scale="noScale" ';
				this.str += 'FlashVars="path='+url+'"';
				this.str += '></embed>';
			this.str += '</object>';
			
		}
		
		if(this.type == 'flashMp3'){
			var url = this.contentObj.url;
			
			var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});
			this.str = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" '
			this.str += 'width="'+this.contentObj.width+'" ';
			this.str += 'height="'+this.contentObj.height+'" ';
			this.str += 'title="MultiBoxMedia">';
				this.str += '<param name="movie" value="'+this.options.path+'mp3player.swf" />'
				this.str += '<param name="quality" value="high" />';
				this.str += '<param name="salign" value="TL" />';
				this.str += '<param name="scale" value="noScale" />';
				this.str += '<param name="FlashVars" value="path='+url+'" />';
				this.str += '<embed src="'+this.options.path+'mp3player.swf" ';
				this.str += 'quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" ';
				this.str += 'width="'+this.contentObj.width+'" ';
				this.str += 'height="'+this.contentObj.height+'"';
				this.str += 'salign="TL" ';
				this.str += 'scale="noScale" ';
				this.str += 'FlashVars="path='+url+'"';
				this.str += '></embed>';
			this.str += '</object>';
		}
		
		if(this.type == 'quicktime'){
			var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});
			this.str = '<object  type="video/quicktime" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab"';
			this.str += ' width="'+this.contentObj.width+'" height="'+this.contentObj.height+'">';
			this.str += '<param name="src" value="'+this.contentObj.url+'" />';
			this.str += '<param name="autoplay" value="true" />';
			this.str += '<param name="controller" value="true" />';
			this.str += '<param name="enablejavascript" value="true" />';
			this.str += '<embed src="'+this.contentObj.url+'" autoplay="true" pluginspage="http://www.apple.com/quicktime/download/" width="'+this.contentObj.width+'" height="'+this.contentObj.height+'"></embed>';
			this.str += '<object/>';
			
		}
		
		if(this.type == 'windowsMedia'){
			var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});
			this.str = '<object  type="application/x-oleobject" classid="CLSID:22D6f312-B0F6-11D0-94AB-0080C74C7E95" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,7,1112"';
			this.str += ' width="'+this.contentObj.width+'" height="'+this.contentObj.height+'">';
			this.str += '<param name="filename" value="'+this.contentObj.url+'" />';
			this.str += '<param name="Showcontrols" value="true" />';
			this.str += '<param name="autoStart" value="true" />';
			this.str += '<embed type="application/x-mplayer2" src="'+this.contentObj.url+'" Showcontrols="true" autoStart="true" width="'+this.contentObj.width+'" height="'+this.contentObj.height+'"></embed>';
			this.str += '<object/>';
			
		}
		
		if(this.type == 'real'){
			var obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'});
			this.str = '<object classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"';
			this.str += ' width="'+this.contentObj.width+'" height="'+this.contentObj.height+'">';
			this.str += '<param name="src" value="'+this.contentObj.url+'" />';
			this.str += '<param name="controls" value="ImageWindow" />';
			this.str += '<param name="autostart" value="true" />';
			this.str += '<embed src="'+this.contentObj.url+'" controls="ImageWindow" autostart="true" width="'+this.contentObj.width+'" height="'+this.contentObj.height+'"></embed>';
			this.str += '<object/>';
			
		}
		
		return obj;
	}

});

/**************************************************************

Script		: overlay
Version		: 1.2
Authors		: Samuel birch
Desc		: Covers the window with a semi-transparent layer.
Licence		: Open Source MIT Licence

**************************************************************/

var overlay = new Class({
	Implements:[Options],
	getOptions: function(){
		return {
			colour: '#000',
			opacity: 0.7,
			zIndex: 10000,
			container: document.body,
			_onClick: $empty
		};
	},
	
	initialize: function(options){
		this.setOptions(this.getOptions(), options);
		
		this.options.container = $(this.options.container);
		
		this.container = new Element('div').setProperty('id', 'OverlayContainer').setStyles({
			position: 'absolute',
			left: '0px',
			top: '0px',
			width: '100%',
			zIndex: this.options.zIndex
		}).injectInside(this.options.container);
		
		this.iframe = new Element('iframe').setProperties({
			'id': 'OverlayIframe',
			'name': 'OverlayIframe',
			'src': 'javascript:void(0);',
			'frameborder': 0,
			'scrolling': 'no'
		}).setStyles({
			'position': 'absolute',
			'top': 0,
			'left': 0,
			'width': '100%',
			'height': '100%',
			'filter': 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)',
			'opacity': 0,
			'zIndex': 1
		}).injectInside(this.container);
		
		this.overlay = new Element('div').setProperty('id', 'Overlay').setStyles({
			position: 'absolute',
			left: '0px',
			top: '0px',
			width: '100%',
			height: '100%',
			zIndex: 2,
			backgroundColor: this.options.colour
		}).injectInside(this.container);
		
		if(this.options._onClick){
			this.container.addEvent('click', function(){
				this.options._onClick.call(this)
			}.bind(this));
		}
		
		//this.fade = new Fx.Tween(this.container).set('opacity', 0);
		this.container.fade('hide');
		this.position();
		
		window.addEvent('resize', this.position.bind(this));
	},
	
	setOnClick: function(func){
		this.container.addEvent('click', func);
	},
	
	position: function(){ 
		if(this.options.container == document.body){ 
			var h = window.getScrollHeight()+'px'; 
			this.container.setStyles({top: '0px', height: h}); 
		}else{ 
			var myCoords = this.options.container.getCoordinates(); 
			this.container.setStyles({
				top: myCoords.top+'px', 
				height: myCoords.height+'px', 
				left: myCoords.left+'px', 
				width: myCoords.width+'px'
			}); 
		} 
	},
	
	show: function(){
		//this.fade.start(0,this.options.opacity);
		this.container.fade(this.options.opacity);
	},
	
	hide: function(){
		//this.fade.start(this.options.opacity,0);
		this.container.fade('out');
	}

});

/*************************************************************/



oSolar.c.Form  = new Class({
	Implements: [Events, Options],
	options: {
		validation:{
			required:true
		}
	},
	initialize: function(el,options){
		this.setOptions(options);
		
		this.element = $(el);
		this.form_elements = new Hash(); 
		this.element.getElements('.input').each(function(el){
			var opt = JSON.decode(el.get('rel'));
			if(!opt){
				opt = {};
			}
			var title = opt.name;
			if(			el.hasClass('doorsform')){
				this.form_elements.set(title,new oSolar.c.Rating(this,{'el':el,'options':opt}));
			}else if(	el.hasClass('radiofrom')){
				this.form_elements.set(title,new oSolar.c.Radio(this,{'el':el,'options':opt}));
			}
		},this);
		
		this.element.addEvent('submit',this.validate.bind(this));
	},
	validate: function(evnt){
		new Event(evnt).stop();
		oSolar.events.fireEvent('form.submit');
		this.fireEvent('submit.start');
		var bValid = this.form_elements.every(function(input, key){
		    return input.valid;
		});
		
		if(!bValid){
			this.fireEvent('submit.error');
			alert('Bitte pr?fen Sie das Formular');
		}else{
			this.fireEvent('submit.success');
		}
		return bValid;
	},
	getData: function(){
		var oReturn = {};
		this.form_elements.each(function(oObj,key){
			oReturn[key] = oObj.getValue();
		});
		return oReturn;
	}
});


oSolar.c.Input = new Class({
	Implements: [Events, Options],
	options: {
		validation:{
			required:true
		},
		value:''
	},
	initialize: function(form,args){
		this.setOptions(args.options);
		this.element = $(args.el);
		this.input = this.element.getElement('input,textarea,select');
		this.name = this.input.get('name');
		this.valid = false;
		this.form = form;
		
		oSolar.events.addEvent('form.submit',this.validate.bind(this));
	},
	setValue: function(val){
		oSolar.events.fireEvent('input.'+this.name+'.setvalue');
		this.input.set('value',val);
		this.options.value = val;
	},
	getValue: function(val){
		return this.input.get('value');
	},
	validate: function(){
		var bPassed = true;
		if(this.options.validation.required){
			if(!this.getValue().length){
				bPassed = false;
			}
		}
		this.valid = bPassed;
		this.setError();
		return bPassed;
	},
	setError: function(bError){
		if(!$defined(bError))bError = !this.valid;
		if(bError){
			this.element.addClass('error');
		}else{
			this.element.removeClass('error');
		}
	}
});

oSolar.c.Radio = new Class({
	Extends: oSolar.c.Input,
	getValue: function(){
		input = this.form.element[this.name];
		for(var idx = 0; idx < input.length; idx++){
			if(input[idx].checked){
				return $(input[idx]).get('value');
			}
		}
		return '';
	},
	validate: function(){
		this.valid = !!this.getValue().length;
		this.setError();
		return this.valid;
	}
});

oSolar.c.Rating = new Class({
	Extends: oSolar.c.Input,
	options: {
		rating:{
			from:0,
			to:6,
			step:1
		},
		fillMode:true,
		doNotFillValues:[0],
		useDesc:false,
		value:0
	},
	initialize: function(from,args){
		var elRate,iRate,elRateWrp;
		this.parent(from,args);
		
		this.currSet = null;
		this.input = this.element.getElements('input,textarea,select');
		
		if(this.options.useDesc){
			this.elRates = new Element('DIV',{'class':'rates'}).inject(this.element,'top');
			
			this.rateDesc = this.element.getElement('.ratedesc');
			this.selRateDesc = '';
			if(this.rateDesc){
				this.rateDesc.set('html',this.selRateDesc);
			}
		}else{
			this.elRates = new Element('DIV',{'class':'rates'}).inject(this.element,'top');
		}
		
		this.rates = new Hash();
		for( iRate = this.options.rating.from; iRate <= this.options.rating.to; iRate += this.options.rating.step){
			elRate = new Element('div', {'class':'rate'}).adopt(new Element('A', {'class':'rate val'+iRate,'href':'javascript:void(0);'}));
			elRate.addEvent('click',this.setRate.bind(this,iRate));
			if(this.rateDesc){
				elRate.addEvent('mouseenter',this.showRateDesc.bind(this,[elRate,iRate]));
				elRate.addEvent('mouseleave',this.hideRateDesc.bind(this,[elRate,iRate]));
			}
			if(this.options.fillMode){
				elRate.addEvent('mouseenter',this.fillTo.bind(this,iRate));
				elRate.addEvent('mouseleave',this.unfill.bind(this));
			}
			elRate.inject(this.elRates);
			this.rates.set(iRate,elRate);
		}
		
		this.setValue(this.options.value);
	},
	setRate: function(iSelRate){
		for( iRate = this.options.rating.from; iRate <= this.options.rating.to; iRate += this.options.rating.step){
			if(iSelRate >= iRate && this.options.doNotFillValues.indexOf(iRate)){
				this.rates.get(iRate).addClass('sel');
			}else{
				this.rates.get(iRate).removeClass('sel');
			}
		}
		
		oSolar.events.fireEvent('input.'+this.name+'.setrating',iSelRate);
		oSolar.events.fireEvent('input.setrating',{rate:iSelRate,name:this.name});
		this.setValue(iSelRate);
		this.validate();
	},
	setValue: function(val){
		var iVal = this.input.get('value').indexOf(val.toString());
		this.currSet = iVal;
		if(iVal >= 0){
			this.input[iVal].checked = true;
			this.selRateDesc = this.input[iVal].get('rel');
		}else if(val == 0){
			this.input.setProperty('checked',false);
		}
		this.options.value = val;
	},
	getValue: function(){
		for(var idx = 0; idx < this.input.length; idx++){
			if(this.input[idx].checked){
				return this.input[idx].get('value');
			}
		}
		return '';
	},
	validate: function(){
		this.valid = !!this.getValue().length;
		this.setError();
		return this.valid;
	},
	showRateDesc: function(elRate,iRate){
		if(this.rateDesc){
			this.rateDesc.set('html',this.input[iRate].get('title'));
		}
	},
	hideRateDesc: function(elRate,iRate){
		if(this.rateDesc){
			this.rateDesc.set('html',this.selRateDesc);
		}
	},
	fillTo: function(iRateFill){
		for( var iRate = this.options.rating.from; iRate <= this.options.rating.to; iRate += this.options.rating.step){
			if(iRateFill >= iRate && this.options.doNotFillValues.indexOf(iRate)){
				this.rates.get(iRate).addClass('sel');
			}else{
				this.rates.get(iRate).removeClass('sel');
			}
		}
	},
	unfill: function(){
		for( var iRate = this.options.rating.from; iRate <= this.options.rating.to; iRate += this.options.rating.step){
			if(this.currSet >= iRate && this.options.doNotFillValues.indexOf(iRate)){
				this.rates.get(iRate).addClass('sel');
			}else{
				this.rates.get(iRate).removeClass('sel');
			}
		}
	}
});


window.addEvent('domready', function(e){
	// collect lightbox Images and organize by rel attributes
	var hRels = new Hash();
	$$('.lightbox').each(function(el){
		var sRel = el.get('rel');
		if(!sRel)sRel='-';
		if(!hRels.has(sRel)){
			hRels.set(sRel,[]);
		}
		hRels[sRel].push(el);
	});
	hRels.each(function(aObjs,key){
		new multiBox(aObjs, {
			overlay: new overlay()
		});		
	});
	
});



/*
---
description: Map using Google Maps Api Version 3. A comprehensible map can be displayed by using the custom marker.

license: MIT-style

authors:
- Noritaka Horio

requires:
  core/1.2.4:
  - Core/Core
  - Core/Browser
  - Native/Array
  - Native/Function
  - Native/Number
  - Native/String
  - Native/Hash
  - Native/Event
  - Class/Class
  - Class/Class.Extras
  - Element/Element
  - Element/Element.Event
  - Element/Element.Style
  - Element/Element.Dimensions
  - Utilities/Selecter
  - Utilities/DomReady
  - Fx/Fx
  - Fx/Fx.CSS
  - Fx/Fx.Tween
  - Fx/Fx.Transitions

more/1.2.4.4:
  - Tips

provides: [MMap,MMap.Marker,MMap.Marker.Image,MMap.Marker.Images,MMap.Window]
...
*/

var MMap = new Class({

	Implements: [Options],

	options: {
		"center": null,
		"zoom": 10,
		"mapType": "roadmap"
	},

	initialize: function(container, options) {
		this.container = container;
		this.setOptions(options);
		var latlng = this.options.center;
		this.map = new google.maps.Map(this.container, {
			"zoom": this.options.zoom,
			"center": new google.maps.LatLng(latlng.lat, latlng.lng),
			"mapTypeId": this.getType(this.options.mapType)
		});
	},

	getInstance: function() {
		return this.map;
	},

	getType: function(type) {
		var typeId = google.maps.MapTypeId.ROADMAP;
		switch (type) {
			case "hybrid": typeId = google.maps.MapTypeId.HYBRID; break;
			case "satellite": typeId = google.maps.MapTypeId.SATELLITE; break;
			case "terrain": typeId = google.maps.MapTypeId.TERRAIN; break;
			case "roadmap": typeId = google.maps.MapTypeId.ROADMAP; break;
		}
		return typeId;
	},

	getCenter: function() { return this.map.getCenter(); },
	setCenter: function(latlng) { this.map.setCenter(latlng); },
	setZoom: function(zoom) { this.map.setZoom(zoom); },
	getZoom: function() { return this.map.getZoom(); },

	/**
	 * var map = new MMap({arg}).loadJSON({marker options});
	 */
	loadJSON:function(markers) {
		var map = this;
		markers.each(function(option, key) {
			var marker = null;
			//MMap.Marker.Image
			if (option.src) { marker = new MMap.Marker.Image(map, option); }
			//MMap.Marker.Images
			else if (option.images) { marker = new MMap.Marker.Images(map, option); }
			//MMap.Marker
			else { marker = new MMap.Marker(map, option); }
		});
		return this;
	}

});


MMap.Events = new Class({

	fireEvent: function(type, paramters) {
		google.maps.event.trigger(this, type, paramters);
	},

	addEvent: function(type, handler) {
		var eventType = Events.removeOn(type);
		var target = (this.getInstance) ? this.getInstance() : this;
		eventType = eventType.toLowerCase();
		google.maps.event.addListener(target, eventType, handler);
	},

	addEvents: function(handlers) {
		for (var type in handlers) {
			this.addEvent(type, handlers[type]);
		}
	}
});

MMap.implement(new MMap.Events());




MMap.Overlay = {

	zIndex: {
		"marker":  900,
		"window": 1000
	},

	setZIndex: function(overlay, index) {
		this.zIndex[overlay] = index;
	},

	getCurrent: function(overlay) {
		return this.zIndex[overlay];
	},

	next: function(overlay) {
		var zIndex = this.zIndex[overlay]++;
		return zIndex;
	}

};


MMap.Overlay.Collection = new Class({

	overlays: [],
	minIndex: 0,
	maxIndex: 0,

	add: function(overlay) {
		this.overlays.push(overlay);
		this.minIndex = Math.min(this.minIndex, overlay.getZIndex());
		this.maxIndex = Math.max(this.maxIndex, overlay.getZIndex());
	},

	orderToFront: function(overlay) {
		var zIndex = this.maxIndex;
		overlay.setZIndex(zIndex);
		var container = overlay.getContainer();
		container.addClass("active");
		this.overlays.each(function(target) {
			zIndex--;
			if (target != overlay) {
				target.setZIndex(zIndex);
				var container = target.getContainer();
				container.removeClass("active");
			}
		});
	}

});

MMap.Overlay.Markers = new MMap.Overlay.Collection();
MMap.Overlay.Windows = new MMap.Overlay.Collection();

/*
---
description: Custom marker who can insert HTML contents

license: MIT-style

authors:
- Noritaka Horio

requires:
  core/1.2.4:
  - Core/Core
  - Core/Browser
  - Native/Array
  - Native/Function
  - Native/Number
  - Native/String
  - Native/Hash
  - Native/Event
  - Class/Class
  - Class/Class.Extras
  - Element/Element
  - Element/Element.Event
  - Element/Element.Style
  - Element/Element.Dimensions
  - Utilities/Selecter
  - Utilities/DomReady
  - Fx/Fx
  - Fx/Fx.CSS
  - Fx/Fx.Tween
  - Fx/Fx.Transitions

more/1.2.4.4:
  - Tips

provides: [MMap,MMap.Marker,MMap.Marker.Image,MMap.Marker.Images,MMap.Window]
...
*/

MMap.Marker = new Class({

	Implements: [Options, MMap.Events],

	options: {
		"className": "html",
		"latlng": null,
		"title": null,
//		"url": null,
		"zIndex": null,
		"content": null
	},

	overlayType: "marker",
	latlng: null,
	container: null,
	body: null,
	panel: null,

	/** @id MMap.Marker.initialize */
	initialize: function(map, options) {
		this.setOptions(options);
		$extend(this, new google.maps.OverlayView());
		this.container = new Element("div", {"class": "marker " + this.options.className});
		this.body = new Element("div", {"class": "body"});
		this.body.inject(this.container);
		this.build();
		this.setZIndex(this.generateZIndex());
		this.setupEvents();
		this.setPosition(new google.maps.LatLng(this.options.latlng.lat, this.options.latlng.lng));
		this.setMap(map.getInstance());
		MMap.Overlay.Markers.add(this);
	},

	/** @id MMap.Marker.build */
	build: function() {
		this.header = new Element("div", {"class": "header"});
		this.footer = new Element("div", {"class": "footer"});
		this.header.inject(this.body, "before");
		this.footer.inject(this.body, "after");
		this.trigger = this.container;
		this.setContent(this.options.content);
	},

	setupEvents: function(event) {
		var proxy = function(event) {
			event.stop();
			var proxyEvent = new Event(event);
			proxyEvent.target = this;
			this.fireEvent(proxyEvent.type, proxyEvent);
		}.bind(this);
		this.trigger.addEvent("click", proxy);
		this.trigger.addEvent("mouseover", proxy);
		this.trigger.addEvent("mouseout", proxy);
		this.trigger.addEvent("mousedown", proxy);
		this.trigger.addEvent("mouseup", proxy);
	},

	generateZIndex: function() {
		var zIndex = null; 
		if (this.options.zIndex) {
			zIndex = this.options.zIndex;
		} else {
			zIndex = MMap.Overlay.getCurrent(this.overlayType);
			MMap.Overlay.next(this.overlayType);
		}
		return zIndex;
	},

	getContainer: function() { return this.container; },

	setContent: function(content) {
		if (!content) return false;
		this.content = content;
		this.body.set("html", "");
		($type(this.content) == "string")
		? this.body.set("html", this.content)
		: this.content.inject(this.body);
	},

	getContent: function() { return this.content; },

	/** @id MMap.Marker.setURL */
	setURL: function(url) { this.options.url = url; }, 

	/** @id MMap.Marker.getURL */
	getURL: function() { return this.options.url; }, 

	/** @id MMap.Marker.setPosition */
	setPosition: function(latlng) { this.latlng = latlng; },

	/** @id MMap.Marker.getPosition */
	getPosition: function() { return this.latlng; },

	/** @id MMap.Marker.setPosition */
	setZIndex: function(index) {
		this.options.zIndex = index;
		this.container.setStyle("z-index", this.options.zIndex);
	},

	/** @id MMap.Marker.getPosition */
	getZIndex: function() { return this.options.zIndex; },

	/** @id MMap.Marker.draw */
	draw: function() {
		var size = this.container.getSize();
		var projection = this.getProjection();
		var position = this.options.latlng;
		var latlng = new google.maps.LatLng(position.lat, position.lng);
		var point = projection.fromLatLngToDivPixel(latlng);
		this.container.setStyles({
			"position": "absolute",
			"top": point.y - size.y,
			"left": point.x - (size.x / 2)
		});
	},

	onAdd: function() {
		var panes = this.getPanes();
		this.panel = panes.overlayImage;
		this.container.inject(this.panel);
	},

	onRemove: function() { this.container.destroy(); },
	getPanel: function() { return this.panel; },

	orderToFront: function() {
		MMap.Overlay.Markers.orderToFront(this);
	}

});


oSolar.c.MapsOverlay = new Class(
	/** @lends oSolar.c.MapsOverlay.prototype */
	{
	Implements: [Options,Events,Defined],
	options:{
		map:{
			startPos:{"lat": 52.240869, "lng": 8.141813},
			startZoom:15,
			startType:"roadmap"
		},
		size:{
			x:750,
			y:500
		},
		classes:{
			wrp:'mapWrp',
			map:'map',
			close:'MultiBoxClose'
		}
	},
	/**
	 * MapsOverlay Widget to generate a Window with a gMap. MMap-Widget is needed  
	 * @constructs
	 * @param {Object} options Behavoir options for MapsOverlay
	 * @option {Object} map.startPos Object with key lat and lng for starting Postion
	 * @option {Nnumber} map.startZoom Starting zoom value
	 * @option {String} map.startType Staring type for gMap. Possible values (hybrid,satellite,terrain,roadmap)
	 * @author MPE
	 * @memberOf oSolar.c.MapsOverlay
	 */
	initialize: function initialize(options){
		this.setOptions(options);
		
		this.elMap = null;
		this.window = null;
		
		this.Markers = new Hash();
		this.overlay = new Mask(document.body,{style:{'background':'#000','opacity':0.5}});
		this.overlay.hide();
		
		this.overlay.addEvent('click',this.close.bind(this));
		
		this.KeyboardEvents = new Keyboard({
		    defaultEventType: 'keyup', 
		    events: { 
		        'esc': this.close.bind(this)
		    }
		});
		
		this.fxWindow = null;
		this.fxWindowDelay = null;
		window.addEvent('scroll',(function(){
			$clear(this.fxWindowDelay);
			this.fxWindowDelay = this.setWindowPosition.delay(75,this);
		}).bind(this));
		
		this.initWindow();
		
		this.isWindowOpen = false;
	},
	/**
	 * gerneate map and destroy existing map  
	 * @member oSolar.c.MapsOverlay
	 * @author MPE
	 */
	initWindow: function initWindow(){
		if(this.window){
			this.window.destroy();
		}
		this.window = new Element('DIV',{'class':this.options.classes.wrp,styles:{width:this.options.size.x,height:this.options.size.y}}).inject(document.body);
		new Element('DIV',{'class':this.options.classes.close,'events': {'click': this.close.bind(this)}}).inject(this.window);
		this.window.hide();
		
		this.fxWindow = new Fx.Elements(this.window,{duration:400,transition:Fx.Transitions.Back.easeOut});
		
		this.setWindowPosition();
		
	},
	/**
	 * set the position of the Window  
	 * @member oSolar.c.MapsOverlay
	 * @author MPE
	 */
	setWindowPosition: function setWindowPosition(){
		if(this.isWindowOpen && this.fxWindow){
			var oPos = this.window.position({position:'center',returnPos:true});
			this.fxWindow.start({'0':oPos});
			//this.window.pin();
		}else{
			this.window.position({position:'center',returnPos:false});
		}
	},
	/**
	 * gerneate map and destroy existing map  
	 * @member oSolar.c.MapsOverlay
	 * @author MPE
	 */
	initMap: function initMap(){
		if(this.elMap){
			this.clearAllMarkers();
			this.gmap.container.destroy();
			this.gmap = null;
			this.elMap.destroy();
		}
		this.elMap = new Element('DIV',{'class':this.options.classes.map,styles:{'visibility':'hidden',width:this.options.size.x,height:this.options.size.y}}).inject(this.window ? this.window : document.body);
		this.gmap = new MMap(this.elMap, {
			"center": this.options.map.startPos,
			"zoom": this.options.map.startZoom,
			"mapType": this.options.map.startType
		});
	},
	/**
	 * clear all exsiting markers  
	 * @member oSolar.c.MapsOverlay
	 * @author MPE
	 */
	clearAllMarkers: function clearAllMarkers(){
		this.Markers.each(function(marker,key){
			marker.marker.setMap(null);
		},this);
		this.Markers.empty();
	},
	/**
	 * open Window with map  
	 * @member oSolar.c.MapsOverlay
	 * @author MPE
	 */
	open: function open(){
		this.overlay.show();
		this.window.show();
		this.initMap();
		this.elMap.setStyle('visibility','visible');
		this.KeyboardEvents.activate();
		this.isWindowOpen = true;
		this.setWindowPosition();
	},
	/**
	 * open Window with map  
	 * @member oSolar.c.MapsOverlay
	 * @author MPE
	 */
	close: function close(){
		this.overlay.hide();
		this.window.hide();
		this.elMap.setStyle('visibility','hidden');
		this.KeyboardEvents.deactivate();
		this.isWindowOpen = false;
	},
	/**
	 * open Window with map and marker 
	 * @member oSolar.c.MapsOverlay
	 * @param {Object} pos Object with key lat and lng for starting Postion
	 * @param {String|Number} key String or Number as key for this marker
	 * @param {String} title Title of marker
	 * @param {String} content Content of marker
	 * @author MPE
	 */
	openWithMarker: function openWithMarker(pos,key,title,content){
		this.open();
		this.addMarker(pos,key,title,content);
	},
	/**
	 * add a marker to the map 
	 * @member oSolar.c.MapsOverlay
	 * @param {Object} pos Object with key lat and lng for starting Postion
	 * @param {String|Number} key String or Number as key for this marker
	 * @param {String} title Title of marker
	 * @param {String} content Content of marker
	 * @author MPE
	 */
	addMarker: function addMarker(pos,key,title,content){
		this.setCenter(pos);
		if(!this.Markers.has(key)){
			var oMarker = {};
			oMarker.infowindow = new google.maps.InfoWindow({
			    content: content
			});
			var oGPos = new google.maps.LatLng(pos.lat, pos.lng);
			oMarker.marker = new google.maps.Marker({
			    position: oGPos,
			    map: this.gmap.map,
			    title:title
			});
			oMarker.infowindow.open(this.gmap.map,oMarker.marker);
			this.Markers.set(key,oMarker);
			return oMarker;
		}else{
			return this.Markers.get(key);
		}
	},
	/**
	 * set center position of map
	 * @member oSolar.c.MapsOverlay
	 * @param {Object} pos Object with key lat and lng for starting Postion
	 * @author MPE
	 */
	setCenter: function setCenter(pos){
		var oGPos = new google.maps.LatLng(pos.lat, pos.lng);
		this.gmap.setCenter(oGPos);
	}
});
