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