/// <summary>
	/// Load the specified FileContents.
	/// </summary>
	/// ModifyExistingEntriesOnly : When true, Only modify keys that allready exist. 
	/// This is used to prevent old input config files from adding back deprecated keys.
	public void Load(string FileContents, bool ModifyExistingEntriesOnly){
		using (XmlReader reader = XmlReader.Create(new StringReader(FileContents))){
			while (reader.Read()){
				if (reader.IsStartElement()){
					switch (reader.Name){
						case "Key":
							InputMapEntry ReadEntry = new InputMapEntry();
							ReadEntry.Name = reader.GetAttribute("Name");
							ReadEntry.PrimaryKey = (KeyCode)Enum.Parse(typeof(KeyCode), reader.GetAttribute("PrimaryKey"));
							ReadEntry.SecondaryKey = (KeyCode)Enum.Parse(typeof(KeyCode),reader.GetAttribute("SecondaryKey"));
							ReadEntry.PrimaryModifier = (KeyCode)Enum.Parse(typeof(KeyCode),reader.GetAttribute("PrimaryModifier"));
							ReadEntry.SecondaryModifier = (KeyCode)Enum.Parse(typeof(KeyCode),reader.GetAttribute("SecondaryModifier"));
							bool.TryParse(reader.GetAttribute("PrimaryIsAxis"), out ReadEntry.PrimaryIsAxis);
							ReadEntry.PrimaryAxisName = reader.GetAttribute("PrimaryAxisName");
							float.TryParse(reader.GetAttribute("PrimaryAxisDeadzone"), out ReadEntry.PrimaryAxisDeadzone);
							bool.TryParse(reader.GetAttribute("SecondaryIsAxis"), out ReadEntry.SecondaryIsAxis);
							ReadEntry.SecondaryAxisName = reader.GetAttribute("SecondaryAxisName");
							float.TryParse(reader.GetAttribute("SecondaryAxisDeadzone"), out ReadEntry.SecondaryAxisDeadzone);
						
							if (ModifyExistingEntriesOnly){
								if (MapEntries.ContainsKey(ReadEntry.Name)){
									MapEntries[ReadEntry.Name] = ReadEntry;
									//Make sure keys are properly set as modifiers 
									if (ReadEntry.PrimaryModifier != KeyCode.None){
										if (ReadEntry.PrimaryKey != KeyCode.None){
											SetModifier(ReadEntry.PrimaryKey, ReadEntry.PrimaryModifier);
										}
										if (ReadEntry.PrimaryAxisName != ""){
											SetModifier(ReadEntry.PrimaryAxisName, ReadEntry.PrimaryModifier);
										}
									}
									if (ReadEntry.SecondaryModifier != KeyCode.None){
										if (ReadEntry.SecondaryKey != KeyCode.None){
											SetModifier(ReadEntry.SecondaryKey, ReadEntry.SecondaryModifier);
										}
										if (ReadEntry.SecondaryAxisName != ""){
											SetModifier(ReadEntry.SecondaryAxisName, ReadEntry.SecondaryModifier);
										}
									}
								}
							}else{
								MapEntries[ReadEntry.Name] = ReadEntry;
								//Make sure keys are properly set as modifiers 
								if (ReadEntry.PrimaryModifier != KeyCode.None){
									if (ReadEntry.PrimaryKey != KeyCode.None){
										SetModifier(ReadEntry.PrimaryKey, ReadEntry.PrimaryModifier);
									}
									if (ReadEntry.PrimaryAxisName != ""){
										SetModifier(ReadEntry.PrimaryAxisName, ReadEntry.PrimaryModifier);
									}
								}
								if (ReadEntry.SecondaryModifier != KeyCode.None){
									if (ReadEntry.SecondaryKey != KeyCode.None){
										SetModifier(ReadEntry.SecondaryKey, ReadEntry.SecondaryModifier);
									}
									if (ReadEntry.SecondaryAxisName != ""){
										SetModifier(ReadEntry.SecondaryAxisName, ReadEntry.SecondaryModifier);
									}
								}
							}
						break;
						case "Axis":
							InputAxisEntry ReadAxis = new InputAxisEntry();
							ReadAxis.Name = reader.GetAttribute("Name");
							ReadAxis.KeyPositive = reader.GetAttribute("KeyPositive");
							ReadAxis.KeyNegative = reader.GetAttribute("KeyNegative");
							if (ModifyExistingEntriesOnly){
								if (AxisEntries.ContainsKey(ReadAxis.Name)){
									AxisEntries[ReadAxis.Name] = ReadAxis;
								}
							}else{
								AxisEntries[ReadAxis.Name] = ReadAxis;
							}
						break;
					}
				}
			}
		}
	}
	/// <summary>
	/// Sets the secondary key as axis.
	/// </summary>
	public void SetSecondaryKeyAsAxis(string Name, string SecondaryAxisName, KeyCode SecondaryModifier, float SecondaryAxisDeadzone){
		if (!MapEntries.ContainsKey(Name)){
			MapEntries[Name] = new InputMapEntry();
		}
		InputMapEntry Entry = MapEntries[Name];
		Entry.Name = Name;
		Entry.SecondaryAxisName = SecondaryAxisName;
		Entry.SecondaryModifier = SecondaryModifier;
		Entry.SecondaryAxisDeadzone = SecondaryAxisDeadzone;
		Entry.SecondaryIsAxis = true;
		
		if (SecondaryModifier != KeyCode.None){
			SetModifier(SecondaryAxisName, SecondaryModifier);
		}
	}
	/// <summary>
	/// Checks the axis key.
	/// </summary>
	private float CheckAxisKey(InputMapEntry Entry){
		float AxisVal = 0; 
		if (Entry.PrimaryIsAxis){
			AxisVal += Entry.PrimaryAxisValue;
		}else if (Entry.SecondaryIsAxis){
			AxisVal += Entry.SecondaryAxisValue;
		}
		if (AxisVal == 0){
			if (Entry.KeyHeld){
				AxisVal += 1;
			}
		}
		return AxisVal;
	}
	/// <summary>
	/// Sets the primary key as axis.
	/// </summary>
	public void SetPrimaryKeyAsAxis(string Name, string PrimaryAxisName, KeyCode PrimaryModifier, float PrimaryAxisDeadzone){
		if (!MapEntries.ContainsKey(Name)){
			MapEntries[Name] = new InputMapEntry();
		}
		InputMapEntry Entry = MapEntries[Name];
		Entry.Name = Name;
		Entry.PrimaryAxisName = PrimaryAxisName;
		Entry.PrimaryModifier = PrimaryModifier;
		Entry.PrimaryAxisDeadzone = PrimaryAxisDeadzone;
		Entry.PrimaryIsAxis = true;
		
		if (PrimaryModifier != KeyCode.None){
			SetModifier(PrimaryAxisName, PrimaryModifier);
		}
	}
	/// <summary>
	/// Sets the secondary key.
	/// </summary>
	public void SetSecondaryKey(string Name, KeyCode SecondaryKey, KeyCode SecondaryModifier){
		if (!MapEntries.ContainsKey(Name)){
			MapEntries[Name] = new InputMapEntry();
		}
		InputMapEntry Entry = MapEntries[Name];
		Entry.Name = Name;
		Entry.SecondaryKey = SecondaryKey;
		Entry.SecondaryModifier = SecondaryModifier;
		MapEntries[Name].SecondaryIsAxis = false;
		if (SecondaryModifier != KeyCode.None){
			SetModifier(SecondaryKey, SecondaryModifier);
		}
	}
	/// <summary>
	/// Sets the primary key.
	/// </summary>
	public void SetPrimaryKey(string Name, KeyCode PrimaryKey, KeyCode PrimaryModifier){
		if (!MapEntries.ContainsKey(Name)){
			MapEntries[Name] = new InputMapEntry();
		}
		InputMapEntry Entry = MapEntries[Name];
		Entry.Name = Name;
		Entry.PrimaryKey = PrimaryKey;
		Entry.PrimaryModifier = PrimaryModifier;
		MapEntries[Name].PrimaryIsAxis = false;
		if (PrimaryModifier != KeyCode.None){
			SetModifier(PrimaryKey, PrimaryModifier);
		}
	}
	/// <summary>
	/// Sets the key.
	/// </summary>
	public void SetKey(string Name, KeyCode PrimaryKey, KeyCode SecondaryKey, KeyCode PrimaryModifier, KeyCode SecondaryModifier){
		if (!MapEntries.ContainsKey(Name)){
			MapEntries[Name] = new InputMapEntry();
		}
		MapEntries[Name].Name = Name;
		MapEntries[Name].PrimaryKey = PrimaryKey;
		MapEntries[Name].SecondaryKey = SecondaryKey;
		MapEntries[Name].PrimaryModifier = PrimaryModifier;
		MapEntries[Name].SecondaryModifier = SecondaryModifier;
		MapEntries[Name].PrimaryIsAxis = false;
		MapEntries[Name].SecondaryIsAxis = false;
		if (PrimaryModifier != KeyCode.None){
			SetModifier(PrimaryKey, PrimaryModifier);
		}
		if (SecondaryModifier != KeyCode.None){
			SetModifier(SecondaryKey, SecondaryModifier);
		}
	}
	/// <summary>
	/// Checks the entry input. Needs to be done every update. 
	/// </summary>
	private void CheckEntryInput(InputMapEntry MapEntry){
		bool PrimaryDown; 
		bool PrimaryUp; 
		bool PrimaryHeld;
		float PrimaryValue = 0;
		bool SecondaryDown = false; 
		bool SecondaryUp = false; 
		bool SecondaryHeld = false;
		float SecondaryValue = 0;
		if (MapEntry.PrimaryIsAxis){
			CheckAxis(MapEntry.PrimaryAxisName, MapEntry.PrimaryModifier, out PrimaryDown, out PrimaryUp, out PrimaryHeld, out PrimaryValue, MapEntry.PrimaryAxisDeadzone, MapEntry.PrimaryAxisValue);
		}else{
			CheckKey(MapEntry.PrimaryKey, MapEntry.PrimaryModifier, out PrimaryDown, out PrimaryUp, out PrimaryHeld);
		}

		if (MapEntry.SecondaryIsAxis){
			CheckAxis(MapEntry.SecondaryAxisName, MapEntry.SecondaryModifier, out SecondaryDown, out SecondaryUp, out SecondaryHeld, out SecondaryValue, MapEntry.SecondaryAxisDeadzone, MapEntry.SecondaryAxisValue);
		}else{
			CheckKey(MapEntry.SecondaryKey, MapEntry.SecondaryModifier, out SecondaryDown, out SecondaryUp, out SecondaryHeld);
		}
		
		MapEntry.KeyUp = PrimaryUp || SecondaryUp;
		//Failsafe for KeyUp checking. Should theoretically fix things like Alt-Tabbing not registering Alt's release event.
		if (MapEntry.KeyHeld && !PrimaryHeld && !SecondaryHeld){
			MapEntry.KeyUp = true;
		}
		MapEntry.KeyDown = PrimaryDown || SecondaryDown;
		MapEntry.KeyHeld = PrimaryHeld || SecondaryHeld;
		MapEntry.PrimaryAxisValue = PrimaryValue;
		MapEntry.SecondaryAxisValue = SecondaryValue;
	}