NavBar.prototype.RootName = "NavBar";
NavBar.prototype.s = null;
NavBar.prototype.backPanel = null;

function NavBar(s)
{
    this.s = s;
    this.plugin = s.getHost();
	this.MainCanvas = this.s.findname("MainCanvas");
    this.DebugBox = this.s.findname("DebugBox");
    this.xamlObject = this.s.findname(this.RootName);
    
    this.backPanel = this.MainCanvas.findname("BackTo360Panel");
    this.backPanel.addEventListener("MouseLeftButtonDown", Silverlight.createDelegate(this, this.OnBackClick));
}

NavBar.prototype.OnBackClick = function(sender, e)
{
    navBar.ClearNavItemColors();
    
    if (this.MainCanvas.findname("BackTo360Panel")["Opacity"] == 1)
    {
        //var anim = navBar.ReturnTo3D();
        //anim.Play();
        this.ReturnTo3D(true);
    }
}

NavBar.prototype.lastWindowHeight = -1;

NavBar.prototype.OnSize = function()
{
    // Snap to the bottom of the frame.
    var windowHeight = this.plugin.content.actualHeight;
    var windowWidth = this.plugin.content.actualWidth;
 
    if (windowHeight != 294 || windowHeight == this.lastWindowHeight) return;
    
    //alert("NavBar.resize: " + windowHeight + "  ,  " + windowWidth);
    
    //----------------------------------------------   
    this.lastWindowHeight = windowHeight;
    //dd("NavBar.OnSize");
    
    var myHeight = this.xamlObject["Height"];
    //alert(".,. = " + windowHeight + ",   " + myHeight);
    var top = windowHeight - myHeight;
    this.xamlObject["Canvas.Top"] = top;
    
    var ll = 0;
    var leftPad = 8;
    var spacing = 8;
    
    ll += leftPad;
    
    for (var i = 0; i < 4; i++)
    {
        var navItem = this.xamlObject.findname("Nav_" + i);
        navItem.addEventListener("MouseLeftButtonDown", this.OnItemClick);

        if (navItem == null)
            break;
            
        navItem["Canvas.Left"] = ll;
        
        ll += navItem["ActualWidth"] + spacing;
        
        if (i < 3)
        {
            var navPipe = this.xamlObject.findname("Nav_" + i + "_0");
            if (navPipe == null)
                break;
            navPipe["Canvas.Left"] = ll;
            
            ll += navPipe["ActualWidth"] + spacing;    
        }   
    }
    
    var rotatePanel = this.xamlObject.findname("RotatePanel");
    var rotLabelWidth = rotatePanel.findname("Rotate_0")["ActualWidth"];
    var slider = this.xamlObject.findname("SliderCanvas");
    var sliderWidth = slider["Width"];
    rotatePanel["Canvas.Left"] = windowWidth - rotLabelWidth - sliderWidth - 20;
    slider["Canvas.Left"] = rotLabelWidth + 10;
    
    MainCanvas.findname("BackTo360Panel")["Canvas.Left"] = MainCanvas.findname("RotatePanel")["Canvas.Left"] + 0;
    MainCanvas.findname("BackTo360Panel")["Canvas.Top"] = MainCanvas.findname("RotatePanel")["Canvas.Top"] + 3;
    MainCanvas.findname("BackTo360Panel")["Width"] = MainCanvas.findname("RotatePanel")["Width"];
    MainCanvas.findname("BackTo360Panel")["Height"] = MainCanvas.findname("RotatePanel")["Height"];
    
}

NavBar.prototype.selectedItemIndex = -1;

NavBar.prototype.OnItemClick = function(s,e)
{
    mainWindow.StopDragRotation();
    var itemIndex = parseInt(s.name.substring(4));
    
    if (itemIndex > 0 && (itemIndex - 1) == house.selectedRoom)
    {
        //dd("This room is already selected");
        return;
    }
        
    navBar.SelectItem(itemIndex, true);
}

NavBar.prototype.selectedColor = "#9fd0e7";
NavBar.prototype.unselectedColor = "#ffffffff";

NavBar.prototype.GoToRoom = function(name)
{
    if (house.selectedRoom != -1 && name == house.GetSelectedRoom().name)
        return;
        
    var anim = null;
    
    if (name == "Living Room" || name == "LivingRoom")
    {
        anim = navBar.SelectItem(1, true);
    }
    else if (name == "Game Room" || name == "GameRoom")
    {
        anim = navBar.SelectItem(2, true);
    }
    else if (name == "Home Office" || name == "HomeOffice")
    {
        anim = navBar.SelectItem(3, true);
    }
    else
    {
        alert("Unknown room: " + name);
    }
       
    return anim;
}

NavBar.prototype.InTransition = false;

NavBar.prototype.SetNavItemColorByIndex = function(index, val)
{
    //dd("i = " + index + "    val = " + val);
    var navItem = navBar.GetItem(index);
    if (navItem != null)
    {
        if (navBar.selectedItemIndex != -1)
        {
            var oldItem = navBar.GetItem(navBar.selectedItemIndex);
            if (oldItem != null);
                oldItem["Foreground"] = navBar.unselectedColor;
        }
        navItem["Foreground"] = val ? navBar.selectedColor : navBar.unselectedColor;
    }
}

NavBar.prototype.ClearNavItemColors = function()
{
    for (var i = 0; i < 4; i++)
    {
        var navItem = this.xamlObject.findname("Nav_" + i);
        navItem["Foreground"] = this.unselectedColor;
    }
}

NavBar.prototype.SelectItem = function(index, val)
{  
    
    if (navBar.InTransition && val)
    {
        //dd("Can't -- in transition");
        return;
    }   
    //navBar.SetNavItemColorByIndex(index, val);
    
    var disableAnim = new Animation("disable", null, null, 0, 1, 3.0);
    if (val) disableAnim.OnPlayScript2 = function() { navBar.ClearNavItemColors(); }
    if (val) disableAnim.OnStopScript2 = function() { navBar.InTransition = false; navBar.SetNavItemColorByIndex(index, val); }
    disableAnim.Play();

    
    //if (val) 
    navBar.InTransition = true;
        
    var navItem = navBar.GetItem(index);
    var anim = null;
    
    if (val)
    {
        if (index == navBar.selectedItemIndex && index != 1)
        {
            return null;
        }
        
        if (this.selectedItemIndex != -1)
        {
            this.SelectItem(this.selectedItemIndex, false);
        }
        

        navBar.selectedItemIndex = index;
        
        //alert("index = " + index + " val = " + val + " this.selectedItemIndex = " + this.selectedItemIndex);
    
        anim = this.OnNewItemSelected(navBar.selectedItemIndex);

    }
    else
    {        
        navBar.selectedItemIndex = -1;
    }
    
    return anim;
}

NavBar.prototype.OnNewItemSelected = function(index)
{
    var oldSelectedRoom = house.GetSelectedRoom();
    var oldSelectedRoomName = null;
    if (oldSelectedRoom != null)
    {
        oldSelectedRoomName = oldSelectedRoom.name;
    }
    
    //if (dialog2.IsVisible())
    //    dialog2.ShowHide(400,100);
        
    var rr = null;
    
    if (index == 0)
    {
//        dd("oldSel = " + oldSelectedRoom);
//        if (oldSelectedRoom != null)
//        {
//            oldSelectedRoom.dialog.ShowHide(250,170);
//        }
        
        this.ReturnTo3D(true);
    }
    else
    {
        var newSelectedRoomIndex = index - 1;

        rr = null;        
        //alert("house.selectedRoom = " + house.selectedRoom + "   newSelectedRoomIndex = " + newSelectedRoomIndex);
        if (house.selectedRoom != newSelectedRoomIndex && house.selectedRoom != -1)
        {
            rr = this.GetReturnTo3DAnim(oldSelectedRoomName);
        }
    
        if (rr != null)
        {
            this.returnTo3DAnim.OnStopScript = function() { navBar.ShowRoom(newSelectedRoomIndex)};
            rr.Play();
        }
        else
        {
            rr = this.ShowRoom(newSelectedRoomIndex);//showAnim.Play();
        }
    }
  

    
    //ShowRoomDiv(newSelectedRoomIndex);
    
    if (newSelectedRoomIndex > -1)
    {
        OnSilverlightEvent("RoomChanged", house.rooms[newSelectedRoomIndex].name);
    }

    return rr;
}

NavBar.prototype.GetMenuForRoom = function(index)
{
    if (index == 2)
        return menu;
    else if (index == 0)
        return livingRoomMenu;
    else if (index == 1)
        return gameRoomMenu;
        
    return null;
}

NavBar.prototype.ShowRoom = function(index)
{   
    var needToChangeSlider = false;
    
        
//    if (index > 0)
//    {
//        MainCanvas.findname("BackTo360Panel")["IsHitTestVisible"] = false;
//    }
//    else
//    {
//        MainCanvas.findname("BackTo360Panel")["IsHitTestVisible"] = true;
//    }
        
    // If we're already there, don't bother.
    if (house.selectedRoom != -1 && house.selectedRoom == index)
    {
        return;
    }
    
    if (house.selectedRoom >= 0 && index == -1 || house.selectedRoom == -1 && index >= 0)
        needToChangeSlider = true;
        
    var room = house.rooms[index];
     
    var roomName = room.name;//"HomeOffice";
    var landingFrame = room.landingFrame;//20;
    
    if (room != null)
    {
        if (dialog.IsVisible()) dialog.ShowHide(-1,-1);
        
        // COmmented this out because the menu now contains the dialog!
        //room.dialog.ShowHide(-1, -1);
        //dialog2.ShowHide(400,100);
    }
    
    //Debug("");
    var state = mainWindow.GetWindowState();
    
    if (state == 1)
    {
        //alert("state = 1 already");
        //return;
    }
        
    var rotateAnim = backgroundMovie.AnimateToFrame(landingFrame, 0.5);
    rotateAnim.ease = false;
    
    rotateAnim.OnStopScript = function ()
                {
                    // Hide the billboards.
                    mainWindow.ShowHideBillboards(false);
                }
    
    //var zoomAnim = backgroundMovie.GetZoomAnim(1, 2, 1);
    backgroundMovie.BackgroundRoomZoomTarget = roomName;
    var zoomAnim = backgroundMovie.GetRoomZoomAnim(roomName, 0, 15, 0.4);
    
    rotateAnim.OnStopAnimation = zoomAnim;
    //rotateAnim.OnFractionScript = function () { dd("rot : " + this.fraction); };
    //zoomAnim.OnPostFractionScript = function () { dd("zoom: " + this.fraction); };
    
    var pauseAnim = new Animation("pause", null, null, 0,1,0.01);
    var fadeOutAnim = backgroundMovie.GetFadeAnim("MainWindow", 1, 0, 0.3);
    var fadeInAnim = backgroundMovie.GetFadeAnim(roomName, 0, 1, 0.3);
    fadeOutAnim.OnPlayAnimation = fadeInAnim;
    zoomAnim.OnStopAnimation = fadeOutAnim;
    fadeInAnim.OnStopAnimation = pauseAnim;
    
    var menuLeft = navBar.GetMenuForRoom(index).xamlObject["Canvas.Left"];
    var menuTop = navBar.GetMenuForRoom(index).xamlObject["Canvas.Top"];
    
    if (room.menuX != -1 && room.menuTop != -1)
    {
        menuLeft = room.menuX;
        menuTop = room.menuY;
    }
    pauseAnim.OnStopScript = function() { navBar.GetMenuForRoom(index).ShowHide(menuLeft,menuTop); };
    
    rotateAnim.Play();
    
    if (needToChangeSlider)
    {
        var sliderFade = navBar.GetSliderFadeAnim("RotatePanel", 1, 0, 1);        
        var backFade = navBar.GetSliderFadeAnim("BackTo360Panel", 0, 1, 1);
        backLeft = MainCanvas.findname("BackTo360Panel")["Canvas.Left"];
        var backMove = new Animation(MainCanvas.findname("BackTo360Panel"), "Canvas.Left", backLeft, backLeft + 200, 1);
        //sliderFade.OnPlayAnimation = backMove;
        //dd("11 backleft = " + backLeft);
        
        sliderFade.OnStopScript = function() { MainCanvas.findname("RotatePanel")["IsHitTestVisible"] = false; }
        backFade.OnStopScript = function() { MainCanvas.findname("BackTo360Panel")["IsHitTestVisible"] = true; }
      
        sliderFade.OnStopAnimation = backFade;
        sliderFade.Play();
    }
    
    house.RoomToShow = roomName;
    fadeInAnim.OnStopScript = function() { house.GetRoom(house.RoomToShow).Show(true); };

//    var comp = new CompoundAnimation();
//    comp.duration = 2; comp.baseAnimation.duration = 1;
//    comp.Add(rotateAnim);
//    comp.Add(sliderFade);
//    
    house.selectedRoom = index;
    
    mainWindow.DisableMouseListeners();
    
    return rotateAnim;
    //return comp;
}

NavBar.prototype.GetCurrentMenu = function()
{
    if (menu.IsVisible()) return menu;
    else if (livingRoomMenu.IsVisible()) return livingRoomMenu;
    else if (gameRoomMenu.IsVisible()) return gameRoomMenu;
}

NavBar.prototype.returnTo3DAnim = null;

NavBar.prototype.GetReturnTo3DAnim = function(oldSelectedRoomName)
{
    this.SelectItem(this.selectedItemIndex, false);
    
    var currentMenu = this.GetCurrentMenu();
    
    if (currentMenu != null)
        currentMenu.SetSelectedHeader(-1);

    // Stop all room-related animations.
    house.StopRooms();
    house.GetSelectedRoom().Show(false);
    
    if (currentMenu != null)
    {
        currentMenu.ShowHide(currentMenu.xamlObject["Canvas.Left"], currentMenu.xamlObject["Canvas.Top"], 1);
    }
    var backFade = navBar.GetSliderFadeAnim("BackTo360Panel", 1, 0, 1);

    var sliderFade = navBar.GetSliderFadeAnim("RotatePanel", 0, 1, 1);

    backFade.OnStopAnimation = sliderFade;
    //backFade.Play();
    
    var fadeOutAnim = backgroundMovie.GetFadeAnim("MainWindow", 0, 1, 0.3);
    var fadeInAnim = backgroundMovie.GetFadeAnim(house.rooms[house.selectedRoom].name, 1, 0, 0.3);
    fadeInAnim.OnPlayAnimation = fadeOutAnim;
    
    //var zoomAnim = backgroundMovie.GetZoomAnim(2, 1, 1);  
    //var roomName = house.GetSelectedRoom().name;  
    backgroundMovie.BackgroundRoomZoomTarget = oldSelectedRoomName;
    var zoomAnim = backgroundMovie.GetRoomZoomAnim(oldSelectedRoomName, 15, 0, 0.3);
    zoomAnim["roomName"] = oldSelectedRoomName;
     
    fadeInAnim.OnStopAnimation = zoomAnim;
    
    //alert("22");
    var returnToFrontAnim = backgroundMovie.AnimateToFrame(0, 0.5);
    //returnToFrontAnim.OnPostFractionScript = function (frac) { alert("1"); }
    //zoomAnim.OnStopAnimation = returnToFrontAnim;
    
    //fadeInAnim.Play();
    
    var comp = new CompoundAnimation();
    comp.Add(backFade);
    comp.Add(fadeInAnim);
    comp.baseAnimation.dur = 1;
    
    //this.returnTo3DAnim = returnToFrontAnim;// zoomAnim;
    this.returnTo3DAnim = zoomAnim;
    
    return fadeInAnim;
}

NavBar.prototype.ReturnTo3D = function(returnToHome)
{
    if (house.selectedRoom == -1) return;
    
    var disableAnim = new Animation("disable", null, null, 0, 1, 2.7);
    disableAnim.OnPlayScript2 = function() { navBar.ClearNavItemColors(); }
    disableAnim.OnStopScript2 = function() { navBar.InTransition = false; navBar.SetNavItemColorByIndex(0, true); }
    disableAnim.Play();
    
        
    var currentMenu = this.GetCurrentMenu();
    
    this.SelectItem(this.selectedItemIndex, false);
    
    var currentSelectedRoomIndex = house.selectedRoom;
    var currentSelectedRoomName = "";
    if (house.selectedRoom != -1) currentSelectedRoomName = house.rooms[currentSelectedRoomIndex].name;
    //alert("currentSelectedRoomName = " + currentSelectedRoomName);
    // Stop all room-related animations.
    house.StopRooms();
    
    if (currentMenu != null)
    {
        currentMenu.SetSelectedHeader(-1);
        
        currentMenu.ShowHide(currentMenu.xamlObject["Canvas.Left"], currentMenu.xamlObject["Canvas.Top"], 1);
    }
    
    var backFade = navBar.GetSliderFadeAnim("BackTo360Panel", 1, 0, 1);
    var sliderFade = navBar.GetSliderFadeAnim("RotatePanel", 0, 1, 1);
    backLeft = MainCanvas.findname("BackTo360Panel")["Canvas.Left"];
    
    var backMove = new Animation(MainCanvas.findname("BackTo360Panel"), "Canvas.Left", backLeft, backLeft - 200, 1);
    //backFade.OnPlayAnimation = backMove;
    
    sliderFade.OnStopScript = function() { MainCanvas.findname("RotatePanel")["IsHitTestVisible"] = true; }
    backFade.OnStopScript = function() { MainCanvas.findname("BackTo360Panel")["IsHitTestVisible"] = false; }
    

    backFade.OnStopAnimation = sliderFade;
    backFade.Play();
    
    var fadeOutAnim = backgroundMovie.GetFadeAnim("MainWindow", 0, 1, 0.3);
    var fadeInAnim = backgroundMovie.GetFadeAnim(currentSelectedRoomName, 1, 0, 0.3);
    fadeInAnim.OnPlayAnimation = fadeOutAnim;
    
    //var zoomAnim = backgroundMovie.GetZoomAnim(2, 1, 1);
    var roomName = house.GetSelectedRoom().name;    
    backgroundMovie.BackgroundRoomZoomTarget = roomName;
    var zoomAnim = backgroundMovie.GetRoomZoomAnim(roomName, 15, 0, 0.5);
        
    fadeInAnim.OnStopAnimation = zoomAnim;
    
    var rc = fadeInAnim;
    
    if (returnToHome)
    {
        //alert("22");
        var rtfdur = 0.5;
        if (roomName != "GameRoom") rtfdur = 0.2;
        var returnToFrontAnim = backgroundMovie.AnimateToFrame(0, rtfdur);
        returnToFrontAnim.ease = false;
        
        //returnToFrontAnim.OnPostFractionScript = function (frac) { alert("1"); }
        zoomAnim.OnStopAnimation = returnToFrontAnim;
        
    //    zoomAnim.OnStopScript = function() {
    //         if (!dialog.IsVisible()) dialog.ShowHide(-1, -1); 
    //             mainWindow.ShowHideBillboards(true);
    //         }
         returnToFrontAnim.OnStopScript = function() {
             if (!dialog.IsVisible()) dialog.ShowHide(-1, -1); 
                 mainWindow.ShowHideBillboards(true);
             }   
    }
             
    fadeInAnim.Play();
    fadeInAnim.OnStopScript = function() {
            // Added by James Jacoby:
            // This cannot be set now, it has to be set when the animation has finished
            // This was causing errors before and this was the only way I could get it to stop
            house.selectedRoom = -1;
        }
    
    mainWindow.EnableMouseListeners();
    
    OnSilverlightEvent("RoomChanged", "Default");
    
    return fadeInAnim;
}

NavBar.prototype.GetSliderFadeAnim = function(theName, startVal, endVal, theDur)
{
    var fadeAnim = new Animation("fadeAnim",
        MainCanvas.findname(theName), "Opacity", startVal, endVal, theDur);
        
    return fadeAnim;

}


NavBar.prototype.GetItem = function(index)
{
    return this.xamlObject.findname("Nav_" + index);
}

NavBar.prototype.Show = function(anObj, val)
{
    var obj = anObj;
    if (obj == null) obj = s.findname(this.RootName);
    
    if (val == true)
    {
        obj["Visibility"] = "Visible";
    }
    else
    {
        obj["Visibility"] = "Collapsed";
    }
}
