/* User Agent (Browserkennung) auf einen bestimmten Browsertyp prüfen */  
function checkBrowserName(name){  
       var agent = navigator.userAgent.toLowerCase();  
       if (agent.indexOf(name.toLowerCase())>-1) {  
         return true;  
       }  
       return false;  
     }  

function newWindow(url, popUnder) {
	if (popUnder) {
		if(checkBrowserName('firefox')) {
			var winfeatures = "width=200,height=200,screenX=1100,screenY=600,scrollbars=1,resizable=1,"
		}
		var win = window.open(url, '', winfeatures + "toolbar=no,location=no,menubar=no,status=1,directories=0");
		win.blur()
		window.focus()
	} else {
		var win = window.open(url, '');
		win.focus();
	}
};
/**
 * einfaches Fenster
 */
function Frame() {
	var dim = [ 200, null ];
	var frame = null;
	var close = true;
	var pos = [ 0, 0 ];
	var margin = [ 0, 0, 0, 0 ];
	var frame = null;
	var title = "frame";
	var inDocument = null;
	var content_inner = null;
	var call = {
		on_close : null
	};
	var content = null;
	var header = null;

	/**
	 * constructor sozusagen
	 */
	(function() {
		frame = document.createElement("div");
	})();

	function prepareFrame() {

		if (!header) {
			header = document.createElement("div");
			header.className = "head";

			if (close) {
				var btn = $("<div class='close'></div>");

				btn.click(closeFrame);
				$(header).append(btn);
			}

			if (title.length > 0)
				$(header).append('<span>' + title + '</span>');
		}

		if (!content) {
			content = document.createElement("div");
			content.className = "body";
		}

		if (!inDocument) {
			$(frame).append(header);
			$(frame).append(content);

			$('body').append(frame);

			inDocument = true;
		}

		content.innerHTML = "";
		$(content).append(content_inner);

		prepareFrameCSS();

		// an der Stelle die Position berechnen
		if (posObj) {
			pos = posObj.calculatePosition( [ dim[0] || $(frame).width(),
					dim[1] || $(frame).height() ], margin);
		}

		// Fenster noch positionieren
		if (!isNaN(pos[0]) && pos[0] >= 0)
			$(frame).css("left", pos[0]);
		if (!isNaN(pos[1]) && pos[1] >= 0)
			$(frame).css("top", pos[1]);

	};

	function closeFrame() {

		if (call.on_close)
			call.on_close();

		$(frame).remove();
		inDocument = false;
	};

	function prepareFrameCSS() {
		with ($(frame)) {

			if (dim[0])
				css("width", dim[0]);
			if (dim[1])
				css("height", dim[1]);

			css("visibility", "hidden");
			css("position", "absolute");
			css("zIndex", "100");
		}
	};

	this.setTitle = function(t) {

		if (header) {
			header.innerHTML = "";

			if (t.length > 0)
				$(header).append('<span>' + t + '</span>');
		}

		title = t;
	};

	this.setCloseable = function(closeAble) {
		close = closeAble;
	};

	this.setPosition = function(pos) {

		if (pos.constructor == Array) {
			pos[0] = posx;
			pos[1] = posy;

			if (inDocument) {
				if (!isNaN(pos[0]) && pos[0] >= 0)
					$(frame).css("left", pos[0] + pos[2]);
				if (!isNaN(pos[1]) && pos[1] >= 0)
					$(frame).css("top", pos[1] + pos[3]);
			}
		} else
			posObj = pos;

	};

	this.setMargin = function(mt, mr, mb, ml) {
		margin = [ mt, mr, mb, ml ];
	};

	this.setDimension = function(width, height) {
		dim = [ width, height ];
	};

	this.setContent = function(contentId) {
		content_inner = document.getElementById(contentId).cloneNode(true);
		$(content_inner).removeAttr("id", null);
	};

	this.getFrame = function() {
		return frame;
	};

	this.onClose = function(callback) {
		call.on_close = callback;
	};

	this.close = function() {
		closeFrame();
	};

	this.setVisible = function(visible) {
		prepareFrame();
		if (visible) {
			$(frame).css("visibility", "visible");
		}
	};
};

function TooltipFrame(node) {

	var self = this;

	/*
	 * der Knoten wo das Tooltip angezeigt werden soll
	 */
	var node = $(node);

	/*
	 * das Offset vom Knoten
	 */
	var node_offset = node.offset();

	/*
	 * Knoten Dimension Weite insklusive Padding
	 */
	var node_width = node.width()
			+ (parseInt(node.css("padding-left")) + parseInt(node
					.css("padding-right")));

	/*
	 * Knoten Dimension Höhe insklusive Padding
	 */
	var node_height = node.height()
			+ (parseInt(node.css("padding-top")) + parseInt(node
					.css("padding-bottom")));

	/*
	 * gescrollte Dimension
	 */
	var s_dim = [ 0, 0 ];

	/*
	 * Fenster Dimension
	 */
	var d_dim = [ 0, 0 ];

	/**
	 * wird von Frame aufgerufen berechnet die Position für das Tooltip Fenster
	 * 
	 * @access public
	 * @param f_dim
	 *            Array [ frame weite , frame_höhe ]
	 * @param margin
	 *            Array [margin top, margin right, margin bottom, margin left]
	 * @return Array [pos x , pos y]
	 */
	this.calculatePosition = function(f_dim, margin) {

		var pos_x, pos_y = 0;

		s_dim = [ $(document).scrollLeft(), $(document).scrollTop() ];
		d_dim = [ $(window).width(), $(window).height() ];

		var x_end = node_offset.left + f_dim[0] + margin[3];
		var y_end = node_offset.top + f_dim[1] + margin[2];

		// ragt das Fenster am rechten rand hinaus
		if (x_end + node_width - s_dim[0] > d_dim[0]) { // wenn ja
			pos_x = node_offset.left - margin[1] - f_dim[0];
		} else {
			pos_x = node_offset.left + margin[3] + node_width;
		}

		// ragt das Fenster am unteren Rand hinaus
		if (y_end - s_dim[1] > d_dim[1]) { // wenn ja
			pos_y = node_offset.top - margin[0] - f_dim[1] + node_height;
		} else {
			pos_y = node_offset.top + margin[2];
		}

		return [ pos_x, pos_y ];
	};
};

/**
 * einfaches Tooltip Fenster auf beliebiges Element anwendbar
 * 
 * Knoten benötigt Attribut title="Fenster-Titel" Fenster-Titel wird umgewandelt
 * in fenster_titel was der ID entspricht vom Element was den Inhalt vom Tooltip
 * beihnaltet
 * 
 * Bsp: <a href="#" class="tooltip" title="Toller Tooltip">nen Tooltip</a> ...
 * <div id="toller_tooltip"> inhalt von toller tooltip </div>
 */
(function($) {
	$.fn.tooltip = function() {

		var node = this; // den Knoten speichern
		var id = null;
		var title = null;

		$(this).mouseover(function() {
			title = node.attr("title");
			id = node.attr("title").replace(/([\s-])/g, "_").toLowerCase();
			node.attr("title", "");
			prepareToolTipFrame();
		});

		$(this).mouseout(function() {
			node.attr("title", title);
			tooltip.close();
		});

		function prepareToolTipFrame() {
			tooltip.setCloseable(false);
			tooltip.setDimension(230, null);
			tooltip.setContent(id); // von welchen Element soll der Content
									// kommen
			tooltip.setTitle(title);
			tooltip.setMargin(0, 2, 0, 2);
			tooltip.setPosition(new TooltipFrame(node));
			tooltip.getFrame().className = "tooltip_frame";
			tooltip.setVisible(true);
		}
		;
	};

	var tooltip = new Frame();
})(jQuery);

/**
 * Observer Klasse
 */
function Observer() {

	var observer = [];

	this.addObserver = function(obs) {
		observer.push(obs);
	};

	this.removeObserver = function(obs) {
	};

	this.getObserver = function() {
		return observer;
	};
};

/**
 * Open Close Klasse erbt von Observer
 * 
 * @return
 */
function OpenClose() {
	
	Observer.call(this);
	
	var self = this;
	
	function callObserver(method, node) {
		
		var obs = self.getObserver();
		var len = obs.length;

		for ( var i = 0; i < len; i++) {
			switch (method) {
			case 'open':
				obs[i].onOpen( node );
				break;
			case 'close':
				obs[i].onClose( node );
				break;
			}
		}
	};

	this.addTrigger = function(node, openNodes) {
		node.attr("open", "false");

		node.click(function(event) {
			// Event stopppen
			event.stopImmediatePropagation();

			if (node.attr("open") == "false") {
				node.attr("open", "true");
				$(openNodes).css('display', 'inline');
				callObserver("open",node);
			} else {
				openNodes.css('display', 'none');
				node.attr("open", "false");
				callObserver("close", node);
			}
			return false;
		});
	};
};

/**
 * Normaler ContentSwitch
 * 
 * @TODO Display Methode hier ausbauen
 * @param displayContainer
 */
function ContentSwitch(displayContainer) {

	var self = this;

	var container = $(displayContainer);

	var tabs = $('.switch_trigger', container);

	var current = tabs.get(0);

	$.each(tabs, function(index) {
		var tab = tabs.get(index);

		$(tab).click(function(event) {
			event.stopImmediatePropagation();

			if (current == tab)
				return false;

			current.className = current.className.replace(/active_tab/,"");
			tab.className    += " active_tab";
			
			self.display(tab, current);
			current = tab;
			return false;
		});
	});

	this.getCurrent = function() {
		return current;
	};

	this.getCurDisplayContainer = function() {
		return $(current).next();
	};

	this.display = function() {
	};
};

/**
 * Menu Switch erbt von ContentSwitch
 * 
 * @param displayContainer
 */
function MenuSwitch(displayContainer) {

	ContentSwitch.call(this, displayContainer);

	function getHeight(_d, _t) {
		var display = $(_d);
		var trigger = $(_t);

		var height = display.height() + parseInt(display.css("padding-top"))
				+ parseInt(display.css("padding-bottom"));

		var addHeight = trigger.height() + parseInt(trigger.css("padding-top"))
				+ parseInt(trigger.css("padding-bottom"));

		return height + addHeight;
	};

	this.onOpen = function() {
		var height = getHeight(this.getCurrent(), this.getCurDisplayContainer());
		$(displayContainer).css("height", height);
	};

	this.onClose = function() {
		var height = getHeight(this.getCurrent(), this.getCurDisplayContainer());
		$(displayContainer).css("height", height);
	};

	this.display = function(node, old_node) {
		
		var hide = $(old_node).next()
		var disp = $(node).next();

		$(displayContainer).css("height", getHeight(disp, node));

		$(hide).css("visibility", "hidden");
		$(disp).css("visibility", "visible");
	};
};

var OpenCloseMenu = (function() {
	return new function() {
		var _t = null;
		
		this.create = function(_t, _d) {
			
			var oc = new OpenClose();
			
			_t.each(function() {
				var selfNode = this;
				oc.addTrigger($(this), (function() {
					var p = selfNode;
					// hochgehen bis ein UL Elternknoten gefunden wird
					do {
						p = p.parentNode;
					} while (p && p.nodeName.toLowerCase() != 'ul');
					return $('.hiddenonjs', p);
				})());
				
			});
			
			oc.addObserver(new function(){
				this.onClose = function( _t ){
					var text = 'mehr';
					
					// klassen namen ändern in sub_closed
					_t.get(0).className = _t.get(0).className.replace(/sub_open/,"sub_closed");
					
					( $(':first-child',_t).get(0) )?$(':first-child', _t ).html(text):_t.html(text);
				};
				
				this.onOpen = function( _t ){
					var text = 'weniger';
					
					// klassen namen ändern in sub_open
					_t.get(0).className = _t.get(0).className.replace(/sub_closed/,"sub_open");
					
					( $(':first-child',_t).get(0) )?$(':first-child', _t ).html(text):_t.html(text);
				};
			});
			
			return oc;
		};
	};
})();

$('document').ready(function(){
	OpenCloseMenu.create( $('.dsltrigger')    , '.hiddenonjs' );
	OpenCloseMenu.create( $('.lex_dsltrigger'), '.hiddenonjs' )
		.addObserver( new MenuSwitch( $('#lexikonlist') ) );

	$('.tooltip').each(function() {
		$(this).tooltip();
	});
	$('div.hasPricedetails').hover(function() {
		$(this).children('div.pricedetails').show();
	}, function() {
		$(this).children('div.pricedetails').hide();
	});
    /* Tabs */
    $('ul.tabMenue li.first a').addClass('active');
    $('ul.tabMenue li a').click(function() {
        $(this).parents('ul.tabMenue').children('li').children('a').removeClass('active');
        $(this).addClass('active');
        $(this).parents('ul.tabMenue').next('div.tabBox').children('div').hide();
        var string = $(this).attr('href');
        $(string).show();
        return false;
    });

	/* IE6 und IE7 */
    /* if($.browser.msie && $.browser.version < 8) {
        $('#dslLp table.compare tr.topOffer').hover(function() {
            $(this).children('td').css('background','url(../img/landing/pvg-dsl-lp_sprite_bg.png) repeat-y right -300px');
        }, function() {
            $(this).children('td').css('background','url(../img/landing/pvg-dsl-lp_sprite_bg.png) repeat-y right -300px');
        });
        $('#dslLp table.compare tr.row_wrapper').hover(function() {
            $(this).children('td').css('background','url(../img/landing/pvg-dsl-lp_sprite_bg.png) repeat-y right -300px');
        }, function() {
            $(this).children('td').css('background','url(../img/landing/pvg-dsl-lp_sprite_bg.png) repeat-y right -300px');
        });
    }    */  
    
    if($.browser.msie && $.browser.version < 8) {
    
        $('#dslLp table.compare tr.row_wrapper').hover(function() {
            $(this).children('td').addClass('ieFixRowHover');
        }, function() {
            $(this).children('td').removeClass('ieFixRowHover');
        });
        
        $('#dslLp table.compare tr.row_wrapper td.last').hover(function() {
            $(this).children('td').addClass('ieFixRowHoverLast');
        }, function() {
            $(this).children('td').removeClass('ieFixRowHoverLast');
        });
        
        $('#dslLp table.compare tr.topOffer').hover(function() {
            $(this).children('td').addClass('ieFixRowHover');
        }, function() {
            $(this).children('td').removeClass('ieFixRowHover');
        });
    }
});
