///////////////////////////////////////////////////////////////////////////////
//
//  mainPage.js
//
// 
// © 2007 Microsoft Corporation. All Rights Reserved.
//
// This file is licensed as part of the Silverlight 1.0 SDK, for details look here: http://go.microsoft.com/fwlink/?LinkID=89144&clcid=0x409
//
///////////////////////////////////////////////////////////////////////////////

// total pages available
PageTurn = function(maxNumPages)
{
    this.maxNumPages = maxNumPages;
}

function getTwoDigitInt(number)
{
  // if this number already has two digits, return the int part
  if ((number < 0) || (number >= 10))
    return Math.floor(number).toString();

  // otherwise, prepend zero
  return "0" + Math.floor(number);
}

PageTurn.prototype.handleLoad = function(control, userContext, rootElement) {
    this.plugIn = control;      // Store the host plug-in
    this.currentDownload = 0;   // Current resource to be downloaded  
    
    // create NavigationManager
    this.navigationManager = new NavigationManager(this.plugIn, this.maxNumPages);
    
    // create InkManager element that controls the mouseCaptureCanvas
    // InkManager = function(plugIn)
    this.inkManager = new InkManager(this.plugIn, this.navigationManager);
    
    // InkToggleButton = function(plugIn, text, checkedHandler, uncheckedHandler)
    var _annotateToggleButton = new InkToggleButton(this.plugIn, "Annotate", Silverlight.createDelegate(this.inkManager, this.inkManager.toggleInkMode), Silverlight.createDelegate(this.inkManager, this.inkManager.toggleInkMode));
    this.plugIn.content.findname("inkButtonCanvas").children.add(_annotateToggleButton.xamlElement);
    
    // InkButton = function(plugIn, text, clickedHandler)
    var _clearAnnotationButton = new InkButton(this.plugIn, "Clear Annotations", Silverlight.createDelegate(this.inkManager, this.inkManager.clearInk));
    _clearAnnotationButton.xamlElement["Canvas.Left"] = 74;
    this.plugIn.content.findname("inkButtonCanvas").children.add(_clearAnnotationButton.xamlElement);
    
    // create PageGenerator
    this.pageGenerator = new PageGenerator(this.maxNumPages);
    
    // begin downloading all assets
    this.downloadAssets();
    
    // Hook up thumbnail viewer (page browser control)
    // PageBrowserControl = function(plugIn, target, pageGenerator, this.maxNumPages)
    new PageBrowserControl(this.plugIn, rootElement.findName("pageBrowserControl"), this.pageGenerator, this.navigationManager, this.maxNumPages);
    
}

PageTurn.prototype.downloadAssets = function()
{
    this.downloader = this.plugIn.createObject("Downloader");
    this.downloader.addEventListener("downloadProgressChanged", Silverlight.createDelegate(this, this.downloadProgressChanged));
    this.downloader.addEventListener("completed", Silverlight.createDelegate(this, this.downloadCompleted));
    this.downloader.open("GET", this.pageGenerator.resourceArray[this.currentDownload]);
    this.downloader.send();
}

PageTurn.prototype.downloadProgressChanged = function(sender, args)
{
    var progressRect = this.plugIn.content.findName("progressRect");
    progressRect.width = (sender.downloadProgress) * 450;
}

PageTurn.prototype.downloadCompleted = function(sender, args)
{
    this.currentDownload++;
    if (this.currentDownload < this.pageGenerator.resourceArray.length)
    {
        var progressText = this.plugIn.content.findName("progressText");
        progressText.text = "Downloading: " + this.pageGenerator.resourceArray[this.currentDownload];
        this.downloader.open("GET", this.pageGenerator.resourceArray[this.currentDownload]);
        this.downloader.send();
    }
    else
    {
        // Hide progress UI
        var downloadUI = this.plugIn.content.findName("downloadUI");
        this.plugIn.content.findName("fadeDownloadUI").begin();
        downloadUI.isHitTestVisible = false;

        // add pages and thumbnails
        this.addOddPages();
        this.addEvenPages();
        
        // initialize dragging elements
        this.navigationManager.beginPageAnimation("showFold");
    }
}

//create and add the pages on the left hand side of the book
PageTurn.prototype.addOddPages = function()
{
    //this is the template for all odd pages
    var oddStr =      "<Canvas x:Name='page0$0' xmlns='http://schemas.microsoft.com/client/2007' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>";
//    oddStr = oddStr + "        MouseLeftButtonDown='oddPageMouseDown' MouseLeftButtonUp='oddPageMouseUp' MouseMove='oddPageMouseMove'>";
    oddStr = oddStr + "  <Canvas.RenderTransform>";
    oddStr = oddStr + "    <TransformGroup>";
    oddStr = oddStr + "      <RotateTransform x:Name='page$0Rotate' CenterX='0' CenterY='570' Angle='0'/>";
    oddStr = oddStr + "      <TranslateTransform x:Name='page$0Translate' X='0' Y='0'/>";
    oddStr = oddStr + "    </TransformGroup>";
    oddStr = oddStr + "  </Canvas.RenderTransform>";
    oddStr = oddStr + "  <Canvas.Clip>";
    oddStr = oddStr + "    <PathGeometry>";
    oddStr = oddStr + "      <PathFigure>";
    oddStr = oddStr + "        <LineSegment Point='0,570'/>";
    oddStr = oddStr + "        <LineSegment x:Name='page$0Point1' Point='0, 570'/>";
    oddStr = oddStr + "        <LineSegment x:Name='page$0Point2' Point='0, 570'/>";
    oddStr = oddStr + "        <LineSegment x:Name='page$0Point3' Point='0, 570'/>";
    oddStr = oddStr + "        <LineSegment Point='0,570'/>";
    oddStr = oddStr + "      </PathFigure>";
    oddStr = oddStr + "    </PathGeometry>";
    oddStr = oddStr + "  </Canvas.Clip>";
    oddStr = oddStr + "  $1";
    oddStr = oddStr + "  <InkPresenter x:Name='page$0ip' Width='420' Height='570' Canvas.Left='0' Canvas.Top='0' />";
    oddStr = oddStr + "  <Rectangle Height='1000' Width='20' Opacity='0.6' x:Name='page$0FoldShadow'>";
    oddStr = oddStr + "    <Rectangle.RenderTransform>";
    oddStr = oddStr + "      <TransformGroup>";
    oddStr = oddStr + "        <RotateTransform x:Name='page$0FoldShadowRotate' CenterX='0' CenterY='0' Angle='0'/>";
    oddStr = oddStr + "        <TranslateTransform x:Name='page$0FoldShadowTranslate' X='0' Y='0'/>";
    oddStr = oddStr + "      </TransformGroup>";
    oddStr = oddStr + "    </Rectangle.RenderTransform>";
    oddStr = oddStr + "    <Rectangle.Fill>";
    oddStr = oddStr + "      <LinearGradientBrush StartPoint='0,0' EndPoint='1,0'>";
    oddStr = oddStr + "        <GradientStop Color='#00000000' Offset='0'/>";
    oddStr = oddStr + "        <GradientStop Color='#FF000000' Offset='1'/>";
    oddStr = oddStr + "      </LinearGradientBrush>";
    oddStr = oddStr + "    </Rectangle.Fill>";
    oddStr = oddStr + "  </Rectangle>";
    oddStr = oddStr + "</Canvas>";

    // if maxNumPages is odd, we will ignore the last page, so last odd is two behind
    var _lastOdd;
    if (((this.maxNumPages/2) - Math.floor(this.maxNumPages/2)) == 0)
      _lastOdd = this.maxNumPages - 1;
    else
      _lastOdd = this.maxNumPages - 2;

    for (var i=1; i<=_lastOdd; i = i+2)
    {
      // $0: two digit index of this page
      var newOddPageStr = oddStr.replace(/\$0/g, getTwoDigitInt(i));
      newOddPageStr = newOddPageStr.replace(/\$1/g, this.pageGenerator.getPageString(i));
      var newOddPage = this.plugIn.content.createFromXaml(newOddPageStr);
      
      // hook up event handlers for the odd pages
      newOddPage.addEventListener("mouseLeftButtonDown", Silverlight.createDelegate(this.navigationManager, this.navigationManager.oddPageMouseDown));
      newOddPage.addEventListener("mouseLeftButtonUp", Silverlight.createDelegate(this.navigationManager, this.navigationManager.oddPageMouseUp));
      newOddPage.addEventListener("mouseMove", Silverlight.createDelegate(this.navigationManager, this.navigationManager.oddPageMouseMove));
      
      // add this odd page to the scene
      this.plugIn.content.findName("oddPageCanvas").children.add(newOddPage);
    }
}

//create and add the pages on the right hand side of the book
PageTurn.prototype.addEvenPages = function()
{ 
    //this is the template for all even pages
    var evenStr =    "<Canvas x:Name='page0$0' xmlns='http://schemas.microsoft.com/client/2007' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>";
    evenStr = evenStr + "  <Canvas.Clip>";
    evenStr = evenStr + "    <PathGeometry>";
    evenStr = evenStr + "      <PathFigure>";
    evenStr = evenStr + "        <LineSegment Point='0,0'/>";
    evenStr = evenStr + "        <LineSegment Point='0, 570'/>";
    evenStr = evenStr + "        <LineSegment x:Name='page$0Point1' Point='420, 570'/>";
    evenStr = evenStr + "        <LineSegment x:Name='page$0Point2' Point='420, 570'/>";
    evenStr = evenStr + "        <LineSegment x:Name='page$0Point3' Point='420, 0'/>";
    evenStr = evenStr + "        <LineSegment Point='0,0'/>";
    evenStr = evenStr + "      </PathFigure>";
    evenStr = evenStr + "    </PathGeometry>";
    evenStr = evenStr + "  </Canvas.Clip>";
    //evenStr = evenStr + "  <Image Source='assets/page$0.jpg'/>";
    evenStr = evenStr + "  $1";
    evenStr = evenStr + "  <InkPresenter x:Name='page$0ip' Width='420' Height='570' Canvas.Left='0' Canvas.Top='0'/>";
    evenStr = evenStr + "  $2";
    evenStr = evenStr + "</Canvas>";
    
    var foldShadowStr = "  <Rectangle Height='570' Width='30' Opacity='0.2'>";
    foldShadowStr +=    "    <Rectangle.Fill>";
    foldShadowStr +=    "      <LinearGradientBrush StartPoint='0,0' EndPoint='1,0'>";
    foldShadowStr +=    "        <GradientStop Color='#BBFFFFFF' Offset='0'/>";
    foldShadowStr +=    "        <GradientStop Color='#00FFFFFF' Offset='1'/>";
    foldShadowStr +=    "      </LinearGradientBrush>";
    foldShadowStr +=    "    </Rectangle.Fill>";
    foldShadowStr +=    "  </Rectangle>";


    // if maxNumPages is odd, we will ignore the last page, so last odd is two behind
    var _lastEven;
    if (((this.maxNumPages/2) - Math.floor(this.maxNumPages/2)) == 0)
      _lastEven = this.maxNumPages;
    else
      _lastEven = this.maxNumPages - 1;

    for (var i=_lastEven; i>=0; i = i-2)
    {
      // $0: index of this page
      var newEvenPageStr = evenStr.replace(/\$0/g, getTwoDigitInt(i));
      newEvenPageStr = newEvenPageStr.replace(/\$1/g, this.pageGenerator.getPageString(i));
      if (i == 0)
        newEvenPageStr = newEvenPageStr.replace(/\$2/g, "");
      else
        newEvenPageStr = newEvenPageStr.replace(/\$2/g, foldShadowStr);
        
      var newEvenPage = this.plugIn.content.createFromXaml(newEvenPageStr);
      this.plugIn.content.findName("evenPageCanvas").children.add(newEvenPage);
    }
}


