var windowsliveSignaturen = (function()
{
	// Array of fonts.
	var arr_fonts = {};
	
	// Define fontfile characters list order
	var str_charDef = " !\"#$%&'()*+,-./0123456789»«<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{:}~ÄÖUäöüß";
	
	// Basepath to fonts
	//var str_fontsBaseURL = "http://www.windowslive.de/_sub/e-mail-signaturen/fonts/";
	var str_fontsBaseURL = "/_sub/e-mail-signaturen/fonts/";
	
	/**
	 * Class Font
	 * Single font object
	 *
	 * @params	int_pCharHeight			integer						Letter height
	 * @params	int_pMaxCharWidth		integer						Max charachters width
	 * @params	arr_pCharacters			array							Charachters list
	 *
	 * @return	this								object						A new font instance
	 */
	function Font(int_pCharHeight, int_pMaxCharWidth, arr_pCharacters)
	{
		this.int_charHeight = int_pCharHeight;
		this.int_maxWidth = int_pMaxCharWidth;
		this.arr_characters = arr_pCharacters;
	}
	
	
	/*
	 * function createFont()
	 * Create a new Font instance
	 *
	 * @params	str_pString					string						Plain font file in .flf format (http://www.figlet.org/fontdb.cgi)
	 *
	 * return 	font								object						A new font object
	 */
	function createFont(str_pString)
	{
		var arr_characters = new Array();
		
		if (str_pString.search("\r") > -1) var arr_lines = str_pString.split("\r");
		else if (str_pString.search("\r") > -1) var arr_lines = str_pString.split("\r");
		else if (str_pString.search("\n") > -1) var arr_lines = str_pString.split("\n");		
			
		var arr_metadata = arr_lines[0].split(" ");
		var int_charHeight = parseInt(arr_metadata[1]);
		var int_maxCharWidth = parseInt(arr_metadata[3]);
		
		for (i = parseInt(arr_metadata[5]) + 1; i < arr_lines.length - int_charHeight; i = i + int_charHeight)
		{
			var arr_char = new Array();
			for (x = 0; x < int_charHeight; x++)
			{
				arr_char[x] = arr_lines[i + x].replace(/@@/g, "@").replace(/(@|\$)/g, " ");
			}
			
			arr_characters.push(arr_char);
		}
		
		return new Font(int_charHeight, int_maxCharWidth, arr_characters);
	}
	
	
	return {
		/**
		 * function loadFont()
		 * Load a font and append it to the fonts array
		 *
		 * @params	str_pFilename			string						The font filename
		 * @parans	obj_pCallback			object						Callback function after file load
		 */
		loadFont: function(str_pFilename, obj_pCallback)
		{
			jQuery.ajax(
			{
				cache: true,
				type: 'GET',
				dataType: 'test',
				url: str_fontsBaseURL + str_pFilename,
				
				success: function(str_pText)
				{
					arr_fonts[str_pFilename.split(".")[0]] = createFont(str_pText);
					(obj_pCallback || function (){})();
				}
			});
		},
		
		
		/*
		 * function renderText()
		 * Render a sting with a named font
		 *
		 * @params	str_pText					string						The text to render	
		 * @params	str_pFont					string						Name of the font to use
		 *
		 * return 	str_text					string						Rendered text output
		 */
		renderText: function(str_pText, str_pFont)
		{
			var str_text = "";
			
			if (arr_fonts[str_pFont])
			{
				// Chache characters positions
				var arr_lettersPositions = new Array();
				var arr_textChars = str_pText.split("");
				
				for (i = 0; i < arr_textChars.length; i++)
				{
					var int_pos = str_charDef.search(arr_textChars[i]);
					
					if ((int_pos > -1) && (arr_fonts[str_pFont].arr_characters[int_pos]) && (arr_fonts[str_pFont].arr_characters[int_pos][0].length > 1)) arr_lettersPositions.push(int_pos);
					else if (int_pos > -1)
					{
						switch (arr_textChars[i])
						{
							case 'Ä':
								var int_pos1 = str_charDef.search("A");
								var int_pos2 = str_charDef.search("E");
								
								if ((int_pos1 > -1) && (int_pos2 > -1)) arr_lettersPositions.push(int_pos1, int_pos2);
								else arr_lettersPositions.push(0);
								
								break;
							
							case 'Ö':
								var int_pos1 = str_charDef.search("O");
								var int_pos2 = str_charDef.search("E");
								
								if ((int_pos1 > -1) && (int_pos2 > -1)) arr_lettersPositions.push(int_pos1, int_pos2);
								else arr_lettersPositions.push(0);
								
								break;
							
							case 'Ü':
								var int_pos1 = str_charDef.search("U");
								var int_pos2 = str_charDef.search("E");
								
								if ((int_pos1 > -1) && (int_pos2 > -1)) arr_lettersPositions.push(int_pos1, int_pos2);
								else arr_lettersPositions.push(0);
								
								break;
								
							case 'ä':
								var int_pos1 = str_charDef.search("a");
								var int_pos2 = str_charDef.search("e");
								
								if ((int_pos1 > -1) && (int_pos2 > -1)) arr_lettersPositions.push(int_pos1, int_pos2);
								else arr_lettersPositions.push(0);
								
								break;
							
							case 'ö':
								var int_pos1 = str_charDef.search("o");
								var int_pos2 = str_charDef.search("e");
								
								if ((int_pos1 > -1) && (int_pos2 > -1)) arr_lettersPositions.push(int_pos1, int_pos2);
								else arr_lettersPositions.push(0);
								
								break;
								
							case 'ü':
								var int_pos1 = str_charDef.search("u");
								var int_pos2 = str_charDef.search("e");
								
								if ((int_pos1 > -1) && (int_pos2 > -1)) arr_lettersPositions.push(int_pos1, int_pos2);
								else arr_lettersPositions.push(0);
								
								break;
								
							case 'ß':
								var int_pos1 = str_charDef.search("s");
								
								if (int_pos1 > -1) arr_lettersPositions.push(int_pos1, int_pos1);
								else arr_lettersPositions.push(0);
								
								break;
								
							default:
								arr_lettersPositions.push(0);
								break;
						}
					}
					else arr_lettersPositions.push(0);
				}
				
				// Print text (row by row)
				for (i = 0; i < arr_fonts[str_pFont].int_charHeight; i++)
				{
					for (x = 0; x < arr_lettersPositions.length; x++)
					{
						str_text += arr_fonts[str_pFont].arr_characters[arr_lettersPositions[x]][i];
					}
					
					str_text += "\r";
				}
			}
			
			return str_text;
		},
		
		buildPreview: function(str_pPage, arr_pFields)
		{
			var str_text = "";

			if (jQuery("#mailSignature div." + str_pPage + " p.name input").val() != "")
			{
				if (str_pPage === "page_art")
				{
					// Render text with ascci-art-font 
					var str_font = jQuery("#mailSignature div.page_art p.selectB option:selected").val().split(".")[0];
					var str_input = jQuery("#mailSignature div." + str_pPage + " p.name input").val();
					var str_renderdText = windowsliveSignaturen.renderText(str_input, str_font);
					
					if ((str_renderdText.length * 1.2) > 368) str_textareaWidth = (str_renderdText.length * 1.8) + "px";
					else str_textareaWidth = "100%";
					
					jQuery("#mailSignature div.page_art div.preview textarea").css({
						width: str_textareaWidth
					});
					
					str_text += str_renderdText;
				}
				else
				{
					str_text += jQuery("#mailSignature div." + str_pPage + " p.name input").val();
					str_text += "\r";
				}
			}
			
			if (str_pPage !== "page_web")
			{
				for (i = 0; i < arr_pFields.length; i++)
				{
					if (typeof(arr_pFields[i]) === "object")
					{
						if (arr_pFields[i][0] === "input")
						{
							str_text += jQuery("#mailSignature div." + str_pPage + " p." + arr_pFields[i][1] + " input").val();
							str_text += "\r";
						}
						else if (arr_pFields[i][0] === "select")
						{
							var int_selectedIndex = jQuery("#mailSignature div." + str_pPage + " p." + arr_pFields[i][1] + " option:selected").val();
							
							switch (str_pPage)
							{								
								case 'page_bar':	
									str_text += windowsliveSignaturen.data.bar[int_selectedIndex].person + "\r";
									str_text += windowsliveSignaturen.data.bar[int_selectedIndex].job;
									break;
									
								case 'page_factory':
									str_text += windowsliveSignaturen.data.art[int_selectedIndex].text + "\r\r";
									str_text += "(" + windowsliveSignaturen.data.art[int_selectedIndex].author + ")";
									break;
							}
						}
					}
					else if ((typeof(arr_pFields[i]) === "string") && (arr_pFields[i] === "line"))
					{
						str_text += "__________________________\r\r";
					}
				}
			}
			else
			{
				// "Netzwerke" need a special string handeling!
				str_text += "__________________________\r\r";
		
				if (jQuery("#mailSignature div.page_web li.windowslive input").val() != "")
				{
					str_text += "Windows Live:\r" + jQuery("#mailSignature div.page_web li.windowslive input").val() + "\r\r";
				}
				
				if (jQuery("#mailSignature div.page_web li.facebook input").val() != "")
				{
					str_text += "Facebook:\r" + jQuery("#mailSignature div.page_web li.facebook input").val() + "\r";
					str_text += "http://www.facebook.com/" + jQuery("#mailSignature div.page_web li.facebook input").val() + "\r\r";
				}
				
				if (jQuery("#mailSignature div.page_web li.twitter input").val() != "")
				{
					str_text += "Twitter:\r" + jQuery("#mailSignature div.page_web li.twitter input").val() + "\r";
					str_text += "http://www.twitter.com/" + jQuery("#mailSignature div.page_web li.twitter input").val() + "\r\r";
				}
				
				if (jQuery("#mailSignature div.page_web li.xing input").val() != "")
				{
					str_text += "Xing:\r" + jQuery("#mailSignature div.page_web li.xing input").val() + "\r";
					str_text += "http://www.xing.com/" + jQuery("#mailSignature div.page_web li.xing input").val() + "\r\r";
				}
				
				if (jQuery("#mailSignature div.page_web li.studivz input").val() != "")
				{
					str_text += "StudiVZ:\r" + jQuery("#mailSignature div.page_web li.studivz input").val() + "\r\r";
				}
				
				if (jQuery("#mailSignature div.page_web li.schuelervz input").val() != "")
				{
					str_text += "SchuelerVZ:\r" + jQuery("#mailSignature div.page_web li.schuelervz input").val() + "\r\r";
				}
				
				if (jQuery("#mailSignature div.page_web li.meinvz input").val() != "")
				{
					str_text += "MeinVZ:\r" + jQuery("#mailSignature div.page_web li.meinvz input").val() + "\r\r";
				}
			}
			
			jQuery("#mailSignature div." + str_pPage + " div.preview textarea").val(str_text);
		},
		
		handlePager: function(obj_pCaller, str_pPage, str_pField)
		{			
			var int_index = 0;
			var str_direction = jQuery(obj_pCaller).parent().attr("class");
			var obj_select = jQuery("#mailSignature div." + str_pPage + " p." + str_pField + " select");
			
			if (str_direction == "next") int_index = jQuery(obj_select)[0].selectedIndex + 1;
			else int_index = jQuery(obj_select)[0].selectedIndex - 1;
			
			if (int_index < 0) int_index = jQuery(obj_select)[0].length - 1;
			else if (int_index >= jQuery(obj_select)[0].length) int_index = 0;
			
			jQuery(obj_select)[0].selectedIndex = int_index;
			jQuery(obj_select).trigger("change");
			
			var str_trackingCode = windowsliveSignaturen.data.tracking[str_pPage + "_" + str_pField + "_" + str_direction];
			trackClick(str_trackingCode, tracking_pageID, this);
				
			return false;
		}
	}
})();


jQuery(document).ready(function()
{
	var str_currentPage = "bar";
	
	// Create a ZeroClipboard instance and set its options
	var obj_clipbord = new ZeroClipboard.Client();
	
	// Open hotmail window on mouse up (flash movie event)
	obj_clipbord.addEventListener('onMouseUp', function()
	{
		window.open("http://mail.live.com/?rru=options?subsection%3D19", "Hotmail", "width=1024,height=768,location=yes,menubar=yes,resizable=yes,scrollbars=yes,status=yes");
		
		// Track click
		trackClick("M_Signaturen_HotmailButtom", tracking_pageID, this);
	});
	
	// Copy content to clipbord on mouse down (flash movie event)
	obj_clipbord.addEventListener('onMouseDown', function()
	{
		
		if (str_currentPage == "bar") obj_clipbord.setText(jQuery("#mailSignature div.page_bar div.preview textarea").val());
		if (str_currentPage == "factory") obj_clipbord.setText(jQuery("#mailSignature div.page_factory div.preview textarea").val());
		if (str_currentPage == "art") obj_clipbord.setText(jQuery("#mailSignature div.page_art div.preview textarea").val());
		if (str_currentPage == "web") obj_clipbord.setText(jQuery("#mailSignature div.page_web div.preview textarea").val());
	});

	obj_clipbord.glue('hotmailBtn', 'hotmailBtnRef');
	
	
	// Switch tabs
	jQuery("#mailSignature ul.tabs a").click(function()
	{
		str_currentPage = jQuery(this).parent().attr("id").substr(6);
		
		// Select tab
		jQuery("#mailSignature ul.tabs li").removeClass("current");
		jQuery(this).parent().addClass("current");
		
		// Show page
		jQuery("#mailSignature div.currentPage").removeClass("currentPage");
		jQuery("#mailSignature div.page_" + str_currentPage +", #mailSignature div.pageBorderBottom_" + str_currentPage).addClass("currentPage");
		
		// Track click
		var str_trackingCode = windowsliveSignaturen.data.tracking[str_currentPage];
		trackClick(str_trackingCode, tracking_pageID, this);
		
		return false;
	});
	
	
	// Show / Hide instruction panels
	var int_instructionPanelTimer = -1;
	jQuery("#mailSignature div.manual p.instructions").hover(function()
	{
		window.clearTimeout(int_instructionPanelTimer);
		int_instructionPanelTimer = -1;
			
		jQuery(this).parent().next("div.instructions").fadeIn(300);
		if (bol_ie6) jQuery("#mailSignature select").css("visibility", "hidden");
	},
	function()
	{
		var obj_panel = jQuery(this).parent().next("div.instructions");
		int_instructionPanelTimer = window.setTimeout(function() 
		{
			obj_panel.fadeOut(300);
			if (bol_ie6) jQuery("#mailSignature select").css("visibility", "visible");
		}, 300);
	});
	
	jQuery("#mailSignature div.instructions").hover(function()
	{
		if (int_instructionPanelTimer > -1)
		{
			window.clearTimeout(int_instructionPanelTimer);
			int_instructionPanelTimer = -1;
		}
	},
	function()
	{
		var obj_panel = jQuery(this);
		int_instructionPanelTimer = window.setTimeout(function() 
		{
			obj_panel.fadeOut(300);
			if (bol_ie6) jQuery("#mailSignature select").css("visibility", "visible");
		}, 300);
	});
	
	
	// Bar page
	jQuery("#mailSignature div.page_bar input, #mailSignature div.page_bar select").change(function() { windowsliveSignaturen.buildPreview("page_bar", ["line", ["select", "selectA"]]); });
	jQuery("#mailSignature div.page_bar ul.selectAPager a").click(function() { return windowsliveSignaturen.handlePager(this, "page_bar", "selectA") });
	jQuery("#mailSignature div.page_bar p.name input").trigger("change");
	
	// Factory page
	jQuery("#mailSignature div.page_factory input, #mailSignature div.page_factory select").change(function() { windowsliveSignaturen.buildPreview("page_factory", [["input", "selectA"], "line", ["select", "selectB"]]); });
	jQuery("#mailSignature div.page_factory ul.selectBPager a").click(function() { return windowsliveSignaturen.handlePager(this, "page_factory", "selectB") });
	jQuery("#mailSignature div.page_factory p.name input").trigger("change");
	
	// Art page
	jQuery("#mailSignature div.page_art input, #mailSignature div.page_art select").change(function() { windowsliveSignaturen.buildPreview("page_art", ["line", ["input", "selectA"]]); });
	jQuery("#mailSignature div.page_art ul.selectBPager a").click(function() { return windowsliveSignaturen.handlePager(this, "page_art", "selectB") });
	
	// Load all ascii fonts on startup
	var int_fontsCount = 0;
	var int_fonts = jQuery("#mailSignature div.page_art p.selectB select")[0].length;
	
	jQuery("#mailSignature div.page_art option").each(function()
	{
		windowsliveSignaturen.loadFont(jQuery(this).val(), function()
		{
			int_fontsCount++;
			
			if (int_fontsCount == int_fonts) jQuery("#mailSignature div.page_art p.name input").trigger("change");
		});
	});
	
	// Web page
	jQuery("#mailSignature div.page_web input").change(function() { windowsliveSignaturen.buildPreview("page_web", ["line"]); });
	jQuery("#mailSignature div.page_web p.name input").trigger("change");
});



