// DOM element creator for jQuery and Prototype by Michael Geary
// http://mg.to/topics/programming/javascript/jquery
// Inspired by MochiKit.DOM by Bob Ippolito
// Free beer and free speech. Enjoy!

$.defineTag = function( tag ) {
	$[tag.toUpperCase()] = function() {
		return $._createNode( tag, arguments );
	}
};

(function() {
	var tags = [
		'a', 'br', 'button', 'canvas', 'div', 'fieldset', 'form',
		'h1', 'h2', 'h3', 'hr', 'img', 'input', 'label', 'legend',
		'li', 'ol', 'optgroup', 'option', 'p', 'pre', 'select',
		'span', 'strong', 'table', 'tbody', 'td', 'textarea',
		'tfoot', 'th', 'thead', 'tr', 'tt', 'ul'];
	for( var i = tags.length - 1;  i >= 0;  i-- ) {
		$.defineTag( tags[i] );
	}
})();

$.NBSP = '\u00a0';

$._createNode = function( tag, args ) {
	var fix = { 'class':'className', 'Class':'className' };
	var e;
	try {
		var attrs = args[0] || {};
		e = document.createElement( tag );
		for( var attr in attrs ) {
			var a = fix[attr] || attr;
			e[a] = attrs[attr];
		}
		for( var i = 1;  i < args.length;  i++ ) {
			var arg = args[i];
			if( arg == null ) continue;
			if( arg.constructor != Array ) append( arg );
			else for( var j = 0;  j < arg.length;  j++ )
			append( arg[j] );
		}
	}
	catch( ex ) {
		alert( 'Cannot create <' + tag + '> element:\n' +
		args.toSource() + '\n' + args );
		e = null;
	}

	function append( arg ) {
		if( arg == null ) return;
		var c = arg.constructor;
		switch( typeof arg ) {
			case 'number': arg = '' + arg;  // fall through
			case 'string': arg = document.createTextNode( arg );
		}
		e.appendChild( arg );
	}

	return e;
};

// Juwimm JS Functions

if (!JWMM) {
var JWMM = {
	ajaxurl: "",
	current_faq: null,
	current_glossary: null,
	current_menu: null,
	isDisclaimerActive: false,
	searchval: "",
	glossaryDelay: null,

	/**
	 * loadTestimonial
	 *
	 * executes an ajax call to load a remote testimonial and
	 * inserts it into the left column of testimonial.html
	 *
	 * @param Event $e the click event
	 * @return void 
	 * @author Torsten Walter
	 */
	
	loadTestimonial: function (e) {
		
		var seed = Math.round(Math.random()*10000000);
		var url = this.getAttribute ? this.getAttribute("href") : JWMM.ajaxurl;
		if(url==''){
			url = $('a.testimonial')[0].href;
		}
		jQuery.get(url, "viewType=contentOnly&seed=" + seed, function (oData, sStatus) {
			$("#leftCol-Content").html($(oData).filter("#ajax").html());
			$(oData).find("div").filter(".glossaryBubble").map(function () {
				if($("#" + $(this).attr("id")).length == 0) {
					$('body').append($(this));
				}
			});
			JWMM.discoverGlossaryBubbles();
			// scroll window back to top
			window.location.hash = "#";
			$("#leftCol").scrollTop(0);
			JWMM.updateTestimonialPrint(url)
		}, "html");
		
		return false;
	},
	updateTestimonialPrint: function (url) {
		var lnk = $(".printout").parent();
		lnk.attr("href",'javascript:openWindow("' + url + '?viewType=print",745,500,"yes","Printview")');
	},
	discoverGlossaryBubbles: function () {
		$('a.glossary').mouseover(JWMM.showGlossaryBubble);
		$('a.glossary').mouseout(JWMM.showGlossaryBubble);
	},
	mail: function (sTo, sSubject, sBody, sUrl) {
 		var swap = function (chr) {
			switch(chr) {
				case "´":
				return "'";
				return "%3F";
				case "?":
				return "%3F";
				case "&":
				return "%27";
				case "=":
				return "%3E";
			}
			return chr;
		};
		var encode = function (str) {
			return (str).replace(/\?/g, function(match){return swap(match);});
		};
		var amp = "&";
		var sUrl = sUrl || window.location.href;
		var params = "subject=" + encode(sSubject) + amp + "body=" + encode(sBody) + encode(sUrl) + "\n\n";
		
		window.location = encodeURI("mailto:" + sTo + "?" + params);
		return false;
	},
	mailto: function () {
		return JWMM.mail(JWMM.mailTo, JWMM.mailSubject, JWMM.mailBody);
	},
	mailtoPartner: function (url) {
		return JWMM.mail(JWMM.mailToPartner, JWMM.mailSubjectPartner, JWMM.mailBodyPartner+"\n\n", url);
	},
	toggleDropdown: function (e) {
		e.stopPropagation();
		var new_menu = $(this).parent().parent().parent().find(".textlink .options");
		if (JWMM.current_menu &&
				JWMM.current_menu[0] != new_menu[0] &&
				JWMM.current_menu.css("display") == "block") {

			JWMM.current_menu.slideToggle(50);
		}
		new_menu.slideToggle(50);
		JWMM.current_menu = new_menu;
		return false;
	},
	toggleFaq: function (e) {
		e.stopPropagation();
		var new_faq = "#" + this.id;
		var new_target = new_faq + "_answer";
		var old_target = JWMM.current_faq + "_answer"
		$(old_target + "," + new_target).slideToggle(300);
		$(old_target + "," + new_target).toggleClass("closed");
		$(JWMM.current_faq + "," + new_faq + "," + old_target + "," + new_target).toggleClass("open");
		JWMM.current_faq = (new_faq == JWMM.current_faq) ? null : new_faq;
	},
	toggleSitemap: function (e) {
		e.stopPropagation();
		var new_leaf = $("#" + this.id);
		var new_target = $("#" + this.id + "_link");
		
		var elm = new_leaf.parent();
		var wasClosed = elm.hasClass("closed");
		new_target.slideToggle(300, function () {
			elm.toggleClass("closed");
			elm.toggleClass("open", wasClosed);
			
		});
	},
	toggleGlossary: function (e) {
		e.stopPropagation();
		var new_glossary = this.hash.substr(1);
		var items = $("div.glossary .content")
		
		if (this.hash == "#glossary_all") {
			items = items.filter(function (index) {
				return $(this).hasClass("open");
			});
			
		} else if (JWMM.current_glossary != null && new_glossary != JWMM.current_glossary) {
			items = items.filter(function(index){
				return $(this).attr("id") == JWMM.current_glossary || $(this).attr("id") == new_glossary;
			});
		} else {
			items = items.filter(function (index) {
				return $(this).attr("id") != new_glossary;
			});
		}
		items.slideToggle(300);
		items.toggleClass("open");
		JWMM.current_glossary = (new_glossary == JWMM.current_glossary || this.hash == "#glossary_all") ? null : new_glossary;
		return false;
	},
	showGlossaryBubble: function (e) {
		var bubble = $(this.hash+"_" + "glossaryLink");
		var bubble_width = bubble.width();
		var body_width = $(document.body).width();
		var max_offset = body_width - bubble_width - 20;
		var offset = $(this).offset();
		offset.left = offset.left - 50;
		e.stopPropagation();
		// modify offset to keep bubble inside the window bounds
		if (offset.left < 0) {
			offset.left = 0;
		} else if (offset.left > max_offset) {
			$(".source", bubble).css("left", Math.floor(offset.left - max_offset + 70)+"px");
			offset.left = max_offset;
		}
		if (e.type == "mouseout") {
			bubble.fadeOut(100, function () {
				$(".source", bubble).css("left", null)
			});
		} else {
			bubble.css({top: offset.top - bubble.innerHeight(), left: offset.left});
			bubble.fadeIn(250);
		}
		
		return false;
	},
	replaceSearchText: function (e) {
		if (this.value == JWMM.searchval) {
			this.value = "";
		} else {
			this.value = JWMM.searchval;
		}
	},
	openWithDisclaimer: function (disclaimerUri, uri, target) {
		if (!JWMM.isDisclaimerActive) {
			jQuery.get(disclaimerUri, "url=" + uri + "&target=" + target, function (oData, sStatus) {
				$("#disclaimerBody").html($(oData).filter("#ajax").html());
				JWMM.centerPopup();
				$("#disclaimerBody").fadeIn("slow");
			}, "html");
			$("body").css({
				"overflow": "hidden"
			});
			$("#disclaimerBackground").css({
				"opacity": "0.7"
			});
			$("#disclaimerBackground, #disclaimer").fadeIn("slow");
			$(window).resize(function(){
				JWMM.centerPopup();
			});
			JWMM.isDisclaimerActive = true;
		}
	},
	closeDisclaimer: function () {
		if (JWMM.isDisclaimerActive) {
			$("#disclaimerBackground, #disclaimer").parent().css({
				"overflow": ""
			});
			$("#disclaimerBody").fadeOut("slow", function(){
				$("#disclaimer").fadeOut(1000);
			});
			$(window).resize(null);
			JWMM.isDisclaimerActive = false;
		}
	},
	centerPopup: function () {
		//request data for centering  
		var windowWidth = document.documentElement.clientWidth;  
		var windowHeight = document.documentElement.clientHeight;  
		var popupHeight = $("#disclaimerBody").height();  
		var popupWidth = $("#disclaimerBody").width();  
		//centering
		
		$("#disclaimer").css({
			"top": $("body").scrollTop() || $("html").scrollTop(),
			"left": $("body").scrollLeft() || $("html").scrollLeft()
		});
		$("#disclaimerBackground, #disclaimer").css({
			"height": windowHeight,
			"width": windowWidth
		});
		$("#disclaimerBody").css({  
			"top": windowHeight/2-popupHeight/2,  
			"left": windowWidth/2-popupWidth/2  
		});
	},
	prepareDropdowns: function () {
		var buildList = function (opts) {
			var ul = $.UL();
			var l = opts.length;
			var cName = "";
			var selID = 0;
			
			for(var i=0; i < l; i++) {
				var o = opts[i];
				
				if (i % 2 == 0) {
					cName = "odd";
				} else {
					cName = "even";
				}
				
				if (i == 0) {
					cName += " first";
				} else if (i == l-1) {
					cName += " last";
				}
				
				if (o.selected) {
					selID = i;
				}
				
				$(ul).append($.LI({Class:cName},
					$.A({href:o.value == "" ? "#" : o.value, title:o.text}, o.text)
				));
			}
			return [selID,ul];
		};
		
		var buildMenu = function (idx, elm) {
			var select = $("select", elm)[0];
			if (!select) return false;
			var opts = select.options;
			var list = buildList(opts);
			
			$(elm).before(
				$.DIV({Class:"widget"},
					$.DIV({Class:"content"},
						$.A({href:"#", title:"Click to open"}, $.NBSP)
					)
				)
			);
			
			$(elm).before(
				$.DIV({Class:"textlink"},
					$.DIV({Class:"content"},
						$.A({href:"#", title:"Click to open"}, opts[list[0]].text)
					),
					$.DIV({id: select.name, Class:"options"},
						list[1]
					)
				)
			);
			return true;
		};
		
		$(".ft-dropdown form").map(function (i, elm) {
			if (buildMenu(i, elm)) {
				$(this).remove();
			}
		});
	}
}
}
var openWithDisclaimer = JWMM.openWithDisclaimer;
$(document).ready(function () {
	// [START] -- Dropdowns
	if ($(".ft-dropdown").length > 0) {
		JWMM.prepareDropdowns();
		$(".ft-dropdown .textlink .content a, .ft-dropdown .widget .content a").click(JWMM.toggleDropdown);
		
		$(".ft-dropdown .options").map(function () {
			$(this).css({width: $(this).parent().innerWidth() - $(this).parent().parent().find('.widget').innerWidth() +17 });
		});
		$(".ft-dropdown .options li").mouseover(function () {
			$(this).addClass("hover");
		});
		$(".ft-dropdown .options li").mouseout(function () {
			$(this).removeClass("hover");
		});
		$("#page").click(function (e) {
			JWMM.toggleDropdown(e);
			JWMM.current_menu = null;
		});
	}
	
	// [START] -- Search
	if ($("#ft-search .textlink input").length > 0) {
	 	JWMM.searchval = $("#ft-search .textlink input")[0].value;
		$("#ft-search .textlink input").focus(JWMM.replaceSearchText);
		$("#ft-search .textlink input").blur(JWMM.replaceSearchText);
	}
	// [END] -- Search
	if ($(".collapsibleList").length > 0) {
		$("ul.collapsibleList li.closed ul, dd.closed").css("display", "none");
	}
	
	if ($('a.glossary').length > 0) {
		JWMM.discoverGlossaryBubbles();
		
		$('body').append($('div.glossaryBubble'));
	}
	
	if ($('a.testimonial').length > 0) {
		$('a.testimonial').click(JWMM.loadTestimonial);
		JWMM.loadTestimonial();
	}
	
	if ($('dt.faq').length > 0) {
		$('dt.faq').click(JWMM.toggleFaq);
		$(window.location.hash).click();
	}
	
	if ($("#glossaryNav").length > 0) {
		$("#glossaryNav a").click(JWMM.toggleGlossary);
		if (window.location.hash.length > 0) {
			$("#glossaryNav a[href='#glossary_"+window.location.hash.substr(1,1)+"']").click();
		}
	}
	
	if ($("ul.collapsibleList li span.sitemap").length > 0) {
		$("ul.collapsibleList span.sitemap").click(JWMM.toggleSitemap);
	}

	if (jQuery.support.cssFloat) { // non IE
		$("#bookmark").css({display: "none"});
		$("#ft-actions .bookmark").parent().parent().css({display: "none"})
	}
	if ($("#ft-actions li a span.email")) {
		$("#ft-actions li a span.email").parent().click(function () {
			JWMM.mailto();
		});
	}

	if ($("#ft-nextSteps li a span.ft-partner, #ft-nextSteps li a span.ft-network").length > 0) {
		$("#ft-nextSteps li a span.ft-partner, #ft-nextSteps li a span.ft-network").parent().click(function (e) {
			e.stopPropagation();
			var url = this.href != "#" ? this.href : null;
			this.href = "#";
			JWMM.mailtoPartner(url);
		});
	}
});

function openWindow(url,width,height,scroll,name,anchor)
{
	//default scrollbars=no;
	if(scroll=='')
	{
		scroll = 'no';
	}	
	if(anchor!=null)
	{
		url = url+""+anchor;
	}
	
	popWindow = window.open(url,name,"toolbar=no,width="+width+",height="+height+",status=yes,scrollbars="+scroll+",resizable=yes,menubar=no,dependent=no");
	popWindow.blur;
}