//	CCActiveView Javascript Library by Nick Largent
//	Copyright (C) 2004 Comcam International Inc.
//	http://www.comcam.net


//////////////////////////////    CAMERA OBJECT CREATION & SELECTION
var Camera;
var Override_OnConnected;
var Override_OnGateChanged;

function SetActiveViewer(cam) {
	Camera=cam;
}

function CreateViewer(id, width, Height) {
	document.write("<object ID='" + id + "' WIDTH='" + width + "' HEIGHT='" + Height + "' VIEWASTEXT CLASSID='CLSID:40608166-199B-11D6-8F02-00E029304C07' CODEBASE='http://www.comcam.net/cabs/ccactiveview/CCActiveView.cab#version=1,3,2,0'></object>");	
	document.write("<script language='javascript' for='" + id + "' event='Connected'>Event_OnConnected(" + id + ");</script>");
	document.write("<script language='javascript' for='" + id + "' event='Disconnected'>Event_OnDisconnected(" + id + ");</script>");
	document.write("<script language='javascript' for='" + id + "' event='OnEvent(pin, state)'>Event_OnEvent(" + id + ",pin,state);</script>");
	document.write("<script language='javascript' for='" + id + "' event='OnSerialData(data, length)'>Event_OnSerialData(" + id + ",data,length);</script>");
	CC1.SetRegKey("Comcam International","d20f9133d656429a59a348ec5e3c9a89");
	SetActiveViewer(eval(id));
}





//////////////////////////////     CAMERA EVENTS
function Event_OnDisconnected(CamObj) {
	if (_connect_ip != "") {
		Camera.Connect(_connect_ip, _connect_port);
		_connect_ip = "";
		_connect_port = "";
	}
}


function Event_OnConnected(CamObj) {

    //SNAM
	if 		(CC1.GetString("SCRIPT") == "philips_dome1.c3s") 	{	ptz_curCmdSet = 0; } 
	else if (CC1.GetString("SCRIPT") == "pelco_dome.c3s") 		{	ptz_curCmdSet = 1; } 
	else if (CC1.GetString("SCRIPT") == "pelco_d_dome.c3s") 	{	ptz_curCmdSet = 1; } 
	else if (CC1.GetString("SCRIPT") == "quickeye_dome2.c3s")	{	ptz_curCmdSet = 2; } 
	else	{ ptz_curCmdSet = -1; }

	//alert("SCRIPT: " + CC1.GetString("SCRIPT"));

	if (CC1.GetString("SCRIPT") == "default_io.c3s")
		gate_curCmdSet = 0;
	else
		gate_curCmdSet = -1;

	if(CC1.GetString("SCRIPT") == "weather_station1.c3s")
		weather_curCmdSet = 1;
	else
		weather_curCmdSet = -1;

	if(CC1.GetString("SCRIPT") == "Alpha215.c3s")
		sign_curCmdSet = 1;
	else
		sign_curCmdSet = -1;
		
	if(CC1.GetString("SCRIPT") == "arm_v2.c3s")
		arm_curCmdSet = 1;
	else
		arm_curCmdSet = -1;
		
	if(CC1.GetString("SCRIPT") == "DI5000v2.c3s")
		thermal_curCmdSet = 1;
	else
		thermal_curCmdSet = -1;


	CamObj.EventsEnabled = true;

	CamObj.StartLiveVideo(1);
	
	if (Override_OnConnected)
		Override_OnConnected(CamObj);
}

function Event_OnEvent(CamObj, pin, state) {
	
	if (pin == "IN3") {
		gate_moving = state;
	}
	
	if (pin == "IN2" && state==true) {
		gate_open = false;
	} else if (pin == "IN1" && state==true) {
		gate_open = true;
	}
		
	if (!gate_moving && Override_OnGateChanged)
		Override_OnGateChanged(CamObj);		
}



function Event_OnSerialData(CamObj, serial_data, serial_length) {
	if(lastCmd=="IMG")
	{
		lastCmd="LOOP";
		Camera.SendSerialHex("4C4F4F50FFFF0D");
	}

	else if(lastCmd=="LOOP")
	{
		lastCmd="";

        // sdata = new String(serial_data);

        //insidetemp = MakeFloat(MakeWord(sdata.charCodeAt(2), sdata.charCodeAt(3)));
		//outsidetemp = MakeFloat(MakeWord(sdata.charCodeAt(4), sdata.charCodeAt(5)));

		//if(sdata.length > 6)windspeed = Number(sdata.charCodeAt(6));
        //else windspeed = 0;
       
        //if(sdata.length > 7)winddir = Number(sdata.charCodeAt(7));
        //else  winddir = 0;

        insidetemp = MakeFloat(MakeWord( Camera.GetSerialByte(2), Camera.GetSerialByte(3) ) );
		outsidetemp = MakeFloat(MakeWord( Camera.GetSerialByte(4), Camera.GetSerialByte(5)));
		windspeed = Number(Camera.GetSerialByte(6));
        winddir = Number(Camera.GetSerialByte(7));

         // ? winddir = MakeWord(sdata.charCodeAt(7), sdata.charCodeAt(8));


       if(insidetemp > 120)insidetemp = 70;

       if((insidetemp < 120) && (outsidetemp < 120)) 
       {
    		weathercontrols.all.ITemp.value    =  "Inside:  " + insidetemp+" F";
            weathercontrols.all.OTemp.value    =  "Outside: " + outsidetemp+" F";
            weathercontrols.all.WSpeed.value ="Wind:    " + windspeed +" mph";
            if(windspeed > 0)weathercontrols.all.WDir.value   = "Dir:    " + winddir + " deg "+deg2dir(winddir);
            else weathercontrols.all.WDir.value   = "Dir:    ";
       }
	   // weathercontrols.all.WDir.value = "L: " + sdata.length + " s: " + sdata;
	}
}


///////////////////////////////     BASIC CAMERA CONTROL
var _connect_ip;
var _connect_port;

function Connect(ip, port) {
	_connect_ip = ip;
	_connect_port = port;
	Camera.Disconnect();
}

function Disconnect() {
	_connect_ip = "";
	_connect_port = "";
	Camera.Disconnect();	
}

function SetQuality(quality) {	
	Camera.Quality=quality;
}

function SetVideoInput(vid) {
	Camera.VideoInput = vid;
}





////////////////////////////////   PROPERTIES
function CameraName() {
	return Camera.GetString("DNAM");
}

function SupportsPTZ() {
	return (ptz_curCmdSet>=0);
}

function SupportsThermal() {
	return (thermal_curCmdSet>=0);
}

function SupportsGate() {
	return (gate_curCmdSet>=0);
}

function SupportsWeatherStation() {
    return(weather_curCmdSet >= 0);
}

function SupportsSign() {
    return(sign_curCmdSet >= 0);
}

function SupportsArm() {
    return(arm_curCmdSet >= 0);
}

////////////////////////////////    PTZ FUNCTIONS
var ptz_cmdUp = new Array (3);
var ptz_cmdDown = new Array (3);
var ptz_cmdLeft = new Array (3);
var ptz_cmdRight = new Array (3);
var ptz_cmdIn = new Array (3);
var ptz_cmdOut = new Array (3);
var ptz_cmdStop = new Array (3);
var ptz_cmdStopZoom = new Array (3);

var ptz_curCmdSet=-1;

// Philips Commands
ptz_cmdUp[0]    = "86000002080010";
ptz_cmdDown[0]  = "86000002000810";
ptz_cmdLeft[0]  = "86000002100018";
ptz_cmdRight[0] = "86000002001018";
ptz_cmdIn[0]    = "870000057000201c";
ptz_cmdOut[0]   = "870000057000100c";
ptz_cmdStop[0]  = "86000002000008";
ptz_cmdStopZoom[0]  = "86000002000008";

// Pelco Commands
ptz_cmdUp[1]    = "FF010008003F48";
ptz_cmdDown[1]  = "FF010010003F50";
ptz_cmdLeft[1]  = "FF0100043F0044";
ptz_cmdRight[1] = "FF0100023F0042";
ptz_cmdIn[1]    = "FF010020000021";
ptz_cmdOut[1]   = "FF010040000041";
ptz_cmdStop[1]  = "FF010000000001";
ptz_cmdStopZoom[1]  = "FF010000000001";


// QuickEye Commands
ptz_cmdUp[2]    = "02003100016500005503";
ptz_cmdDown[2]  = "02003100016400005403";
ptz_cmdLeft[2]  = "02003100640100005403";
ptz_cmdRight[2] = "02003100650100005503";
ptz_cmdIn[2]    = "PRO1: D=1C W11FE";
ptz_cmdOut[2]   = "PRO1: D=1C W12FE";
ptz_cmdStop[2]  = "02003100010100003103";
ptz_cmdStopZoom[2]  = "PRO1: D=1C W1000";


function PanUp()		{ Camera.SendSerialHex(ptz_cmdUp[ptz_curCmdSet]); }
function PanLeft()	{ Camera.SendSerialHex(ptz_cmdLeft[ptz_curCmdSet]); }
function PanRight()	{	Camera.SendSerialHex(ptz_cmdRight[ptz_curCmdSet]); }
function PanDown()	{ Camera.SendSerialHex(ptz_cmdDown[ptz_curCmdSet]); }
function StopPanTilt()	{ Camera.SendSerialHex(ptz_cmdStop[ptz_curCmdSet]); }

function ZoomIn()	{
	if(ptz_cmdIn[ptz_curCmdSet].charAt(0)=='P') {
		Camera.SendTextCommand(ptz_cmdIn[ptz_curCmdSet],0,0);
	} else {
		Camera.SendSerialHex(ptz_cmdIn[ptz_curCmdSet]);
	}
}
function ZoomOut()	{ 
	if(ptz_cmdOut[ptz_curCmdSet].charAt(0)=='P') {
		Camera.SendTextCommand(ptz_cmdOut[ptz_curCmdSet],0,0);
	} else {
		Camera.SendSerialHex(ptz_cmdOut[ptz_curCmdSet]); 
	}
}

function StopZoom()	{ 
	if(ptz_cmdStopZoom[ptz_curCmdSet].charAt(0)=='P') {
		Camera.SendTextCommand(ptz_cmdStopZoom[ptz_curCmdSet],0,0);
	} else {
		Camera.SendSerialHex(ptz_cmdStopZoom[ptz_curCmdSet]); 
	}
}


/////////////////////////////////////////   THERMAL CONTROL
var thermal_curCmdSet = -1;
function ThermalUp()		{ Camera.SendSerialAscii("63 13f\r"); }
function ThermalLeft()		{ Camera.SendSerialAscii("62 fe20\r"); }
function ThermalRight()		{ Camera.SendSerialAscii("62 1df\r"); }
function ThermalDown()		{ Camera.SendSerialAscii("63 feb0\r"); }
function ThermalStop()		{ Camera.SendSerialAscii("62 0\r63 0\r"); }

function ThermalZoom1()		{ Camera.SendSerialAscii("41 0\r"); }
function ThermalZoom2()		{ Camera.SendSerialAscii("41 2\r"); }
function ThermalZoom3()		{ Camera.SendSerialAscii("41 3\r"); }

function ThermalFocusIn()	{ Camera.SendSerialAscii("6e 1\r");}
function ThermalFocusOut()	{ Camera.SendSerialAscii("6e 2\r");}
function ThermalFocusStop()	{ Camera.SendSerialAscii("6e 0\r");}

function ThermalIR()		{ Camera.SendSerialAscii("78 00\r");}
function ThermalIRTV()		{ Camera.SendSerialAscii("78 80\r");}
function ThermalTV()		{ Camera.SendSerialAscii("78 ff\r");}

function ThermalWhiteHot()	{ Camera.SendSerialAscii("26 0\r");}
function ThermalBlackHot()	{ Camera.SendSerialAscii("26 1\r");}

/////////////////////////////////////////   GATE CONTROL
var gate_curCmdSet = -1;
var gate_open = false;
var gate_moving = false;

function OpenGate() {
	Camera.SetOutputPin("OUT2",true);
}

function CloseGate() {
	Camera.SetOutputPin("OUT2",false);
}

function IsGateOpen() {
	return gate_open;
}

function TurnLightOn() {
	
}

function TurnLightOff() {
	
}

function IsLightOn() {
	
}
//////////////////// weather station


var weather_curCmdSet=-1;
var lastCmd;

function GetWeather()
{
	lastCmd="IMG";
	Camera.SendSerialHex("494D470D"); // IMG\r	
}

function StartGetWeather()
{
        // Camera.EnableSerialInput();
	lastCmd="IMG";
	Camera.SendSerialHex("494D470D"); // IMG\r	
}



function MakeWord(lo,hi)
{
	return hi*256+lo;	
}

function MakeFloat(num)
{
	num=String(num);
	if(num.length < 2)return 0;

        flt=num.substring(0,num.length-1) + "." + num.substring(num.length-1,num.length);
	return flt;
}

function deg2dir(deg)
{
	if(deg<22)
		return "N";
	else if(deg<67)
		return "NE"		
	else if(deg<112)
		return "E"
	else if(deg<157)
		return "SE"
	else if(deg<202)
		return "S"
	else if(deg<247)
		return "SW"
	else if(deg<292)
		return "W"
	else if(deg<337)
		return "NW"
	else
		return "N"
}


//////////////////// sign
var sign_curCmdSet = -1;

function Hex(d) {
	var hD="0123456789ABCDEF";
	var h = hD.substr(d&15,1);
	while(d>15) {d>>=4;h=hD.substr(d&15,1)+h;}
	if (h.length % 2 != 0)
		h = "0" + h;
	return h;
}

function SetSignText(txt) {
	hx = "";
	for (i=0;i<txt.length;i++) {
		c = txt.charCodeAt(i);
		hx += Hex(c);
	}
	Camera.SendSerialHex("0000000000015a3030024141" + hx + "04");
}





///////////////////  ROBOT ARM
var arm_curCmdSet = -1;

function MotorCommand(motor, reverse, speed) {
	Camera.SendSerialBegin(4);
	Camera.SetSerialByte(0, 0x80);					// header
	Camera.SetSerialByte(1, 0);						// device type
	Camera.SetSerialByte(2, motor + reverse);		// motor id
	Camera.SetSerialByte(3, speed);					// speed
	Camera.SendSerialEnd();		
}

function GripOpen()		{MotorCommand(12, 1, 127);}
function GripClose()	{MotorCommand(12, 0, 127);}
function GripStop()		{MotorCommand(12, 0, 0);}

function WristCW()		{MotorCommand(14, 1, 127);}
function WristCCW()		{MotorCommand(14, 0, 127);}
function WristStop()	{MotorCommand(14, 0, 0);}

function ElbowUp()		{MotorCommand(8, 0, 127);}
function ElbowDn()		{MotorCommand(8, 1, 127);}
function ElbowStop()	{MotorCommand(8, 0, 0);}

function ShoulderUp()	{MotorCommand(10, 1, 127);}
function ShoulderDn()	{MotorCommand(10, 0, 127);}
function ShoulderStop()	{MotorCommand(10, 0, 0);}

function BaseCW()		{MotorCommand(16, 0, 127);}
function BaseCCW()		{MotorCommand(16, 1, 127);}
function BaseStop()		{MotorCommand(16, 0, 0);}
