15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)"use strict"; 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!string} id 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function $(id) { 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return document.getElementById(id); 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!string} tagName 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string=} opt_class 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {string=} opt_text 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {!Element} 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function createElement(tagName, opt_class, opt_text) { 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var element = document.createElement(tagName); 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (opt_class) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) element.setAttribute("class", opt_class); 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (opt_text) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) element.appendChild(document.createTextNode(opt_text)); 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return element; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!number|Rectangle|Object} xOrRect 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!number} y 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!number} width 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!number} height 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function Rectangle(xOrRect, y, width, height) { 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (typeof xOrRect === "object") { 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) y = xOrRect.y; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) width = xOrRect.width; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) height = xOrRect.height; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xOrRect = xOrRect.x; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.x = xOrRect; 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.y = y; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.width = width; 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this.height = height; 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Rectangle.prototype = { 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) get maxX() { return this.x + this.width; }, 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) get maxY() { return this.y + this.height; }, 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toString: function() { return "Rectangle(" + this.x + "," + this.y + "," + this.width + "," + this.height + ")"; } 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!Rectangle} rect1 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!Rectangle} rect2 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {?Rectangle} 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Rectangle.intersection = function(rect1, rect2) { 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var x = Math.max(rect1.x, rect2.x); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var maxX = Math.min(rect1.maxX, rect2.maxX); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var y = Math.max(rect1.y, rect2.y); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var maxY = Math.min(rect1.maxY, rect2.maxY); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var width = maxX - x; 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var height = maxY - y; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (width < 0 || height < 0) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return null; 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return new Rectangle(x, y, width, height); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!number} width 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!number} height 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function resizeWindow(width, height) { 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setWindowRect(adjustWindowRect(width, height, width, height)); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!number} width 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!number} height 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {?number} minWidth 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {?number} minHeight 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {!Rectangle} 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function adjustWindowRect(width, height, minWidth, minHeight) { 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (typeof minWidth !== "number") 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) minWidth = 0; 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (typeof minHeight !== "number") 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) minHeight = 0; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var windowRect = new Rectangle(0, 0, width, height); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!global.params.anchorRectInScreen) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return windowRect; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var anchorRect = new Rectangle(global.params.anchorRectInScreen); 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var availRect = new Rectangle(window.screen.availLeft, window.screen.availTop, window.screen.availWidth, window.screen.availHeight); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _adjustWindowRectVertically(windowRect, availRect, anchorRect, minHeight); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _adjustWindowRectHorizontally(windowRect, availRect, anchorRect, minWidth); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return windowRect; 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function _adjustWindowRectVertically(windowRect, availRect, anchorRect, minHeight) { 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var availableSpaceAbove = anchorRect.y - availRect.y; 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) availableSpaceAbove = Math.max(0, Math.min(availRect.height, availableSpaceAbove)); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var availableSpaceBelow = availRect.maxY - anchorRect.maxY; 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) availableSpaceBelow = Math.max(0, Math.min(availRect.height, availableSpaceBelow)); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (windowRect.height > availableSpaceBelow && availableSpaceBelow < availableSpaceAbove) { 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.height = Math.min(windowRect.height, availableSpaceAbove); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.height = Math.max(windowRect.height, minHeight); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.y = anchorRect.y - windowRect.height; 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.height = Math.min(windowRect.height, availableSpaceBelow); 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.height = Math.max(windowRect.height, minHeight); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.y = anchorRect.maxY; 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.y = Math.min(windowRect.y, availRect.maxY - windowRect.height); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.y = Math.max(windowRect.y, availRect.y); 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function _adjustWindowRectHorizontally(windowRect, availRect, anchorRect, minWidth) { 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.width = Math.min(windowRect.width, availRect.width); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.width = Math.max(windowRect.width, minWidth); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.x = anchorRect.x; 150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (global.params.isRTL) 151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) windowRect.x += anchorRect.width - windowRect.width; 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.x = Math.min(windowRect.x, availRect.maxX - windowRect.width); 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) windowRect.x = Math.max(windowRect.x, availRect.x); 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!Rectangle} rect 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function setWindowRect(rect) { 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (window.frameElement) { 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) window.frameElement.style.width = rect.width + "px"; 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) window.frameElement.style.height = rect.height + "px"; 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (isWindowHidden()) { 16509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) window.moveTo(rect.x, rect.y); 166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) window.resizeTo(rect.width, rect.height); 167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else { 168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) window.resizeTo(rect.width, rect.height); 16909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) window.moveTo(rect.x, rect.y); 170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function hideWindow() { 175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) resizeWindow(1, 1); 176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/** 179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @return {!boolean} 180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */ 181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)function isWindowHidden() { 182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return window.innerWidth === 1 && window.innerHeight === 1; 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)window.addEventListener("resize", function() { 186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (isWindowHidden()) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) window.dispatchEvent(new CustomEvent("didHide")); 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) window.dispatchEvent(new CustomEvent("didOpenPicker")); 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}, false); 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {!number} 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function getScrollbarWidth() { 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (typeof window.scrollbarWidth === "undefined") { 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scrollDiv = document.createElement("div"); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollDiv.style.opacity = "0"; 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollDiv.style.overflow = "scroll"; 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollDiv.style.width = "50px"; 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollDiv.style.height = "50px"; 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) document.body.appendChild(scrollDiv); 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) window.scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scrollDiv.parentNode.removeChild(scrollDiv); 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return window.scrollbarWidth; 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!string} className 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @return {?Element} 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function enclosingNodeOrSelfWithClass(selfNode, className) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var node = selfNode; node && node !== selfNode.ownerDocument; node = node.parentNode) { 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains(className)) 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return node; 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return null; 220a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch} 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!Element} element 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!Object} config 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function Picker(element, config) { 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._element = element; 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._config = config; 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @enum {number} 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Picker.Actions = { 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SetValue: 0, 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Cancel: -1, 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ChooseOtherColor: -2 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {!string} value 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Picker.prototype.submitValue = function(value) { 245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) window.pagePopupController.setValue(value); 246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) window.pagePopupController.closePopup(); 247a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}; 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Picker.prototype.handleCancel = function() { 250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) window.pagePopupController.closePopup(); 251a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}; 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Picker.prototype.chooseOtherColor = function() { 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) window.pagePopupController.setValueAndClosePopup(Picker.Actions.ChooseOtherColor, ""); 255a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}; 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Picker.prototype.cleanup = function() {}; 258