<html>  
	<head>  
		<title>Astroblahhh Font Sample Generator, in JavaScript</title>

<script type="text/javascript">

/*
	Astroblahhh Font Sample Generator, in JavaScript


Except for parts not by Apollia:

    Copyright (C) 2013-2019  Apollia

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see http://www.gnu.org/licenses/ .


    Contact info:     http://astroblahhh.com/contact-apollia.shtml 
*/



// ************************************
//
// Putting "window.[variable name]" is just a more explicit way 
// of declaring globals.  Inspired by: 
//			http://snook.ca/archives/javascript/global_variable


window.Astroblahhh_Font_Sampler=new Astroblahhh_Font_Sample_Generator_Object();
	// An object to hold all stuff related to the Font Sample Generator, called Font Sampler here for short.

window.App=Astroblahhh_Font_Sampler;



// ***************************  You can configure this script below.

Astroblahhh_Font_Sample_Generator_Object.prototype.Config_Object=function ()
{
	
	this.Sample_Sentence = "The quick brown fox jumps over the lazy dog!";
		
	
	// With no paragraph breaks:
	
	//this.Sample_Paragraph = "Back in my quaint garden, jaunty zinnias vie with flaunting phlox.  Travelling beneath the azure sky in our jolly ox-cart, we often hit bumps quite hard.  How jolly vexing, a fumble to drop zucchini in the quicksand! Five jumbo oxen graze quietly with packs of dogs. Now is the time for all quick brown dogs to jump over the lazy lynx. Brawny gods just flocked up to quiz and vex him. Many big jackdaws zipped quickly over the fox pen. Jackdaws love my big sphinx of quartz. Sphinx of black quartz, judge my vow. Murky haze enveloped a city, as jarring quakes broke forty-six windows.  Baroque? Well, just mix a dozen wacky pi fonts and you have got it.";
	
	
	// 4 paragraphs:
	
	this.Sample_Paragraph = "Back in my quaint garden, jaunty zinnias vie with flaunting phlox.  Travelling beneath the azure sky in our jolly ox-cart, we often hit bumps quite hard.  How jolly vexing, a fumble to drop zucchini in the quicksand!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Five jumbo oxen graze quietly with packs of dogs. Now is the time for all quick brown dogs to jump over the lazy lynx. Brawny gods just flocked up to quiz and vex him.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Many big jackdaws zipped quickly over the fox pen. Jackdaws love my big sphinx of quartz. Sphinx of black quartz, judge my vow.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Murky haze enveloped a city, as jarring quakes broke forty-six windows.  Baroque? Well, just mix a dozen wacky pi fonts and you have got it.";
		
	
	this.Sample_Text_to_Display = this.Sample_Paragraph;
	//this.Sample_Text_to_Display = this.Sample_Sentence;
	
	
	this.should_accept_getvar_input_from_url = false;
		// true|false
	
	this.should_include_pound_signs_in_hex_colors=true;
		// true|false
	
	this.should_hilite_font_color_textbox_upon_click=true;
		// true|false
	this.should_hilite_width_textbox_upon_click=false;
	this.should_hilite_lineheight_textbox_upon_click=false;
	this.should_hilite_wordspacing_textbox_upon_click=false;
	this.should_hilite_letterspacing_textbox_upon_click=false;
	

	this.should_show_instructions_at_top=true;
		//true|false
		
	
	this.should_show_prev_and_next_links_in_control_panel = true;
		// true|false
		
		
	this.should_make_up_and_down_keys_go_to_prev_and_next_samples = true;
		//true|false
	this.should_make_left_and_right_keys_go_to_prev_and_next_colors = true;
		
	
	this.should_require_ctrl_key_when_pressing_up_and_down_keys = true;
		// true|false
	this.should_require_ctrl_key_when_pressing_left_and_right_keys = false;
	
	
	this.should_allow_various_keyboard_shortcuts=true;
		//true|false			// Bold, italic, etc.
	this.should_require_ctrl_for_various_keyboard_shortcuts=false;
	

	this.should_make_arrow_keys_combined_with_alt_change_text_alignment=true;
		// true|false
	
	this.should_reverse_order_of_font_sizes = false;
		// true|false
	
	
	this.should_print_font_size_number_at_beginning_of_line = true;
	this.should_print_font_size_number_at_end_of_line = true;
		// true|false
	this.should_print_font_name_at_beginning_of_line = true;
	this.should_print_font_name_at_end_of_line = true;
	
	
	this.should_show_box_around_text = true;
		// true|false
	
	
	this.should_show_font_name_at_bottom_below_all_samples_of_current_font=true;
		// true|false
		
	
	this.line_height = "normal";
		// Default: normal
	
	this.word_spacing = "normal";
		// Default: normal
	
	this.letter_spacing = "normal";
		// Default: normal
			
		
	this.should_bold_text = false;
		// true|false
		
	this.should_italicize_text = "no";
		// italic|oblique|no
		//
		// Only italic does something, I didn't bother with oblique.

	
		
	this.should_show_controls_for_lined_styles = true;
		// true|false
	
	this.should_use_lined_style_with_text = "no";
		// underline|strikethru|overline|no

			// As of 21:00 12/08/2013, these are mutually exclusive in CSS,
			// at least in the old browsers I'm using. 
		
	

	this.width_of_text="75%";
		// 75% by default
		
	this.alignment_of_text = "left";
		// left|center|right|justify
	
	this.when_restoring_main_color_log_to_trail_go_to_trails_ = "end";
		// beginning|end
		
	this.Colorlog_Popup_Window_Width = 175;
	this.Colorlog_Popup_Window_Height = 600;
	
	this.Colorlog_Popup_Window_Left_Padding = 124;
	this.Colorlog_Popup_Window_Top_Padding = 1;
		// in pixels
	
	
	this.Custom_Font_Set = ["Palatino Linotype", "URW Chancery L", "Sans", "Droid Serif"];
	
	this.Custom_Font_Sizes = ["7pt", "14pt", "23pt", "42pt"];
	
	
	
	
	// ------------------- Some things you don't need to change:
	
	
	new App.Font_Set_Object ("Custom Font List", this.Custom_Font_Set);
	
	new App.Fontsize_Set_Object ("Custom Font Sizes", this.Custom_Font_Sizes);
	
	
	if ( this.should_show_prev_and_next_links_in_control_panel || this.should_make_up_and_down_keys_go_to_prev_and_next_samples )
	{
		this.in_clever_prevnext_mode=true;
	}
	
	
	if (this.should_show_instructions_at_top && this.should_allow_various_keyboard_shortcuts )
	{	if (this.should_require_ctrl_for_various_keyboard_shortcuts)
		{	
			this.offset_when_going_to_prev_font_sample=240;	//in pixels
		}
		else
		{	// If no Ctrl is needed, less space is taken up in the instructions at the
			// top, so less of an offset is needed.
			this.offset_when_going_to_prev_font_sample=210;
		}
	}
	else
	{
		this.offset_when_going_to_prev_font_sample=45;
	}
			
	
	// ------------------- End of some things you don't need to change.
	
	
	
	
	// More stuff you can configure.
	
	
	this.should_detect_computer_platform=true;
		//true|false		// Makes it possible to automatically pick an appropriate 
						// predefined font set for the user's computer platform.
						//
						// Set to false if you want your "this.Font_Set_to_Use"
						// setting used instead.

		
	this.Font_Set_to_Use = App.Font_Set["Windows & Puppy Fonts"];
	
	//this.Font_Set_to_Use = App.Font_Set["Windows XP Fonts"];
	//this.Font_Set_to_Use = App.Font_Set["Lucid Puppy 5.2.8 Fonts"];
	//this.Font_Set_to_Use = App.Font_Set["Mac Fonts"];
	//this.Font_Set_to_Use = App.Font_Set["Android Fonts"];
	
	//this.Font_Set_to_Use = App.Font_Set["Custom Font List"];
	
	
	this.Font_Sizes_Set_to_Use = App.Fontsize_Set["Freeplane Font Sizes"];
	//this.Font_Sizes_Set_to_Use = App.Fontsize_Set["VUE Font Sizes"];
	//this.Font_Sizes_Set_to_Use = App.Fontsize_Set["Custom Font Sizes"];
		
	
	
	
	// ------------------- Stuff you can delete or comment out if you don't want to have this script detect 
	// your computer platform:
	
	if (this.should_detect_computer_platform)
	{
		this.user_computer_platform=App.Detect_User_Computer_Platform();
		
		switch (this.user_computer_platform)
		{
			case "Linux":	
				//this.Font_Set_to_Use = App.Font_Set["Lucid Puppy 5.2.8 Fonts"];
				this.Font_Set_to_Use = App.Font_Set["Lighthouse 64 Puppy Linux 6.02 Beta 2 Fonts"];
				break;
				
			case "Windows":	
				this.Font_Set_to_Use = App.Font_Set["Windows XP Fonts"];
				break;
				
			case "Mac":
			case "iPad":
			case "iPhone":
			case "iPod":
				this.Font_Set_to_Use = App.Font_Set["Mac Fonts"];
				break;
			
			case "Android":
				this.Font_Set_to_Use = App.Font_Set["Android Fonts"];
				break;
			
			case "Something Else":
				break;
		}
	}
	
	// ------------------- End of stuff you can delete or comment out if you don't want to have this script detect 
	// your computer platform.
	
	
	
	
	this.should_use_random_color_when_first_loading_page=true;	
		// true|false
	
	
	this.Default_Text_Color="#a54ff8";
		// Used if text color isn't randomized.  Default: #a54ff8
	
	
	this.List_of_Colors_to_Put_in_Color_History=[];	
	//this.List_of_Colors_to_Put_in_Color_History=["#aaabbb", "cccddd"];

	
	
	
	// ******** No need to change these:
	
	this.Current_Text_Color=this.Default_Text_Color;
	
	if (this.should_reverse_order_of_font_sizes)
	{	this.Font_Sizes_Set_to_Use.List_of_Font_Sizes.reverse();
	}
	
	this.Arrin_in_Trail_thru_Color_History=(this.List_of_Colors_to_Put_in_Color_History.length)-1;
				// arrin = ARRay INdex
	
	// ******** End of config stuff there's no need to change.
	
	
	
	
}


// **************************** End of Config object constructor.


new App.Fontsize_Set_Object( "Freeplane Font Sizes", ["8pt", "10pt", "12pt", "14pt", "16pt", "18pt", "20pt", "22pt", "24pt", "28pt"] );

new App.Fontsize_Set_Object( "VUE Font Sizes", ["8pt", "9pt", "10pt", "12pt", "14pt", "16pt", "18pt", "21pt", "24pt", "28pt", "32pt", "36pt", "42pt", "48pt", "54pt", "60pt", "72pt", "90pt"] );

	
new App.Font_Set_Object( "Windows XP Fonts", ["Arial", "Comic Sans MS", "Courier New", "Franklin Gothic Medium", "Georgia", "Palatino Linotype", "Tahoma", "Times New Roman", "Trebuchet MS", "Verdana" ] );

new App.Font_Set_Object( "Lighthouse 64 Puppy Linux 6.02 Beta 2 Fonts", ["Bitstream Vera Sans", "Bitstream Vera Sans Mono", "Bitstream Vera Serif", "Cardo", "Code2000", "Cursor", "Fixed", "Gentium", "Helvetica", "Liberation Sans", "LucidaGrande", "Luxi Sans", "Monospace", "Sans", "Serif", "Standard Symbols L" ] );

new App.Font_Set_Object( "Lucid Puppy 5.2.8 Fonts", ["DejaVu Sans", "Liberation Mono", "Liberation Sans", "Liberation Serif", "Monospace", "Nimbus Mono L", "Nimbus Roman No9 L", "Nimbus Sans L", "Sans", "URW Chancery L" ] );


App.Windows_and_Puppy_Fonts = App.Font_Set["Windows XP Fonts"].List_of_Fonts;

App.Windows_and_Puppy_Fonts=App.Windows_and_Puppy_Fonts.concat( Astroblahhh_Font_Sampler.Font_Set["Lucid Puppy 5.2.8 Fonts"].List_of_Fonts);

new App.Font_Set_Object( "Windows & Puppy Fonts", App.Windows_and_Puppy_Fonts );


new App.Font_Set_Object( "Mac Fonts", [ "American Typewriter", "Andale Mono", "Arial", "Arial Black", "Arial Narrow", "Arial Rounded MT Bold", "Arial Unicode MS", "Baskerville", "Big Caslon", "Brush Script MT", "Chalkboard", "Chalkduster", "Cochin", "Comic Sans MS", "Copperplate", "Courier", "Courier New", "Didot", "Futura", "Geneva", "Georgia", "Gill Sans", "Helvetica", "Helvetica Neue", "Herculanum", "Hoefler Text", "Impact", "Lucida Grande", "Marker Felt", "Menlo", "Microsoft Sans Serif", "Monaco", "Noteworthy", "Optima", "Palatino", "Papyrus", "Skia", "STIXGeneral", "Tahoma", "Times", "Times New Roman", "Trebuchet MS", "Verdana", "Zapfino", "Apple Chancery", "Apple Symbols" ] );

new App.Font_Set_Object( "Android Fonts", ["Droid Sans", "Droid Serif", "Droid Sans Mono" ] );


// *************************** Nothing below this point needs to be changed.
	
	
function Astroblahhh_Font_Sample_Generator_Object(Args)
{	
	var App=this;
	
	var Alias=this;
	
	
	this.app_name="Astroblahhh Font Sample Generator";
	this.app_version="Official";
	
	
	/* Things declared with var have local scope and are unavailable outside.  So, things outside of Astroblahhh_Font_Sample_Generator_Object can't access "App" or "Alias".  
	
	(However, I declared a global variable "App" outside this object, toward the top of the script, so I could use it as a convenient abbreviation.  I declared a local "App" variable so JavaScript wouldn't have to trawl through the global scope every time I mention "App" to figure out what I mean.)
	
	Things declared with "this.[whatever]" are available to their parent scope.  So, things outside of Astroblahhh_Font_Sample_Generator_Object can directly access app_name and app_version. */

	
	
	var Detect_User_Browser = function()
	{
		var Config=App.Config;
		
		// The Config object doesn't get created until the app's Run function is run.
		// But, the many functions that are created before the Config object is
		// created can safely mention the Config object anyway.
		
		
		var myNav = navigator.userAgent.toLowerCase();
		
		if ( myNav.indexOf('firefox') != -1)
		{	Config.user_browser="Firefox";
		}
		if ( myNav.indexOf('chrom') != -1)
		{	Config.user_browser="Chrome";
		}
		// No need to detect other browsers.  Just have to deal with a couple quirks I
		// noticed in those two.
	}
	
	
	
	this.Detect_User_Computer_Platform = function()
	{
		var Platform=window.navigator.platform;
		
		Platform=Platform.toLowerCase();
		
		if ( Platform.indexOf('win') != -1)
		{	return "Windows";
		}
		else if ( Platform.indexOf('linux') != -1)
		{	return "Linux";
		}
		else if ( Platform.indexOf('mac') != -1)
		{	return "Mac";
		}
		else if ( Platform.indexOf('iphone') != -1)
		{	return "iPhone";
		}
		else if ( Platform.indexOf('ipad') != -1)
		{	return "iPad";
		}
		else if ( Platform.indexOf('ipod') != -1)
		{	return "iPod";
		}
		else if ( Platform.indexOf('droid') != -1)
		{	return "Android";
		}
		else
		{	return "Something Else";
		}
	}
	
	
	
	
	// ******** Start of Granary Province.
	//
	// A granary is a storehouse for grain.  I use the term to refer to places
	// where you can find wheat as opposed to useless chaff.
	//
	// Each "Province" (which is just an imaginary concept not even fleshed
	// out formally by code) contains an Overlord object which contains 
	// functions and other data related to each province's area of concern.
	//
	// Some of those functions and data are made available outside of the
	// province, while some are purely local.
	
	
	
	var Granary_Overlord=new function()	
	{
		// Rather than being a normal function, this is an object constructor,
		// and the Granary_Overlord is an object.  
		//
		// Notice it says "new function()" instead of just "function()".  The 
		// Granary_Overlord object is created immediately by that statement, 
		// rather than this constructor having to be called later to actually 
		// create the Granary_Overlord.
		//
		// Within this object constructor, "this" refers to the Granary_Overlord 
		// rather than the App object.  The App object must now be accessed 
		// via "App" instead of "this".
		
	
		// Private, local to Granary scope - items declared with var.

		var Granary_of_Elements_Gotten_By_Id=[];	// An array.
			
		
		
		var Granarize_Element=function(name)
		{
			Granary_of_Elements_Gotten_By_Id[name]=document.getElementById(name);
			return Granary_of_Elements_Gotten_By_Id[name];
		}
		
		
		
		//Public, available outside of Granary scope - items declared with "this."
		
		this.Granary_Element=function(name)
		{					
			return Granary_of_Elements_Gotten_By_Id[name];
		}
		
		
		
		this.Build_Granary_Store_of_Elements_Gotten_By_Id=function()
		{			
			Granarize_Element("Font_Set_Dropdown");
			Granarize_Element("Font_Set_Textbox");
			Granarize_Element("Text_Width_Textbox");
			
			Granarize_Element("Line_Height_Textbox");
			Granarize_Element("Letter_Spacing_Textbox");
			Granarize_Element("Word_Spacing_Textbox");
			
			
			Granarize_Element("Fontsize_Set_Dropdown");
			Granarize_Element("Fontsize_Set_Textbox");
			Granarize_Element("Displayer");
			
			Granarize_Element("Bold_Style_Controller");
			Granarize_Element("Italic_Style_Controller");
			Granarize_Element("Border_Box_Toggler");
			Granarize_Element("Underline_Style_Controller");
			Granarize_Element("Overline_Style_Controller");
			Granarize_Element("Strikethru_Style_Controller");
			Granarize_Element("Font_Color_Box");
			Granarize_Element("New_Color_Button");
			Granarize_Element("Textarea_for_Sample_Text");
			Granarize_Element("Container_of_Message");
			Granarize_Element("Container_of_Floating_Font_Set_Panel");
			Granarize_Element("Font_Set_Dropdown");
			Granarize_Element("Fontsize_Set_Dropdown");
		}
		
		
		
		this.Granarize_Font_Anchs_and_Collect_Y_Positions = function(List_of_Font_Anchs)
		{
			if ( typeof(List_of_Font_Anchs) == 'undefined')
			{	return false;
			
			}
			var Config=App.Config;
			
			var font_anch_arrin;
			
			var num_of_font_anchs=List_of_Font_Anchs.length;
			
			var font_anch;
			
			var Y_Positions_and_Font_Anchs=[];
			
			var ypos;
			
			Y_Positions_and_Font_Anchs.push ( { y_pos: 0, anch_name: "top"} );
			
			for (font_anch_arrin=0; font_anch_arrin<num_of_font_anchs; font_anch_arrin++)
			{	
				font_anch=List_of_Font_Anchs[font_anch_arrin];
				
				font_anch_element=Granarize_Element(font_anch);
				
				ypos=App.Nav_Overlord.Get_Absolute_Y_Pos(font_anch_element);
			
				Y_Positions_and_Font_Anchs.push( { y_pos: ypos, anch_name: font_anch} );
			}
			
			return Y_Positions_and_Font_Anchs;
		}
		
		
		
	}
	
	// Below - a function alias, declared at App-level scope, outside of official Granary.
	//
	// For some reason, using the App var or Alias var in an Overlord scope 
	// to make aliases doesn't work with normal functions.  Works with 
	// object constructor functions, though.
	
	var Granary_Element=Granary_Overlord.Granary_Element;
	
	
	// ******** End of Granary Province
	
	
	
	
	// ******** Start of Run function.
	//
	//	Called when the page loads, via the HTML body tag's onLoad property.
	
	
	this.Run = function ()
	{
	
		Granary_Overlord.Build_Granary_Store_of_Elements_Gotten_By_Id();
		
		App.Config=new App.Config_Object();
			// Could have just said "this.Config" and "this" would have referred
			// to App scope, because Run is a normal function rather than an
			// object constructor.  But, it's clearer to say App, I think.
			
		var Config = App.Config;
			/* Declared for brevity.  Because the Config object isn't embedded directly in this App object, it is alas necessary to declare this abbreviation repeatedly, wherever Config settings are needed or edited.
			
			If you put the same line somewhere in App-level scope, it ends up referring to "undefined" because Config hasn't been created yet, at that point in the code.

			When the App first gets created, it doesn't even have the App.Config_Object() constructor attached to it yet.  That gets added several lines below the App's creation, via the stuff beginning with:
			
			Astroblahhh_Font_Sample_Generator_Object.prototype.Config_Object=function ()
			
			I think it's probably more useful to have the Config object be separate, to make it easier to swap between totally different Configs, if desired.  Also, it might be more readable for the user.  And it's possible to move the Config settings to their own separate file, away from almost all the source code that should be left alone. 
			
			To move the Config into a separate file, save the entire Config_Object()  constructor function to a separate file (like "config.js", and remove it from this file.  Then, in this file, below the Astroblahhh_Font_Sample_Generator_Object constructor function, put something like this: 
			
			</ script>
			<script src="config.js"></ script>

			<script>
			
			(But take the spaces out of the closing script tags.  I had to put spaces in above because any closing script tag, even one inside a comment or quoted string, confuses the web browser.)
			
			*/

		
		Detect_User_Browser();
		
		App.Fontset_Overlord.Fill_Fontset_Dropdown();
		App.Fontsize_Overlord.Fill_Fontsize_Set_Dropdown();
			
			// Most of the time, when referring to overlords, I put "App.[Overlord name]", because
			// otherwise, it would often be necessary to fuss with the order that things were
			// declared in.
			//
			// The Granary_Overlord can be referred to without App before it only because
			// the Granary_Overlord was defined before everyplace else where it's referred 
			// to.
			
		
		if (Config.should_accept_getvar_input_from_url)
		{
			App.Getvar_Overlord.Configure_App_Using_Url_Getvars();
		}
			/* This font sampler app is fancy enough that if your Config settings permit it, you can actually configure this app's settings by editing the getvars in the URL to this app, instead of having to edit the app's source code.
			
			See the Getvar_Overlord code, or this app's Help window, to see what getvars are available.
			
			
			In case you don't know what getvars are:
			
			GET and POST are common methods by which data can be sent to a web server. 
			
			GET data can also be used locally without involving a web server at all, since JavaScript (the language this font sampler script was written in) can read the URL of your currently-loaded page. 
			
			The URL is where GET variables (or getvars, as I call them for short) are found.
			
			Getvars are included in URLs after a ? question mark.  The first getvar is preceded by ?, and all getvars after that are preceded by &.  
			
			Example (using a fictitious URL that doesn't actually go anywhere):
			
				http://astroblahhh.com/blog.php?page_number=5&background_color=green
			
			In the URL above, the getvars are page_number and background_color.
			
			
			All getvars follow the same basic pattern - the getvar name, then an equal sign, then the getvar's value.
			
			Many characters need to be URL-encoded to be included in a URL. That's why sometimes you see mysterious sequences of characters beginning with percent signs in a URL. For example, %20 is used in place of spaces in URLs. */

		
		if (!Config.should_show_controls_for_lined_styles)
		{	
			App.Control_Panel_Overlord.Hide_Lined_Style_Controls();
		}
		if (!Config.should_show_prev_and_next_links_in_control_panel)
		{
			App.Control_Panel_Overlord.Hide_Prev_and_Next_Links();
		}
		
		App.Textposition_Overlord.Realign_Text_to_(Config.alignment_of_text);
		App.Textposition_Overlord.Set_Textwidth_Textbox_to_Config_Width();
		
		App.Textposition_Overlord.Set_Lineheight_Textbox_to_Config_Lineheight();
		App.Textposition_Overlord.Set_Wordspacing_Textbox_to_Config_Wordspacing();
		App.Textposition_Overlord.Set_Letterspacing_Textbox_to_Config_Letterspacing();
		
		
		App.Box_Overlord.Set_Text_Border_CSS_to_(Config.should_show_box_around_text);
		
		
		if (Config.List_of_Colors_to_Put_in_Color_History.length>0) 
		{
			App.Color_History_Overlord.Replace_Main_History_and_Trail_with_Config_Color_List()
			if ( !Config.should_use_random_color_when_first_loading_page)
			{	App.Color_Overlord.Set_Current_Text_Color_to_(Config.Default_Text_Color);
			}
		}
		
		if ( !Config.should_use_random_color_when_first_loading_page)
		{	App.Color_History_Overlord.Log_Current_Text_Color();
		}
		
		this.Fontset_Overlord.Change_to_Selected_Font_Set();
		this.Fontsize_Overlord.Change_to_Selected_Fontsize_Set();

		
		// If the text is already set bold, italic, boxed, etc.,
		// the style controller buttons must be adjusted to show that.
		
		if (Config.should_bold_text)
		{
			element = Granary_Element('Bold_Style_Controller');
			element.className="bold_style_on";
		}

		if ( Config.should_italicize_text!="no")
		{
			element = Granary_Element('Italic_Style_Controller');
			element.className="italic_style_on";
		}
		
		if (Config.should_show_box_around_text)
		{	
			element = Granary_Element('Border_Box_Toggler')
			element.className="border_box_on";
		}
		
		if (Config.should_use_lined_style_with_text=="underline")
		{	
			element = Granary_Element('Underline_Style_Controller')
			element.className="underline_style_on";
		}

		if (Config.should_use_lined_style_with_text=="overline")
		{	
			element = Granary_Element('Overline_Style_Controller')
			element.className="overline_style_on";
		}
		
		if (Config.should_use_lined_style_with_text=="strikethru")
		{	
			element = Granary_Element('Strikethru_Style_Controller')
			element.className="strikethru_style_on";
		}

		this.Show_Samples();
		
		var Container_for_Instructions = document.getElementById("Container_of_Instructions");
		
		App.Help_Overlord.Set_Help_Text();
		
		if ( ( Config.should_make_up_and_down_keys_go_to_prev_and_next_samples || Config.should_make_left_and_right_keys_go_to_prev_and_next_colors || Config.should_allow_various_keyboard_shortcuts ) && Config.should_show_instructions_at_top )
		{	
			Container_for_Instructions.innerHTML=App.Help_Overlord.Main_Help_Text;
			
		}
		else
		{	Container_for_Instructions.style.display="none";
		}
		
		if ( Config.in_clever_prevnext_mode )
		{
			window.onresize=App.Nav_Overlord.Reset_Array_of_Font_Anch_Positions;
		}
		
		if (Config.should_make_up_and_down_keys_go_to_prev_and_next_samples || Config.should_make_left_and_right_keys_go_to_prev_and_next_colors || Config.should_allow_various_keyboard_shortcuts )
		{
			document.onkeydown = App.Nav_Overlord.Handle_Keypress ;
		}
	}

	
	// ******** End of Run function.
	
	
	
	
	// ******** Start of Fontset Province

	
	this.Fontset_Overlord=new function()
	{
		var Font_Set={};	// an object, to be used as an associative array. 
							// Doesn't hold just one font set; actually holds a list of sets.
							
		Alias.Font_Set=Font_Set;
			// Makes it so Font_Set can be referred to publicly under App.Font_Set
			// instead of App.Fontset_Overlord.Fontset
		
		
		var Numbered_List_of_Font_Sets=[];  // a normal array.
		
		
		
		this.Font_Set_Object=function (display_name, array_of_fonts)
		{	// Constructor for a Font Set Object.
			this.Display_Name=display_name;
			
			this.List_of_Fonts=array_of_fonts;
			
			Font_Set[display_name]=this;
			
			Numbered_List_of_Font_Sets.push(this);
		}
		
		Alias.Font_Set_Object=this.Font_Set_Object;
		

		
		this.Font_Set_Exists=function (fontset_name)
		{
			if ( Font_Set[fontset_name] )
			{	return true;
			}
			
			return false;
		}
		
		
		
		this.Font_Anch_Name=function (raw_font_name)
		{	
			var result=raw_font_name.replace(/ |\'|\"|<|;/gm, '-');

			result = encodeURIComponent(result);
			
			return result;
		}
		
		var Font_Anch_Name=this.Font_Anch_Name;
		
		
		
		var Spaces_to_Nbsp=function (string)
		{	
			var result=string.replace(/ /gm, '&nbsp;');
			return result;
		}

		
		
		this.Fill_Fontset_Dropdown = function()
		{
			var Config = App.Config;
			
			var dropdown = Granary_Element("Font_Set_Dropdown");
			
			var Font_Set_arrin=0;
			
			var List_of_Font_Sets = Numbered_List_of_Font_Sets;
			
			var num_of_Font_Sets = List_of_Font_Sets.length;
			
			var option;


			for(Font_Set_arrin=0; Font_Set_arrin < num_of_Font_Sets; Font_Set_arrin++) 
			{
				option = document.createElement('option');
				option.text = List_of_Font_Sets[Font_Set_arrin].Display_Name;
				
				option.value = Font_Set_arrin;
				
				if ( Config.Font_Set_to_Use == List_of_Font_Sets[Font_Set_arrin] )
				{	
					option.selected='selected';
				}
			
				if ( Config.user_browser=="Firefox" )
				{	
					dropdown.add(option, null);
				}
				else
				{	dropdown.add(option, num_of_Font_Sets);
				}
			}
		}

		
		
		var Create_Floating_Font_Set_Panel = function()
		{	
			var Config = Astroblahhh_Font_Sampler.Config;
			
			var Container_for_Floating_Font_Set_Panel=Granary_Element("Container_of_Floating_Font_Set_Panel");

			// 10:42:11 12/14/2013. I use 'Container_for' in the JavaScript, and 'Container_of' in the HTML forms.

			
			var num_of_fonts=Config.Font_Set_to_Use.List_of_Fonts.length;
			
			var font_arrin;
			
			var Output="";
			
			for ( font_arrin=0; font_arrin<num_of_fonts; font_arrin++)
			{	
				// arrin means ARRay INdex
				
				current_font = Config.Font_Set_to_Use.List_of_Fonts[font_arrin];
				font_anch_name = Font_Anch_Name(current_font);
				
				nbsped_font_name=Spaces_to_Nbsp(current_font);
				
				Output += "<br><a href='#" + font_anch_name + "' class='int_anch'>" + nbsped_font_name + "</a>";
			}
			Container_for_Floating_Font_Set_Panel.innerHTML=Output;
		}
		
		
		
		var Set_Fontset_Textbox_to_Current_Fontset_List = function()
		{	var Config = App.Config;
			
			var Font_Set_Textbox = Granary_Element("Font_Set_Textbox");
			
			Font_Set_Textbox.value = Config.Font_Set_to_Use.List_of_Fonts;
		}
		
		
		
		this.Change_to_Selected_Font_Set=function()
		{
			var Config = App.Config;
			
			var dropdown = Granary_Element( "Font_Set_Dropdown" );
			
			var List_of_Font_Sets = Numbered_List_of_Font_Sets;
			
			var arrin_of_selected_Font_Set = dropdown.selectedIndex;
			
			Config.Font_Set_to_Use = List_of_Font_Sets[arrin_of_selected_Font_Set];
			
			Create_Floating_Font_Set_Panel();
			
			Set_Fontset_Textbox_to_Current_Fontset_List();
			
		}
		
		
		
		this.Change_to_Selected_Font_Set_and_Redisplay_Samples=function()
		{	this.Change_to_Selected_Font_Set();
		
			App.Show_Samples('without changing color');	
			
			var Dropdown=Granary_Element("Font_Set_Dropdown");
			
			Dropdown.focus();
		}
		
		
		
		this.Make_and_Use_Custom_Font_Set_Object_Based_on_=function (raw_font_string)
		{	
			raw_font_string=App.Security_Overlord.Convert_Less_Thans_to_Lts(raw_font_string);
			
			var Font_Set_Array=raw_font_string.split(",");
			
				// In JavaScript. using .map on an array is basically like doing a PHP array_walk.
				
			Font_Set_Array=Font_Set_Array.map( function(string)
				{ 
					result = string.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); 
						//Gets rid of whitespace at left and right sides, not middle.
					return result;
				}
			);
			
			
			delete Font_Set_Array["Custom Font List"];
				// Only deletes the reference to the object, not the object itself.
			Numbered_List_of_Font_Sets.pop();
				// The last set ought to be the old Custom Font List set, which we're discarding.
				
			
			new App.Font_Set_Object( "Custom Font List", Font_Set_Array );	
			
			App.Control_Panel_Overlord.Select_Last_Option_in_Dropdown_("Font_Set_Dropdown");
			
		}
		
		
		
		this.Try_New_Font_Set_Upon_Enter_Key_Press=function(Event, Font_Set_Box)
		{
			var code = (Event.keyCode ? Event.keyCode : Event.which);
			
			if (code == 13) 
			{
				var provided_string = Font_Set_Box.value;
				
				this.Make_and_Use_Custom_Font_Set_Object_Based_on_(provided_string);
				
				App.Show_Samples("don't update color");
				
			}
		}
		
		
	}
	

	// ******** End of Fontset Province
	
	
	
	
	// ******** Start of Fontsize Set Province

	
	this.Fontsize_Overlord=new function()
	{
	
		var Fontsize_Set={}; 	// An object, to be used as an associative array.  
								// Another list of sets.
		
		Alias.Fontsize_Set=Fontsize_Set;
			// Makes it so Font_Set can be referred to publicly under App.Font_Set
			// instead of App.Fontsize_Overlord.Fontsize_Set
			
		
		var Numbered_List_of_Fontsize_Sets=[];  // an array.
		
		
		
		this.Fontsize_Set_Exists=function (fontsize_set_name)
		{
			if ( Fontsize_Set[fontsize_set_name] )
			{	return true;
			}
			
			return false;
		}
		
		
		
		this.Fontsize_Set_Object = function Fontsize_Set_Object (display_name, array_of_font_sizes)
		{	// Constructor for a Fontsize Set object:
		
			this.Display_Name=display_name;
			
			this.List_of_Font_Sizes=array_of_font_sizes;
			
			Fontsize_Set[display_name]=this;
			Numbered_List_of_Fontsize_Sets.push(this);
		}
		
		Alias.Fontsize_Set_Object=this.Fontsize_Set_Object;
		
		
		
		var Set_Fontsize_Textbox_to_Current_Fontsize_List = function()
		{	var Config = App.Config;
		
			var Fontsize_Set_Textbox = Granary_Element("Fontsize_Set_Textbox");
		
			Fontsize_Set_Textbox.value = Config.Font_Sizes_Set_to_Use.List_of_Font_Sizes;
		}
		
		
		
		this.Fill_Fontsize_Set_Dropdown = function ()
		{
			var Config = App.Config;
			
			var dropdown = Granary_Element("Fontsize_Set_Dropdown");
			
			var Fontsize_Set_arrin=0;
			
			var List_of_Fontsize_Sets = Numbered_List_of_Fontsize_Sets;
			
			var num_of_Fontsize_Sets = List_of_Fontsize_Sets.length;
			
			var option;
			
			for(Fontsize_Set_arrin=0; Fontsize_Set_arrin < num_of_Fontsize_Sets; Fontsize_Set_arrin++) 
			{
				option = document.createElement('option');
				option.text = List_of_Fontsize_Sets[Fontsize_Set_arrin].Display_Name;
				
				option.value = Fontsize_Set_arrin;
				
				if ( Config.Font_Sizes_Set_to_Use == List_of_Fontsize_Sets[Fontsize_Set_arrin] )
				{	
					option.selected=true;
				}
				
				if (Config.user_browser=="Firefox")
				{
					dropdown.add(option, null);
				}
				else
				{	dropdown.add(option, num_of_Fontsize_Sets);
				}
			}
		}
		
		
		
		this.Change_to_Selected_Fontsize_Set = function ()
		{	
			var Config = App.Config;
			
			dropdown = Granary_Element("Fontsize_Set_Dropdown");
			
			var List_of_Fontsize_Sets = Numbered_List_of_Fontsize_Sets;
			
			arrin_of_selected_Fontsize_Set = dropdown.selectedIndex;
			
			if (Config.should_reverse_order_of_font_sizes)
			{	
				Config.Font_Sizes_Set_to_Use.List_of_Font_Sizes.reverse();
			}
			
			Config.Font_Sizes_Set_to_Use = List_of_Fontsize_Sets[arrin_of_selected_Fontsize_Set];
			
			
			if (Config.should_reverse_order_of_font_sizes)
			{	
				Config.Font_Sizes_Set_to_Use.List_of_Font_Sizes.reverse();
			}
			
			Set_Fontsize_Textbox_to_Current_Fontsize_List();
			
		}
		
		
		
		this.Change_to_Selected_Fontsize_Set_and_Redisplay_Samples=function()
		{	this.Change_to_Selected_Fontsize_Set();
		
			App.Show_Samples('without changing color');	
			
			var Dropdown=Granary_Element("Fontsize_Set_Dropdown");
			
			Dropdown.focus();
			
		}


		
		var There_are_Chars_that_are_not_Numbers_or_Spaces_or_Commas_in_=function (string)
		{	
			var chars_that_are_not_numbers_or_commas=/[^0-9, ]/gi;
			
			var result = chars_that_are_not_numbers_or_commas.test(string);

			return result;
			
		}
	
	
	
		this.Make_and_Use_Custom_Font_Sizes_Object_Based_on_=function (raw_font_sizes_string)
		{

			raw_font_sizes_string = App.Security_Overlord.Remove_Misc_Chars(raw_font_sizes_string);
			
			raw_font_sizes_string = raw_font_sizes_string.replace(/\s+/g, ',');
			
			var Fontsize_Set_Array=raw_font_sizes_string.split(",");

			
			delete Fontsize_Set["Custom Font Sizes"];
				// Only deletes the reference to the object, not the object itself.
			Numbered_List_of_Fontsize_Sets.pop();
				// The last set ought to be the old Custom Font Sizes set, which we're discarding.
			
			new App.Fontsize_Set_Object( "Custom Font Sizes", Fontsize_Set_Array );			
				
			var Config = App.Config;
			
			Config.should_reverse_order_of_font_sizes=false;
			
			App.Control_Panel_Overlord.Select_Last_Option_in_Dropdown_("Fontsize_Set_Dropdown");
		}

		
		
		this.Try_New_Fontsize_Set_Upon_Enter_Key_Press=function (Event, Fontsize_Set_Box)
		{
			var code = (Event.keyCode ? Event.keyCode : Event.which);
			
			if (code == 13) 
			{
				var provided_string = Fontsize_Set_Box.value;
				
				this.Make_and_Use_Custom_Font_Sizes_Object_Based_on_(provided_string);
				
				App.Message_Overlord.Remove_Message();
				
				App.Show_Samples("don't update color");
			}
		}
	
	
	
		this.Reverse_Font_Sizes_Set=function ()
		{	var Config = Astroblahhh_Font_Sampler.Config;

			Config.should_reverse_order_of_font_sizes=!Config.should_reverse_order_of_font_sizes;
			
			Config.Font_Sizes_Set_to_Use.List_of_Font_Sizes.reverse();
			
			Set_Fontsize_Textbox_to_Current_Fontsize_List();
		}
		
		
		
	}

	
	// ******** End of Fontsize Set Province
		
		
	
	
	// ******** Start of Control Panel Province
	
	this.Control_Panel_Overlord=new function()
	{
	
		
		this.Hilite_if_Allowed=function (element)
		{
			var Config=App.Config;
			
			element_id = element.getAttribute("id");
			if ( element_id=="Font_Color_Box")
			{
				if (Config.should_hilite_font_color_textbox_upon_click)
				{
					element.select();
					return true;
				}
			}
			else if ( element_id == "Text_Width_Textbox")
			{	
				if (Config.should_hilite_width_textbox_upon_click)
				{
					element.select();
					return true;
				}	
			}
			else if ( element_id == "Line_Height_Textbox" )
			{
				if (Config.should_hilite_lineheight_textbox_upon_click)
				{
					element.select();
					return true;
				}					
			}
			else if ( element_id == "Word_Spacing_Textbox" )
			{
				if (Config.should_hilite_wordspacing_textbox_upon_click)
				{
					element.select();
					return true;
				}					
			}
			else if ( element_id == "Letter_Spacing_Textbox" )
			{
				if (Config.should_hilite_letterspacing_textbox_upon_click)
				{
					element.select();
					return true;
				}					
			}			
		}
		
		
		
		this.Select_Option_in_Dropdown_ = function (dropdown_name, option_text)
		{
			var dropdown = Granary_Element(dropdown_name);
			
			num_of_dropdown_options = dropdown.options.length;
			
			if (num_of_dropdown_options<1)
			{	return false;
			}

			var dropdown_arrin;
			
			for (dropdown_arrin=0; dropdown_arrin < num_of_dropdown_options; dropdown_arrin++ )
			{
			
				if ( dropdown.options[dropdown_arrin].text==option_text)
				{
					dropdown.options[dropdown_arrin].selected=true;
					
					if (dropdown_name=="Font_Set_Dropdown")
					{	App.Fontset_Overlord.Change_to_Selected_Font_Set();	
					}
					else
					{	App.Fontsize_Overlord.Change_to_Selected_Fontsize_Set();	
					}
					return true;
				}
			}
			return false;
		}
		
		
		
		this.Select_Last_Option_in_Dropdown_ = function(dropdown_name)
		{
			var dropdown = Granary_Element(dropdown_name);
			
			var num_of_dropdown_options = dropdown.options.length;
			
			if (num_of_dropdown_options<1)
			{	return false;
			}
			
			dropdown.options[num_of_dropdown_options-1].selected=true;
			
			if (dropdown_name=="Font_Set_Dropdown")
			{	App.Fontset_Overlord.Change_to_Selected_Font_Set();	
			}
			else
			{	App.Fontsize_Overlord.Change_to_Selected_Fontsize_Set();	
			}
		}
		
		
		
		this.Hide_Prev_and_Next_Links = function()
		{
			var Container_for_Prev_and_Next_Links = document.getElementById("Container_of_Prev_and_Next_Links");
			
			Container_for_Prev_and_Next_Links.style.display="none";
		}
		
		
		
		this.Hide_Lined_Style_Controls = function()
		{
			var Container_for_Lined_Style_Controllers = document.getElementById("Container_of_Lined_Style_Controllers");
			
			Container_for_Lined_Style_Controllers.style.display="none";
		}
		
		

		this.Toggle_Lined_Style_Button = function (style)
		{
			var Config = Astroblahhh_Font_Sampler.Config;
			
			var overline_element = Granary_Element("Overline_Style_Controller");
			var underline_element = Granary_Element("Underline_Style_Controller");
			var strikethru_element = Granary_Element("Strikethru_Style_Controller");
			
			if (Config.should_use_lined_style_with_text=="none")
			{	overline_element.className="overline_style_off";
				underline_element.className="underline_style_off";
				strikethru_element.className="strikethru_style_off";
			}
			else
			{
				switch (style)
				{
					case "overline":
						overline_element.className="overline_style_on";
						underline_element.className="underline_style_off";
						strikethru_element.className="strikethru_style_off";
						break;
					case "underline":
						overline_element.className="overline_style_off";
						underline_element.className="underline_style_on";
						strikethru_element.className="strikethru_style_off";
						break;
					case "strikethru":
						overline_element.className="overline_style_off";
						underline_element.className="underline_style_off";
						strikethru_element.className="strikethru_style_on";
						break;			
				}
			}
		}
	


		this.Set_Font_Color_Box_Value = function()
		{
			var Config = App.Config;
			
			var Font_Color_Box=Granary_Element("Font_Color_Box");
			
			Font_Color_Box.value=Config.Current_Text_Color;		
		}



		this.Focus_on_New_Color_Button=function()
		{
			var button=Granary_Element("New_Color_Button");
			button.focus();
		}
		
		
		
	}
	

	// ******** End of Control Panel Province

	
	
	
	// ******** Start of Color History Province
	
	
	this.Color_History_Overlord=new function()
	{
		var Color_History_Main_Log = []; // An array.
			
		var Trail_thru_Color_History=[]; // An array.
			
		// The trail contains arrins of colors in the main color log, in the
		// order the user saw those colors.
		//
		// Necessary in case the user jumps around in the color history
		// by clicking logged colors.  The trail array stores a sequence 
		// of arrins of seen colors, to make it possible to have the 
		// back and forth arrows behave as expected.
		//
		// The back and forth arrows don't move you back or forth along
		// the sequence of the main log, but instead go along the 
		// trail the user has followed.
		//
		// Unlike the user trail, the main log is totally chronological, 
		// and doesn't re-log restored colors.
		//
		// And, just like the typical web browser - if you go back along 
		// your trail, then don't go forward to the end again before 
		// visiting someplace new, your previous forward trail will be
		// overwritten with the new path you're now following.

		
		var Popup_Window_for_Log=undefined;
		
		
		
		this.Color_History_Go_=function(destination) // back or forth
		{
			var Trail = Trail_thru_Color_History;
			var length_of_trail = Trail.length;
			
			if ( length_of_trail<2 )
			{	// Trail is too short to go anywhere in
				return false;
			}

			
			var Config = App.Config;
			
			var trail_arrin = Config.Arrin_in_Trail_thru_Color_History;
			
			var color;
			var changed_arrin;
			
			
			if (destination=="back")
			{	
				adjusted_trail_arrin = trail_arrin-1;
				
				if (adjusted_trail_arrin<0)
				{	
					return false;
				}
			}
			else if (destination=="forth")
			{
				var next_color_arrin = trail_arrin+1;
					
				if (next_color_arrin >= length_of_trail)
				{	
					return false;
				}
				else
				{	adjusted_trail_arrin=next_color_arrin;
				}
			
			}
			main_log_arrin=Trail[adjusted_trail_arrin];
			
			color=Color_History_Main_Log[main_log_arrin];
			
			App.Color_Overlord.Set_Current_Text_Color_to_(color); //By default, doesn't log.
			
			
			Config.Arrin_in_Trail_thru_Color_History=adjusted_trail_arrin;
			
			App.Textstyle_Overlord.Adjust_Text_related_CSS();
			App.Control_Panel_Overlord.Set_Font_Color_Box_Value();
			App.Control_Panel_Overlord.Focus_on_New_Color_Button();
			
			return true;
		}

		
		
		var Log_to_Trail_Thru_Color_History = function(arrin_in_main_color_log)
		{				
			var Config = App.Config;
			
			Config.Arrin_in_Trail_thru_Color_History++;
			
			var trail_arrin = Config.Arrin_in_Trail_thru_Color_History;
			
			var Trail = Trail_thru_Color_History;
			
			Trail[trail_arrin]=arrin_in_main_color_log;
			
			var trail_arrin_plus_one=trail_arrin+1;
			
			if (trail_arrin_plus_one < Trail.length)
			{	
				Trail_thru_Color_History=Trail.slice(0, trail_arrin_plus_one);
			}
		}


		
		this.Log_Current_Text_Color = function()
		{
			var Config = App.Config;
			
			Color_History_Main_Log.push(Config.Current_Text_Color);
			
			arrin_for_trail = Color_History_Main_Log.length-1;
			
			Output_1_Color_to_Color_Log_Window(Config.Current_Text_Color, arrin_for_trail);
			
			Log_to_Trail_Thru_Color_History( arrin_for_trail );
		}

		
		
		this.Replace_Trail_History_with_Main_History = function()
		{
			var Config = App.Config;
						
			var num_of_colors_in_main_history = Color_History_Main_Log.length;
			var trail_arrin;
			
			Trail_thru_Color_History=[];
			
			for (var main_log_arrin = 0; main_log_arrin < num_of_colors_in_main_history ; main_log_arrin++) 
			{	Trail_thru_Color_History.push(main_log_arrin);
			}
			
			if (Config.when_restoring_main_color_log_to_trail_go_to_trails_=="beginning")
			{	trail_arrin=0;
			}
			else
			{	trail_arrin = Trail_thru_Color_History.length-1;
			}
			
			Config.Arrin_in_Trail_thru_Color_History = trail_arrin;
			
			App.Color_Overlord.Set_Current_Text_Color_to_( Color_History_Main_Log[ trail_arrin ] ); // by default, doesn't log
			
			App.Control_Panel_Overlord.Set_Font_Color_Box_Value();
			
			App.Textstyle_Overlord.Adjust_Text_related_CSS();		
		}
		
		
		
		this.Replace_Main_History_and_Trail_with_Config_Color_List = function()
		{
			var Config = App.Config;
			Color_History_Main_Log=Config.List_of_Colors_to_Put_in_Color_History;
						
			this.Replace_Trail_History_with_Main_History();
			
			Config.Arrin_in_Trail_thru_Color_History=Color_History_Main_Log.length-1;
		}



		this.Restore_Text_Color_from_Log = function(color, main_log_arrin)
		{	
			var Config = Astroblahhh_Font_Sampler.Config;
			
			Config.Arrin_in_Trail_thru_Color_History++;
			
			trail_arrin = Config.Arrin_in_Trail_thru_Color_History;
			
			Trail = Trail_thru_Color_History;
			
			Trail[trail_arrin]=main_log_arrin;
			
			trail_arrin_plus_one=trail_arrin+1;
			
			if (trail_arrin_plus_one < Trail.length)
			{	
				Trail_thru_Color_History=Trail.slice(0, trail_arrin_plus_one);
			}
			
			App.Color_Overlord.Set_Current_Text_Color_to_(color); // by default, doesn't log

			App.Textstyle_Overlord.Adjust_Text_related_CSS();
			App.Control_Panel_Overlord.Set_Font_Color_Box_Value();
			App.Control_Panel_Overlord.Focus_on_New_Color_Button();
		}

		

		
	// **** Start of Color History Popup Subprovince
	
		
		
		var Open_Color_Log_Popup=function()
		{	var Config = App.Config;
		
			Popup_Window_for_Log=window.open("","Popup_Window_for_Log","scrollbars=yes,width=" + Config.Colorlog_Popup_Window_Width + ",height=" + Config.Colorlog_Popup_Window_Height + ",resizable=yes,menubar=yes,left=" + 
			Config.Colorlog_Popup_Window_Left_Padding + "px,top=" + Config.Colorlog_Popup_Window_Top_Padding + "px");
		}

		
		
		var HTML_Line_for_Color_Log = function (color, color_arrin)
		{
			var string_to_output = "<li><span onClick='window.opener.Astroblahhh_Font_Sampler.Color_History_Overlord.Restore_Text_Color_from_Log(\"" + color + "\", \"" + color_arrin + "\");'><font color='" + color + "'>" + color + "</font></span><br><br>";
			
			return string_to_output;
		}
		
		
		
		var Print_Color_Log = function ()
		{	
			var color_arrin;
			var log_length;
			var color;
			
			var Output;
			
			log_length=Color_History_Main_Log.length;
			
			Output = "<html><head><script type='text/javascript'>document.onkeydown = Popup_Keypress_Handler; ";
			
			Output += "function Popup_Keypress_Handler(Event) { window.opener.Astroblahhh_Font_Sampler.Nav_Overlord.Handle_Keypress(Event, 'dont require ctrl'); if (Event.keyCode==37 || Event.keyCode==38 || Event.keyCode==39 || Event.keyCode==40) { return true;} else { return false; } } ";
			
			
			Output += "<\/script></head><body bgcolor='black' text='#CCC33A'><big><big><center>";
			
			var instructions = "You can click a color to restore it.  <span  onClick='window.opener.Astroblahhh_Font_Sampler.Color_History_Overlord.Replace_Trail_History_with_Main_History()'><b>Click here</b></span> to restore the main history to your back/forward buttons.";
			
			Output += instructions;
			
			Output += "<br><br><ol>";
			
			Popup_Window_for_Log.document.write( Output);
			
			for (color_arrin=0; color_arrin<log_length; color_arrin++)
			{	
				color=Color_History_Main_Log[color_arrin];
				
				string_to_output = HTML_Line_for_Color_Log(color, color_arrin);
				
				Popup_Window_for_Log.document.write(string_to_output);
			}
			Popup_Window_for_Log.document.write("</ol><br><br>");
			
			Popup_Window_for_Log.document.write(instructions);
			
			Popup_Window_for_Log.document.write("<br><br><ol>");
				
			Popup_Window_for_Log.scrollTo(0, Popup_Window_for_Log.document.body.scrollHeight);
			
			Popup_Window_for_Log.focus();
		}
		
		
		
		this.Popup_Color_Log=function()
		{	
			if ( typeof(Popup_Window_for_Log) == 'undefined' || Popup_Window_for_Log == null || Popup_Window_for_Log.closed)
			{	Open_Color_Log_Popup();
				Print_Color_Log();
			}
			else
			{	Popup_Window_for_Log.focus();
			}			
		}
		
		
		
		var Output_1_Color_to_Color_Log_Window = function(color, color_arrin)
		{
			if ( typeof(Popup_Window_for_Log) == 'undefined' || Popup_Window_for_Log.closed)
			{	return false;
			}
			else
			{
				string_to_output = HTML_Line_for_Color_Log(color, color_arrin);
			
				Popup_Window_for_Log.document.write(string_to_output);
			}
		}
		
		
		
	}
	
	
	
	// **** End of Color History Popup Subprovince
	
	
	// ******** End of Color History Province
	
	
	
	
	// ******** Start of Nav (Navigation) Province
	
	this.Nav_Overlord = new function()
	{
	
		var Y_Positions_and_Font_Anchs = [];
			// An numeric array containing anonymous objects with
			// two properties - a font anch name, and a y pos.
		
		var num_of_font_anchs;
		
		var Created_Font_Anchs;
		
		var Current_Pos=0;
		
		
		
		this.Reset_Array_of_Font_Anch_Positions = function()
		{	
			Y_Positions_and_Font_Anchs=Granary_Overlord.Granarize_Font_Anchs_and_Collect_Y_Positions(Created_Font_Anchs);
			
		}
		
		
		
		this.Set_Arrays_of_Positions_and_Font_Anchs = function( Created_Anchs_Array )
		{
			Y_Positions_and_Font_Anchs=Granary_Overlord.Granarize_Font_Anchs_and_Collect_Y_Positions(Created_Anchs_Array)
			
			num_of_font_anchs=Y_Positions_and_Font_Anchs.length;

			Created_Font_Anchs=Created_Anchs_Array;
			
		}
		
		
		
		this.Get_Current_Pos = function()
		{
			return Current_Pos;
		}
		
		
		
		this.Set_Current_Pos = function()
		{
			Current_Pos = window.pageYOffset;
			return Current_Pos;
		}
		
		
		
		// Start of stuff from http://techedemic.com/2012/01/13/finding-absolute-position-of-html-element-using-javascript/

		// Apollia's note: modified slightly to return only the Y value.

		this.Get_Absolute_Y_Pos = function( oElement )
		{
			var yReturnValue = 0;
			var xReturnValue = 0;
			while( oElement != null ) 
			{
				yReturnValue += oElement.offsetTop;
				xReturnValue += oElement.offsetLeft;
				oElement = oElement.offsetParent;
			}
			//At this point you can 'return' the values as well
			return yReturnValue;
		}

		// End of stuff from http://techedemic.com/2012/01/13/finding-absolute-position-of-html-element-using-javascript/


		
		this.Go_to_Prev_Font_Sample = function()
		{	
			var Config=App.Config;
			
			var font_anch_arrin;
			var anch_pos=0;
			
			var found_font_anch_name;
			var prev_font_anch_name;
			
			this.Set_Current_Pos();
			
			Current_Pos = Current_Pos-(Config.offset_when_going_to_prev_font_sample);
			
			for (font_anch_arrin=num_of_font_anchs-1; font_anch_arrin>=0; font_anch_arrin--)
			{
				anch_pos=Y_Positions_and_Font_Anchs[font_anch_arrin].y_pos;
				
				
				if ( anch_pos <= Current_Pos )
				{	
					found_font_anch_name=Y_Positions_and_Font_Anchs[font_anch_arrin].anch_name;
					
					if (font_anch_arrin == 0 )
					{
						if (Config.user_browser=="Chrome")
						{
							window.location.hash="top";
						}
						window.location.hash=found_font_anch_name;
						
						return false;
					}
					
					prev_font_anch_name = Y_Positions_and_Font_Anchs[font_anch_arrin-1].anch_name;
					
					if (anch_pos == Current_Pos)
					{	
						if (Config.user_browser=="Chrome")
						{
							window.location.hash=found_font_anch_name;
						}
						window.location.hash=prev_font_anch_name;
						return false;
					}
					else
					{
						if (Config.user_browser=="Chrome")
						{
							window.location.hash=prev_font_anch_name;
						}
						
						window.location.hash=found_font_anch_name;
						return false;
					}	
				}
			}
			window.location.hash="top";
			return false;
		}
		
		
		
		this.Go_to_Next_Font_Sample = function()
		{
			var font_anch_arrin;
			var anch_pos=0;
			var font_anch_name="";
			var prev_font_anch_name="";
			
			this.Set_Current_Pos();
			
			Current_Pos=Current_Pos+20;
			
			for (font_anch_arrin=0; font_anch_arrin<num_of_font_anchs; font_anch_arrin++)
			{
				anch_pos=Y_Positions_and_Font_Anchs[font_anch_arrin].y_pos;
				
				if (anch_pos>Current_Pos)
				{	
					font_anch_name=Y_Positions_and_Font_Anchs[font_anch_arrin].anch_name;
						
					if (font_anch_arrin>1)
					{	
						if (font_anch_arrin==num_of_font_anchs-1)
						{	window.location.hash="bottom";
							return false;
						}
					
						prev_font_anch_name=Y_Positions_and_Font_Anchs[font_anch_arrin-1].anch_name;
					}
					
					else
					{	
						prev_font_anch_name="top";
					}
					window.location.hash=prev_font_anch_name;
					window.location.hash=font_anch_name;
					
					return false;
				}				
			}
		}
		
		
		
		this.Handle_Keypress = function(Event, dont_require_ctrl )
		{
			var result;
			var Config = App.Config;
			
			
			if ( !Config.should_require_ctrl_for_various_keyboard_shortcuts )
			{	dont_require_ctrl=true;
			}
			
			
			
			if (dont_require_ctrl )
			{
				var focused_element=document.activeElement;
				
				lowercase_tag_name = focused_element.tagName.toLowerCase();
				
				if ( lowercase_tag_name == "input" ||  lowercase_tag_name == "textarea")
				
				//if (id=="Textarea_for_Sample_Text" || id=="Font_Color_Box" || id=="Text_Width_Textbox" || id == "Font_Set_Dropdown" || id == "Fontsize_Set_Dropdown" || id == "Font_Set_Textbox" || id == "Fontsize_Set_Textbox" )
				{	
					if (lowercase_tag_name == "input" )
					{	var id=focused_element.getAttribute("id");
						if (id == "New_Color_Button")
						{
						}
						else
						{	if ( !Event.ctrlKey )
							{
								return true;
							}
						}
					}
					else
					{
						if ( !Event.ctrlKey )
						{	
							return true;
						}
					}
				}				
			}
			
			

			if (Event.keyCode == 66) // b
			{
				if (Config.should_allow_various_keyboard_shortcuts)
				{	
					if ( !Event.ctrlKey && !dont_require_ctrl)
					{	return true;
					}

					App.Textstyle_Overlord.Toggle_and_Display_New_Text_Style("bold", Granary_Element("Bold_Style_Controller") );
					return false;
				}
				return true;
			}
			
			
			else if (Event.keyCode == 73 ) // i
			{
				if (Config.should_allow_various_keyboard_shortcuts)
				{	
					if ( !Event.ctrlKey && !dont_require_ctrl)
					{	return true;
					}

					App.Textstyle_Overlord.Toggle_and_Display_New_Text_Style("italic", Granary_Element("Italic_Style_Controller") );
					return false;
				}
				return true;
			}
			
			
			else if (Event.keyCode == 88) // x
			{
				if (Config.should_allow_various_keyboard_shortcuts)
				{	
					if ( !Event.ctrlKey && !dont_require_ctrl)
					{	return true;
					}

					App.Box_Overlord.Toggle_Border_Box( Granary_Element("Border_Box_Toggler") );
					return false;
				}
				return true;
			}
			
			
			else if (Event.keyCode == 85) // u
			{
				if (Config.should_allow_various_keyboard_shortcuts)
				{	
					if ( !Event.ctrlKey && !dont_require_ctrl)
					{	return true;
					}

					App.Textstyle_Overlord.Toggle_and_Display_New_Text_Style("underline", Granary_Element("Underline_Style_Controller") );
					return false;
				}
				return true;
			}
			
			
			else if (Event.keyCode == 75) // k
			{
				if (Config.should_allow_various_keyboard_shortcuts)
				{	
					if ( !Event.ctrlKey && !dont_require_ctrl)
					{	return true;
					}
					
					App.Textstyle_Overlord.Toggle_and_Display_New_Text_Style("strikethru", Granary_Element("Strikethru_Style_Controller") );
					return false;
				}
				return true;
			}
			
			
			else if (Event.keyCode == 72) // h
			{
				if (Config.should_allow_various_keyboard_shortcuts)
				{	
					if ( !Event.ctrlKey && !dont_require_ctrl)
					{	return true;
					}
					
					App.Sampletext_Overlord.Display_Default_('sentence');
					return false;
				}
				return true;
			}
			
			
			else if (Event.keyCode == 71) // g
			{
				if (Config.should_allow_various_keyboard_shortcuts)
				{	
					if ( !Event.ctrlKey && !dont_require_ctrl)
					{	return true;
					}

					App.Sampletext_Overlord.Display_Default_('paragraph');
					return false;
				}
				return true;
			}
			
			
			else if (Event.keyCode == 76) // L
			{
				if (Config.should_allow_various_keyboard_shortcuts)
				{	
					if ( !Event.ctrlKey && !dont_require_ctrl)
					{	return true;
					}

					App.Color_History_Overlord.Popup_Color_Log()
					return false;
				}
				return true;
			}
			
			
			else if (Event.keyCode == 70) // f
			{
				if (Config.should_allow_various_keyboard_shortcuts)
				{	
					if ( !Event.ctrlKey && !dont_require_ctrl)
					{	return true;
					}

					App.Color_Overlord.Set_and_Display_New_Random_Text_Color();
					return false;
				}
				return true;
			}
			
			
			else if (Event.keyCode == 220) //  backslash, \
			{
				if (Config.should_allow_various_keyboard_shortcuts)
				{	
					if ( !Event.ctrlKey && !dont_require_ctrl)
					{	return true;
					}

					App.Fontsize_Overlord.Reverse_Font_Sizes_Set(); 
					App.Show_Samples('should not update color');
					return false;
				}
				return true;
			}
			
			
			else if (Event.keyCode == 37) // left arrow 
			{
				if (Config.should_make_arrow_keys_combined_with_alt_change_text_alignment)
				{	if (Event.altKey)
					{	App.Textposition_Overlord.Realign_Text_to_('left');
						return false;
					}
				}
				
				if ( ! Config.should_make_left_and_right_keys_go_to_prev_and_next_colors)
				{	return true;
				}
				
				
				if (Config.should_require_ctrl_key_when_pressing_left_and_right_keys)
				{
					if ( !Event.ctrlKey )
					{	return true;
					}
				}
				App.Color_History_Overlord.Color_History_Go_("back");
				
				return false;
			}
			
			
			else if (Event.keyCode == 39) // right arrow 
			{
				if (Config.should_make_arrow_keys_combined_with_alt_change_text_alignment)
				{	if (Event.altKey)
					{	App.Textposition_Overlord.Realign_Text_to_('right');
						return false;
					}
				}
				
				if ( ! Config.should_make_left_and_right_keys_go_to_prev_and_next_colors)
				{	return true;
				}
				
				if (Config.should_require_ctrl_key_when_pressing_left_and_right_keys)
				{
					if ( !Event.ctrlKey)
					{	return true;
					}
				}
				App.Color_History_Overlord.Color_History_Go_("forth");
				
				return false;
			}
			
			
			else if (Event.keyCode == 38) // up arrow 
			{
				if (Config.should_make_arrow_keys_combined_with_alt_change_text_alignment)
				{	if (Event.altKey)
					{	App.Textposition_Overlord.Realign_Text_to_('justify');
						return false;
					}
				}
				
				if (!Config.should_make_up_and_down_keys_go_to_prev_and_next_samples)
				{	return true;
				}
				
				if (Config.should_require_ctrl_key_when_pressing_up_and_down_keys)
				{
					if ( !Event.ctrlKey)
					{	return true;
					}
				}
				App.Nav_Overlord.Go_to_Prev_Font_Sample();
	
				return false;
			}
			
			
			else if ( Event.keyCode == 40 ) // down arrow
			{			
				if (Config.should_make_arrow_keys_combined_with_alt_change_text_alignment)
				{	if (Event.altKey)
					{	App.Textposition_Overlord.Realign_Text_to_('center');
						return false;
					}
				}
				if (!Config.should_make_up_and_down_keys_go_to_prev_and_next_samples)
				{	return true;
				}
				if (Config.should_require_ctrl_key_when_pressing_up_and_down_keys)
				{	
					if ( !Event.ctrlKey)
					{	return true;
					}
				}
				
				result = App.Nav_Overlord.Go_to_Next_Font_Sample();
				
				return result;
			}
			
		}
		
		
		
	}
	
	
	// ******** End of Nav (Navigation) Province
	
	
	
	
	// ******** Start of Textposition Province
	
	this.Textposition_Overlord = new function()
	{


		this.Set_Config_Word_Spacing_to_ = function (wordspacing)
		{
			var Config = App.Config;
			
			Config.word_spacing=wordspacing;
			
			return wordspacing;
		}
		
		
		
		this.Set_Config_Letter_Spacing_to_ = function (letterspacing)
		{
			var Config = App.Config;
			
			Config.letter_spacing=letterspacing;
			
			return letterspacing;
		}
		
		
		
		this.Set_Config_Line_Height_to_ = function (lineheight)
		{
			var Config = App.Config;
			
			Config.line_height=lineheight;
			
			return lineheight;
		}
		
		
		
		this.Set_Config_Text_Width_to_ = function (width)
		{
			var Config = App.Config;
			
			Config.width_of_text=width;
			
			return width;
		}
		
		
		
		this.Set_Wordspacing_Textbox_to_Config_Wordspacing = function()
		{
			var Config = App.Config;
			
			var Wordspacing_Textbox = Granary_Element("Word_Spacing_Textbox");
			
			Wordspacing_Textbox.value = Config.word_spacing;
		}
		
		
		
		this.Set_Letterspacing_Textbox_to_Config_Letterspacing = function()
		{
			var Config = App.Config;
			
			var Letterspacing_Textbox = Granary_Element("Letter_Spacing_Textbox");
			
			Letterspacing_Textbox.value = Config.letter_spacing;
		}
		
		
		
		this.Set_Lineheight_Textbox_to_Config_Lineheight = function()
		{
			var Config = App.Config;
			
			var Lineheight_Textbox = Granary_Element("Line_Height_Textbox");
			
			Lineheight_Textbox.value = Config.line_height;
		}
		
		
		
		this.Set_Textwidth_Textbox_to_Config_Width = function()
		{	var Config = App.Config;
			
			var Textwidth_Textbox = Granary_Element("Text_Width_Textbox");
			
			Textwidth_Textbox.value = Config.width_of_text;
		}
		
		
		
		this.Realign_Text_to_= function (direction)
		{
			var Config = App.Config;
			
			var width = Config.width_of_text;
			
			var style="width: " + width + "; text-align: " + direction + ";";
			
			App.Global_CSS_Overlord.modifyStyleRule(".realignable", style);	
		}
		
		
		
		var Rewidth_Text_to_ = function (width)
		{
			var Config = App.Config;
			
			var alignment = Config.alignment_of_text;
			
			var style="width: " + width + "; text-align: " + alignment + ";";
			
			App.Global_CSS_Overlord.modifyStyleRule(".realignable", style);	
		}

		
		
		this.Try_New_Letter_Spacing_Upon_Enter_Key_Press = function (Event, Letterspacing_Box)
		{
			var code = (Event.keyCode ? Event.keyCode : Event.which);
			if (code == 13) 
			{	
				var possible_letterspacing = Letterspacing_Box.value;

				possible_letterspacing=App.Security_Overlord.Remove_Misc_Chars(possible_letterspacing);

				var letterspacing=possible_letterspacing;
				
				this.Set_Config_Letter_Spacing_to_(letterspacing);
				
				App.Textstyle_Overlord.Adjust_Text_related_CSS();

			}
		}
		
		
		
		this.Try_New_Word_Spacing_Upon_Enter_Key_Press = function (Event, Wordspacing_Box)
		{
			var code = (Event.keyCode ? Event.keyCode : Event.which);
			if (code == 13) 
			{	
				var possible_wordspacing = Wordspacing_Box.value;

				possible_wordspacing=App.Security_Overlord.Remove_Misc_Chars(possible_wordspacing);

				var wordspacing=possible_wordspacing;
				
				this.Set_Config_Word_Spacing_to_(wordspacing);
				
				App.Textstyle_Overlord.Adjust_Text_related_CSS();

			}
		}
		
		
		
		this.Try_New_Line_Height_Upon_Enter_Key_Press = function (Event, Lineheight_Box)
		{
			var code = (Event.keyCode ? Event.keyCode : Event.which);
			if (code == 13) 
			{	
				var possible_lineheight = Lineheight_Box.value;

				possible_lineheight=App.Security_Overlord.Remove_Misc_Chars(possible_lineheight);

				var lineheight=possible_lineheight;
				
				this.Set_Config_Line_Height_to_(lineheight);
				
				App.Textstyle_Overlord.Adjust_Text_related_CSS();

			}
		}
		
		
		
		this.Try_New_Text_Width_Upon_Enter_Key_Press = function (Event, Textwidth_Box)
		{	
			var code = (Event.keyCode ? Event.keyCode : Event.which);
			if (code == 13) 
			{
				var possible_width = Textwidth_Box.value;

				possible_width=App.Security_Overlord.Remove_Misc_Chars(possible_width);

				var width=possible_width;
				
				this.Set_Config_Text_Width_to_(width);
				
				Rewidth_Text_to_(width);

			}
		}

		
		
	}
	
	
	// ******** End of Textposition Province
	
	
	
	
	// ******** Start of Sampletext Province
	
	this.Sampletext_Overlord=new function()
	{
		
		
		this.Set_Sample_Text_in_Config_to_Default_ = function (sentence_or_paragraph)
		{
			var Config = App.Config;
			
			if ( sentence_or_paragraph == "sentence")
			{	Config.Sample_Text_to_Display=Config.Sample_Sentence;
			}
			else
			{	Config.Sample_Text_to_Display=Config.Sample_Paragraph;
				
			}
		}
		
		
		
		this.Display_Default_ = function (sentence_or_paragraph)
		{
			var Config = App.Config;
			
			if ( sentence_or_paragraph == "sentence")
			{
				if (Config.Sample_Text_to_Display == Config.Sample_Sentence)
				{	return false;
				}
			}
			else
			{	if (Config.Sample_Text_to_Display == Config.Sample_Paragraph)
				{	return false;
				}
			}
			
			this.Set_Sample_Text_in_Config_to_Default_(sentence_or_paragraph);

			App.Show_Samples("should not update color");
		}
		
		
		
		var Get_Sample_Text_from_Textarea = function ()
		{
			var Textarea_for_Sample_Text=Granary_Element("Textarea_for_Sample_Text");
			
			var raw_textarea_text = Textarea_for_Sample_Text.value;
			
			if (!raw_textarea_text.length) // if empty
			{	raw_textarea_text = "The quick brown fox jumps over the lazy dog!";
			
			}
			
			var result = App.Security_Overlord.Convert_Less_Thans_to_Lts(raw_textarea_text);
				// Can't have the user possibly executing arbitrary JavaScript.

			return result;
		}

		
		
		this.Set_Sample_Text_in_Config_and_Textarea_to_ = function(text)
		{	
			var Config = App.Config;
		
			Textarea_for_Sample_Text=Granary_Element("Textarea_for_Sample_Text");
			
			if (!text.length) // empty
			{	text = "The quick brown fox jumped over the lazy dog!";
			}
			
			text = App.Security_Overlord.Convert_Less_Thans_to_Lts(text);
			
			Textarea_for_Sample_Text.value=text;
			
			Config.Sample_Text_to_Display=text;
		}
		
		
		
		this.Update_Sample_Text = function()
		{	var Config = App.Config;
		
			var Sampletext_from_Textarea=Get_Sample_Text_from_Textarea();
			
			if ( Config.Sample_Text_to_Display != Sampletext_from_Textarea )
			{
				Config.Sample_Text_to_Display = Sampletext_from_Textarea;

				App.Show_Samples("should not update color");
			}
		}
		
		
		
	}
	
	
	// ******** End of Sampletext Province
	
	
	
	
	// ******** Start of Help Province
	
	this.Help_Overlord = new function()
	{
	
		this.Main_Help_Text="";
		this.Getvar_Help_Text="";
		
		
		
		var Set_Getvar_Help_Text=function()
		{
			var Config = App.Config;
			
			var Output="<center>";
			
			if (Config.should_accept_getvar_input_from_url)
			{	Output = "This script is currently accepting input from getvars, so, the below will be useful to you.";
			}
			else
			{
				Output = "<b>Note:</b> This script is currently not accepting input from getvars, so the below isn't useable by you.  To make this script accept getvar input, you must edit this script's source code and set <code>Config.should_accept_getvar_input_from_url</code> to <code>true</code>.";
			}
			
			Output += "<p><br>If this script's Config settings permit it, you can actually configure this script's settings by editing the getvars in the URL to this script, instead of having to edit the script's source code. <p>For more info on getvars, <span onClick='Scroll_to_Getvar_Explanation()' class='hover_color'>click here</span>.<p><br>";
			
			Output += "<b>Getvars which can equal y or n [short for yes or no]:</b><br><br>";

			Output += "<table><tr><td><ul>";
			Output += "<li><span class='getvar'>b</span> - Bold";
			Output += "<li><span class='getvar'>i</span> - Italic";
			Output += "<li><span class='getvar'>lb</span> - Show pound signs in hex color codes.";
			Output += "<li><span class='getvar'>rc</span> - Random color when first loading page.";
			Output += "<li><span class='getvar'>rev</span> - Reverse font size list";
			Output += "<li><span class='getvar'>slc</span> - Show lined style controllers (underline, overline, strikethru).";
			Output += "<li><span class='getvar'>fsnbl</span> - Font size number at beginning of sample text line.";
			Output += "<li><span class='getvar'>fsnel</span> - Font size number at end of sample text line.";
			Output += "<li><span class='getvar'>box</span> - Border box around sample text.";
			Output += "<li><span class='getvar'>fnbl</span> - Font name at beginning of sample text line.";
			Output += "<li><span class='getvar'>fnel</span> - Font name at end of sample text line.";
			Output += "<li><span class='getvar'>fnb</span> - Font name below all samples of current font.";
			
			
			
			Output += "</ul></table>";
			
			Output += "<br><br><br>";
			
			Output += "<b>Getvars with other accepted values:</b><br><br>";
			
			Output += "<table><tr><td><ul>";
			
			Output += "<li><span class='getvar'>text</span> - <span class='getvar_values'>Any sample text you want.</span>";
			
			Output += "<li><span class='getvar'>fonts</span> - <span class='getvar_values'>Any font names you want, separated by commas.</span>";
			
			Output += "<li><span class='getvar'>sizes</span> - <span class='getvar_values'>Any font sizes you want, separated by commas.  To include a percent sign, type %25 instead of just %.</span>";
			
			Output += "<br><br>";
			
			Output += "<li><span class='getvar'>c</span> - Color to use when first loading the page. <span class='getvar_values'>Any color in hex format, without a pound sign.</span>";
			
			Output += "<br><br>";
			
			Output += "<li><span class='getvar'>sp</span> - Sentence or paragraph? <span class='getvar_values'>s, p.</span>";
			
			Output += "<li><span class='getvar'>l</span> - Use lined style with text - underline, overline, strikethru. <span class='getvar_values'>o, u, s</span>";

			Output += "<br><br>";
			
			Output += "<li><span class='getvar'>w</span> - Width for sample text. <span class='getvar_values'>Any <a href='https://developer.mozilla.org/en-US/docs/Web/CSS/width'>text understood by CSS</a> indicating width.</span>";
			
			Output += "<li><span class='getvar'>wp</span> - Width percentage for sample text. <span class='getvar_values'>Any number from 1 to 100 (without % sign).</span>";
			
			Output += "<br><br>";
			
			Output += "<li><span class='getvar'>lh</span> - Line height for sample text. <span class='getvar_values'>Any text <a href='https://developer.mozilla.org/en-US/docs/Web/CSS/line-height'>understood by CSS</a> indicating line height.</span>";
			
			Output += "<li><span class='getvar'>ws</span> - Word spacing for sample text. <span class='getvar_values'>Any text <a href='https://developer.mozilla.org/en-US/docs/Web/CSS/word-spacing'>understood by CSS</a> indicating word spacing.</span>";
			
			Output += "<li><span class='getvar'>ls</span> - Letter spacing for sample text. <span class='getvar_values'>Any text <a href='https://developer.mozilla.org/en-US/docs/Web/CSS/letter-spacing'>understood by CSS</a> indicating letter spacing.</span>";
			
			Output += "<br><br>";
			
			Output += "<li><span class='getvar'>a</span> - Alignment of text (left, center, right, justify). <span class='getvar_values'>l, c, r, j</span>";
			
			Output += "<br><br>";
			
			Output += "<li><span class='getvar'>fs</span> - <span class='getvar_values'>A font set's name (like \"Windows XP Fonts\".</span>";
			
			Output += "<li><span class='getvar'>fss</span> - <span class='getvar_values'>A font size set's name (like \"Freeplane Font Sizes\".</span>";
			
			Output += "<br><br>";
			
			Output += "<li><span class='getvar'>popw</span> - Popup color log window width. <span class='getvar_values'>Any number greater than zero.</span>";
			
			Output += "<li><span class='getvar'>poph</span> - Popup color log window height. <span class='getvar_values'>Any number greater than zero.</span>";
			
			Output += "<li><span class='getvar'>popl</span> - Popup color log window's distance from the left side of the screen. <span class='getvar_values'>Any number greater than zero.</span>";
			
			Output += "<li><span class='getvar'>popt</span> - Popup color log window's distance from the top of the screen. <span class='getvar_values'>Any number greater than zero.</span></table>";
			
			
			Output += "<p><br><span id='getvar-explanation'></span><h2>What Getvars Are</h2></center><p><blockquote>";
			
			Output += "GET and POST are common methods by which data can be sent to a web server.<p>";

			Output += "GET data can also be used locally without involving a web server at all, since JavaScript (the language this font sampler script was written in) can read the URL of your currently-loaded page.<p>";
			
			Output += "The URL is where GET variables (or getvars, as I call them for short) are found.<p>";
			
			Output += "Getvars are included in URLs after a ? question mark.  The first getvar is preceded by ?, and all getvars after that are preceded by &amp;.<p>";
			
			Output += "Example (using a fictitious URL that doesn't actually go anywhere):<p>";
			
			Output += "<blockquote><tt>http://astroblahhh.com/blog.php<b>?page_number=5&background_color=green</b></tt></blockquote><p>";
			
			Output += "In the URL above, the getvars are page_number and background_color.<p><br>";
			
			
			Output += "All getvars follow the same basic pattern - the getvar name, then an equal sign, then the getvar's value.<p>";
			
			Output += "Many characters need to be URL-encoded to be included in a URL.  That's why sometimes you see mysterious sequences of characters beginning with percent signs in a URL. For example, %20 is used in place of spaces in URLs.";
			
			
			App.Help_Overlord.Getvar_Help_Text=Output;
			
			return Output;
			
		}
		
		
		
		var Set_Main_Help_Text=function()
		{			
			var Config = App.Config;
			
			var Output;
			
			Output = "<span class='keyboard_shortcuts_header'>Keyboard Shortcuts:</span> ";
			
			Output += " &nbsp;&nbsp; ";
			
			if ( Config.should_make_up_and_down_keys_go_to_prev_and_next_samples )
			{
				
				if ( Config.should_require_ctrl_key_when_pressing_up_and_down_keys)
				{	
					Output += "<span class='keyboard_shortcut_help'>Ctrl &#x2191;</span>&nbsp;Previous Font &nbsp;&nbsp; <span class='keyboard_shortcut_help'>Ctrl &#x2193;</span>&nbsp;Next Font";
				
				}
				else
				{	Output += "<span class='keyboard_shortcut_help'>&#x2191;</span>&nbsp;Previous Font &nbsp;&nbsp; <span class='keyboard_shortcut_help'>&#x2193;</span>&nbsp;Next Font";
				}
			}
			
			if ( Config.should_make_up_and_down_keys_go_to_prev_and_next_samples && Config.should_make_left_and_right_keys_go_to_prev_and_next_colors )
			
			Output += " &nbsp;&nbsp; ";
			
			if (Config.should_make_left_and_right_keys_go_to_prev_and_next_colors)
			{	
				if (Config.should_require_ctrl_key_when_pressing_left_and_right_keys)
				{
					Output += "<span class='keyboard_shortcut_help'>Ctrl &#x2190;</span>&nbsp;Previous Color  &nbsp;&nbsp; <span class='keyboard_shortcut_help'>Ctrl &#x2192;</span>&nbsp;Next&nbsp;Color";
				}
				else
				{	Output += "<span class='keyboard_shortcut_help'>&#x2190;</span>&nbsp;Previous Color  &nbsp;&nbsp; <span class='keyboard_shortcut_help'>&#x2192;</span>&nbsp;Next&nbsp;Color";
				}
			}
			
			if (Config.should_make_arrow_keys_combined_with_alt_change_text_alignment)
			{

				Output += "<br><span class='keyboard_shortcut_help'>Alt &#x2190;</span>&nbsp;Left Align  &nbsp;&nbsp; ";
				
				Output += "<span class='keyboard_shortcut_help'>Alt &#x2191;</span>&nbsp;Justify &nbsp;&nbsp; <span class='keyboard_shortcut_help'>Alt &#x2193;</span>&nbsp;Center Align &nbsp;&nbsp;";
				
				Output += "<span class='keyboard_shortcut_help'>Alt &#x2192;</span>&nbsp;Right Align";
			}
			
			if (Config.should_allow_various_keyboard_shortcuts)
			{
				if (Config.should_make_up_and_down_keys_go_to_prev_and_next_samples || Config.should_make_left_and_right_keys_go_to_prev_and_next_colors ) 
				{	Output += "<br><br>";
				}
				
				if ( !Config.should_require_ctrl_for_various_keyboard_shortcuts)
				{
					Output += "<span class='keyboard_shortcut_help'>b</span>&nbsp;<b>Bold</b>  &nbsp;&nbsp;  <span class='keyboard_shortcut_help'>i</span>&nbsp;<i>Italic</i>  &nbsp;&nbsp;  <span class='keyboard_shortcut_help'>u</span>&nbsp;<u>Underline</u> &nbsp;&nbsp;  <span class='keyboard_shortcut_help'>k</span>&nbsp;<strike>Strike</strike> &nbsp;&nbsp;  <span class='keyboard_shortcut_help'>x</span>&nbsp;<span class='boxed'>Box</span>  &nbsp;&nbsp;  <span class='keyboard_shortcut_help'>f</span>&nbsp;Random Color  &nbsp;&nbsp;<span class='keyboard_shortcut_help'>\\</span>&nbsp;Reverse&nbsp;Font&nbsp;Sizes</span><br><span class='keyboard_shortcut_help'>L</span>&nbsp;Show Color&nbsp;Log&nbsp;Window</span> &nbsp;&nbsp; <span class='keyboard_shortcut_help'>h</span>&nbsp;Sample&nbsp;Sentence</span> &nbsp;&nbsp; <span class='keyboard_shortcut_help'>g</span>&nbsp;Sample&nbsp;Paragraph</span><br><br><span class='keyboard_shortcut_help'>Space or Return</span> - Random Color, if New Color button is selected. (It frequently is, automatically.) &nbsp;&nbsp; <span class='keyboard_shortcut_help'>Ctrl&nbsp;+&nbsp;some&nbsp;other&nbsp;command</span> - Works even while in a text input field.</span>";
				}
				else
				{
					Output += "<span class='keyboard_shortcut_help'>Ctrl+b</span>&nbsp;<b>Bold</b>  &nbsp;&nbsp;  <span class='keyboard_shortcut_help'>Ctrl+i</span>&nbsp;<i>Italic</i>  &nbsp;&nbsp;  <span class='keyboard_shortcut_help'>Ctrl+u</span>&nbsp;<u>Underline</u> &nbsp;&nbsp;  <span class='keyboard_shortcut_help'>Ctrl+k</span>&nbsp;<strike>Strike</strike> &nbsp;&nbsp;  <span class='keyboard_shortcut_help'>Ctrl+x</span>&nbsp;<span class='boxed'>Box</span>  &nbsp;&nbsp;  <span class='keyboard_shortcut_help'>Ctrl+f</span>&nbsp;Random Color  &nbsp;&nbsp;<span class='keyboard_shortcut_help'>Ctrl+\\</span>&nbsp;Reverse&nbsp;Font&nbsp;Sizes</span><br><span class='keyboard_shortcut_help'>Ctrl+L</span>&nbsp;Show Color&nbsp;Log&nbsp;Window</span> &nbsp;&nbsp; <span class='keyboard_shortcut_help'>Ctrl+h</span>&nbsp;Sample&nbsp;Sentence</span> &nbsp;&nbsp; <span class='keyboard_shortcut_help'>Ctrl+g</span>&nbsp;Sample&nbsp;Paragraph</span><br><br><span class='keyboard_shortcut_help'>Space or Return</span> - Random Color, if New Color button is selected. (It frequently is, automatically.)</span>";
				}
				// Oddly, adding to this text too much necessitates that you increase the Config.offset_when_going_to_prev_font_sample.  Otherwise, Prev (aside from the normal non-JavaScripted HTML anchor links) won't work right anymore.
			}
			
			
			App.Help_Overlord.Main_Help_Text=Output;
				// For some reason, when the Set_Main_Help_Text function is
				// declared with 'var' instead of 'this', then, 'this.Main_Help_Text', 
				// in here, doesn't refer to the Help Overlord's Main_Help_Text.
			
			return Output;
		}
		
		
		
		this.Set_Help_Text = function()
		{	
			Set_Main_Help_Text();
			Set_Getvar_Help_Text();
		}
		
		
		
			
	// **** Start of Help Popup Subprovince
		
		
		
		var Popup_Window_for_Help=undefined;
		
		
		
		var Open_Help_Window=function()
		{	var Config = App.Config;
		
			Popup_Window_for_Help=window.open("","Popup_Window_for_Help","scrollbars=yes,width=600,height=300,resizable=yes,menubar=yes,left=200px,top=1px");
		}
		
		
		
		var Print_Help = function ()
		{	
			var Config = App.Config;
			
			Output = "<html><head>";
			Output += "<style type='text/css'>body {color: #998ff9 } .keyboard_shortcut_help { color: #5e5cb4; font-weight: bold; } .keyboard_shortcuts_header { color: #4265d7; } .getvar, .getvar_values {	font-family: monospace;	font-weight: bold; } li { margin: 0 0 10px 0; } .hover_color:hover { color: gold } a { color: #4355c9; } a:hover { color: fuchsia; } .hover_color { color: #9040bd; } </style>";
			
			Output += "<script type='text/javascript'>document.onkeydown = Popup_Keypress_Handler; ";
			
			Output += "function Popup_Keypress_Handler(Event) { window.opener.Astroblahhh_Font_Sampler.Nav_Overlord.Handle_Keypress(Event, 'dont require ctrl'); if (Event.keyCode==37 || Event.keyCode==38 || Event.keyCode==39 || Event.keyCode==40) { return true;} else { return false; } } ";
			
			Output += "function Get_Absolute_Y_Pos( oElement ) { var yReturnValue = 0; var xReturnValue = 0; while( oElement != null ) { yReturnValue += oElement.offsetTop; xReturnValue += oElement.offsetLeft; oElement = oElement.offsetParent; } return yReturnValue; }";
		
			Output += "function Scroll_to_Getvar_Explanation() { ypos = Get_Absolute_Y_Pos ( document.getElementById('getvar-explanation') ); window.scrollTo( 0, ypos  ); }";
			
			
			
			Output += "<\/script></head><body bgcolor='black' text='#CCC33A'><big><big><center>";
			
			Output += App.Help_Overlord.Main_Help_Text;
			
			Output += "<br><br><br>";
			
			Output += App.Help_Overlord.Getvar_Help_Text;
			
			Popup_Window_for_Help.document.write( Output);
			
			Popup_Window_for_Help.focus();
			
		}
		
		
		
		this.Output_Help_to_Popup_Window=function()
		{	
			if ( typeof(Popup_Window_for_Help) == 'undefined' || Popup_Window_for_Help == null || Popup_Window_for_Help.closed)
			{	Open_Help_Window();
				Print_Help();
			}
			else
			{	Popup_Window_for_Help.focus();
			}			
		}

			
	// **** End of Help Popup Subprovince
	
	
	
	}
	
	
	// ******** End of Help Province
	
	
	
	
	// ******** Start of Box Province
	
	this.Box_Overlord = new function()
	{
	
	
		this.Set_Text_Border_CSS_to_ = function (bordered)
		{
			var style;
			var Config = App.Config;
			
			if (bordered) 
			{
				style="border: solid 1px; padding: 5px; border-color: " + Config.Current_Text_Color;
			}
			else
			{	style="border: none;";
			}

			//style = "background: red; -moz-border-radius: 100px / 50px; -webkit-border-radius: 100px / 50px; border-radius: 100px / 50px; border-color: green;";

			App.Global_CSS_Overlord.modifyStyleRule(".boxed_or_not", style);

		}



		this.Toggle_Border_Box = function(clicked_element)
		{	var Config = App.Config;
		
			Config.should_show_box_around_text = !Config.should_show_box_around_text;	
			
			if (Config.should_show_box_around_text)
			{
				clicked_element.className="border_box_on";
			}
			else
			{	clicked_element.className="border_box_off";
			}
			
			this.Set_Text_Border_CSS_to_(Config.should_show_box_around_text);
			
			if ( Config.in_clever_prevnext_mode )
			{
				App.Nav_Overlord.Reset_Array_of_Font_Anch_Positions();
			}
		
			App.Control_Panel_Overlord.Focus_on_New_Color_Button();
		}
		
		
		
	}

	
	// ******** End of Box Province
	
	
	
	
	// ******** Start of Message Province
	
	
	this.Message_Overlord=new function()
	{
	
	
		this.Remove_Message=function()
		{
			Container_for_Message = Granary_Element("Container_of_Message");
			
			Container_for_Message.innerHTML="";
		}

		
		
		this.Set_Notif_Message=function(message)
		{	Container_for_Message = Granary_Element("Container_of_Message");
			
			Container_for_Message.innerHTML="<span class='notif'>" + message + "</span>";

		}

		
		
		this.Set_Error_Message=function(message)
		{			
			Container_for_Message = Granary_Element("Container_of_Message");
			
			Container_for_Message.innerHTML="<span class='error'>" + message + "</span>";
		}
		
		
		
	}

	
	// ******** End of Message Province
	
	
	
	
	// ******** Start of Getvar Province
		
	this.Getvar_Overlord=new function()
	{
		
		var getUrlVars = function() 
		{
		
/* Apollia's note: Modified from stuff from http://papermashup.com/read-url-get-variables-withjavascript/ 

These comments helped:

http://papermashup.com/read-url-get-variables-withjavascript/comment-page-1/#comment-8936

http://papermashup.com/read-url-get-variables-withjavascript/comment-page-1/#comment-8552

The function in the main post didn't grab multiple getvars, and also wouldn't properly handle the last getvar if an # anchor name came after it.  I had to fiddle with it to get it all to work.

*/

			var Config=App.Config;
			var vars = {};

			var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&#]*)/gi, 
				function(m,key,value) 
				{
					if(vars[key])
					{
						if(vars[key] instanceof Array)
						{
							vars[key].push(value);
						}
						else
						{
							vars[key] = [vars[key], value];
						}
					}
					else
					{
						vars[key] = value;
					}
				}
			);
				
			var parts2 = window.location.href.replace(/#.+/gi,
				function(match)
				{
					vars['anch'] = match;
				}
			);

			return vars;
		}
		

// **** End of modified stuff from http://papermashup.com/read-url-get-variables-withjavascript/
		
		
		
		this.Configure_App_Using_Url_Getvars=function()
		{
			// A nicer version of the below info is in the Help popup window.
			//
			//
			// Accepted getvars.
			//
			// Getvars which can be y or n [short for yes or no]: 
			//
			// b - bold?
			// i - italic?
			// rev - reverse font size list?
			// fsnbl - font size num at beginning of line?
			// fsnel - font size num at end of line?
			// box - border box?
			// fnbl - show font name at beginning of line?
			// fnel - show font name at end of line?
			// fnb - font name below all samples of current font?
			// slc = show lined style (underline, overline, strikethru) controllers?
			// lb - pound signs in hex color?
			// rc - random color?
			
			
			// Getvars with other accepted values:
			//
			// l = line for text (overline, underline, strikethru) - o, u, s
			// wp - width percentage for sample text
			// w - width string for sample text
			// a - alignment of text - l, c, r, j [left, center, right, justify]
			
			// lh = line height
			// ws = word spacing
			// ls = letter spacing

			// c - color, in hex format.  If a valid color, derandomizes first color (if it was set to be random) and uses the getvar color.
			
			// fonts - comma-separated font list
			// sizes - comma-separated font size list
			
			// fs - a font set's name
			// fss - a font size set's name
			
			// text - sample text
			// sp - sentence or paragraph?  accepted values: s or p
			
			// popw - Popup color log window width
			// poph - Popup color log window height
			// popl - Popup color log window left padding
			// popt - Popup color log window top padding
			
			
			if( ( window.location.href.indexOf('?') > -1) || (window.location.href.indexOf('#') > -1) )
			{
				var Config = Astroblahhh_Font_Sampler.Config;
				
				var Getvars=getUrlVars();
				
				
				
				if (Getvars.text)	// Sample text
				{	text=decodeURIComponent(Getvars.text);
				
					App.Sampletext_Overlord.Set_Sample_Text_in_Config_and_Textarea_to_(text); // That function executes Convert_Less_Thans_to_Lts
					
				}
				
				
				
				if (Getvars.fs)	// Fontset Name
				{	
					var unencoded_fontset_name = decodeURIComponent( Getvars.fs );
					
					unencoded_fontset_name=App.Security_Overlord.Remove_Misc_Chars(unencoded_fontset_name);
					
					if (App.Fontset_Overlord.Font_Set_Exists(unencoded_fontset_name) )
					{
						App.Control_Panel_Overlord.Select_Option_in_Dropdown_( "Font_Set_Dropdown", unencoded_fontset_name);
						
					}
				}
				
				
				
				if (Getvars.sp)	// Sentence or paragraph?
				{	switch (Getvars.sp)
					{	
						case "s": 
							App.Sampletext_Overlord.Set_Sample_Text_in_Config_to_Default_("sentence");
							break;
				
						case "p":
							App.Sampletext_Overlord.Set_Sample_Text_in_Config_to_Default_("paragraph");
							break;
							
					}
				}
				
				
				
				if (Getvars.fss)	// Fontsize Set name
				{
					var unencoded_fontsize_set_name = decodeURIComponent( Getvars.fss );
					
					unencoded_fontsize_set_name=App.Security_Overlord.Remove_Misc_Chars(unencoded_fontsize_set_name);
					
					if (App.Fontsize_Overlord.Fontsize_Set_Exists(unencoded_fontsize_set_name ) )
					{
						App.Control_Panel_Overlord.Select_Option_in_Dropdown_( "Fontsize_Set_Dropdown", unencoded_fontsize_set_name);
						
					}
				}
				
				
				
				if (Getvars.lb == 'y')	// Include pound sign # in hex colors (lb is the weird abbreviation for "pound", as in weight)
				{	Config.should_include_pound_signs_in_hex_colors=true;
				}
				else if (Getvars.lb == 'n')
				{	Config.should_include_pound_signs_in_hex_colors=false;
				}
				
				
				
				if (Getvars.c)	// Color, in hex format.
				{	
					if ( App.Color_Overlord.is_a_Hex_Color( Getvars.c ) )
					{	var color=Getvars.c;
					
						color.substr(0, 7);
						color = App.Color_Overlord.Add_or_Remove_Pound_Sign_if_Necessary(color);
						
						Config.Current_Text_Color=color;
						Config.Default_Text_Color=color;
						
						Config.should_use_random_color_when_first_loading_page=false;
						
					}
				}
				
				
				
				if (Getvars.rc=='y')	// Random color
				{	Config.should_use_random_color_when_first_loading_page=true;
				}
				else if (Getvars.rc=='n')
				{	Config.should_use_random_color_when_first_loading_page=false;
				}
				
				
				
				if (Getvars.b=='y')	// Bold
				{	Config.should_bold_text=true;
				}
				else if (Getvars.b=='n')
				{	Config.should_bold_text=false;
				}
				
				
				
				if (Getvars.i=='n')	// Italic
				{	Config.should_italicize_text="no";
				}
				else if (Getvars.i=='y')
				{	
					Config.should_italicize_text="italic";
				}
				
				
				
				if (Getvars.rev=='y')	// Reverse font sizes
				{	
					if (Config.should_reverse_order_of_font_sizes )
					{	// If we reverse again, it'll undo the work of the Config itself,
						// so in this case we do nothing.
					}
					else
					{
						App.Fontsize_Overlord.Reverse_Font_Sizes_Set();
					}
				}
				else if (Getvars.rev=='n')
				{	if (Config.should_reverse_order_of_font_sizes )
					{	App.Fontsize_Overlord.Reverse_Font_Sizes_Set();	// Have to reverse the reversal already done by Config itself.
					}
				}
				
				
				
				if (Getvars.fsnbl == 'y')	// Font size num at beginning of line
				{	Config.should_print_font_size_number_at_beginning_of_line=true;
				}
				else if (Getvars.fsnbl == 'n')
				{	Config.should_print_font_size_number_at_beginning_of_line=false;
				}
				
				
				
				if (Getvars.fsnel == 'y')	// Font size num at end of line
				{	Config.should_print_font_size_number_at_end_of_line=true;
				}
				else if (Getvars.fsnel == 'n')
				{	Config.should_print_font_size_number_at_end_of_line=false;
				}
				
				
				
				if (Getvars.box=='y')	// Text border box
				{
					Config.should_show_box_around_text = true;
				}
				else if (Getvars.box=='n')
				{	Config.should_show_box_around_text = false;
				}
				
				
				
				if (Getvars.fnbl == 'y')	// Font name at beginning of line
				{	Config.should_print_font_name_at_beginning_of_line=true;
				}
				else if (Getvars.fnbl == 'n')
				{	Config.should_print_font_name_at_beginning_of_line=false;
				}
				
				
				
				if (Getvars.fnel == 'y')	// Font name at end of line
				{
					Config.should_print_font_name_at_end_of_line=true;
				}
				else if (Getvars.fnel == 'n')
				{	
					Config.should_print_font_name_at_end_of_line=false;
				}
				
				
			
				if (Getvars.fnb == 'y')	// Font name at bottom
				{	Config.should_show_font_name_at_bottom_below_all_samples_of_current_font=true;
				}
				else if (Getvars.fnb == 'n')
				{	Config.should_show_font_name_at_bottom_below_all_samples_of_current_font=false;
				}
				
				
				
				if (Getvars.l=='o')	// Use lined style (underline, etc.) with text
				{	
					Config.should_use_lined_style_with_text = "overline";
				}
				else if (Getvars.l=='u')
				{	
					Config.should_use_lined_style_with_text = "underline";
				}
				else if (Getvars.l=='s' || Getvars.l=='k')
				{	
					Config.should_use_lined_style_with_text = "strikethru";
				}
				
				
				
				if (Getvars.w)	// Width percentage
				{	
					var possible_width=Getvars.w;
					
					possible_width=App.Security_Overlord.Remove_Misc_Chars(possible_width);
					
					var width=possible_width;
				
					App.Textposition_Overlord.Set_Config_Text_Width_to_(width);
				}
				
				
				
				if (Getvars.lh)	// line height
				{	
					var possible_lineheight = Getvars.lh;
					
					possible_lineheight=App.Security_Overlord.Remove_Misc_Chars(possible_lineheight);
					
					var lineheight=possible_lineheight;
					
					App.Textposition_Overlord.Set_Config_Line_Height_to_(lineheight);
					
				}
				
				
				
				if (Getvars.ws)	// word spacing
				{	
					var possible_wordspacing = Getvars.ws;
					
					possible_wordspacing=App.Security_Overlord.Remove_Misc_Chars(possible_wordspacing);
					
					var wordspacing=possible_wordspacing;
					
					App.Textposition_Overlord.Set_Config_Word_Spacing_to_(wordspacing);
					
				}
				
				
				
				if (Getvars.ls)	// letter spacing
				{	
					var possible_letterspacing = Getvars.ls;
					
					possible_letterspacing=App.Security_Overlord.Remove_Misc_Chars(possible_letterspacing);
					
					var letterspacing=possible_letterspacing;
					
					App.Textposition_Overlord.Set_Config_Letter_Spacing_to_(letterspacing);
					
				}
				
				
				
				if (Getvars.wp < 101 && Getvars.wp>0)	// Width percentage
				{		
					Getvars.wp=Getvars.wp.substr(0,3);
					
					Config.width_of_text=Math.floor(Getvars.wp) + "%";
				}
				
				
				
				if (Getvars.a)
				{	var result;
					result="center";
					switch (Getvars.a)
					{
						case "l": 
							result="left";
							break;
						case "c":
							result="center";
							break;
						case "r":
							result="right";
							break;
						case "j":
							result = "justify";
							break;
					}
					
					Config.alignment_of_text="justify";
				}
						

						
				if (Getvars.popw>0)	// Popup color log window width
				{	Getvars.popw=Getvars.popw.substr(0,4);
					Config.Colorlog_Popup_Window_Width=Math.floor(Getvars.popw);
				}
				
				
				
				if (Getvars.poph>0)	//  Popup color log window height
				{	Getvars.poph=Getvars.poph.substr(0,4);
					Config.Colorlog_Popup_Window_Height=Math.floor(Getvars.poph);
				}
				
				
				
				if (Getvars.popl>0)	//  Popup color log left padding
				{
					Config.Colorlog_Popup_Window_Left_Padding=Math.floor(Getvars.popl);
					
				}
				
				
				
				if (Getvars.popt>0)	// Popup color log top padding
				{
					Config.Colorlog_Popup_Window_Top_Padding=Math.floor(Getvars.popl);
				}
				
				
				
				if (Getvars.slc=="y")	// Show lined style controls
				{	Config.should_show_controls_for_lined_styles=true;
				}
				else if (Getvars.slc=="n")
				{	Config.should_show_controls_for_lined_styles=false;
				}
				
				
				
				if (Getvars.sizes)	// Your own comma-separated list of font sizes
				{	
					
					App.Fontsize_Overlord.Make_and_Use_Custom_Font_Sizes_Object_Based_on_(decodeURIComponent(Getvars.sizes) );
				}
				
				
				
				if (Getvars.fonts)	// Your own comma-separated list of fonts
				{	
					
					App.Fontset_Overlord.Make_and_Use_Custom_Font_Set_Object_Based_on_( decodeURIComponent(Getvars.fonts) );
				}
				
			}
			
			
		}
		
		
		
	}
		
	// ******** End of Getvar Province

	
	

	// ******** Start of Security Province
	
	
	this.Security_Overlord=new function()
	{
	
	
	
		this.Convert_Less_Thans_to_Lts = function (string)
		{	
			var string = string.replace(/</gm, '&lt;');
			return string;
		}
		
		
		
		this.Remove_Misc_Chars = function (string)
		{	// ' " < > ; { } \ ( ) 
			var string=string.replace(/|\'|\"|<|>|;|\{|\}|\\|\(|\)/gm, '');
			return string;
		}
		
		
		
	}


	// ******** End of Security Province
	
	
	
	
	// ******** Start of Global CSS Province
	
	this.Global_CSS_Overlord=new function()
	{
	
	
	
		// From http://stackoverflow.com/questions/7657363/changing-global-css-styles-from-javascript

		// 19:03 12/07/2013.  Apollia's note: I had to modify the below to make it
		// work right in my browsers.
	
		
		
		/* Remove rule from supplied sheet
		*/
		var removeRule = function (sheet, rule) 
		{
			// 16:12 12/08/2013.  Apollia's note: apparently "rule" needs to be 
			// an integer, not a rule object.  The integer I use is an arrin 
			// (array index) integer that was used to point at a rule object 
			// from the array created by "rules = sheet.cssRules;".
			// 
			// If given the wrong kind of argument, this function removes 
			// styling from everything instead of just the one thing that is 
			// supposed to be removed.  At least in my browsers.
			
			
		  // W3C model
		  if (typeof sheet.deleteRule == 'function') 
		  
		  {
			sheet.deleteRule(rule);

		  // IE model
		  } else if (sheet.removeRule) {
			sheet.removeRule(rule);
		  }
		}

		
		
		/* Add rule from supplied sheet
		** Rule is added as last rule in sheet
		*/
		var addRule=function (sheet, selectorText, value) 
		{

		  // W3C model
		  if (typeof sheet.insertRule == 'function') {
			sheet.insertRule(selectorText + ' {' + value + '}', sheet.cssRules.length);

		  // IE model
		  } else if (sheet.addRule) {
			sheet.addRule(selectorText, value, sheet.rules.length);
		  }
		}
		
		
		
		/* Replace the cssText for rule matching selectorText with value
		** Changes all matching rules in all style sheets
		*/
		this.modifyStyleRule = function (selectorText, value) 
		{
		  var sheets = document.styleSheets;
		  var sheet, rules, rule;
		  var i, j, k, l;

		  for (i=0, iLen=sheets.length; i<iLen; i++) {
			sheet = sheets[i];

			// W3C model
			if (sheet.cssRules) {
			  rules = sheet.cssRules;

			  for (j=0, jLen=rules.length; j<jLen; j++) {
				rule = rules[j];
				//window.alert(rule.selectorText + " ---- " + selectorText );
				
				if (rule.selectorText == selectorText) 
				{
					// 03:55 12/07/2013. Apollia's note: I had to change this since
					// the original code - removeRule(sheet, rule) - was glitchy
					// in my browsers.
				  removeRule(sheet, j);
				  addRule(sheet, selectorText, value);
				}
			  }

			// IE model
			} else if (sheet.rules) {
			  rules = sheet.rules;

			  for (k=0, kLen=rules.length; k<kLen; k++) {
				rule = rules[k];

				// An alternative is to just modify rule.style.cssText,
				// but this way keeps it consistent with W3C model
				if (rule.selectorText == selectorText) {
				  
				  // 03:55 12/07/2013. Apollia's note: I had to change this since
					// the original code - removeRule(sheet, rule) - was glitchy
					// in my browsers.
				  
				  removeRule(sheet, k);
				  addRule(sheet, selectorText, value);

				  // Alternative
				  // rule.style.cssText = value;
				}
			  }
			}
		  }
		}

		// End of stuff from http://stackoverflow.com/questions/7657363/changing-global-css-styles-from-javascript
		
		
		
	}
	
	
	// ******** End of Global CSS Province




	// ******** Start of Color Province
	
	
	this.Color_Overlord=new function()
	{
		
		
		this.Set_Current_Text_Color_to_ = function (color, should_log)
		{
			var Config = App.Config;
			
			Config.Current_Text_Color=color;
			
			if (should_log)
			{	
				App.Color_History_Overlord.Log_Current_Text_Color();
			}
			return color;
		}


			
		// **** From http://www.paulirish.com/2009/random-hex-color-code-snippets/

		var Random_Color = function ()
		{						
			if (App.Config.should_include_pound_signs_in_hex_colors)
			{	
				return '#'+ ('000000' + Math.floor(Math.random()*16777215).toString(16)).slice(-6);
			}
			else
			{	
				return ('000000' + Math.floor(Math.random()*16777215).toString(16)).slice(-6);
			}
		}

		// **** End of stuff from http://www.paulirish.com/2009/random-hex-color-code-snippets/
		
		
		
		this.Set_Current_Text_Color_to_Random_Color=function ()
		{
			var Config = App.Config;
			
			var Font_Color;
			
			Font_Color = Random_Color();
			
			Config.Current_Text_Color=Font_Color;
			
			App.Color_History_Overlord.Log_Current_Text_Color();
			
			return Font_Color;
		}
		
		
		
		this.Set_and_Display_New_Random_Text_Color = function()
		{
			this.Set_Current_Text_Color_to_Random_Color();
			App.Textstyle_Overlord.Adjust_Text_related_CSS();
			App.Control_Panel_Overlord.Set_Font_Color_Box_Value();
			App.Control_Panel_Overlord.Focus_on_New_Color_Button();
		}


		
		// Function based on code from: http://stackoverflow.com/questions/8027423/how-to-check-if-a-string-is-a-valid-hex-color-representation 

		this.is_a_Hex_Color=function ( possible_color )
		{
			result = /^(#|\b)[0-9A-Fa-f]{6}$/i.test(possible_color);
			
			return result;
		}

		// End of function based on code from http://stackoverflow.com/questions/8027423/how-to-check-if-a-string-is-a-valid-hex-color-representation
		
		
		
		var Add_Pound_Sign_if_Necessary_to_ = function (color)
		{	
			if (color.charAt(0)!="#")
			{	color = "#" + color;
			}

			return color;
		}
		
		
		
		var Remove_Pound_Sign_if_Necessary_from_ = function(color)
		{
			if (color.charAt(0)=="#")
			{	color = color.substring(1);
			}
			
			return color;
		}
		
		
		
		this.Add_or_Remove_Pound_Sign_if_Necessary = function(color)
		{	
			var Config = Astroblahhh_Font_Sampler.Config;
			
			if ( Config.should_include_pound_signs_in_hex_colors)
			{	color=Add_Pound_Sign_if_Necessary_to_(color);
			}
			else
			{	color=Remove_Pound_Sign_if_Necessary_from_(color);
			}
			
			return color;
			
		}
		
		
		
		this.Try_New_Font_Color_Upon_Enter_Key_Press=function (Event, Font_Color_Box)
		{	
			var code = (Event.keyCode ? Event.keyCode : Event.which);
			
			if (code == 13) 
			{
				var possible_color = Font_Color_Box.value;
				
				if ( this.is_a_Hex_Color( possible_color ) )
				{	var color=possible_color;
					
					color=this.Add_or_Remove_Pound_Sign_if_Necessary(color);
					
					this.Set_Current_Text_Color_to_(color, "should log");
					
					App.Textstyle_Overlord.Adjust_Text_related_CSS();
					
					App.Message_Overlord.Remove_Message();
					
				}
				else
				{	
					App.Message_Overlord.Set_Error_Message("Please enter a valid hexadecimal color.");
					return false;
				}
			}
		}
		
		
		
	}
	
	
	// ******** End of Color Province

	
	
	
	// ******** Start of Textstyle Province
	
	this.Textstyle_Overlord = new function()
	{
	
	
		var Toggle_Text_Style = function (style, clicked_element)
		{
			var Config = App.Config;
			
			switch (style)
			{	case "bold": 
					Config.should_bold_text=!Config.should_bold_text;
					
					if (Config.should_bold_text)
					{
						clicked_element.className="bold_style_on";
					}
					else
					{	clicked_element.className="bold_style_off";
					}
			
					break;
				case "italic":
					if (Config.should_italicize_text=="italic")
					{	Config.should_italicize_text="no";
						clicked_element.className="italic_style_off";
					}
					else
					{	
						Config.should_italicize_text="italic";
						clicked_element.className="italic_style_on";
					}
					break;
				
				case "oblique":
					if (Config.should_italicize_text=="oblique")
					{	Config.should_italicize_text="oblique";
					}
					else
					{
						Config.should_italicize_text="oblique";
					}
					break;
				
				case "overline":
				case "underline":
				case "strikethru":
					if (Config.should_use_lined_style_with_text==style)
					{	style="none";
					}
					Config.should_use_lined_style_with_text=style;
					App.Control_Panel_Overlord.Toggle_Lined_Style_Button(style);
					
					break;
			}
		}
		
		
		
		var Set_Text_CSS = function()
		{
			var Config = App.Config;
			var style;
			
			style = " color: " + Config.Current_Text_Color + "; ";
			
			style += "line-height: " + Config.line_height + "; ";
			style += "word-spacing: " + Config.word_spacing + "; ";
			style += "letter-spacing: " + Config.letter_spacing + "; ";

			
			if ( Config.should_bold_text)
			{	style += "font-weight: bold; ";
			}
			
			if ( Config.should_use_lined_style_with_text == "underline")
			{	style += "text-decoration: underline; ";
			}
			else if ( Config.should_use_lined_style_with_text == "strikethru")
			{	style += "text-decoration: line-through; ";
			}
			else if ( Config.should_use_lined_style_with_text == "overline")
			{	style += "text-decoration: overline; ";
			}
			
			if ( Config.should_italicize_text=="italic")
			{	style += "font-style: italic; ";
			}
			else if ( Config.should_italicize_text=="oblique")
			{	style += "font-style: oblique; ";
			}
			
				
			App.Global_CSS_Overlord.modifyStyleRule(".changeall", style);
			
			if ( Config.in_clever_prevnext_mode )
			{
				App.Nav_Overlord.Reset_Array_of_Font_Anch_Positions();
			}
		}
		
		
		
		this.Adjust_Text_related_CSS = function()
		{
			var Config = App.Config;
			
			App.Box_Overlord.Set_Text_Border_CSS_to_( Config.should_show_box_around_text);
			
			Set_Text_CSS();	
		}
		
		
		
		this.Toggle_and_Display_New_Text_Style = function(style, clicked_element)
		{			
			Toggle_Text_Style(style, clicked_element);
			
			App.Textstyle_Overlord.Adjust_Text_related_CSS();

			App.Control_Panel_Overlord.Focus_on_New_Color_Button();
		}

	}


	// ******** End of Textstyle Province


	
	// The Show Samples function - the final step, where stuff is finally put into the Displayer.
	
	this.Show_Samples = function(should_not_update_color)
	{
		var Config = App.Config;
	
		var Displayer=Granary_Element("Displayer");
		
		var Sample_Text_to_Display=Config.Sample_Text_to_Display;
		
		var num_of_fonts=Config.Font_Set_to_Use.List_of_Fonts.length;
		var num_of_font_sizes=Config.Font_Sizes_Set_to_Use.List_of_Font_Sizes.length;
		
		
		// Empty vars:

		var Output="";
		
		
		var font_arrin;	
		var fontsize_arrin;
			// arrin means ARRay INdex
		var prev_font_arrin;
		var next_font_arrin;
		
		
		var current_font;
		var current_font_size;

		var Font_Color;
		
		var Created_Font_Anchs=[];  // an array.  
		
		// ----- End of empty vars
		
		
		if (Config.should_use_random_color_when_first_loading_page ) 
		{
			if (!should_not_update_color)
			{
				Font_Color=App.Color_Overlord.Set_Current_Text_Color_to_Random_Color();
			}
			
		}
		else
		{	Font_Color=Config.Default_Text_Color;
		}


		App.Textstyle_Overlord.Adjust_Text_related_CSS();
		App.Control_Panel_Overlord.Set_Font_Color_Box_Value();

		Output += "<div class='changeall'>";
		
		for ( font_arrin=0; font_arrin<num_of_fonts; font_arrin++)
		{	
			// arrin means ARRay INdex
		
			next_font_arrin=font_arrin+1;
			
			current_font = Config.Font_Set_to_Use.List_of_Fonts[font_arrin];
			
			Output += "<br clear=all>";
			
			Output += "<a name='font" + font_arrin + "'></a>";
			font_anch_name=App.Fontset_Overlord.Font_Anch_Name(current_font);
			Output += "<a name='" + font_anch_name + "' id='" + font_anch_name + "'></a>";
			
			Created_Font_Anchs.push(font_anch_name);
			
			Output += "<hr>";
			Output += "<br>";
			
			Output += "<table><tr><td><span class='navanchs'>";

			if (font_arrin>0)
			{	

				prev_font_arrin=font_arrin-1;

				prev_font = Config.Font_Set_to_Use.List_of_Fonts[prev_font_arrin];
				
				if (prev_font)
				{
					Output += "<a href='#";
					Output += App.Fontset_Overlord.Font_Anch_Name(prev_font);
					Output += "'>&#x2191;&nbsp;Prev</a> - ";
				}
				else
				{
					Output += "<a href='#top'>&#x2191;&nbsp;Prev</a> - ";
				}
			}
			else
			{
				Output += "<a href='#top'>&#x2191;&nbsp;Prev</a> - ";
			}
			
			
			next_font_arrin=font_arrin+1;
			next_font = Config.Font_Set_to_Use.List_of_Fonts[next_font_arrin];
			
			if (next_font)
			{
				Output += "<a href='#";
				Output += App.Fontset_Overlord.Font_Anch_Name(next_font);
				Output += "'>Next&nbsp;&#x2193;</a> - ";
			}
			else
			{
				Output += "<a href='#bottom'>Next&nbsp;&#x2193;</a> - ";
			}
			Output += "<a href='#top'>&#x25B3;&nbsp;Top</a></span></table>";
			
			Output += "<font face='" + current_font + "'>";
			Output += "<h1>" + current_font + "</h1>";
			
			Output += "<div class='realignable'>";
			
			
			for ( fontsize_arrin = 0; fontsize_arrin<num_of_font_sizes ; fontsize_arrin++)
			{	// arrin means ARRay INdex
			
				current_font_size = Config.Font_Sizes_Set_to_Use.List_of_Font_Sizes[fontsize_arrin];
				
				Output += "<p class='boxed_or_not' style='font-size:" + current_font_size +";'>";
				
				if 	(Config.should_print_font_size_number_at_beginning_of_line)
				{	Output += "<span class='font-size-num-at-beginning-of-line'>" + current_font_size + "</span> ";
				}	
				
				if ( Config.should_print_font_name_at_beginning_of_line)
				{	Output += "<span class='font-name-at-beginning-of-line'>" + current_font + "</span> ";
				}
		
		
				
				
				Output += Sample_Text_to_Display;
				
				if 	(Config.should_print_font_size_number_at_end_of_line)
				{	Output += " <span class='font-size-num-at-end-of-line'>" + current_font_size + "</span>";
				}
				
				if ( Config.should_print_font_name_at_end_of_line)
				{	Output += " <span class='font-name-at-end-of-line'>" + current_font + "</span> ";
				}
				
				Output += "</p>";
				
			}
			
			Output += "</font>";
			
			Output += "</div>";
			
			if (Config.should_show_font_name_at_bottom_below_all_samples_of_current_font)
			{
				Output += "<h1>" + current_font + "</h1>";
			}
		}
		
		
		Output += "<table><tr><td><span class='navanchs'>";

		last_font_arrin=num_of_fonts-1;
		
		last_font = Config.Font_Set_to_Use.List_of_Fonts[last_font_arrin];

		Output += "<a href='#";
		Output += App.Fontset_Overlord.Font_Anch_Name(last_font);
		Output += "'>&#x2191;&nbsp;Prev</a> - ";
		
		Output += "<a href='#bottom'>Next&nbsp;&#x2193;</a> - ";
	
		Output += "<a href='#top'>&#x25B3;&nbsp;Top</a></span></table>";
			
		Output += "<a id='bottom' name='bottom'></a>";
		
		Displayer.innerHTML=Output;
		
		App.Control_Panel_Overlord.Focus_on_New_Color_Button();
		
		Created_Font_Anchs.push("bottom");
		
		if (Config.should_make_up_and_down_keys_go_to_prev_and_next_samples || Config.should_show_prev_and_next_links_in_control_panel )
		{
			App.Nav_Overlord.Set_Arrays_of_Positions_and_Font_Anchs(Created_Font_Anchs);
		}
		
	}
	
	

}

// End of Astroblahhh_Font_Sample_Generator_Object constructor.



// From http://stackoverflow.com/questions/957537/how-can-i-print-a-javascript-object 

	// Useful for debugging/testing.

function Print_Object(object)
{	
	var output = '';
	var property;
	var output;
	
	for (property in object) 
	{
	  output += property + ': ' + object[property]+'; ';
	}
	alert(output);
			
}

// End of http://stackoverflow.com/questions/957537/how-can-i-print-a-javascript-object



//<span id="Color_Picker_Opener" onClick='Astroblahhh_Font_Sampler.Color_Picker_Overlord.Pop_Up_a_Color_Picker("Text Color Picker")' class='hover_color'>&#x2102;</span>


	// Now the only JavaScript that remains is that which is embedded in the HTML at the bottom!

</script>

<style type="text/css">
			
body
{
	background: black;
	color: #7c6bcd;
}



a
{	text-decoration: none;
}


a:hover
{	color: fuchsia;
}


a:active
{	color: purple;
}


a:visited, a:visited.ext
{	color: #8027af;
}


a:link, a:link.ext
{	color: #4355c9;
}


a:hover.ext
{	color: Fuchsia;
}


a:link.ctrl, a:visited.ctrl
{	color: 9040bd;
}


a:hover.ctrl
{	color: gold;
}


a:link.int_anch, a:visited.int_anch
{	color: #4877d4;
}


a:hover.int_anch
{	color: #9f0dd0;
}


.navanchs a:link, .navanchs a:visited
{	color: 4877d4;
}


.navanchs a:hover
{	color: 9f0dd0;
}



.font-name-at-beginning-of-line, .font-name-at-end-of-line, .font-size-num-at-beginning-of-line, .font-size-num-at-end-of-line
{
	font-weight: bold;
}



.style_controller, .bold_style_off, .italic_style_off, .bold_style_on, .italic_style_on, .overline_style_on, .overline_style_off, .underline_style_on, .underline_style_off, .strikethru_style_off, .strikethru_style_on
{
	border: solid 1px;
	padding: 1px;
	color: #9040bd;
	
	line-height: 1.8em;
	
}


.bold_style_on, .italic_style_on, .border_box_on, .overline_style_on, .underline_style_on, .strikethru_style_on 
{	
	color: #cd95ea;
}



.underline_style_on, .underline_style_off
{	text-decoration: underline;
}


.strikethru_style_on, .strikethru_style_off
{	text-decoration: line-through;
}


.overline_style_on, .overline_style_off
{	text-decoration: overline;
}



.bold_style_on, .bold_style_off
{	font-weight: bold;
	padding-left: 3px;
	padding-right: 3px;
}


.italic_style_off, .italic_style_on
{	font-style: italic;
	padding-left: 6px;
	padding-right: 6px;
}


.hover_color:hover, .italic_style_off:hover, .bold_style_off:hover, .italic_style_on:hover, .bold_style_on:hover, .border_box_off:hover, .border_box_on:hover, .overline_style_on:hover, .overline_style_off:hover, .underline_style_on:hover, .underline_style_off:hover, .strikethru_style_off:hover, .strikethru_style_on:hover
{	color: gold;
}



.navanchs
{	font-family: Sans, Arial;
	text-align: center;
	font-weight: normal;
	text-decoration: none;
	font-style: normal;
}



input, textarea, select, option
{
	background: black;
	color: #c909f3;
	border-color: 520950;
	border-style: solid;
}



select
{	border-color: 722970;
}



.font_color_box
{	font-family: monospace;
	color: #D919ff;
	font-size: x-large;
	
}



textarea
{	font-weight: bold;
}



/* This empty .changeall bit has to exist or the JavaScript gets confused: */

.changeall
{
}



.realignable
{	width: 75%;
	text-align: center;
}



hr
{
	margin-top: 5px;
    height: 1px;
    color: #0300AA;
    background: #03009A;
    font-size: 0;
    border: 0;
}



.boxed_or_not
{
	border: none;
	padding: 5px;
}

.boxed
{	border: solid 1px;
	padding: 3px;
}

.alignment_arrows, .color_history_arrows, #Container_of_Fontsize_Set_Reverser, #Container_of_Border_Box_Toggler, #Container_of_Home_Link, #Container_of_Lined_Style_Controllers, #Container_of_Textbox_for_Font_Color
{	font-weight: bold;

	color: 9040bd;
}

#Container_of_Home_Link
{	font-size: xx-large;
}
.alignment_arrows, #Color_Picker_Opener
{	font-size: 1.4em;
}
#Container_of_Textbox_for_Font_Color
{	font-size: smaller;
}
#Container_of_Color_History_Arrows
{	font-size: x-large;
}

#Container_of_Link_for_Color_Log, #Container_of_Help_Link, #Container_of_Prev_and_Next_Links, #Container_of_Sentence_Link, #Container_of_Paragraph_Link
{	color: 9040bd;
}

#Container_of_Help_Link
{	font-size: medium;
}

#Container_of_Floating_Control_Panel
{	width: 100%;
	overflow: hidden;
}



.floating_control_panel
{	background-color: black;
	position:fixed;
	height: 100%;
	overflow: auto;
	top: 0px;
	left: 0px;

	width: 12%;
	float: left;
}



.floating_Font_Set_panel
{	background-color: black;
	position:fixed;
	height: 100%;
	overflow: auto;
	top: 0px;
	right: 0px;
	font-family: sans;
	font-size: xx-small;
	text-align: right;

	width: 13%;
	float: right;
}


.notif
{	color: limegreen;
}


.error
{	color: red;
}

#Fontsize_Set_Textbox
{	
}

#Container_of_Instructions
{	width: 75%;
}


.keyboard_shortcut_help
{	color: #5e5cb4;
	font-weight: bold;
}
.keyboard_shortcuts_header
{
	color: #4265d7;
}
.getvar, .getvar_values
{	font-family: monospace;
	font-weight: bold;
}


.width_table
{	font-size: smaller;
}
.lineheight_in_table, .letterspacing_in_table, .wordspacing_in_table
{	font-size: smaller;
}

</style>  


</head>  
<body onLoad="Astroblahhh_Font_Sampler.Run()"><a name="top"></a><center>

<span id="Container_of_Font_Set">
	<select id="Font_Set_Dropdown" onChange="Astroblahhh_Font_Sampler.Fontset_Overlord.Change_to_Selected_Font_Set_and_Redisplay_Samples()" name="Font_Set_Dropdown"></select>

	<input id="Font_Set_Textbox" onKeyPress="Astroblahhh_Font_Sampler.Fontset_Overlord.Try_New_Font_Set_Upon_Enter_Key_Press(event, this)" onBlur='Astroblahhh_Font_Sampler.Message_Overlord.Remove_Message()' type=text size=20%>
	
</span>


<span id="Container_of_Fontsize_Set">
	
	<select id="Fontsize_Set_Dropdown" onChange="Astroblahhh_Font_Sampler.Fontsize_Overlord.Change_to_Selected_Fontsize_Set_and_Redisplay_Samples()" name="Fontsize_Set_Dropdown"></select>

	
	<input id="Fontsize_Set_Textbox" onKeyPress="Astroblahhh_Font_Sampler.Fontsize_Overlord.Try_New_Fontsize_Set_Upon_Enter_Key_Press(event, this)" onBlur='Astroblahhh_Font_Sampler.Message_Overlord.Remove_Message()' type=text size=15%>
</span>


<div id="Container_of_Instructions"></div>

<div id="Container_of_Floating_Control_Panel">
	<span class="floating_control_panel">
		<span id="Container_of_Top_Anch"><a href='#top' class='ctrl'>&#x25B3;&nbsp;Top</a></span>

		<span id="Container_of_Fontsize_Set_Reverser" onClick="Astroblahhh_Font_Sampler.Fontsize_Overlord.Reverse_Font_Sizes_Set(); Astroblahhh_Font_Sampler.Show_Samples('should not update color');">
			<span class="hover_color">&nbsp;&#x21C6;</span>
		</span>


	<br>
	
		<span id="Container_of_Textbox_for_Font_Color">
			<input type='button' id='New_Color_Button' onClick='Astroblahhh_Font_Sampler.Color_Overlord.Set_and_Display_New_Random_Text_Color()' value='Color'>
			<span id="Container_of_Color_History_Arrows" class="color_history_arrows">

				<span class="hover_color" onClick="Astroblahhh_Font_Sampler.Color_History_Overlord.Color_History_Go_('back')">&#x21E6;</span>
				<span class="hover_color" onClick="Astroblahhh_Font_Sampler.Color_History_Overlord.Color_History_Go_('forth')">&#x21E8;</span>
			</span>
			<input id="Font_Color_Box" class='font_color_box' type='text' name='Font_Color_Box' size=7 onKeyPress="Astroblahhh_Font_Sampler.Color_Overlord.Try_New_Font_Color_Upon_Enter_Key_Press(event, this)" onBlur='Astroblahhh_Font_Sampler.Message_Overlord.Remove_Message()' onClick='Astroblahhh_Font_Sampler.Control_Panel_Overlord.Hilite_if_Allowed(this)'>
			
			
		</span>
		<br>
		<span id="Container_of_Link_for_Color_Log" onClick="Astroblahhh_Font_Sampler.Color_History_Overlord.Popup_Color_Log()">
			<span class="hover_color">Log</span>
			
			
		</span>
		
	

		<span id="Container_of_Style_Controllers">
			<span id="Bold_Style_Controller" class="bold_style_off" onClick="Astroblahhh_Font_Sampler.Textstyle_Overlord.Toggle_and_Display_New_Text_Style('bold', this)">B</span> 
			
			<span id="Italic_Style_Controller" class="italic_style_off" onClick="Astroblahhh_Font_Sampler.Textstyle_Overlord.Toggle_and_Display_New_Text_Style('italic', this)">I</span>

			<span id="Container_of_Border_Box_Toggler">
				<span class="border_box_off"  id="Border_Box_Toggler" onClick="Astroblahhh_Font_Sampler.Box_Overlord.Toggle_Border_Box(this);">&#x25ad;</span>
			
			</span>
			
			<span id="Container_of_Lined_Style_Controllers"><br>

				<span id="Underline_Style_Controller" class="underline_style_off" onClick="Astroblahhh_Font_Sampler.Textstyle_Overlord.Toggle_and_Display_New_Text_Style('underline', this)">U</span>

				<span id="Strikethru_Style_Controller" class="strikethru_style_off" onClick="Astroblahhh_Font_Sampler.Textstyle_Overlord.Toggle_and_Display_New_Text_Style('strikethru', this)">S</span>

				<span id="Overline_Style_Controller" class="overline_style_off" onClick="Astroblahhh_Font_Sampler.Textstyle_Overlord.Toggle_and_Display_New_Text_Style('overline', this)">O</span>

			</span>
		
					<span id="Container_of_Sentence_Link" onClick="Astroblahhh_Font_Sampler.Sampletext_Overlord.Display_Default_('sentence')">
			<span class="hover_color">&#x204B;</span>
		</span> &nbsp;<span id="Container_of_Paragraph_Link" onClick="Astroblahhh_Font_Sampler.Sampletext_Overlord.Display_Default_('paragraph')">
			<span class="hover_color">&#xb6;</span>
		</span>
		
		</span>
		

		<span id="Container_of_Textarea_for_Sample_Text">
			<textarea type="text" id="Textarea_for_Sample_Text" class="textarea_for_sample_text" wrap=virtual rows=2 cols=10></textarea>
		</span>
		<br>
		
		<span id="Container_of_Button_for_New_Text">
		<input type='button' id='Button_for_New_Text' onClick='Astroblahhh_Font_Sampler.Sampletext_Overlord.Update_Sample_Text()' value='New Text'> 
		</span>	

		
		<br>
		<span id="Container_of_Textbox_for_Text_Width">
		<table><tr class='width_table'><td>Width

		<td>
			<input id="Text_Width_Textbox" class='font_color_box' type='text' name='Text_Width_Textbox' size=4 onKeyPress="Astroblahhh_Font_Sampler.Textposition_Overlord.Try_New_Text_Width_Upon_Enter_Key_Press(event, this)" onBlur='Astroblahhh_Font_Sampler.Message_Overlord.Remove_Message()' onClick='Astroblahhh_Font_Sampler.Control_Panel_Overlord.Hilite_if_Allowed(this)'>
	
		</span><br>
		
		<span id="Container_of_Textbox_For_Line_Height">
		<tr class='lineheight_in_table'><td>Line<br>Height
		<td>
		
			<input id="Line_Height_Textbox" class='font_color_box' text='text' name='Line_Height_Textbox' size=4 onKeyPress="Astroblahhh_Font_Sampler.Textposition_Overlord.Try_New_Line_Height_Upon_Enter_Key_Press(event, this)" onBlur='Astroblahhh_Font_Sampler.Message_Overlord.Remove_Message()' onClick='Astroblahhh_Font_Sampler.Control_Panel_Overlord.Hilite_if_Allowed(this)'>
		
		</span>
		
		<span id="Container_of_Textbox_For_Word_Spacing">
		<tr class='wordspacing_in_table'><td>Word<br>Spacing
		<td>
		
			<input id="Word_Spacing_Textbox" class='font_color_box' text='text' name='Word_Spacing_Textbox' size=4 onKeyPress="Astroblahhh_Font_Sampler.Textposition_Overlord.Try_New_Word_Spacing_Upon_Enter_Key_Press(event, this)" onBlur='Astroblahhh_Font_Sampler.Message_Overlord.Remove_Message()' onClick='Astroblahhh_Font_Sampler.Control_Panel_Overlord.Hilite_if_Allowed(this)'>
		
		</span>
		
		<span id="Container_of_Textbox_For_Letter_Spacing">
		<tr class='letterspacing_in_table'><td>Letter<br>Spacing
		<td>
		
			<input id="Letter_Spacing_Textbox" class='font_color_box' text='text' name='Letter_Spacing_Textbox ' size=4 onKeyPress="Astroblahhh_Font_Sampler.Textposition_Overlord.Try_New_Letter_Spacing_Upon_Enter_Key_Press(event, this)" onBlur='Astroblahhh_Font_Sampler.Message_Overlord.Remove_Message()' onClick='Astroblahhh_Font_Sampler.Control_Panel_Overlord.Hilite_if_Allowed(this)'>
		
		</span>
		
		
		
		<tr><td colspan=2><center><span id="Container_of_Alignment_Arrows" class="alignment_arrows">
			<span class="hover_color" onClick="Astroblahhh_Font_Sampler.Textposition_Overlord.Realign_Text_to_('left')">&#x21E6;</span>

			<span class="hover_color" onClick="Astroblahhh_Font_Sampler.Textposition_Overlord.Realign_Text_to_('justify')">&#x25A4;</span>
			
			<span class="hover_color" onClick="Astroblahhh_Font_Sampler.Textposition_Overlord.Realign_Text_to_('center')">&#x2042;</span>

			<span class="hover_color" onClick="Astroblahhh_Font_Sampler.Textposition_Overlord.Realign_Text_to_('right')">&#x21E8;</span>
		</span></table>

		
		
		<br>
		<div id="Container_of_Message"></div>

		<br>



		<span id="Container_of_Top_Anch_Link"><a href='#top' class='ctrl'>&#x25B3;&nbsp;Top</a>
		</span><br><br>
		
		<span id="Container_of_Prev_and_Next_Links">
			<span class='ctrl' onClick='Astroblahhh_Font_Sampler.Nav_Overlord.Go_to_Prev_Font_Sample()'>
				<span class="hover_color">&#x2191;&nbsp;Prev</span></span>&nbsp;&nbsp;<span class='ctrl' onClick='Astroblahhh_Font_Sampler.Nav_Overlord.Go_to_Next_Font_Sample()'><span class="hover_color">Next&nbsp;&#x2193;</span>
			</span>
		</span>
		<br>
		<br>

	

		<span id="Container_of_Home_Link"><a href="http://astroblahhh.com/" class=ext>&#x2735;</a>
		</span>
	</span>
</div>

<div class="floating_Font_Set_panel">

<span id="Container_of_Help_Link" onClick="Astroblahhh_Font_Sampler.Help_Overlord.Output_Help_to_Popup_Window()">
	<span class="hover_color">Help</span>
</span>
<br>

	<span id="Container_of_Floating_Font_Set_Panel">
	</span>
</div>

<span id="Displayer"></span>