changeset 0:bf9220814fb5

The first version of the Cyborg MMO7 addon for warcraft
author madcatzinc@35b17cf1-18cd-47ff-9ca3-31d6b526ef09
date Tue, 24 Jan 2012 17:14:21 +0000
parents
children a4e2eaf9cad9
files CallbackFactory.lua CurrentProfile/Mmo7Wow.pr0 CyborgMMO7.lua CyborgMMO7.toc Graphics/AchievementDown.tga Graphics/AchievementOver.tga Graphics/AchievementUnselected.tga Graphics/CharacterPageDown.tga Graphics/CharacterPageOver.tga Graphics/CharacterPageUnselected.tga Graphics/CloseButton.tga Graphics/CloseButtonDown.tga Graphics/CloseButtonOver.tga Graphics/Cyborg.tga Graphics/CyborgGlow.tga Graphics/Glows.tga Graphics/InventoryDown.tga Graphics/InventoryOver.tga Graphics/InventoryUnselected.tga Graphics/Lines.tga Graphics/MacrosDown.tga Graphics/MacrosOver.tga Graphics/MacrosUnselected.tga Graphics/MapDown.tga Graphics/MapOver.tga Graphics/MapUnselected.tga Graphics/Mode1Down.tga Graphics/Mode1Over.tga Graphics/Mode1Selected.tga Graphics/Mode2Down.tga Graphics/Mode2Over.tga Graphics/Mode2Selected.tga Graphics/Mode3Down.tga Graphics/Mode3Over.tga Graphics/Mode3Selected.tga Graphics/ParchmentAndAllIcons.tga Graphics/ParchmentAndLeftSide.tga Graphics/QuestLogDown.tga Graphics/QuestLogOver.tga Graphics/QuestLogUnselected.tga Graphics/Slot.tga Graphics/SlotDown.tga Graphics/SlotLeft.tga Graphics/SlotMiddle.tga Graphics/SlotOver.tga Graphics/SlotRight.tga Graphics/SlotUp.tga Graphics/SpellbookDown.tga Graphics/SpellbookOver.tga Graphics/SpellbookUnselected.tga MainPage.xml OpenButtonPage.xml OptionPage.xml OptionView.lua RatPage.xml RatPageController.lua RatPageModel.lua RatPageView.lua RatQuickPage.xml WowObjects.lua license.txt
diffstat 61 files changed, 3440 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CallbackFactory.lua	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,127 @@
+--~ Warcraft Plugin for Cyborg MMO7 
+--~ Filename: CalbackFactory.lua
+--~ Description: Creates lua callbacks that can be executed from a user keycombination
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ 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 General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+CallbackFactory = {
+	new = function()
+		local self = {}
+		self.Frame = CreateFrame("Frame","CallbackFactoryFrame", UIParent);
+		self.Callbacks = {}
+		self.Id = 1;
+
+		self.AddCallback = function(fn)
+			local name = "Button"..self.Id
+			self.Callbacks[name] = CreateFrame("Button", name, self.Frame)
+			self.Callbacks[name]:SetScript("OnClick", fn);
+			self.Id = self.Id + 1;
+			return self.Callbacks[name], self.Frame, name;
+		end
+
+		self.RemoveCallback = function(name)
+			self.Callbacks[name] = nil
+		end
+
+		return self;
+	end,
+
+	m_Instance = nil,
+
+	Instance = function()
+		if(nil == CallbackFactory.m_Instance) then
+			CallbackFactory.m_Instance = CallbackFactory.new();
+		end
+		return CallbackFactory.m_Instance;
+	end
+
+}
+
+
+GetCallback = function(callbackName)
+	local callback = nil
+	if("Map" == callbackName) then
+		callback = ToggleMap;
+	elseif("CharacterPage" == callbackName) then
+		callback = ToggleCharacterPage;
+	elseif("Spellbook" == callbackName) then
+		callback = ToggleSpellbook;
+	elseif("Macros" == callbackName) then
+		callback = ToggleMacros;
+	elseif("QuestLog" == callbackName) then
+		callback = ToggleQuests;
+	elseif("Achievement" == callbackName) then
+		callback = ToggleAchievements;
+	elseif("Inventory" == callbackName) then
+		callback = ToggleBags; 
+	end;
+	return callback;
+end
+
+
+ToggleMap = function()
+	ToggleFrame(WorldMapFrame)
+end
+
+ToggleCharacterPage = function()
+	ToggleCharacter("PaperDollFrame")
+end
+
+ToggleSpellbook = function()
+	ToggleFrame(SpellBookFrame)
+	if(SpellBookFrame:IsShown()) then
+		SpellbookMicroButton:SetButtonState("PUSHED", 1);
+	else
+		SpellbookMicroButton:SetButtonState("NORMAL");
+	end
+
+end
+
+ToggleMacros = function()
+	if(MacroFrame:IsShown() and MacroFrame:IsVisible()) then
+		HideUIPanel(MacroFrame);
+	else
+		ShowMacroFrame();
+	end
+end
+
+ToggleQuests = function()
+	ToggleFrame(QuestLogFrame);
+	if ( QuestLogFrame:IsShown() ) then
+		QuestLogMicroButton:SetButtonState("PUSHED", 1);
+	else
+		QuestLogMicroButton:SetButtonState("NORMAL");
+	end
+end
+
+ToggleAchievements = function()
+	ToggleAchievementFrame();
+	if ( AchievementFrame and AchievementFrame:IsShown() ) then
+		AchievementMicroButton:SetButtonState("PUSHED", 1);
+	else
+		if ( ( HasCompletedAnyAchievement() or IsInGuild() ) and CanShowAchievementUI() ) then
+			AchievementMicroButton:Enable();
+			AchievementMicroButton:SetButtonState("NORMAL");
+		else
+			AchievementMicroButton:Disable();
+		end
+	end
+end
+
+ToggleBags = function()
+	ToggleAllBags();
+end
\ No newline at end of file
Binary file CurrentProfile/Mmo7Wow.pr0 has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CyborgMMO7.lua	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,664 @@
+--~ Warcraft Plugin for Cyborg MMO7 
+--~ Filename: CyborgMMO7.lua
+--~ Description: Plugin entry point, String tables and other generic crap that I could not think to put anywhere else.
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ 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 General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+Mode = {
+	["enUS"] = {
+		"ALT-CTRL-E",
+		"ALT-CTRL-F",
+		"ALT-CTRL-["
+	},
+	["frFR"] = {
+		"ALT-CTRL-E",
+		"ALT-CTRL-F",
+		"ALT-CTRL-^"
+	},
+	["deDE"] = {
+		"ALT-CTRL-E",
+		"ALT-CTRL-F",
+		"ALT-CTRL-ü"
+	},
+	["zhCN"] = {
+		"ALT-CTRL-E",
+		"ALT-CTRL-F",
+		"ALT-CTRL-["
+	},
+	["zhTW"] = {
+		"ALT-CTRL-E",
+		"ALT-CTRL-F",
+		"ALT-CTRL-["
+	},
+	["esES"] = {
+		"ALT-CTRL-E",
+		"ALT-CTRL-F",
+		"ALT-CTRL-'"
+	},
+	["esMX"] = {
+		"ALT-CTRL-E",
+		"ALT-CTRL-F",
+		"ALT-CTRL-'"
+	}
+}
+
+WowCommands = {
+	["enUS"] = {
+		"ALT-CTRL-NUMPAD1",
+		"ALT-CTRL-NUMPAD2",
+		"ALT-CTRL-NUMPAD3",
+		"ALT-CTRL-NUMPAD4",
+		"ALT-CTRL-NUMPAD5",
+		"ALT-CTRL-NUMPAD6",
+		"ALT-CTRL-NUMPAD7",
+		"ALT-CTRL-NUMPAD8",
+		"ALT-CTRL-NUMPAD9",
+		"ALT-CTRL-NUMPAD0",
+		"ALT-CTRL-1",
+		"ALT-CTRL-2",
+		"ALT-CTRL-3",
+		"ALT-CTRL-4",
+		"ALT-CTRL-5",
+		"ALT-CTRL-6",
+		"ALT-CTRL-7",
+		"ALT-CTRL-8",
+		"ALT-CTRL-9",
+		"ALT-CTRL-0",
+		"ALT-CTRL-F1",
+		"ALT-CTRL-F2",
+		"ALT-CTRL-F3",
+		"ALT-CTRL-F4",
+		"ALT-CTRL-F5",
+		"ALT-CTRL-F6",
+		"ALT-CTRL-F7",
+		"ALT-CTRL-F8",
+		"ALT-CTRL-F9",
+		"ALT-CTRL-F10",
+		"ALT-CTRL-F11",
+		"ALT-CTRL-F12",
+		"ALT-CTRL--",
+		"ALT-CTRL-H",
+		"ALT-CTRL-A",
+		"ALT-CTRL-B",
+		"ALT-CTRL-C",
+		"ALT-CTRL-D",
+		"ALT-CTRL-END"
+	},
+	["frFR"] = {
+		"ALT-CTRL-NUMPAD1",
+		"ALT-CTRL-NUMPAD2",
+		"ALT-CTRL-NUMPAD3",
+		"ALT-CTRL-NUMPAD4",
+		"ALT-CTRL-NUMPAD5",
+		"ALT-CTRL-NUMPAD6",
+		"ALT-CTRL-NUMPAD7",
+		"ALT-CTRL-NUMPAD8",
+		"ALT-CTRL-NUMPAD9",
+		"ALT-CTRL-NUMPAD0",
+		"ALT-CTRL-1",
+		"ALT-CTRL-2",
+		"ALT-CTRL-3",
+		"ALT-CTRL-4",
+		"ALT-CTRL-5",
+		"ALT-CTRL-6",
+		"ALT-CTRL-7",
+		"ALT-CTRL-8",
+		"ALT-CTRL-9",
+		"ALT-CTRL-0",
+		"ALT-CTRL-F1",
+		"ALT-CTRL-F2",
+		"ALT-CTRL-F3",
+		"ALT-CTRL-F4",
+		"ALT-CTRL-F5",
+		"ALT-CTRL-F6",
+		"ALT-CTRL-F7",
+		"ALT-CTRL-F8",
+		"ALT-CTRL-F9",
+		"ALT-CTRL-F10",
+		"ALT-CTRL-F11",
+		"ALT-CTRL-F12",
+		"ALT-CTRL-)",
+		"ALT-CTRL-H",
+		"ALT-CTRL-Q",
+		"ALT-CTRL-B",
+		"ALT-CTRL-C",
+		"ALT-CTRL-D",
+		"ALT-CTRL-END"
+	},
+	["deDE"] = {
+		"ALT-CTRL-NUMPAD1",
+		"ALT-CTRL-NUMPAD2",
+		"ALT-CTRL-NUMPAD3",
+		"ALT-CTRL-NUMPAD4",
+		"ALT-CTRL-NUMPAD5",
+		"ALT-CTRL-NUMPAD6",
+		"ALT-CTRL-NUMPAD7",
+		"ALT-CTRL-NUMPAD8",
+		"ALT-CTRL-NUMPAD9",
+		"ALT-CTRL-NUMPAD0",
+		"ALT-CTRL-1",
+		"ALT-CTRL-2",
+		"ALT-CTRL-3",
+		"ALT-CTRL-4",
+		"ALT-CTRL-5",
+		"ALT-CTRL-6",
+		"ALT-CTRL-7",
+		"ALT-CTRL-8",
+		"ALT-CTRL-9",
+		"ALT-CTRL-0",
+		"ALT-CTRL-F1",
+		"ALT-CTRL-F2",
+		"ALT-CTRL-F3",
+		"ALT-CTRL-F4",
+		"ALT-CTRL-F5",
+		"ALT-CTRL-F6",
+		"ALT-CTRL-F7",
+		"ALT-CTRL-F8",
+		"ALT-CTRL-F9",
+		"ALT-CTRL-F10",
+		"ALT-CTRL-F11",
+		"ALT-CTRL-F12",
+		"ALT-CTRL-ß",
+		"ALT-CTRL-H",
+		"ALT-CTRL-A",
+		"ALT-CTRL-B",
+		"ALT-CTRL-C",
+		"ALT-CTRL-D",
+		"ALT-CTRL-END"
+	},
+	["zhCN"] = {
+		"ALT-CTRL-NUMPAD1",
+		"ALT-CTRL-NUMPAD2",
+		"ALT-CTRL-NUMPAD3",
+		"ALT-CTRL-NUMPAD4",
+		"ALT-CTRL-NUMPAD5",
+		"ALT-CTRL-NUMPAD6",
+		"ALT-CTRL-NUMPAD7",
+		"ALT-CTRL-NUMPAD8",
+		"ALT-CTRL-NUMPAD9",
+		"ALT-CTRL-NUMPAD0",
+		"ALT-CTRL-1",
+		"ALT-CTRL-2",
+		"ALT-CTRL-3",
+		"ALT-CTRL-4",
+		"ALT-CTRL-5",
+		"ALT-CTRL-6",
+		"ALT-CTRL-7",
+		"ALT-CTRL-8",
+		"ALT-CTRL-9",
+		"ALT-CTRL-0",
+		"ALT-CTRL-F1",
+		"ALT-CTRL-F2",
+		"ALT-CTRL-F3",
+		"ALT-CTRL-F4",
+		"ALT-CTRL-F5",
+		"ALT-CTRL-F6",
+		"ALT-CTRL-F7",
+		"ALT-CTRL-F8",
+		"ALT-CTRL-F9",
+		"ALT-CTRL-F10",
+		"ALT-CTRL-F11",
+		"ALT-CTRL-F12",
+		"ALT-CTRL--",
+		"ALT-CTRL-H",
+		"ALT-CTRL-A",
+		"ALT-CTRL-B",
+		"ALT-CTRL-C",
+		"ALT-CTRL-D",
+		"ALT-CTRL-END"
+	},
+	["zhTW"] = {
+		"ALT-CTRL-NUMPAD1",
+		"ALT-CTRL-NUMPAD2",
+		"ALT-CTRL-NUMPAD3",
+		"ALT-CTRL-NUMPAD4",
+		"ALT-CTRL-NUMPAD5",
+		"ALT-CTRL-NUMPAD6",
+		"ALT-CTRL-NUMPAD7",
+		"ALT-CTRL-NUMPAD8",
+		"ALT-CTRL-NUMPAD9",
+		"ALT-CTRL-NUMPAD0",
+		"ALT-CTRL-1",
+		"ALT-CTRL-2",
+		"ALT-CTRL-3",
+		"ALT-CTRL-4",
+		"ALT-CTRL-5",
+		"ALT-CTRL-6",
+		"ALT-CTRL-7",
+		"ALT-CTRL-8",
+		"ALT-CTRL-9",
+		"ALT-CTRL-0",
+		"ALT-CTRL-F1",
+		"ALT-CTRL-F2",
+		"ALT-CTRL-F3",
+		"ALT-CTRL-F4",
+		"ALT-CTRL-F5",
+		"ALT-CTRL-F6",
+		"ALT-CTRL-F7",
+		"ALT-CTRL-F8",
+		"ALT-CTRL-F9",
+		"ALT-CTRL-F10",
+		"ALT-CTRL-F11",
+		"ALT-CTRL-F12",
+		"ALT-CTRL--",
+		"ALT-CTRL-H",
+		"ALT-CTRL-A",
+		"ALT-CTRL-B",
+		"ALT-CTRL-C",
+		"ALT-CTRL-D",
+		"ALT-CTRL-END"
+	},
+	["esES"] = {
+		"ALT-CTRL-NUMPAD1",
+		"ALT-CTRL-NUMPAD2",
+		"ALT-CTRL-NUMPAD3",
+		"ALT-CTRL-NUMPAD4",
+		"ALT-CTRL-NUMPAD5",
+		"ALT-CTRL-NUMPAD6",
+		"ALT-CTRL-NUMPAD7",
+		"ALT-CTRL-NUMPAD8",
+		"ALT-CTRL-NUMPAD9",
+		"ALT-CTRL-NUMPAD0",
+		"ALT-CTRL-1",
+		"ALT-CTRL-2",
+		"ALT-CTRL-3",
+		"ALT-CTRL-4",
+		"ALT-CTRL-5",
+		"ALT-CTRL-6",
+		"ALT-CTRL-7",
+		"ALT-CTRL-8",
+		"ALT-CTRL-9",
+		"ALT-CTRL-0",
+		"ALT-CTRL-F1",
+		"ALT-CTRL-F2",
+		"ALT-CTRL-F3",
+		"ALT-CTRL-F4",
+		"ALT-CTRL-F5",
+		"ALT-CTRL-F6",
+		"ALT-CTRL-F7",
+		"ALT-CTRL-F8",
+		"ALT-CTRL-F9",
+		"ALT-CTRL-F10",
+		"ALT-CTRL-F11",
+		"ALT-CTRL-F12",
+		"ALT-CTRL-'",
+		"ALT-CTRL-H",
+		"ALT-CTRL-A",
+		"ALT-CTRL-B",
+		"ALT-CTRL-C",
+		"ALT-CTRL-D",
+		"ALT-CTRL-END"
+	},
+	["esMX"] = {
+		"ALT-CTRL-NUMPAD1",
+		"ALT-CTRL-NUMPAD2",
+		"ALT-CTRL-NUMPAD3",
+		"ALT-CTRL-NUMPAD4",
+		"ALT-CTRL-NUMPAD5",
+		"ALT-CTRL-NUMPAD6",
+		"ALT-CTRL-NUMPAD7",
+		"ALT-CTRL-NUMPAD8",
+		"ALT-CTRL-NUMPAD9",
+		"ALT-CTRL-NUMPAD0",
+		"ALT-CTRL-1",
+		"ALT-CTRL-2",
+		"ALT-CTRL-3",
+		"ALT-CTRL-4",
+		"ALT-CTRL-5",
+		"ALT-CTRL-6",
+		"ALT-CTRL-7",
+		"ALT-CTRL-8",
+		"ALT-CTRL-9",
+		"ALT-CTRL-0",
+		"ALT-CTRL-F1",
+		"ALT-CTRL-F2",
+		"ALT-CTRL-F3",
+		"ALT-CTRL-F4",
+		"ALT-CTRL-F5",
+		"ALT-CTRL-F6",
+		"ALT-CTRL-F7",
+		"ALT-CTRL-F8",
+		"ALT-CTRL-F9",
+		"ALT-CTRL-F10",
+		"ALT-CTRL-F11",
+		"ALT-CTRL-F12",
+		"ALT-CTRL-'",
+		"ALT-CTRL-H",
+		"ALT-CTRL-A",
+		"ALT-CTRL-B",
+		"ALT-CTRL-C",
+		"ALT-CTRL-D",
+		"ALT-CTRL-END"
+	}
+}
+
+
+StringTable = {
+	["enUS"] = {
+		CyborgButtonTitle="Cyborg Button",
+		MiniMapButtonTitle="MiniMap Button",
+		OptionPageTitle="Cyborg MMO7",
+		OptionPageSetDefaults="Default",
+		CyborgSizeSliderTitle="Cyborg Head Size",
+		PluginSizeSliderTitle="Interface Window Size"
+	},
+	["frFR"] = {
+		CyborgButtonTitle="Bouton Cyborg",
+		MiniMapButtonTitle="Bouton minimap",
+		OptionPageTitle="Cyborg MMO7",
+		OptionPageSetDefaults="Par défaut",
+		CyborgSizeSliderTitle="Dimension de la tête Cyborg",
+		PluginSizeSliderTitle="Dimension de la fenêtre d'interface"
+	},
+	["deDE"] = {
+		CyborgButtonTitle="Cyborg-Taste",
+		MiniMapButtonTitle="MiniMap-Taste",
+		OptionPageTitle="Cyborg MMO7",
+		OptionPageSetDefaults="Standard",
+		CyborgSizeSliderTitle="Größe des Cyborg-Kopfes",
+		PluginSizeSliderTitle="Größe des Schnittstellenfensters"
+	},
+	["zhCN"] = {
+		CyborgButtonTitle="Cyborg 按钮",
+		MiniMapButtonTitle="“迷你地图”按钮",
+		OptionPageTitle="Cyborg MMO7",
+		OptionPageSetDefaults="默认",
+		CyborgSizeSliderTitle="Cyborg 标题大小",
+		PluginSizeSliderTitle="界面窗口大小"
+	},
+	["zhTW"] = {
+		CyborgButtonTitle="Cyborg 按鈕",
+		MiniMapButtonTitle="MiniMap 按鈕",
+		OptionPageTitle="Cyborg MMO7",
+		OptionPageSetDefaults="預設",
+		CyborgSizeSliderTitle="Cyborg 頭大小",
+		PluginSizeSliderTitle="介面視窗大小"
+	},
+	["esES"] = {
+		CyborgButtonTitle="Botón Cyborg",
+		MiniMapButtonTitle="Botón Minimapa",
+		OptionPageTitle="Cyborg MMO7",
+		OptionPageSetDefaults="Predeterminado",
+		CyborgSizeSliderTitle="Tamaño de la cabeza de Cyborg",
+		PluginSizeSliderTitle="Tamaño de la ventana de la interfaz"
+	},
+	["esMX"] = {
+		CyborgButtonTitle="Botón de Cyborg",
+		MiniMapButtonTitle="Botón de Minimapa",
+		OptionPageTitle="Cyborg MMO7",
+		OptionPageSetDefaults="Modo predeterminado",
+		CyborgSizeSliderTitle="Tamaño de la cabeza de Cyborg",
+		PluginSizeSliderTitle="Tamaño de la ventana de interfaz"
+	}
+}
+
+function LoadStrings(self)
+	self:SetText(StringTable[GetLocale()][self:GetName()]);
+end
+
+local VarsLoaded = false;
+local EnteredWorld = false;
+local LoadBinding = false;
+local SaveName = GetRealmName().."_"..UnitName("player");
+local Settings = nil;
+
+
+
+function CyborgMiniMapButton_Reposition(pos)
+	CyborgMiniMapFrame:SetPoint("TOPLEFT",
+		"Minimap",
+		"TOPLEFT",
+		52-(80*cos(pos)),
+		(80*sin(pos))-52)
+end
+
+
+function CyborgMiniMapButton_OnUpdate()
+
+	local xpos,ypos = GetCursorPosition()
+	local xmin,ymin = Minimap:GetLeft(), Minimap:GetBottom()
+
+	xpos = (xmin)-(xpos / UIParent:GetScale())
+	ypos = (ypos/ UIParent:GetScale())-(ymin)
+
+	local degrees = math.deg(math.atan2(ypos,xpos));
+
+	while(degrees < 0) do
+		degrees = degrees + 360;
+	end
+
+
+	CyborgMiniMapButton_Reposition(degrees)
+end
+
+function MouseModeChange(mode)
+	local MiniMapTexture = getglobal("CyborgMiniMapButton_Icon")
+	local MiniMapGlowTexture = getglobal("CyborgMiniMapButton_IconGlow")
+	local OpenButtonTexture = getglobal("OpenButtonPage".."OpenMainForm"):GetNormalTexture();
+	local OpenButtonGlowTexture = getglobal("OpenButtonPage".."OpenMainForm"):GetHighlightTexture();
+	if(1==mode) then
+		MiniMapTexture:SetVertexColor(1,0,0,1)
+		--MiniMapGlowTexture:SetVertexColor(1,0.26,0.26,.75);
+		OpenButtonTexture:SetVertexColor(1,0,0,0.75);
+		--OpenButtonGlowTexture:SetVertexColor(1,0.26,0.26,0.50);
+	elseif(2==mode) then
+		MiniMapTexture:SetVertexColor(0.07,0.22,1,1)
+		MiniMapGlowTexture:SetVertexColor(0.13,0.56,1,.75);
+		OpenButtonTexture:SetVertexColor(0.07,0.22,1,0.75);
+		OpenButtonGlowTexture:SetVertexColor(0.13,0.56,1,0.5);
+	elseif(3==mode) then
+		MiniMapTexture:SetVertexColor(0.52,0.08,0.89,1)
+		MiniMapGlowTexture:SetVertexColor(0.67,0.31,0.85,.75);
+		OpenButtonTexture:SetVertexColor(0.52,0.08,0.89,0.75);
+		OpenButtonGlowTexture:SetVertexColor(0.67,0.31,0.85,0.5);
+	end
+end
+
+function GetSaveData()
+	if(VarsLoaded) then
+		if (CyborgMMO7SaveData == nil) then
+			CyborgMMO7SaveData = {};
+			CyborgMMO7SaveData[SaveName] = {}
+		end
+		return CyborgMMO7SaveData[SaveName];
+	end
+	return nil;
+end
+
+function SetSaveData(data, index)
+	if(VarsLoaded) then
+		GetSaveData()[index] = data
+	end
+end
+
+function Event(self, event, ...)
+    if(event == "VARIABLES_LOADED") then
+		VarsLoaded = true;
+    elseif(event == "PLAYER_ENTERING_WORLD") then
+		EnteredWorld = true;
+    elseif(event == "PLAYER_ENTER_COMBAT") then
+		msg("PLAYER_ENTER_COMBAT");
+		Close();
+	elseif(event == nil) then
+		msg("Event is nil");
+	else
+		msg("Event is not nil");
+    end
+
+
+	-- Fire Loading if and only if the player is in the world and vars are loaded
+	if(false == LoadBinding) then
+		if(VarsLoaded) then
+			if(EnteredWorld) then
+				local data = GetSaveData()
+
+				RatPageModel.Instance().LoadData();
+				LoadBinding = true;
+
+				ShowMacroFrame();
+				HideUIPanel(MacroFrame);
+
+
+				SetupModeCallbacks(1);
+				SetupModeCallbacks(2);
+				SetupModeCallbacks(3);
+
+
+				--Reload Slider values:
+				if(nil == data["Settings"]) then
+					data["Settings"] = {}
+					data["Settings"]["Cyborg"] = 0.75;
+					data["Settings"]["Plugin"] = 0.75;
+					data["Settings"]["MiniMapButton"] = true;
+					data["Settings"]["CyborgButton"] = true;
+				end
+
+				Settings = data["Settings"];
+
+				CyborgSizeSlider:SetValue(Settings["Cyborg"]);
+				SetOpenButtonSize(Settings["Cyborg"])
+				PluginSizeSlider:SetValue(Settings["Plugin"]);
+				SetMainPageSize(Settings["Plugin"]);
+
+				if(Settings["MiniMapButton"] == false) then
+					CyborgMiniMapButton:Hide();
+				end
+
+				local xmin,ymin = Minimap:GetLeft(), Minimap:GetBottom()
+				CyborgMiniMapButton_Reposition(math.deg(math.atan2(ymin,xmin)))
+				-- Close the main window for now
+				Close();
+			end
+		end
+	end
+end
+
+function SetDefaultSettings()
+	OpenButtonPageOpenMainForm:ClearAllPoints();
+	MainPage:ClearAllPoints();
+	OpenButtonPageOpenMainForm:SetPoint("LEFT", UIParent, "LEFT", 0, 0);
+	MainPage:SetPoint("LEFT", UIParent, "LEFT", 0, 0);
+
+	SetOpenButtonSize(0.75);
+	SetMainPageSize(0.75);
+	MiniMapButton:SetChecked();
+	SetMiniMapButton(true);
+	CyborgButton:SetChecked();
+	SetCyborgHeadButton(true);
+end
+
+function SetupModeCallbacks(modeNum)
+
+	fn = function()
+		MouseModeChange(modeNum);
+		RatPageModel.Instance().SetMode(modeNum)
+	end
+
+	local buttonFrame, parentFrame, name = CallbackFactory.Instance().AddCallback(fn);
+	if(1 ~= SetOverrideBindingClick(parentFrame, true, Mode[GetLocale()][modeNum], name, "LeftButton")) then
+		msg("Failed to Bind modeChange");
+	end
+end
+
+function Loaded()
+    MainPage:RegisterEvent("VARIABLES_LOADED");
+	MainPage:RegisterEvent("PLAYER_ENTERING_WORLD");
+    MainPage:RegisterEvent("PLAYER_ENTER_COMBAT");
+end
+
+function Close()
+    MainPage:Hide();
+	if(Settings["CyborgButton"] == true) then
+		OpenButtonPage:Show();
+	end
+end
+
+function Open()
+	MainPage:Show();
+	RatQuickPage:Hide();
+	if(Settings["CyborgButton"] == true) then
+		OpenButtonPage:Show();
+	end
+end
+
+function IsOpen()
+	if(MainPage:IsVisible() == 1) then
+		return true;
+	else
+		return false;
+	end
+end
+
+function Toggle()
+	if(IsOpen()) then
+		Close();
+	else
+		Open();
+	end
+end
+
+function msg(m)
+	local id, name = GetChannelName("Debug");
+	SendChatMessage(m, "CHANNEL", nil, id);
+end
+
+function SetMainPageSize(percent)
+	if(VarsLoaded) then
+		if(EnteredWorld) then
+			MainPage:SetScale(percent);
+			Settings["Plugin"] = percent;
+			local data = GetSaveData()
+			data["Settings"] = Settings
+			PluginSizeSlider:SetValue(percent);
+		end
+	end
+end
+
+function SetOpenButtonSize(percent)
+	if(VarsLoaded) then
+		if(EnteredWorld) then
+			OpenButtonPage:SetScale(percent)
+			Settings["Cyborg"] = percent;
+			local data = GetSaveData()
+			data["Settings"] = Settings
+			CyborgSizeSlider:SetValue(percent);
+		end
+	end
+end
+
+function SetCyborgHeadButton(boolVal)
+	Settings["CyborgButton"] = boolVal;
+	if(Settings["CyborgButton"] == true) then
+		Close();
+	else
+		OpenButtonPage:Hide();
+	end
+	local data = GetSaveData()
+	data["Settings"] = Settings
+end
+
+function SetMiniMapButton(boolVal)
+	Settings["MiniMapButton"] = boolVal;
+	if(Settings["MiniMapButton"] == true) then
+		CyborgMiniMapButton:Show();
+	else
+		CyborgMiniMapButton:Hide();
+	end
+	local data = GetSaveData()
+	data["Settings"] = Settings
+end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CyborgMMO7.toc	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,19 @@
+## Interface: 40300
+## Title: Cyborg MMO7 Addon
+## DefaultState: Enabled
+## Version: 1.0.0
+## LoadOnDemand: 0
+## SavedVariablesPerCharacter: CyborgMMO7SaveData
+
+OptionView.lua
+CallbackFactory.lua
+WowObjects.lua
+RatPageModel.lua
+RatPageController.lua
+RatPageView.lua
+CyborgMMO7.lua
+RatPage.xml
+RatQuickPage.xml
+MainPage.xml
+OpenButtonPage.xml
+OptionPage.xml
Binary file Graphics/AchievementDown.tga has changed
Binary file Graphics/AchievementOver.tga has changed
Binary file Graphics/AchievementUnselected.tga has changed
Binary file Graphics/CharacterPageDown.tga has changed
Binary file Graphics/CharacterPageOver.tga has changed
Binary file Graphics/CharacterPageUnselected.tga has changed
Binary file Graphics/CloseButton.tga has changed
Binary file Graphics/CloseButtonDown.tga has changed
Binary file Graphics/CloseButtonOver.tga has changed
Binary file Graphics/Cyborg.tga has changed
Binary file Graphics/CyborgGlow.tga has changed
Binary file Graphics/Glows.tga has changed
Binary file Graphics/InventoryDown.tga has changed
Binary file Graphics/InventoryOver.tga has changed
Binary file Graphics/InventoryUnselected.tga has changed
Binary file Graphics/Lines.tga has changed
Binary file Graphics/MacrosDown.tga has changed
Binary file Graphics/MacrosOver.tga has changed
Binary file Graphics/MacrosUnselected.tga has changed
Binary file Graphics/MapDown.tga has changed
Binary file Graphics/MapOver.tga has changed
Binary file Graphics/MapUnselected.tga has changed
Binary file Graphics/Mode1Down.tga has changed
Binary file Graphics/Mode1Over.tga has changed
Binary file Graphics/Mode1Selected.tga has changed
Binary file Graphics/Mode2Down.tga has changed
Binary file Graphics/Mode2Over.tga has changed
Binary file Graphics/Mode2Selected.tga has changed
Binary file Graphics/Mode3Down.tga has changed
Binary file Graphics/Mode3Over.tga has changed
Binary file Graphics/Mode3Selected.tga has changed
Binary file Graphics/ParchmentAndAllIcons.tga has changed
Binary file Graphics/ParchmentAndLeftSide.tga has changed
Binary file Graphics/QuestLogDown.tga has changed
Binary file Graphics/QuestLogOver.tga has changed
Binary file Graphics/QuestLogUnselected.tga has changed
Binary file Graphics/Slot.tga has changed
Binary file Graphics/SlotDown.tga has changed
Binary file Graphics/SlotLeft.tga has changed
Binary file Graphics/SlotMiddle.tga has changed
Binary file Graphics/SlotOver.tga has changed
Binary file Graphics/SlotRight.tga has changed
Binary file Graphics/SlotUp.tga has changed
Binary file Graphics/SpellbookDown.tga has changed
Binary file Graphics/SpellbookOver.tga has changed
Binary file Graphics/SpellbookUnselected.tga has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MainPage.xml	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,199 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<!--
+	Warcraft Plugin for Cyborg MMO7 
+	Filename: MainPage.xml
+	Description: Xml description of the MMO7 UI
+	Copyright (C) 2012 Mad Catz Inc.
+	Author: Christopher Hooks
+
+	This program is free software; you can redistribute it and/or
+	modify it under the terms of the GNU General Public License
+	as published by the Free Software Foundation; either version 2
+	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 General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. 
+	-->
+	
+	<!-- UIButtonsTemplate-->
+	<Button name="WowCallbackButtonsTemplate" virtual="true" inherits="IconTemplate">
+		<Scripts>
+			<OnLoad>
+				self = CallbackIcons.new(self);
+			</OnLoad>
+			<OnClick>
+				self.OnClick();
+			</OnClick>
+			<OnDragStart>
+				self.DragStart();
+			</OnDragStart>
+			<OnDragStop>
+				self.DragStop();
+			</OnDragStop>
+		</Scripts>
+	</Button>
+
+	<!-- The Main Form -->
+	<Frame name="MainPage" movable="true" enableMouse="true" clampedtoscreen="true" frameStrata="MEDIUM">
+		<TitleRegion>
+			<Size x="512" y="512"/>
+			<Anchors>
+				<Anchor point="LEFT">
+					<Offset>
+					  <AbsDimension x="0"
+									y="0" />
+					</Offset>
+				</Anchor>
+			</Anchors>
+		</TitleRegion>
+		<Size>
+			<AbsDimension x="512" y="512" />
+		</Size>
+		<Anchors>
+			<Anchor point="LEFT" relativeTo="UIParent">
+				<Offset>
+					<AbsDimension x="0" y="0" />
+				</Offset>
+			</Anchor>
+		</Anchors>
+		<Layers>
+			<Layer level="BACKGROUND">
+			<Texture name="BackgroundTexture"
+					   file="Interface\AddOns\CyborgMMO7\Graphics\ParchmentAndAllIcons.tga" >
+				<Size>
+				  <AbsDimension x="512"
+								y="512" />
+				</Size>
+				<Anchors>
+				  <Anchor point="TOPLEFT">
+					<Offset>
+					  <AbsDimension x="0"
+									y="0" />
+					</Offset>
+				  </Anchor>
+				</Anchors>
+			  </Texture>
+			</Layer>
+			<Layer level="ARTWORK">
+			<Texture name="RatCalloutsTexture"
+					   file="Interface\AddOns\CyborgMMO7\Graphics\Lines.tga" >
+
+				<Size>
+				  <AbsDimension x="512"
+								y="512" />
+				</Size>
+				<Anchors>
+				  <Anchor point="TOPLEFT">
+					<Offset>
+					  <AbsDimension x="0"
+									y="0" />
+					</Offset>
+				  </Anchor>
+				</Anchors>
+			  </Texture>
+			</Layer>
+		</Layers>
+		<Frames>
+			<Button name="CharacterPage" inherits="WowCallbackButtonsTemplate" resize="false">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="379" y="-411" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</Button>
+			<Button name="Inventory" inherits="WowCallbackButtonsTemplate">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="379" y="-446" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</Button>
+			<Button name="Spellbook" inherits="WowCallbackButtonsTemplate">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="414" y="-411" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</Button>
+			<Button name="Macros" inherits="WowCallbackButtonsTemplate">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="449" y="-446" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</Button>
+			<Button name="Achievement" inherits="WowCallbackButtonsTemplate">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="449" y="-411" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</Button>
+			<Button name="QuestLog" inherits="WowCallbackButtonsTemplate">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="344" y="-446" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</Button>
+			<Button name="Map" inherits="WowCallbackButtonsTemplate">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="414" y="-446" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</Button>
+			<Button name="$parentCloseButton">
+				<Size>
+					<AbsDimension x="23" y="24" />
+				</Size>
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="474" y="-8" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Scripts>
+					<OnClick>Close()</OnClick>
+				</Scripts>
+				<NormalTexture file="Interface\AddOns\CyborgMMO7\Graphics\CloseButton.tga"/>
+				<PushedTexture file="Interface\AddOns\CyborgMMO7\Graphics\CloseButtonDown.tga"/>
+				<HighlightTexture file="Interface\AddOns\CyborgMMO7\Graphics\CloseButtonOver.tga" alpha=".5"/>
+			</Button>
+			<Frame name="defaultPage" inherits="RatPageTemplate">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="0" y="0"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</Frame>
+		</Frames>
+		<Scripts>
+			<OnLoad>Loaded();</OnLoad>
+			<OnEvent>Event(this, event,...);</OnEvent>
+		</Scripts>
+	</Frame>
+</Ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OpenButtonPage.xml	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,185 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<!--
+	Warcraft Plugin for Cyborg MMO7 
+	Filename: OpenButtonPage.xml
+	Description: The Cyborg Head logo button which opens and closes the UI
+	Copyright (C) 2012 Mad Catz Inc.
+	Author: Christopher Hooks
+
+	This program is free software; you can redistribute it and/or
+	modify it under the terms of the GNU General Public License
+	as published by the Free Software Foundation; either version 2
+	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 General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. 
+	-->
+	<Frame name="OpenButtonPage" movable="true" clampedtoscreen="true" enableMouse="true" hidden="true">
+			<TitleRegion>
+				<Size x="75" y="75"/>
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="0" y="0" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</TitleRegion>
+			<Size>
+				<AbsDimension x="50" y="50" />
+			</Size>
+			<Anchors>
+				<Anchor point="LEFT" relativeTo="UIParent">
+					<Offset>
+						<AbsDimension x="0" y="0" />
+					</Offset>
+				</Anchor>
+			</Anchors>
+			<Frames>
+			<Button name="$parentOpenMainForm" clampedtoscreen="true" enableMouse="true" movable="true">
+			<Size>
+				<AbsDimension x="75" y="75" />
+			</Size>
+			<Anchors>
+				<Anchor point="TOPLEFT">
+					<Offset>
+						<AbsDimension x="16" y="-14" />
+					</Offset>
+				</Anchor>
+			</Anchors>
+			<Scripts>
+				<OnLoad>
+					self:RegisterForDrag("LeftButton","RightButton")
+				</OnLoad>
+				<OnClick>
+					Toggle();
+
+				</OnClick>
+				<OnDragStart>
+					self:StartMoving();
+					self.isMoving = true;
+				</OnDragStart>
+				<OnDragStop>
+					self:StopMovingOrSizing();
+					self.isMoving = false;
+				</OnDragStop>
+			</Scripts>
+
+			<NormalTexture file="Interface\AddOns\CyborgMMO7\Graphics\Cyborg.tga">
+				<Color r="0.0" g="0.0" b="0.0" a="1" />
+			</NormalTexture>
+
+			<HighlightTexture file="Interface\AddOns\CyborgMMO7\Graphics\CyborgGlow.tga">
+				<Color r=".38" g=".85" b="1.0" a="0.90" />
+			</HighlightTexture>
+			<ButtonText name="$parentText">
+				<FontHeight>
+				<AbsValue val="10" />
+			</FontHeight>
+			</ButtonText>
+				<NormalFont style="GameFontNormal" />
+				<HighlightFont style="GameFontHighlight" />
+				<DisabledFont style="GameFontDisable" />
+				<PushedTextOffset x="0" y="0" />
+			</Button>
+		</Frames>
+	</Frame>
+
+	<Frame name="CyborgMiniMapFrame" parent="Minimap" enableMouse="true" hidden="false" frameStrata="LOW">
+		<Size>
+			<AbsDimension x="32" y="32"/>
+		</Size>
+		<Anchors>
+			<Anchor point="TOPLEFT" relativeTo="Minimap" relativePoint="RIGHT">
+				<Offset>
+					<AbsDimension x="2" y="0"/>
+				</Offset>
+			</Anchor>
+		</Anchors>
+		<Frames>
+			<Button name="CyborgMiniMapButton">
+				<Size>
+					<AbsDimension x="33" y="33"/>
+				</Size>
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="0" y="0"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<HighlightTexture alphaMode="ADD" file="Interface\Minimap\UI-Minimap-ZoomButton-Highlight"/>
+				<Layers>
+					<Layer level="BACKGROUND">
+						<Texture name="CyborgMiniMapButton_Icon" file="Interface\AddOns\CyborgMMO7\Graphics\Cyborg.tga">
+							<Size>
+								<AbsDimension x="22" y="22"/>
+							</Size>
+							<Anchors>
+								<Anchor point="TOPLEFT">
+									<AbsDimension x="6" y="-5"/>
+								</Anchor>
+							</Anchors>
+							<Color r="0.0" g="0.0" b="0.0" a="1" />
+						</Texture>
+					</Layer>
+					<Layer level="ARTWORK">
+						<Texture name="CyborgMiniMapButton_IconGlow" file="Interface\AddOns\CyborgMMO7\Graphics\CyborgGlow.tga">
+							<Size>
+								<AbsDimension x="22" y="22"/>
+							</Size>
+							<Anchors>
+								<Anchor point="TOPLEFT">
+									<AbsDimension x="6" y="-5"/>
+								</Anchor>
+							</Anchors>
+							<Color r=".38" g=".85" b="1.0" a="0.90" />
+						</Texture>
+					</Layer>
+					<Layer level="OVERLAY">
+						<Texture file="Interface\Minimap\MiniMap-TrackingBorder">
+							<Size>
+								<AbsDimension x="56" y="56"/>
+							</Size>
+							<Anchors>
+								<Anchor point="TOPLEFT"/>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+				<Scripts>
+					<OnLoad>
+						self:RegisterForDrag("LeftButton","RightButton")
+					</OnLoad>
+					<OnMouseDown>
+					</OnMouseDown>
+					<OnMouseUp>
+						Toggle();
+						if(false == IsOpen()) then
+							RatQuickPage:Show();
+						end
+					 </OnMouseUp>
+					<OnEnter>
+						if(false == IsOpen()) then
+							RatQuickPage:Show();
+						end
+					</OnEnter>
+					<OnLeave>
+						RatQuickPage:Hide();
+					</OnLeave>
+					<OnUpdate>
+						if(self:IsDragging()) then
+							CyborgMiniMapButton_OnUpdate();
+						end
+					</OnUpdate>
+				</Scripts>
+			</Button>
+		</Frames>
+	</Frame>
+</Ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OptionPage.xml	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,325 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<!--
+	Warcraft Plugin for Cyborg MMO7 
+	Filename: OptionPage.xml
+	Description: The configuration page layout for the addons interface page
+	Copyright (C) 2012 Mad Catz Inc.
+	Author: Christopher Hooks
+
+	This program is free software; you can redistribute it and/or
+	modify it under the terms of the GNU General Public License
+	as published by the Free Software Foundation; either version 2
+	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 General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. 
+	-->
+	<FontString name="normalStringTemplate" font="Fonts\FRIZQT__.TTF" text="NoText" virtual="true">
+		<FontHeight>
+			<AbsValue val="10" />
+		</FontHeight>
+		<Color r="1" g="1" b="1" />
+		<Shadow>
+			<Color r="0" g="0" b="0" />
+			<Offset>
+				<AbsDimension x="1" y="-1" />
+			</Offset>
+		</Shadow>
+	</FontString>
+
+	<FontString name="SliderTitle" font="Fonts\FRIZQT__.TTF" text="NoText" virtual="true">
+		<FontHeight>
+			<AbsValue val="14" />
+		</FontHeight>
+		<Color r="1" g="0.8196079" b="0" />
+		<Shadow>
+			<Color r="0" g="0" b="0" />
+			<Offset>
+				<AbsDimension x="1" y="-1" />
+			</Offset>
+		</Shadow>
+	</FontString>
+
+
+
+	<Frame name="OptionPage">
+		<Layers>
+			<Layer level="ARTWORK">
+				<FontString name="$parentTitle" inherits="GameFontNormalLarge">
+					<Anchors>
+						<Anchor point="TOPLEFT">
+							<Offset>
+								<AbsDimension x="15" y="-15" />
+							</Offset>
+						</Anchor>
+					</Anchors>
+				</FontString>
+			</Layer>
+		</Layers>
+
+		<Frames>
+			<CheckButton name="MiniMapButton" inherits="UICheckButtonTemplate" checked="true">
+				<Size>
+					<AbsDimension x="32" y="32"/>
+				</Size>
+				<Anchors>
+					<Anchor point="TOPLEFT" relativeTo="$parentTitle">
+						<Offset>
+							<AbsDimension x="25" y="-60"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer>
+						<FontString name="$parentTitle" font="Fonts\FRIZQT__.TTF" inherits="SliderTitle">
+							<Anchors>
+								<Anchor point="LEFT" relativePoint="$parentMiniMapButton">
+									<Offset>
+										<AbsDimension x="45" y="0" />
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</FontString>
+					</Layer>
+				</Layers>
+				<Scripts>
+					<OnLoad>
+						LoadStrings(getglobal(self:GetName().."Title"));
+					</OnLoad>
+					<OnClick>
+						if(self:GetChecked() == 1) then
+							SetMiniMapButton(true)
+						else
+							SetMiniMapButton(false)
+						end
+					</OnClick>
+				</Scripts>
+			</CheckButton>
+
+
+			<CheckButton name="CyborgButton" inherits="UICheckButtonTemplate" checked="true">
+				<Size>
+					<AbsDimension x="32" y="32"/>
+				</Size>
+				<Anchors>
+					<Anchor point="TOPLEFT" relativeTo="$parentTitle">
+						<Offset>
+							<AbsDimension x="25" y="-85"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer>
+						<FontString name="$parentTitle" font="Fonts\FRIZQT__.TTF" inherits="SliderTitle">
+							<Anchors>
+								<Anchor point="LEFT" relativePoint="$parentCyborgButton">
+									<Offset>
+										<AbsDimension x="45" y="0" />
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</FontString>
+					</Layer>
+				</Layers>
+				<Scripts>
+					<OnLoad>
+						LoadStrings(getglobal(self:GetName().."Title"));
+					</OnLoad>
+					<OnClick>
+						if(self:GetChecked() == 1) then
+							SetCyborgHeadButton(true)
+						else
+							SetCyborgHeadButton(false)
+						end
+					</OnClick>
+				</Scripts>
+			</CheckButton>
+
+			<Button name="$parentSetDefaults">
+				<Size>
+					<AbsDimension x="156" y="28" />
+				</Size>
+				<Anchors>
+				  <Anchor point="TOPLEFT" relativeTo="$parentTitle">>
+					<Offset>
+						<AbsDimension x="25" y="-220"/>
+					</Offset>
+				  </Anchor>
+				</Anchors>
+				<NormalTexture file="Interface\Buttons\UI-Panel-Button-Up">
+					<TexCoords left="0" right="0.625" top="0" bottom="0.6875" />
+				</NormalTexture>
+				<PushedTexture file="Interface\Buttons\UI-Panel-Button-Down">
+					<TexCoords left="0" right="0.625" top="0" bottom="0.6875" />
+				</PushedTexture>
+				<DisabledTexture file="Interface\Buttons\UI-Panel-Button-Disabled">
+					<TexCoords left="0" right="0.625" top="0" bottom="0.6875" />
+				</DisabledTexture>
+				<HighlightTexture file="Interface\Buttons\UI-Panel-Button-Highlight" alphaMode="ADD">
+					<TexCoords left="0" right="0.625" top="0" bottom="0.6875" />
+				</HighlightTexture>
+				<ButtonText name="$parentText">
+					<FontHeight>
+						<AbsValue val="10" />
+					</FontHeight>
+				</ButtonText>
+				<NormalFont style="GameFontNormal" />
+				<HighlightFont style="GameFontHighlight" />
+				<DisabledFont style="GameFontDisable" />
+				<Scripts>
+					<OnLoad>
+						LoadStrings(getglobal(self:GetName()));
+					</OnLoad>
+					<OnClick>
+						SetDefaultSettings();
+					</OnClick>
+				</Scripts>
+			</Button>
+
+			<Frame name="CyborgSize">
+				<Size>
+					<AbsDimension x="198" y="60" />
+				</Size>
+				<Anchors>
+					<Anchor point="TOPLEFT" relativeTo="$parentTitle">
+						<Offset>
+							<AbsDimension x="25" y="-120"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Frames>
+					<Slider name="$parentSlider" enableMouse="true" minValue=".5" maxValue="1" defaultValue=".75" valueStep=".01" orientation="HORIZONTAL">
+						<Size>
+							<AbsDimension x="128" y="17" />
+						</Size>
+						<Anchors>
+							<Anchor point="LEFT" />
+							<Anchor point="RIGHT" />
+						</Anchors>
+						<Backdrop bgFile="Interface\Buttons\UI-SliderBar-Background" edgeFile="Interface\Buttons\UI-SliderBar-Border" tile="true">
+							<BackgroundInsets>
+								<AbsInset left="3" right="3" top="6" bottom="6" />
+							</BackgroundInsets>
+							<TileSize>
+								<AbsValue val="8" />
+							</TileSize>
+							<EdgeSize>
+								<AbsValue val="8" />
+							</EdgeSize>
+						</Backdrop>
+						<Layers>
+							<Layer>
+								<FontString name="$parentTitle" font="Fonts\FRIZQT__.TTF" inherits="SliderTitle">
+									<Anchors>
+										<Anchor point="BOTTOM" relativePoint="TOP" />
+									</Anchors>
+								</FontString>
+								<FontString name="$parentLow" font="Fonts\FRIZQT__.TTF" inherits="normalStringTemplate" text="50%">
+									<Anchors>
+										<Anchor point="TOPLEFT" relativePoint="BOTTOMLEFT" />
+									</Anchors>
+								</FontString>
+								<FontString name="$parentHigh" font="Fonts\FRIZQT__.TTF" inherits="normalStringTemplate" text="100%">
+									<Anchors>
+										<Anchor point="TOPRIGHT" relativePoint="BOTTOMRIGHT" />
+									</Anchors>
+								</FontString>
+							</Layer>
+						</Layers>
+						<ThumbTexture name="$parentThumb" file="Interface\Buttons\UI-SliderBar-Button-Horizontal">
+							<Size>
+								<AbsDimension x="32" y="32" />
+							</Size>
+						</ThumbTexture>
+						<Scripts>
+							<OnLoad>
+								LoadStrings(getglobal(self:GetName().."Title"))
+							</OnLoad>
+							<OnValueChanged>SetOpenButtonSize(self:GetValue())</OnValueChanged>
+						</Scripts>
+					</Slider>
+				</Frames>
+			</Frame>
+			<Frame name="PluginSize">
+				<Size>
+					<AbsDimension x="198" y="60" />
+				</Size>
+				<Anchors>
+					<Anchor point="TOPLEFT" relativeTo="$parentTitle">
+						<Offset>
+							<AbsDimension x="25" y="-165"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Frames>
+					<Slider name="$parentSlider" enableMouse="true" minValue=".5" maxValue="1" defaultValue=".75" valueStep=".01" orientation="HORIZONTAL">
+						<Size>
+							<AbsDimension x="128" y="17" />
+						</Size>
+						<Anchors>
+							<Anchor point="LEFT" />
+							<Anchor point="RIGHT" />
+						</Anchors>
+						<Backdrop bgFile="Interface\Buttons\UI-SliderBar-Background" edgeFile="Interface\Buttons\UI-SliderBar-Border" tile="true">
+							<BackgroundInsets>
+								<AbsInset left="3" right="3" top="6" bottom="6" />
+							</BackgroundInsets>
+							<TileSize>
+								<AbsValue val="8" />
+							</TileSize>
+							<EdgeSize>
+								<AbsValue val="8" />
+							</EdgeSize>
+						</Backdrop>
+						<Layers>
+							<Layer>
+								<FontString name="$parentTitle" font="Fonts\FRIZQT__.TTF" inherits="SliderTitle">
+									<Anchors>
+										<Anchor point="BOTTOM" relativePoint="TOP" />
+									</Anchors>
+								</FontString>
+								<FontString name="$parentLow" font="Fonts\FRIZQT__.TTF" inherits="normalStringTemplate" text="50%">
+									<Anchors>
+										<Anchor point="TOPLEFT" relativePoint="BOTTOMLEFT" />
+									</Anchors>
+								</FontString>
+								<FontString name="$parentHigh" font="Fonts\FRIZQT__.TTF" inherits="normalStringTemplate" text="100%">
+									<Anchors>
+										<Anchor point="TOPRIGHT" relativePoint="BOTTOMRIGHT" />
+									</Anchors>
+								</FontString>
+							</Layer>
+						</Layers>
+						<ThumbTexture name="$parentThumb" file="Interface\Buttons\UI-SliderBar-Button-Horizontal">
+							<Size>
+								<AbsDimension x="32" y="32" />
+							</Size>
+						</ThumbTexture>
+						<Scripts>
+							<OnLoad>
+								LoadStrings(getglobal(self:GetName().."Title"));
+							</OnLoad>
+							<OnValueChanged>
+								SetMainPageSize(self:GetValue())
+							</OnValueChanged>
+						</Scripts>
+					  </Slider>
+				</Frames>
+			</Frame>
+		</Frames>
+
+		<Scripts>
+			<OnLoad>
+				LoadStrings(getglobal(self:GetName().."Title"));
+				msg("Loaded Option Page");
+				self = OptionView.new(self);
+			</OnLoad>
+		</Scripts>
+	</Frame>
+</Ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OptionView.lua	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,28 @@
+--~ Warcraft Plugin for Cyborg MMO7 
+--~ Filename: OptionView.lua
+--~ Description: The code for the Option page in the UI, not much here because we dont have many options. Probably could refactor.
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ 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 General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+OptionView = {
+	new = function(self)
+        self.name = "Cyborg MMO7 Plugin"
+        InterfaceOptions_AddCategory(self);
+		return self
+
+	end
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RatPage.xml	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,481 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<!--
+	Warcraft Plugin for Cyborg MMO7 
+	Filename: RatPage.xml
+	Description: Layout and description of the command slots for the mouse.
+	Copyright (C) 2012 Mad Catz Inc.
+	Author: Christopher Hooks
+
+	This program is free software; you can redistribute it and/or
+	modify it under the terms of the GNU General Public License
+	as published by the Free Software Foundation; either version 2
+	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 General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. 
+	-->
+	<!-- IconTemplate-->
+	<Button name="IconTemplate" virtual="true" inherits="SecureActionButtonTemplate">
+		<Size>
+			<AbsDimension x="32" y="32"/>
+		</Size>
+		<Layers>
+			<Layer level="OVERLAY">
+				<Texture name="$parentIcon"/>
+				</Layer>
+				<Layer level="ARTWORK">
+				<FontString name="$parentHotKey" inherits="NumberFontNormalSmallGray" justifyH="RIGHT">
+				  <Size>
+					<AbsDimension x="32" y="10"/>
+				  </Size>
+				  <Anchors>
+					<Anchor point="TOPLEFT">
+					  <Offset>
+						<AbsDimension x="-2" y="-2"/>
+					  </Offset>
+					</Anchor>
+				  </Anchors>
+				</FontString>
+			</Layer>
+		</Layers>
+		<PushedTexture file="Interface\Buttons\UI-Quickslot-Depress"/>
+		<HighlightTexture alphaMode="ADD" file="Interface\Buttons\ButtonHilight-Square"/>
+	</Button>
+
+	<Button name="SlotTemplate" inherits="IconTemplate" virtual="true">
+		<Scripts>
+			<OnLoad>
+				self = SlotView.new(self);
+			</OnLoad>
+			<OnMouseDown>
+				if(button == "LeftButton") then
+					self.Clicked();
+				end
+			</OnMouseDown>
+
+		</Scripts>
+	</Button>
+
+
+
+	<Button name="ModeTemplate" virtual="true">
+		<Size>
+			<AbsDimension x="127" y="63" />
+		</Size>
+
+		<ButtonText name="$parentText">
+			<FontHeight>
+				<AbsValue val="10" />
+			</FontHeight>
+		</ButtonText>
+		<NormalFont style="GameFontNormal" />
+		<HighlightFont style="GameFontHighlight" />
+		<DisabledFont style="GameFontDisable" />
+		<Scripts>
+			<OnLoad>
+				self = ModeView.new(self);
+			</OnLoad>
+			<OnClick>
+				self.Clicked();
+			</OnClick>
+		</Scripts>
+	</Button>
+
+	<!-- The Rat Page Frame -->
+	<Frame name="RatPageTemplate" virtual="true">
+		<Size>
+			<AbsDimension x="512" y="512"/>
+		</Size>
+		<Anchors>
+			<Anchor point="TOPLEFT">
+				<Offset>
+					<AbsDimension x="0" y="-0"/>
+				</Offset>
+			</Anchor>
+		</Anchors>
+		<!-- Our Slot Locations -->
+		<Frames>
+			<CheckButton name="$parentSlot1" inherits="SlotTemplate" id="1">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="68" y="-116" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\Slot.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<CheckButton name="$parentSlot2" inherits="SlotTemplate" id="2">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="68" y="-153"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\Slot.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<CheckButton name="$parentSlot3" inherits="SlotTemplate" id="3">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="68" y="-189" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\Slot.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<CheckButton name="$parentSlot4" inherits="SlotTemplate" id="4">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="68" y="-238" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\SlotUp.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<CheckButton name="$parentSlot5" inherits="SlotTemplate" id="5">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="68" y="-273" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\SlotMiddle.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<CheckButton name="$parentSlot6" inherits="SlotTemplate" id="6">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="68" y="-308" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\SlotDown.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<CheckButton name="$parentSlot7" inherits="SlotTemplate" id="7">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="33" y="-273"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\SlotLeft.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<CheckButton name="$parentSlot8" inherits="SlotTemplate" id="8">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="103" y="-273"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\SlotRight.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<CheckButton name="$parentSlot9" inherits="SlotTemplate" id="9">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="68" y="-356"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\Slot.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<CheckButton name="$parentSlot10" inherits="SlotTemplate" id="10">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="68" y="-393"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\Slot.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<CheckButton name="$parentSlot11" inherits="SlotTemplate" id="11">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="68" y="-429"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\Slot.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<CheckButton name="$parentSlot12" inherits="SlotTemplate" id="12">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="50" y="-68"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\SlotLeft.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<CheckButton name="$parentSlot13" inherits="SlotTemplate" id="13">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="86" y="-68" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+				<Layers>
+					<Layer level="ARTWORK">
+						<Texture name="$parentText" file="Interface\AddOns\CyborgMMO7\Graphics\SlotRight.tga">
+							<Size>
+								<AbsDimension x="33" y="33"/>
+							</Size>
+							<Anchors>
+								<Anchor point="CENTER">
+									<Offset>
+										<AbsDimension x="0" y="0"/>
+									</Offset>
+								</Anchor>
+							</Anchors>
+						</Texture>
+					</Layer>
+				</Layers>
+			</CheckButton>
+			<Button name="Mode1" inherits="ModeTemplate" id="1">
+				<NormalTexture file="Interface\AddOns\CyborgMMO7\Graphics\Mode1Down.tga" >
+				</NormalTexture>
+				<PushedTexture file="Interface\AddOns\CyborgMMO7\Graphics\Mode1Selected.tga">
+				</PushedTexture>
+				<HighlightTexture file="Interface\AddOns\CyborgMMO7\Graphics\Mode1Over.tga">
+				</HighlightTexture>
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="384" y="-33" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</Button>
+			<Button name="Mode2" inherits="ModeTemplate" id="2">
+				<NormalTexture file="Interface\AddOns\CyborgMMO7\Graphics\Mode2Down.tga" >
+				</NormalTexture>
+				<PushedTexture file="Interface\AddOns\CyborgMMO7\Graphics\Mode2Selected.tga">
+				</PushedTexture>
+				<HighlightTexture file="Interface\AddOns\CyborgMMO7\Graphics\Mode2Over.tga">
+				</HighlightTexture>
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="384" y="-33" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</Button>
+			<Button name="Mode3" inherits="ModeTemplate" id="3">
+				<NormalTexture file="Interface\AddOns\CyborgMMO7\Graphics\Mode3Down.tga" >
+				</NormalTexture>
+				<PushedTexture file="Interface\AddOns\CyborgMMO7\Graphics\Mode3Selected.tga">
+				</PushedTexture>
+				<HighlightTexture file="Interface\AddOns\CyborgMMO7\Graphics\Mode3Over.tga">
+				</HighlightTexture>
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="384" y="-33" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</Button>
+		</Frames>
+		<Scripts>
+			<OnLoad>
+				self = RatPageView.new(self);
+			</OnLoad>
+		</Scripts>
+	</Frame>
+</Ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RatPageController.lua	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,86 @@
+--~ Warcraft Plugin for Cyborg MMO7 
+--~ Filename: RatPageController.lua
+--~ Description: Controller logic for the RatPage
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ 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 General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+RatPageController = {
+	new = function()
+		local self = {};
+		RatPageModel.Instance().SetMode(1);
+
+		self.SlotClicked = function(slot)
+			local slotObject = nil
+			slotObject = RatPageModel.Instance().GetObjectOnButton(slot.Id)
+			RatPageModel.Instance().SetObjectOnButton(slot.Id, RatPageModel.Instance().GetMode(), self.GetCursorObject());
+
+			if(slotObject ~= nil) then
+				slotObject.Pickup();
+			end
+
+		end
+
+		self.ModeClicked = function(mode)
+			msg("Setting mode "..tostring(mode.Id));
+			RatPageModel.Instance().SetMode(mode.Id);
+		end
+
+		self.GetCursorObject = function()
+			local cursorObject = nil;
+			if(nil ~= GetCursorInfo()) then
+				local type, detail, subdetail = GetCursorInfo();
+				cursorObject = WowObject.Create(type, detail, subdetail);
+				ClearCursor();
+			end
+			return cursorObject;
+		end
+		
+		self.CallbackDropped = function(callbackObject)
+			local slot = nil;
+			local observers = RatPageModel.Instance().GetAllObservers();
+			for i = 1, (# observers) do
+				if(MouseIsOver(observers[i])) then
+					slot = observers[i];
+					break;
+				end
+			end
+			if(nil ~= slot) then 
+				RatPageModel.Instance().SetObjectOnButton(slot.Id, RatPageModel.Instance().GetMode(), callbackObject.wowObject);
+			end
+		end
+		
+		
+
+		self.Close = function()
+
+		end
+
+		self.Open = function()
+		end
+
+		return self;
+	end,
+
+	m_Instance = nil,
+
+	Instance = function()
+		if(nil == RatPageController.m_Instance) then
+			RatPageController.m_Instance = RatPageController.new();
+		end
+		return RatPageController.m_Instance;
+	end
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RatPageModel.lua	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,157 @@
+--~ Warcraft Plugin for Cyborg MMO7 
+--~ Filename: RatPageModel.lua
+--~ Description: Code model of the MMO7 mouse
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ 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 General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+-- Constants --
+
+local RAT7 = { BUTTONS = 13, MODES = 3, SHIFT = 0}
+
+local MIDDLEMOUSE = 1;
+
+RatPageModel = {
+	new = function()
+	local self = {}
+		self.m_Mode = 1;
+		self.ObserverCount = 0;
+		self.ObserverList = {}
+		self.Data = {}
+
+		for i = 1,RAT7.MODES do
+			self.Data[i] = {}
+			for j = 1, RAT7.BUTTONS do
+				self.Data[i][j] = {};
+			end
+		end
+
+		self.InitSaveData = function(data)
+			for i = 1,RAT7.MODES do
+				if (nil == data["Rat"][i]) then
+					data["Rat"][i] = {}
+				end
+				for j = 1, RAT7.BUTTONS do
+					if (nil == data["Rat"][i][j]) then
+						data["Rat"][i][j] = {}
+					end
+				end
+			end
+		end
+
+
+		self.LoadData = function()
+			msg("Loading...")
+			local data = GetSaveData();
+
+
+			if (nil == data["Rat"]) then
+				data["Rat"] = {}
+				self.InitSaveData(data);
+			end
+
+			self.Data = data["Rat"]
+			if(data ~= nil) then
+				for mode = 1,RAT7.MODES do
+					for button = 1, RAT7.BUTTONS do
+						if(self.Data[mode][button] ~= nil) then
+							object = WowObject.Create(self.Data[mode][button].Type, self.Data[mode][button].Detail, self.Data[mode][button].Subdetail);
+							self.SetObjectOnButtonNoUpdate(button, mode, object);
+						else
+							object = WowObject.Create("", "", "");
+							self.SetObjectOnButtonNoUpdate(button, mode, object);
+							self.Data[mode][button] = object;
+						end
+					end
+				end
+				self.UpdateObservers();
+			end
+		end
+
+		self.SaveData = function()
+			msg("Saving...")
+			SetSaveData(self.Data, "Rat");
+		end
+
+		self.SetMode = function(mode)
+			self.m_Mode = mode;
+			self.UpdateObservers();
+		end
+
+		self.GetMode = function()
+			return self.m_Mode;
+		end
+
+		self.GetData = function()
+			return self.Data, self.m_Mode;
+		end
+
+		self.GetObjectOnButton = function(button)
+			if(nil == self.Data[self.m_Mode][button]) then
+				return nil;
+			else
+				return self.Data[self.m_Mode][button]
+			end
+		end
+
+		self.SetObjectOnButtonNoUpdate = function(button, mode, object)
+			--msg("button = "..tostring(button).." mode = "..tostring(mode))
+			self.Data[mode][button] = object;
+
+			if(nil ~= object) then
+				object.SetBinding(WowCommands[GetLocale()][((mode-1)*RAT7.BUTTONS)+button]);
+				if("callback" == object.Type) then
+					msg("trying to set texture")
+					local slot = getglobal("defaultPageSlot"..button);
+					slot:SetNormalTexture(object.Texture)
+				end
+			else
+				msg("clearing "..button)
+				WowObject.ClearBinding(WowCommands[GetLocale()][((mode-1)*RAT7.BUTTONS)+button])
+			end
+		end
+
+		self.SetObjectOnButton = function(button, mode, object)
+			self.SetObjectOnButtonNoUpdate(button, mode, object);
+			self.UpdateObservers()
+		end
+
+		self.AddObserver = function(view)
+			table.insert(self.ObserverList,view)
+			self.observerCount = # self.ObserverList
+		end
+		
+		self.GetAllObservers = function()
+			return self.ObserverList;
+		end
+
+		self.UpdateObservers = function()
+			for i = 1, (# self.ObserverList) do
+				self.ObserverList[i].Update(self.Data, self.m_Mode)
+			end
+			self.SaveData()
+		end
+	return self;
+	end,
+
+	m_Instance = nil,
+
+	Instance = function()
+		if(nil == RatPageModel.m_Instance) then
+			RatPageModel.m_Instance = RatPageModel.new();
+		end
+		return RatPageModel.m_Instance;
+	end
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RatPageView.lua	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,157 @@
+--~ Warcraft Plugin for Cyborg MMO7 
+--~ Filename: RatPageView.lua
+--~ Description: Interaction logic for the RatPage
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ 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 General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+RatPageView = {
+	new = function(self)
+		msg("new Rat Page View");
+		for _, child in ipairs(self:GetChildren()) do
+			child.Register();
+		end
+		
+		self.SlotClicked = function(slot)
+			msg("View Recieved Click")
+			RatPageController.Instance().SlotClicked(slot)
+		end
+
+		self.ModeClicked = function(mode)
+			msg("View Recieved Click")
+			RatPageController.Instance().ModeClicked(mode)
+		end
+
+		self.RegisterMode = function()
+			msg("ModeRegistered")
+		end
+
+		self.RegisterSlot = function()
+			msg("SlotRegistered")
+		end
+		return self;
+	end
+}
+
+RatQuickPageView = {
+	new = function(self)
+		for _, child in ipairs(self:GetChildren()) do
+			child.Register();
+		end
+
+		self.SlotClicked = function(slot)
+			RatPageController.Instance().SlotClicked(slot)
+		end
+
+		return self;
+	end
+}
+
+-- Slot Class --
+SlotView = {
+	new = function(self, parent)
+		self._assignedWowObject = nil;
+		self:RegisterForClicks("LeftButtonUp", "RightButtonUp");
+		self.Id = self:GetID();
+		RatPageModel.Instance().AddObserver(self);
+		self.UnCheckedTexture = self:GetNormalTexture();
+
+		-- Object Method --
+		self.Clicked = function()
+			self:GetParent().SlotClicked(self)
+
+			GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
+			--GameTooltip:SetText(self:GetID());
+		end
+
+		self.Update = function(data, activeMode)
+			local icon = _G[self:GetName().."Icon"];
+			if(nil ~= data[activeMode][self.Id]) then
+				self:SetChecked(true);
+				icon:SetTexture(data[activeMode][self.Id].Texture);
+			else
+				icon:SetTexture(nil);
+				self:SetChecked(false);
+			end
+
+
+		end
+
+		return self;
+	end,
+}
+
+SlotMiniView = {
+	new = function(self, parent)
+		self._assignedWowObject = nil;
+		self.Id = self:GetID();
+		RatPageModel.Instance().AddObserver(self);
+		self.UnCheckedTexture = self:GetNormalTexture();
+
+		self.Update = function(data, activeMode)
+			local icon = _G[self:GetName().."Icon"];
+			if(nil ~= data[activeMode][self.Id]) then
+				self:SetChecked(true);
+
+				icon:SetTexture(data[activeMode][self.Id].Texture);
+				icon:SetAlpha(.5);
+			else
+				icon:SetTexture(nil);
+				self:SetChecked(false);
+			end
+		end
+
+		return	self;
+	end
+}
+
+
+-- ModeButton --
+ModeView = {
+	new = function(self)
+	self.Id = self:GetID();
+	self.Name = self:GetName();
+	RatPageModel.Instance().AddObserver(self);
+	if(self.Id ~= 1) then
+		self:Hide()
+	end
+
+		self.Clicked = function()
+			local nextMode;
+			if(self.Id == 1) then
+				nextMode = getglobal("Mode2");
+			else
+				if(self.Id == 2) then
+					nextMode = getglobal("Mode3");
+				else
+					nextMode = getglobal("Mode1");
+				end
+			end
+			self:GetParent().ModeClicked(nextMode)
+		end
+
+		self.Update = function(data, activeMode)
+			if(self.Id == activeMode) then
+				self:Show()
+			else
+				self:Hide()
+			end
+
+		end
+
+	return self;
+	end
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RatQuickPage.xml	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,230 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<!--
+	Warcraft Plugin for Cyborg MMO7 
+	Filename: RatQuickPage.xml
+	Description: The mouse over reminder page for the commands.
+	Copyright (C) 2012 Mad Catz Inc.
+	Author: Christopher Hooks
+
+	This program is free software; you can redistribute it and/or
+	modify it under the terms of the GNU General Public License
+	as published by the Free Software Foundation; either version 2
+	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 General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program; if not, write to the Free Software
+	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. 
+	-->
+	<!-- IconTemplate-->
+	<Button name="SmallIconTemplate" virtual="true">
+		<Size>
+			<AbsDimension x="16.5" y="16.5"/>
+		</Size>
+		<Layers>
+			<Layer level="OVERLAY">
+				<Texture name="$parentIcon"/>
+				</Layer>
+				<Layer level="ARTWORK">
+				<FontString name="$parentHotKey" inherits="NumberFontNormalSmallGray" justifyH="RIGHT">
+				  <Size>
+					<AbsDimension x="32" y="10"/>
+				  </Size>
+				  <Anchors>
+					<Anchor point="TOPLEFT">
+					  <Offset>
+						<AbsDimension x="-2" y="-2"/>
+					  </Offset>
+					</Anchor>
+				  </Anchors>
+				</FontString>
+			</Layer>
+		</Layers>
+		<PushedTexture file="Interface\Buttons\UI-Quickslot-Depress"/>
+		<HighlightTexture alphaMode="ADD" file="Interface\Buttons\ButtonHilight-Square"/>
+	</Button>
+
+	<Button name="SmallSlotTemplate" inherits="SmallIconTemplate" virtual="true">
+		<Scripts>
+			<OnLoad>
+				self = SlotMiniView.new(self);
+			</OnLoad>
+			<OnClick>
+				self.Clicked();
+			</OnClick>
+		</Scripts>
+	</Button>
+
+	<!-- The Rat Page Frame -->
+	<Frame name="RatQuickPage" hidden="true">
+		<Size>
+			<AbsDimension x="256" y="256" />
+		</Size>
+		<Anchors>
+			<Anchor point="CENTER" relativeTo="UIParent">
+				<Offset>
+					<AbsDimension x="0" y="0" />
+				</Offset>
+			</Anchor>
+		</Anchors>
+		<Layers>
+			<Layer level="BACKGROUND">
+			<Texture name="BackgroundTexture" file="Interface\AddOns\CyborgMMO7\Graphics\ParchmentAndLeftSide.tga">
+				<Size>
+				  <AbsDimension x="256" y="256" />
+				</Size>
+				<Anchors>
+				  <Anchor point="CENTER">
+					<Offset>
+					  <AbsDimension x="0" y="0" />
+					</Offset>
+				  </Anchor>
+				</Anchors>
+			  </Texture>
+			</Layer>
+			<Layer level="ARTWORK">
+			<Texture name="RatCalloutsTexture" file="Interface\AddOns\CyborgMMO7\Graphics\Lines.tga">
+				<Size>
+					<AbsDimension x="256" y="256" />
+				</Size>
+				<Anchors>
+				  <Anchor point="TOPLEFT">
+					<Offset>
+					  <AbsDimension x="0" y="0" />
+					</Offset>
+				  </Anchor>
+				</Anchors>
+			  </Texture>
+			</Layer>
+		</Layers>
+		<!-- Our Slot Locations -->
+		<Frames>
+			<CheckButton name="$parentSlot1" inherits="SmallSlotTemplate" id="1">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="34" y="-58" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+			<CheckButton name="$parentSlot2" inherits="SmallSlotTemplate" id="2">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="34" y="-76"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+			<CheckButton name="$parentSlot3" inherits="SmallSlotTemplate" id="3">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="34" y="-94" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+			<CheckButton name="$parentSlot4" inherits="SmallSlotTemplate" id="4">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="34" y="-119" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+			<CheckButton name="$parentSlot5" inherits="SmallSlotTemplate" id="5">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="34" y="-136" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+			<CheckButton name="$parentSlot6" inherits="SmallSlotTemplate" id="6">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="34" y="-153" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+			<CheckButton name="$parentSlot7" inherits="SmallSlotTemplate" id="7">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="16.5" y="-136"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+			<CheckButton name="$parentSlot8" inherits="SmallSlotTemplate" id="8">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="52.5" y="-136"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+			<CheckButton name="$parentSlot9" inherits="SmallSlotTemplate" id="9">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="34" y="-180"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+			<CheckButton name="$parentSlot10" inherits="SmallSlotTemplate" id="10">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="34" y="-197"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+			<CheckButton name="$parentSlot11" inherits="SmallSlotTemplate" id="11">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="34" y="-214"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+			<CheckButton name="Slot12" inherits="SmallSlotTemplate" id="12">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="24" y="-33"/>
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+			<CheckButton name="$parentSlot13" inherits="SmallSlotTemplate" id="13">
+				<Anchors>
+					<Anchor point="TOPLEFT">
+						<Offset>
+							<AbsDimension x="44" y="-33" />
+						</Offset>
+					</Anchor>
+				</Anchors>
+			</CheckButton>
+		</Frames>
+		<Scripts>
+			<OnLoad>
+				RatQuickPageView.new(self);
+			</OnLoad>
+		</Scripts>
+	</Frame>
+</Ui>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WowObjects.lua	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,443 @@
+--~ Warcraft Plugin for Cyborg MMO7 
+--~ Filename: WowObjects.lua
+--~ Description: Warcraft in game object models
+--~ Copyright (C) 2012 Mad Catz Inc.
+--~ Author: Christopher Hooks
+
+--~ This program is free software; you can redistribute it and/or
+--~ modify it under the terms of the GNU General Public License
+--~ as published by the Free Software Foundation; either version 2
+--~ 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 General Public License for more details.
+
+--~ You should have received a copy of the GNU General Public License
+--~ along with this program; if not, write to the Free Software
+--~ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+WowObject = {
+	new = function(type, detail, subdetail)
+		local self = {};
+		self.Texture = nil;
+		self.Name = "NoName";
+		self.Type = type;
+		self.Detail = detail;
+		self.Subdetail = subdetail;
+
+
+		-- Methods --
+		self.DoAction = function()
+			msg("Nothing To Do");
+		end
+
+		self.Pickup = function()
+			msg("Pick up Item");
+		end
+
+		self.SetBinding = function(key)
+		end
+
+		self.PlaySound = function()
+			PlaySound("igAbilityIconDrop");
+		end
+
+		return self;
+	end,
+
+	ClearBinding = function(key)
+		local buttonFrame, parentFrame, name = CallbackFactory.Instance().AddCallback(WowObject.DoNothing);
+		if(1 ~= SetOverrideBindingClick(parentFrame, true, key, name, "LeftButton")) then
+			msg("Failed to bind companion to button click");
+		end
+	end,
+
+	DoNothing = function()
+	end,
+
+	Load = function(object)
+		if("item" == type) then
+			object = WowItem.Load(Object)
+		elseif("macro" == type) then
+			object = WowMacro.Load(object)
+		elseif("spell" == type) then
+			object = WowSpell.Load(object)
+		elseif("petaction" == type) then
+			object = WowSpell.Load(object)
+		--elseif("merchant"== type) then
+			--object = SlotMerchant.new(detail,subdetail)
+		elseif("companion" == type) then
+			object = WowCompanion.Load(object)
+		elseif("equipmentset" == type) then
+			object = WowEquipmentSet.Load(object)
+		else
+			object = WowObject.new(type,detail, subdetail)
+		end
+		return object;
+	end,
+
+	-- Static Methods --
+	Create = function(objectType, detail, subdetail)
+		local object;
+		if("item" == objectType) then
+			object = WowItem.new(detail,subdetail)
+		elseif("macro" == objectType) then
+			object = WowMacro.new(detail)
+		elseif("spell" == objectType) then
+			object = WowSpell.new(objectType, detail,subdetail)
+		elseif("petaction" == objectType) then
+			object = WowSpell.new(objectType, detail,subdetail)
+		elseif("merchant"== objectType) then
+			object = SlotMerchant.new(detail,subdetail)
+		elseif("companion" == objectType) then
+			object = WowCompanion.new(detail,subdetail)
+		elseif("equipmentset" == objectType) then
+			object = WowEquipmentSet.new(objectType,detail,subdetail)
+		elseif("callback" == objectType) then
+			object = WowCallback.new(detail);
+		else
+			object = WowObject.new(objectType,detail, subdetail)
+		end
+
+		return object;
+	end
+}
+
+local CallbackCursor = nil;
+
+CallbackIcons = {
+	new = function(self)
+		self.point, self.relativeTo, self.relativePoint, self.xOfs, self.yOfs = self:GetPoint();
+		--self:SetPoint(self.point, self.relativeTo, self.relativePoint, self.xOfs, self.yOfs);
+		self.strata = self:GetFrameStrata();
+		self.wowObject = WowCallback.new(self:GetName());
+		self.wowObject.SetTextures(self);
+		self:RegisterForDrag("LeftButton","RightButton")
+		self:SetResizable(false);
+		
+		self.OnClick = function()
+			self.wowObject.DoAction();
+		end
+		
+		
+		self.DragStart = function()
+			self:SetMovable(true);
+			self:StartMoving();
+			self.isMoving = true;
+			self:SetFrameStrata("TOOLTIP")
+		end
+		
+		self.DragStop = function()
+		
+			self:SetFrameStrata(self.strata);
+			self.isMoving = false;
+			self:SetMovable(false);
+			self:StopMovingOrSizing();
+
+			self:ClearAllPoints();
+			self:SetPoint(self.point, self.relativeTo, self.relativePoint, self.xOfs, self.yOfs);
+			local x, y  = GetCursorPosition();
+			RatPageController.Instance().CallbackDropped(self)
+		end
+		
+		return self;
+	end
+}
+
+WowCallback = {
+	new = function(callbackName)
+		local self = WowObject.new("callback", callbackName, "");
+		self.CallbackName = callbackName;
+		self.Texture = "Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.CallbackName.."Unselected.tga"
+		
+		self.SetTextures = function(buttonFrame)
+			buttonFrame:SetNormalTexture("Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.CallbackName.."Unselected.tga")
+			buttonFrame:SetPushedTexture("Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.CallbackName.."Down.tga")
+			buttonFrame:SetHighlightTexture("Interface\\AddOns\\CyborgMMO7\\Graphics\\"..self.CallbackName.."Over.tga")
+		end
+		
+		self.DoAction = function()
+			local action = GetCallback(self.CallbackName)
+			msg("calling callback:- "..self.CallbackName);
+			action();
+			
+		end
+		
+		self.PickupCallback = function()
+			
+			local slot = nil;
+			local observers = RatPageModel.Instance().GetAllObservers();
+			for i = 1, (# observers) do
+				if(MouseIsOver(observers[i])) then
+					slot = observers[i];
+					break;
+				end
+			end
+			slot:SetNormalTexture(slot.UnCheckedTexture)
+		end
+
+		
+		self.ClickHandler = function(self, button, down)
+			msg("click handler");
+			CallbackCursor:StopMoving();
+			CallbackCursor:Hide();
+			
+			if("LeftButton" == button) then
+			else
+				
+			end
+		end
+		
+		self.Pickup = function()
+			self.PlaySound()
+			ClearCursor();
+			self.PickupCallback();
+
+		end
+		
+		
+		self.SetBinding = function(key)
+			local buttonFrame, parentFrame, name = CallbackFactory.Instance().AddCallback(self.DoAction);
+			if(1 ~= SetOverrideBindingClick(CallbackFactory.Instance().Frame, true, key, name, "LeftButton")) then
+				msg("Failed to Bind modeChange");
+			end
+		end
+		
+		return self;
+	end
+}
+
+-- WowItem Class --
+
+WowItem = {
+	new = function(number, itemID)
+		local self = WowObject.new("item", number, itemID); -- base class
+		-- Set all the item info. --
+		self.Name,
+		self.Link,
+		self.Rarity,
+		self.Level,
+		self.MinLevel,
+		self.Type,
+		self.SubType,
+		self.StackCount,
+		self.EquipLoc,
+		self.Texture,
+		self.SellPrice = GetItemInfo(itemID);
+
+		-- override method --
+		self.DoAction = function()
+			msg("Use Item");
+		end
+
+		-- override method --
+		self.Pickup = function()
+			self.PlaySound()
+			ClearCursor();
+			--SetCursor(self.Texture);
+			return PickupItem(self.Link);
+		end
+
+		self.SetBinding = function(key)
+			SetOverrideBinding(CallbackFactory.Instance().Frame, true, key, "ITEM "..self.Name);
+		end
+
+		return self;
+	end,
+}
+
+-- WowSpell Class --
+
+WowSpell = {
+	new = function(type, spellbookID, spellbook)
+		local self = WowObject.new(type, spellbookID, spellbook) -- base class
+		self.SpellbookID = spellbookID;
+		self.Spellbook = spellbook;
+		self.Name, self.Rank = GetSpellBookItemName(spellbookID, spellbook);
+		self.Texture = GetSpellBookItemTexture(spellbookID, spellbook);
+		self.Type = type;
+
+
+		-- override method --
+		self.DoAction = function()
+			msg("Cast Spell");
+		end
+
+		-- override method --
+		self.Pickup = function()
+			self.PlaySound()
+			ClearCursor();
+			--SetCursor(self.Texture);
+			return PickupSpellBookItem(self.SpellbookID, self.Spellbook);
+		end
+
+		self.SetBinding = function(key)
+			msg("Binding to key "..key)
+			self.Key = key
+			SetOverrideBinding(CallbackFactory.Instance().Frame, true, self.Key, self.Type.." "..self.Name);
+		end
+
+    return self;
+
+	end,
+
+	Load = function(object)
+		local o = WowSpell.new(object.Type, object.Detail, object.Subdetail);
+		o.Name = object.Name;
+		o.Texture = object.Texture;
+		return o;
+	end
+}
+
+-- WowMacro Class --
+
+WowMacro = {
+	new = function(index)
+		local self = WowObject.new("macro", index, nil); -- base class
+		-- Set all the item info. --
+		self.Name,
+		self.Texture,
+		self.Body,
+		self.isLocal = GetMacroInfo(index);
+		self.Index = index;
+
+		-- override method --
+		self.DoAction = function()
+			msg("Use Item");
+		end
+
+		-- override method --
+		self.Pickup = function()
+			self.PlaySound()
+			ClearCursor();
+			--SetCursor(self.Texture);
+			return PickupMacro(self.Index);
+		end
+
+		self.SetBinding = function(key)
+			self.Key = key;
+			SetOverrideBinding(CallbackFactory.Instance().Frame, true, key, "MACRO "..self.Index);
+		end
+
+    return self;
+  end,
+}
+
+
+-- WowCompanion Class --
+
+WowCompanion = {
+	new = function(index, SubType)
+		local self = WowObject.new("companion", index, SubType); -- base class
+		-- Set all the item info. --
+		self.Id, self.Name, self.SpellId, self.Texture,	self.isSummoned = GetCompanionInfo(SubType, index);
+		self.SubType = SubType;
+		self.index = index;
+		-- override method --
+		self.DoAction = function()
+			if((self.SubType == "MOUNT") and IsMounted()) then
+				Dismount();
+			else
+				CallCompanion(self.SubType, self.index);
+			end
+		end
+
+		-- override method --
+		self.Pickup = function()
+			self.PlaySound()
+			return PickupCompanion(self.SubType, self.index);
+		end
+
+		self.SetBinding = function(key)
+			self.Key = key
+			local buttonFrame, parentFrame, name = CallbackFactory.Instance().AddCallback(self.DoAction);
+			if(1 ~= SetOverrideBindingClick(parentFrame, true, key, name, "LeftButton")) then
+				msg("Failed to bind companion to button click");
+			end
+			--SetOverrideBinding(hiddenModeChanger, true, key, "MACRO "..self.Index);
+		end
+
+		return self;
+	end,
+
+	Load = function(object)
+		local o = WowCompanion.new(object.index, object.SubType);
+		return o;
+	end
+}
+
+-- WowMerchant Class --
+WowMerchant = {
+	new = function(index)
+		local self = WowObject.new("macro", index, nil); -- base class
+		-- Set all the item info. --
+		self.Name,
+		self.Texture,
+		self.Price,
+		self.Quantity,
+		self.NumAvailable,
+		self.IsUsable,
+		self.ExtendedCost = GetMerchantItemInfo(index);
+		self.Index = index;
+
+		-- override method --
+		self.DoAction = function()
+			msg("Use Item");
+		end
+
+		-- override method --
+		self.Pickup = function()
+			self.PlaySound()
+			ClearCursor();
+			--SetCursor(self.Texture);
+			return PickupMerchantItem(self.Index);
+		end
+
+		self.SetBinding = function(key)
+			self.Key = key
+			SetOverrideBinding(CallbackFactory.Instance().Frame, true, key, "MERCHANT "..self.Index);
+		end
+
+    return self;
+  end,
+}
+
+-- WowEquipmentSet Class --
+WowEquipmentSet = {
+	new = function(objectType, name, index)
+		local self = WowObject.new(objectType, name, index); -- base class
+		-- Set all the item info. --
+		texture, lessIndex = GetEquipmentSetInfoByName(name);
+		self.Texture = "Interface\\Icons\\"..texture;
+		self.Name = name
+		self.Index = lessIndex+1;
+
+		-- override method --
+		self.DoAction = function()
+			UseEquipmentSet(self.Name);
+		end
+
+		-- override method --
+		self.Pickup = function()
+			self.PlaySound()
+			ClearCursor();
+			--SetCursor(self.Texture);
+			return PickupEquipmentSetByName(self.Name);
+		end
+
+		self.SetBinding = function(key)
+			self.Key = key
+			local buttonFrame, parentFrame, name = CallbackFactory.Instance().AddCallback(self.DoAction);
+			if(1 ~= SetOverrideBindingClick(parentFrame, true, key, name, "LeftButton")) then
+				msg("Failed to bind companion to button click");
+			end
+		end
+
+    return self;
+  end,
+}
+
+
+-- End Of WowObjects --
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/license.txt	Tue Jan 24 17:14:21 2012 +0000
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 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 General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
\ No newline at end of file