10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2009 Joseph Pecoraro
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Redistribution and use in source and binary forms, with or without
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * modification, are permitted provided that the following conditions
70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * are met:
80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 1.  Redistributions of source code must retain the above copyright
10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     notice, this list of conditions and the following disclaimer.
110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 2.  Redistributions in binary form must reproduce the above copyright
120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *     notice, this list of conditions and the following disclaimer in the
13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     documentation and/or other materials provided with the distribution.
140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *     its contributors may be used to endorse or promote products derived
16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     from this software without specific prior written permission.
170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochWebInspector.Drawer = function()
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebInspector.View.call(this, document.getElementById("drawer"));
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    this._savedHeight = 200; // Default.
35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    this.state = WebInspector.Drawer.State.Hidden;
36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    this.fullPanel = false;
37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    this._mainElement = document.getElementById("main");
392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    this._toolbarElement = document.getElementById("toolbar");
402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    this._mainStatusBar = document.getElementById("main-status-bar");
412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    this._mainStatusBar.addEventListener("mousedown", this._startStatusBarDragging.bind(this), true);
422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    this._viewStatusBar = document.getElementById("other-drawer-status-bar-items");
435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    this._counters = document.getElementById("counters");
445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    this._drawerStatusBar = document.getElementById("drawer-status-bar");
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochWebInspector.Drawer.prototype = {
480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    get visibleView()
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return this._visibleView;
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    },
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    set visibleView(x)
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (this._visibleView === x) {
56643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            if (this.visible && this.fullPanel)
57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                return;
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            this.visible = !this.visible;
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return;
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        var firstTime = !this._visibleView;
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (this._visibleView)
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            this._visibleView.hide();
650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        this._visibleView = x;
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (x && !firstTime) {
690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            this._safelyRemoveChildren();
702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            this._viewStatusBar.removeChildren(); // optimize this? call old.detach()
712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            x.attach(this.element, this._viewStatusBar);
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            x.show();
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            this.visible = true;
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    },
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    get savedHeight()
78643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        var height = this._savedHeight || this.element.offsetHeight;
802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        return Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - this._mainElement.totalOffsetTop - Preferences.minConsoleHeight);
81643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    },
82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
83231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    showView: function(view)
84231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
85231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!this.visible || this.visibleView !== view)
86231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            this.visibleView = view;
87231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    },
88231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    show: function()
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (this._animating || this.visible)
920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return;
930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (this.visibleView)
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            this.visibleView.show();
960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        WebInspector.View.prototype.show.call(this);
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        this._animating = true;
1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        document.body.addStyleClass("drawer-visible");
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        var anchoredItems = document.getElementById("anchored-status-bar-items");
1042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        var height = (this.fullPanel ? window.innerHeight - this._toolbarElement.offsetHeight : this.savedHeight);
1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        var animations = [
106643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            {element: this.element, end: {height: height}},
1072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            {element: this._mainElement, end: {bottom: height}},
1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            {element: this._mainStatusBar, start: {"padding-left": anchoredItems.offsetWidth - 1}, end: {"padding-left": 0}},
1092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            {element: this._viewStatusBar, start: {opacity: 0}, end: {opacity: 1}}
1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ];
1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._drawerStatusBar.insertBefore(anchoredItems, this._drawerStatusBar.firstChild);
1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1145af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (this._currentPanelCounters) {
1155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            var oldRight = this._drawerStatusBar.clientWidth - (this._counters.offsetLeft + this._currentPanelCounters.offsetWidth);
1165af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            var newRight = WebInspector.Panel.counterRightMargin;
1175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            var rightPadding = (oldRight - newRight);
1185af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            animations.push({element: this._currentPanelCounters, start: {"padding-right": rightPadding}, end: {"padding-right": 0}});
1195af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            this._currentPanelCounters.parentNode.removeChild(this._currentPanelCounters);
1202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            this._mainStatusBar.appendChild(this._currentPanelCounters);
1215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        }
1225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        function animationFinished()
1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        {
1250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if ("updateStatusBarItems" in WebInspector.currentPanel)
1260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                WebInspector.currentPanel.updateStatusBarItems();
1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (this.visibleView.afterShow)
1280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                this.visibleView.afterShow();
1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            delete this._animating;
1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            delete this._currentAnimation;
131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            this.state = (this.fullPanel ? WebInspector.Drawer.State.Full : WebInspector.Drawer.State.Variable);
1325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            if (this._currentPanelCounters)
1335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                this._currentPanelCounters.removeAttribute("style");
1340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._currentAnimation = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
1370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    },
1380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    hide: function()
1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (this._animating || !this.visible)
1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return;
1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        WebInspector.View.prototype.hide.call(this);
145643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (this.visibleView)
1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            this.visibleView.hide();
1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        this._animating = true;
1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!this.fullPanel)
152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            this._savedHeight = this.element.offsetHeight;
153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (this.element === WebInspector.currentFocusElement || this.element.isAncestor(WebInspector.currentFocusElement))
1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            WebInspector.currentFocusElement = WebInspector.previousFocusElement;
1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        var anchoredItems = document.getElementById("anchored-status-bar-items");
1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Temporarily set properties and classes to mimic the post-animation values so panels
1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // like Elements in their updateStatusBarItems call will size things to fit the final location.
1612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._mainStatusBar.style.setProperty("padding-left", (anchoredItems.offsetWidth - 1) + "px");
1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        document.body.removeStyleClass("drawer-visible");
1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if ("updateStatusBarItems" in WebInspector.currentPanel)
1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            WebInspector.currentPanel.updateStatusBarItems();
1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        document.body.addStyleClass("drawer-visible");
1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        var animations = [
1682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            {element: this._mainElement, end: {bottom: 0}},
1692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            {element: this._mainStatusBar, start: {"padding-left": 0}, end: {"padding-left": anchoredItems.offsetWidth - 1}},
1702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            {element: this._viewStatusBar, start: {opacity: 1}, end: {opacity: 0}}
1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ];
1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1735af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (this._currentPanelCounters) {
1745af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            var newRight = this._drawerStatusBar.clientWidth - this._counters.offsetLeft;
1752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            var oldRight = this._mainStatusBar.clientWidth - (this._currentPanelCounters.offsetLeft + this._currentPanelCounters.offsetWidth);
1765af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            var rightPadding = (newRight - oldRight);
1775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            animations.push({element: this._currentPanelCounters, start: {"padding-right": 0}, end: {"padding-right": rightPadding}});
1785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        }
1795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        function animationFinished()
1810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        {
182d0825bca7fe65beaee391d30da42e937db621564Steve Block            WebInspector.currentPanel.resize();
1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            this._mainStatusBar.insertBefore(anchoredItems, this._mainStatusBar.firstChild);
1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            this._mainStatusBar.style.removeProperty("padding-left");
1855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1865af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            if (this._currentPanelCounters) {
1875af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                this._currentPanelCounters.setAttribute("style", null);
1885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                this._currentPanelCounters.parentNode.removeChild(this._currentPanelCounters);
1895af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                this._counters.insertBefore(this._currentPanelCounters, this._counters.firstChild);
1905af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            }
1915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
1920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            document.body.removeStyleClass("drawer-visible");
1930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            delete this._animating;
1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            delete this._currentAnimation;
195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            this.state = WebInspector.Drawer.State.Hidden;
196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._currentAnimation = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    },
200643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    resize: function()
202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
203643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (this.state === WebInspector.Drawer.State.Hidden)
204643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return;
205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
206643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        var height;
207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (this.state === WebInspector.Drawer.State.Variable) {
208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            height = parseInt(this.element.style.height);
2092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - this._mainElement.totalOffsetTop - Preferences.minConsoleHeight);
210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        } else
2112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            height = window.innerHeight - this._toolbarElement.offsetHeight;
212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._mainElement.style.bottom = height + "px";
214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        this.element.style.height = height + "px";
215643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    },
216643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    enterPanelMode: function()
218643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
219643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        this._cancelAnimationIfNeeded();
220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        this.fullPanel = true;
221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (this.visible) {
223643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            this._savedHeight = this.element.offsetHeight;
2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            var height = window.innerHeight - this._toolbarElement.offsetHeight;
225643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            this._animateDrawerHeight(height, WebInspector.Drawer.State.Full);
226643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
227643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    },
228643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
229643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    exitPanelMode: function()
230643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
231643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        this._cancelAnimationIfNeeded();
232643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        this.fullPanel = false;
233643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
234643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (this.visible) {
235643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // If this animation gets cancelled, we want the state of the drawer to be Variable,
236643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            // so that the new animation can't do an immediate transition between Hidden/Full states.
237643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            this.state = WebInspector.Drawer.State.Variable;
238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            var height = this.savedHeight;
239643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            this._animateDrawerHeight(height, WebInspector.Drawer.State.Variable);
240643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
241643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    },
242643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
243643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    immediatelyExitPanelMode: function()
244643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
245643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        this.visible = false;
246643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        this.fullPanel = false;
247643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    },
248643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    immediatelyFinishAnimation: function()
2502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    {
2512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (this._currentAnimation)
2522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            this._currentAnimation.forceComplete();
2532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    },
2542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2555af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    set currentPanelCounters(x)
2565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    {
2575af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (!x) {
2585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            if (this._currentPanelCounters)
2595af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                this._currentPanelCounters.parentElement.removeChild(this._currentPanelCounters);
2605af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            delete this._currentPanelCounters;
2615af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            return;
2625af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        }
2635af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
2645af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        this._currentPanelCounters = x;
2655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (this.visible)
2662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            this._mainStatusBar.appendChild(x);
2675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        else
2685af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            this._counters.insertBefore(x, this._counters.firstChild);
2695af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    },
2705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    _cancelAnimationIfNeeded: function()
272643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (this._animating) {
2742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (this._currentAnimation)
2752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                this._currentAnimation.cancel();
276643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            delete this._animating;
2772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            delete this._currentAnimation;
278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    },
280643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    _animateDrawerHeight: function(height, finalState)
282643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
283643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        this._animating = true;
284643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        var animations = [
285643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            {element: this.element, end: {height: height}},
2862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            {element: this._mainElement, end: {bottom: height}}
287643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ];
288643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
289643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        function animationFinished()
290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        {
291643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            delete this._animating;
2922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            delete this._currentAnimation;
293643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            this.state = finalState;
2940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
2950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._currentAnimation = WebInspector.animateStyle(animations, this._animationDuration(), animationFinished.bind(this));
297643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    },
298643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
299643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    _animationDuration: function()
300643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
301643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // Immediate if going between Hidden and Full in full panel mode
302643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (this.fullPanel && (this.state === WebInspector.Drawer.State.Hidden || this.state === WebInspector.Drawer.State.Full))
303643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            return 0;
304643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
305643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return (window.event && window.event.shiftKey ? 2000 : 250);
3060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    },
3070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _safelyRemoveChildren: function()
3090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
3100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        var child = this.element.firstChild;
3110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        while (child) {
3120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            if (child.id !== "drawer-status-bar") {
3130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                var moveTo = child.nextSibling;
3140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                this.element.removeChild(child);
3150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                child = moveTo;
3160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            } else
3170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                child = child.nextSibling;
3180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
3190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    },
3200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _startStatusBarDragging: function(event)
3220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
3232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (!this.visible || event.target !== this._mainStatusBar)
3240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return;
3250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        WebInspector.elementDragStart(this._mainStatusBar, this._statusBarDragging.bind(this), this._endStatusBarDragging.bind(this), event, "row-resize");
3270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        this._statusBarDragOffset = event.pageY - this.element.totalOffsetTop;
3290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        event.stopPropagation();
3310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    },
3320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _statusBarDragging: function(event)
3340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
3350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        var height = window.innerHeight - event.pageY + this._statusBarDragOffset;
3362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - this._mainElement.totalOffsetTop - Preferences.minConsoleHeight);
3370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        this._mainElement.style.bottom = height + "px";
3390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        this.element.style.height = height + "px";
3400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        event.preventDefault();
3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        event.stopPropagation();
3430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    },
3440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _endStatusBarDragging: function(event)
3460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
3470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        WebInspector.elementDragEnd(event);
3480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
349643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        this._savedHeight = this.element.offsetHeight;
3500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        delete this._statusBarDragOffset;
3510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        event.stopPropagation();
3530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
3540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochWebInspector.Drawer.prototype.__proto__ = WebInspector.View.prototype;
357643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
358643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockWebInspector.Drawer.State = {
359643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Hidden: 0,
360643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Variable: 1,
361643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Full: 2
362643ca7872b450ea4efacab6188849e5aac2ba161Steve Block};
363