/////////////////////////////////////////////////////
//                                                 //
// Wii Opera SDK - Wii Remote Class v2.2.3         //
// (c) 2007-2008 Daniel Gump. All Rights Reserved. //
// http://wiioperasdk.com                          //
// hullbreach@hullbreachonline.com                 //
//                                                 //
//  Wii is a trademark of Nintendo Co., Ltd.       //
//  Opera is a trademark of Opera, ASA.            //
//  This software package is released free to      //
//   those who use these products.                 //
//                                                 //
//  Use this product at your own risk. By using    //
//   the Wii Opera SDK, you release Daniel Gump    //
//   from any and all liability relating to        //
//   problems that may arise                       //
//                                                 //
/////////////////////////////////////////////////////

function WiiRemote(){

	this.MOUSEX = 0;
	this.MOUSEY = 0;

	//Mode settings
	this.INACTIVE = 0;
	this.KEYBOARD = 1;
	this.REMOTE = 2;
	this.CONTROLLER = 3;

	AUTOMODE = false;

	//Wii Remote key codes
	CODE_A_KB = 13;
	CODE_A_WR = 13;
	CODE_B_KB = 32;
	CODE_B_WR = 171;
	CODE_C_KB = 67;
	CODE_C_WR = 201;
	CODE_Z_KB = 90;
	CODE_Z_WR = 200;
	CODE_1_KB = 49;
	CODE_1_WR = 172;
	CODE_2_KB = 50;
	CODE_2_WR = 173;
	CODE_MINUS_KB = 109;
	CODE_MINUS_WR = 170;
	CODE_PLUS_KB = 61;
	CODE_PLUS_WR = 174;
	CODE_LEFT_KB = 37;
	CODE_LEFT_WR = 178;
	CODE_UP_KB = 38;
	CODE_UP_WR = 175;
	CODE_RIGHT_KB = 39;
	CODE_RIGHT_WR = 177;
	CODE_DOWN_KB = 40;
	CODE_DOWN_WR = 176;

	this.DEFAULT_ACTIONS = true;

	//Enum of Wii Remote data elements
	this.ENABLED = 0;
	this.MODE = 1;
	this.X_COORD = 2;
	this.Y_COORD = 3;
	this.Z_COORD = 4;
	this.ROLL_ANGLE = 5;
	this.BUTTON_A = 6;
	this.BUTTON_B = 7;
	this.BUTTON_C = 8;
	this.BUTTON_Z = 9;
	this.BUTTON_PLUS = 10;
	this.BUTTON_MINUS = 11;
	this.BUTTON_1 = 12;
	this.BUTTON_2 = 13;
	this.BUTTON_UP = 14;
	this.BUTTON_DOWN = 15;
	this.BUTTON_LEFT = 16;
	this.BUTTON_RIGHT = 17;
	this.BUTTON_OTHER = 18;
	
	STATUS = {"a":false, "b":false, "c":false, "z":false, "1":false, "2":false, "up":false, "down":false, "left":false, "right":false, "plus":false, "minus":false, "other":false};
}
WiiRemote.prototype.readData = function(current){
	REMOTE_DATA = new Array(false,0,0,0,0,false,false,false,false,false,false,false,false,false,false,false,false,false,false);

	if(window.opera && opera.wiiremote){
		REMOTE_DATA[this.MODE] = this.REMOTE;
		var newdata = opera.wiiremote.update(current);

		if(newdata.isEnabled){
			REMOTE_DATA[this.ENABLED] = true;
			if(newdata.dpdScreenX && newdata.dpdScreenY){
				if(AUTOMODE) REMOTE_DATA[this.MODE] = this.REMOTE;
				REMOTE_DATA[this.X_COORD] = newdata.dpdScreenX;
				REMOTE_DATA[this.Y_COORD] = newdata.dpdScreenY;
				REMOTE_DATA[this.Z_COORD] = newdata.dpdDistance;
				REMOTE_DATA[this.ROLL_ANGLE] = Math.atan2(newdata.dpdRollY, newdata.dpdRollX)*180/Math.PI;
			}else{
				if(AUTOMODE) REMOTE_DATA[this.MODE] = this.CONTROLLER;
				REMOTE_DATA[this.X_COORD] = 0;
				REMOTE_DATA[this.Y_COORD] = 0;
				REMOTE_DATA[this.Z_COORD] = 0;
				REMOTE_DATA[this.ROLL_ANGLE] = 0;
			}

			if(newdata.isBrowsing){
				REMOTE_DATA[this.BUTTON_PLUS] = STATUS["plus"];
				REMOTE_DATA[this.BUTTON_2] = STATUS["2"];
				REMOTE_DATA[this.BUTTON_1] = STATUS["1"];
				REMOTE_DATA[this.BUTTON_B] = STATUS["b"] || (newdata.hold & 1024);
				REMOTE_DATA[this.BUTTON_A] = STATUS["a"] || (newdata.hold & 2048);
				REMOTE_DATA[this.BUTTON_MINUS] = STATUS["minus"];
				REMOTE_DATA[this.BUTTON_Z] = STATUS["z"];
				REMOTE_DATA[this.BUTTON_C] = STATUS["c"];
				REMOTE_DATA[this.BUTTON_OTHER] = STATUS["other"];

				REMOTE_DATA[this.BUTTON_LEFT] = (REMOTE_DATA[this.MODE]==this.REMOTE)?STATUS["left"]:STATUS["up"];
				REMOTE_DATA[this.BUTTON_UP] = (REMOTE_DATA[this.MODE]==this.REMOTE)?STATUS["up"]:STATUS["right"];
				REMOTE_DATA[this.BUTTON_RIGHT] = (REMOTE_DATA[this.MODE]==this.REMOTE)?STATUS["right"]:STATUS["down"];
				REMOTE_DATA[this.BUTTON_DOWN] = (REMOTE_DATA[this.MODE]==this.REMOTE)?STATUS["down"]:STATUS["left"];
			}else{
				REMOTE_DATA[this.BUTTON_PLUS] = (newdata.hold & 16);
				REMOTE_DATA[this.BUTTON_2] = (newdata.hold & 256);
				REMOTE_DATA[this.BUTTON_1] = (newdata.hold & 512);
				REMOTE_DATA[this.BUTTON_B] = (newdata.hold & 1024);
				REMOTE_DATA[this.BUTTON_A] = (newdata.hold & 2048);
				REMOTE_DATA[this.BUTTON_MINUS] = (newdata.hold & 4096);
				REMOTE_DATA[this.BUTTON_Z] = (newdata.hold & 8192);
				REMOTE_DATA[this.BUTTON_C] = (newdata.hold & 16384);

				REMOTE_DATA[this.BUTTON_LEFT] = newdata.hold & ((REMOTE_DATA[this.MODE]==this.REMOTE)?1:8);
				REMOTE_DATA[this.BUTTON_UP] = newdata.hold & ((REMOTE_DATA[this.MODE]==this.REMOTE)?8:2);
				REMOTE_DATA[this.BUTTON_RIGHT] = newdata.hold & ((REMOTE_DATA[this.MODE]==this.REMOTE)?2:4);
				REMOTE_DATA[this.BUTTON_DOWN] = newdata.hold & ((REMOTE_DATA[this.MODE]==this.REMOTE)?4:1);
			}
		}
	}
	
	else{
	REMOTE_DATA[this.ENABLED] = false;
	/*
	Don't want this to function unless on wii
		if(!current){
			REMOTE_DATA[this.ENABLED] = true;
			REMOTE_DATA[this.MODE] = this.KEYBOARD;
			REMOTE_DATA[this.X_COORD] = this.MOUSEX;
			REMOTE_DATA[this.Y_COORD] = this.MOUSEY;
			REMOTE_DATA[this.Z_COORD] = 0;
			REMOTE_DATA[this.ROLL_ANGLE] = 0;

			REMOTE_DATA[this.BUTTON_PLUS] = STATUS["plus"];
			REMOTE_DATA[this.BUTTON_2] = STATUS["2"];
			REMOTE_DATA[this.BUTTON_1] = STATUS["1"];
			REMOTE_DATA[this.BUTTON_B] = STATUS["b"];
			REMOTE_DATA[this.BUTTON_A] = STATUS["a"];
			REMOTE_DATA[this.BUTTON_MINUS] = STATUS["minus"];
			REMOTE_DATA[this.BUTTON_Z] = STATUS["z"];
			REMOTE_DATA[this.BUTTON_C] = STATUS["c"];
			REMOTE_DATA[this.BUTTON_OTHER] = STATUS["other"];

			REMOTE_DATA[this.BUTTON_LEFT] = STATUS["left"];
			REMOTE_DATA[this.BUTTON_UP] = STATUS["up"];
			REMOTE_DATA[this.BUTTON_RIGHT] = STATUS["right"];
			REMOTE_DATA[this.BUTTON_DOWN] = STATUS["down"];
		}
	*/	
	}
	return REMOTE_DATA;
}

WiiRemote.prototype.autoMode = function(flag){ AUTOMODE=flag?true:false; }
WiiRemote.prototype.defaultActions = function(flag){ this.DEFAULT_ACTIONS=flag?true:false; }

//Maintenance functions
WiiRemote.prototype.setKeyPress = function(key){
	switch(key){
		case CODE_1_KB:case CODE_1_WR:		STATUS["1"] = true;	break;
		case CODE_2_KB:case CODE_2_WR:		STATUS["2"] = true;	break;
		case CODE_A_KB:case CODE_A_WR:		STATUS["a"] = true;	break;
		case CODE_B_KB:case CODE_B_WR:		STATUS["b"] = true;	break;
		case CODE_MINUS_KB:case CODE_MINUS_WR:	STATUS["minus"] = true;	break;
		case CODE_PLUS_KB:case CODE_PLUS_WR:	STATUS["plus"] = true;	break;
		case CODE_LEFT_KB:case CODE_LEFT_WR:	STATUS["left"] = true;	break;
		case CODE_UP_KB:case CODE_UP_WR:	STATUS["up"] = true;	break;
		case CODE_RIGHT_KB:case CODE_RIGHT_WR:	STATUS["right"] = true;	break;
		case CODE_DOWN_KB:case CODE_DOWN_WR:	STATUS["down"] = true;	break;
		case CODE_C_KB:case CODE_C_WR:		STATUS["c"] = true;	break;
		case CODE_Z_KB:case CODE_Z_WR:		STATUS["z"] = true; 	break;
		default:				STATUS["other"] = key;
	}
}
WiiRemote.prototype.setKeyRelease = function(key){
	switch(key){
		case CODE_1_KB:case CODE_1_WR:		STATUS["1"] = false;	break;
		case CODE_2_KB:case CODE_2_WR:		STATUS["2"] = false;	break;
		case CODE_A_KB:case CODE_A_WR:		STATUS["a"] = false;	break;
		case CODE_B_KB:case CODE_B_WR:		STATUS["b"] = false;	break;
		case CODE_MINUS_KB:case CODE_MINUS_WR:	STATUS["minus"] = false;break;
		case CODE_PLUS_KB:case CODE_PLUS_WR:	STATUS["plus"] = false;	break;
		case CODE_LEFT_KB:case CODE_LEFT_WR:	STATUS["left"] = false;	break;
		case CODE_UP_KB:case CODE_UP_WR:	STATUS["up"] = false;	break;
		case CODE_RIGHT_KB:case CODE_RIGHT_WR:	STATUS["right"] = false;break;
		case CODE_DOWN_KB:case CODE_DOWN_WR:	STATUS["down"] = false;	break;
		case CODE_C_KB:case CODE_C_WR:		STATUS["c"] = false;	break;
		case CODE_Z_KB:case CODE_Z_WR:		STATUS["z"] = false; 	break;
		default:				STATUS["other"] = false;
	}
}

Wiimote = new WiiRemote();
document.onkeypress = function(e){ return Wiimote.DEFAULT_ACTIONS; }
if(window.opera && opera.wiiremote)
{
document.onkeydown = function(e){ if(e.keyCode){Wiimote.setKeyPress(e.keyCode);} return Wiimote.DEFAULT_ACTIONS; }
document.onkeyup = function(e){ if(e.keyCode){Wiimote.setKeyRelease(e.keyCode);} return Wiimote.DEFAULT_ACTIONS; }
}
/*

document.onmousemove = function(e){ Wiimote.MOUSEX=event.clientX; Wiimote.MOUSEY=event.clientY; }
document.onmousedown = function(){ STATUS["a"] = true; }
document.onmouseup = function(){ STATUS["a"] = false; }
*/