﻿//Copyright 2007 Dan Wahlin
//http://www.xmlforasp.net

var _Albums = [];
var _AlbumsCanvas = null;
var _ArtistText = null;
var _AlbumDetailsCanvas = null;
var _LoadingCanvas = null;
var _NavCanvas = null;
var _SilverLightControl = null;
var _InError = false;
var _Debug = false;

function pageLoad() {
    Silverlight.createObject("Templates/EmptyTemplate.xaml", $get("SilverLightControlHost"), "SilverLightControl",
      {width:'800', height:'600', inplaceInstallPrompt:false, background: '#07346b', isWindowless:'false', framerate:'30', version:'1.0'},
      {onError:null, onLoad:null},null);

}

function onSilverlightLoaded() {
    _SilverLightControl = document.getElementById("SilverLightControl");
    _AlbumsCanvas = _SilverLightControl.Content.FindName("AlbumsCanvas");    
    _ArtistText = _SilverLightControl.Content.FindName("ArtistText");
    _AlbumDetailsCanvas = _SilverLightControl.Content.FindName("AlbumDetailsCanvas");
    _LoadingCanvas = _SilverLightControl.Content.FindName("LoadingCanvas");    
    _NavCanvas = _SilverLightControl.Content.FindName("NavCanvas");
    DoArtistSearch();
}

function btnArtistSearch_Click() {
    DoArtistSearch();
}

function DoArtistSearch() {
    var artistText = $get("txtArtist").value;
    StartStopLoader(true,artistText);
    InterfaceTraining.AlbumService.AlbumSearch(artistText,"1",onWSRequestComplete,onWSRequestFail);
}

function onWSRequestComplete(results) {
    StartStopLoader(false,"");
    RemoveAlbums();
    if (results != null && results != 'undefined') {
        _Albums = results.Albums;
        UpdateXaml(results.XamlFragments);
    }
}

function onWSRequestFail(error) {
    _Albums = [];
    StartStopLoader(false,"");
    _NavCanvas.Opacity = "0";
    _ArtistText.Text = "Unable to locate artist.  Please try another one.";
    RemoveAlbums();
}

function StartStopLoader(start,artistText) {
    _AlbumDetailsCanvas.Opacity = "0";
    _LoadingCanvas.Opacity = (start==true)?"1":"0";
    _LoadingCanvas.children.GetItem(2).Text = artistText;
    _AlbumsCanvas.Opacity = (start==true)?"0":"1";
    _NavCanvas.Opacity = (start==true)?"0":"1";
    _ArtistText.Text = "";
    if (start) {
        _SilverLightControl.Content.FindName("LoadingCanvasAnimation").Begin();
    } else {
        _SilverLightControl.Content.FindName("LoadingCanvasAnimation").Stop();
    }
}

//_InError coding added to handle issue with bad images being loaded into the XAML tree
//Bad images seem to currently stop the process from continuing properly
function UpdateXaml(fragments) {
    var tb = $get("txtXaml");
    var badAlbums = new Array();
    tb.value = "";
    for (var i=0;i<fragments.length;i++) {
        if (_Debug) tb.value += fragments[i];
        try {
            //Caused by unhandled exception due to album image being bad or corrupt
            if (_InError) { 
                badAlbums[badAlbums.length] = i-1;
                _InError = false;
            }
            var newAlbum = _SilverLightControl.Content.CreateFromXaml(fragments[i]);
            _AlbumsCanvas.Children.Add(newAlbum);
        }
        catch (e) {
           //Firefox will hit this if XAML has bad image reference. IE hits global error handler
           _InError = true;
        }
    }
    if (_InError) { //Bad image likely so remove last child that would've caused it
        if (fragments.length > 0) badAlbums[badAlbums.length] = fragments.length-1;
        _InError = false;
    }
    if (badAlbums.length > 0) { //Remove bad album data 
        for (var i=0;i<badAlbums.length;i++) {
            _AlbumsCanvas.Children.RemoveAt(badAlbums[i])
        }
    }
    //Write out artist name
    if (_Albums[0].Artist.length > 40) {
        _ArtistText.Text = _Albums[0].Artist.substring(0,40) + "...";
    } else {
        if (_Albums[0].Artist == "") {
            _ArtistText.Text = $get("txtArtist").value;        
        } else {
            _ArtistText.Text = _Albums[0].Artist;        
        }
    }
    _SilverLightControl.Content.FindName("ArtistTextLine").Opacity = ".5";
}

function RemoveAlbums() {
   var albums = _AlbumsCanvas.children;
   while (albums.Count > 0) {
      albums.RemoveAt(0);
   }
}

function onLeftMouseButtonDown(sender, args) {
    var asin = GetAlbumCanvasName(sender);
    location.href = "http://www.amazon.com/gp/product/" + asin + "%3ftag=xmlforaspnetd-20%26link_code=sp1%26camp=2025%26dev-t=D3CDFQB8TFAH4L/xmlforaspnetd-20";
}

function GetAlbumCanvasName(rect) {
    return rect.Name.substring(0,rect.Name.indexOf("_"));
}

function onMouseEnter(sender,args) {
   sender.Stroke = "Yellow";    
   sender.Width = sender.Width * 1.20;
   //document.body.style.cursor = 'hand';

   var id = sender.Name;
   try {
       var reflect = _SilverLightControl.Content.FindName(sender.Name + "Reflection");
       reflect.Stroke = "Yellow";
       reflect.Width = reflect.Width * 1.20;
   }
   catch (e) {}
   
    ShowAlbum(id);
}

function ShowAlbum(id) {
   var album = null;
   //Write out album info
   for (var i=0;i<_Albums.length;i++) {
      if (id == _Albums[i].ID + "_Rect") {
          album = _Albums[i];
          break;
      }
   }
   if (album != null) {
      try {
        _AlbumDetailsCanvas.children.GetItem(0).Fill.ImageSource = album.ImageUrlMedium;
      }
      catch (e) {}
      _AlbumDetailsCanvas.Opacity = "1";
      _AlbumDetailsCanvas.children.GetItem(1).Text = album.Title;
      _AlbumDetailsCanvas.children.GetItem(2).Text = (album.Price)?album.Price:"";
      SetRating(album);
   }
}

function SetRating(album) {
    var avgRating = Math.round(album.AverageRating);
    for (var i=1;i<6;i++) {
        var opacity = (i > avgRating)?".2":"1";
        _SilverLightControl.Content.FindName("Rating" + i).Opacity = opacity;
    }    
}

function onMouseLeave(sender,args) {
    sender.Stroke = "Gray";
    sender.Width = sender.Width / 1.20;
    //document.body.style.cursor = 'default';

    try {
        var reflect = _SilverLightControl.Content.FindName(sender.Name + "Reflection");
        reflect.Stroke = "Gray";
        reflect.Width = reflect.Width / 1.20;
    }
    catch (e) {}
    _AlbumDetailsCanvas.Opacity = "0";
    _AlbumDetailsCanvas.children.GetItem(1).Text = "";  //Album Title
    _AlbumDetailsCanvas.children.GetItem(2).Text = "";  //Album Price
}

var canvasWidth = 800;
var canvasHeight = 550;
var imageWidth = 82.5;
var imageHeight = 79.2;
var radiusX = 325;  //how wide of radius  325
var radiusY = 70;   //how tall of radius  70
var centerX = (canvasWidth / 2) - (imageWidth / 2.5);
var centerY = (canvasHeight / 2) - (imageHeight * 1.5);
var speed = 0.05;
var perspective = -75;
var currAngle = 0;
var delay = 15;
var tid = null;
var angleChange = 0;

function NavLeft_Enter(sender,args) {   
    SetNavImageSource(sender,"enter");
    angleChange = .01;
    SetInterval();
}

function NavRight_Enter(sender,args) {
    SetNavImageSource(sender,"enter");
    angleChange = -.01;
    SetInterval();
}

function NavLeft_Leave(sender,args) {
    SetNavImageSource(sender,"leave");
    ClearInterval();
}

function NavRight_Leave(sender,args) {
    SetNavImageSource(sender,"leave");
    ClearInterval();
}

function SetInterval() {
    tid = window.setInterval("MoveAlbums()",delay);
}

function ClearInterval() {
    window.clearInterval(tid);
    tid = null;
}

function SetNavImageSource(img,state) {
    var baseImage = "Images/" + img.Name;
    var endImage = (state=="enter")?"Over.png":".png";
    var fullImage = baseImage + endImage;
    img.Source = fullImage;
    _NavCanvas.FindName(img.Name + "_Reflect").Source = fullImage;
}


function MoveAlbums() {
    currAngle = currAngle + angleChange;
    var albumCount = _Albums.length;
    var albumCanvases = _AlbumsCanvas.children;

    for (var i=0; i < albumCount; i++)
    {
        var angle = i * ((Math.PI * 2) / albumCount);
        angle += currAngle;
        var x = (Math.cos(angle) * radiusX) + centerX;
        var y = (Math.sin(angle) * radiusY) + centerY;
        var scale = (y - perspective) / (centerY + radiusY - perspective);
        var c = albumCanvases.GetItem(i);
        c["Canvas.Left"] = x;
        c["Canvas.Top"] = y;
        if (y < centerY) c["Canvas.ZIndex"] = 0;
        if (y > centerY) c["Canvas.ZIndex"] = 1;
        var rect = c.FindName(c.Name + "_Rect");
        if (Math.abs(centerX - x) < 2 && y > centerY) ShowAlbum(rect.Name);
        var s = (y  - c.RenderTransform.ScaleY) / (centerY+radiusY-c.RenderTransform.ScaleY);
        c.RenderTransform.ScaleX = s;
        c.RenderTransform.ScaleY = s;
    }
}

function onKeyPress(e) {
    var evt = new Sys.UI.DomEvent(e);  //Cross-browser handling of event with ASP.NET AJAX DomEvent object
    if (evt.charCode == Sys.UI.Key.enter) {  //pressed enter key 
        evt.stopPropagation(); 
		DoArtistSearch();
	}
}

  function onError(line, col, hr, string) {
    _InError = true;  //IE will hit this if XAML has bad image
  }  
