/*!
 * jQuery Tools dev - The missing UI library for the Web
 * 
 * overlay/overlay.js
 * scrollable/scrollable.js
 * tabs/tabs.js
 * toolbox/toolbox.expose.js
 * toolbox/toolbox.flashembed.js
 * 
 * NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.
 * 
 * http://flowplayer.org/tools/
 * 
 */
(function(a){a.tools=a.tools||{version:"dev"},a.tools.overlay={addEffect:function(a,b,d){c[a]=[b,d]},conf:{close:null,closeOnClick:!0,closeOnEsc:!0,closeSpeed:"fast",effect:"default",fixed:!a.browser.msie||a.browser.version>6,left:"center",load:!1,mask:null,oneInstance:!0,speed:"normal",target:null,top:"10%"}};var b=[],c={};a.tools.overlay.addEffect("default",function(b,c){var d=this.getConf(),e=a(window);d.fixed||(b.top+=e.scrollTop(),b.left+=e.scrollLeft()),b.position=d.fixed?"fixed":"absolute",this.getOverlay().css(b).fadeIn(d.speed,c)},function(a){this.getOverlay().fadeOut(this.getConf().closeSpeed,a)});function d(d,e){var f=this,g=d.add(f),h=a(window),i,j,k,l=a.tools.expose&&(e.mask||e.expose),m=Math.random().toString().slice(10);l&&(typeof l=="string"&&(l={color:l}),l.closeOnClick=l.closeOnEsc=!1);var n=e.target||d.attr("rel");j=n?a(n):null||d;if(!j.length)throw"Could not find Overlay: "+n;d&&d.index(j)==-1&&d.click(function(a){f.load(a);return a.preventDefault()}),a.extend(f,{load:function(d){if(f.isOpened())return f;var i=c[e.effect];if(!i)throw"Overlay: cannot find effect : \""+e.effect+"\"";e.oneInstance&&a.each(b,function(){this.close(d)}),d=d||a.Event(),d.type="onBeforeLoad",g.trigger(d);if(d.isDefaultPrevented())return f;k=!0,l&&a(j).expose(l);var n=e.top,o=e.left,p=j.outerWidth({margin:!0}),q=j.outerHeight({margin:!0});typeof n=="string"&&(n=n=="center"?Math.max((h.height()-q)/2,0):parseInt(n,10)/100*h.height()),o=="center"&&(o=Math.max((h.width()-p)/2,0)),i[0].call(f,{top:n,left:o},function(){k&&(d.type="onLoad",g.trigger(d))}),l&&e.closeOnClick&&a.mask.getMask().one("click",f.close),e.closeOnClick&&a(document).bind("click."+m,function(b){a(b.target).parents(j).length||f.close(b)}),e.closeOnEsc&&a(document).bind("keydown."+m,function(a){a.keyCode==27&&f.close(a)});return f},close:function(b){if(!f.isOpened())return f;b=b||a.Event(),b.type="onBeforeClose",g.trigger(b);if(!b.isDefaultPrevented()){k=!1,c[e.effect][1].call(f,function(){b.type="onClose",g.trigger(b)}),a(document).unbind("click."+m).unbind("keydown."+m),l&&a.mask.close();return f}},getOverlay:function(){return j},getTrigger:function(){return d},getClosers:function(){return i},isOpened:function(){return k},getConf:function(){return e}}),a.each("onBeforeLoad,onStart,onLoad,onBeforeClose,onClose".split(","),function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}}),i=j.find(e.close||".close"),!i.length&&!e.close&&(i=a("<a class=\"close\"></a>"),j.prepend(i)),i.click(function(a){f.close(a)}),e.load&&f.load()}a.fn.overlay=function(c){var e=this.data("overlay");if(e)return e;a.isFunction(c)&&(c={onBeforeLoad:c}),c=a.extend(!0,{},a.tools.overlay.conf,c),this.each(function(){e=new d(a(this),c),b.push(e),a(this).data("overlay",e)});return c.api?e:this}})(jQuery);
(function(a){a.tools=a.tools||{version:"dev"},a.tools.scrollable={conf:{activeClass:"active",circular:!1,clonedClass:"cloned",disabledClass:"disabled",easing:"swing",initialIndex:0,item:"> *",items:".items",keyboard:!0,mousewheel:!1,next:".next",prev:".prev",size:1,speed:400,vertical:!1,touch:!0,wheelSpeed:0}};function b(a,b){var c=parseInt(a.css(b),10);if(c)return c;var d=a[0].currentStyle;return d&&d.width&&parseInt(d.width,10)}function c(b,c){var d=a(c);return d.length<2?d:b.parent().find(c)}var d;function e(b,e){var f=this,g=b.add(f),h=b.children(),i=0,j=e.vertical;d||(d=f),h.length>1&&(h=a(e.items,b)),e.size>1&&(e.circular=!1),a.extend(f,{getConf:function(){return e},getIndex:function(){return i},getSize:function(){return f.getItems().size()},getNaviButtons:function(){return n.add(o)},getRoot:function(){return b},getItemWrap:function(){return h},getItems:function(){return h.find(e.item).not("."+e.clonedClass)},move:function(a,b){return f.seekTo(i+a,b)},next:function(a){return f.move(e.size,a)},prev:function(a){return f.move(-e.size,a)},begin:function(a){return f.seekTo(0,a)},end:function(a){return f.seekTo(f.getSize()-1,a)},focus:function(){d=f;return f},addItem:function(b){b=a(b),e.circular?(h.children().last().before(b),h.children().first().replaceWith(b.clone().addClass(e.clonedClass))):(h.append(b),o.removeClass("disabled")),g.trigger("onAddItem",[b]);return f},seekTo:function(b,c,k){b.jquery||(b*=1);if(e.circular&&b===0&&i==-1&&c!==0)return f;if(!e.circular&&b<0||b>f.getSize()||b<-1)return f;var l=b;b.jquery?b=f.getItems().index(b):l=f.getItems().eq(b);var m=a.Event("onBeforeSeek");if(!k){g.trigger(m,[b,c]);if(m.isDefaultPrevented()||!l.length)return f}var n=j?{top:-l.position().top}:{left:-l.position().left};i=b,d=f,c===undefined&&(c=e.speed),h.animate(n,c,e.easing,k||function(){g.trigger("onSeek",[b])});return f}}),a.each(["onBeforeSeek","onSeek","onAddItem"],function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}});if(e.circular){var k=f.getItems().slice(-1).clone().prependTo(h),l=f.getItems().eq(1).clone().appendTo(h);k.add(l).addClass(e.clonedClass),f.onBeforeSeek(function(a,b,c){if(!a.isDefaultPrevented()){if(b==-1){f.seekTo(k,c,function(){f.end(0)});return a.preventDefault()}b==f.getSize()&&f.seekTo(l,c,function(){f.begin(0)})}});var m=b.parents().add(b).filter(function(){if(a(this).css("display")==="none")return!0});m.length?(m.show(),f.seekTo(0,0,function(){}),m.hide()):f.seekTo(0,0,function(){})}var n=c(b,e.prev).click(function(a){a.stopPropagation(),f.prev()}),o=c(b,e.next).click(function(a){a.stopPropagation(),f.next()});e.circular||(f.onBeforeSeek(function(a,b){setTimeout(function(){a.isDefaultPrevented()||(n.toggleClass(e.disabledClass,b<=0),o.toggleClass(e.disabledClass,b>=f.getSize()-1))},1)}),e.initialIndex||n.addClass(e.disabledClass)),f.getSize()<2&&n.add(o).addClass(e.disabledClass),e.mousewheel&&a.fn.mousewheel&&b.mousewheel(function(a,b){if(e.mousewheel){f.move(b<0?1:-1,e.wheelSpeed||50);return!1}});if(e.touch){var p={};h[0].ontouchstart=function(a){var b=a.touches[0];p.x=b.clientX,p.y=b.clientY},h[0].ontouchmove=function(a){if(a.touches.length==1&&!h.is(":animated")){var b=a.touches[0],c=p.x-b.clientX,d=p.y-b.clientY;f[j&&d>0||!j&&c>0?"next":"prev"](),a.preventDefault()}}}e.keyboard&&a(document).bind("keydown.scrollable",function(b){if(!(!e.keyboard||b.altKey||b.ctrlKey||b.metaKey||a(b.target).is(":input"))){if(e.keyboard!="static"&&d!=f)return;var c=b.keyCode;if(j&&(c==38||c==40)){f.move(c==38?-1:1);return b.preventDefault()}if(!j&&(c==37||c==39)){f.move(c==37?-1:1);return b.preventDefault()}}}),e.initialIndex&&f.seekTo(e.initialIndex,0,function(){})}a.fn.scrollable=function(b){var c=this.data("scrollable");if(c)return c;b=a.extend({},a.tools.scrollable.conf,b),this.each(function(){c=new e(a(this),b),a(this).data("scrollable",c)});return b.api?c:this}})(jQuery);
(function(a){a.tools=a.tools||{version:"dev"},a.tools.tabs={conf:{tabs:"a",current:"current",onBeforeClick:null,onClick:null,effect:"default",initialIndex:0,event:"click",rotate:!1,slideUpSpeed:400,slideDownSpeed:400,history:!1},addEffect:function(a,c){b[a]=c}};var b={"default":function(a,b){this.getPanes().hide().eq(a).show(),b.call()},fade:function(a,b){var c=this.getConf(),d=c.fadeOutSpeed,e=this.getPanes();d?e.fadeOut(d):e.hide(),e.eq(a).fadeIn(c.fadeInSpeed,b)},slide:function(a,b){var c=this.getConf();this.getPanes().slideUp(c.slideUpSpeed),this.getPanes().eq(a).slideDown(c.slideDownSpeed,b)},ajax:function(a,b){this.getPanes().eq(0).load(this.getTabs().eq(a).attr("href"),b)}},c,d;a.tools.tabs.addEffect("horizontal",function(b,e){if(!c){var f=this.getPanes().eq(b),g=this.getCurrentPane();d||(d=this.getPanes().eq(0).width()),c=!0,f.show(),g.animate({width:0},{step:function(a){f.css("width",d-a)},complete:function(){a(this).hide(),e.call(),c=!1}}),g.length||(e.call(),c=!1)}});function e(c,d,e){var f=this,g=c.add(this),h=c.find(e.tabs),i=d.jquery?d:c.children(d),j;h.length||(h=c.children()),i.length||(i=c.parent().find(d)),i.length||(i=a(d)),a.extend(this,{click:function(c,d){var i=h.eq(c);typeof c=="string"&&c.replace("#","")&&(i=h.filter("[href*="+c.replace("#","")+"]"),c=Math.max(h.index(i),0));if(e.rotate){var k=h.length-1;if(c<0)return f.click(k,d);if(c>k)return f.click(0,d)}if(!i.length){if(j>=0)return f;c=e.initialIndex,i=h.eq(c)}if(c===j)return f;d=d||a.Event(),d.type="onBeforeClick",g.trigger(d,[c]);if(!d.isDefaultPrevented()){b[e.effect].call(f,c,function(){j=c,d.type="onClick",g.trigger(d,[c])}),h.removeClass(e.current),i.addClass(e.current);return f}},getConf:function(){return e},getTabs:function(){return h},getPanes:function(){return i},getCurrentPane:function(){return i.eq(j)},getCurrentTab:function(){return h.eq(j)},getIndex:function(){return j},next:function(){return f.click(j+1)},prev:function(){return f.click(j-1)},destroy:function(){h.unbind(e.event).removeClass(e.current),i.find("a[href^=#]").unbind("click.T");return f}}),a.each("onBeforeClick,onClick".split(","),function(b,c){a.isFunction(e[c])&&a(f).bind(c,e[c]),f[c]=function(b){b&&a(f).bind(c,b);return f}}),e.history&&a.fn.history&&(a.tools.history.init(h),e.event="history"),h.each(function(b){a(this).bind(e.event,function(a){f.click(b,a);return a.preventDefault()})}),i.find("a[href^=#]").bind("click.T",function(b){f.click(a(this).attr("href"),b)}),location.hash&&e.tabs=="a"&&c.find("[href="+location.hash+"]").length?f.click(location.hash):(e.initialIndex===0||e.initialIndex>0)&&f.click(e.initialIndex)}a.fn.tabs=function(b,c){var d=this.data("tabs");d&&(d.destroy(),this.removeData("tabs")),a.isFunction(c)&&(c={onBeforeClick:c}),c=a.extend({},a.tools.tabs.conf,c),this.each(function(){d=new e(a(this),b,c),a(this).data("tabs",d)});return c.api?d:this}})(jQuery);
(function(a){a.tools=a.tools||{version:"dev"};var b;b=a.tools.expose={conf:{maskId:"exposeMask",loadSpeed:"slow",closeSpeed:"fast",closeOnClick:!0,closeOnEsc:!0,zIndex:9998,opacity:.8,startOpacity:0,color:"#fff",onLoad:null,onClose:null}};function c(){if(a.browser.msie){var b=a(document).height(),c=a(window).height();return[window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,b-c<20?c:b]}return[a(document).width(),a(document).height()]}function d(b){if(b)return b.call(a.mask)}var e,f,g,h,i;a.mask={load:function(j,k){if(g)return this;typeof j=="string"&&(j={color:j}),j=j||h,h=j=a.extend(a.extend({},b.conf),j),e=a("#"+j.maskId),e.length||(e=a("<div/>").attr("id",j.maskId),a("body").append(e));var l=c();e.css({position:"absolute",top:0,left:0,width:l[0],height:l[1],display:"none",opacity:j.startOpacity,zIndex:j.zIndex}),j.color&&e.css("backgroundColor",j.color);if(d(j.onBeforeLoad)===!1)return this;j.closeOnEsc&&a(document).bind("keydown.mask",function(b){b.keyCode==27&&a.mask.close(b)}),j.closeOnClick&&e.bind("click.mask",function(b){a.mask.close(b)}),a(window).bind("resize.mask",function(){a.mask.fit()}),k&&k.length&&(i=k.eq(0).css("zIndex"),a.each(k,function(){var b=a(this);/relative|absolute|fixed/i.test(b.css("position"))||b.css("position","relative")}),f=k.css({zIndex:Math.max(j.zIndex+1,i=="auto"?0:i)})),e.css({display:"block"}).fadeTo(j.loadSpeed,j.opacity,function(){a.mask.fit(),d(j.onLoad),g="full"}),g=!0;return this},close:function(){if(g){if(d(h.onBeforeClose)===!1)return this;e.fadeOut(h.closeSpeed,function(){d(h.onClose),f&&f.css({zIndex:i}),g=!1}),a(document).unbind("keydown.mask"),e.unbind("click.mask"),a(window).unbind("resize.mask")}return this},fit:function(){if(g){var a=c();e.css({width:a[0],height:a[1]})}},getMask:function(){return e},isLoaded:function(a){return a?g=="full":g},getConf:function(){return h},getExposed:function(){return f}},a.fn.mask=function(b){a.mask.load(b);return this},a.fn.expose=function(b){a.mask.load(b,this);return this}})(jQuery);
(function(){var a=document.all,b="http://www.adobe.com/go/getflashplayer",c=typeof jQuery=="function",d=/(\d+)[^\d]+(\d+)[^\d]*(\d*)/,e={width:"100%",height:"100%",id:"_"+(""+Math.random()).slice(9),allowfullscreen:!0,allowscriptaccess:"always",quality:"high",version:[3,0],onFail:null,expressInstall:null,w3c:!1,cachebusting:!1};window.attachEvent&&window.attachEvent("onbeforeunload",function(){__flash_unloadHandler=function(){},__flash_savedUnloadHandler=function(){}});function f(a,b){if(b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function g(a,b){var c=[];for(var d in a)a.hasOwnProperty(d)&&(c[d]=b(a[d]));return c}window.flashembed=function(a,b,c){typeof a=="string"&&(a=document.getElementById(a.replace("#","")));if(a){typeof b=="string"&&(b={src:b});return new j(a,f(f({},e),b),c)}};var h=f(window.flashembed,{conf:e,getVersion:function(){var a,b;try{b=navigator.plugins["Shockwave Flash"].description.slice(16)}catch(c){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"),b=a&&a.GetVariable("$version")}catch(e){try{a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),b=a&&a.GetVariable("$version")}catch(f){}}}b=d.exec(b);return b?[b[1],b[3]]:[0,0]},asString:function(a){if(a===null||a===undefined)return null;var b=typeof a;b=="object"&&a.push&&(b="array");switch(b){case"string":a=a.replace(new RegExp("([\"\\\\])","g"),"\\$1"),a=a.replace(/^\s?(\d+\.?\d*)%/,"$1pct");return"\""+a+"\"";case"array":return"["+g(a,function(a){return h.asString(a)}).join(",")+"]";case"function":return"\"function()\"";case"object":var c=[];for(var d in a)a.hasOwnProperty(d)&&c.push("\""+d+"\":"+h.asString(a[d]));return"{"+c.join(",")+"}"}return String(a).replace(/\s/g," ").replace(/\'/g,"\"")},getHTML:function(b,c){b=f({},b);var d="<object width=\""+b.width+"\" height=\""+b.height+"\" id=\""+b.id+"\" name=\""+b.id+"\"";b.cachebusting&&(b.src+=(b.src.indexOf("?")!=-1?"&":"?")+Math.random()),b.w3c||!a?d+=" data=\""+b.src+"\" type=\"application/x-shockwave-flash\"":d+=" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"",d+=">";if(b.w3c||a)d+="<param name=\"movie\" value=\""+b.src+"\" />";b.width=b.height=b.id=b.w3c=b.src=null,b.onFail=b.version=b.expressInstall=null;for(var e in b)b[e]&&(d+="<param name=\""+e+"\" value=\""+b[e]+"\" />");var g="";if(c){for(var i in c)if(c[i]){var j=c[i];g+=i+"="+encodeURIComponent(/function|object/.test(typeof j)?h.asString(j):j)+"&"}g=g.slice(0,-1),d+="<param name=\"flashvars\" value='"+g+"' />"}d+="</object>";return d},isSupported:function(a){return i[0]>a[0]||i[0]==a[0]&&i[1]>=a[1]}}),i=h.getVersion();function j(c,d,e){if(h.isSupported(d.version))c.innerHTML=h.getHTML(d,e);else if(d.expressInstall&&h.isSupported([6,65]))c.innerHTML=h.getHTML(f(d,{src:d.expressInstall}),{MMredirectURL:location.href,MMplayerType:"PlugIn",MMdoctitle:document.title});else{c.innerHTML.replace(/\s/g,"")||(c.innerHTML="<h2>Flash version "+d.version+" or greater is required</h2><h3>"+(i[0]>0?"Your version is "+i:"You have no flash plugin installed")+"</h3>"+(c.tagName=="A"?"<p>Click here to download latest version</p>":"<p>Download latest version from <a href='"+b+"'>here</a></p>"),c.tagName=="A"&&(c.onclick=function(){location.href=b}));if(d.onFail){var g=d.onFail.call(this);typeof g=="string"&&(c.innerHTML=g)}}a&&(window[d.id]=document.getElementById(d.id)),f(this,{getRoot:function(){return c},getOptions:function(){return d},getConf:function(){return e},getApi:function(){return c.firstChild}})}c&&(jQuery.tools=jQuery.tools||{version:"dev"},jQuery.tools.flashembed={conf:e},jQuery.fn.flashembed=function(a,b){return this.each(function(){jQuery(this).data("flashembed",flashembed(this,a,b))})})})();



/**************
* JQUERY PLUGINS
***************/
(function($) {
	var t = $.tools.overlay; 
	t.plugins = t.plugins || {};

	/**
	 * Overlay Gallery plugin, version: 1.0.0
	 * 
	 * Copyright (c) 2009 Tero Piirainen
	 * http://flowplayer.org/tools/overlay.html#gallery
	 *
	 * Dual licensed under MIT and GPL 2+ licenses
	 * http://www.opensource.org/licenses
	 *
	 * Since  : July 2009
	 * Date: ${date}
	 * Revision: ${revision} 
	 */
	// TODO: next(), prev(), getIndex(), onChange event
	// version number
	t.plugins.gallery = {
		version: '1.0.0', 
		conf: { 
			imgId: 'img',
			next: '.next',
			prev: '.prev',
			info: '.info',
			progress: '.progress',
			disabledClass: 'disabled',
			activeClass: 'active',
			opacity: 0.8,
			speed: 'slow',
			template: '<strong>${title}</strong> <span>Image ${index} of ${total}</span>',  
			autohide: true,
			preload: true,
			api: false,
			minWidth: 0,
			minHeight: 0,
			// Addtions by Franz Koch
			attrTarget:		'el',//'el.children(\'img\')',
			useAsTitle:		'el.attr(\'title\')',//'$(\'#\'+el.attr(\'name\')).html()', //available objects: $this (jQueryObject from matching lightbox enabled item), $tgt (jQueryObject from settings.attrTarget)
			imageHolder:	'.content',
			resize: true
		}
	};			

	$.fn.gallery = function(opts) {
		
		var conf = $.extend({}, t.plugins.gallery.conf), api;
		$.extend(conf, opts);   	

		// common variables for all gallery images
		api = this.overlay();
		
		var links = this,
			 overlay = api.getOverlay(),
			 next = overlay.find(conf.next),
			 prev = overlay.find(conf.prev),
			 info = overlay.find(conf.info),
			 progress = overlay.find(conf.progress),
			 els = prev.add(next).css({opacity: conf.opacity}),
			 close = api.getClosers(), 			 
			 index,
			 animating = false,
			 targets = [],
			 imageHolder = overlay.find(conf.imageHolder) || overlay;

		// remove duplicate links (by Franz Koch)
		links = $($.grep(links, function(o, i) {
			var l = $(o).attr('href');
			if ($.inArray(l,targets) > -1) {
				return false;
			}
			targets.push(l);
			return true;
		}));

//{{{ load 

		function load(el) {
			
			//progress.fadeIn();
			overlay.addClass('loading');
			els.hide(); close.hide(); info.hide();
			animating = true;
			
			var url = el.attr("href"); 
			
			// download the image 
			var image = new Image();
			
			image.onload = function() {
				
				progress.fadeOut();
				
				// find image inside overlay
				var img = $("#" + conf.imgId, imageHolder); 
				
				// or append it to the overlay 
				if (!img.length) { 
					img = $("<img/>").attr("id", conf.imgId).css("visibility", "hidden");
					imageHolder.prepend(img);
				}
				
				// make initially invisible to get it's dimensions
				img.attr("src", url).css("visibility", "hidden"); 			
					
				// animate overlay to fit the image dimensions
				var width = Math.max(image.width,conf.minWidth),
					left = ($(window).width() - width - (overlay.outerWidth() - overlay.width())) / 2;
					
				// calculate index number
				index = links.index(links.filter("[href='" +url+ "']"));	
				
				// activate trigger
				links.removeClass(conf.activeClass).eq(index).addClass(conf.activeClass);
				
				// enable/disable next/prev links
				var cls = conf.disabledClass;
				els.removeClass(cls);

				if (index === 0) { prev.addClass(cls); }
				if (index == links.length -1) { next.addClass(cls); }
				
				// prepare title (by Franz Koch)
				var $tgt = eval(conf.attrTarget), title='', tmp;
				if(conf.useAsTitle) {
					tmp = eval(conf.useAsTitle);
					title =  tmp != 'undefined' ? tmp : '';
				} else {
					title = el.attr("title") || el.data("title") || '';
				}
				// set info text & width
				var text = conf.template
					.replace("${title}", title)
					.replace("${index}", index + 1)
					.replace("${total}", links.length),
					height = Math.max(image.height,conf.minHeight);
					
				//var padd = parseInt(info.css("paddingLeft"), 10) +  parseInt(info.css("paddingRight"), 10);
				info.html(text);//.css({width: width - padd});
				
				overlay.removeClass('loading');
				if (conf.resize) {
					overlay.animate(
						{width: width,left: left, height: height}, conf.speed, function() {
						animating = false;
						overlay.css('height','auto');
						// gradually show the image
						img.add(info).hide().css("visibility", "visible").fadeIn(function() {
							if (!conf.autohide) {
								showEls();
							}
						});
					});
				} else {
					animating = false;
					// gradually show the image
					img.add(info).hide().css("visibility", "visible").fadeIn(function() {
						if (!conf.autohide) {
							showEls();
						}
					});
				}; 
			};
			
			image.onerror = function() {
				imageHolder.html("Cannot find image " + url);
				overlay.fadeIn()
			};
			
			image.src = url;
			
			if (conf.preload) {
				links.filter(":eq(" +(index-1)+ "), :eq(" +(index+1)+ ")").each(function()  {
					var img = new Image();
					img.src = $(this).attr("href");					
				});
			}
			
		}
		
//}}}


		// function to add click handlers to next/prev links	 
		function addClick(el, isNext)  {
			el.click(function() {
				if (el.hasClass(conf.disabledClass)) { return; }				
				
				// find the triggering link
				var trigger = links.eq(i = index + (isNext ? 1 : -1));			
					 
				// if found load it's href
				if (trigger.length) { load(trigger); }
			});				
		}

		// assign next/prev click handlers
		addClick(next, true);
		addClick(prev);

		
		// arrow keys
		$(document).keydown(function(evt) {
			if (!overlay.is(":visible") || evt.altKey || evt.ctrlKey) { return; }
			
			if (evt.keyCode == 37 || evt.keyCode == 39) {					
				var btn = evt.keyCode == 37 ? prev : next;
				btn.click();
				return evt.preventDefault();
			}	
			return true;			
		});		
		
		function showEls() {
			if (!imageHolder.is(":animated") && !animating) {
				els.show(); close.show(); info.slideDown();	
			}	
		}
		
		// autohide functionality
		if (conf.autohide) { 
			overlay.hover(showEls, function() { els.fadeOut(); /*info.slideUp();*/	close.hide(); }).mouseover(showEls);
		}		
		
		// load a proper gallery image when overlay trigger is clicked
		var ret;
		
		this.each(function() {
			var el = $(this), api = el.overlay(), ret = api;
			
			api.onBeforeLoad(function() {
				load(el);
			});
			
			api.onClose(function() {
				links.removeClass(conf.activeClass);	
			});			
		});  		
		return conf.api ? ret : this;
	};



	// JUKEBOX SCRIPT BY FRANZ KOCH
	// v1.0
	// static constructs
	$.tools.jukebox = {
		conf: {	
			initialIndex: 0,
			delay: 8000,
			speed: 'medium',
			animate: true,
			show: 'fadeIn',
			hide: null,
			pauseOnHover:true,
			autoPlay:true,
			clickable:false,
			clonedClass: 'cloned',
			circular:false,
			loop:true
		} 
	};

	var current;

	// Jukebox script by Franz Koch (2010)
	function Jukebox (root,conf) {
		// current instance
		var self = this,
			fire = root.add(self),
			index = 0,
			itemWrap = root.find('.imageJukebox'),
			$slideContainer = root.find('.teaser'),
			isAnimating = false,
			hovered = false,
			h=itemWrap.height(),
			timer = null,
			scroller = null,
			count = 0;
				
		if (!current) { current = self; } 

		// methods
		$.extend(self, {
			play: function() {
				if(!hovered && conf.autoPlay) {
					self.preload(self.getNextIndex(),$.noop);
					timer = setTimeout(self.next,conf.delay);
				}
			},

			pause: function() {
				clearTimeout(timer);
			},

			getConf: function() {
				return conf;	
			},			
			
			getIndex: function() {
				return index;	
			},
			
			getNextIndex: function() {
				if (self.getIndex() + 1 >= self.getSize()) {
					return 0;
				}
				return self.getIndex()+1;
			},

			getIdByIndex: function(index) {
				var $t = index.jquery ? index : self.getItems().eq(index),
					id;
				$($t.attr('class').split(' ')).each(function() {
					if(this.toString().substr(0,2) == 'id') {
						id = this.toString();
					}
				});
				return id;
			},

			getSize: function() {
				return self.getItems().size();	
			},
			
			getRoot: function() {
				return root;	
			},

			getScroller: function() {
				return scroller;	
			},

			getItemWrap: function() {
				return itemWrap;	
			},

			getItems: function() {
				return itemWrap.children().not("." + conf.clonedClass);	
			},
							
			move: function(offset, time) {
				return self.seekTo(index + offset, time);
			},
			
			next: function(time) {
				return self.move(1, time);	
			},
			
			prev: function(time) {
				return self.move(-1, time);	
			},
			
			begin: function(time) {
				return self.seekTo(0, time);	
			},
			
			end: function(time) {
				return self.seekTo(self.getSize() -1, time);	
			},	
			
			focus: function() {
				current = self;
				return self;
			},
			
			addItem: function(item) {
				item = $(item);
				self.getScroller().addItem(item)
				fire.trigger("onAddItem", [item]);
				return self;
			},

			doTransition: function(id,callback) {
				isAnimating = true;
				self.preload(id, function() {
					var slide = $slideContainer.children('.'+self.getIdByIndex(id)),
						lastSlide = $slideContainer.find('.current').css('z-index',0);
					self.animateSlide(slide,'show',function() {
						self.animateSlide(lastSlide,'hide', function() {
							callback.call();
							isAnimating = false
						});
					})
				});
			},

			animateSlide: function($t,transition,fn) {
				if ($t.length) {
					if (transition == 'hide') {
						$t.removeClass('current').css('z-index',0).hide();
						fn.call();
					} else {
						$t.hide().addClass('current').css('z-index',Number(self.getSize()))[conf[transition]](conf.speed,function() {
							fn.call();
						});
					}
				}
			},

			preload: function(i,callback) {
				var $t = self.getScroller().getItems().eq(i),img,imgUrl,id=self.getIdByIndex(i);
				
				if (id && !$slideContainer.find('.'+id).length) {
					imgUrl = $t.attr('title');
					if (imgUrl !== 'undefined' && imgUrl != '') {
						img = new Image();
						img.onload = callback;
						img.src = imgUrl;
						var $a = $('<a href="'+$t.find('a').attr('href')+'" class="'+id+'"></a>').hide();
						$slideContainer.append($a.html($(img)));
						return self;
					}
				}
				callback.call();
			},


			// all seeking functions depend on this
			seekTo: function(i, time, fn) {	
				self.pause();

				// ensure numeric index
				if (!i.jquery) { i *= 1; }

				// check that index is sane				
				if (!conf.circular && i < 0 || i > self.getSize() || i < -1 || isAnimating) { return self; }
		
				var item = i,
					scrollIndex = self.getScroller().getIndex();
			
				if (i.jquery) {
					i = self.getItems().index(i);	
				} else {
					item = self.getItems().eq(i);
				}  
			
				// onBeforeSeek
				var e = $.Event("onBeforeSeek"); 
				if (!fn) {
					fire.trigger(e, [i, time]);				
					if (e.isDefaultPrevented() || !item.length) { return self; }			
				}  

				index = i;
				current = self;  
				if (time === undefined) { time = conf.speed; }


				if (i - scrollIndex > count-1 || i < scrollIndex) {
					var seek = Math.min((self.getSize() - count), i);
					self.getScroller().seekTo(seek,conf.speed,function() {
						self.seekTo(i);
					});
				}/* else if ((i - scrollIndex == count-1) && (self.getSize() > count || conf.circular)) {
					self.getItems().removeClass('current').eq(i).addClass('current');
					self.doTransition(item,self.play);
					timer = setTimeout(function() {
						self.getScroller().seekTo(i,conf.speed,function() {
							timer = setTimeout(self.next,conf.delay/2);
							})
						},conf.delay/2);
				}*/ else {
					self.getItems().removeClass('current').eq(i).addClass('current');
					self.doTransition(i,self.play);
				}

				return self; 
			}					
			
		});
				
		// callbacks	
		$.each(['onBeforeSeek', 'onSeek', 'onAddItem'], function(i, name) {
			// configuration
			if ($.isFunction(conf[name])) { 
				$(self).bind(name, conf[name]); 
			}
			
			self[name] = function(fn) {
				$(self).bind(name, fn);
				return self;
			};
		});

		if(self.getSize() > 1) {
			count = Math.round(h / self.getItems().eq(0).outerHeight());
			$slideContainer.css('height',$slideContainer.height());
			$slideContainer.children().css('z-index',0).hide().eq(0).addClass('current').show();
			root.addClass('jsEnhanced');

			// apply scrollable
			var $canvas = itemWrap.wrap('<div class="scrollerCanvas"></div>').parent().css('height',h);
				$container = $canvas.wrap('<div class="scrollerContainer"></div>').parent();

			if (self.getSize() > count || conf.circular) {
				var $menu = $('<ul class="scrollerNavi"></ul>').hide().appendTo($container);
				$menu.append('<li class="down"><a title="'+$.enet.l18n('showNextImage')+'"><dfn title="'+$.enet.l18n('showNextImage')+'">v</dfn></a></li>')
					.find('.down').click(self.next);
			}

			scroller = $container.scrollable({items:itemWrap,visible:count,clickable:false,vertical:true,circular:conf.circular,api:true,
				onBeforeSeek: function() { scroller.getItems().removeClass('current'); },
				onSeek: function() { scroller.getItems().eq(scroller.getIndex()).addClass('current'); }
			});
			itemWrap.children('.cloned').removeClass('current');

			if(!conf.clickable) {
				itemWrap.children().each(function(i) {
					$(this).click(function(e) {
						self.seekTo(i);
						return e.preventDefault();
					})
				});
			}

			if(conf.pauseOnHover) {
				root.hover(




					function() {
						self.pause();
						$menu.show();
						hovered = true;
					},
					function() {
						hovered = false;
						$menu.hide();
						self.play();
					}
				);
			}

			// initial index
			if (conf.initialIndex) {
				self.seekTo(conf.initialIndex, 0, function() {});
			} else if (conf.autoPlay) {
				//autoplay
				self.play();
			}
			
			if (conf.circular) {
				self.onBeforeSeek(function(e, i, time){
					if (e.isDefaultPrevented()) { return; }
				});
			// loop
			} else if (conf.loop) {
				self.onBeforeSeek(function(e, i, time){
					if (e.isDefaultPrevented()) { return; }
					if (i < 0) {
						self.seekTo(self.getSize()-1,time);
						return e.preventDefault();
					} else if (i >= self.getSize()) {
						self.seekTo(0,time);
						return e.preventDefault();
					}
				});
			}
		}
	};

	// jQuery plugin implementation
	$.fn.jukebox = function(conf) { 
			
		// already constructed --> return API
		var el = this.data("jukebox");
		if (el) { return el; }		 

		conf = $.extend({}, $.tools.jukebox.conf, conf); 
		
		this.each(function() {			
			el = new Jukebox($(this), conf);
			$(this).data("jukebox", el);	
		});
		
		return conf.api ? el: this; 
		
	};




	// Diashow script by Franz Koch (2010)
	// v1.0
	$.fn.diashow = function(options) {
		var defaults = {
			start: 0,
			delay: 10000,
			hide: 'fadeOut',
			show: 'fadeIn',
			speed: 'slow',
			animate: true,
			loop: true,
			animateAtSameTime: false,
			randomize: false,
			pauseOnHover:false,
			applyHeightToContainer:false,
			autoPlay:true,
			buttonNext:false,
			buttonPrev:false,
			swapTransitions:false,
			swapDepth:false,
			api:false,
			enableHover:true
		},
			isAnimating = false,
			stopped = false,
			lastSlide = null,
			timer = null,
			self = this;

		self.options = jQuery.extend(defaults, options);

		// bind all callbacks from configuration
		$.each(self.options, function(name, fn) {
			if ($.isFunction(fn)) { self.bind(name, fn); }
		});

		$.extend(self,{
			getNextSlide: function() {
				if(self.options.randomize && slides > 2) {
					if(slideNo >= slides-1) {
						slideNo = 0;
						slideStack = $.shuffle(slideStack);
					} else {
						slideNo++;	
					}
					var oldSlide = slide;
					slide = slideStack[slideNo];
					if(slide == oldSlide) {
						slide = slideStack[++slideNo];
					}
				} else if (self.options.loop && slide+1 == slides) {
					slide = 0;
				} else {
					slide++;	
				}
			},
			getPrevSlide: function() {
				if (self.options.loop && slide-1 < 0) {
					slide = slides-1;
				} else {
					slide--;	
				}
			},
			setEnableHover: function(v) {
				self.options.enableHover = v;	
			},
			startTimer: function() {
				if((self.options.loop || (slide+1 < slides && slide > -1)) && !hovered && !stopped && self.options.autoPlay) {
					timer = setTimeout(self.next,self.options.delay);
				}
			},
			stopTimer: function() {
				clearTimeout(timer);
			},
			stop: function() {
				self.stopTimer();
				stopped = true;
			},
			play: function() {
				stopped = false;
				self.startTimer();
			},
			gotoSlide: function(no) {
				if(no >= 0 && no <= slides && no != slide) {
					self.stopTimer();
					self.doTransition(function() {
						slide = no;
					});
				}
			},
			next: function() {
				if((self.options.loop || (slide+1 < slides && slide > -1)) && !isAnimating) {
					self.stopTimer();
					self.doTransition(self.getNextSlide);
				}
			},
			prev: function() {
				if((self.options.loop || slide-1 >= 0) && !isAnimating) {
					self.stopTimer();
					self.doTransition(self.getPrevSlide);
				}
			},
			doTransition: function(getSlideFunc) {

				if(lastSlide) {
					$childs.eq(lastSlide).hide();
				}
				lastSlide = slide;
				getSlideFunc();

				var first = self.options.swapTransitions ? 'show' : 'hide',
					last = self.options.swapTransitions ? 'hide' : 'show',
					fS = self.options.swapTransitions ? slide : lastSlide,

					lS = self.options.swapTransitions ? lastSlide : slide;

				// onBeforeTransition
				var e = $.Event("onBeforeTransition");
				self.trigger(e, [lastSlide,slide]);				
				if (e.isDefaultPrevented()) { return self; }

				isAnimating = true;
				if (self.options.animateAtSameTime) {
					self.animateSlide(fS,first);
					self.animateSlide(lS,last,self.onAfterTransition);
				} else {
					self.animateSlide(fS,first,function() {
						self.animateSlide(lS,last,self.onAfterTransition);
					});
				}
			},
			animateSlide: function(nr,transition,fn) {
				var $t = $childs.eq(nr),zindex = $t.css('z-index');
/*
				// until a good solution is found, hardcode a resouce friendly animation as fading at the same time is quite processor hungry
				if (transition == 'hide') {
					$t.css('z-index',0).toggleClass('active');
					self.transitionFinished(fn);
				} else {
					$t.css('z-index',Number(slides))[options[transition]](options.speed,function() {
						$t.toggleClass('active');
						self.transitionFinished(fn);
					});
				}
*/
				if (self.options.swapDepth) {
					$t.css({'z-index': (transition == 'hide' ? 0 : Number(slides))});
				}
				if(!self.options.animate) {
					$t.toggleClass('active')[transition]();
					self.transitionFinished(fn);
				} else if(self.options[transition] === null || self.options[transition] === false) {
					zindex = (transition == 'hide' ? /*slides *-1*/0 : Number(slides))/*(zindex != 'auto' ? Number(zindex) : 0) +*/;
					$t.css({'z-index':zindex}).toggleClass('active');
						self.transitionFinished(fn);
				} else if(self.options[transition] == 'animate') {
					$t.animate(self.options[transition+'Params'],self.options.speed,self.options[transition+'Easing'],function() {
						$.toggleClass('active');
						self.transitionFinished(fn);
					});
				} else {
					$t[self.options[transition]](self.options.speed,function() {
						$t.toggleClass('active');
						self.transitionFinished(fn);
					});
				}
				var e = $.Event("onTransition");
				self.trigger(e, [nr]);
			},
			onAfterTransition: function() {
				$childs.eq(lastSlide).hide().css('z-index',0);
				self.startTimer();

				// onAfterTransition
				var e = $.Event("onAfterTransition");
				self.trigger(e, [lastSlide,slide]);				
				if (e.isDefaultPrevented()) { return self; }
			},
			transitionFinished: function(fn) {
				if($.isFunction(fn)) { fn.call() }
				isAnimating = false;
			}
		});

		function _init() {
			if(slides > 1) {
				if(self.options.buttonNext) {
					self.options.buttonNext.click(function() {self.next();return false;});	
				}
				if(self.options.buttonPrev) {
					self.options.buttonPrev.click(function() {self.prev();return false;});	
				}

				classes = $this.attr('class').split(' ');
				$(classes).each(function() {
					var strParts = this.split('-');
					if(strParts[0] == 'opt') {
						self.options[strParts[1]] = strParts[2];	
					}
				});

				if(self.options.applyHeightToContainer) {
					if($this.height() > 20) {
						$this.css('height',$this.height());
					} else {
						var heightTimer = setInterval(function() {
							var h = $this.children().eq(0).height();
							if(h > 20) {
								$this.css('height',h);
								clearInterval(heightTimer);
							}
						},200);
					}
				}
				$this.addClass('slideshowActive');

				for(var i=0; i < slides; i++) {
					slideStack.push(i);
				}
				if(self.options.randomize) {
					slideStack = $.shuffle(slideStack);
				}
				$childs.removeClass('active').addClass(selector).eq(slide).addClass('active');
				if(self.options.pauseOnHover) {
					$childs.children().hover(
						function() {
							if(self.options.enableHover) {
								self.stopTimer();
							}
							hovered = true;
						},
						function() {
							hovered = false;
							if (self.options.enableHover) {
								self.startTimer();
							}
						}
					);
				}
				self.startTimer();
			}
		}

		var $this = $(this),
			selector = 'slideShowItem',
			$childs = $this.children(),
			slides = $childs.length,
			slide = self.options.start,
			slideStack = [],
			slideNo = 0,
			hovered = false,
			classes = [];
		
		$this.load(_init());
		return self.options.api ? self : $this;
	};


	/*
	 * jQuery shuffle
	 *
	 * Copyright (c) 2008 Ca Phun Ung <caphun at yelotofu dot com>
	 * Dual licensed under the MIT (MIT-LICENSE.txt)
	 * and GPL (GPL-LICENSE.txt) licenses.
	 *
	 * http://yelotofu.com/labs/jquery/snippets/shuffle/
	 *
	 * Shuffles an array or the children of a element container.
	 * This uses the Fisher-Yates shuffle algorithm <http://jsfromhell.com/array/shuffle [v1.0]>
	 */

	$.fn.shuffle = function() {
		return this.each(function(){
			var items = $(this).children();
			return (items.length) ? $(this).html($.shuffle(items)) : this;
		});
	}
	
	$.shuffle = function(arr) {
		for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
		return arr;
	}
})(jQuery); // Call and execute the function immediately passing the jQuery object


/**************
* CUSTOM SCRIPTS FOR WEBSITE
***************/

	/**
	 * MINI BROWSER
	 */
	function MiniBrowser(root,conf) {
		var self = this,
			fire = null,
			settings = {
				allowCaching: true, // 'false' will turn off caching completely, 'session' will only clear the cache when 'reset()' is triggered and a new browser sessions is created
				canvas: '#miniBrowser'
			};

		self.settings = jQuery.extend(settings, conf);
		self.cache = {history:[],content:[]};
		self.historyIndex = -1;
		self.$canvas = self.settings.canvas;
		self.$container = null;


		// callbacks	
		$.each(['onUnload', 'onUpdate', 'onAfterUpdate', 'onLoad', 'onNext', 'onBack'], function(i, name) {
			// configuration
			if ($.isFunction(self.settings[name])) { 
				$(self).bind(name, self.settings[name]); 
			}
			/*self[name] = function(fn) {
				$(self).bind(name, fn);
				return self;
			};*/
		});

		$.extend(self, {
			init: function(t) {
				self.reset();
				self.$container = t || (typeof(root) != 'undefined' ? $(root) : $('body'));
				if (typeof(root) != 'undefined') {
					fire = root.add(self);
				} else {
					fire = self.$container.add(self);
				}
			},
			reset: function() {
				self.cache.history = [];
				self.historyIndex = -1;
				if (!self.settings.allowCaching || self.settings.allowCaching == 'session') {
					self.cache.content = [];
				}
			},

			goto : function(uri) {
				self.unload();

				// fire event
				var e = $.Event("onLoad");
				fire.trigger(e, [uri, self]);		
				if (e.isDefaultPrevented()) { return self; }

				cont = self.getFromCache(uri);

				if (typeof(cont) == 'undefined' || cont == null || !cont.length) {
					$.post(uri, function(data,status) {
						if (status === 'success' || status === 'notmodified') {
							var content = $('#content',data).html();
							self.updateCache(uri, content);
							self.update(uri, content);
						} else {
							window.location = uri;
						}
					},'html');
				} else {
					self.update(uri, cont);
				}
			},
			unload: function() {
				// fire event
				var e = $.Event("onUnload");
				fire.trigger(e, [self]);		
				if (e.isDefaultPrevented()) { return self; }
				
				self.$canvas.html('');
			},
			update : function(uri,content) {
				// fire event
				var e = $.Event("onUpdate");
				fire.trigger(e, [uri, content, self]);		
				if (e.isDefaultPrevented()) { return self; }

				self.$canvas.html( content );
				self.history.add(uri);

				// fire event
				var e = $.Event("onAfterUpdate");
				fire.trigger(e, [uri, content, self]);		
				if (e.isDefaultPrevented()) { return self; }
			},

			history : {
				add : function(uri) {
					// only update if we where not jumping back and forth in the history
					if (uri != self.cache.history[self.historyIndex]) {
						// if history is longer then current index and we have a different URI
						// we where browsing the history and took a different route. 
						// Thus clear the later history indexes and begin a new route.
						if (self.historyIndex+1 < self.cache.history.length) {
							self.cache.history = self.cache.history.slice(0,self.historyIndex+1);
						}
						self.cache.history[++self.historyIndex] = uri;
					}
				},
				back : function() {
					// fire event
					var e = $.Event("onBack");
					fire.trigger(e, [self]);		
					if (e.isDefaultPrevented()) { return self; }

					if (self.historyIndex > 0) {
						self.goto(self.cache.history[--self.historyIndex]);
					}
				},
				next : function() {
					// fire event
					var e = $.Event("onNext");
					fire.trigger(e, [self]);		
					if (e.isDefaultPrevented()) { return self; }

					if (self.historyIndex+1 < self.cache.history.length) {
						self.goto(self.cache.history[++self.historyIndex]);
					}
				}
			},

			updateCache: function(uri, c) {
				if (self.settings.allowCaching) {
					self.cache.content[uri] = c;
				}
			},
			getFromCache: function(uri) {
				return self.cache.content[uri];
			}
		});
	};


(function($) {
	// General methods
	var base = $('base').attr('href'),
		$closeButton = $('<span class="close"></span>');
	$.enet = {};
	$.enet.baseUrl = base.substr(-1) != '/' ? base+'/' : base;
	$.enet.protocol = (document.location.protocol == 'https:' ? 'https:' : 'http:')+'//';
	$.enet.templatePath = 'templates/dnkid/';
	$.enet.absTemplatePath = $.enet.baseUrl+$.enet.templatePath;
	$.enet.locale = typeof(locale) != 'undefined' ? locale : 'de';
	$.enet.ajaxType = '644';

	/**
	 * STORE SELECTOR
	 */
	function StoreSelector(root,conf) {
		// current instance
		var self = this,
			fire = null,
			settings = {};

		self.settings = jQuery.extend(settings, conf);
		self.gmap = null;
		self.listeners = [];
		self.$container = null;
		self.ajaxError = false;

		// callbacks	
		$.each(['onBeforeInit', 'onAfterInit', 'onInitForm', 'onUnload', 'onUpdate', 'onDraw', 'onAddItem', 'onClick', 'onItemSelect'], function(i, name) {
			// configuration
			if ($.isFunction(self.settings[name])) { 
				$(self).bind(name, self.settings[name]); 
			}
			/*self[name] = function(fn) {
				$(self).bind(name, fn);
				return self;
			};*/
		});

		// methods
		$.extend(self, {
			init: function(t) {
				self.$container = t || (typeof(root) != 'undefined' ? $(root) : $('body'));
				if (typeof(root) != 'undefined') {
					fire = root.add(self);
				} else {
					fire = self.$container.add(self);
				}

				self.listeners = [];

				// onInit
				var e = $.Event("onBeforeInit");
				fire.trigger(e, [self]);

				self.initForm();
				self.initMap();

				// onInit
				var e = $.Event("onAfterInit");
				fire.trigger(e, [self]);
			},
			
			initMap: function() {
				var $sS = self.$container.find('#storeSelector');
				if ($sS.length) {
					var id = self.$container.find('#storeSelector .googleMap').attr('id');
					if (id) {
						self.gmap = new $.enet.googleMap(id);
						self.gmap.init(function() {self.construct()});
					}
					$sS.addClass('jsEnabled');
				}
			},
			
			initForm: function() {
				var $f = self.$container.find('#storeSelectorForm');
				if ($f.length) {
					var cls = $f.attr('class'), conf;
					if (typeof(cls) == 'string' && cls.length) {
						$(cls.split(' ')).each( function(i) {
							if (this.substr(0,3) == 'ce-') {
								conf = this.substr(3);	
							}
						});
					}
					
					$f.find(':checkbox').bind(($.browser.msie || $.browser.opera ? 'focus' : 'change'),function(e) {$f.submit()});
		
					// add Ajax loading for the form
					$f.submit(function(e) {
						var $t = $(this), args = $t.serialize();
						if ($t.data('activeRequest') == true || $t.find('#location').val() == '') {
							return false;	
						}
						if(self.ajaxError == false) {
							$.enet.loader.display($.enet.l18n('searchingStore'));
							$t.data('activeRequest',true);
							$.ajax({
								type: 'POST',
								url: $.enet.absoluteUrl($t.attr('action')),
								data: 'type='+$.enet.ajaxType+'&config='+conf+'&'+args,
								success: function(data,status) {$t.data('activeRequest',false); $.enet.loader.hide(); self.update(data,status)},
								error: function(status) {$t.data('activeRequest',false); $.enet.loader.hide(); self.ajaxError = true; $t.submit()},
								dataType: 'xml',
								cache:false
							});
							return false;
						} else {
							return true;
						}
					});

					// onInitForm
					var e = $.Event("onInitForm");
					fire.trigger(e, [self, $f]);
					if (e.isDefaultPrevented()) { return self; }
				}
			},
			
			construct: function() {
				if (google.maps.BrowserIsCompatible()) {
					//googleDirMap{mapId} = new GDirections($.enet.googleMaps.get("map{mapId}"));
					//GEvent.addListener(googleDirMap{mapId}, "error", handleErrors_map{mapId});
					self.gmap.getMap().addControl(new google.maps.SmallMapControl());
					self.gmap.getMap().addControl(new google.maps.ScaleControl());
					self.draw();
				}
			},
	
			unload: function() {
				// onUnload
				var e = $.Event("onUnload");
				fire.trigger(e, [self]);			
				if (e.isDefaultPrevented()) { return self; }
		
				if(typeof(self.gmap) == 'object' && self.gmap !== null) {
					self.gmap.destruct();
					delete(self.gmap);
				}
				if (typeof(google.maps) !== 'undefined') {
					for(var i=1; i < self.listeners.length; i++) {
						google.maps.Event.removeListener(self.listeners[i]);
					}
					google.maps.Unload();
				}
			},

			draw: function() {
				if (google.maps.BrowserIsCompatible()) {
					var $sidebar = $('ul.storeList', self.$container), lat=null, lng=null, hasLocation=false, isOverview = $sidebar.hasClass('overview'), $windowContent = $('<div id="gWindowContent" />').appendTo(self.$container).wrap('<div style="display:none"></div>');
					//center to germany
					//self.gmap.getMap().setCenter(new google.maps.LatLng(51.23124015, 10.18213845), 5);
					// add home marker
					$($sidebar.attr('class').split(' ')).each(function() {
						if(this.substr(0,4) == 'lat-') { lat=this.substr(4); }
						if(this.substr(0,5) == 'long-') { lng=this.substr(5); }
					});
					if (lat && lng) {
						var visitor = self.gmap.addMarker(0, [lat,lng], 'home', 0);
						self.gmap.getMap().addOverlay(visitor,0,15);
						hasLocation=true;
					}
	
					// add stores
					$sidebar.children().each(function(i) {
						var $t = $(this);
						lat=null, lng=null;
						$($t.attr('class').split(' ')).each(function() {
							if(this.substr(0,4) == 'lat-') { lat=this.substr(4); }
							if(this.substr(0,5) == 'long-') { lng=this.substr(5); }
						});
						if(lat && lng) {
							var info = false, marker = self.gmap.addMarker(i, [lat,lng], 'default', 0);
	
							self.gmap.getMap().addOverlay(marker,5,15);
							self.listeners.push(google.maps.Event.addListener(marker, "mouseover", function() { $t.addClass('hover'); $sidebar.stop().animate({scrollTop:'+='+($t.offset().top - $sidebar.offset().top)+'px'}, 200)}));
							self.listeners.push(google.maps.Event.addListener(marker, "mouseout", function() { $t.removeClass('hover') }));
	
	
							self.listeners.push(google.maps.Event.addListener(marker, "click", function() { $t.click() }));
							//marker.bindInfoWindowHtml(windowContent);
							$t.hover(function() {$t.addClass('hover')}, function(){$t.removeClass('hover')})
								.click(function() {
									// onClick
									var e = $.Event("onClick");
									fire.trigger(e, [$t,marker,self]);			
									if ( e.isDefaultPrevented() ) { return e.preventDefault(); }
									
									$windowContent.empty().append($t.clone(true).children());
									marker.openInfoWindow($windowContent.get(0)); $sidebar.children().removeClass('active'); $t.addClass('active');
								});
							
							// onAddItem
							//var e = $.Event("onAddItem");
							//fire.trigger(e, [$t,marker,self]);
						}
		
					});
					// open baloonTip of nearest store if a user location is given
					if (hasLocation && !isOverview) {
						if($sidebar.children('.active').length) {
							$sidebar.children('.active').eq(0).click().hover();
						} else {
							$sidebar.children().eq(0).click().hover();
						}
					}
					var llBounds = new google.maps.LatLngBounds(new google.maps.LatLng(self.gmap.bounds.sw.lat,self.gmap.bounds.sw.lng), new google.maps.LatLng(self.gmap.bounds.ne.lat,self.gmap.bounds.ne.lng));
					self.gmap.getMap().setCenter(llBounds.getCenter(), self.gmap.getMap().getBoundsZoomLevel(llBounds));
					//$.enet.googleMaps.addMarkersToManager("map{mapId}", 0, 5, 17);
					// onDraw
					var e = $.Event("onDraw");
					fire.trigger(e, [self]);
				}
			},
			update: function(data,status) {
				var $list = self.$container.find('#storeSelector .multicolumn');
				// onUpdate
				var e = $.Event("onUpdate");
				fire.trigger(e, [data,status,self]);

				if (status == 'success' || status == 'notmodified') {
					var $resp = $($('data',data).text()), $newStores = $resp.find('ul.storeList'), $oldMessages = $('#messages'), $message = $resp.find('#messages');
					if ($oldMessages.length) {
						$oldMessages.remove();
					}
					if ($message.length) {
						self.$container.find('#storeSelectorForm').after($message);
					}
	
					if ($newStores.length) {
						if (!self.$container.find('#storeSelector').length) {
							$.enet.enrichContent($resp);
							$resp.hide();
							self.$container.html($resp);
							$resp.fadeIn();
							self.initMap();
						} else if (!$list.length) {
							$list = $resp.find('.multicolumn');
							$('#storeSelectorForm').after($list);
							self.initMap();
						} else {
							$('ul.storeList').replaceWith($newStores);
							$list.show();
							self.redraw();
						}
					} else {
						$list.hide();	
					}
				} else {
					self.ajaxError = true; 
					$('#storeSelectorForm').submit(false);
				}
			},
			redraw: function() {
				if (typeof(self.gmap) == 'object') {
					self.gmap.clear();
				}
				self.draw();
			}
		});
	};

	// jQuery plugin implementation
	$.fn.storeSelector = function(conf) { 
		// already constructed --> return API
		var el = this.data("storeSelector");
		if (el) { return el; }		 

		conf = $.extend({}, conf); 

		this.each(function() {			
			el = new StoreSelector($(this), conf);
			el.init($(this));
			$(this).data("storeSelector", el);
		});

		return conf.api ? el: this; 
	};



/**************
* LOCALIZATION
***************/
	$.enet.lll = {
		'default' : {
			// general
			'error'						:	'Error',
			'attention'					:	'Attention',
			'close'						:	'Close',
			// lightbox
			'showNextImage'			:	'next Image',
			'showPrevImage'			:	'previous Image',
			'image'						:	'Image',
			'of'							:	'of',
			// form validation
			'pleaseSelect'				:	'Please select',
			'evalMsgValidEmail'			:	'Please enter a valid e-mail address',
			'evalMsgFillRequiredFields' :	'Please fill a marked fields',
			'evalMsgInteger'			:	'Please enter a valid number for ${label}',
			'evalMsgRepeat'			:	'The repeated input did not match the first one',
			// ajax
			'errorMessageAjaxRequest' 	:	'An error occured during your request. Please try again later.',
			'searchingStore'			:	'searching'
		},
		'de' : {
			// general
			'error'						:	'Fehler',
			'attention'					:	'Achtung',
			'close'						:	'Schließen',
			// lightbox
			'showNextImage'			:	'nächstes Bild',
			'showPrevImage'			:	'vorheriges Bild',
			'image'						:	'Bild',
			'of'							:	'von',
			// form validation
			'pleaseSelect'				:	'Bitte wählen',
			'evalMsgValidEmail'		:	'Geben Sie eine gültige E-Mail-Adresse an',
			'evalMsgFillRequiredFields' :	'Bitte füllen Sie alle markierten Felder aus.',
			'evalMsgInteger'			:	'Geben Sie bei ${label} eine gültige Zahl ein',
			'evalMsgRepeat'			:	'Die wiederholte Eingabe stimmt leider nicht mit der ersten überein',
			// ajax
			'errorMessageAjaxRequest' 	:	'Bei der Verarbeitung Ihrer Anfrage ist leider ein Fehler aufgetreten. Bitte versuchen Sie es erneut.',
			'searchingStore'			:	'Suche Fachhändler'
		}
	};
	
	$.enet.l18n = function (k) {
		try {
			return $.enet.lll[$.enet.locale][k];
		} catch(e) {
			try {
				return $.enet.lll['default'][k];
			} catch(e) {
				return '';
			}
		}
	}


/**************
* HELPER FUNCTIONS
***************/

	$.enet.absoluteUrl = function(url) {
		if (!url.match(/^(http|https|ftp):\/\/.*/)) {
			url = $.enet.baseUrl+(url.substr(0,1) == '/' ? url.substr(1) : url);
		}
		return url;
	}


	$.enet.extendImageRotator = function(selector,url) {
		$t = $(selector);
		if($t.hasClass('imageRotator')) {
			$.get(url,function(data,status) {
				if(status == 'success' || status == 'notmodified') {
					var $d = $($('data',data).text()),
						$items = $d.children('li').removeClass('first'),
						current = $t.children('li').removeClass('last').attr('id');
					$d.hide();
	
					if($items.length > 1) {
						$items.each(function() {
							if($(this).attr('id') == current) {
								$(this).remove();
							}
						});
						$items.appendTo(selector);
						$.enet.enableDiaShow($t);
					}
					$d.remove();
				}
			},'xml');
		}
	}
	$.enet.enableDiaShow = function(t) {
		if(t.children().length > 1) {
			t.diashow({delay:3000,speed:2000,randomize:true,applyHeightToContainer:true,animateAtSameTime:true,pauseOnHover:false});
		}
	}


	$.enet.enrichContent = function(selector) {
		var $s = $(selector);

		// slideshows
		$s.find('.imageRotator').each(function() {
			$.enet.enableDiaShow($(this));
		});


		// equal height of multicolumn FCEs
		$s.find('div.multicolumn').each(function(){
			var $fceCol = $(this), h = $fceCol.innerHeight();
			if ($fceCol.children('[class*=framed]').length) {
				$fceCol.children('div').css('height',h);
			}
		});

		// tabs
		$s.find('.tabs').each(function() {
			var $tab = $(this);
			if ($tab.children('.pane').length > 1) {
				var $m = $('<ul class="tabNavi"></ul>');
				$tab.children('.pane').each(function(){
					var $t = $(this), h = $t.find('h2:first, .tabHeader:first').hide().html();
					if (h != null && h.length) {
						$m.append('<li><a href="#'+$t.attr('id')+'">'+h+'</a></li>');
					}
				});
				$tab.wrapInner('<div class="tabContent"></div>');
				$tab.find('.tabContent').append('<span class="clearFix"></span>');
				$tab.prepend($m);
				api = $m.tabs($m.next().children('.pane'),{effect:'fade',api:true,
					onClick: function(e,i) {
						var p = api.getCurrentPane(), i = $(p).find('.tx-wecmap-map').attr('id'), m = mark = null;
						if (i != null && typeof(WecMap) != null) {
							mark = WecMap.markers[i][0][0];
							m = WecMap.get(i);
							m.checkResize();
							m.setCenter(mark.getLatLng());
							GEvent.trigger(mark,'click');
						}
						return true;
					}
				});
			}
		});

		// accordeon
		$s.find('.accordeon').each(function() {
			var $t = $(this).addClass('jsEnhanced');
			$t.children('h3:first').addClass('current');
			$t.children('.pane:first').css('display','block');
			$t.tabs($t.children('.pane'), {tabs: 'h3', effect: 'slide', initialIndex: null});
		});

		// Teasers
		$s.find('ul.teaserList').each(function() {
			var $t = $(this), $c = $t.children(), $container='', $menu='', api;
			if($c.length > 1) {
				$container = $t.wrap('<div class="slideshowContainer"></div>').parent();
				$menu = $('<ul class="scrollerNavi"></ul>').appendTo($container);
				$menu.append('<li class="prev"><a title="'+$.enet.l18n('showPrevImage')+'"><span>&nbsp;<dfn title="'+$.enet.l18n('showPrevImage')+'">&lt;</dfn></span></a></li><li class="next"><a title="'+$.enet.l18n('showNextImage')+'"><span>&nbsp;<dfn title="'+$.enet.l18n('showNextImage')+'">&gt;</dfn></span></a></li>');

				teaserApi = $t.diashow({delay:6000,speed:1000,buttonPrev:$menu.find('.prev a'),buttonNext:$menu.find('.next a'),applyHeightToContainer:true,swapDepth:true,hide:null,randomize:false,api:true,animateAtSameTime:false,pauseOnHover:true/*,animate:($.browser.msie ? false : true)*/
/*					,
					onTransition:function(e,slide) {
						//use a slight delay for the detection in order for the player/object to be initiated
						var t = setTimeout(function() {
							var $p = $t.children().eq(slide).find('[id^=mediaPlayerNo]');
							$p.each(function() {
								var p = document.getElementById($(this).attr('id'));
								if (typeof(p) == 'object' || typeof(p) == 'function') {
									try {
										p.StopPlay();
									} catch (e) {}
								}
							});
						},10);
					},
					onAfterTransition:function(e,last,current) {
						$menu.children().removeClass('current');
						$menu.children().eq(current).addClass('current');
						var $p = $t.children().eq(current).add($t.children().eq(last));
						$p.find('[id^=mediaPlayerNo]').each(function() {
							var $i = $(this),
								p = document.getElementById($i.attr('id'));
							if (typeof(p) == 'object' || typeof(p) == 'function') {
								try {
									if($i.closest('li').index() == current) {
										p.Play();
									} else {
										p.Rewind();
									}
								} catch (e) {}
							}
						});
					}
*/
				});
/*
				// numbered menu
				$c.each(function(nr) {
					var $link = $('<a href="#">'+(nr+1)+'</a>'),$item = $('<li></li>').append($link);
					$menu.append($item);
					$link.bind('click',function() {
						teaserApi.gotoSlide(nr);
						return false;
					}).hover(function() {teaserApi.stop()},function() {teaserApi.play()});
				});
				$container.append($menu);
				$menu.fadeIn().children().eq(0).addClass('current');
*/
/*
				// mediaPlayer
				$.enet.addMediaPlayer($t,teaserApi);
*/
			}/* else {
				// mediaPlayer
				$.enet.addMediaPlayer($t);
			}*/
		});

		// scroller
		$s.find('.scrollable').each(function() {
			var $scroller = $(this), $childs = $scroller.children(), $container='',$menu='', w=$scroller.outerWidth(), h=0, count = Math.round(w / $childs.eq(0).outerWidth()), mT = $scroller.css('margin-top'), mB = $scroller.css('margin-bottom');
			if($childs.outerWidth() * $childs.length > w) {
				$canvas = $scroller.wrap('<div class="scrollerCanvas"></div>').parent();
				$container = $canvas.wrap('<div class="scrollerContainer"></div>').parent().css({'margin-top':mT, 'margin-bottom':mB});
				h = $scroller.css({'margin-top':0,'margin-bottom':0}).outerHeight();
				$canvas.css( {'width':w, 'height':h});
				$menu = $('<ul class="scrollerNavi"></ul>');
				$menu.append('<li class="prev"><a title="'+$.enet.l18n('showPrevImage')+'"><span>&nbsp;<dfn title="'+$.enet.l18n('showPrevImage')+'">&lt;</dfn></span></a></li><li class="next"><a title="'+$.enet.l18n('showNextImage')+'"><span>&nbsp;<dfn title="'+$.enet.l18n('showNextImage')+'">&gt;</dfn></span></a></li>');
				//$navi = $('<div class="navi"/>');
				//$scroller.diashow({applyHeightToContainer:false,animateAtSameTime:true,autoPlay:false,buttonNext:$menu.find('.next a'),buttonPrev:$menu.find('.prev a')});
				$container.append($menu);
				var api = $canvas.scrollable({items:$scroller,size:count,clickable:false,api:true});

				// show/hide all images at once
				if ($scroller.hasClass('imageStrip')) {
					$container.addClass('imageStripContainer');
					var $open = $('<a href="#" class="toggle-open"><span>Alle anzeigen</span></a>').click(function(e) {
						$open.hide();
						$menu.fadeOut();
						api.seekTo(0,0);
						api.getConf().keyboard = false;
						$container.addClass('showAll').animate({'height':$scroller.outerHeight()},function() {
							$close.fadeIn();
						});
						return e.preventDefault();
					}).hide(),
					$close = $('<a href="#" class="toggle-close">Weniger anzeigen</a>').click(function(e) {
						$close.hide();
						$container.animate({'height':h},function() {
							$container.removeClass('showAll');
							$open.fadeIn();
							$menu.fadeIn();
							api.getConf().keyboard = true;
						});
						return e.preventDefault();
					}).hide();
					$container.append($open,$close);
					$open.fadeIn();
				}

			}
		});

		// teaser jukebox
		//$s.find('.jukebox').jukebox();

		// faq
		$s.find('.faq').each(function() {
			var $t = $(this).addClass('faqJsEnhanced');
			$t.children('.pane').hide();
			$t.children('h3').click(function() {
				var $b = $(this), $p = $b.next('.pane');
				if ($p.length) {
					$p.slideToggle(function(){
						$b.attr('class','').addClass($p.css('display') == 'block' ? 'toggle-close' : 'toggle-open');
					});
				}
			});
		});

		// lightbox
		if($s.find('a[rel*=lightbox]').length) {
			var $lB = $('<div id="imageLightbox" class="lightbox"><div class="content"><div class="navItems"><a class="prev" title="'+$.enet.l18n('showPrevImage')+'"><strong><dfn title="'+$.enet.l18n('showPrevImage')+'">&lt</dfn></strong></a><a class="next" title="'+$.enet.l18n('showNextImage')+'"><strong><dfn title="'+$.enet.l18n('showNextImage')+'">&gt;</dfn></strong></a></div></div><div class="info"></div><div class="loader"></div></div>').hide().append($closeButton).hide().appendTo('body'),
				allowResize = true;

			// apply special layouts
			if (typeof(allowLightboxResize) != 'undefined') {
				allowResize = allowLightboxResize;
				$lB.addClass('gallery');
			}

			$s.find('a[rel*=lightbox]').overlay({
				target: '#imageLightbox',
				expose: {color:'#333', zIndex:9999},
				oneInstance: false,
				fixed: false
			}).gallery({
				speed:800,
				opacity: null,
				minWidth: 200,
				resize: allowResize,
				autohide: false,
				template: '<div class="description">${title}</div><span class="itemCount">'+$.enet.l18n('image')+' ${index} '+$.enet.l18n('of')+' ${total}</span>',
				useAsTitle: '$.enet.getAdditionalImageCaption(el) + ((el.attr(\'name\') && $(\'#\'+el.attr(\'name\')).length) ? $(\'#\'+el.attr(\'name\')).html() : (el.children(\'img\').attr(\'title\') ? el.children(\'img\').attr(\'title\') : \'\'))'
			});
		};

		// search forms
		$s.find('.searchForm').each( function() {
			var sf = $(this).find('input.searchField'),
				dt = sf.val();
			if (dt.length == 0 && sf.hasClass('matchTitle') && sf.attr('title').length) {
				dt = sf.attr('title');
				sf.val(dt);
			}
			if(dt != '' && dt != undefined && !sf.hasClass('dontEnhance')) {
				$(this).submit(function() {
					if(sf.val() != dt || (sf.hasClass('matchTitle') && sf.attr('title') != sf.val())) {
						return true;	
					}
					return false;
				});
				sf.focus(function() {
					sf.addClass('focused');
					if($(this).val() == dt) {
						$(this).val('');					
					}
				})
				.blur(function() {
					sf.removeClass('focused');
					if($(this).val() == '') {
						$(this).val(dt);	
					}
				});
			}
		});
		
		// form validation
		$s.find('form.mailForm').submit( function(e) {
			return $.enet.validateForm(this, true);	
		});

		// popups
		$s.find('.link-popup, a[rel=popup], .link-hint').each(function() {
			$.enet.displayInlinePopup(this);
		});

		// store selector
		if ($s.find('#storeSelector').length) {
			$.enet.storeSelector.init();
		}
	}

	// get additional image caption
	$.enet.getAdditionalImageCaption = function(el) {
		var $n = el.next('.imageNotes'), $t = $('<ul></ul>');
		if ($n.length) {
			$n.children().each(function(i) {
				$t.append('<li class="' + $(this).attr('class') + '">' + $(this).attr('title') + '</li>');
			});
			$t.children().removeClass('imageNote');
		}
		return $t.children().length ? '<ul class="imageNotes">' + $t.html() + '</ul>' : '';
	}

	// form validation
	$.enet.validateForm = function(form,inlineValidation) {
		var $form = $(form),
			$validateFields = $form.find(".f-required, *[class*='eval-']"),
			errors = new Array();
		$('#overlay').hide().remove();

		//remove existing error messages from serverside validation
		$form.find('.validationMessage, #formValidationErrorMessage').remove();
		$form.find('.validationError').removeClass('validationError');
		
		function addError($field,msg) {
			var label = $('label[for='+$field.attr('id')+']').html() || '';
			msg = msg.replace('${label}',label);
			errors.push(Array($field,msg));
			if(typeof(inlineValidation) != 'undefined' && inlineValidation) {
				if($field.parent().find('.validationMessage').length) {
					$field.parent().find('.validationMessage').append('<br />'+msg);
				} else {
					$field.parent().append('<span class="validationMessage">'+msg+'</span>');	
				}
			}
		}
		
		// if fields got marked as required or require validation set via a special CSS class, proccess those for validation rules.
		if($validateFields.length) {
			$validateFields.each(function() {
				var $field = $(this), msg = $field.attr('title'), val = $field.val(), type = $field.attr('type');
				//$field.removeClass('validationError');
				switch (type) {
					default:
						if((val == '' || val == 0) && $field.hasClass('f-required')) {
							if (msg == null || typeof(msg) == 'undefined' || msg.length == 0) { msg = $.enet.l18n('evalMsgFillRequiredFields') }
							addError($field,msg);
						} else if(val) {
							if($field.hasClass('eval-email') && !val.match(/^[-!#$%&\`*+\.\/0-9=?A-Z^_´a-z{|}~]+@[-!#$%&\`*+\.\/0-9=?A-Z^_´a-z{|}~]+\.[A-Za-z]{2,4}$/)) {
								addError($field,$.enet.l18n('evalMsgValidEmail'));
							}
							if($field.hasClass('eval-integer') && isNaN(val)) {
								addError($field,$.enet.l18n('evalMsgInteger'));
							}
							if($field.hasClass('eval-quantity') && !val.match(/^[1-9][0-9]*$/)) {
								addError($field,$.enet.l18n('evalMsgValidQuantity'));
							}
							if($field.hasClass('eval-repeat')) {
								var $repeat = $('#'+$field.attr('id')+'-repeat');
								if(val && val != $repeat.val()) {
									addError($repeat,$.enet.l18n('evalMsgRepeat'));
								}
							}
						}
						break;
					case 'checkbox':
					case 'radio':
						if(type == 'checkbox' && !$field.attr('class').match(' *eval-.*') && !$field.attr('checked') && $field.hasClass('f-required')) {
							errors.push(Array($field,msg));
						}

						// evaluation
						if($field.hasClass('eval-atLeastOne')) {
							var na = $field.attr('name'), l = Math.round(na.length -2), n = na.substr(0,l);
							if(! $form.find('[name^="'+n+'"]:checked').length ) {
									errors.push(Array($field,msg));
							}
						}
						break;
				}
			});
			if(errors.length) {
				var msg = '',
					items='',
					focused = false,
					offset = $form.offset(),
					msgCache = new Array();
				$(errors).each(function() {
					$(this[0]).addClass('validationError').parent().addClass('validationError');
					if(!focused) {
						this[0].focus();
						focused = true;
					}
					if($.inArray(this[1],msgCache) == -1) {
						msgCache.push(this[1]);
						items += '<li>'+this[1]+'</li>';
					}
				});
				msg = '<ul>'+items+'</ul>';
				return $.enet.displayError($.enet.l18n('attention'),msg,{offset:offset.top});
			}
		}
		return true;
	}


	// video
	// add mediaplayer
	var mediaPlayerCount = 0
		players = []
		flashFormats = ['mp4','flv','f4v','swf','mp3'];

	$.enet.addMediaPlayer = function($c,api) {
		// add player icon overlay
		$c.find('.mediaItem').addClass('playerButton').append('<span class="overlay"></span>');

		// add flash mediaPlayers
		$c.find('a[rel=mediaPlayer]').each(function(i) {
			var $t = $(this), $i = $t.children('img'),
				file = $i.attr('longdesc') || $t.attr('href'),
				thumb = $i.attr('src');
				options = {
					width: $i.attr('width') || $t.parent().width(),
					//Math.max is defining a minimum height for the player if there is no image or the image hasn't been fully loaded yet
					height: Math.max(200, $i.attr('height') || $t.parent().height())
				}
			if ($t.hasClass('onClick') || $t.attr('target') == '_self') {
				$t.click(function(e) {
					$.enet.createMediaPlayer($t,file,thumb,options,api);
					return e.preventDefault();
				});
			} else {
				$.enet.createMediaPlayer($t,file,thumb,options,api);
			}
		});

		// HTML5 video tag support + fallback
		$c.find('video').each(function(i) {
			var $t = $(this),
				sources = [],
				file = $t.attr('src'),
				thumb = $t.attr('poster'),
				$p = $('<div class="mediaPlayer"/>').css({width:$t.width(),height:$t.height()}).addClass($t.attr('class')),
				canPlayVideo = false,
				options = {
					width: $t.width(),
					height: $t.height()
				};

			if (file) {
				sources.push({
					type: 'video/'+file.substr(file.length-3),
					file: file
				});
			}
			$t.children('source').each(function() {
				var $s = $(this), f = $s.attr('src');
				sources.push({
					type: $s.attr('type') || 'video/'+f.substr(f.length-3),
					file: f
				});
			});

			try {
				for (var i=0; i < sources.length; i++) {
					if(this.canPlayType(sources[i].type)) {
						canPlayVideo = true;
						// add eventListener if playback fails for some reason (file not found, wrong codec or video type declared etc)
						this.addEventListener('error', function() {
							// check if the current file is the last playable one and only then proceed with fallback
							if (this.currentSrc.match( sources[sources.length-1].file )) {
								$p.append($t.children().not('source').eq(0).clone());
								$t.replaceWith($p);
								$.enet.createMediaPlayer($p,file,thumb,options,api);
							}
						}, true);
					}
					break;
				}
			} catch (e) {}

			// if browser can't play video, create flash fallback if possible
			if (!canPlayVideo) {
				var flashFile = null;
				// find video playable in flash
				for (var i=0; i < sources.length; i++) {
					var f = sources[i].file;
					if($.inArray(f.substr(f.length-3), flashFormats) > -1) {
						flashFile = f;
						break;
					}
				}
				if (flashFile !== null) {
					$p.append($t.children().not('source').eq(0).clone());
					$t.replaceWith($p);
					$.enet.createMediaPlayer($p,flashFile,thumb,options,api);
				}
			}
		});
	};

	$.enet.createMediaPlayer = function($item,file,thumb,opts,api) {
		// if target is _blank, open it in a lightbox
		if ($item.attr('target') == '_blank') {
			// create lightbox container
			$lB = $('#mediaLightbox');
			if (!$lB.length) {
				$lB = $('<div id="mediaLightbox" class="lightbox"><div class="content"></div><div class="info"></div></div>').hide().append($closeButton).hide().appendTo('body');
			}

			// create overlay
			var lbox = $item.overlay({
				target: '#mediaLightbox',
				expose: {color:'#333', zIndex:9999},
				oneInstance: true,
				fixed: false,
				onBeforeLoad: function() {
					var ratio = $item.width()/$item.height(),
						w = 640,
						h = 360, //Math.round(640/ratio),
						$spacer = $('<a href="'+file+'" rel="mediaPlayer"><img src="'+thumb+'" width="'+w+'" height="'+h+'" /></a>'),
						$c = $lB.find('.content').empty().append($spacer),
						$i = $lB.find('.info').empty(),
						$d = $('<div class="description"></div>'),
						title = $item.attr('title') || $item.find('img').attr('title'),
						desc = ($item.attr('name') ? $($('#'+$item.attr('name')).html()).appendTo($d) : '');
					if (title != null && title != '') {
						$d.prepend('<h3>'+title+'</h3>');	
					}
					if ($d.children().length) {
						$d.appendTo($i)	
					}
					$lB.width(w);
					$.enet.createMediaPlayer($spacer,file,thumb,{width:w,height:h,autoPlay:true});
				},
				onClose: function() {
					$lB.find('.content').empty();
				},
				api: true
			});
			$item.click(function(e) {
				lbox.load();
				return e.preventDefault();
			});
		
		// else create inline player
		} else {
			mediaPlayerCount++;


			$item.css({
				height: opts.height,
				display:'block'
			});

			var fileUrl = $.enet.absoluteUrl(file),
				thumbUrl = $.enet.absoluteUrl(thumb),
				type = file.substr(file.length-3),
				pid = 'mediaPlayerNo'+mediaPlayerCount,
				settings = $.extend({
						'autoPlay'	: false,
						'scaling'	: 'fit',
						'canvas'	: {
							backgroundGradient:'none',
							backgroundColor:'transparent'
						},
						'controls'	: null
					},opts),
				templateExternals = '<object width="###width###" height="###height###" bgcolor="#000000"><param name="movie" value="###URI###"></param><param name="wmode" value="opaque"></param><param name="bgColor" value="0x000000"></param><param name="allowFullScreen" value="true"></param><param name="autoPlay" value="###autoPlay###"></param><param name="allowscriptaccess" value="always"></param><embed src="###URI###" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" bgColor="0x000000" autoplay="###autoPlay###" width="###width###" height="###height###" wmode="opaque"></embed></object>';
				supportedExternals = {
					'youtube' : {
						rexp: '(http|https)://www\.youtube\.(com|de)/.*(watch)?.*v(=|/)([a-zA-Z0-9_-]+).*',
						func: function(matches, $item, file, thumb, opts) {
							var marks = {
								/*width: $item.parent().width(),*/
								height: opts.height+25, //25px for player bar
								URI: matches[1]+'://www.youtube.'+matches[2]+'/v/'+matches[5]+'?fs=1&amp;hl=de_DE&amp;rel=0'
							};
							return $.enet.parseTemplate(templateExternals, $.extend(opts, marks));
						}
					}
				};

			// parse for special file urls, like youTube and treat them different
			var isExternal = false;
			for (var site in supportedExternals) {
				var itm = supportedExternals[site],
					matches = fileUrl.match(new RegExp(itm.rexp));
				if (matches != null) {
					isExternal = true;
					players[mediaPlayerCount] = itm.func(matches, $item, file, thumb, opts);
					$item.replaceWith(players[mediaPlayerCount]);
				}
			}
			
			if (isExternal == false) {
				if (type == 'swf') {
					players[mediaPlayerCount] = $item.flashembed(
						{src:file,version:[9,115],w3c:true,wmode:'transparent',allowscriptaccess:'always', 'id':pid, 'name':pid, onFail:$.enet.onFlashembedFail}				   
					);
				} else {
					players[mediaPlayerCount] = $item.flashembed(
						{src:'templates/media/flowplayer.swf',version:[9,115],w3c:true,wmode:'opaque',allowscriptaccess:'always', 'id':pid, 'name':pid, onFail:$.enet.onFlashembedFail},
						{config: {
							clip: {
								scaling: settings.scaling,
								baseUrl: $.enet.baseUrl,
								accelerated: true,
								autoBuffering: settings.autoBuffer,
								url: fileUrl
							},
							playlist: [
								{ url: thumbUrl},
								{ url: fileUrl, autoPlay: settings.autoPlay, 
									onStart: function() {
										if (api != null) { api.stop();api.setEnableHover(false);}
									},
									onFinish: function() {
										if (api != null) { api.setEnableHover(true);api.play();api.next(); }
									}
								}
							],
							onMouseOver: function() {
								if (api != null) { api.stop();api.setEnableHover(false);}
							},
							onMouseOut: function() {
								if (api != null) { api.stop();api.setEnableHover(false);}
							},
							plugins: {
									controls: settings.controls
							},
							canvas: settings.canvas
						}}
					);
					//flowplayer().load();
				}
			}
			if($item.children('object,embed').length) {
				$item.click(function(e) {return e.preventDefault();});
			};	
		}
	}

	$.enet.parseTemplate = function(t,marks,wrapper) {
		if (wrapper == null) { wrapper = ['###','###']; }
		// replace marks
		for (var k in marks) {
			t = t.replace(new RegExp(wrapper[0]+k+wrapper[1],'g'),marks[k]);
		}
		return t;
	}



	$.enet.getCookies = function(force) {
		if (document.cookie && document.cookie.length && (typeof($.enet.cookies) == 'undefined' || force == true)) {
			var tmp,val = document.cookie;
			$.enet.cookies = {};
			// convert cookie values to manageable data
			$(val.split(';')).each(function() {
				tmp = this.replace(/^\s+/,'').replace('/\s+$/','').split('=');
				$.enet.cookies[tmp[0]] = ((tmp[0] == 'eurobaustoff' || tmp[0] == 'ebStore') ? $.parseJSON(decodeURIComponent(tmp[1])) : tmp[1]);
			});
			
		}
		return $.enet.cookies;
	}

	$.enet.getCurrentPosition = function() {
		var cookies = $.enet.getCookies(), lat=lng=null;
		if (typeof(cookies) == 'object' && cookies.length) {
			if (typeof(cookies.eurobaustoff) != 'undefined' && typeof(cookies.eurobaustoff.location) != 'undefined') {
				lat = cookies.eurobaustoff.location.lat;
				lng = cookies.eurobaustoff.location['long'];
				if (lat && lng) {
					return [lat,lng];	
				}
			}
		}
		return null;
	}

	$.enet.googleMap = function(mapId) {
		this.map, this.markers=[], this.markerManager, this.bubbleData=[], this.icons=[], this.mapId = mapId, this.listener = false, this.bounds = {};
		
		this.loadApi = function () {
			//if (typeof(google.maps) == 'undefined') {
				var obj = this;
				google.load("maps", "2", {'callback':function(){obj.onApiLoaded()}});
			//}
		}

		this.onApiLoaded = function() {
			if (typeof(this.listener) === 'undefined') {
				this.listener = $(window).unload(function() { google.maps.Unload() });
			}
			this.create();
		}

		this.create = function() {
			if (typeof(google.maps) == 'object' && google.maps.BrowserIsCompatible()) {
				this.map = new google.maps.Map2(document.getElementById(this.mapId));
				//this.markerManager = new google.maps.MarkerManager(this.map);
				this.bounds={'sw':{'lat':'','lng':''},'ne':{'lat':'','lng':''}};
				// add default markers
				this.addIcon("home", $.enet.absTemplatePath+"images/map-home.png", $.enet.absTemplatePath+"images/map-home-shadow.png", new google.maps.Size(26, 25), new google.maps.Size(36, 36), new google.maps.Point(13,12), new google.maps.Point(-13,-13));
				this.addIcon("default", $.enet.absTemplatePath+"images/map-point.png", '', new google.maps.Size(12, 20), null, new google.maps.Point(6, 20), new google.maps.Point(6,20));
			} else {
				$('.noMapSupport').show();
			}
			if (this.onBuildCallback !== null && typeof(this.onBuildCallback) !== 'undefined') {
				this.onBuildCallback.call();
			}
		}
		// must be called when the map is initialized
		this.init = function(callback) {
			this.onBuildCallback = callback;
			this.loadApi();
		}
		this.destruct = function() {
			this.clear();
			this.map = null; this.markerManager = null; this.mapId = null;
			this.icons=[];
		}
		
		this.clear = function() {
			this.markers = []; this.bubbleData = [];
			this.bounds={'sw':{'lat':'','lng':''},'ne':{'lat':'','lng':''}};
			this.map.clearOverlays();
		}
		
		// fetches the GMap2 object
		this.getMap = function() {
			return this.map;
		}

		// add visitors position
		this.addCurrentPosition = function(iconType,minZoom,maxZoom) {
			pos = $.enet.getCurrentPosition();
			if (pos !== null) {
				if(pos[0] && pos[1]) {
					var marker = gmap.addMarker(1, [pos[0],pos[1]], iconType, 0);
					gmap.getMap().addOverlay(marker,Math.max(0,minZoom),Math.min(15,maxZoom));
				}
			}
		}

/*
		// adds markers (all markers from a specified group of a map) to the marker Manager
		this.addMarkersToManager = function(groupId, minZoom, maxZoom) {
			this.markerManager.addMarkers(this.markers[groupId], minZoom, maxZoom);
			this.markerManager.refresh();
		}
		this.addMarkerToManager = function(marker,minZoom,maxZoom) {
			this.markerManager.addMarker(marker,minZoom,maxZoom);
		}
*/
		// jumps to a specific marker (determined by groupId and markerId) and zoomlevel on the map
		this.jumpTo = function(groupId, markerId, zoom) {
			var marker = this.markers[groupId][markerId];
			if (zoom) {	
				this.map.setZoom(zoom);
			}
			this.map.panTo(marker.getPoint());
			setTimeout('GEvent.trigger(this.markers["' + groupId + '"]["' + markerId + '"], "click")', 300);
			return false;
		}

		// adds an icon that might be used on a marker object later on
		this.addIcon = function(iconId, image, shadow, iconSize, shadowSize, iconAnchor, infoWindowAnchor) {
			var icon = new google.maps.Icon();
			icon.image = image;
			icon.shadow = shadow;
			icon.iconSize = iconSize;
			icon.shadowSize = shadowSize;
			icon.iconAnchor = iconAnchor;
			icon.infoWindowAnchor = infoWindowAnchor;
			if (!iconId) {
				var iconId = 'default';
			}
			this.icons[iconId] = icon;
		}
	
		// adds the content (as an array for each tab) and the labels of the tabs, that will be used with the add Marker call
		this.addBubble = function(groupId, markerId, labels, content) {
			if (!(this.bubbleData[groupId] instanceof Array)) { this.bubbleData[groupId] = []; }
			for (var i = 0; i < content.length; i++) {
				content[i] = '<div id="' + this.mapId + '_marker_' + groupId + '_' + markerId + '" class="marker">' + content + '</div>';
			}
			this.bubbleData[groupId][markerId] = {
				labels: labels,
				content: content
			};
		}

		// adds a GMarker object with all the data for the bubble and the precise location. The marker is added via
		// the markermanager (see addMarkersToManagers), here it basically just created and added to the array 
		this.addMarker = function(markerId, latlng, iconId, groupId) {
			this.bounds.sw.lat = Math.max(latlng[0],this.bounds.sw.lat) || latlng[0];
			this.bounds.sw.lng = Math.min(latlng[1],this.bounds.sw.lng) || latlng[1];
			this.bounds.ne.lat = Math.min(latlng[0],this.bounds.ne.lat) || latlng[0];
			this.bounds.ne.lng = Math.max(latlng[1],this.bounds.ne.lng) || latlng[1];

			if (!iconId) {
				var iconId = 'default';
			}

			if (!(this.markers[groupId] instanceof Array)) { this.markers[groupId] = []; }
			if (!(this.bubbleData[groupId] instanceof Array)) { this.bubbleData[groupId] = []; }
			
			var icon = this.icons[iconId],
				point = new google.maps.LatLng(latlng[0], latlng[1]),
				marker = new google.maps.Marker(point,icon),
				tabs = [],
				tabLabels = typeof(this.bubbleData[groupId][markerId]) != 'undefined' ? this.bubbleData[groupId][markerId].labels : '',
				text = typeof(this.bubbleData[groupId][markerId]) != 'undefined' ? this.bubbleData[groupId][markerId].content : '';
			if (text.length > 1) {
				for (var i = 0; i < text.length; i++) {
					tabs.push(new google.maps.InfoWindowTab(tabLabels[i], text[i]));
				}
				marker.bindInfoWindowTabsHtml(tabs);
			} else {
				marker.bindInfoWindowHtml(text[0]);
			}
			this.markers[groupId][markerId] = marker;
			return marker;
		}
	}

	$.enet.storeSelector = new StoreSelector();

	$.enet.loaderClass = function(){
		this.loader = $('<div id="loader" class="dropShadow"></div>').hide().css('z-index',9999);

		this.display = function(message) {
			if (message) {
				this.loader.html(message);
			}
			$('body').append(this.loader);
			this.loader.fadeIn();
		};

		this.hide = function() {
			//$.mask.close();
			var self = this;
			this.loader.fadeOut(function() {
				self.loader.stop(true).hide().remove();
			});
		};
	}
	$.enet.loader = new $.enet.loaderClass();

	$.enet.displayError = function(headline,message){
		var $messageContainer = $('<div class="infoMessage layout-error" id="errorMessage"></div>');
		$('body').append($messageContainer);
		$messageContainer.html('<h3>'+headline+'</h3>'+message).hide().overlay({
			api:true,
			expose:'#333',
			onLoad: function() {$messageContainer.fadeIn()},
			onBeforeClose: function() {$messageContainer.fadeOut()},
			onClose:function() {$messageContainer.remove()},
			load:true,
			closeOnClick:false,
			fixed: false
		});
		return false;
	}

	$.enet.displayInlinePopup = function(t,containerClass) {
		var $t = $(t), $o = $.enet.createOverlayContainer();
		if (!$o.data('browser')) {
			var browser = new MiniBrowser($o, {
				canvas: $o.find('.overlayContent'),
				onLoad: function(e,uri,b) {
					b.$container.addClass('loading');
				},
				onUnload: function(e,b) {
					b.$canvas.hide();
				},
				onUpdate: function(e,uri,data,b) {
				},
				onAfterUpdate: function(e,uri,data,b) {
					b.$container.removeClass('loading');

					var uparts = uri.split('#');
					if (uparts.length > 1) {
						b.$canvas.html($('#'+uparts[1], data));
					}

					$.enet.enrichContent(b.$canvas);
					var navBar = $('<p class="functionBar"></p>')
						.append($('<a href="JavaScript:window.print()" class="link-print button button-layout2">Drucken</a>'));
					if (b.historyIndex > 0) {
						navBar.append(
							$('<a href="#" class="link-back">zurück</a>').click(function(e) { b.history.back(); return e.preventDefault();} )
						);
					}
					b.$canvas.append(navBar).fadeIn(400);
					if (typeof(FB) == 'object') {
						navBar.append (
							$('<fb:like href="' + uri + '" layout="button_count" show_faces="false" width="300"></fb:like>')
						);
						FB.XFBML.parse(b.$canvas.get(0));
					}
				}
			});
			browser.init($o);
			$o.data('browser', browser);
		}
		$t.click(function(e) {
			var $l = $(this),
				url = $.enet.absoluteUrl($l.attr('href')),
				br = $o.data('browser');
			//url += (url.indexOf('?') > 0 ? '&' : '?')+'type=712';
			if (!$o.data('overlay') || !$o.overlay().isOpened()) {
				$.enet.configureInlinePopup($o, containerClass);
				$o.data('overlay').load();
			}
			br.goto(url);
			return e.preventDefault();
		});
	};

	$.enet.configureInlinePopup = function($o, containerClass) {
		$o.data('overlay', null);
		$o.overlay({
			mask: '#333',
			target: '#overlayContainer',
			fixed: false,
			load: false,
			onBeforeLoad: function() {
				if (containerClass) {
					$o.addClass(containerClass);	
				}
				var br = $o.data('browser');
				br.reset();
				$('body').addClass('hasOverlayContent');	
			},
			onClose: function() {
				if (containerClass) {
					$o.removeClass(containerClass);	
				}
				$('body').removeClass('hasOverlayContent');	
			}
		});
	}

	$.enet.displayPopup = function(url,options) {
		var defaults = {
			'name'	:	'enet',
			windowParams	: {
				'width'	:	800,
				'height'	:	400,
				'left'		:	'',
				'top'		:	'',
				'scrollbars'	: 'auto',
				'menubar'	: 'false',
				'status'		: 'false',
				'location'	: 'false'
			}
		},
			params = '', popup = false;
		options = jQuery.extend(defaults, options);
		$.each(options.windowParams, function(n) {
			if(this && this != '') {
				params += n+'='+this+',';
			}
		});
		params = params.substr(0,params.length-1);
		popup = window.open(url,options.name,params);
		if(popup) {
			return false;	
		}
	}

	// prepare popup containers
	$.enet.createOverlayContainer = function() {
		var $overlay = $('#overlayContainer');
		if (!$overlay.length) {
			$overlay = $('<div id="overlayContainer"></div>').insertAfter($('#pageBody')),
				$overlayContent = $('<div class="overlayContent"/>').hide().appendTo($overlay);
		}
		return $overlay;
	}
	$.enet.removeOverlayContainer = function() {
		$('#overlayContainer').trigger('unload').unbind().remove();
	}



/**************
* ENRICH USEREXPERIENCE
***************/

	// store selector
	var cookies = $.enet.getCookies(), hideStoreSelector = false;
	if (typeof(cookies) == 'object' && typeof(cookies.ebStoreMode) != 'undefined' && cookies.ebStoreMode.toString() == 'external' && (typeof(cookies.ebStore) != 'undefined' && typeof(cookies.ebStore.storeId) == 'number')) {
		$('.fn-selectStore, .selectStore').hide();
	} else {
		$('a.fn-selectStore, .fn-selectStore a').each(function() {
			var $t = $(this), $o = $.enet.createOverlayContainer(), $oC = $o.find('.overlayContent');

			$t.overlay({
				expose: '#333',
				target: '#overlayContainer',
				fixed: false,
				onBeforeLoad: function(event) {
					var url = $.enet.absoluteUrl($t.attr('href'));
					url += (url.indexOf('?') > 0 ? '&' : '?')+'type=' + $.enet.ajaxType;
					$oC.html('');
					$o.addClass('loading').addClass('storeSelector');
					$.post(url, function(data,status) {
						if (status === 'success' || status === 'notmodified') {
							$oC.html($('data',data).text());
							$o.removeClass('loading');
							$.enet.enrichContent($oC);
							$oC.fadeIn(400);
							$.enet.storeSelector.init();
						} else {
							window.location = url;
						}
					},'xml');
				},
				onClose: function(event) {
					$o.removeClass('storeSelector');
					setTimeout(function() {
						$.enet.storeSelector.unload();
					},200);
				}
			});
		}).eq(0).each(function() {
			// automatically open storeSelector on first hit if no store is selected
			var cookies = $.enet.getCookies();
			if (typeof(cookies) == 'object') {
				// if user doesn't have a storeSelector popup cookie, set it 
				if (typeof(cookies.hadStorePopup) == 'undefined') {
					// if user doesn't have a store selected, initially show the selector
					if (typeof(cookies.ebStore) == 'undefined' || typeof(cookies.ebStore.storeId) != 'number') {
						$(this).overlay().load();
					}
					document.cookie = 'hadStorePopup=true; path=/';
				}
			}
		});
	}

	// add extra functionality to the content
	$.enet.enrichContent('#page');

	// mediaPlayer
	$.enet.addMediaPlayer($('#pageBody'));

	// equal height of multicolumn menus because fucking IE6 and 7 have clear bugs
	$('body.ltIE8').find('.menuCols-3, .menuCols-4').each(function() {
		var $m = $(this);
		$m.find('li.first').each(function() {
			var $i = $(this).add($(this).nextUntil('.first')), h = 0;
			$i.each(function() {
				h = Math.max(h, $(this).innerHeight());
			});
			$i.css('height',h);
		});
	});

	// route planer dropdown
	$('#functionMenu').removeClass('noJS').children().each(function() {
		var $t = $(this), $child = $t.children('ul'), timer;
		if ($child.length) {
			$t.children('a').click(function(e) {
				return e.preventDefault();
			});
			$child.find('.searchField').focus(
				function() {
					$t.addClass('active');	
				}
			).blur(
				function() {
					$t.removeClass('active');	
				}
			);
		}
	});


/**************
* LAYOUT OPTIMIZATIONS
***************/

	// call methods in onJQueryReady stack. The stack get's filled from inline JS or some other external scripts
	if(typeof(onJQueryReady) == 'object') {
		$(onJQueryReady).each(function() {
			this.fn.call(this.p);
		});
	}
})(jQuery);
