///////////////////////////////////////////////////////////////////////////////
//
//  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
var _width = 450;
var _height = 530;

PageTurn = function(maxNumPages,folder)
{
    this.maxNumPages = maxNumPages;
    this.folder = folder;
}

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, "Annotations", 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);
    
    //Menu Button
    var _menuButton = new InkButton(this.plugIn, "Menu", Silverlight.createDelegate(this.inkManager, this.inkManager.clickMenu));
    _menuButton.xamlElement["Canvas.Left"] = 10;
    this.plugIn.content.findname("inkButtonCanvas").children.add(_menuButton.xamlElement);
    
    var evenpagecanvas = this.plugIn.content.findname("evenPageCanvas");
    evenpagecanvas["Canvas.Left"] = 40 + _width;
    var shadowonevenpage = this.plugIn.content.findname("shadowOnEvenPage");
    shadowonevenpage["Canvas.Left"] = 40 + _width;
    shadowonevenpage["Points"] = _width + "," + _height + " " + _width + "," + _height + " " + _width + "," + _height + " " + _width + "," + _height;
    
    // 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("progressTexts");
        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();
        
        //Surface control
        new SurfaceControl(this.plugIn);
        
        // 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='" + _height + "' 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," + _height + "'/>";
    oddStr = oddStr + "        <LineSegment x:Name='page$0Point1' Point='0," + _height + "'/>";
    oddStr = oddStr + "        <LineSegment x:Name='page$0Point2' Point='0," + _height + "'/>";
    oddStr = oddStr + "        <LineSegment x:Name='page$0Point3' Point='0," + _height + "'/>";
    oddStr = oddStr + "        <LineSegment Point='0," + _height + "'/>";
    oddStr = oddStr + "      </PathFigure>";
    oddStr = oddStr + "    </PathGeometry>";
    oddStr = oddStr + "  </Canvas.Clip>";
    oddStr = oddStr + "  $1";
    oddStr = oddStr + "  <InkPresenter x:Name='page$0ip' Width='" + _width + "' Height='" + _height + "' 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, " + _height + "'/>";
    evenStr = evenStr + "        <LineSegment x:Name='page$0Point1' Point='" + _width + ", " + _height + "'/>";
    evenStr = evenStr + "        <LineSegment x:Name='page$0Point2' Point='" + _width + ", " + _height + "'/>";
    evenStr = evenStr + "        <LineSegment x:Name='page$0Point3' Point='" + _width + ", 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='" + _width + "' Height='" + _height + "' Canvas.Left='0' Canvas.Top='0'/>";
    evenStr = evenStr + "  $2";
    evenStr = evenStr + "</Canvas>";
    
    var foldShadowStr = "  <Rectangle Height='" + _height + "' 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 - 2;
    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, "");
        //Surface
        
        var newSurface = '<Canvas x:Name="allControls" Opacity="0" ';
        newSurface += 'Width="' + (_width) + '" Height="' + _height + '" Background="#00000000" xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">';
        newSurface += '<Canvas x:Name="translateControls">';
        newSurface += '<Rectangle Canvas.Left="' + (_width/2-80) + '" Canvas.Top="' + (_height/2-60) + '" Width="160" Height="120" Fill="#FFFFFF00" Stroke="#FF000000" StrokeThickness="3" RadiusX="10" RadiusY="10" Cursor="Hand" />';
        newSurface += '</Canvas>';
        newSurface += '<Canvas x:Name="rotateScaleControls">';
        newSurface += '<Rectangle                                    Width="100" Height="100" Fill="#FFFFFF00" Stroke="#FF000000" StrokeThickness="3" RadiusX="10" RadiusY="10" Cursor="Hand" />';
        newSurface += '<Rectangle Canvas.Left="' + (_width-100) + '"                  Width="100" Height="100" Fill="#FFFFFF00" Stroke="#FF000000" StrokeThickness="3" RadiusX="10" RadiusY="10" Cursor="Hand" />';
        //newEvenPageStr += '<Rectangle Canvas.Left="' + (_width-100) + '" Canvas.Top="' + (_height-100) + '" Width="100" Height="100" Fill="#FFFFFF00" Stroke="#FF000000" StrokeThickness="3" RadiusX="10" RadiusY="10" Cursor="Hand" />';
        newSurface += ' <Rectangle                   Canvas.Top="' + (_height-100) + '" Width="100" Height="100" Fill="#FFFFFF00" Stroke="#FF000000" StrokeThickness="3" RadiusX="10" RadiusY="10" Cursor="Hand" />';
        newSurface += '</Canvas>';
        newSurface += '</Canvas>';
        newEvenPageStr = newEvenPageStr.replace(/\$2/g, newSurface);
      }
      else
        newEvenPageStr = newEvenPageStr.replace(/\$2/g, foldShadowStr);
        
      var newEvenPage = this.plugIn.content.createFromXaml(newEvenPageStr);
      this.plugIn.content.findName("evenPageCanvas").children.add(newEvenPage);
      
    }
}

