/**
 * dollarConflict Replaced -> $j
 */
var domSliderExtended = jClass.extend({
	appName:'domSlider',
	location: window.location,
	tracking:true,
	adviseConfig: {
		listObj: {
			adviseClass: null,
			infotext: {
				wrapper: null,
				inactive: null,
				active: null
			},
			display: {
				contentClass: null,
				content: null,
				mode:'siblings',
				hideonload:true,
				button: {
					position: 'into',
					type: 'div',
					text: '',
					classes:['slider-inactive','slider-active']
				}
			},
			tipClass: null,
			infotextTip: {
				wrapper: null,
				inactive: null,
				active: null
			},
			displayTip: {
				contentClass: null,
				content: null,
				mode:'siblings',
				hideonload:true,
				button: {
					position: 'into',
					type: 'div',
					text: '',
					classes:['slider-inactive','slider-active']
				}
			}
		},
		navObj: {
			adviseClass: null,
			tipWrapper: null,
			tipClass: null,
			highlightClass: null
		},
		searchObj: {
			wrapper: null,
			mode: null,
			advisesAndTips: null
		}
	},
	init:function(adviseConfig) {
		var adviseConfig = $j.extend(true,this.adviseConfig,adviseConfig);
		this.adviseConfig = adviseConfig;
		
		/* preparing of List and Menu */
		this.prepareList();
		this.prepareMenu();
	},
	prepareList:function(){
		this.adviseConfig.listObj.adviseClass = $j(adviseConfig.listObj.adviseClass);
		
		/* add Listeners */
		if(this.adviseConfig.listObj.adviseClass.length != 0) {
			$j(this.adviseConfig.listObj.adviseClass).each(
				$j.shove(function(index,el){
					
					/* get button for advises */
					var button = this.getButton();
					
					/* get content-wrapper for advises */
					switch(this.adviseConfig.listObj.display.mode){
						case 'siblings':
							var content = $j(el).siblings(this.adviseConfig.listObj.display.contentClass);
						break;
						case 'childs':
							var content = $j(el).children(this.adviseConfig.listObj.display.contentClass);
						break;
					}
					
					/* Infotext ElementClasses */
					var wrapperClass = this.adviseConfig.listObj.infotext.wrapper;
					var inactiveClass = this.adviseConfig.listObj.infotext.inactive;
					var activeClass = this.adviseConfig.listObj.infotext.active;
					var inactiveElem = $j(el).siblings(wrapperClass).children(inactiveClass);
					var activeElem = $j(el).siblings(wrapperClass).children(activeClass);
					$j(inactiveElem).show();
					$j(activeElem).hide();
					
					/* Button Classes */
					var inactiveButtonClass = this.adviseConfig.listObj.display.button.classes[0];
					var activeButtonClass = this.adviseConfig.listObj.display.button.classes[1];
					
					/* initial hiding of content and infotext */
					if (this.adviseConfig.listObj.display.hideonload) {
						content.hide();
					}
					
					/* add show-hide functionality advises */
					$j(button).click(
						$j.shove(function(){
							if($j(this.content).is(':hidden')) {
	
								/* TRACKING */
								if(this.topObj.tracking == true){
									var advisePath = this.topObj.location.pathname;
									var section = $j(this.element).find('.nfcadviser_adviselist_title_left:first').text();
									advisePath = encodeURIComponent(advisePath);
									section = encodeURIComponent(section);
									//console.log(advisePath);
									//console.log(section);
									ET_Event.click(advisePath, section);
								}
								/* TRACKING END */
							
								/* open content */
								$j(this.content).slideDown("slow");
								/* show open = active infotext message */
								$j(this.inactiveElem).hide();
								$j(this.activeElem).show();
								
								/* add active CSS-Class for button */
								$j(this.button.elem).addClass(this.button.activeClass);
								$j(this.button.elem).removeClass(this.button.inactiveClass);
							} else {
								/* hide content */
								$j(this.content).slideUp("slow");
								
								/* show closed = inactive infotext message */
								$j(this.inactiveElem).show();
								$j(this.activeElem).hide();
								
								/* add inactive CSS-Class for button */
								$j(this.button.elem).addClass(this.button.inactiveClass);
								$j(this.button.elem).removeClass(this.button.activeClass);
							}
					},{
						content: content, 
						topObj: this, 
						element: el, 
						inactiveElem: inactiveElem, 
						activeElem: activeElem, 
						button: {
							elem: button, 
							inactiveClass: inactiveButtonClass, 
							activeClass: activeButtonClass
						}
					}));

					
					/* insert button for advises into DOM */
					switch(this.adviseConfig.listObj.display.button.position){
						case 'into':
							$j(el).append($j(button));
						break;
						case 'after':
							$j(el).after($j(button));
						break;
						case 'before':
							$j(el).before($j(button));	
						break;
						default:
							$j(el).append($j(button));
					}
					
					/* Tips ################################################################################## */
					var tipClass = this.adviseConfig.listObj.tipClass;
					$j(content).find(tipClass).each(
						$j.shove(function(index,el){
							
							/* get Button for Tips */
							var buttonTip = this.topObj.getButton(true);
							
							/* get content-wrapper for tips */
							var contentClass = this.topObj.adviseConfig.listObj.displayTip.contentClass;
							switch(this.topObj.adviseConfig.listObj.displayTip.mode){
								case 'siblings':
									var contentTip = $j(el).siblings(contentClass);
								break;
								case 'childs':
									var contentTip = $j(el).children(contentClass);
								break;
							}
							
							/* Infotext ElementClasses */
							var wrapperClass = this.topObj.adviseConfig.listObj.infotextTip.wrapper;
							var inactiveClass = this.topObj.adviseConfig.listObj.infotextTip.inactive;
							var activeClass = this.topObj.adviseConfig.listObj.infotextTip.active;
							var inactiveElem = $j(el).siblings(wrapperClass).children(inactiveClass);
							var activeElem = $j(el).siblings(wrapperClass).children(activeClass);
							$j(activeElem).show();
							$j(inactiveElem).hide();
							
							/* add show-hide functionality tips */
							$j(buttonTip).click(
								$j.shove(function(){
									if($j(this.content).is(':hidden')) {
										
										/* TRACKING */
										if(this.topObj.topObj.tracking == true){
											var advisePath = this.topObj.topObj.location.pathname;
											var section = $j(this.element).find('.nfcadviser_adviselist_tipwrapper_title_left:first').text();
											advisePath = encodeURIComponent(advisePath);
											section = encodeURIComponent(section);
											//console.log(advisePath);
											//console.log(section);
											ET_Event.click(advisePath, section);
										}
										/* TRACKING END */
										
										/* open content */
										$j(this.content).slideDown("slow");
										
										/* show open = active infotext message */
										$j(this.inactiveElem).hide();
										$j(this.activeElem).show();
										
										/* add active CSS-Class for button */
										$j(this.button.buttonTip).addClass(this.button.activeClass);
										$j(this.button.buttonTip).removeClass(this.button.inactiveClass);
									} else {
										/* hide content */
										$j(this.content).slideUp("slow");
										
										/* show closed = inactive infotext message */
										$j(this.inactiveElem).show();
										$j(this.activeElem).hide();
										
										/* add inactive CSS-Class for button */
										$j(this.button.buttonTip).addClass(this.button.inactiveClass);
										$j(this.button.buttonTip).removeClass(this.button.activeClass);
									}
							},{
								content: contentTip,
								topObj: this, 
								element: el, 
								inactiveElem: inactiveElem, 
								activeElem: activeElem, 
								button: {
									buttonTip: buttonTip, 
									inactiveClass: inactiveButtonClass, 
									activeClass: activeButtonClass}
								}
							));
							
							/* insert button for advises into DOM */
							var positionOfTipButton = this.topObj.adviseConfig.listObj.displayTip.button.position;
							switch(positionOfTipButton){
								case 'into':
									$j(el).append($j(buttonTip));
								break;
								case 'after':
									$j(el).after($j(buttonTip));
								break;
								case 'before':
									$j(el).before($j(buttonTip));	
								break;
								default:
									$j(el).append($j(buttonTip));
							}
					},{
						topObj: this,
						topEl: el
					}));
			},this));
		}
		
		/* if search-Action was initiated do Opening-Action for list */
		var mode = $j(this.adviseConfig.searchObj.mode);	
		var wrapper = $j(this.adviseConfig.searchObj.wrapper);
		var advisesAndTips = $j(this.adviseConfig.searchObj.advisesAndTips);
		if($j(wrapper).length != 0 && $j(advisesAndTips).length != 0 && $j(mode).length != 0) {
			mode = $j(mode).html();
			if(mode != 'none' && mode != 'menuAction') {
				var advisesAndTips = $j(advisesAndTips).html();
				var tipNr = $j(this.adviseConfig.searchObj.tip).html();
				var menuOpeningConfig = {
					action: 'listAction',
					advisesAndTips: advisesAndTips
				};
				this.doOpeningAction(menuOpeningConfig);
			}
		} else {
		}
	},
	prepareMenu:function(){
		/* Listeners for Opening */
		var navAdvises = $j(this.adviseConfig.navObj.adviseClass);
		if ($j(navAdvises).length != 0) {
			$j.each(navAdvises, $j.shove(function(index, el){			
				/* Advises Click Function in Menu */
				$j(el).click($j.shove(function(){
					
					/* TRACKING */
					if(this.topObj.tracking == true){
						var advisePath = this.topObj.location.pathname;
						var section = $j(this.el).text();
						advisePath = encodeURIComponent(advisePath);
						section = encodeURIComponent(section);
						//console.log(advisePath);
						//console.log(section);
						ET_Event.click(advisePath, section);
					}
					/* TRACKING END */
					
					var advisesAndTips = '{"'+index+'":[]}';
					/* wird auch in doAction geparst, wenn string advisesAndTips = JSON.parse(advisesAndTips); */
					var menuOpeningConfig = {
						action: 'listAction',
						advisesAndTips: advisesAndTips
					};
					this.topObj.doOpeningAction(menuOpeningConfig);
				},{topObj: this.topObj, el: el}));
				
				/* Tip Click Function in Menu */
				var tipWrapperOfAdvise = $j(el).siblings(this.topObj.adviseConfig.navObj.tipWrapper);
				var tipsOfParent = $j(tipWrapperOfAdvise).find(this.topObj.adviseConfig.navObj.tipClass);

				$j.each(tipsOfParent,$j.shove(function(tipIndex, tipEl){
					$j(tipEl).click($j.shove(function(){
						/* TRACKING */
						if(this.topObj.tracking == true){
							var advisePath = this.topObj.location.pathname;
							var section = $j(this.tipEl).text();
							section = section.replace(/^\s+|\s+$/g,"");
							advisePath = encodeURIComponent(advisePath);
							section = encodeURIComponent(section);
							//console.log(advisePath);
							//console.log(section);
							ET_Event.click(advisePath, section);
						}
						/* TRACKING END */
						var advisesAndTips = '{"'+this.adviseIndex+'":["'+tipIndex+'"]}';
						/* wird auch in doAction geparst, wenn string advisesAndTips = JSON.parse(advisesAndTips); */
						var menuOpeningConfig = {
							action: 'listAction',
							advisesAndTips: advisesAndTips
						};
						this.topObj.doOpeningAction(menuOpeningConfig);
					},{topObj: this.topObj, tipEl: tipEl, adviseIndex: this.adviseIndex}));
				},{topObj: this.topObj, adviseIndex: index}));
				
			}, {
				topObj: this,
				navAdvises: navAdvises
			}));
		}
		
		/* if search-Action was initiated do Opening-Action for menu */
		var mode = $j(this.adviseConfig.searchObj.mode);	
		var wrapper = $j(this.adviseConfig.searchObj.wrapper);
		var advisesAndTips = $j(this.adviseConfig.searchObj.advisesAndTips);
		if($j(wrapper).length != 0 && $j(advisesAndTips).length != 0 && $j(mode).length != 0) {
			mode = $j(mode).html();
			if(mode != 'none' && mode != 'listAction') {
				advisesAndTips = $j(advisesAndTips).html();
				var tipNr = $j(this.adviseConfig.searchObj.tip).html();
				var menuOpeningConfig = {
					action: 'menuAction',
					advisesAndTips: advisesAndTips
				};
				this.doOpeningAction(menuOpeningConfig);
			}
		} else {
		}
	},
	doOpeningAction:function(openingConfig){
		var openingMode = String(openingConfig.action);
		var openingAdvisesAndTips = openingConfig.advisesAndTips;
		
		/* switch mode of action */
		switch(openingMode) {
			case 'menuAction':
				this.doOpeningActionMenu(openingAdvisesAndTips);
				break;
			case 'listAction':
				this.doOpeningActionList(openingAdvisesAndTips);
				break;
			case 'none':
				break;
			case 'all':
			default:
				this.doOpeningActionMenu(openingAdvisesAndTips);
				this.doOpeningActionList(openingAdvisesAndTips);
				break;
		}
	},
	doOpeningActionList:function(advisesAndTips){
		var advisesAndTips = advisesAndTips;
		var arr_advises = $j(this.adviseConfig.listObj.adviseClass);
		var arr_advisesContent = $j(this.adviseConfig.listObj.display.contentClass);
		var tipClass = this.adviseConfig.listObj.tipClass;
		
		/* shut all advises and tips */
		this.shutAllAdvisesAndTipsInList();
		
		/* Parse HTML or get Object */
		if(typeof(advisesAndTips) == 'string') {
			/* Parse String Text out of HTMl to Obj */
			var obj_advisesAndTips = JSON.parse(advisesAndTips);
		} else {
			var obj_advisesAndTips = advisesAndTips;
		}
		
		$j.each(obj_advisesAndTips,$j.shove(
			function(index,el){
				var adviseToShow = $j(this.arr_advisesContent[index]);
				var adviseWrapper = $j(this.arr_advises[index]);
				
				/* show advise */
				$j(adviseToShow).show();
				
				/* infotext */
				var adviseInfoText = adviseWrapper.siblings(this.topObj.adviseConfig.listObj.infotext.wrapper);
				var inactiveInfoText = adviseInfoText.children(this.topObj.adviseConfig.listObj.infotext.inactive);
				$j(inactiveInfoText).hide();
				var activeInfoText = adviseInfoText.children(this.topObj.adviseConfig.listObj.infotext.active);
				$j(activeInfoText).show();
				
				/* button */
				var inactiveButtonClass = this.topObj.adviseConfig.listObj.display.button.classes[0];
				var activeButtonClass = this.topObj.adviseConfig.listObj.display.button.classes[1];
				switch(this.topObj.adviseConfig.listObj.display.button.position){
					case 'after':
						var adviseButton = adviseWrapper.siblings('.'+inactiveButtonClass);
					break;
					case 'into':
						var adviseButton = adviseWrapper.find('.'+inactiveButtonClass);
					break;
				}
				$j(adviseButton).addClass(activeButtonClass);
				$j(adviseButton).removeClass(inactiveButtonClass);
				
				/* Tips in the advise */
				/* Get the Array of all children-Tips */
				var arr_tips = $j(adviseToShow).find(this.topObj.adviseConfig.listObj.tipClass);
				var arr_tipContent = $j(adviseToShow).find(this.topObj.adviseConfig.listObj.displayTip.contentClass);
				if(!$j.isArray(el)) { 
					el = $j.makeArray(el);
				}
				if($j.isArray(el)) {
					$j.each(el,$j.shove(function(tipIndex,tipEl){
						/* show tip */
						var tipContentElem = this.arr_tipContent[tipEl];
						$j(tipContentElem).show();
						var tipWrapperElem = this.arr_tips[tipEl];
						
						/* change infoText */
						var tipInfoText = $j(tipWrapperElem).siblings(this.topObj.adviseConfig.listObj.infotextTip.wrapper);
						var inactiveInfoText = tipInfoText.children(this.topObj.adviseConfig.listObj.infotextTip.inactive);
						$j(inactiveInfoText).hide();
						var activeInfoText = tipInfoText.children(this.topObj.adviseConfig.listObj.infotextTip.active);
						$j(activeInfoText).show();
						
						/* change button-state */
						switch(this.topObj.adviseConfig.listObj.displayTip.button.position){
							case 'after':
								var tipButton = $j(tipWrapperElem).siblings('.'+this.inactiveButtonClass);
							break;
							case 'into':
								var tipButton = $j(tipWrapperElem).find('.'+this.inactiveButtonClass);
							break;
						}
						$j(tipButton).addClass(this.activeButtonClass);
						$j(tipButton).removeClass(this.inactiveButtonClass);
						
					},{topObj: this.topObj, arr_tips: arr_tips, arr_tipContent: arr_tipContent, activeButtonClass: activeButtonClass, inactiveButtonClass: inactiveButtonClass}));
				} else {
				}
		},{topObj:this,arr_advisesContent: arr_advisesContent, arr_advises: arr_advises}));
	},
	shutAllAdvisesAndTipsInList:function(){
		/* shut advises */
		var advises = $j(this.adviseConfig.listObj.display.contentClass);
		$j(advises).hide();
		
		/* show deactive advisetext */
		var inactiveClassAdvise = $j(this.adviseConfig.listObj.infotext.inactive);
		$j(inactiveClassAdvise).show();
		var activeClassAdvise = $j(this.adviseConfig.listObj.infotext.active);
		$j(activeClassAdvise).hide();
		
		/* show deactive button for advise */
		activeButtonsAdvise = $j('.'+this.adviseConfig.listObj.display.button.classes[1]);
		$j(activeButtonsAdvise).removeClass(this.adviseConfig.listObj.display.button.classes[1]);
		$j(activeButtonsAdvise).addClass(this.adviseConfig.listObj.display.button.classes[0]);
		
		/* shut tips */
		var tips = $j(this.adviseConfig.listObj.displayTip.contentClass);
		$j(tips).hide();
		
		/* show deactive advisetext */
		var inactiveClassTip = $j(this.adviseConfig.listObj.infotextTip.inactive);
		$j(inactiveClassTip).show();
		var activeClassTip = $j(this.adviseConfig.listObj.infotextTip.active);
		$j(activeClassTip).hide();
		
		/* show deactive button for tip */
		activeButtonsTip = $j('.'+this.adviseConfig.listObj.displayTip.button.classes[1]);
		$j(activeButtonsTip).removeClass(this.adviseConfig.listObj.display.button.classes[1]);
		$j(activeButtonsTip).addClass(this.adviseConfig.listObj.display.button.classes[0]);
	},
	doOpeningActionMenu:function(advisesAndTips){
		/* optional highlighting */
	},
	getButton:function(activeState){
		if(this.adviseConfig.listObj.display.button.type =="button") this.adviseConfig.listObj.display.button.type="span"; 
		if(activeState == true) {
			cssClass = this.adviseConfig.listObj.display.button.classes[1];
		} else {
			cssClass = this.adviseConfig.listObj.display.button.classes[0];
		}
		var button = $j("<"+this.adviseConfig.listObj.display.button.type+">").addClass(cssClass).text(this.adviseConfig.listObj.display.button.text);
		return button;
	}
});
