var chapters = {
ch1 : [
	{name: "Listing 1.1", folder: "01/", files: {html: "Listing 1.1.htm", xaml: "Chapter1.xaml"}},
	{name: "Listing 1.3", folder: "01/", files: {html: "Listing 1.3.htm", xaml: "Chapter1.xaml"}},
	{name: "Listing 1.4", folder: "01/", files: {html: "Listing 1.4.htm", xaml: "Chapter1.xaml", js: "CreateSilverlight.js"}},
	{name: "Listing 1.6", folder: "01/", files: {html: "Listing 1.6.htm", js: "CreateSilverlight.1.7.js"}},
	{name: "Listing 1.8", folder: "01/", files: {html: "Listing 1.8.htm", xaml: "Chapter1.xaml", js: "CreateSilverlight.1.9.js"}}
],
ch2 : [
	{name: "Figure 2.1", folder: "02/", files: {xaml: "Figure 2.1.xaml"}},
	{name: "Figure 2.2", folder: "02/", files: {xaml: "Figure 2.2.xaml"}},
	{name: "Figure 2.3", folder: "02/", files: {xaml: "Figure 2.3.xaml"}}
],
ch3 : [
	{name: "Figure 3.1a", folder: "03/", files: {xaml: "Figure 3.1a.xaml"}},
	{name: "Figure 3.1b", folder: "03/", files: {xaml: "Figure 3.1b.xaml"}},
	{name: "Figure 3.1c", folder: "03/", files: {xaml: "Figure 3.1c.xaml"}},
	{name: "Figure 3.2a", folder: "03/", files: {xaml: "Figure 3.2a.xaml"}},
	{name: "Figure 3.2b", folder: "03/", files: {xaml: "Figure 3.2b.xaml"}},
	{name: "Figure 3.2c", folder: "03/", files: {xaml: "Figure 3.2c.xaml"}},
	{name: "Figure 3.3a", folder: "03/", files: {xaml: "Figure 3.3a.xaml"}},
	{name: "Figure 3.3b", folder: "03/", files: {xaml: "Figure 3.3b.xaml"}},
	{name: "Figure 3.4a", folder: "03/", files: {xaml: "Figure 3.4a.xaml"}},
	{name: "Figure 3.4b", folder: "03/", files: {xaml: "Figure 3.4b.xaml"}},
	{name: "Figure 3.4c", folder: "03/", files: {xaml: "Figure 3.4c.xaml"}},
	{name: "Figure 3.5a", folder: "03/", files: {xaml: "Figure 3.5a.xaml"}},
	{name: "Figure 3.5b", folder: "03/", files: {xaml: "Figure 3.5b.xaml"}},
	{name: "Figure 3.5c", folder: "03/", files: {xaml: "Figure 3.5c.xaml"}},
	{name: "Figure 3.5d", folder: "03/", files: {xaml: "Figure 3.5d.xaml"}},
	{name: "Figure 3.6a", folder: "03/", files: {xaml: "Figure 3.6a.xaml"}},
	{name: "Figure 3.6b", folder: "03/", files: {xaml: "Figure 3.6b.xaml"}},
	{name: "Figure 3.7a", folder: "03/", files: {xaml: "Figure 3.7a.xaml"}},
	{name: "Figure 3.7b", folder: "03/", files: {xaml: "Figure 3.7b.xaml"}},
	{name: "Figure 3.7c", folder: "03/", files: {xaml: "Figure 3.7c.xaml"}},
	{name: "Figure 3.8a", folder: "03/", files: {xaml: "Figure 3.8a.xaml"}},
	{name: "Figure 3.8b", folder: "03/", files: {xaml: "Figure 3.8b.xaml"}},
	{name: "Figure 3.8c", folder: "03/", files: {xaml: "Figure 3.8c.xaml"}},
	{name: "Figure 3.8d", folder: "03/", files: {xaml: "Figure 3.8d.xaml"}},
	{name: "Figure 3.9a", folder: "03/", files: {xaml: "Figure 3.9a.xaml"}},
	{name: "Figure 3.9b", folder: "03/", files: {xaml: "Figure 3.9b.xaml"}},
	{name: "Figure 3.9c", folder: "03/", files: {xaml: "Figure 3.9c.xaml"}},
	{name: "Figure 3.9d", folder: "03/", files: {xaml: "Figure 3.9d.xaml"}},
	{name: "Figure 3.10", folder: "03/", files: {xaml: "Figure 3.10.xaml"}},
	{name: "Figure 3.11", folder: "03/", files: {xaml: "Figure 3.11.xaml"}},
	{name: "Figure 3.12", folder: "03/", files: {xaml: "Figure 3.12.xaml"}},
	{name: "Figure 3.13", folder: "03/", files: {xaml: "Figure 3.13.xaml"}},
	{name: "Figure 3.14", folder: "03/", files: {xaml: "Figure 3.14.xaml"}},
	{name: "Figure 3.15", folder: "03/", files: {xaml: "Figure 3.15.xaml"}},
	{name: "Figure 3.16", folder: "03/", files: {xaml: "Figure 3.16.xaml"}},
	{name: "Figure 3.17", folder: "03/", files: {xaml: "Figure 3.17.xaml"}},
	{name: "Figure 3.18", folder: "03/", files: {xaml: "Figure 3.18.xaml"}},
	{name: "Figure 3.19", folder: "03/", files: {xaml: "Figure 3.19.xaml"}},
	{name: "Figure 3.20", folder: "03/", files: {xaml: "Figure 3.20.xaml"}},
	{name: "Figure 3.21a", folder: "03/", files: {xaml: "Figure 3.21a.xaml"}},
	{name: "Figure 3.21b", folder: "03/", files: {xaml: "Figure 3.21b.xaml"}},
	{name: "Figure 3.22a", folder: "03/", files: {xaml: "Figure 3.22a.xaml"}},
	{name: "Figure 3.22b", folder: "03/", files: {xaml: "Figure 3.22b.xaml"}},
	{name: "Figure 3.23a", folder: "03/", files: {xaml: "Figure 3.23a.xaml"}},
	{name: "Figure 3.23b", folder: "03/", files: {xaml: "Figure 3.23b.xaml"}},
	{name: "Figure 3.23c", folder: "03/", files: {xaml: "Figure 3.23c.xaml"}},
	{name: "Figure 3.23d", folder: "03/", files: {xaml: "Figure 3.23d.xaml"}},
	{name: "Figure 3.23e", folder: "03/", files: {xaml: "Figure 3.23e.xaml"}}
],
ch4 : [
	{name: "Figure 4.1", folder: "04/", files: {xaml: "Figure 4.1.xaml"}},
	{name: "Figure 4.2", folder: "04/", files: {xaml: "Figure 4.2.xaml"}},
	{name: "Figure 4.3", folder: "04/", files: {xaml: "Figure 4.3.xaml"}},
	{name: "Figure 4.4a", folder: "04/", files: {xaml: "Figure 4.4a.xaml"}},
	{name: "Figure 4.4b", folder: "04/", files: {xaml: "Figure 4.4b.xaml"}},
	{name: "Figure 4.4c", folder: "04/", files: {xaml: "Figure 4.4c.xaml"}},
	{name: "Figure 4.5", folder: "04/", files: {html: "Figure 4.5.htm", xaml: "Figure 4.5.xaml", js: "CreateSilverlight.4.5.js"}},
	{name: "Figure 4.6", folder: "04/", files: {xaml: "Figure 4.6.xaml"}},
	{name: "Figure 4.7", folder: "04/", files: {xaml: "Figure 4.7.xaml"}},
	{name: "Figure 4.8", folder: "04/", files: {html: "Figure 4.8.htm", xaml: "Figure 4.8.xaml", js: "CreateSilverlight.4.8.js"}},
	{name: "Figure 4.9", folder: "04/", files: {xaml: "Figure 4.9.xaml"}}
],
ch5 : [
	{name: "Figure 5.1", folder: "05/", files: {xaml: "Figure 5.1.xaml"}},
	{name: "Figure 5.2a", folder: "05/", files: {xaml: "Figure 5.2a.xaml"}},
	{name: "Figure 5.2b", folder: "05/", files: {xaml: "Figure 5.2b.xaml"}},
	{name: "Figure 5.2c", folder: "05/", files: {xaml: "Figure 5.2c.xaml"}},
	{name: "Figure 5.2d", folder: "05/", files: {xaml: "Figure 5.2d.xaml"}},
	{name: "Figure 5.2e", folder: "05/", files: {xaml: "Figure 5.2e.xaml"}},
	{name: "Figure 5.3a", folder: "05/", files: {xaml: "Figure 5.3a.xaml"}},
	{name: "Figure 5.3b", folder: "05/", files: {xaml: "Figure 5.3b.xaml"}},
	{name: "Figure 5.4a", folder: "05/", files: {xaml: "Figure 5.4a.xaml"}},
	{name: "Figure 5.4b", folder: "05/", files: {xaml: "Figure 5.4b.xaml"}},
	{name: "Figure 5.4c", folder: "05/", files: {xaml: "Figure 5.4c.xaml"}},
	{name: "Figure 5.5", folder: "05/", files: {xaml: "Figure 5.5.xaml"}},
	{name: "Figure 5.6", folder: "05/", files: {xaml: "Figure 5.6.xaml"}},
	{name: "Figure 5.7", folder: "05/", files: {xaml: "Figure 5.7.xaml"}},
	{name: "Figure 5.8", folder: "05/", files: {xaml: "Figure 5.8.xaml"}},
	{name: "Figure 5.9", folder: "05/", files: {xaml: "Figure 5.9.xaml"}},
	{name: "Figure 5.10", folder: "05/", files: {xaml: "Figure 5.10.xaml"}},
	{name: "Figure 5.11", folder: "05/", files: {xaml: "Figure 5.11.xaml"}},
	{name: "Figure 5.12a", folder: "05/", files: {xaml: "Figure 5.12a.xaml"}},
	{name: "Figure 5.12b", folder: "05/", files: {xaml: "Figure 5.12b.xaml"}},
	{name: "Figure 5.12c", folder: "05/", files: {xaml: "Figure 5.12c.xaml"}},
	{name: "Figure 5.12d", folder: "05/", files: {xaml: "Figure 5.12d.xaml"}},
	{name: "Figure 5.13", folder: "05/", files: {xaml: "Figure 5.13.xaml"}},
	{name: "Figure 5.14", folder: "05/", files: {xaml: "Figure 5.14.xaml"}},
	{name: "Figure 5.15", folder: "05/", files: {xaml: "Figure 5.15.xaml"}}
],
ch6 : [
	{name: "Figure 6.1", folder: "06/", files: {xaml: "Figure 6.1.xaml"}},
	{name: "Figure 6.2", folder: "06/", files: {xaml: "Figure 6.2.xaml"}},
	{name: "Figure 6.3", folder: "06/", files: {html: "Figure 6.3.htm", xaml: "Figure 6.3.xaml", js: "CreateSilverlight.6.3.js"}},
	{name: "Figure 6.4", folder: "06/", files: {xaml: "Figure 6.4.xaml"}},
	{name: "Figure 6.4 with Click Handler", folder: "06/", files: {html: "Figure 6.4 with Click Handler.htm", xaml: "Figure 6.4 with Click Handler.xaml", js: "CreateSilverlight.6.4 with Click Handler.js"}},
	{name: "Figure 6.5", folder: "06/", files: {xaml: "Figure 6.5.xaml"}},
	{name: "Figure 6.6", folder: "06/", files: {xaml: "Figure 6.6.xaml"}},
	{name: "Figure 6.7", folder: "06/", files: {xaml: "Figure 6.7.xaml"}},
	{name: "Figure 6.8a", folder: "06/", files: {xaml: "Figure 6.8a.xaml"}},
	{name: "Figure 6.8b", folder: "06/", files: {xaml: "Figure 6.8b.xaml"}},
	{name: "Figure 6.9", folder: "06/", files: {xaml: "Figure 6.9.xaml"}},
	{name: "Figure 6.10", folder: "06/", files: {html: "Figure 6.10.htm", xaml: "Figure 6.10.xaml", js: "CreateSilverlight.6.10.js"}},
	{name: "Figure 6.11", folder: "06/", files: {xaml: "Figure 6.11.xaml"}},
	{name: "Figure 6.12a", folder: "06/", files: {xaml: "Figure 6.12a.xaml"}},
	{name: "Figure 6.12b", folder: "06/", files: {xaml: "Figure 6.12b.xaml"}},
	{name: "Figure 6.12c", folder: "06/", files: {xaml: "Figure 6.12c.xaml"}},
	{name: "Figure 6.12d", folder: "06/", files: {xaml: "Figure 6.12d.xaml"}},
	{name: "Figure 6.12e", folder: "06/", files: {xaml: "Figure 6.12e.xaml"}},
	{name: "Figure 6.13a", folder: "06/", files: {xaml: "Figure 6.13a.xaml"}},
	{name: "Figure 6.13b", folder: "06/", files: {xaml: "Figure 6.13b.xaml"}},
	{name: "Figure 6.14", folder: "06/", files: {html: "Figure 6.14.htm", xaml: "Figure 6.14.xaml", js: "CreateSilverlight.6.14.js"}},
	{name: "Figure 6.15", folder: "06/", files: {xaml: "Figure 6.15.xaml"}},
	{name: "Figure 6.16", folder: "06/", files: {xaml: "Figure 6.16.xaml"}},
	{name: "Figure 6.17", folder: "06/", files: {xaml: "Figure 6.17.xaml"}},
	{name: "Figure 6.18", folder: "06/", files: {xaml: "Figure 6.18.xaml"}},
	{name: "Figure 6.19", folder: "06/", files: {xaml: "Figure 6.19.xaml"}},
	{name: "Figure 6.20", folder: "06/", files: {xaml: "Figure 6.20.xaml"}},
	{name: "Figure 6.21", folder: "06/", files: {xaml: "Figure 6.21.xaml"}},
	{name: "Figure 6.22a", folder: "06/", files: {xaml: "Figure 6.22a.xaml"}},
	{name: "Figure 6.22b", folder: "06/", files: {xaml: "Figure 6.22b.xaml"}},
	{name: "Figure 6.22c", folder: "06/", files: {xaml: "Figure 6.22c.xaml"}}
],
ch7 : [
	{name: "Figure 7.1", folder: "07/", files: {html: "Figure 7.1.htm", xaml: "Figure 7.1.xaml", js: "CreateSilverlight.7.1.js"}},
	{name: "DragDrop Example", folder: "07/", files: {html: "DragDrop Example.htm", xaml: "DragDrop Example.xaml", js: "CreateSilverlight.DragDrop.js", js2: "DragDrop.js"}},
	{name: "Figure 7.2", folder: "07/", files: {html: "Figure 7.2.htm", xaml: "Figure 7.2.xaml", js: "CreateSilverlight.7.2.js", js2: "ScrollingCanvas.js"}}
],
ch8 : [
	{name: "Figure 8.1", folder: "08/", files: {html: "Figure 8.1.htm", xaml: "Figure 8.1.xaml", js: "CreateSilverlight.8.1.js"}},
	{name: "Figure 8.1 with Gradient", folder: "08/", files: {html: "Figure 8.1 with Gradient.htm", xaml: "Figure 8.1 with Gradient.xaml", js: "CreateSilverlight.8.1 with Gradient.js"}},
	{name: "Figure 8.2", folder: "08/", files: {html: "Figure 8.2.htm", xaml: "Figure 8.2.xaml", js: "CreateSilverlight.8.2.js"}},
	{name: "Figure 8.3", folder: "08/", files: {html: "Figure 8.3.htm", xaml: "Figure 8.3.xaml", js: "CreateSilverlight.8.3.js"}},
	{name: "Figure 8.4", folder: "08/", files: {html: "Figure 8.4.htm", xaml: "Figure 8.4.xaml", js: "CreateSilverlight.8.4.js"}}
],
ch9 : [
	{name: "Figure 9.1 By Hand", folder: "09/", files: {html: "Figure 9.1.htm", xaml: "Figure 9.1.xaml", js: "CreateSilverlight.9.1.js"}},
	{name: "Figure 9.1 DoubleAnimation", folder: "09/", files: {xaml: "Figure 9.1 DoubleAnimation.xaml"}},
	{name: "Figure 9.1 MouseEnter+Leave", folder: "09/", files: {html: "Figure 9.1 MouseEnterLeave.htm", xaml: "Figure 9.1 MouseEnterLeave.xaml", js: "CreateSilverlight.9.1 MouseEnterLeave.js"}},
	{name: "Figure 9.1 Resources", folder: "09/", files: {html: "Figure 9.1 Resources.htm", xaml: "Figure 9.1 Resources.xaml", js: "CreateSilverlight.9.1 Resources.js"}},
	{name: "Figure 9.2", folder: "09/", files: {html: "Figure 9.2.htm", xaml: "Figure 9.2.xaml", js: "CreateSilverlight.9.2.js"}},
	{name: "Figure 9.3", folder: "09/", files: {html: "Figure 9.3.htm", xaml: "Figure 9.3.xaml", js: "CreateSilverlight.9.3.js"}},
	{name: "Figure 9.4", folder: "09/", files: {html: "Figure 9.4.htm", xaml: "Figure 9.4.xaml", js: "CreateSilverlight.9.4.js"}},
	{name: "Figure 9.5", folder: "09/", files: {xaml: "Figure 9.5.xaml"}},
	{name: "Figure 9.6", folder: "09/", files: {xaml: "Figure 9.6.xaml"}},
	{name: "Figure 9.7", folder: "09/", files: {xaml: "Figure 9.7.xaml"}},
	{name: "Figure 9.8", folder: "09/", files: {xaml: "Figure 9.8.xaml"}},
	{name: "Figure 9.9", folder: "09/", files: {xaml: "Figure 9.9.xaml"}}
],
ch10 : [
	{name: "Figure 10.1", folder: "10/", files: {xaml: "Figure 10.1.xaml"}},
	{name: "Figure 10.2", folder: "10/", files: {xaml: "Figure 10.2.xaml"}},
	{name: "Figure 10.3", folder: "10/", files: {html: "Figure 10.3.htm", xaml: "Figure 10.3.xaml", js: "CreateSilverlight.js"}}
]
};

var cachedFiles = new Object();
var changedFiles = new Object();
var currentFile = null;
var currentData = null;
var onWebServer = false;

function onLoad()
{
  // Give time for all frames to load
  setTimeout("loadChapter('ch1')",1000);
}

function loadChapter(selectedChapter)
{
  fetchFile("", "Silverlight.js");
  if (cachedFiles["Silverlight.js"])
    onWebServer = true;
  else
  {
    parent.document.getElementById("fs").cols="100%,0";
  }

  var data = chapters[selectedChapter];
  currentData = data[0];

    refreshExampleLinks(selectedChapter);

  var links = "";
  var count = 1;
  for (var ch in chapters)
  {
    if (links.length > 0) links += " | ";
    
    if (selectedChapter == ch)
        links += '<b>Chapter ' + count + '</b>';
    else
        links += '<a onclick="loadChapter(\'' + ch + '\');">Chapter ' + count + '</a>';
        
    count++;
  }
  document.getElementById("chapters").innerHTML = links;

  showOutput();
  if (currentData.files.html)
      showFile(currentData.files.html);
  else
      showFile(currentData.files.xaml);
}

function refreshExampleLinks(selectedChapter)
{
  var data = chapters[selectedChapter];
  var links = "";
  
  for (var i = 0; i < data.length; i++)
  {
    if (links.length > 0) links += " | ";
    if (currentData.name == data[i].name)
        links += "<b>" + data[i].name + "</b>";
    else
        links += "<a onclick='switchExample(\"" + selectedChapter + "\", " + i + ");'>" + data[i].name + "</a>";
  }
  document.getElementById("examples").innerHTML = links;
}

function refreshFileLinks(selection)
{
  var links = "";

  var files = currentData.files; 
  for (var f in files)
  {
    if (links.length > 0) links += " | ";
    
    var text = files[f];
    if (changedFiles[files[f]])
        text = "<i>" + text + "</i>";

    if (selection == files[f])
    {
        text = "<b>" + text + "</b>";
        if (changedFiles[files[f]])
            text += " (<a onclick='parent.parent.frames[\"chapters\"].reset();'>reset</a>)";
    }
    else
        text = "<a onclick='parent.parent.frames[\"chapters\"].showFile(\"" + files[f] + "\");'>" + text + "</a>";
    
    links += text;
  }

    try
    {
        parent.document.frames["editor"].document.frames["editorLinks"].document.body.innerHTML = links;
    }
    catch (ex)
    {
        try 
        {
        parent.document.getElementById("editor").contentDocument.getElementById("editorLinks").contentDocument.body.innerHTML = links;
        }
        catch (ex) {}
    }
}

function switchExample(chap, num)
{
  currentData = chapters[chap][num];
  refreshExampleLinks(chap);
  showOutput();
  if (currentData.files.html)
      showFile(currentData.files.html);
  else
      showFile(currentData.files.xaml);
}

function textUpdated()
{
    changedFiles[currentFile] = true;
    refreshFileLinks(currentFile);
    showOutput();
}

function showOutput()
{
  parent.document.getElementById("output").src = "about:blank";
  setTimeout(showOutput2, 100);
}

function showOutput2()
{
    try
    {
        if (parent.document.frames["output"].document.readyState != "complete")
        {
            setTimeout(showOutput2, 100);
            return;
        }
    }
    catch (ex)
    {
    }
    
  if (currentFile)
  {
        try
        {
            cachedFiles[currentFile] = parent.document.frames["editor"].document.frames["textarea"].document.getElementById("textarea").value;
        }
        catch (ex)
        {
            cachedFiles[currentFile] = parent.document.getElementById("editor").contentDocument.getElementById("textarea").contentDocument.getElementById("textarea").value;
        }
  }

  var files = currentData.files;
  
  if (files.html)
  {
      var xamlTouched = cachedFiles[files.xaml];
      
        fetchFile("", files.html); // HTML file must be in the same directory
        fetchFile(currentData.folder, files.xaml);
        if (files.js) fetchFile(currentData.folder, files.js);
        if (files.js2) fetchFile(currentData.folder, files.js2);

        if (!onWebServer)
        {
            parent.document.getElementById("output").src = files.html;
        }
        else
        {
            var html = cachedFiles[files.html];

            var re = new RegExp('\<script type\=\"text\/javascript\" src\=\"Silverlight.js\"\>', "ig");
            html = html.replace(re, '<script type="text/javascript">' + cachedFiles["Silverlight.js"]);

            re = new RegExp('\<script type\=\"text\/javascript\" src\=\"' + currentData.folder + files.js + '\"\>', "ig");
            html = html.replace(re, '<script type="text/javascript">' + cachedFiles[files.js]);

            re = new RegExp('\<script type\=\"text\/javascript\" src\=\"' + currentData.folder + files.js2 + '\"\>', "ig");
            html = html.replace(re, '<script type="text/javascript">' + cachedFiles[files.js2]);
            
            html = "<script type='text/javascript'>window.onerror = function(m,u,l){var text=parent.parent.frames['chapters'].onJavaScriptError(m,u,l); if (document.getElementById('silverlightControl')) document.getElementById('silverlightControl').style.display='none'; document.write(text); return true;}</script>" + html;

            html = html.replace("function onSilverlightError", "function onSilverlightErrorUnused");
            html = "<script type='text/javascript'>function onSilverlightError(s,e){var text=parent.parent.frames['chapters'].onSilverlightError(s,e); document.getElementById('silverlightControl').style.display='none'; document.write(text);}</script>" + html;

            if (xamlTouched)
            {
                html = '<script id="inlineXaml" type="text/xaml">' + cachedFiles[files.xaml] + '</script>' + html;
                var re = new RegExp(currentData.folder + files.xaml, "ig");
                html = html.replace(re, "#inlineXaml");
            }

            try
            {
                parent.document.frames["output"].document.write(html);
            }
            catch (ex)
            {
                parent.document.getElementById("output").contentDocument.write(html);
            }
        }
    }
    else // xaml only
    {
        var xamlTouched = cachedFiles[files.xaml];
        fetchFile(currentData.folder, files.xaml);

        var html = "<html><head><script type='text/javascript' src='Silverlight.js'></script><script type='text/javascript'>function onSilverlightError(s,e){var text=parent.parent.frames['chapters'].onSilverlightError(s,e); document.getElementById('silverlightControl').style.display='none'; document.write(text);}</script></head><body style='margin:0px 0px 0px 6px'>";
        if (xamlTouched)
        {
            html += '<script id="inlineXaml" type="text/xaml">' + cachedFiles[files.xaml] + '</script>';
            var control = Silverlight.createObjectEx(
            {
              source: "#inlineXaml",
              id: "silverlightControl",
              properties:
              { width: "100%", height: "100%", version: "1.0" },
              events: { }
            }
            );
            var re = new RegExp('\<param name\s*\=\s*\"onError\" value\=\".*\" \/\>', "ig");
            control = control.replace(re, '<param name="onError" value="onSilverlightError"/>');
            html += control;
            html += "</body></html>";
        }
        else
        {
            html += '<script type="text/javascript">setTimeout(f,0);function f() { Silverlight.createObjectEx({';
            html += 'source: "' + currentData.folder + files.xaml + '", ';
            html += 'parentElement: document.body, ';
            html += 'id: "silverlightControl", properties: { width: "100%", height: "100%", version: "1.0" }, events: {} } );';
            html += "}</script></body></html>";
        }

        try
        {
            parent.document.frames["output"].document.write(html);
        }
        catch (ex)
        {
            parent.document.getElementById("output").contentDocument.write(html);
        }
    }
}

function reset()
{
  changedFiles[currentFile] = null;
  showFile(currentFile, true);
  showOutput();
}

function fetchFile(folder, file, force)
{
  if (force || !cachedFiles[file])
  {
    try
    {
      var x = new window.XMLHttpRequest();
      x.open('GET', folder + file, false);
      x.send(null);    
      cachedFiles[file] = x.responseText;
    }
    catch (ex) {}
  }
}

function showFile(file, force)
{
  if (currentFile)
  {
        try
        {
            cachedFiles[currentFile] = parent.document.frames["editor"].document.frames["textarea"].document.getElementById("textarea").value;
        }
        catch (ex)
        {
            cachedFiles[currentFile] = parent.document.getElementById("editor").contentDocument.getElementById("textarea").contentDocument.getElementById("textarea").value;
        }
  }

  if (file.endsWith(".htm"))
    fetchFile("", file, force);
  else
    fetchFile(currentData.folder, file, force);

  if (cachedFiles[file])
  {
        try
        {
            parent.document.frames["editor"].document.frames["textarea"].document.getElementById("textarea").value = cachedFiles[file];
        }
        catch (ex)
        {
            parent.document.getElementById("editor").contentDocument.getElementById("textarea").contentDocument.getElementById("textarea").value = cachedFiles[file];
        }
        currentFile = file;
  }
  else
  {
        try
        {
            parent.document.frames["editor"].document.frames["textarea"].document.getElementById("textarea").value = "ERROR: Could not retrieve file.";
        }
        catch (ex)
        {
            parent.document.getElementById("editor").contentDocument.getElementById("textarea").contentDocument.getElementById("textarea").value = "ERROR: Could not retrieve file.";
        }
        currentFile = null;
  }
  refreshFileLinks(file);
}

function onSilverlightError(sender, args)
{
    var errMsg = "<div style='z-index:9999;padding:10px;border:solid 5px #ef4f1a;font-family: Segoe UI, Tahoma;background-color:white'><span style='color:#ef4f1a'><b>" + args.errorMessage + "</b></span><br/>";
    errMsg += "(Silverlight " + args.errorType + " #" + args.errorCode + ")<br/>";
    if (args.errorType == "ParserError")
    {
        var file = cachedFiles[currentData.files.xaml];
        try
        {
            var lines = file.split('\n');
            var line = lines[args.lineNumber-1];
            errMsg += "<pre style='color:red'>" + line.replace("<","&lt;") + "</pre>";
        }
        catch (ex) {}
        errMsg += "Line " + args.lineNumber + " in " + (currentData.files.xaml ? currentData.files.xaml : "inline XAML");
    }
    else if (args.errorType == "RuntimeError")
    {
        if (args.lineNumber != 0)
        {
            errMsg += "Line: " + args.lineNumber + ", ";
            errMsg += "Position: " + args.charPosition + ", ";
        }
        errMsg += "Function: " + args.methodName;
    }
    errMsg += "</div>";
    return errMsg;
}

function onJavaScriptError(msg, url, line)
{
    var errMsg = "<div style='z-index:9999;padding:10px;border:solid 5px #ef4f1a;font-family: Segoe UI, Tahoma;background-color:white'><span style='color:#ef4f1a'><b>" + msg + "</b></span><br/>";
    if (currentData.files.js2)
        errMsg += "(JavaScript Error)<br/>";
    else
        errMsg += "(JavaScript Error from " + currentData.files.js + ")<br/>";
    errMsg += "</div>";
    return errMsg;
}