///////////////////////////////////////////////////////////////////////////////
//
//  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.content = control.content;
    this.currentDownload = 0;   // Current resource to be downloaded  
    this.content.onResize = Silverlight.createDelegate(this, this._OnResize);
    this.PageScale = rootElement.findName("PageScale");
    this.PageTranslation = rootElement.findName("PageTranslation");
    // create NavigationManager
    this.navigationManager = new NavigationManager(this.plugIn, this.maxNumPages, rootElement);
    this.scale = 1.15;
    
    var handleMouseWheel = Silverlight.createDelegate(this, this.handleMouseWheel);
    
    if (window.addEventListener)
        window.addEventListener('DOMMouseScroll', handleMouseWheel, false);
        window.onmousewheel = document.onmousewheel = handleMouseWheel;
    
    this.ismousedown = false;
    this.startX = this.PageTranslation.X;
    this.startY = this.PageTranslation.Y;
    this.startMouseX = this.PageTranslation.X;
    this.startMouseY = this.PageTranslation.Y;
    
    // 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));
    _annotateToggleButton.xamlElement["Canvas.Left"] = 74;
    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"] = 150;
    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);
    
    // page selector
    this.pageList = rootElement.findName("pageList");
    
    var pageArray = new Array();
    
        pageArray[0] = 'Cover';
    pageArray[1] = 'Inside Front Cover';
    pageArray[2] = 'Editorial';
    pageArray[3] = 'Fokus: Virtualization';
    pageArray[4] = 'Fokus & Promo';
    pageArray[5] = 'Fokus: Artikel Utama';
    pageArray[6] = 'Hot News: Piagam HKI';
    pageArray[7] = 'Info Lisensi: Select Plus - 7';
    pageArray[8] = 'Info Lisensi: Select Plus - 8';
    pageArray[9] = 'Info Lisensi: Select Plus - 9';
    pageArray[10] = 'Hot News SQL Server';
    pageArray[11] = 'MSPP Flash - 11';
    pageArray[12] = 'MSPP Flash - 12';
    pageArray[13] = 'Klinik Lisensi';
    pageArray[14] = 'Resensi Buku';
    pageArray[15] = 'Academic License - 15';
    pageArray[16] = 'Academic License - 16';
    pageArray[17] = 'Kilas Acara - 17';
    pageArray[18] = 'Kilas Acara -  18';
    pageArray[19] = 'Partner Promo - 19';
    pageArray[20] = 'Partner Promo -  20';
    pageArray[21] = 'Teropong & Klik';
    pageArray[22] = 'Ragam & Quiz';
    pageArray[23] = 'Back Cover';
    pageArray[24] = '';

    
    for(var i=0;i<pageArray.length;i++)
    {
        var item = new PageListItem(this.plugIn, i, pageArray[i], Silverlight.createDelegate(this, this.chooseFromPageList));
        this.pageList.children.add(item.canvasElement);
    }
    
    this.expandPageList = rootElement.findName("expandPageList");
    this.collapsePageList = rootElement.findName("collapsePageList");
    this.isPageListExpanded = false;
    var pageSelectBtn = rootElement.findName("selectPage");
    pageSelectBtn.addEventListener("mouseLeftButtonDown", Silverlight.createDelegate(this, this.TogglePageSelectBtn));
    
    rootElement.findName("DownloadLink").Visibility = "Visible";
    
    this._OnResize();
}

PageTurn.prototype.TogglePageSelectBtn = function()
{
    this.pageList.Visibility = "Visible";
    if(this.isPageListExpanded)
    {
        this.collapse();
    }
    else
    {
        this.expand();
    }
}

PageTurn.prototype.expand = function()
{
    this.expandPageList.begin();
    this.isPageListExpanded = true;
}

PageTurn.prototype.collapse = function()
{
    this.collapsePageList.begin();
    this.isPageListExpanded = false;
}

PageTurn.prototype.chooseFromPageList = function(indeks)
{
    this.navigationManager.jumpToPage(indeks);
    this.collapse();
}

PageTurn.prototype._OnResize = function(sender, eventArgs)
{
    this._Resize(this.content.ActualWidth, this.content.ActualHeight);
}

PageTurn.prototype.handleMouseWheel = function(event)
{

    // credit due:  http://adomas.org/javascript-mouse-wheel/ 
    var delta = 0;
    if (!event) event = window.event;
    
    var clientX = event.clientX;
    var clientY = event.clientY;
    
    if (event.wheelDelta) {
	    delta = event.wheelDelta/120; 
	    if (window.opera) delta = -delta;
    } else if (event.detail) {
	    delta = -event.detail/3;
    }
    if (delta)
    // call to helper method that processes the delta
    this.processWheelChange(delta, clientX, clientY);
    if (event.preventDefault)
            event.preventDefault();
    event.returnValue = false;
}

PageTurn.prototype.processWheelChange = function(delta, clientX, clientY)
{
    if (delta<0)
    {
        this.zoomIn(clientX, clientY);
    }
    if (delta>0)
    {
        this.zoomOut(clientX, clientY);
    }
}

PageTurn.prototype.zoomIn = function(clientX, clientY)
{
    this.scale = this.scale + 0.1;
    this.PageTranslation.X -= 0.1 * (clientX);
    this.PageTranslation.Y -= 0.1 * (clientY);
    this._Resize(this.content.ActualWidth, this.content.ActualHeight);
}

PageTurn.prototype.zoomOut = function(clientX, clientY)
{
    var oldscale = this.scale;
    this.scale = this.scale - 0.1;
    
    this.PageTranslation.X += 0.1 * (clientX);
    this.PageTranslation.Y += 0.1 * (clientY);
    this._Resize(this.content.ActualWidth, this.content.ActualHeight);
}

PageTurn.prototype._Resize = function(width, height)
{
    if (width == 0 || height == 0)
    {
        return;
    }
    
    this.PageScale.ScaleX = this.scale;
    this.PageScale.ScaleY = this.scale;
    //this.PageTranslation.X = (width - this.scale * this.content.Root.Width) / 2;
    //this.PageTranslation.Y = (height - this.scale * this.content.Root.Height) / 2;
}



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");
        
        var pageIndex = location.search.search("page=");
        
        var page = location.search.substr(pageIndex+5);
        var next = page.search("&");
        var pageNumber = -1;
        if (next == -1)
        {
            pageNumber = Number(page);
        }
        else
        {
            pageNumber = Number(page.substr(0, next));
        }
        
        if (pageNumber < 1)
        {
            return;
        }
        
        if (pageNumber % 2)
        {
            pageNumber--;
        }
        
        this.navigationManager.jumpToPage(pageNumber);
    }
}

//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);
      
      newEvenPage.addEventListener("mouseLeftButtonDown", Silverlight.createDelegate(this.navigationManager, this.navigationManager.handleMouseDown) );
      newEvenPage.addEventListener("mouseLeftButtonUp", Silverlight.createDelegate(this.navigationManager, this.navigationManager.handleMouseUp));
      newEvenPage.addEventListener("mouseMove", Silverlight.createDelegate(this.navigationManager, this.navigationManager.handleMouseMove));
      newEvenPage.addEventListener("mouseLeave", Silverlight.createDelegate(this.navigationManager, this.navigationManager.handleMouseLeave));
      
      this.plugIn.content.findName("evenPageCanvas").children.add(newEvenPage);
    }
}

function downloadDocument()
{
    window.open('http://members.microsoft.com/partner/indonesia/pinnacle/pinnacle-12.pdf');
}
