/* ******************************************************************
 * Speednavigation
 * Lädt Speednavigationsdaten als JSON und erweitert DOM um
 * ausklappende Submenus und Events
 * @author Robert Agthe (http://robert-agthe.de)
  *******************************************************************/
if(typeof piApp=='undefined') piApp = {}
if(typeof piApp.helper=='undefined') piApp.helper = {}
piApp.helper.speednavi = function() {
	var self = this

	// Eigenschaften
	self.data  = []
	self.timer = 1500
	self.timeout = false

	// Selektoren
	self.selektor = {
		navi: '#Navigation',
		link: 'a.SNLink',
		linkspan: 'a.SNLink span',
		sublink: 'a.SNSubLink',
		button: 'div.piSpeedNaviOpen'
	}

	// Zu vergebende Klassen
	self.classes = {
		sn_trigger_elem: 'piSpeedNaviOpen',
		sn_ul_elem: 'piSpeedNaviList'
	}

	// Init
	self.init = function() {
		self.getData()
		self.addMarkup()
		self.events()
	}

	// Daten für die Navigation 
	// aus dem JSON Objekt holen
	self.getData = function() {
		try {
			self.data = piApp.data.speednavi
		} catch(e) {
			console.log('Es fehlen die JSON Daten für das Speedmenu!')
		}
	}
	// Durchsucht ein JSON Objekt nach einer bestimmten
	// Key Value Kombination und gibt den gefunden Eintrag zurück
	self.getObjects = function (obj, key, val) {
		var objects = [];
		for (var i in obj) {
			if (!obj.hasOwnProperty(i)) continue;
			if (typeof obj[i] == 'object') {
				objects = objects.concat(self.getObjects(obj[i], key, val));
			} else if (i == key && obj[key] == val) {
				objects.push(obj);
			}
		}
		return objects;
	}

	// Events definieren
	self.events = function() {
		$(self.selektor.link).bind('mouseleave',self.hideAllDropDownsAfterTimeout)
		// Ein und ausblenden des Buttons
		$(self.selektor.link).bind('mouseenter',self.showSpeedNavi)
		// EVENT: Klick auf Hauptnavgigations <a><span>
		$(self.selektor.navi).delegate(self.selektor.linkspan,'click' ,self.click)
		// EVENT: Klick auf Subnavgigations <a>
		$(self.selektor.navi).delegate(self.selektor.sublink,'click' ,self.subclick)
		// Event: Maus fährt über den Button
		$(self.selektor.navi).delegate(self.selektor.button,'mouseenter',self.addDropdown)
		// EVENT: Klick auf Hauptnavipunkt <a>
		$(self.selektor.navi).delegate(self.selektor.link, 'click' ,function(e){e.preventDefault()})
	}

	// DOM nach Speednavigationselementen durchsuchen (a.SNLink)
	// aus diesen Elementen die ID auslesen und danach im
	// JSON objekt suchen. Anschliessend den Submenu Button 
	// unsichtbar einfügen....
	self.addMarkup = function() {
		$(self.selektor.link).each(function(i,val) {
			var paddint_top = $(this).css('padding-top')
			var padding_bottom = $(this).css('padding-bottom')
			var paddint_left = $(this).css('padding-left')
			var padding_right = $(this).css('padding-right')
			$(this).css('padding',0)

			var id = $(this).attr('id').split('_')[1]
			var div = document.createElement('div')
				div.id = 'SNSubKey_'+id
				div.className = self.classes.sn_trigger_elem
				div.style.display = 'none'
				div.appendChild(document.createTextNode('SUB'))
			$(this).wrapInner('<span />')
			$(this).children('span').css({
				"display": "inline-block",
				"padding-top": paddint_top,
				"padding-bottom": padding_bottom,
				"padding-left": paddint_left,
				"padding-right": padding_right
			})
			$(this).append(div)
		})
	}

	// Fügt ein Dropdown an das überfahrene Button Element an
	// Und rollt entsprechend alle Untermenus aus....
	self.addDropdown = function(event) {
		if(!$(event.target).hasClass('piSpeedNaviList') && !$(event.target).hasClass('SNSubLink')) {
			// Alle Dropdowns auf dieser Ebene löschen
			$(this).parent().parent().parent().find('ul.'+self.classes.sn_ul_elem).remove()
			var elem = $(this)
			var id = elem.attr('id').split('_')[1]
			var data = self.getObjects(self.data, 'id', id)[0]
			if(typeof data.sub == 'object'){
				var ul = document.createElement('ul')
					ul.className = self.classes.sn_ul_elem
					ul.style.zIndex = 1000
					ul.style.display = "none"
					for(var key in data.sub) {
						var a = document.createElement('a')
							a.className = 'SNSubLink'
							a.appendChild(document.createTextNode(data.sub[key].text))
							a.href = data.sub[key].href

						// Wenn es ein Submenu gibt, dann button anbringen
						if(typeof data.sub[key].sub != "undefined") {
							var div = document.createElement('div')
								div.appendChild(document.createTextNode("sub"))
								div.className = self.classes.sn_trigger_elem
								div.id = 'SNSubKey_'+data.sub[key].id
								a.appendChild(div)
						}

						var li = document.createElement('li')
							li.appendChild(a)

						ul.appendChild(li)
					}
			}
			$(this).append(ul)

			// Alle Buttons auf die Größe ihres Elternelements bringen
			$(this).find('div.'+self.classes.sn_trigger_elem).each(function(i,val){
				$(this).css({height: $(this).parent().parent().height()})
			})
		}
	}
	// Löscht alle Dropdowns
	self.hideAllDropDownsAfterTimeout = function(){
		// Sollte ein Timeout existieren, resetten!
		clearTimeout(self.timeout)
		// Timeout setzen
		self.timeout = setTimeout(self.removeAllDropdown, self.timer)
	}
	// Klick auf ein Hauptmenu Eintrag
	self.click = function(event) {
		event.preventDefault()
		document.location = $(this).parent('a').attr('href') 
	}
	// Klick auf ein Submenu Eintrag
	self.subclick = function(event) {
		document.location = $(this).attr('href') 
	}
	// Löscht alle Dropdowns
	self.removeAllDropdown = function(event) {
		$('ul.'+self.classes.sn_ul_elem).remove()
		// Speednavi Button ausblenden
		self.hideSpeedNavi()
	}
	// Button einblenden
	self.showSpeedNavi = function(event) {
		clearTimeout(self.timeout)
		if(!$(event.target).hasClass('piSpeedNaviList') && !$(event.target).hasClass('SNSubLink')){
			self.hideSpeedNavi()
			// Submenu Button holen
			var elem = $(this).find('div.'+self.classes.sn_trigger_elem)
			// Größe wie Parent Element
			var parent_height = elem.parent().height()
			elem.css({height:parent_height})
			// Element Zeigen
			elem.show()
		}
	}
	// Button ausblenden
	self.hideSpeedNavi = function(event) {
		$(self.selektor.button).hide()
	}
}

