var _plugin;
var _rootcanvas;
var _origin;
var _zrect;
var zoom;
var sx1;
var sy1;
var sx2;
var sy2;
var fx1;
var fy1;
var fx2;
var fy2;
var px1;
var py1;
var px2;
var py2;

var colorHighlight = -16747845;
var colorHover = -6366978;
var colorHoverHighlight = -6366979;
var colorNormal = -1579031;


function onModelLoaded(sender)
{
	_plugin = sender.getHost();
	_rootcanvas = sender;
	_origin = getByName("model.anchor");
	_zrect = getByName("model.zoom");

	fx1 = parseFloat(_zrect["Canvas.Left"] );
	fx2 = fx1 + _zrect.width;
	fy1 = parseFloat(_zrect["Canvas.Top"]);
	fy2 = fy1 + _zrect.height;
	showExtents();
}

function getByName(name) 
{
	return _plugin.content.findName(name); 
}

function showExtents()
{
	var width = SilverlightHostElement.clientWidth;
	var height = SilverlightHostElement.clientHeight - 20;
	var scale = width / (fx2-fx1);
	var yscale = height / (fy2-fy1);

	if (yscale < scale) scale = yscale;
	setModelScale(scale);
	_rootcanvas["Canvas.Left"] = (width - (fx1 + fx2) * scale) / 2;
	_rootcanvas["Canvas.Top"] = (height + (fy1 + fy2) * scale) / 2;
}

function setModelScale(newscale)
{
	zoom = newscale;
	var modelscale = getByName("model.scale");
	if (modelscale)
	{
		var ratio = modelscale.ScaleX / newscale;
		modelscale.ScaleX = newscale;
		modelscale.ScaleY = -newscale;
		//setStrokeThickness(ratio);
	}
}

function setStrokeThickness(ratio)
{
	var stack = new Array();
	stack.push( _rootcanvas );
	do
	{
		var obj = stack.pop();
		if (isShape(obj))
			obj.StrokeThickness = ratio * obj.StrokeThickness;
		if (isCanvas(obj))
		{
			for (var i=0; i < obj.Children.Count; ++i)
				stack.push(obj.Children.GetItem(i));
		}
	} while (stack.length > 0);
}

function isShape(obj)
{
	if (obj.ToString() == 'Line') return true;
	if (obj.ToString() == 'Polygon') return true;
	//if (obj.ToString() == 'Polyline') return true;
	//If (obj.ToString() == 'Rectangle') return true;
	//if (obj.ToString() == 'Ellipse') return true;
	//if (obj.ToString() == 'Path') return true;
	return false;
}
    
function isCanvas(obj) 
{
	return (obj.ToString() == 'Canvas'); 
}

function onMouseEnter(sender, mouseEventArgs)
{ 
	if (isShape(sender)) 
	{
		var brush=sender.fill;
		//alert ("THE COLOR OF THE SENDER IS "+ brush.color);
		if (brush.color == colorHighlight)
		{
			brush.color = colorHoverHighlight;
		}
		else 
		{
			brush.color = colorHover;  
		}

		var tip=sender.Tag;
		var tooltip1=getByName("tooltipfg");		
		tooltip1.Text=tip;
		tooltip1.FontSize=14/zoom;
		tooltip1.opacity=.9;

		zx1 = mouseEventArgs.getPosition(null).x;
		zy1 = mouseEventArgs.getPosition(null).y;
		zx2 = mouseEventArgs.getPosition(_origin).x;
		zy2 = mouseEventArgs.getPosition(_origin).y;
		var width = SilverlightHostElement.clientWidth;
		var height = SilverlightHostElement.clientHeight - 20;
     
		var h=tooltip1.ActualHeight;
		var w=tooltip1.ActualWidth + h;
		if (zx1>width/2)
			zx2 -= (h+w);
		else
			zx2 += h;
		if (sy1>height/2)
			zy2 += h*2;
		else
			zy2 -= h;
		tooltip1["Canvas.Left"] = zx2 + h/2;
		tooltip1["Canvas.Top"] = zy2 + h;

		var tooltip2=getByName("tooltipbg"); 
		tooltip2.StrokeThickness = .5/zoom;   
		tooltip2["Canvas.Left"] = zx2 ;
		tooltip2["Canvas.Top"] = zy2 ;
		tooltip2.width=w;
		tooltip2.height=h;
		tooltip2.opacity=.9;
	}
}

function onMouseLeave(sender, mouseEventArgs)
{ 
	if (isShape(sender))
	{
		var tooltip1=getByName("tooltipfg");	
		tooltip1.text="";
		var tooltip2=getByName("tooltipbg");    
		tooltip2.opacity=0;

		var brush = sender.fill;
		if (brush.color == colorHoverHighlight)
		{
			brush.color = colorHighlight;
		}
		else
		{
			brush.color = colorNormal;
		}
	}
}

function ClearStoreSelection()
{
	for (i in StoresArray)
	{
		var clearStore = getByName (StoresArray[i][1]);
		if (clearStore != null)
		{
			clearStore.Fill.Color = colorNormal;
		}
	}

	for (i in AdditionalStoreUnitArray)
	{
		var clearStore = getByName(AdditionalStoreUnitArray[i][0]);
		if (clearStore != null)
		{
			clearStore.Fill.Color = colorNormal;
		}
	}
}

// highlight the store based on Unitnumber 
function HighlightUnitNumber(unitnumber)
{
       var store = getByName (unitnumber);
       if (store != null)
       {
	       store.Fill.Color = colorHighlight;
	        for (i in StoresArray)
		{
			if (StoresArray[i][0] == store.Tag)
			{
				var changeStoreColor = getByName (StoresArray[i][1]);
				if (changeStoreColor != null)
				{
					changeStoreColor.Fill.Color = colorHighlight;
				}
			}
		}

	        for (i in AdditionalStoreUnitArray)
		{
			if (AdditionalStoreUnitArray[i][1] == unitnumber)
			{
				var changeStoreColor = getByName (AdditionalStoreUnitArray[i][0]);
				if (changeStoreColor != null)
				{
					changeStoreColor.Fill.Color = colorHighlight;
				}
			}
		}
	}
}

// Hovering off links  - set to 
function hyperLinkHoverOut(unitnumber)
{
       var store = getByName(unitnumber);
       if (store!=null)
       {
	       if (store.Fill.Color == colorHoverHighlight) 
	       {
		       store.Fill.Color = colorHighlight;
	       }
	}

        for (i in AdditionalStoreUnitArray)
	{
		if (AdditionalStoreUnitArray[i][1] == unitnumber)
		{
			var changeStoreColor = getByName (AdditionalStoreUnitArray[i][0]);
			if (changeStoreColor != null)
			{
				if (changeStoreColor.Fill.Color == colorHoverHighlight) 
				{
					changeStoreColor.Fill.Color = colorHighlight;
				}
			}
		}
	}
}

// Enter the hyperlink to turn coral
function hyperLinkHoverIn (unitnumber)
{
	var store = getByName(unitnumber);
	if (store != null)
	{
		store.Fill.Color = colorHoverHighlight;
	}

        for (i in AdditionalStoreUnitArray)
	{
		if (AdditionalStoreUnitArray[i][1] == unitnumber)
		{
			var changeStoreColor = getByName (AdditionalStoreUnitArray[i][0]);
			if (changeStoreColor != null)
			{
				changeStoreColor.Fill.Color = colorHoverHighlight;
			}
		}
	}
}

// Hover in over text or compass rose - change fill to red
function SelectHighlight(sender)
{
	if (sender.Name.indexOf ("Nav") >= 0 )
	{
		sender.Fill = "orange";
	}
	else if (sender.Name.indexOf("MagZoom") >= 0 || sender.Name.indexOf("plus1") >=0 || sender.Name.indexOf("plus2") >=0)	
	{
		var circleFill = sender.findName ('MagZoomIn');
		circleFill.Fill = "orange";
	}
	else if (sender.Name.indexOf("Minus") >= 0 || sender.Name.indexOf("zOut") >=0)
	{
		var circleFill = sender.findName("zOut");
		circleFill.Fill = "orange";
	}
	else
	{
		sender.Foreground = "orange";
	}
}

// Hover out text or compass rose - change fill to original
function UnSelectHighlight(sender)
{
	if (sender.Name.indexOf ("Nav") >= 0)
	{
		sender.Fill = "#E5E5E5";
	}
	else if (sender.Name.indexOf("MagZoom") >= 0 || sender.Name.indexOf ("plus1")>=0 || sender.Name.indexOf("plus2")>=0)
	{
		var circleFill = sender.findName ('MagZoomIn');
		circleFill.Fill = "#828282";
	}
	else if (sender.Name.indexOf("Minus") >= 0 || sender.Name.indexOf("zOut")>=0)
	{
		var circleFill = sender.findName("zOut");
		circleFill.Fill = "#828282";
	}
	else
	{
		sender.Foreground = "white";
	}
}

// Zoom function. Based on the caller, it sets the co-ordinates correctly
// and then calls the functions that does the actuall zooming.
function ZoomIn (sender)
{
	var level = sender.Name;
	var LevelXAML = getByName(level);

	px1 = LevelXAML["Canvas.Left"];
	py1 = LevelXAML["Canvas.Top"];
	px2 = px1 + LevelXAML.Width;
	py2 = py1 + LevelXAML.Height;

	ZoomSet();
}

function zoom_out()
{
	var x_width ;
	var y_height;
	var canvas = getByName('FloorPlanLevels');
	var LevelXAML = canvas.children.getItem(0);

	x_width = (px2 - px1) / 10;
	y_height = (py2 - py1) / 20;
		
	px1 = px1 - x_width;
	py1 = py1 - y_height;
	px2 = px2 + x_width ;
	py2 = py2 + y_height;
		
	if ((px2-px1 >= LevelXAML.Width) || (py2-py1 >= LevelXAML.Height))
	{	
		LoadZoom();
	}
	else
	{
		ZoomSet();
	}
}

function ZoomSet()
{
	var width = SilverlightHostElement.clientWidth;
	var height = SilverlightHostElement.clientHeight - 20;

	_zrect["Canvas.Left"] = px1;
	_zrect["Canvas.Top"] = py1;
	_zrect.width = px2 - px1;
	_zrect.height = py2 - py1;

	if (px2 < px1)
	{
		_zrect["Canvas.Left"] = px2;
		_zrect.width = px1 - px2;
	}
	if (py2 < py1)
	{
		_zrect["Canvas.Top"] = py2;
		_zrect.height = py1 - py2;
	}

	var scale = width / _zrect.width;
	var yscale = height / _zrect.height;

	if (yscale < scale) 
		scale = yscale;

	setModelScale(scale);

	var wx1 = _zrect["Canvas.Left"];
	var wx2 = wx1 + _zrect.width;
	var wy1 = _zrect["Canvas.Top"];
	var wy2 = wy1 + _zrect.height;

	_rootcanvas["Canvas.Left"] = (width - (wx1 + wx2) * scale) / 2;
	_rootcanvas["Canvas.Top"] = (height + (wy1 + wy2) * scale) / 2;
}


//-------------------------------------------------------------------
// Functions for the Navigation Arrows and zoom in/ zoom out buttons
function CompassRose (sender)
{
	var delta;

	NavCaller = sender.Name;
	
	if (isNaN(px1))
	{
		px1 = 0;
		py1 = 0;
		px2 = 16000;
		py2 = 32000;
	}
	else if (NavCaller == "NavUp")
	{
		delta = (py2 - py1) / 10;
		py1 = py1 + delta;
		py2 = py2 + delta;
	}
	else if (NavCaller == "NavDown")
	{
		delta = (py2 - py1) / 10;
		py1 = py1 - delta;
		py2 = py2 - delta;;
	}
	else if (NavCaller == "NavRight")
	{
		delta = (px2 - px1) / 10;
		px1 = px1 + delta;
		px2 = px2 + delta;
	}
	else if (NavCaller == "NavLeft")
	{
		delta = (px2 - px1) / 10;
		px1 = px1 - delta;
		px2 = px2 - delta;
	}
	else if (NavCaller == "MagZoomIn" || NavCaller == "plus1" || NavCaller == "plus2")
	{

		var x_width ;
		var y_height;
		var canvas = getByName('FloorPlanLevels');
		var LevelXAML = canvas.children.getItem(0);
		
		if ((px2-px1 > LevelXAML.Width / 10) || (py2-py1 > LevelXAML.Height / 10))
		{
			x_width = (px2 - px1 ) / 10;
			y_height = (py2 - py1) / 25;
		
			px1 = px1 + x_width;
			py1 = py1 + y_height;
			px2 = px2 - x_width;
			py2 = py2 - y_height;
		}
	}
	else
	{
		alert ("Error");
	}
	ZoomSet();
}

//-----------------------------------------------------------------------------------
function LoadZoom()
{
	var canvas = getByName('FloorPlanLevels');
	var LevelXAML = canvas.children.getItem(0);

	px1 = LevelXAML["Canvas.Left"];
	py1 = LevelXAML["Canvas.Top"];
	px2 = px1 + LevelXAML.Width;
	py2 = py1 + LevelXAML.Height;

	ZoomSet();
}

//-----------------------> Function for directing stores to the correct page when 
// they click on the map
function StoreWebSite(sender)
{
	for (i in StoresArray)
	{
		if (sender.Name == StoresArray[i][1])
		{
			  window.location.href = StoresArray[i][2];
		}
	}

	for (i in AdditionalStoreUnitArray)
	{
		if (sender.Name == AdditionalStoreUnitArray[i][0])
		{
			  window.location.href = AdditionalStoreUnitArray[i][2];
		}
	}
}


