// Revision History
// 2007-05-04 Added code to keep focus when expanding/collapsing.
// JScript source code
var margin = 3;
var m_zoomManager = new ZoomManager(0, 100, "ZoomHandleTransform", "Scale");
var beginX = 0;
var beginY = 0;
var dragging = false;
var clicking = false;
var m_expandedLeft;
var m_expandedTop;
var m_expandedTopic;
var m_buttonDown = false;
var m_draggingNotesHandle = false;
var m_showstatus = false;
var m_fanchildren = false;

function MediaFailed(sender, args)
{
    var statusText = sender.findName("Status_Text");
    
    statusText.Text = "Failed to play " + sender.Source;
}

function MouseLeftControl(sender, eventArgs)
{
    dragging = false;
    m_draggingNotesHandle = false;
}

function LostFocus(sender, eventArgs)
{
    dragging = false;
}

function GetParent(topic)
{
    var parent = topic.getParent().getParent();

    if (parent.Name == "Map")
    {
        return null;
    }
    
    return parent;
}

function RootLoaded(sender, eventArgs)
{
    var control = sender.getHost();
    
    //control.content.onResize = "OnResized";
    control.content.onResize = OnResized;
    
    UpdateLayout(sender, control.content.actualWidth, control.content.actualHeight);
    
    UpdateRelationships(sender);
}

function OnResized(sender, eventArgs)
{
    UpdateLayout(sender, sender.getHost().content.actualWidth, sender.getHost().content.actualHeight);
}

function UpdateLayout(sender, width, height)
{
    var scale = sender.findName("Scale");
    scale.CenterX = width / 2;
    scale.CenterY = height / 2;

    var background = sender.findName("Background");
    background.Width = width;
    background.Height = height;
    var translation = sender.findName("Translation");
    
    var centralTopic = sender.findName("Topics").children.getItem(0);
  
    translation.X = 5;//width / 2 - centralTopic.Width / 2;
    translation.Y = height / 2 - centralTopic.Height / 2;

    var status = sender.findName("Status");
 
    if (m_showstatus == true)
    {
        var statusText = sender.findName("Status_Text");
        var statusRect = sender.findName("Status_Rectangle");
        statusRect.Height = statusText.ActualHeight + margin * 2;
        statusRect.Width = width - margin * 2;

        status["Canvas.Top"] = height - statusRect.Height - margin;
    }
    else
    {
        status.Opacity = 0;
    }
    
    PositionFullScreenButton(sender, width);
    
    PositionNotes(sender, width, height);
    
    var image = sender.findName("FullScreenImage");
    
    image.Width = width;
    image.Height = height;
}

function PositionNotes(sender, width, height)
{
    var notes = sender.findName("Notes");
    
    notes["Canvas.Left"] = width - notes.Width;
    notes.Height = height - 60;
    
    var notesHandle = sender.findName("NotesHandle");
    
    notesHandle.Height = notes.Height;
    
    var hideNotes = sender.findName("HideNotes");
    
    hideNotes["Canvas.Left"] = notes.Width - hideNotes.Width - margin;
    
    var notesSeparator = sender.findName("NotesSeparator");
    
    notesSeparator.X2 = notes.Width;
}

function CentralTopicLoaded(sender, eventArgs)
{
    TopicLoaded(sender, eventArgs);
}

function IconsLoaded(sender, eventArgs)
{
    var width = 0;
    var height = 0;
    
    // there is no plus (central topic) or the minus is showing
    for (var i = 0; i < sender.children.count; i++)
    {
        var icon = sender.children.getItem(i);
        
        width += icon.Width;
        height += icon.Height;
    }
    
    if (width + height > 0)
    {
        sender.Width = width + margin;
        sender.Height = height + margin;
    }
}

function TopicLoaded(sender, eventArgs)
{
    if (sender == null)
    {
        return;
    }
    
    var topicArea = sender.findName(sender.Name + "_TopicArea");
    
    var image = sender.findName(sender.Name + "_Image");
    
    var text = sender.FindName(sender.Name + "_Text");
    
    var icons = sender.FindName(sender.Name + "_Icons");
    
    text["Canvas.Left"] = margin;
    
    var topicHeight = Math.max(text.ActualHeight, icons.Height);
    var textAndTopicWidth = text.ActualWidth;
    var topicWidth = text.ActualWidth + icons.Width;
    
    if (image)
    {
        textAndTopicWidth = Math.max(topicWidth, image.Width);
        topicWidth = textAndTopicWidth + icons.Width;
        
        image["Canvas.Left"] = margin + icons.Width + textAndTopicWidth / 2 - image.Width / 2; 
        text["Canvas.Top"] = margin * 2 + image.Height + topicHeight /2 - text.ActualHeight / 2;
        
        topicHeight += image.Height + margin * 2;
        icons["Canvas.Top"] = margin * 2 + image.Height;
    }
    else
    {
        text["Canvas.Top"] = margin + topicHeight /2 - text.ActualHeight / 2;
        icons["Canvas.Top"] = margin;
    }
    
    
    text["Canvas.Left"] = margin + icons.Width + textAndTopicWidth / 2 - text.ActualWidth / 2;
    
    var shape = sender.FindName(sender.Name + "_Shape");
    shape.Width = topicWidth + margin * 2;
    shape.Height = topicHeight + margin * 2;
    
    var shadow = sender.FindName(sender.Name + "_Shadow");
    shadow.Width = shape.Width;
    shadow.Height = shape.Height;
    
    var subTopics = sender.FindName(sender.Name + "_SubTopics");
    
    var hyperlink = sender.FindName(sender.Name + "_Hyperlink");
    
    
    var left = shape.Width + margin;
    
    if (hyperlink)
    {
        hyperlink["Canvas.Left"] = left;
        left += hyperlink.Width;
        hyperlink["Canvas.Top"] = shape.Height / 2 - hyperlink.Height / 2;
    }
    
    var notes = sender.FindName(sender.Name + "_Notes");
    
    if (notes)
    {
        notes["Canvas.Left"] = left;
        left+= notes.Width;
        notes["Canvas.Top"] = shape.Height / 2 - notes.Height / 2;
    }
    
    var attachments = sender.FindName(sender.Name + "_Attachments");
    
    if (attachments)
    {
        attachments["Canvas.Left"] = left;
        left += attachments.Width;
        attachments["Canvas.Top"] = shape.Height / 2 - attachments.Height / 2;
    }

    var expander = sender.FindName(sender.Name + "_Expander");
    
    if (expander)
    {
        expander["Canvas.Left"] = left;
        left += expander.Width;
        expander["Canvas.Top"] = shape.Height / 2 - expander.Height / 2;
    }

    if (subTopics)
    {    
        sender.Width = left + subTopics.Width;

        subTopics["Canvas.Top"] = - (subTopics.Height / 2 - shape.Height / 2);
        //var top = Math.min(shape["Canvas.Top"], subTopics["Canvas.Top"]);
        
        sender.Height = Math.max(shape.Height, subTopics.Height);
        
        //sender.Height = bottom - top;
        //sender["Canvas.Top"] = top;
        
        sender.Width += margin;
        
        subTopics["Canvas.Left"] = left + margin;
        
        //subTopics["Canvas.Top"] += shape.Height / 2;
        
        if (eventArgs != "Expand/Collapse")
        {
            var scale = sender.FindName(sender.Name + "_Scale");
            
            scale.CenterY = subTopics.Height / 2;
        }
    }
    else
    {
        sender.Width = shape.Width;
        sender.Height = shape.Height;
    }
    
    var translate = sender.findName(sender.Name + "_Translate");
    
    translate.Y = sender.Height / 2 - shape.Height / 2;
    
    //UpdateTopicLine(sender);
    
    UpdateDebugRect(sender);
}

function UpdateTopicLine(sender)
{
    var line = sender.findName(sender.Name + "_Line");
    
    if (line == null)
    {
        return;
    }
    
    var parent = GetParent(sender);
    
    if (parent == null)
    {
        return;
    }
    
//    var plus = sender.FindName(sender.Name + "_Expander_Plus");
//    
//    if (plus)
//    {
//        if (plus.Opacity == 1)
//        {
//            // invisible
//            line.Opacity = 0;
//        }
//        else
//        {
//            line.Opacity = 1;
//        }
//    }
        
    var x1 = GetAbsoluteLeftPosition(parent);
    var y1 = GetAbsoluteTopPosition(parent);
    
    var x2 = GetAbsoluteLeftPosition(sender);
    var y2 = GetAbsoluteTopPosition(sender);
    
    line.data = "M 0,0 " + 
        "L " + (x2 - x1) + "," + (y1 - y2); 
}

function UpdateDebugRect(canvas)
{
    var debug = canvas.findName(canvas.Name + "_Debug");
    
    if (debug)
    {
        debug.Width = canvas.Width;
        debug.Height = canvas.Height;
        debug["Canvas.Left"] = canvas["Canvas.Left"];
        debug["Canvas.Top"] = canvas["Canvas.Top"];
    }
}

function SubTopicsLoaded(sender, eventArgs)
{
    var width = 0;
    var height = 0;

    var plus = sender.FindName(sender.getParent().Name + "_Expander_Plus");

    if (plus == null || (plus && plus.Opacity == 0))
    {
        var topics = sender;
        
        // there is no plus (central topic) or the minus is showing
        for (var i = 0; i < topics.children.count; i++)
        {
            var child = topics.children.getItem(i);
            
            if (child.toString() != "Canvas")
            {
                continue;
            }
            
            width = Math.max(width, child.Width);
            
			// Item drawing offset            
            child["Canvas.Top"] = height;// + child.Height / 2;
     
            if (m_fanchildren == true)
            {
			    if (topics.children.count > 3)
			    {
				    var x = Math.sin( Math.PI * i / topics.children.count) * 100;
    				
				    // Spherical sweep
				    child["Canvas.Left"]  = toInt(x) - (half * 2);
			    }            
			}
            
            UpdateDebugRect(child);
            
			// Offset between items            
            height += child.Height + margin * 4;
            
            if (eventArgs == "Expand/Collapse")
            {
                var text = sender.FindName(child.Name + "_Text");
                //alert(text.Text + ":" + height);
            }
            //text.Text = height;
        }
    }

    sender.Width = width;
    sender.Height = height;
    
    //sender["Canvas.Top"] = - sender.Height / 2;
}

function EnterExpander(sender, eventArgs)
{
    var ellipse = sender.FindName(sender.Name + "_Ellipse");
    
    ellipse.Fill = "LightSteelBlue";
}

function LeaveExpander(sender, eventArgs)
{
    var ellipse = sender.FindName(sender.Name + "_Ellipse");
    
    ellipse.Fill = "White";
}

// Expand/collapse subtopics
//Revision history
//2007-05-04 MSS Added code to fix translation after expanding so that the parent doesn't appear to move
function ExpandCollapse(sender, eventArgs)
{
    // get the current position of the expander
    var left = GetRelativeLeftPosition(sender.getParent());
    
    var top = GetRelativeTopPosition(sender.getParent());
    
    m_expandedLeft = left;
    m_expandedTop = top;
    m_expandedTopic = sender.getParent();
    
    var plus = sender.FindName(sender.Name + "_Plus");
    
    var topicName = sender.getParent().Name;
    var scale = sender.FindName(topicName + "_Scale");
    var subTopics = sender.FindName(topicName + "_SubTopics");

    if (plus.Opacity == 1)
    {
        plus.Opacity = 0;

        if (scale)
        {
            SubTopicsLoaded(subTopics, null);
            
            scale.CenterY = subTopics.Height / 2;
        }
        
        var storyboard = sender.FindName(sender.Name + "_Expand");
        
        storyboard.begin();
        
        //try
        {
            var name = sender.FindName(topicName + "_Name").Text;
            //This will call the JavaScript-based analytics package.
            // If you use an analytics package, you should implement TrackEvent() in the Page's header.
            TrackEvent("/Expanded"+name);
        }
        //catch(error)
        {
            //alert(error.description);
        }
    }
    else
    {
        plus.Opacity = 1;
        
        if (scale)
        {
            scale.CenterY = subTopics["Canvas.Top"] + subTopics.Height / 2;
        }
        
        var storyboard = sender.FindName(sender.Name + "_Collapse");
        
        storyboard.begin();
    }
    
    var topic = sender;
    
    while (topic)
    {
        topic = topic.getParent();
        
        if (topic == null)
        {
            break;
        }
        
        var subtopics = sender.FindName(topic.Name + "_SubTopics");
        
        if (subtopics)
        {
            SubTopicsLoaded(subtopics, "Expand/Collapse");
            
            TopicLoaded(subtopics.getParent(), "Expand/Collapse");
        }
    }
    
    UpdateTopicLines(sender.findName("Topics").Children);
    
    AnimateCanvasTranslation(sender);
}

function UpdateTopicLines(collection)
{
    for (var i = 0; i < collection.Count; i++)
    {
        var item = collection.getItem(i);
        
        if (item.toString() == "Canvas")
        {
            continue;
        }
        
        if (item.Name  != "")
        {
            if (item.findName(item.Name + "_Line"))
            {
                UpdateTopicLine(item);
            }
        }
        
        UpdateTopicLines(item.Children);
    }
}

function AnimateCanvasTranslation(sender)
{
    var storyboard = sender.findName("TranslationAnimation");
    var animateX = sender.findName("Translation_X");
    var animateY = sender.findName("Translation_Y");
    
    // get the new position of the expander    
    var newLeft = GetRelativeLeftPosition(m_expandedTopic);
    var newTop = GetRelativeTopPosition(m_expandedTopic);
    
    var cx = newLeft - m_expandedLeft;
    var cy = newTop - m_expandedTop;
    
    var translate = sender.findName("Translation");
    
    // move the map by the amount of the offset.
    
    animateX.From = translate.X;
    animateX.To = translate.X - cx;
    animateY.From = translate.Y;
    animateY.To = translate.Y - cy;
    
    storyboard.begin();
}

function GetRelativeTopPosition(topic)
{
   var top = topic["Canvas.Top"];
   
   var transform = topic.RenderTransform;
   
   if (transform != null)
   {
        var name = transform.toString();

        if (name == "TranslateTransform")
        {
            top += transform.Y;
        }
   }
   
   return top;
}

function GetRelativeLeftPosition(topic)
{
   var left = topic["Canvas.Left"];
   
   var transform = topic.RenderTransform;
   
   if (transform != null)
   {
        var name = transform.toString();

        if (name == "TranslateTransform")
        {
            left += transform.X;
        }
   }
   
   return left;
}

function DoneExpanding(sender, eventArgs)
{
    UpdateRelationships(sender);
}

function StartDrag(sender, eventArgs)
{

    //window.status = "start dragging topic.";
    
    if (dragging || clicking || m_buttonDown || m_draggingNotesHandle)
    {
        m_buttonDown = false;
        
        clicking = false;
        
        return;
    }
    beginX = eventArgs.getPosition(null).x;
    beginY = eventArgs.getPosition(null).y;
    sender.captureMouse();
    dragging = true;
}

function BeginClick(sender, eventArgs)
{
    clicking = true;
}

function Drag(sender, eventArgs)
{
    if (!dragging)
    {
        return;
    }

    var translate = sender.findName("Translation");
    
    translate.X += eventArgs.getPosition(null).x - beginX;
    translate.Y += eventArgs.getPosition(null).y - beginY;
    
    beginX = eventArgs.getPosition(null).x;
    beginY = eventArgs.getPosition(null).y;
    
}

function EndDrag(sender, eventArgs)
{
    //if (dragging)
    {
        sender.releaseMouseCapture();
        
        dragging = false;
        
        //window.status = "End dragging topic.";
    }
}

function ZoomManager(top, bottom, handleTransform, scaleTransform)
{
    this.m_top = top;
    this.m_bottom = bottom;
    this.m_zooming = false;
    this.m_handlePosition = 0;
    this.m_handleTransform = handleTransform;
    this.m_scaleTransform = scaleTransform;
    
    this.StartZoom = StartZoom;
    this.DragZoom = DragZoom;
    this.EndZoom = EndZoom;
    this.ZoomTo = ZoomTo;
}

function ZoomTo(sender)
{
    var width = sender.getHost().content.ActualWidth;
    var height = sender.getHost().content.ActualHeight;
    
    var left = GetAbsoluteLeftPosition(sender) + sender.Width / 2;
    var top = GetAbsoluteTopPosition(sender) + sender.Height / 2;

    var translate = sender.findName("Translation");
    
    translate.X = width / 2 + left;
    translate.Y = height / 2 + top;
}

function StartZoom(sender, eventArgs)
{
    if (!this.m_zooming)
    {
        sender.findName("Root").captureMouse();
        this.m_zooming = true;
        this.m_handlePosition = eventArgs.getPosition(null).y;
    }
}

function DragZoom(sender, eventArgs)
{
    if (!this.m_zooming)
    {
        return;
    }
    
    var transform = sender.findName(this.m_handleTransform);
    
    var offset = eventArgs.getPosition(null).y - this.m_handlePosition;
    
    if (transform.Y + offset < this.m_top || transform.Y + offset > this.m_bottom)
    {
        return;
    }

    transform.Y += offset;
    
    this.m_handlePosition = eventArgs.getPosition(null).y;
    
    var scale = sender.findName(this.m_scaleTransform);
    
    scale.ScaleX += offset / 100;
    scale.ScaleY += offset / 100;
}

function EndZoom(sender, eventArgs)
{
    sender.findName("Root").releaseMouseCapture();
    
    this.m_zooming = false;
}

function ZoomHandleDown(sender, eventArgs)
{
    m_zoomManager.StartZoom(sender, eventArgs);
}

function ZoomHandleDrag(sender, eventArgs)
{
    m_zoomManager.DragZoom(sender, eventArgs);
}

function ZoomHandleUp(sender, eventArgs)
{
    m_zoomManager.EndZoom(sender, eventArgs);
}   
 
function EnterButton(sender, eventArgs)
{
    var rect = sender.findName(sender.Name + "_Rect");
    
    rect.Opacity = 1; 
}

function LeaveButton(sender, eventArgs)
{
    var rect = sender.findName(sender.Name + "_Rect");

    rect.Opacity = 0; 
}
 
function EnterAttachment(sender, eventArgs)
{
    EnterButton(sender, eventArgs);

    var url = sender.findName(sender.Name + "_Url");
    
    if (url)
    {
        window.status = url.Text;
    }
}

function LeaveAttachment(sender, eventArgs)
{
    LeaveButton(sender, eventArgs);
    
    var url = sender.findName(sender.Name + "_Url");
    
    if (url)
    {
        window.status = "";
    }
}

var m_media = null;

// this will open the first attachment
function ClickAttachment(sender, eventArgs)
{
    var media = sender.findName(sender.Name + "_Media");
    
    if (media)
    {
        m_media = media;
        
        var scale = sender.findName(sender.Name + "_Scale");
        
        if (scale.ScaleX > 1)
        {
            return;
        }
        
        //media.Position = 0;
        media.Play();
        media.IsHitTestVisible = true;
        
        var showMedia = sender.findName(sender.Name + "_ShowMedia");
        
        showMedia.begin();
    }
    else
    {
        var urlElement = sender.findName(sender.Name + "_Url");
        
        if (urlElement)
        {
            var url = urlElement.Text;

            try
            {                
                var name = sender.FindName(sender.getParent().Name + "_Name").Text;

                //This will call the JavaScript-based analytics package.
                // If you use an analytics package, you should implement TrackEvent() in the Page's header.
                TrackEvent("/OpenedLink"+name + "/" + url);
            }
            catch(error)
            {
                alert(error.description);
            }
                    
            window.open(url);
        }
    }
}

// this will open the first attachment
function HideAttachment(sender, eventArgs)
{
    var mediaHide = sender.findName(sender.Name + "_Hide");
    
    mediaHide.begin();
}

function CompletedHidingAttachment(sender, eventArgs)
{
    if (m_media)
    {
        m_media.IsHitTestVisible = false;

        m_media.Stop();
        
        m_media = null;
    }
}

function GetAbsoluteLeftPosition(control)
{
   var left = control["Canvas.Left"];

   var transform = control.RenderTransform;
   
   if (transform != null)
   {
        var name = transform.toString();

        if (name == "TranslateTransform" && control.Name != "Translation")
        {
           // left += transform.X;
        }
   }
   
   var parent = control.getParent();
   
   if (parent != null)
   {
        left += GetAbsoluteLeftPosition(parent);
   }
   
   return left;
}

function GetAbsoluteTopPosition(control)
{
   var top = control["Canvas.Top"];
   
   var transform = control.RenderTransform;
   
   if (transform != null)
   {
        var name = transform.toString();

        if (name == "TranslateTransform")
        {
            //top += transform.Y;
        }
   }
   
   var parent = control.getParent();
   
   if (parent != null)
   {
        top += GetAbsoluteTopPosition(parent);
   }
   
   return top;
}

function GetAbsoluteLeftPosition2(control)
{
   var left = control["Canvas.Left"];

   var transform = control.RenderTransform;
   
   if (transform != null)
   {
        var name = transform.toString();

        if (name == "TranslateTransform" && control.Name != "Translation")
        {
            left += transform.X;
        }
   }
   
   var parent = control.getParent();
   
   if (parent != null)
   {
        left += GetAbsoluteLeftPosition2(parent);
   }
   
   return left;
}

function GetAbsoluteTopPosition2(control)
{
   var top = control["Canvas.Top"];
   
   var transform = control.RenderTransform;
   
   if (transform != null)
   {
        var name = transform.toString();

        if (name == "TranslateTransform" && control.Name != "Translation")
        {
            top += transform.Y;
        }
   }
   
   var parent = control.getParent();
   
   if (parent != null)
   {
        top += GetAbsoluteTopPosition2(parent);
   }
   
   return top;
}


function PositionFullScreenButton(sender, width)
{
    var text = sender.findName("FullScreen_Text");
    
    var rect = sender.findName("FullScreen_Rectangle");
    
    rect.Width = text.ActualWidth + margin * 2;
    rect.Height = text.ActualHeight + margin * 2;
    
    var fullScreen = sender.findName("FullScreen");
    
    fullScreen["Canvas.Left"] = width - rect.Width - margin;
}

function FullScreen(sender, eventArgs)
{
    var text = sender.findName("FullScreen_Text");
    
    if (sender.getHost().content.FullScreen)
    {
        text.Text = "Full Screen";
        
        sender.getHost().content.FullScreen = false;
    }
    else
    {
        text.Text = "Embedded";
        
        sender.getHost().content.FullScreen = true;
    }
    
    OnResized(sender, eventArgs);
}

function IsVisible(topic)
{
    if (topic.Opacity == 0)
    {
        return false;
    }
    
    var parent = topic.getParent();
    
    if (parent)
    {
        return IsVisible(parent);
    }
    
    return true;
}

function UpdateRelationships(sender)
{
    var relationships = sender.findName("Relationships");
    
    if (relationships == null)
    {
        return;
    }
    
    for (var i = 0; i < relationships.Children.Count; i++)
    {
        var relationship = relationships.Children.GetItem(i);
        
        var connection0 = sender.findName(relationship.Name + "_Connection0").Text;
        var connection1 = sender.findName(relationship.Name + "_Connection1").Text;
        
        var topic0 = sender.FindName(connection0);
        var topic1 = sender.FindName(connection1);
        
        if (topic0 && topic1)
        {
            if (IsVisible(topic0) && IsVisible(topic1))
            {
                relationship.Opacity = 1;
            }
            else
            {
                relationship.Opacity = 0;
                
                continue;
            }
        
            var shape0 = sender.findName(topic0.Name + "_Shape");
            var shape1 = sender.findName(topic1.Name + "_Shape");
            
            var left0 = Math.floor(GetAbsoluteLeftPosition2(topic0)) + shape0.Width / 2;
            var left1 = Math.floor(GetAbsoluteLeftPosition2(topic1)) + shape1.Width / 2;
            var top0 = Math.floor(GetAbsoluteTopPosition2(topic0)) + shape0.Height / 2;
            var top1 = Math.floor(GetAbsoluteTopPosition2(topic1)) + shape1.Height / 2;

            var path = sender.FindName(relationship.Name + "_Path");
            
            var lineShape = sender.findName(relationship.Name + "_LineShape").Text;
            
            var cx0 = Math.floor(left0 + Number(sender.findName(relationship.Name + "_CX0").Text) * 10);
            var cy0 = Math.floor(top0 + Number(sender.findName(relationship.Name + "_CY0").Text) * 10);
            var cx1 = Math.floor(left1 + Number(sender.findName(relationship.Name + "_CX1").Text) * 10);
            var cy1 = Math.floor(top1 + Number(sender.findName(relationship.Name + "_CY1").Text) * 10);
            
            if (lineShape == "urn:mindjet:Straight")
            {
                path.Data = "M " + left0 + ","+ top0 + " " +
                "L " + left1 + "," + top1;
            }
            else if (lineShape == "urn:mindjet:Bezier")
            {
		        var data = "M " + left0 + ","+ top0 + " " +
                "C " + cx0 + "," + cy0 + " " + 
                cx1 + "," + cy1 + " " + 
                left1 + "," + top1;

                path.Data = data;
            }
            else if (lineShape == "urn:mindjet:Curved")
            {
                // This is still not right
                var data = "M " + left0 + ","+ top0 + "\n" +
                    "Q " +  cx0 + "," + cy0 + " " + cx1 + "," + cy1 + " " + left1 + "," + top1;

                path.Data = data;
            }
            else if (lineShape == "urn:mindjet:Angled")
            {
                path.Data = "M " + left0 + ","+ top0 + " " +
                "L " + cx0 + "," + cy0 + " " +
                "L " + cx1 + "," + cy1 + " " +
                "L " + left1 + "," + top1;
            }
        }
    }
}

var m_currentNotes = null;

function ShowNotes(sender, eventArgs)
{
    try
    {                
        var name = sender.FindName(sender.getParent().Name + "_Name").Text;
        
        //This will call the JavaScript-based analytics package.
        // If you use an analytics package, you should implement TrackEvent() in the Page's header.
        TrackEvent("/ShowNotes"+name);
    }
    catch(error)
    {
        alert(error.description);
    }
    

    var notes = sender.findName("Notes");
    
    var notesScale = sender.findName("NotesScale");
    
    notesScale.CenterX = notes.Width;
    
    var animation = sender.findName("ShowNotes");
    
    animation.begin();
    
    var notesTitle = sender.findName("NotesTitle");
    
    var topicName = sender.getParent().Name;
    
    notesTitle.Text = sender.findName(topicName + "_Text").Text;
    
    if (m_currentNotes)
    {
        m_currentNotes.IsHitTestVisible = false;
        m_currentNotes.Opacity = 0;
    }
    
    m_currentNotes = sender.findName(sender.Name + "_Content");
    
    m_currentNotes.IsHitTestVisible = true;
    
    //m_currentNotes.Height = sender.getHost().content.ActualHeight;
    
    m_currentNotes.Opacity = 1;
    
    m_currentNotes.children.getItem(0).Width = notes.Width - margin * 2;
}

function ButtonDown(sender, eventArgs)
{
    m_buttonDown = true;
}

function HideNotes(sender, eventArgs)
{
    var notes = sender.findName("Notes");
    
    var notesScale = sender.findName("NotesScale");
    
    notesScale.CenterX = notes.Width;

    var animation = sender.findName("HideNotesStory");
    
    animation.begin();
}

function CompletedHidingNotes(sender, eventArgs)
{
    if (m_currentNotes)
    {
        m_currentNotes.Opacity = 0;
        m_currentNotes.IsHitTestVisible = false;
    }
    m_currentNotes = null;
}

var m_notesHandleX = 0;
var m_draggingNotesHandle = false;

function StartDragNotesHandle(sender, eventArgs)
{
    m_notesHandleX = eventArgs.getPosition(null).x;

    sender.captureMouse();
    
    m_draggingNotesHandle = true;
}

function DragNotesHandle(sender, eventArgs)
{
    if (m_draggingNotesHandle)
    {
        var notes = sender.findName("Notes");
        
        var translate = eventArgs.getPosition(null).x - m_notesHandleX;
        
        notes["Canvas.Left"] += translate;
        
        notes.Width = sender.getHost().content.ActualWidth - notes["Canvas.Left"];
        
        PositionNotes(sender, sender.getHost().content.ActualWidth, sender.getHost().content.ActualHeight); 
        
        m_currentNotes.children.getItem(0).Width = notes.Width - margin * 2;
        
        m_notesHandleX = eventArgs.getPosition(null).x;
    }
}

function EndDragNotesHandle(sender, eventArgs)
{
    if (m_draggingNotesHandle)
    {
        sender.releaseMouseCapture();
        
        m_draggingNotesHandle = false;
    }
}

function ShowImage(sender, eventArgs)
{
    return;
    
    var image = sender.findName("FullScreenImage");
    
    image.Source = sender.Source;
    image.Width = sender.getHost().content.ActualWidth;
    image.Height = sender.getHost().content.ActualHeight;
    image.Opacity = 1;
    //m_zoomManager.ZoomTo(sender);
    
    FullScreen(sender, eventArgs);
}
