﻿function OnErrorEventHandler(sender, errorArgs)
{
/// <summary>Trap errors and 'alert box' (for now)</summary>
/// <remarks>
/// Silverlight Application Scripting Error Handling
/// http://msdn2.microsoft.com/en-us/library/bb412395.aspx
/// </remarks>


    // The error message to display.
    var errorMsg = "Silverlight Error: \n\n";
    
    // Error information common to all errors.
    errorMsg += "Error Type:    " + errorArgs.errorType + "\n";
    errorMsg += "Error Message: " + errorArgs.errorMessage + "\n";
    errorMsg += "Error Code:    " + errorArgs.errorCode + "\n";
    
    // Determine the type of error and add specific error information.
    switch(errorArgs.errorType)
    {
        case "RuntimeError":
            // Display properties specific to RuntimeErrorEventArgs.
            if (errorArgs.lineNumber != 0)
            {
                errorMsg += "Line: " + errorArgs.lineNumber + "\n";
                errorMsg += "Position: " +  errorArgs.charPosition + "\n";
            }
            errorMsg += "MethodName: " + errorArgs.methodName + "\n";
            break;
        case "ParserError":
            // Display properties specific to ParserErrorEventArgs.
            errorMsg += "Xaml File:      " + errorArgs.xamlFile      + "\n";
            errorMsg += "Xml Element:    " + errorArgs.xmlElement    + "\n";
            errorMsg += "Xml Attribute:  " + errorArgs.xmlAttribute  + "\n";
            errorMsg += "Line:           " + errorArgs.lineNumber    + "\n";
            errorMsg += "Position:       " + errorArgs.charPosition  + "\n";
            break;
        default:
            break;
    }
    // Display the error message.
    alert(errorMsg);


    if (sender == 'VisualCollection') return;
    if (sender == 'StrokeCollection') return;
    if (sender.source)
    { // it's probably an image error
        sender.source='/Images/404notfound.jpg';
    }
}
function OnImageFailedHandler(sender, args)
{
/// <summary>
/// ImageFailed Handler
/// http://msdn2.microsoft.com/en-us/library/bb680294.aspx
/// </summary>
    // Create basic error message.
    var errorMsg = "\n Media Error Message     \n" ;

    // Add Media information.
    errorMsg += "MediaElement Name: " + sender.Name + "\n";
    errorMsg += "Media File Name: " + sender.Source + "\n";

    // Display error information
    //alert(errorMsg); 
    if (sender.source)
    { // it's probably an image error
        sender.source='Images/404notfound.jpg';
    } 
}

function OnLoadEventHandler (sender, args)
{
/// <summary>
/// Attach the Resize event handler
/// and call the 'root_Loaded' handler for the InkPresenter canvas
/// </summary>
    sender.content.onResize = OnResizeEventHandler;
    root_Loaded (sender, args);
    return true;
}

function OnResizeEventHandler (sender, eventArgs)
{
/// <summary>
/// Do layout resizing of the application whenever the plug-in actualwidth or actualheight changes.
/// </summary>
    ResizeLayout(sender, sender.width, sender.height);
    return true;
}

function ResizeLayout (sender, width, height)
{
/// <summary>
/// Resize and reposition application elements.
/// Perform layout tasks based on width and height.
/// </summary>
/// <remarks>
/// Resizes:
/// - Root canvas
/// - Markers
/// - InkPresenter
/// Moves:
/// - Ink tools
/// - Info Panel
/// - Copyright (url)
/// </remarks>
    var plugin = document.getElementById("SilverlightControl");
    
    grid = new Array(Math.ceil(plugin.clientWidth / TILE_SIZE));
    for (i = 0; i < grid.length; i++)
    {
        grid[i]=new Array(Math.ceil(plugin.clientHeight / TILE_SIZE));
    }
   
    width = plugin.clientWidth;
    height = plugin.clientHeight;

    var canvas1 = plugin.content.findName("canvasRoot");
    canvas1.Width = width;
    canvas1.Height = height;
    
    var markers = plugin.content.findName("canvasMarkers");
    markers.Width = width;
    markers.Height = height;
    
    var canvas2 = plugin.content.findName("canvasInk"); // InkPresenter
    canvas2.Width = width;
    canvas2.Height = height;
    
    var inkPres = canvas2.findName("inkPresenterElement");
    inkPres.Width = width;
    inkPres.Height = height;
    var inkTools = canvas2.findName("panel");
    
    inkTools["Canvas.Left"] = width - inkTools["Width"];
    
    var canvasInfoPanel = plugin.content.findName("canvasInfoPanel");
    canvasInfoPanel["Canvas.Left"] = width - canvasInfoPanel["Width"];
    
    
    var copyright = plugin.content.findName("canvasCopyright");
    copyright["Canvas.Left"] = width - copyright["Width"];
    copyright["Canvas.Top"] = height - copyright["Height"];
    
    
    var about = plugin.content.findName("canvasAbout");
    about["Canvas.Left"] = (width / 2) - (about["Width"] / 2);
    about["Canvas.Top"] = (height / 2) - (about["Height"] / 2);
    
    
    var canvas = plugin.content.findName("canvas");
    canvas.Width = width;
    canvas.Height = height;
    
    VIEW.set_Width(width);    // new
    VIEW.set_Height(height);   // new
    // delete all the Tiles, since we're going to re-add them
    canvas.children.clear();
    var xaml = '';
    var xamlC;
    for (var x = 0; x < grid.length; x++)
    {
        for (var y = 0; y < grid[x].length; y++)
        {
            xaml  = tileImageXaml (x, y, TILE_SIZE);
            xamlC = plugin.content.createFromXaml(xaml);
            try {
            canvas.children.add(xamlC);
            } catch (e) {}
        }
    }
    
    var col = Math.floor(CENTER.X / (TILE_SIZE));    var row = Math.floor(CENTER.Y / (TILE_SIZE));
    drawGridCentered (col, row, WORLD.Zoom);    //drawGridCentered - find top-left tile in here; CENTER.X - TOPLEFTTILE.X - (VIEW.Width/2))... or something
    setCanvasOffset(0, 0);
}


function onMoveMap (moveXTiles, moveYTiles)
{
/// <summary>Move the map by given 'tiles' up, down, left or right</summary>
/// <param name="moveX">number of Tiles to move sideways</param>
/// <param name="moveY">number of Tiles to move up/down</param>
    MoveMapByPixels (moveXTiles * TILE_SIZE, moveYTiles * TILE_SIZE);
}

function MoveMapByPixels (moveX, moveY)
{
/// <summary>Move by tile-chunks</summary>
/// <param name="moveX">number of pixels to move sideways</param>
/// <param name="moveY">number of pixels to move up/down</param>
    if ((moveX == 0) && (moveY == 0)) return; // no work to do
    
    CENTER.X += moveX;
    CENTER.Y += moveY;

    //VIEW.Left += moveX;
    //VIEW.Top  += moveY;

    var col = Math.floor(CENTER.X / (TILE_SIZE));    var row = Math.floor(CENTER.Y / (TILE_SIZE));

    drawGridCentered (col, row, WORLD.Zoom);
    return false;
}


function setCopyrightText(t)
{
/// <summary>
/// Set copyright text depending on tile source (called when map type changed)
/// </summary>
/// <remarks>bug: currently isn't set when page/map first loads</remarks>
   var slite = document.getElementById("SilverlightControl");
   var tblock = slite.content.findName("copyrightText1");
   tblock.Text = t; 
   tblock = slite.content.findName("copyrightText2");
   tblock.Text = t; 
}

function AboutButton_OnMouseUp (sender, args)
{
/// <summary>Show the About 'window'</summary>
    var slite = document.getElementById("SilverlightControl");
    var aboutCanvas = slite.content.findName("canvasAbout");
    aboutCanvas["Visibility"] = "Visible";
}
function AboutWindow_MouseUp (sender, args)
{
/// <summary>Hide the About 'window' (when it's clicked on)</summary>
    var slite = document.getElementById("SilverlightControl");
    var aboutCanvas = slite.content.findName("canvasAbout");
    aboutCanvas["Visibility"] = "Collapsed";
}
function AboutGamlLink_MouseUp (sender, args)
{
/// <summary>Open website in new window</summary>
    window.open('Gaml/','gaml','')
}
function ConceptDevelopmentNetLink_MouseUp (sender, args)
{
/// <summary>Open website in new window</summary>
    window.open('http://www.conceptdevelopment.net/','_blank','')
}
function ConceptDevBlogLink_MouseUp (sender, args)
{
/// <summary>Open website in new window</summary>
    window.open('http://conceptdev.blogspot.com/','_blank','')
}
function RaceReplayNetLink_MouseUp (sender, args)
{
/// <summary>Open website in new window</summary>
    window.open('http://www.racereplay.net/','_blank','')
}
function DeepZoomLink_MouseUp (sender, args)
{
/// <summary>Open website in new window</summary>
    //window.open('http://silverlightearth.com/2/','','')
    document.location = 'http://silverlightearth.com/2/';
}