// THIS CODE IS NOT APPROVED FOR USE IN/ON ANY OTHER UI ELEMENT OR PRODUCT COMPONENT. 
// Copyright (c) 2007 Renderspace. All rights reserved.


/************************************************/
// main code
/************************************************/

var navigatorType = null; // browser type, IE or Firefox or other
var rootControl = null; // root (ActiveX or plugin) control
var rootCanvas = null; // root renderer canvas
var objectManager = null; // main object manager and manipulator, root node of the object tree

var isFullScreen = false;
var isWaitCursor = false;
var currentCursor = null;
var prevCursor = null;

var frameTimerID = 0; // used internaly
var prevFrameTime = 0; // previous value of "current time", to compute delta time
var mouseMoveCounter = 0; // to reduce number of mouse events in some time interval
var mouseTimeCounter = 0; // to reduce number of mouse events in some time interval
var currentMouseXPos = 0; // because of XAML coordinate bug (when browser window is partly outside the desktop), we should save our coordinates
var currentMouseYPos = 0;



/************************************************/

// first callback function to be called, when plugin is loaded
function OnLoaded(sender, args) {
	navigatorType = null;
	if (navigator.userAgent) {
		if (navigator.userAgent.indexOf("MSIE") >= 0) navigatorType = "ie";
		else if (navigator.userAgent.indexOf("Firefox") >= 0) navigatorType = "ff";
	}
		
	rootControl = document.getElementById("network_ctrl");
	rootCanvas = (sender != null) ? sender.FindName("root") : null;
	rootControl.focus();
	//rootControl.settings.EnableRedrawRegions = true;
	
	screenWidth = rootControl.clientWidth;//getWindowWidth();
	screenHeight = rootControl.clientHeight;//getWindowHeight();
	if (screenWidth < MIN_SCREEN_WIDTH) screenWidth = MIN_SCREEN_WIDTH;
	if (screenHeight < MIN_SCREEN_HEIGHT) screenHeight = MIN_SCREEN_HEIGHT;
	
	// create and init object manager
	objectManager = new ObjectManager(0, null);
	   
	// start frame update timer
	frameTimerID = setTimeout("onUpdateTimer()", 1000 / FRAME_RATE);
	
	// register interactive event handlers
	rootControl.onmousemove = onMouseMoveFunc;
	rootControl.onmousedown = onMouseDownFunc;
	rootControl.onmouseup = onMouseUpFunc;
	
	
	// because of bug in both IE and Firefox, key event are sometimes not delivered, so both must have different event handlers
	if (navigatorType == "ie") {
		document.body.onkeydown = onKeyDownFunc;
		document.body.onkeypress = onKeyPressFunc;
		document.body.onkeyup = onKeyUpFunc;
	}
	else {
		rootControl.onkeydown = onKeyDownFunc;
		rootControl.onkeypress = onKeyPressFunc;
		rootControl.onkeyup = onKeyUpFunc;
	}
	//window.onresize = onScreenResizeFunc;
	
	if (window.addEventListener) window.addEventListener('DOMMouseScroll', onMouseWheel, false); // DOMMouseScroll is for mozilla.
	window.onmousewheel = document.onmousewheel = onMouseWheel; // IE/Opera
	
	clientBackgroundCanvas = createClippedCanvas(rootCanvas);
	setVisualElementClipRect(getVisualElementClip(clientBackgroundCanvas), 0, 0, screenWidth - SCROLLBAR_SIZE, screenHeight - SCROLLBAR_SIZE);
	clientForegroundCanvas = createClippedCanvas(rootCanvas);
	setVisualElementClipRect(getVisualElementClip(clientForegroundCanvas), 0, 0, screenWidth - SCROLLBAR_SIZE, screenHeight - SCROLLBAR_SIZE);
	
	mainHScrollbar = new ScrollbarObject(objectManager, 0, "vscroll", false, true, true, 0, 0, 0, 64, 16, 0);
	mainVScrollbar = new ScrollbarObject(objectManager, 0, "hscroll", true, true, true, 0, 0, 0, 64, 16, 0);
	mainHScrollbar.setPosition(0, screenHeight - SCROLLBAR_SIZE, screenWidth - SCROLLBAR_SIZE, SCROLLBAR_SIZE);
	mainHScrollbar.setRange(0, 0, screenWidth - SCROLLBAR_SIZE);
	mainHScrollbar.show(true, true, 1);
	mainVScrollbar.setPosition(screenWidth - SCROLLBAR_SIZE, 0, SCROLLBAR_SIZE, screenHeight - SCROLLBAR_SIZE);
	mainVScrollbar.setRange(0, 0, screenHeight - SCROLLBAR_SIZE);
	mainVScrollbar.show(true, true, 1);
}


function onPluginError(line, col, hr, string) {
}


// call event functions on every object in the tree
function onScreenResizeFunc()   {
	screenWidth = getWindowWidth() - rootControl.offsetLeft - rootControl.offsetParent.offsetLeft;
	screenHeight = getWindowHeight() - rootControl.offsetTop - rootControl.offsetParent.offsetTop;
	if (screenWidth < MIN_SCREEN_WIDTH) screenWidth = MIN_SCREEN_WIDTH;
	if (screenHeight < MIN_SCREEN_HEIGHT) screenHeight = MIN_SCREEN_HEIGHT;
	rootControl.width = screenWidth;
	rootControl.height = screenHeight;
	
	if (objectManager != null) objectManager.callFunction(null, "onScreenResize", null, false);
}


// called periodicaly, to update objects' internal state
function onUpdateTimer() {
	if (frameTimerID) {
		clearTimeout(frameTimerID);
		frameTimerID = 0;
	}

	var newFrameTime = (new Date()).getTime();
	if (prevFrameTime == 0) prevFrameTime = newFrameTime;
	var frameDeltaTime = newFrameTime - prevFrameTime;
	prevFrameTime = newFrameTime;
	
	mouseTimeCounter += frameDeltaTime;
	while (mouseTimeCounter > 50) {
		mouseMoveCounter = 0;
		mouseTimeCounter -= 50;
	}
	
	visualElementsGargabeCleanup();
	
	// call "onUpdateFrame" event function on every object in the tree
	if (objectManager != null) {
	    objectManager.garbageCleanup();
	    objectManager.onUpdateFrame(null, frameDeltaTime, false);
	    
	    if (mainHScrollbar.getIsPositionChanged() || mainVScrollbar.getIsPositionChanged()) {
	        setVisualElementPos(clientBackgroundCanvas, -mainHScrollbar.position, -mainVScrollbar.position, 0, 0, 1);
	        setVisualElementPos(clientForegroundCanvas, -mainHScrollbar.position, -mainVScrollbar.position, 0, 0, 1);
	        
	        setVisualElementClipRect(getVisualElementClip(clientBackgroundCanvas), mainHScrollbar.position, mainVScrollbar.position, 
	            mainHScrollbar.position + screenWidth - SCROLLBAR_SIZE, mainVScrollbar.position + screenHeight - SCROLLBAR_SIZE);
	        setVisualElementClipRect(getVisualElementClip(clientForegroundCanvas), mainHScrollbar.position, mainVScrollbar.position, 
	            mainHScrollbar.position + screenWidth - SCROLLBAR_SIZE, mainVScrollbar.position + screenHeight - SCROLLBAR_SIZE);
	    }
	}
	
	updateCursor();
	
	frameTimerID = setTimeout("onUpdateTimer()", 1000 / FRAME_RATE);
}


function onMouseMoveFunc(args)  {
	var mousePos = getMousePosition(args);
	currentMouseXPos = mousePos.x;
	currentMouseYPos = mousePos.y;
	
	if (mouseMoveCounter == undefined) return;
	if ((mouseMoveCounter == 0) && (objectManager != null)) {
		setCursor("default");
		objectManager.onMouseMove(null, args, false);
		updateCursor();
	}
	mouseMoveCounter++;
	if (mouseMoveCounter > 3) mouseMoveCounter = 0;
}


function onMouseDownFunc(args)  {
	if (navigatorType == "ie") {
		document.body.focus();
		if (getMouseButton(args) <= 1) return; // left button is handled by XAML onXAMLLeftMouseDownFunc, but only in IE
	}
	if (objectManager != null) objectManager.callFunction(null, "onMouseDown", args, false);
}


function onMouseWheel(args) {
	if (objectManager != null) objectManager.callFunction(null, "onMouseWheel", args, false);
	
	if (!args) args = window.event;
	if (window.event) window.event.returnValue = false;
	if (args.preventDefault) args.preventDefault();
}


function onMouseClickFunc(args) {
	if (objectManager != null) objectManager.callFunction(null, "onMouseClick", args, false);
}


function onMouseUpFunc(args) {
	if (objectManager != null) objectManager.callFunction(null, "onMouseUp", args, false);
}


function onMouseWheelFunc(args) {
	if (objectManager != null) objectManager.callFunction(null, "onMouseWheel", args, false);
}


function onKeyDownFunc(args) {
	if (objectManager != null) objectManager.callFunction(null, "onKeyDown", args, false);
	var ch = getCharPressed(args);
	if ((ch == 9) || (ch == 8)) preventDefaultEventAction(args); // prevent default TAB and Backspace key action
	else delegateEventAction(args);
}


function onKeyPressFunc(args) {
	if (objectManager != null) objectManager.callFunction(null, "onKeyPress", args, false);
	var ch = getCharPressed(args);
	if ((ch == 9) || (ch == 8)) preventDefaultEventAction(args); // prevent default TAB and Backspace key action
}


function onKeyUpFunc(args) {
	if (objectManager != null) objectManager.callFunction(null, "onKeyUp", args, false);
	var ch = getCharPressed(args);
	if ((ch == 9) || (ch == 8)) preventDefaultEventAction(args); // prevent default TAB and Backspace key action
}

		
function onXAMLLeftMouseDownFunc(sender, args) { // xaml event, to allow double click in IE
	if (navigatorType != "ie") return; // this event is important only in IE!
	if (objectManager != null) objectManager.callFunction(null, "onMouseDown", {layerX: currentMouseXPos, layerY: currentMouseYPos, button: 0}, false);
} 


function onFullScreenChangedFunc(sender, args)  {
    var host = rootCanvas.getHost();	
    isFullScreen = host.content.fullscreen;
	if (objectManager != null) objectManager.callFunction(null, "onFullScreenChanged", args, false);
}
