// Functions
function getPixels(String_Selector, Integer_Reduction)
{
	// Obtain Image Element
	var Element_Image = $(String_Selector).get(0);
	
	// Create Canvas Elements
	var Object_Canvas = document.createElement('canvas');	
	var Object_Context = Object_Canvas.getContext('2d');
	
	// Set Default Reduction
	if(Integer_Reduction == null)
	{
		Integer_Reduction = 1;
	}
	
	// Calculate Reduced Image Dimensions
	Integer_Width = Math.round(Element_Image.width / Integer_Reduction);
	Integer_Height = Math.round(Element_Image.height / Integer_Reduction);
	
	// Assign Image Data To Canvas
	Object_Context.drawImage(Element_Image, 0, 0, Integer_Width, Integer_Height);
	
	// Retrieve Pixel Data From Canvas
	var Data_Image = Object_Context.getImageData(0, 0, Integer_Width, Integer_Height).data;

	// Initialise Data Arrays
	var Array_Pixel = new Array();
	var Array_Row = new Array();
	var Array_Image = new Array();
	
	// Identify And Assign Pixel Values To Image Array
	for(Integer_Index in Data_Image)
	{
		if(Array_Pixel.length < 4)
		{
			// Append Pixel Value To Array
			Array_Pixel.push(Data_Image[Integer_Index]);
		}
		else
		{
			// Check For Row End
			if(Array_Row.length == Integer_Width)
			{
				// Append Row Array To Image Array
				Array_Image.push(Array_Row);

				// Clear Row Array
				Array_Row = [];
			}
			
			// Check For Remaining Valid Pixel
			if(Data_Image[Integer_Index] != null)
			{
				// Append Pixel Array To Row Array
				Array_Row.push(Array_Pixel);
   
				// Clear Pixel Array
				Array_Pixel = [];
   
				// Append Pixel Value To Cleared Pixel Array
				Array_Pixel.push(Data_Image[Integer_Index]);
			}
		}
		
		// Check For Last Pixel
		if(Integer_Index == Data_Image.length - 1)
		{
			// Append Row Array To Image Array
			Array_Image.push(Array_Row);
		}
	}
	
	return Array_Image;
}

function getKeyColor(String_Selector, Integer_MaximumBrightness, Integer_Reduction)
{
	// Obtain Image Pixel Data
	var Array_Pixels = getPixels(String_Selector, Integer_Reduction);

	// Locate A Suitable Color
	var Integer_Width = Array_Pixels[0].length;
	var Integer_Height = Array_Pixels.length;
	var Integer_X = 0;
	var Integer_Y = 0;

	var Array_Color = Array_Pixels[Integer_Y][Integer_X];

	// Continue Searching For Suitable Color
	while((Array_Color[0] > Integer_MaximumBrightness && Array_Color[1] > Integer_MaximumBrightness && Array_Color[2] > Integer_MaximumBrightness) && (Integer_X < (Integer_Width - 1) && Integer_Y < (Integer_Height - 1)))
	{
		Integer_X ++;
		Integer_Y ++;
		Array_Color = Array_Pixels[Integer_Y][Integer_X];
	}
	
	return Array_Color;
}

function rgbToHex(Array_Color)
{
	var String_Hex = "#";
	var String_Characters = "0123456789ABCDEF";
	
	for(Integer_Channel in Array_Color)
	{
		if(Integer_Channel < 3)
		{
			// Confine Channel Value
			Array_Color[Integer_Channel] = Math.max(0, Array_Color[Integer_Channel]);
			Array_Color[Integer_Channel] = Math.min(Array_Color[Integer_Channel], 255);
			Array_Color[Integer_Channel] = Math.round(Array_Color[Integer_Channel]);

			// Convert Integer To Hex
			if(Array_Color[Integer_Channel] == 0 || isNaN(Array_Color[Integer_Channel]))
			{	
				String_Hex = String_Hex + "00";
			}
			else
			{
				String_Hex = String_Hex + String_Characters.charAt((Array_Color[Integer_Channel] - Array_Color[Integer_Channel] % 16) / 16) + String_Characters.charAt(Array_Color[Integer_Channel] % 16);
			}
		}
	}

	return String_Hex;
}

function scrollTo(String_Selector, Integer_Duration)
{
	if($(String_Selector).length > 0)
	{
		$('html, body').animate({ scrollTop: $(String_Selector).offset().top }, Integer_Duration);
	}
}

function getVariable(String_Variable)
{
	String_Variable = String_Variable.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");

	var Regex_Search = new RegExp("[\\?&]" + String_Variable + "=([^&#]*)"); 
	var Array_Matches = Regex_Search.exec(window.location.href);
	
	if(Array_Matches == null)
	{
		return "";
	}
	else
	{
		return Array_Matches[1];
	}
}
