{"mappings": "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", "sourcesContent": ["\n\n        var DEVMODE=false;\n        var STATIC_URI_PREFIX=\"https://s.smore.com/\";\n\n        ", "define('smore/token', function (require) {\r\n\r\n    function token() {\r\n        var m = document.cookie.match(/_L=\"?([A-Za-z0-9\\+\\/\\\\]*)\"?/);\r\n        if (!m || m.length < 2) return null;\r\n        return m[1];\r\n    }\r\n\r\n    return token;\r\n});", "define('smore/isAuthor', function (require) {\r\n\r\n    function isAuthor() {\r\n        return $('meta[name=\"smore:author\"]').attr('value') === 'true';\r\n    }\r\n\r\n    return isAuthor;\r\n});", "define('fire/net/safe', function (require) {\r\n    \"use strict\";\r\n\r\n    var GENERIC_ERROR_MESSAGE = 'Something went wrong :-/';\r\n    var _body = $('body');\r\n\r\n    /***\r\n     *\r\n     * @param {String} uri\r\n     * @param {Object=} params\r\n     * @param {Function=} successFunc\r\n     * @param {Object=} opts\r\n     *\r\n     * @returns {$.Deferred}\r\n     */\r\n    function post(uri, params, successFunc, opts) {\r\n        params = params || {};\r\n\r\n        // add the smore token\r\n        $.extend(params, {_token: token()});\r\n\r\n        var o = $.extend({\r\n            url: uri,\r\n            type: 'POST',\r\n            success: successFunc,\r\n            data: params\r\n        }, opts);\r\n\r\n        var p = $.ajax(o);\r\n\r\n        var call = p.then(handleRequest, handleFailedRequest);\r\n\r\n        // setup shorthands for compatibility with $.post\r\n        call.success = call.done;\r\n        call.error = call.fail;\r\n        call.complete = call.always;\r\n\r\n\r\n        // compatibility with jqXhr\r\n        call.abort = p.abort;\r\n        call.setRequestHeader = p.setRequestHeader;\r\n        call.getAllResponseHeaders = p.getAllResponseHeaders;\r\n        call.getResponseHeader = p.getResponseHeader;\r\n\r\n        // handle success callback\r\n        if (successFunc) {\r\n            call.done(successFunc);\r\n        }\r\n        return call;\r\n    }\r\n\r\n    function handleFailedRequest(jqXhr, statusText, error) {\r\n        var dfd = $.Deferred();\r\n\r\n        if (statusText === 'abort') {\r\n            dfd.reject(statusText, jqXhr, error);\r\n        } else {\r\n            dfd.reject(GENERIC_ERROR_MESSAGE, jqXhr, error);\r\n        }\r\n        return dfd;\r\n    }\r\n\r\n\r\n    /****\r\n     *\r\n     * @param data\r\n     * @param textStatus\r\n     * @param jqXhr\r\n     * @return {jQuery.Deferred}\r\n     * @private\r\n     */\r\n    function handleRequest(data, textStatus, jqXhr) {\r\n        // create the new deferred\r\n        var dfd = $.Deferred();\r\n        // if there is data, and no status information\r\n        if (!data || data && !data.status) {\r\n            dfd.resolve(data, textStatus, jqXhr);\r\n        }\r\n\r\n        // if we have status\r\n        if (data.status) {\r\n            if (data.status === 'success') {\r\n                dfd.resolve(data.result, textStatus, jqXhr);\r\n            }\r\n\r\n            if (data.status === 'error') {\r\n                dfd.reject(data.message || GENERIC_ERROR_MESSAGE, data, textStatus, jqXhr);\r\n            }\r\n\r\n        }\r\n\r\n\r\n        // setup shorthands for compatibility with $.post\r\n        return dfd;\r\n    }\r\n\r\n\r\n    function iframeEl(uri, params, fromForm) {\r\n        var dfd = $.Deferred();\r\n        var i = getIframe();\r\n        var name = i.attr('name');\r\n\r\n        registerCallback(name, dfd);\r\n\r\n        params = $.extend({}, params, {'_iframe_id': name});\r\n\r\n        // create a form and submit it\r\n        form(uri, params, name, fromForm);\r\n\r\n        var p = dfd.promise();\r\n\r\n        p.abort = function () {\r\n            dfd.reject(\"ABORT\");\r\n        };\r\n\r\n        return p;\r\n    }\r\n\r\n    function registerCallback(name, dfd) {\r\n        if (!('smore' in window)) {\r\n            window.smore = {};\r\n        }\r\n\r\n\r\n        window.smore[name] = function (data) {\r\n            // if there is data, and no status information\r\n            if (!data || data && !data.status) {\r\n                dfd.resolve(data);\r\n            }\r\n\r\n            // if we have status\r\n            if (data.status) {\r\n                if (data.status === 'success') {\r\n                    dfd.resolve(data.result);\r\n                }\r\n\r\n                if (data.status === 'error') {\r\n                    dfd.reject(data.message, data);\r\n                }\r\n            }\r\n        };\r\n\r\n        // always remove the callback from the smore object\r\n        dfd.always(function () {\r\n            delete window.smore[name];\r\n        });\r\n    }\r\n\r\n\r\n    var HIDDEN_CSS = {\r\n        'visibility': 'hidden',\r\n        'width': 1,\r\n        'height': 1,\r\n        'position': 'absolute',\r\n        'left': -10000,\r\n        'top': -10000\r\n    };\r\n\r\n\r\n    var _iframeId = 0;\r\n\r\n    function getIframe() {\r\n\r\n        var name = 'iframe_name_' + (++_iframeId);\r\n\r\n        var iframeEl = $('<iframe/>')\r\n            .css(HIDDEN_CSS)\r\n            .attr('name', name);\r\n\r\n        $(document.body).append(iframeEl);\r\n\r\n\r\n        return iframeEl;\r\n    }\r\n\r\n    /***\r\n     * Store the token\r\n     *\r\n     * @type {String|Function}\r\n     * @private\r\n     */\r\n    var _token = '';\r\n\r\n    /***\r\n     * Gets or sets the token\r\n     * @param {string|Function=} val\r\n     * @return {*}\r\n     */\r\n    function token(val) {\r\n        if (val) {\r\n            _token = val;\r\n        }\r\n\r\n        // If we have a function stored\r\n        if (typeof _token === 'function') {\r\n            return _token();\r\n        }\r\n\r\n        return _token;\r\n    }\r\n\r\n\r\n    function form(uri, params, targetFrame, form) {\r\n        params = $.extend({'_token': token()}, params);\r\n\r\n        if (!form) {\r\n            form = $('<form/>')\r\n                .css(HIDDEN_CSS)\r\n                .appendTo(_body);\r\n        }\r\n\r\n\r\n        form.attr({\r\n            method: 'POST',\r\n            // the target frame\r\n            target: targetFrame,\r\n            // the action uri\r\n            action: uri,\r\n            enctype: 'multipart/form-data'\r\n        });\r\n\r\n        for (var k in params) {\r\n            $('<input/>').attr({\r\n                name: k,\r\n                type: 'hidden'\r\n            })\r\n                .appendTo(form)\r\n                .val(params[k]);\r\n        }\r\n\r\n        form.submit();\r\n    }\r\n\r\n    function callbackForm(uri, params, targetFrame, baseForm, callbackParam) {\r\n        callbackParam = callbackParam || 'cb';\r\n\r\n        var cbName = 'form_cb_name_' + (++_iframeId);\r\n\r\n        var dfd = $.Deferred();\r\n\r\n        registerCallback(cbName, dfd);\r\n\r\n        var base = {};\r\n        base[callbackParam] = cbName;\r\n\r\n        params = $.extend(base, params);\r\n\r\n        form(uri, params, targetFrame, baseForm);\r\n\r\n        return dfd;\r\n    }\r\n\r\n\r\n    return {\r\n        token: token,\r\n        post: post,\r\n        iframe: iframeEl,\r\n        form: form,\r\n        callbackForm: callbackForm\r\n    };\r\n});\r\n", "/****\r\n * @fileOverview Social counters code\r\n */\r\n\r\ndefine('fire/net/social', function (require) {\r\n\r\n    var _cache = {facebook:{}, pinterest:{}, twitter:{}};\r\n\r\n\r\n    function count(endpoint, data, formatter) {\r\n        return $.ajax(endpoint, {\r\n            data:data,\r\n            dataType:'jsonp'\r\n        }).pipe(formatter)\r\n    }\r\n\r\n\r\n    function facebook(uri) {\r\n        var query = \"SELECT total_count\" +\r\n            \" FROM link_stat WHERE url='\" + uri + \"'\";\r\n        return count('//graph.facebook.com/fql?q=' + query, {}, fbFilter);\r\n    }\r\n\r\n    function twitter(uri) {\r\n        return count('//cdn.api.twitter.com/1/urls/count.json', {url:uri}, twitterFilter);\r\n    }\r\n\r\n    function pinterest(uri) {\r\n        return count('//partners-api.pinterest.com/v1/urls/count.json', {url:uri}, pinterestFilter);\r\n    }\r\n\r\n    /**************************** Filters ************************************/\r\n\r\n    function fbFilter(data) {\r\n        data = (data['data'] || {})[0] || {};\r\n\r\n\r\n        return {\r\n            _total:(data['total_count'] || 0)\r\n        }\r\n    }\r\n\r\n    function twitterFilter(data) {\r\n        return {\r\n            _total:data['count'] || 0\r\n        }\r\n    }\r\n\r\n    // pinterest just copied the twitter api\r\n    var pinterestFilter = twitterFilter;\r\n\r\n\r\n    /**************************** CACHE ************************************/\r\n\r\n    function cache(func, key) {\r\n        if (!_cache[key]) _cache[key] = {};\r\n        var c = _cache[key];\r\n\r\n        return function (uri, force) {\r\n            if (!force && uri in c) {\r\n                return c[uri];\r\n            } else {\r\n                return c[uri] = func(uri)\r\n            }\r\n        }\r\n    }\r\n\r\n    return {\r\n        facebook:cache(facebook, 'facebook'),\r\n        twitter:cache(twitter, 'twitter'),\r\n        pinterest:cache(pinterest, 'pinterest')\r\n    }\r\n\r\n});", "/*****\r\n * @fileOverview a global event hub. used as an event bus for all widgets/etc to use\r\n */\r\n\r\ndefine('fire/util/hub', function (require) {\r\n    /***\r\n     * The analytics 'hub' element.\r\n     * We'll use it to trigger and attach app events\r\n     * @type {jQuery}\r\n     */\r\n    return $({});\r\n});", "define('fire/util/json', function (require) {\r\n\r\n    /***\r\n     *\r\n     * @param {*} data\r\n     * @return {String}\r\n     */\r\n    function encode(data) {\r\n        return JSON.stringify(data);\r\n    }\r\n\r\n\r\n    /***\r\n     *\r\n     * @param {String} data\r\n     * @return {*}\r\n     */\r\n    function decode(data) {\r\n        return JSON.parse(data);\r\n    }\r\n\r\n\r\n    /****\r\n     * Fetches a path of an object safely\r\n     * @param {Object} obj\r\n     * @param {String} key\r\n     * @param {*=} fallback an optional fallback value\r\n     *\r\n     * Example:\r\n     *  json.path({a: {b: 'c'}}, 'a.b') -> 'c'\r\n     *  json.path({a: {b: 'c'}}, 'a.c') -> undefined\r\n     *  json.path({a: {b: 'c'}}, 'molsh.c') -> undefined\r\n     *\r\n     */\r\n    function path(obj, key, fallback) {\r\n        var parts = key.split('.');\r\n        var cur = obj;\r\n        for (var part; parts.length && (part = parts.shift());) {\r\n            if (part in cur) {\r\n                cur = cur[part];\r\n                if (!parts.length) {\r\n                    return cur;\r\n                }\r\n            } else {\r\n                return fallback;\r\n            }\r\n        }\r\n        return fallback\r\n    }\r\n\r\n\r\n    /****\r\n     * Sets the value of a given path\r\n     * @param {Object} obj\r\n     * @param {String} key\r\n     * @param {*} value\r\n     *\r\n     */\r\n    function setPath(obj, key, value) {\r\n        var parts = key.split('.');\r\n        var cur = obj;\r\n        for (var part; parts.length && (part = parts.shift());) {\r\n            if (part in cur && parts.length) {\r\n                cur = cur[part];\r\n                continue;\r\n            }\r\n            // if we've reached the end of the path\r\n            if (!parts.length) {\r\n                cur[part] = value;\r\n                return;\r\n            }\r\n\r\n            // if the next object doesn't exist\r\n            cur = cur[part] = {};\r\n        }\r\n    }\r\n\r\n    return {\r\n        encode: encode,\r\n        decode: decode,\r\n        path: path,\r\n        setPath: setPath\r\n    }\r\n});", "/*\n * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/\n *\n * Uses the built in easing capabilities added In jQuery 1.1\n * to offer multiple easing options\n *\n * TERMS OF USE - jQuery Easing\n *\n * Open source under the BSD License.\n *\n * Copyright \u00c2\u00a9 2008 George McGinley Smith\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n *\n * Neither the name of the author nor the names of contributors may be used to endorse\n * or promote products derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n */\n\n/****\n * I've commented out all the easing functions we're not actively using.\n * shlomiatar @ 12-08-12\n */\n\n\njQuery.extend(jQuery.easing,\n        {\n            easeOutQuad: function (x, t, b, c, d) {\n                return -c * (t /= d) * (t - 2) + b;\n            },\n            /*\n            easeInQuad: function (x, t, b, c, d) {\n                return c * (t /= d) * t + b;\n            },\n\n\n\n            easeInOutQuad: function (x, t, b, c, d) {\n                if ((t /= d / 2) < 1) return c / 2 * t * t + b;\n                return -c / 2 * ((--t) * (t - 2) - 1) + b;\n            },\n            */\n            easeInCubic: function (x, t, b, c, d) {\n                return c * (t /= d) * t * t + b;\n            },\n            /*\n            */\n            easeOutCubic: function (x, t, b, c, d) {\n                return c * ((t = t / d - 1) * t * t + 1) + b;\n            },\n            /*\n            easeInOutCubic: function (x, t, b, c, d) {\n                if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;\n                return c / 2 * ((t -= 2) * t * t + 2) + b;\n            },\n            easeInQuart: function (x, t, b, c, d) {\n                return c * (t /= d) * t * t * t + b;\n            },\n            */\n            easeOutQuart: function (x, t, b, c, d) {\n                return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n            },\n            /*\n            easeInOutQuart: function (x, t, b, c, d) {\n                if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;\n                return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n            },\n            easeInQuint: function (x, t, b, c, d) {\n                return c * (t /= d) * t * t * t * t + b;\n            },\n            easeOutQuint: function (x, t, b, c, d) {\n                return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n            },\n            easeInOutQuint: function (x, t, b, c, d) {\n                if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;\n                return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n            },\n            easeInSine: function (x, t, b, c, d) {\n                return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n            },\n            */\n            easeOutSine: function (x, t, b, c, d) {\n                return c * Math.sin(t / d * (Math.PI / 2)) + b;\n            },\n            /*\n            easeInOutSine: function (x, t, b, c, d) {\n                return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n            },\n            easeInExpo: function (x, t, b, c, d) {\n                return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n            },\n            easeOutExpo: function (x, t, b, c, d) {\n                return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n            },\n            easeInOutExpo: function (x, t, b, c, d) {\n                if (t == 0) return b;\n                if (t == d) return b + c;\n                if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n                return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n            },\n            easeInCirc: function (x, t, b, c, d) {\n                return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n            },\n            easeOutCirc: function (x, t, b, c, d) {\n                return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n            },\n            easeInOutCirc: function (x, t, b, c, d) {\n                if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n                return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n            },\n            easeInElastic: function (x, t, b, c, d) {\n                var s = 1.70158;\n                var p = 0;\n                var a = c;\n                if (t == 0) return b;\n                if ((t /= d) == 1) return b + c;\n                if (!p) p = d * .3;\n                if (a < Math.abs(c)) {\n                    a = c;\n                    var s = p / 4;\n                }\n                else var s = p / (2 * Math.PI) * Math.asin(c / a);\n                return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n            },\n            easeOutElastic: function (x, t, b, c, d) {\n                var s = 1.70158;\n                var p = 0;\n                var a = c;\n                if (t == 0) return b;\n                if ((t /= d) == 1) return b + c;\n                if (!p) p = d * .3;\n                if (a < Math.abs(c)) {\n                    a = c;\n                    var s = p / 4;\n                }\n                else var s = p / (2 * Math.PI) * Math.asin(c / a);\n                return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\n            },\n            easeInOutElastic: function (x, t, b, c, d) {\n                var s = 1.70158;\n                var p = 0;\n                var a = c;\n                if (t == 0) return b;\n                if ((t /= d / 2) == 2) return b + c;\n                if (!p) p = d * (.3 * 1.5);\n                if (a < Math.abs(c)) {\n                    a = c;\n                    var s = p / 4;\n                }\n                else var s = p / (2 * Math.PI) * Math.asin(c / a);\n                if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\n                return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;\n            },\n            easeInBack: function (x, t, b, c, d, s) {\n                if (s == undefined) s = 1.70158;\n                return c * (t /= d) * t * ((s + 1) * t - s) + b;\n            },\n            */\n            easeOutBack: function (x, t, b, c, d, s) {\n                if (s === undefined) s = 1.70158;\n                return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n            }/*,\n\n            easeInOutBack: function (x, t, b, c, d, s) {\n                if (s == undefined) s = 1.70158;\n                if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;\n                return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;\n            },\n            easeInBounce: function (x, t, b, c, d) {\n                return c - jQuery.easing.easeOutBounce(x, d - t, 0, c, d) + b;\n            },\n            easeOutBounce: function (x, t, b, c, d) {\n                if ((t /= d) < (1 / 2.75)) {\n                    return c * (7.5625 * t * t) + b;\n                } else if (t < (2 / 2.75)) {\n                    return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;\n                } else if (t < (2.5 / 2.75)) {\n                    return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;\n                } else {\n                    return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;\n                }\n            },\n            easeInOutBounce: function (x, t, b, c, d) {\n                if (t < d / 2) return jQuery.easing.easeInBounce(x, t * 2, 0, c, d) * .5 + b;\n                return jQuery.easing.easeOutBounce(x, t * 2 - d, 0, c, d) * .5 + c * .5 + b;\n            }\n             */\n        });\n", "/*\r\n * FancyBox - jQuery Plugin\r\n * Simple and fancy lightbox alternative\r\n *\r\n * Examples and documentation at: http://fancybox.net\r\n *\r\n * Copyright (c) 2008 - 2010 Janis Skarnelis\r\n * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated.\r\n *\r\n * Version: 1.3.4 (11/11/2010)\r\n * Requires: jQuery v1.3+\r\n *\r\n * Dual licensed under the MIT and GPL licenses:\r\n *   http://www.opensource.org/licenses/mit-license.php\r\n *   http://www.gnu.org/licenses/gpl.html\r\n */\r\n\r\n;\r\n(function ($) {\r\n    var MIN_WIDTH = 350;\r\n    var tmp, loading, overlay, wrap, outer, content, close, title, nav_left, nav_right,\r\n\r\n        selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [],\r\n\r\n        ajaxLoader = null, imgPreloader = new Image(), imgRegExp = /\\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, swfRegExp = /[^\\.]\\.(swf)\\s*$/i,\r\n\r\n        loadingTimer, loadingFrame = 1,\r\n\r\n        titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('<div/>')[0], { prop: 0 }),\r\n\r\n        isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest,\r\n\r\n    /*\r\n     * Private methods\r\n     */\r\n\r\n        _abort = function () {\r\n            loading.hide();\r\n\r\n            imgPreloader.onerror = imgPreloader.onload = null;\r\n\r\n            if (ajaxLoader) {\r\n                ajaxLoader.abort();\r\n            }\r\n\r\n            tmp.empty();\r\n        },\r\n\r\n        _error = function () {\r\n            if (false === selectedOpts.onError(selectedArray, selectedIndex, selectedOpts)) {\r\n                loading.hide();\r\n                busy = false;\r\n                return;\r\n            }\r\n\r\n            selectedOpts.titleShow = false;\r\n\r\n            selectedOpts.width = 'auto';\r\n            selectedOpts.height = 'auto';\r\n\r\n            tmp.html('<p id=\"fancybox-error\">The requested content cannot be loaded.<br />Please try again later.</p>');\r\n\r\n            _process_inline();\r\n        },\r\n\r\n        _start = function () {\r\n            var obj = selectedArray[ selectedIndex ],\r\n                href,\r\n                type,\r\n                title,\r\n                str,\r\n                emb,\r\n                ret;\r\n\r\n            _abort();\r\n\r\n            selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox')));\r\n\r\n            ret = selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts);\r\n\r\n            if (ret === false) {\r\n                busy = false;\r\n                return;\r\n            } else if (typeof ret == 'object') {\r\n                selectedOpts = $.extend(selectedOpts, ret);\r\n            }\r\n\r\n            title = selectedOpts.title || (obj.nodeName ? $(obj).attr('title') : obj.title) || '';\r\n\r\n            if (obj.nodeName && !selectedOpts.orig) {\r\n                selectedOpts.orig = $(obj).children(\"img:first\").length ? $(obj).children(\"img:first\") : $(obj);\r\n            }\r\n\r\n            if (title === '' && selectedOpts.orig && selectedOpts.titleFromAlt) {\r\n                title = selectedOpts.orig.attr('alt');\r\n            }\r\n\r\n            href = selectedOpts.href || (obj.nodeName ? $(obj).attr('href') : obj.href) || null;\r\n\r\n            if ((/^(?:javascript)/i).test(href) || href == '#') {\r\n                href = null;\r\n            }\r\n\r\n            if (selectedOpts.type) {\r\n                type = selectedOpts.type;\r\n\r\n                if (!href) {\r\n                    href = selectedOpts.content;\r\n                }\r\n\r\n            } else if (selectedOpts.content) {\r\n                type = 'html';\r\n\r\n            } else if (href) {\r\n                if (href.match(imgRegExp)) {\r\n                    type = 'image';\r\n\r\n                } else if (href.match(swfRegExp)) {\r\n                    type = 'swf';\r\n\r\n                } else if ($(obj).hasClass(\"iframe\")) {\r\n                    type = 'iframe';\r\n\r\n                } else if (href.indexOf(\"#\") === 0) {\r\n                    type = 'inline';\r\n\r\n                } else {\r\n                    type = 'ajax';\r\n                }\r\n            }\r\n\r\n            if (!type) {\r\n                _error();\r\n                return;\r\n            }\r\n\r\n            if (type == 'inline') {\r\n                obj = href.substr(href.indexOf(\"#\"));\r\n                type = $(obj).length > 0 ? 'inline' : 'ajax';\r\n            }\r\n\r\n            selectedOpts.type = type;\r\n            selectedOpts.href = href;\r\n            selectedOpts.title = title;\r\n\r\n            if (selectedOpts.autoDimensions) {\r\n                if (selectedOpts.type == 'html' || selectedOpts.type == 'inline' || selectedOpts.type == 'ajax') {\r\n                    selectedOpts.width = 'auto';\r\n                    selectedOpts.height = 'auto';\r\n                } else {\r\n                    selectedOpts.autoDimensions = false;\r\n                }\r\n            }\r\n\r\n            if (selectedOpts.modal) {\r\n                selectedOpts.overlayShow = true;\r\n                selectedOpts.hideOnOverlayClick = false;\r\n                selectedOpts.hideOnContentClick = false;\r\n                selectedOpts.enableEscapeButton = false;\r\n                selectedOpts.showCloseButton = false;\r\n            }\r\n\r\n            selectedOpts.padding = parseInt(selectedOpts.padding, 10);\r\n            selectedOpts.margin = parseInt(selectedOpts.margin, 10);\r\n\r\n            tmp.css('padding', (selectedOpts.padding + selectedOpts.margin));\r\n\r\n            $('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function () {\r\n                $(this).replaceWith(content.children());\r\n            });\r\n\r\n            switch (type) {\r\n                case 'html' :\r\n                    tmp.html(selectedOpts.content);\r\n                    _process_inline();\r\n                    break;\r\n\r\n                case 'inline' :\r\n                    if ($(obj).parent().is('#fancybox-content') === true) {\r\n                        busy = false;\r\n                        return;\r\n                    }\r\n\r\n                    $('<div class=\"fancybox-inline-tmp\" />')\r\n                        .hide()\r\n                        .insertBefore($(obj))\r\n                        .bind('fancybox-cleanup', function () {\r\n                            $(this).replaceWith(content.children());\r\n                        }).bind('fancybox-cancel', function () {\r\n                            $(this).replaceWith(tmp.children());\r\n                        });\r\n\r\n                    $(obj).appendTo(tmp);\r\n\r\n                    _process_inline();\r\n                    break;\r\n\r\n                case 'image':\r\n                    busy = false;\r\n\r\n                    $.fancybox.showActivity();\r\n\r\n                    imgPreloader = new Image();\r\n\r\n                    imgPreloader.onerror = function () {\r\n                        _error();\r\n                    };\r\n\r\n                    imgPreloader.onload = function () {\r\n                        busy = true;\r\n\r\n                        imgPreloader.onerror = imgPreloader.onload = null;\r\n\r\n                        _process_image();\r\n                    };\r\n\r\n                    imgPreloader.src = href;\r\n                    break;\r\n\r\n                case 'swf':\r\n                    selectedOpts.scrolling = 'no';\r\n\r\n                    str = '<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\"' + selectedOpts.width + '\" height=\"' + selectedOpts.height + '\"><param name=\"movie\" value=\"' + href + '\"></param>';\r\n                    emb = '';\r\n\r\n                    $.each(selectedOpts.swf, function (name, val) {\r\n                        str += '<param name=\"' + name + '\" value=\"' + val + '\"></param>';\r\n                        emb += ' ' + name + '=\"' + val + '\"';\r\n                    });\r\n\r\n                    str += '<embed src=\"' + href + '\" type=\"application/x-shockwave-flash\" width=\"' + selectedOpts.width + '\" height=\"' + selectedOpts.height + '\"' + emb + '></embed></object>';\r\n\r\n                    tmp.html(str);\r\n\r\n                    _process_inline();\r\n                    break;\r\n\r\n                case 'ajax':\r\n                    busy = false;\r\n\r\n                    $.fancybox.showActivity();\r\n\r\n                    selectedOpts.ajax.win = selectedOpts.ajax.success;\r\n\r\n                    ajaxLoader = $.ajax($.extend({}, selectedOpts.ajax, {\r\n                        url: href,\r\n                        data: selectedOpts.ajax.data || {},\r\n                        error: function (XMLHttpRequest, textStatus, errorThrown) {\r\n                            if (XMLHttpRequest.status > 0) {\r\n                                _error();\r\n                            }\r\n                        },\r\n                        success: function (data, textStatus, XMLHttpRequest) {\r\n                            var o = typeof XMLHttpRequest == 'object' ? XMLHttpRequest : ajaxLoader;\r\n                            if (o.status == 200) {\r\n                                if (typeof selectedOpts.ajax.win == 'function') {\r\n                                    ret = selectedOpts.ajax.win(href, data, textStatus, XMLHttpRequest);\r\n\r\n                                    if (ret === false) {\r\n                                        loading.hide();\r\n                                        return;\r\n                                    } else if (typeof ret == 'string' || typeof ret == 'object') {\r\n                                        data = ret;\r\n                                    }\r\n                                }\r\n\r\n                                tmp.html(data);\r\n                                _process_inline();\r\n                            }\r\n                        }\r\n                    }));\r\n\r\n                    break;\r\n\r\n                case 'iframe':\r\n                    _show();\r\n                    break;\r\n            }\r\n        },\r\n\r\n        _process_inline = function () {\r\n            var\r\n                w = selectedOpts.width,\r\n                h = selectedOpts.height;\r\n\r\n            if (w.toString().indexOf('%') > -1) {\r\n                w = parseInt(($(window).width() - (selectedOpts.margin * 2)) * parseFloat(w) / 100, 10) + 'px';\r\n\r\n            } else {\r\n                w = w == 'auto' ? 'auto' : w + 'px';\r\n            }\r\n\r\n            if (h.toString().indexOf('%') > -1) {\r\n                h = parseInt(($(window).height() - (selectedOpts.margin * 2)) * parseFloat(h) / 100, 10) + 'px';\r\n\r\n            } else {\r\n                h = h == 'auto' ? 'auto' : h + 'px';\r\n            }\r\n\r\n            tmp.wrapInner('<div style=\"width:' + w + ';height:' + h + ';overflow: ' + (selectedOpts.scrolling == 'auto' ? 'auto' : (selectedOpts.scrolling == 'yes' ? 'scroll' : 'hidden')) + ';position:relative;\"></div>');\r\n\r\n            selectedOpts.width = tmp.width();\r\n            selectedOpts.height = tmp.height();\r\n\r\n            _show();\r\n        },\r\n\r\n        _process_image = function () {\r\n            selectedOpts.width = Math.max(imgPreloader.width, MIN_WIDTH);\r\n            selectedOpts.height = imgPreloader.height;\r\n\r\n            $(\"<img />\").attr({\r\n                'id': 'fancybox-img',\r\n                'src': imgPreloader.src,\r\n                'alt': selectedOpts.title\r\n            }).appendTo(tmp);\r\n\r\n            _show();\r\n        },\r\n\r\n        _show = function () {\r\n            var pos, equal;\r\n\r\n            loading.hide();\r\n\r\n            if (wrap.is(\":visible\") && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) {\r\n                $.event.trigger('fancybox-cancel');\r\n\r\n                busy = false;\r\n                return;\r\n            }\r\n\r\n            busy = true;\r\n\r\n            $(content.add(overlay)).unbind();\r\n\r\n            $(window).unbind(\"resize.fb scroll.fb\");\r\n            $(document).unbind('keydown.fb');\r\n\r\n            if (wrap.is(\":visible\") && currentOpts.titlePosition !== 'outside') {\r\n                wrap.css('height', wrap.height());\r\n            }\r\n\r\n            currentArray = selectedArray;\r\n            currentIndex = selectedIndex;\r\n            currentOpts = selectedOpts;\r\n\r\n            if (currentOpts.overlayShow) {\r\n                overlay.css({\r\n                    'background-color': currentOpts.overlayColor,\r\n                    'opacity': currentOpts.overlayOpacity,\r\n                    'cursor': currentOpts.hideOnOverlayClick ? 'pointer' : 'auto',\r\n                    'height': $(document).height()\r\n                });\r\n\r\n                if (!overlay.is(':visible')) {\r\n                    if (isIE6) {\r\n                        $('select:not(#fancybox-tmp select)').filter(function () {\r\n                            return this.style.visibility !== 'hidden';\r\n                        }).css({'visibility': 'hidden'}).one('fancybox-cleanup', function () {\r\n                            this.style.visibility = 'inherit';\r\n                        });\r\n                    }\r\n\r\n                    overlay.show();\r\n                }\r\n            } else {\r\n                overlay.hide();\r\n            }\r\n\r\n            final_pos = _get_zoom_to();\r\n\r\n            _process_title();\r\n\r\n            if (wrap.is(\":visible\")) {\r\n                $(close.add(nav_left).add(nav_right)).hide();\r\n\r\n                pos = wrap.position(),\r\n\r\n                    start_pos = {\r\n                        top: pos.top,\r\n                        left: pos.left,\r\n                        width: wrap.width(),\r\n                        height: wrap.height()\r\n                    };\r\n\r\n                equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height);\r\n\r\n                content.fadeTo(currentOpts.changeFade, 0.3, function () {\r\n                    var finish_resizing = function () {\r\n                        content.html(tmp.contents()).fadeTo(currentOpts.changeFade, 1, _finish);\r\n                    };\r\n\r\n                    $.event.trigger('fancybox-change');\r\n\r\n                    content\r\n                        .empty()\r\n                        .removeAttr('filter')\r\n                        .css({\r\n                            'border-width': currentOpts.padding,\r\n                            'width': final_pos.width - currentOpts.padding * 2,\r\n                            'height': selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2\r\n                        });\r\n\r\n                    if (equal) {\r\n                        finish_resizing();\r\n\r\n                    } else {\r\n                        fx.prop = 0;\r\n\r\n                        $(fx).animate({prop: 1}, {\r\n                            duration: currentOpts.changeSpeed,\r\n                            easing: currentOpts.easingChange,\r\n                            step: _draw,\r\n                            complete: finish_resizing\r\n                        });\r\n                    }\r\n                });\r\n\r\n                return;\r\n            }\r\n\r\n            wrap.removeAttr(\"style\");\r\n\r\n            content.css('border-width', currentOpts.padding);\r\n\r\n            if (currentOpts.transitionIn == 'elastic') {\r\n                start_pos = _get_zoom_from();\r\n\r\n                content.html(tmp.contents());\r\n\r\n                wrap.show();\r\n\r\n                if (currentOpts.opacity) {\r\n                    final_pos.opacity = 0;\r\n                }\r\n\r\n                fx.prop = 0;\r\n\r\n                $(fx).animate({prop: 1}, {\r\n                    duration: currentOpts.speedIn,\r\n                    easing: currentOpts.easingIn,\r\n                    step: _draw,\r\n                    complete: _finish\r\n                });\r\n\r\n                return;\r\n            }\r\n\r\n            if (currentOpts.titlePosition == 'inside' && titleHeight > 0) {\r\n                title.show();\r\n            }\r\n\r\n            content\r\n                .css({\r\n                    'width': final_pos.width - currentOpts.padding * 2,\r\n                    'height': selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2\r\n                })\r\n                .html(tmp.contents());\r\n\r\n            wrap\r\n                .css(final_pos)\r\n                .fadeIn(currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish);\r\n        },\r\n\r\n        _format_title = function (title) {\r\n            if (title && title.length) {\r\n                if (currentOpts.titlePosition == 'float') {\r\n                    return '<table id=\"fancybox-title-float-wrap\" cellpadding=\"0\" cellspacing=\"0\"><tr><td id=\"fancybox-title-float-left\"></td><td id=\"fancybox-title-float-main\">' + title + '</td><td id=\"fancybox-title-float-right\"></td></tr></table>';\r\n                }\r\n\r\n                return '<div id=\"fancybox-title-' + currentOpts.titlePosition + '\">' + title + '</div>';\r\n            }\r\n\r\n            return false;\r\n        },\r\n\r\n        _process_title = function () {\r\n            titleStr = currentOpts.title || '';\r\n            titleHeight = 0;\r\n\r\n            title\r\n                .empty()\r\n                .removeAttr('style')\r\n                .removeClass();\r\n\r\n            if (currentOpts.titleShow === false) {\r\n                title.hide();\r\n                return;\r\n            }\r\n\r\n            titleStr = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(titleStr, currentArray, currentIndex, currentOpts) : _format_title(titleStr);\r\n\r\n            if (!titleStr || titleStr === '') {\r\n                title.hide();\r\n                return;\r\n            }\r\n\r\n            title\r\n                .addClass('fancybox-title-' + currentOpts.titlePosition)\r\n                .html(titleStr)\r\n                .appendTo('body')\r\n                .show();\r\n\r\n            switch (currentOpts.titlePosition) {\r\n                case 'inside':\r\n                    title\r\n                        .css({\r\n                            'width': final_pos.width - (currentOpts.padding * 2),\r\n                            'marginLeft': currentOpts.padding,\r\n                            'marginRight': currentOpts.padding\r\n                        });\r\n\r\n                    titleHeight = title.outerHeight(true);\r\n\r\n                    title.appendTo(outer);\r\n\r\n                    final_pos.height += titleHeight;\r\n                    break;\r\n\r\n                case 'over':\r\n                    title\r\n                        .css({\r\n                            'marginLeft': currentOpts.padding,\r\n                            'width': final_pos.width - (currentOpts.padding * 2),\r\n                            'bottom': currentOpts.padding\r\n                        })\r\n                        .appendTo(outer);\r\n                    break;\r\n\r\n                case 'float':\r\n                    title\r\n                        .css('left', parseInt((title.width() - final_pos.width - 40) / 2, 10) * -1)\r\n                        .appendTo(wrap);\r\n                    break;\r\n\r\n                default:\r\n                    title\r\n                        .css({\r\n                            'width': final_pos.width - (currentOpts.padding * 2),\r\n                            'paddingLeft': currentOpts.padding,\r\n                            'paddingRight': currentOpts.padding\r\n                        })\r\n                        .appendTo(wrap);\r\n                    break;\r\n            }\r\n\r\n            title.hide();\r\n        },\r\n\r\n        _set_navigation = function () {\r\n            if (currentOpts.enableEscapeButton || currentOpts.enableKeyboardNav) {\r\n                $(document).bind('keydown.fb', function (e) {\r\n                    if (e.keyCode == 27 && currentOpts.enableEscapeButton) {\r\n                        e.preventDefault();\r\n                        $.fancybox.close();\r\n\r\n                    } else if ((e.keyCode == 37 || e.keyCode == 39) && currentOpts.enableKeyboardNav && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA' && e.target.tagName !== 'SELECT') {\r\n                        e.preventDefault();\r\n                        $.fancybox[ e.keyCode == 37 ? 'prev' : 'next']();\r\n                    }\r\n                });\r\n            }\r\n\r\n            if (!currentOpts.showNavArrows) {\r\n                nav_left.hide();\r\n                nav_right.hide();\r\n                return;\r\n            }\r\n\r\n            if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) {\r\n                nav_left.show();\r\n            }\r\n\r\n            if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length - 1)) {\r\n                nav_right.show();\r\n            }\r\n        },\r\n\r\n        _finish = function () {\r\n            if (!$.support.opacity) {\r\n                content.get(0).style.removeAttribute('filter');\r\n                wrap.get(0).style.removeAttribute('filter');\r\n            }\r\n\r\n            if (selectedOpts.autoDimensions) {\r\n                content.css('height', 'auto');\r\n            }\r\n\r\n            wrap.css('height', 'auto');\r\n\r\n            if (titleStr && titleStr.length) {\r\n                title.show();\r\n            }\r\n\r\n            if (currentOpts.showCloseButton) {\r\n                close.show();\r\n            }\r\n\r\n            _set_navigation();\r\n\r\n            if (currentOpts.hideOnContentClick) {\r\n                content.bind('click', $.fancybox.close);\r\n            }\r\n\r\n            if (currentOpts.hideOnOverlayClick) {\r\n                overlay.bind('click', $.fancybox.close);\r\n            }\r\n\r\n            $(window).bind(\"resize.fb\", $.fancybox.resize);\r\n\r\n            if (currentOpts.centerOnScroll) {\r\n                $(window).bind(\"scroll.fb\", $.fancybox.center);\r\n            }\r\n\r\n            if (currentOpts.type == 'iframe') {\r\n                $('<iframe id=\"fancybox-frame\" name=\"fancybox-frame' + new Date().getTime() + '\" frameborder=\"0\" hspace=\"0\" ' + ($.browser.msie ? 'allowtransparency=\"true\"\"' : '') + ' scrolling=\"' + selectedOpts.scrolling + '\" src=\"' + currentOpts.href + '\"></iframe>').appendTo(content);\r\n            }\r\n\r\n            wrap.show();\r\n\r\n            busy = false;\r\n\r\n            $.fancybox.center();\r\n\r\n            currentOpts.onComplete(currentArray, currentIndex, currentOpts);\r\n\r\n            _preload_images();\r\n        },\r\n\r\n        _preload_images = function () {\r\n            var href,\r\n                objNext;\r\n\r\n            if ((currentArray.length - 1) > currentIndex) {\r\n                href = currentArray[ currentIndex + 1 ].href;\r\n\r\n                if (typeof href !== 'undefined' && href.match(imgRegExp)) {\r\n                    objNext = new Image();\r\n                    objNext.src = href;\r\n                }\r\n            }\r\n\r\n            if (currentIndex > 0) {\r\n                href = currentArray[ currentIndex - 1 ].href;\r\n\r\n                if (typeof href !== 'undefined' && href.match(imgRegExp)) {\r\n                    objNext = new Image();\r\n                    objNext.src = href;\r\n                }\r\n            }\r\n        },\r\n\r\n        _draw = function (pos) {\r\n            var dim = {\r\n                width: parseInt(start_pos.width + (final_pos.width - start_pos.width) * pos, 10),\r\n                height: parseInt(start_pos.height + (final_pos.height - start_pos.height) * pos, 10),\r\n\r\n                top: parseInt(start_pos.top + (final_pos.top - start_pos.top) * pos, 10),\r\n                left: parseInt(start_pos.left + (final_pos.left - start_pos.left) * pos, 10)\r\n            };\r\n\r\n            if (typeof final_pos.opacity !== 'undefined') {\r\n                dim.opacity = pos < 0.5 ? 0.5 : pos;\r\n            }\r\n\r\n            wrap.css(dim);\r\n\r\n            content.css({\r\n                'width': dim.width - currentOpts.padding * 2,\r\n                'height': dim.height - (titleHeight * pos) - currentOpts.padding * 2\r\n            });\r\n        },\r\n\r\n        _get_viewport = function () {\r\n            return [\r\n                    $(window).width() - (currentOpts.margin * 2),\r\n                    $(window).height() - (currentOpts.margin * 2),\r\n                    $(document).scrollLeft() + currentOpts.margin,\r\n                    $(document).scrollTop() + currentOpts.margin\r\n            ];\r\n        },\r\n\r\n        _get_zoom_to = function () {\r\n            var view = _get_viewport(),\r\n                to = {},\r\n                resize = currentOpts.autoScale,\r\n                double_padding = currentOpts.padding * 2,\r\n                ratio;\r\n\r\n            if (currentOpts.width.toString().indexOf('%') > -1) {\r\n                to.width = parseInt((view[0] * parseFloat(currentOpts.width)) / 100, 10);\r\n            } else {\r\n                to.width = currentOpts.width + double_padding;\r\n            }\r\n\r\n            if (currentOpts.height.toString().indexOf('%') > -1) {\r\n                to.height = parseInt((view[1] * parseFloat(currentOpts.height)) / 100, 10);\r\n            } else {\r\n                to.height = currentOpts.height + double_padding;\r\n            }\r\n\r\n            if (resize && (to.width > view[0] || to.height > view[1])) {\r\n                if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') {\r\n                    ratio = (currentOpts.width ) / (currentOpts.height );\r\n\r\n                    if ((to.width ) > view[0]) {\r\n                        to.width = view[0];\r\n                        to.height = parseInt(((to.width - double_padding) / ratio) + double_padding, 10);\r\n                    }\r\n\r\n                    if ((to.height) > view[1]) {\r\n                        to.height = view[1];\r\n                        to.width = parseInt(((to.height - double_padding) * ratio) + double_padding, 10);\r\n                    }\r\n\r\n                } else {\r\n                    to.width = Math.min(to.width, view[0]);\r\n                    to.height = Math.min(to.height, view[1]);\r\n                }\r\n            }\r\n\r\n            to.top = parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - to.height - 40) * 0.5)), 10);\r\n            to.left = parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - to.width - 40) * 0.5)), 10);\r\n\r\n            return to;\r\n        },\r\n\r\n        _get_obj_pos = function (obj) {\r\n            var pos = obj.offset();\r\n\r\n            pos.top += parseInt(obj.css('paddingTop'), 10) || 0;\r\n            pos.left += parseInt(obj.css('paddingLeft'), 10) || 0;\r\n\r\n            pos.top += parseInt(obj.css('border-top-width'), 10) || 0;\r\n            pos.left += parseInt(obj.css('border-left-width'), 10) || 0;\r\n\r\n            pos.width = obj.width();\r\n            pos.height = obj.height();\r\n\r\n            return pos;\r\n        },\r\n\r\n        _get_zoom_from = function () {\r\n            var orig = selectedOpts.orig ? $(selectedOpts.orig) : false,\r\n                from = {},\r\n                pos,\r\n                view;\r\n\r\n            if (orig && orig.length) {\r\n                pos = _get_obj_pos(orig);\r\n\r\n                from = {\r\n                    width: pos.width + (currentOpts.padding * 2),\r\n                    height: pos.height + (currentOpts.padding * 2),\r\n                    top: pos.top - currentOpts.padding - 20,\r\n                    left: pos.left - currentOpts.padding - 20\r\n                };\r\n\r\n            } else {\r\n                view = _get_viewport();\r\n\r\n                from = {\r\n                    width: currentOpts.padding * 2,\r\n                    height: currentOpts.padding * 2,\r\n                    top: parseInt(view[3] + view[1] * 0.5, 10),\r\n                    left: parseInt(view[2] + view[0] * 0.5, 10)\r\n                };\r\n            }\r\n\r\n            return from;\r\n        },\r\n\r\n        _animate_loading = function () {\r\n            if (!loading.is(':visible')) {\r\n                clearInterval(loadingTimer);\r\n                return;\r\n            }\r\n\r\n            $('div', loading).css('top', (loadingFrame * -40) + 'px');\r\n\r\n            loadingFrame = (loadingFrame + 1) % 12;\r\n        };\r\n\r\n    /*\r\n     * Public methods\r\n     */\r\n\r\n    $.fn.fancybox = function (options) {\r\n        if (!$(this).length) {\r\n            return this;\r\n        }\r\n\r\n        $(this)\r\n            .data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {})))\r\n            .unbind('click.fb')\r\n            .bind('click.fb', function (e) {\r\n                e.preventDefault();\r\n\r\n                if (busy) {\r\n                    return;\r\n                }\r\n\r\n                busy = true;\r\n\r\n                $(this).blur();\r\n\r\n                selectedArray = [];\r\n                selectedIndex = 0;\r\n\r\n                var rel = $(this).attr('rel') || '';\r\n\r\n                if (!rel || rel == '' || rel === 'nofollow') {\r\n                    selectedArray.push(this);\r\n\r\n                } else {\r\n                    selectedArray = $(\"a[rel=\" + rel + \"], area[rel=\" + rel + \"]\");\r\n                    selectedIndex = selectedArray.index(this);\r\n                }\r\n\r\n                _start();\r\n\r\n                return;\r\n            });\r\n\r\n        return this;\r\n    };\r\n\r\n    $.fancybox = function (obj) {\r\n        var opts;\r\n\r\n        if (busy) {\r\n            return;\r\n        }\r\n\r\n        busy = true;\r\n        opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {};\r\n\r\n        selectedArray = [];\r\n        selectedIndex = parseInt(opts.index, 10) || 0;\r\n\r\n        if ($.isArray(obj)) {\r\n            for (var i = 0, j = obj.length; i < j; i++) {\r\n                if (typeof obj[i] == 'object') {\r\n                    $(obj[i]).data('fancybox', $.extend({}, opts, obj[i]));\r\n                } else {\r\n                    obj[i] = $({}).data('fancybox', $.extend({content: obj[i]}, opts));\r\n                }\r\n            }\r\n\r\n            selectedArray = jQuery.merge(selectedArray, obj);\r\n\r\n        } else {\r\n            if (typeof obj == 'object') {\r\n                $(obj).data('fancybox', $.extend({}, opts, obj));\r\n            } else {\r\n                obj = $({}).data('fancybox', $.extend({content: obj}, opts));\r\n            }\r\n\r\n            selectedArray.push(obj);\r\n        }\r\n\r\n        if (selectedIndex > selectedArray.length || selectedIndex < 0) {\r\n            selectedIndex = 0;\r\n        }\r\n\r\n        _start();\r\n    };\r\n\r\n    $.fancybox.showActivity = function () {\r\n        clearInterval(loadingTimer);\r\n\r\n        loading.show();\r\n        loadingTimer = setInterval(_animate_loading, 66);\r\n    };\r\n\r\n    $.fancybox.hideActivity = function () {\r\n        loading.hide();\r\n    };\r\n\r\n    $.fancybox.next = function () {\r\n        return $.fancybox.pos(currentIndex + 1);\r\n    };\r\n\r\n    $.fancybox.prev = function () {\r\n        return $.fancybox.pos(currentIndex - 1);\r\n    };\r\n\r\n    $.fancybox.pos = function (pos) {\r\n        if (busy) {\r\n            return;\r\n        }\r\n\r\n        pos = parseInt(pos);\r\n\r\n        selectedArray = currentArray;\r\n\r\n        if (pos > -1 && pos < currentArray.length) {\r\n            selectedIndex = pos;\r\n            _start();\r\n\r\n        } else if (currentOpts.cyclic && currentArray.length > 1) {\r\n            selectedIndex = pos >= currentArray.length ? 0 : currentArray.length - 1;\r\n            _start();\r\n        }\r\n\r\n        return;\r\n    };\r\n\r\n    $.fancybox.cancel = function () {\r\n        if (busy) {\r\n            return;\r\n        }\r\n\r\n        busy = true;\r\n\r\n        $.event.trigger('fancybox-cancel');\r\n\r\n        _abort();\r\n\r\n        selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts);\r\n\r\n        busy = false;\r\n    };\r\n\r\n    // Note: within an iframe use - parent.$.fancybox.close();\r\n    $.fancybox.close = function () {\r\n        if (busy || wrap.is(':hidden')) {\r\n            return;\r\n        }\r\n\r\n        busy = true;\r\n\r\n        if (currentOpts && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) {\r\n            busy = false;\r\n            return;\r\n        }\r\n\r\n        _abort();\r\n\r\n        $(close.add(nav_left).add(nav_right)).hide();\r\n\r\n        $(content.add(overlay)).unbind();\r\n\r\n        $(window).unbind(\"resize.fb scroll.fb\");\r\n        $(document).unbind('keydown.fb');\r\n\r\n        content.find('iframe').attr('src', isIE6 && /^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank');\r\n\r\n        if (currentOpts.titlePosition !== 'inside') {\r\n            title.empty();\r\n        }\r\n\r\n        wrap.stop();\r\n\r\n        function _cleanup() {\r\n            overlay.fadeOut('fast');\r\n\r\n            title.empty().hide();\r\n            wrap.hide();\r\n\r\n            $.event.trigger('fancybox-cleanup');\r\n\r\n            content.empty();\r\n\r\n            currentOpts.onClosed(currentArray, currentIndex, currentOpts);\r\n\r\n            currentArray = selectedOpts = [];\r\n            currentIndex = selectedIndex = 0;\r\n            currentOpts = selectedOpts = {};\r\n\r\n            busy = false;\r\n        }\r\n\r\n        if (currentOpts.transitionOut == 'elastic') {\r\n            start_pos = _get_zoom_from();\r\n\r\n            var pos = wrap.position();\r\n\r\n            final_pos = {\r\n                top: pos.top,\r\n                left: pos.left,\r\n                width: wrap.width(),\r\n                height: wrap.height()\r\n            };\r\n\r\n            if (currentOpts.opacity) {\r\n                final_pos.opacity = 1;\r\n            }\r\n\r\n            title.empty().hide();\r\n\r\n            fx.prop = 1;\r\n\r\n            $(fx).animate({ prop: 0 }, {\r\n                duration: currentOpts.speedOut,\r\n                easing: currentOpts.easingOut,\r\n                step: _draw,\r\n                complete: _cleanup\r\n            });\r\n\r\n        } else {\r\n            wrap.fadeOut(currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup);\r\n        }\r\n    };\r\n\r\n    $.fancybox.resize = function () {\r\n        if (overlay.is(':visible')) {\r\n            overlay.css('height', $(document).height());\r\n        }\r\n\r\n        $.fancybox.center(true);\r\n    };\r\n\r\n    $.fancybox.center = function () {\r\n        var view, align;\r\n\r\n        if (busy) {\r\n            return;\r\n        }\r\n\r\n        align = arguments[0] === true ? 1 : 0;\r\n        view = _get_viewport();\r\n\r\n        if (!align && (wrap.width() > view[0] || wrap.height() > view[1])) {\r\n            return;\r\n        }\r\n\r\n        wrap\r\n            .stop()\r\n            .animate({\r\n                'top': parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - content.height() - 40) * 0.5) - currentOpts.padding)),\r\n                'left': parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - content.width() - 40) * 0.5) - currentOpts.padding))\r\n            }, typeof arguments[0] == 'number' ? arguments[0] : 200);\r\n    };\r\n\r\n    $.fancybox.init = function () {\r\n        if ($(\"#fancybox-wrap\").length) {\r\n            return;\r\n        }\r\n\r\n        $('body').append(\r\n            tmp = $('<div id=\"fancybox-tmp\"></div>'),\r\n            loading = $('<div id=\"fancybox-loading\"><div></div></div>'),\r\n            overlay = $('<div id=\"fancybox-overlay\"></div>'),\r\n            wrap = $('<div id=\"fancybox-wrap\"></div>')\r\n        );\r\n\r\n        outer = $('<div id=\"fancybox-outer\"></div>')\r\n            .append('<div class=\"fancybox-bg\" id=\"fancybox-bg-n\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-ne\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-e\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-se\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-s\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-sw\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-w\"></div><div class=\"fancybox-bg\" id=\"fancybox-bg-nw\"></div>')\r\n            .appendTo(wrap);\r\n\r\n        outer.append(\r\n            content = $('<div id=\"fancybox-content\"></div>'),\r\n            close = $('<a id=\"fancybox-close\"></a>'),\r\n            title = $('<div id=\"fancybox-title\"></div>'),\r\n\r\n            nav_left = $('<a href=\"javascript:;\" id=\"fancybox-left\"><span class=\"fancy-ico\" id=\"fancybox-left-ico\"></span></a>'),\r\n            nav_right = $('<a href=\"javascript:;\" id=\"fancybox-right\"><span class=\"fancy-ico\" id=\"fancybox-right-ico\"></span></a>')\r\n        );\r\n\r\n        close.click($.fancybox.close);\r\n        loading.click($.fancybox.cancel);\r\n\r\n        nav_left.click(function (e) {\r\n            e.preventDefault();\r\n            $.fancybox.prev();\r\n        });\r\n\r\n        nav_right.click(function (e) {\r\n            e.preventDefault();\r\n            $.fancybox.next();\r\n        });\r\n\r\n        if ($.fn.mousewheel) {\r\n            wrap.bind('mousewheel.fb', function (e, delta) {\r\n                if (busy) {\r\n                    e.preventDefault();\r\n\r\n                } else if ($(e.target).get(0).clientHeight == 0 || $(e.target).get(0).scrollHeight === $(e.target).get(0).clientHeight) {\r\n                    e.preventDefault();\r\n                    $.fancybox[ delta > 0 ? 'prev' : 'next']();\r\n                }\r\n            });\r\n        }\r\n\r\n        if (!$.support.opacity) {\r\n            wrap.addClass('fancybox-ie');\r\n        }\r\n\r\n        if (isIE6) {\r\n            loading.addClass('fancybox-ie6');\r\n            wrap.addClass('fancybox-ie6');\r\n\r\n            $('<iframe id=\"fancybox-hide-sel-frame\" src=\"' + (/^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank' ) + '\" scrolling=\"no\" border=\"0\" frameborder=\"0\" tabindex=\"-1\"></iframe>').prependTo(outer);\r\n        }\r\n    };\r\n\r\n    $.fn.fancybox.defaults = {\r\n        padding: 10,\r\n        margin: 40,\r\n        opacity: false,\r\n        modal: false,\r\n        cyclic: false,\r\n        scrolling: 'auto',\t// 'auto', 'yes' or 'no'\r\n\r\n        width: 560,\r\n        height: 340,\r\n\r\n        autoScale: true,\r\n        autoDimensions: true,\r\n        centerOnScroll: false,\r\n\r\n        ajax: {},\r\n        swf: { wmode: 'transparent' },\r\n\r\n        hideOnOverlayClick: true,\r\n        hideOnContentClick: false,\r\n\r\n        overlayShow: true,\r\n        overlayOpacity: 0.7,\r\n        overlayColor: '#777',\r\n\r\n        titleShow: true,\r\n        titlePosition: 'float', // 'float', 'outside', 'inside' or 'over'\r\n        titleFormat: null,\r\n        titleFromAlt: false,\r\n\r\n        transitionIn: 'fade', // 'elastic', 'fade' or 'none'\r\n        transitionOut: 'fade', // 'elastic', 'fade' or 'none'\r\n\r\n        speedIn: 300,\r\n        speedOut: 300,\r\n\r\n        changeSpeed: 300,\r\n        changeFade: 'fast',\r\n\r\n        easingIn: 'swing',\r\n        easingOut: 'swing',\r\n\r\n        showCloseButton: true,\r\n        showNavArrows: true,\r\n        enableEscapeButton: true,\r\n        enableKeyboardNav: true,\r\n\r\n        onStart: function () {\r\n        },\r\n        onCancel: function () {\r\n        },\r\n        onComplete: function () {\r\n        },\r\n        onCleanup: function () {\r\n        },\r\n        onClosed: function () {\r\n        },\r\n        onError: function () {\r\n        }\r\n    };\r\n\r\n    $(document).ready(function () {\r\n        $.fancybox.init();\r\n    });\r\n\r\n})(jQuery);", "// Simple Set Clipboard System\n// Author: Joseph Huckaby\n\nvar ZeroClipboard = {\n\n    version:\"1.0.7\",\n    clients:{}, // registered upload clients on page, indexed by id\n    moviePath:function () {\n        if (!document.location.port) {\n            return 'https://s.smore.com/images/ZeroClipboard.c9e9473b.swf';\n        }\n        return '/images/ZeroClipboard.swf';\n    }(), // URL to movie\n    nextId:1, // ID of next movie\n\n    $:function (thingy) {\n        // simple DOM lookup utility function\n        if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);\n        if (!thingy.addClass) {\n            // extend element with a few useful methods\n            thingy.hide = function () {\n                this.style.display = 'none';\n            };\n            thingy.show = function () {\n                this.style.display = '';\n            };\n            thingy.addClass = function (name) {\n                this.removeClass(name);\n                this.className += ' ' + name;\n            };\n            thingy.removeClass = function (name) {\n                var classes = this.className.split(/\\s+/);\n                var idx = -1;\n                for (var k = 0; k < classes.length; k++) {\n                    if (classes[k] == name) {\n                        idx = k;\n                        k = classes.length;\n                    }\n                }\n                if (idx > -1) {\n                    classes.splice(idx, 1);\n                    this.className = classes.join(' ');\n                }\n                return this;\n            };\n            thingy.hasClass = function (name) {\n                return !!this.className.match(new RegExp(\"\\\\s*\" + name + \"\\\\s*\"));\n            };\n        }\n        return thingy;\n    },\n\n    setMoviePath:function (path) {\n        // set path to ZeroClipboard.swf\n        this.moviePath = path;\n    },\n\n    dispatch:function (id, eventName, args) {\n        // receive event from flash movie, send to client\n        var client = this.clients[id];\n        if (client) {\n            client.receiveEvent(eventName, args);\n        }\n    },\n\n    register:function (id, client) {\n        // register new client to receive events\n        this.clients[id] = client;\n    },\n\n    getDOMObjectPosition:function (obj, stopObj) {\n        // get absolute coordinates for dom element\n        var info = {\n            left:0,\n            top:0,\n            width:obj.width ? obj.width : obj.offsetWidth,\n            height:obj.height ? obj.height : obj.offsetHeight\n        };\n\n        while (obj && (obj != stopObj)) {\n            info.left += obj.offsetLeft;\n            info.top += obj.offsetTop;\n            obj = obj.offsetParent;\n        }\n\n        return info;\n    },\n\n    Client:function (elem) {\n        // constructor for new simple upload client\n        this.handlers = {};\n\n        // unique ID\n        this.id = ZeroClipboard.nextId++;\n        this.movieId = 'ZeroClipboardMovie_' + this.id;\n\n        // register client with singleton to receive flash events\n        ZeroClipboard.register(this.id, this);\n\n        // create movie\n        if (elem) this.glue(elem);\n    }\n};\n\nZeroClipboard.Client.prototype = {\n\n    id:0, // unique ID for us\n    ready:false, // whether movie is ready to receive events or not\n    movie:null, // reference to movie object\n    clipText:'', // text to copy to clipboard\n    handCursorEnabled:true, // whether to show hand cursor, or default pointer cursor\n    cssEffects:true, // enable CSS mouse effects on dom container\n    handlers:null, // user event handlers\n\n    glue:function (elem, appendElem, stylesToAdd) {\n        // glue to DOM element\n        // elem can be ID or actual DOM element object\n        this.domElement = ZeroClipboard.$(elem);\n\n        // float just above object, or zIndex 99 if dom element isn't set\n        var zIndex = 99;\n        if (this.domElement.style.zIndex) {\n            zIndex = parseInt(this.domElement.style.zIndex, 10) + 1;\n        }\n\n        if (typeof(appendElem) == 'string') {\n            appendElem = ZeroClipboard.$(appendElem);\n        }\n        else if (typeof(appendElem) == 'undefined') {\n            appendElem = document.getElementsByTagName('body')[0];\n        }\n\n        // find X/Y position of domElement\n        var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem);\n\n        // create floating DIV above element\n        this.div = document.createElement('div');\n        var style = this.div.style;\n        style.position = 'absolute';\n        style.left = '' + box.left + 'px';\n        style.top = '' + box.top + 'px';\n        style.width = '' + box.width + 'px';\n        style.height = '' + box.height + 'px';\n        style.zIndex = zIndex;\n\n        if (typeof(stylesToAdd) == 'object') {\n            for (addedStyle in stylesToAdd) {\n                style[addedStyle] = stylesToAdd[addedStyle];\n            }\n        }\n\n        // style.backgroundColor = '#f00'; // debug\n\n        appendElem.appendChild(this.div);\n\n        this.div.innerHTML = this.getHTML(box.width, box.height);\n    },\n\n    getHTML:function (width, height) {\n        // return HTML for movie\n        var html = '';\n        var flashvars = 'id=' + this.id +\n            '&width=' + width +\n            '&height=' + height;\n\n        if (navigator.userAgent.match(/MSIE/)) {\n            // IE gets an OBJECT tag\n            var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';\n            html += '<object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"' + protocol + 'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0\" width=\"' + width + '\" height=\"' + height + '\" id=\"' + this.movieId + '\" align=\"top\"><param name=\"allowScriptAccess\" value=\"always\" /><param name=\"allowFullScreen\" value=\"false\" /><param name=\"movie\" value=\"' + ZeroClipboard.moviePath + '\" /><param name=\"loop\" value=\"false\" /><param name=\"menu\" value=\"false\" /><param name=\"quality\" value=\"best\" /><param name=\"bgcolor\" value=\"#ffffff\" /><param name=\"flashvars\" value=\"' + flashvars + '\"/><param name=\"wmode\" value=\"transparent\"/></object>';\n        }\n        else {\n            // all other browsers get an EMBED tag\n            html += '<embed id=\"' + this.movieId + '\" src=\"' + ZeroClipboard.moviePath + '\" loop=\"false\" menu=\"false\" quality=\"best\" bgcolor=\"#ffffff\" width=\"' + width + '\" height=\"' + height + '\" name=\"' + this.movieId + '\" align=\"top\" allowScriptAccess=\"always\" allowFullScreen=\"false\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" flashvars=\"' + flashvars + '\" wmode=\"transparent\" />';\n        }\n        return html;\n    },\n\n    hide:function () {\n        // temporarily hide floater offscreen\n        if (this.div) {\n            this.div.style.left = '-2000px';\n        }\n    },\n\n    show:function () {\n        // show ourselves after a call to hide()\n        this.reposition();\n    },\n\n    destroy:function () {\n        // destroy control and floater\n        if (this.domElement && this.div) {\n            this.hide();\n            this.div.innerHTML = '';\n\n            var body = document.getElementsByTagName('body')[0];\n            try {\n                body.removeChild(this.div);\n            } catch (e) {\n                ;\n            }\n\n            this.domElement = null;\n            this.div = null;\n        }\n    },\n\n    reposition:function (elem) {\n        // reposition our floating div, optionally to new container\n        // warning: container CANNOT change size, only position\n        if (elem) {\n            this.domElement = ZeroClipboard.$(elem);\n            if (!this.domElement) this.hide();\n        }\n\n        if (this.domElement && this.div) {\n            var box = ZeroClipboard.getDOMObjectPosition(this.domElement);\n            var style = this.div.style;\n            style.left = '' + box.left + 'px';\n            style.top = '' + box.top + 'px';\n        }\n    },\n\n    setText:function (newText) {\n        // set text to be copied to clipboard\n        this.clipText = newText;\n        if (this.ready) this.movie.setText(newText);\n    },\n\n    addEventListener:function (eventName, func) {\n        // add user event listener for event\n        // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel\n        eventName = eventName.toString().toLowerCase().replace(/^on/, '');\n        if (!this.handlers[eventName]) this.handlers[eventName] = [];\n        this.handlers[eventName].push(func);\n    },\n\n    setHandCursor:function (enabled) {\n        // enable hand cursor (true), or default arrow cursor (false)\n        this.handCursorEnabled = enabled;\n        if (this.ready) this.movie.setHandCursor(enabled);\n    },\n\n    setCSSEffects:function (enabled) {\n        // enable or disable CSS effects on DOM container\n        this.cssEffects = !!enabled;\n    },\n\n    receiveEvent:function (eventName, args) {\n        // receive event from flash\n        eventName = eventName.toString().toLowerCase().replace(/^on/, '');\n\n        // special behavior for certain events\n        switch (eventName) {\n            case 'load':\n                // movie claims it is ready, but in IE this isn't always the case...\n                // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function\n                this.movie = document.getElementById(this.movieId);\n                if (!this.movie) {\n                    var self = this;\n                    setTimeout(function () {\n                        self.receiveEvent('load', null);\n                    }, 1);\n                    return;\n                }\n\n                // firefox on pc needs a \"kick\" in order to set these in certain cases\n                if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {\n                    var self = this;\n                    setTimeout(function () {\n                        self.receiveEvent('load', null);\n                    }, 100);\n                    this.ready = true;\n                    return;\n                }\n\n                this.ready = true;\n                this.movie.setText(this.clipText);\n                this.movie.setHandCursor(this.handCursorEnabled);\n                break;\n\n            case 'mouseover':\n                if (this.domElement && this.cssEffects) {\n                    this.domElement.addClass('hover');\n                    if (this.recoverActive) this.domElement.addClass('active');\n                }\n                break;\n\n            case 'mouseout':\n                if (this.domElement && this.cssEffects) {\n                    this.recoverActive = false;\n                    if (this.domElement.hasClass('active')) {\n                        this.domElement.removeClass('active');\n                        this.recoverActive = true;\n                    }\n                    this.domElement.removeClass('hover');\n                }\n                break;\n\n            case 'mousedown':\n                if (this.domElement && this.cssEffects) {\n                    this.domElement.addClass('active');\n                }\n                break;\n\n            case 'mouseup':\n                if (this.domElement && this.cssEffects) {\n                    this.domElement.removeClass('active');\n                    this.recoverActive = false;\n                }\n                break;\n        } // switch eventName\n\n        if (this.handlers[eventName]) {\n            for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {\n                var func = this.handlers[eventName][idx];\n\n                if (typeof(func) === 'function') {\n                    // actual function reference\n                    func(this, args);\n                }\n                else if ((typeof(func) === 'object') && (func.length == 2)) {\n                    // PHP style object + method, i.e. [myObject, 'myMethod']\n                    func[0][ func[1] ](this, args);\n                }\n                else if (typeof(func) === 'string') {\n                    // name of function\n                    window[func](this, args);\n                }\n            } // foreach event handler defined\n        } // user defined handler for event\n    }\n\n};\n", "(function ($) {\r\n    /***\r\n     * Autofit jQuery plugin\r\n     * =====================\r\n     *\r\n     *\r\n     *\r\n     *\r\n     */\r\n\r\n\r\n\r\n    // set the maximum size to 160%;\r\n    var MAX_RATIO = 1.6;\r\n\r\n    // The absolute minimum font size we're will to resize to.\r\n    var MINIMUM_FONT_SIZE_IN_PX = 20;\r\n\r\n    /***\r\n     * Count the number of lines in spans using getClientRects()\r\n     *\r\n     *\r\n     * @param {Element} span\r\n     * @returns {number}\r\n     */\r\n    function countLines(span) {\r\n        // Get the rects\r\n        var rects = span.getClientRects();\r\n\r\n        var total = 0;\r\n        var lastTop = -1;\r\n\r\n        // Go over them and count the rects that are on different tops\r\n        for (var i = 0; i < rects.length; i++) {\r\n            var r = rects[i];\r\n\r\n            if (lastTop !== r.top) {\r\n                lastTop = r.top;\r\n                total += 1;\r\n            }\r\n        }\r\n\r\n        return total;\r\n    }\r\n\r\n    /**\r\n     * Convert '100px' to 100\r\n     *\r\n     * @param {string} str\r\n     * @returns {number}\r\n     */\r\n    function pxToInt(str) {\r\n        if (!str) {\r\n            return 0;\r\n        }\r\n        return Math.round(Number(str.replace('px', '')));\r\n    }\r\n\r\n    /***\r\n     * Get the font size in px of the given span\r\n     *\r\n     * Optionally, clear the font size value and use the inherited value\r\n     *\r\n     *\r\n     * @param {HTMLElement} span\r\n     * @param {Boolean=} clear\r\n     *\r\n     * @returns {number}\r\n     */\r\n    function fontSize(span, clear) {\r\n        if (clear) {\r\n            span.style.fontSize = '';\r\n        }\r\n        return pxToInt(getComputedStyle(span).fontSize);\r\n    }\r\n\r\n    /***\r\n     * Set the font size in px for span\r\n     * @param {HTMLElement} span\r\n     * @param {Number} size\r\n     */\r\n    function setFontSize(span, size) {\r\n        span.style.fontSize = String(size) + 'px';\r\n    }\r\n\r\n    /***\r\n     * Print debug messages\r\n     * @param {*...} items\r\n     * @private\r\n     */\r\n    function _debug(items) {\r\n\r\n        //console.log.apply(console, arguments);\r\n    }\r\n\r\n    /***\r\n     * The actual auto fit loop.\r\n     *\r\n     *\r\n     **/\r\n    function internalAutoFit(span, maxSize, minSize, maxLines) {\r\n\r\n        var curFontSize = maxSize;\r\n        setFontSize(span, maxSize);\r\n        var curLines = countLines(span);\r\n\r\n        while (curLines > maxLines && curFontSize > minSize) {\r\n            curFontSize = guessNextFontSize(curLines, maxLines, curFontSize, minSize);\r\n            setFontSize(span, curFontSize);\r\n            curLines = countLines(span);\r\n        }\r\n\r\n        return curFontSize;\r\n    }\r\n\r\n\r\n    /***\r\n     * Perform the autofit for span\r\n     * @param {HTMLElement} span\r\n     * @param {Number} maxFontSize      Maximum font size (in px)\r\n     * @param {Number} minFontSize      Minimum font size (in px)\r\n     * @param {Number} maxLines         The maximum amount of lines to wrap\r\n     * @param {String} priority         The sizing priority. can be `size` or `lines`.\r\n     *\r\n     *\r\n     * TODO: Explain the difference between priorities\r\n     *\r\n     * @returns {Number} The final font size (in px)\r\n     */\r\n    function doAutoFit(span, maxFontSize, minFontSize, maxLines, priority) {\r\n        _debug(\"Starting autofit: \", span, ' max: ', maxFontSize, ' min: ', minFontSize, ' maxLines: ', maxLines);\r\n\r\n        // Start by setting the font size to maximum\r\n        setFontSize(span, maxFontSize);\r\n        var curLines = countLines(span);\r\n\r\n        // Step 1, do we even need to AF?\r\n        // We only use this optimization in case we have a single line - We want to optimize for minimum lines,\r\n        // not bigger fonts\r\n        if (curLines <= maxLines && curLines === 1) {\r\n            _debug(\"Skipping autofit\");\r\n\r\n            return maxFontSize;\r\n        }\r\n\r\n        // Guess the next font size\r\n        var nextFontSize = guessNextFontSize(curLines, maxLines, maxFontSize, minFontSize);\r\n\r\n        // Step 2, how many lines do we have using the minimum size\r\n        setFontSize(span, minFontSize);\r\n        var minLinesCount = countLines(span);\r\n        if (minLinesCount > maxLines) {\r\n            // If we're using `size` priority we care about the minimum size more than the actual length of the lines\r\n            if (priority === 'size') {\r\n                _debug(\"Going with min size\");\r\n                return minFontSize;\r\n            }\r\n\r\n            // Else: We don't care about the minimum size as we're using priority lines.\r\n            // We will resize the text until it hits our absolute minimum\r\n            return internalAutoFit(span, nextFontSize, MINIMUM_FONT_SIZE_IN_PX, maxLines);\r\n        }\r\n\r\n        // Else: Resize normally, until we hit the minimum lines count.\r\n        // We pass the min line count, as a minimum, because we want to optimize for shorter lines,\r\n        // instead of bigger text\r\n        return internalAutoFit(span, nextFontSize, minFontSize, minLinesCount);\r\n    }\r\n\r\n    /***\r\n     * A shorthand for getting data attribute values\r\n     *\r\n     * @param {HTMLElement} span\r\n     * @param {string} name\r\n     * @param {*=} defaultValue\r\n     * @returns {string|*}\r\n     */\r\n    function dataAttribute(span, name, defaultValue) {\r\n        return span.getAttribute('data-' + name) || defaultValue;\r\n    }\r\n\r\n    /***\r\n     * Get and calculate special sizes\r\n     *\r\n     *\r\n     *\r\n     * @param {HTMLElement} span\r\n     * @param {number} baseSize\r\n     * @param {string} attributeName\r\n     * @param {*=} defaultValue\r\n     * @returns {number}\r\n     */\r\n    function getSpecialSize(span, baseSize, attributeName, defaultValue) {\r\n\r\n        var size = dataAttribute(span, attributeName, defaultValue);\r\n\r\n        if (typeof size !== \"string\") {\r\n            return size;\r\n        }\r\n\r\n        // Check if the size string starts with '-=' or '+='\r\n        if (size.substr(0, 2) in {'+=': 1, '-=': 1}) {\r\n            var sign = size[1];\r\n\r\n            // Extract the rest of the number\r\n            size = parseInt(size.substr(2), 10);\r\n\r\n            return sign === '-' ? baseSize - size : baseSize + size;\r\n        }\r\n\r\n        // normal number\r\n        return parseInt(size, 10);\r\n    }\r\n\r\n\r\n    /**\r\n     * Perform autofit for span, return information\r\n     *\r\n     * @param {HTMLElement} span\r\n     * @returns {{baseFontSize: number,\r\n     *            finalSize: number,\r\n     *            maxLines: number,\r\n     *            minFontSize: number,\r\n     *            maxFontSize: number,\r\n     *            ratio: number}}\r\n     */\r\n    function autoFitSpan(span) {\r\n\r\n        var baseFontSize = fontSize(span, /*clear*/ true);\r\n\r\n        // Number of lines allowed\r\n        var maxLines = Number(dataAttribute(span, 'lines', 3));\r\n        var maxFontSize = getSpecialSize(span, baseFontSize, 'max', '+=0');\r\n        var minFontSize = getSpecialSize(span, baseFontSize, 'min', baseFontSize);\r\n        var priority = dataAttribute(span, 'priority', 'size');\r\n\r\n        // Turn off RTL\r\n        disableRTL(span, true);\r\n\r\n        // Perform autofit\r\n        var result = doAutoFit(span, maxFontSize, minFontSize, maxLines, priority);\r\n\r\n        // Normalize the font size\r\n        result = Math.max(result, MINIMUM_FONT_SIZE_IN_PX);\r\n\r\n        // Turn RTL back on\r\n        disableRTL(span, false);\r\n\r\n        return {\r\n            baseFontSize: baseFontSize,\r\n            finalSize: result,\r\n            maxLines: maxLines,\r\n            minFontSize: minFontSize,\r\n            maxFontSize: maxFontSize,\r\n            ratio: normalizeRatio(result / baseFontSize)\r\n        };\r\n    }\r\n\r\n    /***\r\n     * Make sure our final ratio is between MIN_RATIO and MAX_RATIO\r\n     * @param {Number} ratio\r\n     * @returns {Number} the normalized ratio\r\n     */\r\n    function normalizeRatio(ratio) {\r\n        return Math.min(ratio, MAX_RATIO);\r\n    }\r\n\r\n    /***\r\n     * Guess the next font size to use\r\n     *\r\n     * @param {number} curLines         The number of lines we counted\r\n     * @param {number} maxLines         The maximum lines allowed\r\n     * @param {number} curFontSize      The current font size in px\r\n     * @param {number} minSize          The minimum font size to use\r\n     * @returns {number}\r\n     */\r\n    function guessNextFontSize(curLines, maxLines, curFontSize, minSize) {\r\n        if (curLines > (maxLines * 3)) {\r\n            return Math.max(curFontSize / 2, minSize);\r\n        }\r\n\r\n        return curFontSize - 2;\r\n    }\r\n\r\n\r\n    /***\r\n     * Toggles the RTL span to on and off\r\n     * @param span\r\n     * @param isDisabled\r\n     */\r\n    function disableRTL(span, isDisabled) {\r\n        if (isDisabled) {\r\n            span.className += 'disable-rtl';\r\n        } else {\r\n            span.className = span.className.replace('disable-rtl', '');\r\n        }\r\n    }\r\n\r\n\r\n    /****\r\n     * Applies autofit to elements\r\n     * extracts the data-max-lines and data-max-size and uses them\r\n     */\r\n    $.fn.autofit = function () {\r\n        $.each(this, function () {\r\n            var el = $(this);\r\n            var done = el.data('autofit-done');\r\n            // Don't autofit default values\r\n            if (!done ) {\r\n                var result = autoFitSpan(el[0]);\r\n                el.data('ratio', result.ratio);\r\n            }\r\n        });\r\n\r\n        return $.when();\r\n    };\r\n\r\n})\r\n    (jQuery);", "// Generated by CoffeeScript 1.6.2\r\n/*\r\njQuery Waypoints - v2.0.2\r\nCopyright (c) 2011-2013 Caleb Troughton\r\nDual licensed under the MIT license and GPL license.\r\nhttps://github.com/imakewebthings/jquery-waypoints/blob/master/licenses.txt\r\n*/\r\n(function(){var t=[].indexOf||function(t){for(var e=0,n=this.length;e<n;e++){if(e in this&&this[e]===t)return e}return-1},e=[].slice;(function(t,e){if(typeof define===\"function\"&&define.amd){return define(\"waypoints\",[\"jquery\"],function(n){return e(n,t)})}else{return e(t.jQuery,t)}})(this,function(n,r){var i,o,l,s,f,u,a,c,h,d,p,y,v,w,g,m;i=n(r);c=t.call(r,\"ontouchstart\")>=0;s={horizontal:{},vertical:{}};f=1;a={};u=\"waypoints-context-id\";p=\"resize.waypoints\";y=\"scroll.waypoints\";v=1;w=\"waypoints-waypoint-ids\";g=\"waypoint\";m=\"waypoints\";o=function(){function t(t){var e=this;this.$element=t;this.element=t[0];this.didResize=false;this.didScroll=false;this.id=\"context\"+f++;this.oldScroll={x:t.scrollLeft(),y:t.scrollTop()};this.waypoints={horizontal:{},vertical:{}};t.data(u,this.id);a[this.id]=this;t.bind(y,function(){var t;if(!(e.didScroll||c)){e.didScroll=true;t=function(){e.doScroll();return e.didScroll=false};return r.setTimeout(t,n[m].settings.scrollThrottle)}});t.bind(p,function(){var t;if(!e.didResize){e.didResize=true;t=function(){n[m](\"refresh\");return e.didResize=false};return r.setTimeout(t,n[m].settings.resizeThrottle)}})}t.prototype.doScroll=function(){var t,e=this;t={horizontal:{newScroll:this.$element.scrollLeft(),oldScroll:this.oldScroll.x,forward:\"right\",backward:\"left\"},vertical:{newScroll:this.$element.scrollTop(),oldScroll:this.oldScroll.y,forward:\"down\",backward:\"up\"}};if(c&&(!t.vertical.oldScroll||!t.vertical.newScroll)){n[m](\"refresh\")}n.each(t,function(t,r){var i,o,l;l=[];o=r.newScroll>r.oldScroll;i=o?r.forward:r.backward;n.each(e.waypoints[t],function(t,e){var n,i;if(r.oldScroll<(n=e.offset)&&n<=r.newScroll){return l.push(e)}else if(r.newScroll<(i=e.offset)&&i<=r.oldScroll){return l.push(e)}});l.sort(function(t,e){return t.offset-e.offset});if(!o){l.reverse()}return n.each(l,function(t,e){if(e.options.continuous||t===l.length-1){return e.trigger([i])}})});return this.oldScroll={x:t.horizontal.newScroll,y:t.vertical.newScroll}};t.prototype.refresh=function(){var t,e,r,i=this;r=n.isWindow(this.element);e=this.$element.offset();this.doScroll();t={horizontal:{contextOffset:r?0:e.left,contextScroll:r?0:this.oldScroll.x,contextDimension:this.$element.width(),oldScroll:this.oldScroll.x,forward:\"right\",backward:\"left\",offsetProp:\"left\"},vertical:{contextOffset:r?0:e.top,contextScroll:r?0:this.oldScroll.y,contextDimension:r?n[m](\"viewportHeight\"):this.$element.height(),oldScroll:this.oldScroll.y,forward:\"down\",backward:\"up\",offsetProp:\"top\"}};return n.each(t,function(t,e){return n.each(i.waypoints[t],function(t,r){var i,o,l,s,f;i=r.options.offset;l=r.offset;o=n.isWindow(r.element)?0:r.$element.offset()[e.offsetProp];if(n.isFunction(i)){i=i.apply(r.element)}else if(typeof i===\"string\"){i=parseFloat(i);if(r.options.offset.indexOf(\"%\")>-1){i=Math.ceil(e.contextDimension*i/100)}}r.offset=o-e.contextOffset+e.contextScroll-i;if(r.options.onlyOnScroll&&l!=null||!r.enabled){return}if(l!==null&&l<(s=e.oldScroll)&&s<=r.offset){return r.trigger([e.backward])}else if(l!==null&&l>(f=e.oldScroll)&&f>=r.offset){return r.trigger([e.forward])}else if(l===null&&e.oldScroll>=r.offset){return r.trigger([e.forward])}})})};t.prototype.checkEmpty=function(){if(n.isEmptyObject(this.waypoints.horizontal)&&n.isEmptyObject(this.waypoints.vertical)){this.$element.unbind([p,y].join(\" \"));return delete a[this.id]}};return t}();l=function(){function t(t,e,r){var i,o;r=n.extend({},n.fn[g].defaults,r);if(r.offset===\"bottom-in-view\"){r.offset=function(){var t;t=n[m](\"viewportHeight\");if(!n.isWindow(e.element)){t=e.$element.height()}return t-n(this).outerHeight()}}this.$element=t;this.element=t[0];this.axis=r.horizontal?\"horizontal\":\"vertical\";this.callback=r.handler;this.context=e;this.enabled=r.enabled;this.id=\"waypoints\"+v++;this.offset=null;this.options=r;e.waypoints[this.axis][this.id]=this;s[this.axis][this.id]=this;i=(o=t.data(w))!=null?o:[];i.push(this.id);t.data(w,i)}t.prototype.trigger=function(t){if(!this.enabled){return}if(this.callback!=null){this.callback.apply(this.element,t)}if(this.options.triggerOnce){return this.destroy()}};t.prototype.disable=function(){return this.enabled=false};t.prototype.enable=function(){this.context.refresh();return this.enabled=true};t.prototype.destroy=function(){delete s[this.axis][this.id];delete this.context.waypoints[this.axis][this.id];return this.context.checkEmpty()};t.getWaypointsByElement=function(t){var e,r;r=n(t).data(w);if(!r){return[]}e=n.extend({},s.horizontal,s.vertical);return n.map(r,function(t){return e[t]})};return t}();d={init:function(t,e){var r;if(e==null){e={}}if((r=e.handler)==null){e.handler=t}this.each(function(){var t,r,i,s;t=n(this);i=(s=e.context)!=null?s:n.fn[g].defaults.context;if(!n.isWindow(i)){i=t.closest(i)}i=n(i);r=a[i.data(u)];if(!r){r=new o(i)}return new l(t,r,e)});n[m](\"refresh\");return this},disable:function(){return d._invoke(this,\"disable\")},enable:function(){return d._invoke(this,\"enable\")},destroy:function(){return d._invoke(this,\"destroy\")},prev:function(t,e){return d._traverse.call(this,t,e,function(t,e,n){if(e>0){return t.push(n[e-1])}})},next:function(t,e){return d._traverse.call(this,t,e,function(t,e,n){if(e<n.length-1){return t.push(n[e+1])}})},_traverse:function(t,e,i){var o,l;if(t==null){t=\"vertical\"}if(e==null){e=r}l=h.aggregate(e);o=[];this.each(function(){var e;e=n.inArray(this,l[t]);return i(o,e,l[t])});return this.pushStack(o)},_invoke:function(t,e){t.each(function(){var t;t=l.getWaypointsByElement(this);return n.each(t,function(t,n){n[e]();return true})});return this}};n.fn[g]=function(){var t,r;r=arguments[0],t=2<=arguments.length?e.call(arguments,1):[];if(d[r]){return d[r].apply(this,t)}else if(n.isFunction(r)){return d.init.apply(this,arguments)}else if(n.isPlainObject(r)){return d.init.apply(this,[null,r])}else if(!r){return n.error(\"jQuery Waypoints needs a callback function or handler option.\")}else{return n.error(\"The \"+r+\" method does not exist in jQuery Waypoints.\")}};n.fn[g].defaults={context:r,continuous:true,enabled:true,horizontal:false,offset:0,triggerOnce:false};h={refresh:function(){return n.each(a,function(t,e){return e.refresh()})},viewportHeight:function(){var t;return(t=r.innerHeight)!=null?t:i.height()},aggregate:function(t){var e,r,i;e=s;if(t){e=(i=a[n(t).data(u)])!=null?i.waypoints:void 0}if(!e){return[]}r={horizontal:[],vertical:[]};n.each(r,function(t,i){n.each(e[t],function(t,e){return i.push(e)});i.sort(function(t,e){return t.offset-e.offset});r[t]=n.map(i,function(t){return t.element});return r[t]=n.unique(r[t])});return r},above:function(t){if(t==null){t=r}return h._filter(t,\"vertical\",function(t,e){return e.offset<=t.oldScroll.y})},below:function(t){if(t==null){t=r}return h._filter(t,\"vertical\",function(t,e){return e.offset>t.oldScroll.y})},left:function(t){if(t==null){t=r}return h._filter(t,\"horizontal\",function(t,e){return e.offset<=t.oldScroll.x})},right:function(t){if(t==null){t=r}return h._filter(t,\"horizontal\",function(t,e){return e.offset>t.oldScroll.x})},enable:function(){return h._invoke(\"enable\")},disable:function(){return h._invoke(\"disable\")},destroy:function(){return h._invoke(\"destroy\")},extendFn:function(t,e){return d[t]=e},_invoke:function(t){var e;e=n.extend({},s.vertical,s.horizontal);return n.each(e,function(e,n){n[t]();return true})},_filter:function(t,e,r){var i,o;i=a[n(t).data(u)];if(!i){return[]}o=[];n.each(i.waypoints[e],function(t,e){if(r(i,e)){return o.push(e)}});o.sort(function(t,e){return t.offset-e.offset});return n.map(o,function(t){return t.element})}};n[m]=function(){var t,n;n=arguments[0],t=2<=arguments.length?e.call(arguments,1):[];if(h[n]){return h[n].apply(null,t)}else{return h.aggregate.call(null,n)}};n[m].settings={resizeThrottle:100,scrollThrottle:30};return i.load(function(){return n[m](\"refresh\")})})}).call(this);\r\n\r\n\r\ndefine('lib/waypoints', function(){return $.waypoints})", "/****\r\n *  @fileOverview Handles all the pictures/galleries lightboxes,\r\n *                fires events when the pictures are shown\r\n *\r\n *  Events:\r\n *      widgets:gallery:picture\r\n *      widgets:text-bio:picture\r\n *      widgets:picture:picture\r\n *      widgets:text-paragraph:picture\r\n *\r\n *  Event data:\r\n *  {\r\n *      widget_id: string (the widget id)\r\n *      href: string (the url for the image\r\n *      title: string the title of the image\r\n *  }\r\n */\r\ndefine('show/widgets/pictures', function (require) {\r\n    var hub = require('fire/util/hub');\r\n\r\n\r\n    function setup() {\r\n        /**** Setup galleries  ****/\r\n\r\n        addMagnify($('.fancy-pic').fancybox({\r\n            titlePosition: 'inside',\r\n            titleFormat: titleFormat,\r\n            onComplete: onComplete\r\n        }));\r\n    }\r\n\r\n    function addMagnify(pics) {\r\n        pics.find('.pic-border').append('<div class=\"magnify\"></div>');\r\n    }\r\n\r\n\r\n    function titleFormat(title, array, index) {\r\n        var el = $(array[index]);\r\n        var title = el.data('title') || '';\r\n        var description = el.data('description') || '';\r\n        var htmlDesc = el.data('html-description') || '';\r\n\r\n        if (!title && !description) return null;\r\n\r\n        var div = $('<div class=\"image-info \"></div>');\r\n\r\n\r\n        if (title) {\r\n            div.append('<div class=\"image-title\">' + title + '</div>');\r\n        }\r\n\r\n        if (description) {\r\n            var cls = '';\r\n            if (htmlDesc) {\r\n                description = decodeURIComponent(htmlDesc);\r\n                cls += 'theme-p theme-color-4  gallery-description';\r\n            }\r\n\r\n\r\n            div.append('<div class=\"image-description ' + cls + '\">' + description + '</div>');\r\n        }\r\n\r\n        return div;\r\n    }\r\n\r\n    /****\r\n     *\r\n     * @param pictures\r\n     * @param idx\r\n     * @param options\r\n     */\r\n    function onComplete(pictures, idx, options) {\r\n        var pic = $(pictures[idx]);\r\n\r\n        var widget = pic.parents('.widget').first();\r\n\r\n        var o = {\r\n            widget_id: widget.attr('id'),\r\n            href: pic.attr('href'),\r\n            title: pic.data('title') || ''\r\n        };\r\n\r\n        var t = type(widget);\r\n        if (!t) return;\r\n        hub.trigger('widgets:' + t + ':picture', o);\r\n    }\r\n\r\n    /***\r\n     * Extract the widget type from a list of class names\r\n     * @type {RegExp}\r\n     */\r\n    var WIDGET_CLASS_REGEX = /widget-([a-zA-Z-0-9]+)/;\r\n\r\n    /***\r\n     * Get the\r\n     * @param {jQuery} widget\r\n     * @return {String}\r\n     */\r\n    function type(widget) {\r\n        return ((widget.attr('class') || '').match(WIDGET_CLASS_REGEX)[1] || '');\r\n    }\r\n\r\n    // setup when the dom is ready\r\n    $(setup);\r\n});", "/****\r\n *  @fileOverview Handles video events\r\n *\r\n *  Events:\r\n *      widgets:video:played\r\n *      widgets:video:finished\r\n *\r\n *  Event data:\r\n *  {\r\n *      widget_id: string (the widget id)\r\n *      src: string (the url for the video)\r\n *      title: string the title of the video\r\n *  }\r\n */\r\ndefine('show/widgets/videos', function (require) {\r\n    var hub = require('fire/util/hub');\r\n    var json = require('fire/util/json');\r\n\r\n    var YOUTUBE_SELECTOR = '.widget-video-youtube';\r\n\r\n    var _win = $(window);\r\n\r\n    _win.on('message', onMessage);\r\n\r\n\r\n    function onMessage(e) {\r\n        var event = e.originalEvent;\r\n\r\n        switch (event.origin) {\r\n            // handle vimeo videos\r\n            case 'http://player.vimeo.com':\r\n                vimeo(event);\r\n            case 'http://www.youtube.com':\r\n                youtube(event);\r\n                break;\r\n        }\r\n    }\r\n\r\n    function getVideoInfo(w) {\r\n        var w = $('#' + w);\r\n        var frame = w.find('iframe');\r\n        var src = frame.attr('src').split('?')[0];\r\n        return {\r\n            widget_id:w.attr('id'),\r\n            src:src,\r\n            title:frame.data('title')\r\n        }\r\n    }\r\n\r\n\r\n    function vimeo(event) {\r\n        var d = json.decode(event.data);\r\n        // register events\r\n        var id = d.player_id;\r\n        switch (d.event) {\r\n            case 'ready':\r\n\r\n                post(id, {method:'addEventListener', value:'pause', player_id:id});\r\n                post(id, {method:'addEventListener', value:'play', player_id:id});\r\n                post(id, {method:'addEventListener', value:'finish', player_id:id});\r\n                break;\r\n            case 'play':\r\n                if (id in _isPlaying) return;\r\n                hub.trigger('widgets:video:played', getVideoInfo(id));\r\n                _isPlaying[id] = true;\r\n                break;\r\n            case 'finish':\r\n                hub.trigger('widgets:video:finished', getVideoInfo(id));\r\n                // remove from playing\r\n                delete _isPlaying[id];\r\n                break;\r\n        }\r\n    }\r\n\r\n    function youtube(event) {\r\n        var d = json.decode(event.data);\r\n        if (d.event === 'onStateChange') {\r\n            var id = d.id;\r\n            var info = getVideoInfo(id);\r\n            switch (d.info.playerState) {\r\n                case 1: // playing\r\n                    if (id in _isPlaying) return;\r\n                    hub.trigger('widgets:video:played', info);\r\n                    _isPlaying[id] = true;\r\n                    break;\r\n                case 0: // ended\r\n                    hub.trigger('widgets:video:finished', info);\r\n                    // remove from playing\r\n                    delete _isPlaying[id];\r\n                    break\r\n            }\r\n        }\r\n    }\r\n\r\n    var _isPlaying = {};\r\n\r\n    function post(id, data) {\r\n        var iframe = $('#' + id).find('iframe').first()[0];\r\n        data = data || {};\r\n        iframe.contentWindow.postMessage(json.encode(data), '*');\r\n    }\r\n\r\n\r\n    function registerYoutube(w) {\r\n        var id = $(w).attr('id');\r\n        post(id, {event:'command', func:'addEventListener', args:['onStateChange'], id:id})\r\n    }\r\n\r\n    function setupYoutube() {\r\n        $(YOUTUBE_SELECTOR).forEach(registerYoutube)\r\n    }\r\n\r\n    // setup youtube videos when everything was loaded\r\n    $(window).load(setupYoutube);\r\n});", "// Generated by CoffeeScript 1.12.7\ndefine('fire/util/history', function(require) {\n  var HISTORY_ID, HISTORY_KEY, StateHelper, getKey, hub, onHistoryPopState;\n  HISTORY_ID = 0;\n  HISTORY_KEY = '__history_key';\n  getKey = function() {\n    HISTORY_ID += 1;\n    return \"history_key_\" + HISTORY_ID;\n  };\n  hub = $({});\n  onHistoryPopState = function(e) {\n    var k, state;\n    state = e.originalEvent.state;\n    if (!state) {\n      return;\n    }\n    k = state[HISTORY_KEY];\n    if (k) {\n      return hub.trigger(k, state);\n    }\n  };\n  $(window).on('popstate', onHistoryPopState);\n  StateHelper = (function() {\n    function StateHelper(callback) {\n      this.id = getKey();\n      hub.on(this.id, callback);\n    }\n\n    StateHelper.prototype.push = function(state) {\n      var current;\n      if (state == null) {\n        state = {};\n      }\n      state[HISTORY_KEY] = this.id;\n      if (!history.pushState) {\n        return;\n      }\n      try {\n        current = JSON.stringify(history.state);\n        if (JSON.stringify(state) === current) {\n          return;\n        }\n        return history.pushState(state, document.title, document.location.href);\n      } catch (error) {}\n    };\n\n    StateHelper.prototype.pop = function() {\n      return null;\n    };\n\n    StateHelper.prototype.remove = function() {\n      return hub.off(this.id);\n    };\n\n    return StateHelper;\n\n  })();\n  return {\n    getHelper: function(callback) {\n      return new StateHelper(callback);\n    }\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\ndefine('fire/util/eventEmitter', function(require) {\n\n  /*\n    Event emitter class\n  \n    TODO: this needs a proper documentation\n    shlomiatar @ 16/04/13\n   */\n  var Emitter;\n  Emitter = (function() {\n    var _guid, getGuid;\n\n    _guid = 0;\n\n    getGuid = function() {\n\n      /*\n      Returns a new emitter guid\n       */\n      _guid += 1;\n      return \"ev_\" + _guid;\n    };\n\n    function Emitter() {\n      this.__ev = {};\n    }\n\n    Emitter.prototype.on = function(name, callback) {\n\n      /*\n        Register a callback\n       */\n      if (!callback) {\n        return;\n      }\n      if (!(name in this.__ev)) {\n        this.__ev[name] = [];\n      }\n      if (this.__findCallbackIdx(name, callback) > 0) {\n        return;\n      }\n      if (!callback.guid) {\n        callback.guid = getGuid();\n      }\n      this.__ev[name].push(callback);\n      return this;\n    };\n\n    Emitter.prototype.one = function(name, callback) {\n\n      /*\n      Creates a callback that will fire only once\n       */\n      var handler, self;\n      self = this;\n      handler = function() {\n        callback.apply(this, arguments);\n        return self.off(name, callback);\n      };\n      if (!callback.guid) {\n        callback.guid = getGuid();\n      }\n      handler.guid = callback.guid;\n      return this.on(name, handler);\n    };\n\n    Emitter.prototype.off = function(name, callback) {\n\n      /*\n        Unregister an event/multiple events\n      \n        Params:\n          - name      The name of the event we dergisterring\n          - callback  (optional) the callback we want to de-register. if non was specified, removes all the callbacks for\n                                 the event\n       */\n      var idx;\n      if (!callback) {\n        delete this.__ev[name];\n        return;\n      }\n      idx = this.__findCallbackIdx(name, callback);\n      if (idx > -1) {\n        this.__ev[name].splice(idx, 1);\n      }\n      return this;\n    };\n\n    Emitter.prototype.trigger = function(name) {\n\n      /*\n      Trigger an event\n       */\n      var c, i, len, ref;\n      if (!(name in this.__ev)) {\n        return;\n      }\n      ref = this.__ev[name];\n      for (i = 0, len = ref.length; i < len; i++) {\n        c = ref[i];\n        c.apply(this, Array.prototype.slice.call(arguments, 1));\n      }\n      return this;\n    };\n\n    Emitter.prototype.__findCallbackIdx = function(name, callback) {\n\n      /*\n      Locates the callback index by the event name and callback\n       */\n      var c, i, idx, len, ref;\n      if (!(name in this.__ev)) {\n        return -1;\n      }\n      ref = this.__ev[name];\n      for (idx = i = 0, len = ref.length; i < len; idx = ++i) {\n        c = ref[idx];\n        if (c === callback) {\n          return idx;\n        }\n        if (c.guid && c.guid === callback.guid) {\n          return idx;\n        }\n      }\n      return -1;\n    };\n\n    return Emitter;\n\n  })();\n  return {\n    Emitter: Emitter\n  };\n});\n", "//     Underscore.js 1.5.2\n//     http://underscorejs.org\n//     (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\n(function () {\n\n    // Baseline setup\n    // --------------\n\n    // Establish the root object, `window` in the browser, or `exports` on the server.\n    var root = this;\n\n    // Save the previous value of the `_` variable.\n    var previousUnderscore = root._;\n\n    // Establish the object that gets returned to break out of a loop iteration.\n    var breaker = {};\n\n    // Save bytes in the minified (but not gzipped) version:\n    var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n    // Create quick reference variables for speed access to core prototypes.\n    var\n        push = ArrayProto.push,\n        slice = ArrayProto.slice,\n        concat = ArrayProto.concat,\n        toString = ObjProto.toString,\n        hasOwnProperty = ObjProto.hasOwnProperty;\n\n    // All **ECMAScript 5** native function implementations that we hope to use\n    // are declared here.\n    var\n        nativeForEach = ArrayProto.forEach,\n        nativeMap = ArrayProto.map,\n        nativeReduce = ArrayProto.reduce,\n        nativeReduceRight = ArrayProto.reduceRight,\n        nativeFilter = ArrayProto.filter,\n        nativeEvery = ArrayProto.every,\n        nativeSome = ArrayProto.some,\n        nativeIndexOf = ArrayProto.indexOf,\n        nativeLastIndexOf = ArrayProto.lastIndexOf,\n        nativeIsArray = Array.isArray,\n        nativeKeys = Object.keys,\n        nativeBind = FuncProto.bind;\n\n    // Create a safe reference to the Underscore object for use below.\n    var _ = function (obj) {\n        if (obj instanceof _) return obj;\n        if (!(this instanceof _)) return new _(obj);\n        this._wrapped = obj;\n    };\n\n    // Export the Underscore object for **Node.js**, with\n    // backwards-compatibility for the old `require()` API. If we're in\n    // the browser, add `_` as a global object via a string identifier,\n    // for Closure Compiler \"advanced\" mode.\n    if (typeof exports !== 'undefined') {\n        if (typeof module !== 'undefined' && module.exports) {\n            exports = module.exports = _;\n        }\n        exports._ = _;\n    } else {\n        root._ = _;\n        root._underscore = _;\n    }\n\n    // Current version.\n    _.VERSION = '1.5.2';\n\n    // Collection Functions\n    // --------------------\n\n    // The cornerstone, an `each` implementation, aka `forEach`.\n    // Handles objects with the built-in `forEach`, arrays, and raw objects.\n    // Delegates to **ECMAScript 5**'s native `forEach` if available.\n    var each = _.each = _.forEach = function (obj, iterator, context) {\n        if (obj == null) return;\n        if (nativeForEach && obj.forEach === nativeForEach) {\n            obj.forEach(iterator, context);\n        } else if (obj.length === +obj.length) {\n            for (var i = 0, length = obj.length; i < length; i++) {\n                if (iterator.call(context, obj[i], i, obj) === breaker) return;\n            }\n        } else {\n            var keys = _.keys(obj);\n            for (var i = 0, length = keys.length; i < length; i++) {\n                if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;\n            }\n        }\n    };\n\n    // Return the results of applying the iterator to each element.\n    // Delegates to **ECMAScript 5**'s native `map` if available.\n    _.map = _.collect = function (obj, iterator, context) {\n        var results = [];\n        if (obj == null) return results;\n        if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\n        each(obj, function (value, index, list) {\n            results.push(iterator.call(context, value, index, list));\n        });\n        return results;\n    };\n\n    var reduceError = 'Reduce of empty array with no initial value';\n\n    // **Reduce** builds up a single result from a list of values, aka `inject`,\n    // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.\n    _.reduce = _.foldl = _.inject = function (obj, iterator, memo, context) {\n        var initial = arguments.length > 2;\n        if (obj == null) obj = [];\n        if (nativeReduce && obj.reduce === nativeReduce) {\n            if (context) iterator = _.bind(iterator, context);\n            return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);\n        }\n        each(obj, function (value, index, list) {\n            if (!initial) {\n                memo = value;\n                initial = true;\n            } else {\n                memo = iterator.call(context, memo, value, index, list);\n            }\n        });\n        if (!initial) throw new TypeError(reduceError);\n        return memo;\n    };\n\n    // The right-associative version of reduce, also known as `foldr`.\n    // Delegates to **ECMAScript 5**'s native `reduceRight` if available.\n    _.reduceRight = _.foldr = function (obj, iterator, memo, context) {\n        var initial = arguments.length > 2;\n        if (obj == null) obj = [];\n        if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {\n            if (context) iterator = _.bind(iterator, context);\n            return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);\n        }\n        var length = obj.length;\n        if (length !== +length) {\n            var keys = _.keys(obj);\n            length = keys.length;\n        }\n        each(obj, function (value, index, list) {\n            index = keys ? keys[--length] : --length;\n            if (!initial) {\n                memo = obj[index];\n                initial = true;\n            } else {\n                memo = iterator.call(context, memo, obj[index], index, list);\n            }\n        });\n        if (!initial) throw new TypeError(reduceError);\n        return memo;\n    };\n\n    // Return the first value which passes a truth test. Aliased as `detect`.\n    _.find = _.detect = function (obj, iterator, context) {\n        var result;\n        any(obj, function (value, index, list) {\n            if (iterator.call(context, value, index, list)) {\n                result = value;\n                return true;\n            }\n        });\n        return result;\n    };\n\n    // Return all the elements that pass a truth test.\n    // Delegates to **ECMAScript 5**'s native `filter` if available.\n    // Aliased as `select`.\n    _.filter = _.select = function (obj, iterator, context) {\n        var results = [];\n        if (obj == null) return results;\n        if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);\n        each(obj, function (value, index, list) {\n            if (iterator.call(context, value, index, list)) results.push(value);\n        });\n        return results;\n    };\n\n    // Return all the elements for which a truth test fails.\n    _.reject = function (obj, iterator, context) {\n        return _.filter(obj, function (value, index, list) {\n            return !iterator.call(context, value, index, list);\n        }, context);\n    };\n\n    // Determine whether all of the elements match a truth test.\n    // Delegates to **ECMAScript 5**'s native `every` if available.\n    // Aliased as `all`.\n    _.every = _.all = function (obj, iterator, context) {\n        iterator || (iterator = _.identity);\n        var result = true;\n        if (obj == null) return result;\n        if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);\n        each(obj, function (value, index, list) {\n            if (!(result = result && iterator.call(context, value, index, list))) return breaker;\n        });\n        return !!result;\n    };\n\n    // Determine if at least one element in the object matches a truth test.\n    // Delegates to **ECMAScript 5**'s native `some` if available.\n    // Aliased as `any`.\n    var any = _.some = _.any = function (obj, iterator, context) {\n        iterator || (iterator = _.identity);\n        var result = false;\n        if (obj == null) return result;\n        if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);\n        each(obj, function (value, index, list) {\n            if (result || (result = iterator.call(context, value, index, list))) return breaker;\n        });\n        return !!result;\n    };\n\n    // Determine if the array or object contains a given value (using `===`).\n    // Aliased as `include`.\n    _.contains = _.include = function (obj, target) {\n        if (obj == null) return false;\n        if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;\n        return any(obj, function (value) {\n            return value === target;\n        });\n    };\n\n    // Invoke a method (with arguments) on every item in a collection.\n    _.invoke = function (obj, method) {\n        var args = slice.call(arguments, 2);\n        var isFunc = _.isFunction(method);\n        return _.map(obj, function (value) {\n            return (isFunc ? method : value[method]).apply(value, args);\n        });\n    };\n\n    // Convenience version of a common use case of `map`: fetching a property.\n    _.pluck = function (obj, key) {\n        return _.map(obj, function (value) {\n            return value[key];\n        });\n    };\n\n    // Convenience version of a common use case of `filter`: selecting only objects\n    // containing specific `key:value` pairs.\n    _.where = function (obj, attrs, first) {\n        if (_.isEmpty(attrs)) return first ? void 0 : [];\n        return _[first ? 'find' : 'filter'](obj, function (value) {\n            for (var key in attrs) {\n                if (attrs[key] !== value[key]) return false;\n            }\n            return true;\n        });\n    };\n\n    // Convenience version of a common use case of `find`: getting the first object\n    // containing specific `key:value` pairs.\n    _.findWhere = function (obj, attrs) {\n        return _.where(obj, attrs, true);\n    };\n\n    // Return the maximum element or (element-based computation).\n    // Can't optimize arrays of integers longer than 65,535 elements.\n    // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797)\n    _.max = function (obj, iterator, context) {\n        if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n            return Math.max.apply(Math, obj);\n        }\n        if (!iterator && _.isEmpty(obj)) return -Infinity;\n        var result = {computed: -Infinity, value: -Infinity};\n        each(obj, function (value, index, list) {\n            var computed = iterator ? iterator.call(context, value, index, list) : value;\n            computed > result.computed && (result = {value: value, computed: computed});\n        });\n        return result.value;\n    };\n\n    // Return the minimum element (or element-based computation).\n    _.min = function (obj, iterator, context) {\n        if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n            return Math.min.apply(Math, obj);\n        }\n        if (!iterator && _.isEmpty(obj)) return Infinity;\n        var result = {computed: Infinity, value: Infinity};\n        each(obj, function (value, index, list) {\n            var computed = iterator ? iterator.call(context, value, index, list) : value;\n            computed < result.computed && (result = {value: value, computed: computed});\n        });\n        return result.value;\n    };\n\n    // Shuffle an array, using the modern version of the\n    // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher\u00e2\u20ac\u201cYates_shuffle).\n    _.shuffle = function (obj) {\n        var rand;\n        var index = 0;\n        var shuffled = [];\n        each(obj, function (value) {\n            rand = _.random(index++);\n            shuffled[index - 1] = shuffled[rand];\n            shuffled[rand] = value;\n        });\n        return shuffled;\n    };\n\n    // Sample **n** random values from an array.\n    // If **n** is not specified, returns a single random element from the array.\n    // The internal `guard` argument allows it to work with `map`.\n    _.sample = function (obj, n, guard) {\n        if (arguments.length < 2 || guard) {\n            return obj[_.random(obj.length - 1)];\n        }\n        return _.shuffle(obj).slice(0, Math.max(0, n));\n    };\n\n    // An internal function to generate lookup iterators.\n    var lookupIterator = function (value) {\n        return _.isFunction(value) ? value : function (obj) {\n            return obj[value];\n        };\n    };\n\n    // Sort the object's values by a criterion produced by an iterator.\n    _.sortBy = function (obj, value, context) {\n        var iterator = lookupIterator(value);\n        return _.pluck(_.map(obj, function (value, index, list) {\n            return {\n                value: value,\n                index: index,\n                criteria: iterator.call(context, value, index, list)\n            };\n        }).sort(function (left, right) {\n            var a = left.criteria;\n            var b = right.criteria;\n            if (a !== b) {\n                if (a > b || a === void 0) return 1;\n                if (a < b || b === void 0) return -1;\n            }\n            return left.index - right.index;\n        }), 'value');\n    };\n\n    // An internal function used for aggregate \"group by\" operations.\n    var group = function (behavior) {\n        return function (obj, value, context) {\n            var result = {};\n            var iterator = value == null ? _.identity : lookupIterator(value);\n            each(obj, function (value, index) {\n                var key = iterator.call(context, value, index, obj);\n                behavior(result, key, value);\n            });\n            return result;\n        };\n    };\n\n    // Groups the object's values by a criterion. Pass either a string attribute\n    // to group by, or a function that returns the criterion.\n    _.groupBy = group(function (result, key, value) {\n        (_.has(result, key) ? result[key] : (result[key] = [])).push(value);\n    });\n\n    // Indexes the object's values by a criterion, similar to `groupBy`, but for\n    // when you know that your index values will be unique.\n    _.indexBy = group(function (result, key, value) {\n        result[key] = value;\n    });\n\n    // Counts instances of an object that group by a certain criterion. Pass\n    // either a string attribute to count by, or a function that returns the\n    // criterion.\n    _.countBy = group(function (result, key) {\n        _.has(result, key) ? result[key]++ : result[key] = 1;\n    });\n\n    // Use a comparator function to figure out the smallest index at which\n    // an object should be inserted so as to maintain order. Uses binary search.\n    _.sortedIndex = function (array, obj, iterator, context) {\n        iterator = iterator == null ? _.identity : lookupIterator(iterator);\n        var value = iterator.call(context, obj);\n        var low = 0, high = array.length;\n        while (low < high) {\n            var mid = (low + high) >>> 1;\n            iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;\n        }\n        return low;\n    };\n\n    // Safely create a real, live array from anything iterable.\n    _.toArray = function (obj) {\n        if (!obj) return [];\n        if (_.isArray(obj)) return slice.call(obj);\n        if (obj.length === +obj.length) return _.map(obj, _.identity);\n        return _.values(obj);\n    };\n\n    // Return the number of elements in an object.\n    _.size = function (obj) {\n        if (obj == null) return 0;\n        return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;\n    };\n\n    // Array Functions\n    // ---------------\n\n    // Get the first element of an array. Passing **n** will return the first N\n    // values in the array. Aliased as `head` and `take`. The **guard** check\n    // allows it to work with `_.map`.\n    _.first = _.head = _.take = function (array, n, guard) {\n        if (array == null) return void 0;\n        return (n == null) || guard ? array[0] : slice.call(array, 0, n);\n    };\n\n    // Returns everything but the last entry of the array. Especially useful on\n    // the arguments object. Passing **n** will return all the values in\n    // the array, excluding the last N. The **guard** check allows it to work with\n    // `_.map`.\n    _.initial = function (array, n, guard) {\n        return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));\n    };\n\n    // Get the last element of an array. Passing **n** will return the last N\n    // values in the array. The **guard** check allows it to work with `_.map`.\n    _.last = function (array, n, guard) {\n        if (array == null) return void 0;\n        if ((n == null) || guard) {\n            return array[array.length - 1];\n        } else {\n            return slice.call(array, Math.max(array.length - n, 0));\n        }\n    };\n\n    // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n    // Especially useful on the arguments object. Passing an **n** will return\n    // the rest N values in the array. The **guard**\n    // check allows it to work with `_.map`.\n    _.rest = _.tail = _.drop = function (array, n, guard) {\n        return slice.call(array, (n == null) || guard ? 1 : n);\n    };\n\n    // Trim out all falsy values from an array.\n    _.compact = function (array) {\n        return _.filter(array, _.identity);\n    };\n\n    // Internal implementation of a recursive `flatten` function.\n    var flatten = function (input, shallow, output) {\n        if (shallow && _.every(input, _.isArray)) {\n            return concat.apply(output, input);\n        }\n        each(input, function (value) {\n            if (_.isArray(value) || _.isArguments(value)) {\n                shallow ? push.apply(output, value) : flatten(value, shallow, output);\n            } else {\n                output.push(value);\n            }\n        });\n        return output;\n    };\n\n    // Flatten out an array, either recursively (by default), or just one level.\n    _.flatten = function (array, shallow) {\n        return flatten(array, shallow, []);\n    };\n\n    // Return a version of the array that does not contain the specified value(s).\n    _.without = function (array) {\n        return _.difference(array, slice.call(arguments, 1));\n    };\n\n    // Produce a duplicate-free version of the array. If the array has already\n    // been sorted, you have the option of using a faster algorithm.\n    // Aliased as `unique`.\n    _.uniq = _.unique = function (array, isSorted, iterator, context) {\n        if (_.isFunction(isSorted)) {\n            context = iterator;\n            iterator = isSorted;\n            isSorted = false;\n        }\n        var initial = iterator ? _.map(array, iterator, context) : array;\n        var results = [];\n        var seen = [];\n        each(initial, function (value, index) {\n            if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {\n                seen.push(value);\n                results.push(array[index]);\n            }\n        });\n        return results;\n    };\n\n    // Produce an array that contains the union: each distinct element from all of\n    // the passed-in arrays.\n    _.union = function () {\n        return _.uniq(_.flatten(arguments, true));\n    };\n\n    // Produce an array that contains every item shared between all the\n    // passed-in arrays.\n    _.intersection = function (array) {\n        var rest = slice.call(arguments, 1);\n        return _.filter(_.uniq(array), function (item) {\n            return _.every(rest, function (other) {\n                return _.indexOf(other, item) >= 0;\n            });\n        });\n    };\n\n    // Take the difference between one array and a number of other arrays.\n    // Only the elements present in just the first array will remain.\n    _.difference = function (array) {\n        var rest = concat.apply(ArrayProto, slice.call(arguments, 1));\n        return _.filter(array, function (value) {\n            return !_.contains(rest, value);\n        });\n    };\n\n    // Zip together multiple lists into a single array -- elements that share\n    // an index go together.\n    _.zip = function () {\n        var length = _.max(_.pluck(arguments, \"length\").concat(0));\n        var results = new Array(length);\n        for (var i = 0; i < length; i++) {\n            results[i] = _.pluck(arguments, '' + i);\n        }\n        return results;\n    };\n\n    // Converts lists into objects. Pass either a single array of `[key, value]`\n    // pairs, or two parallel arrays of the same length -- one of keys, and one of\n    // the corresponding values.\n    _.object = function (list, values) {\n        if (list == null) return {};\n        var result = {};\n        for (var i = 0, length = list.length; i < length; i++) {\n            if (values) {\n                result[list[i]] = values[i];\n            } else {\n                result[list[i][0]] = list[i][1];\n            }\n        }\n        return result;\n    };\n\n    // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),\n    // we need this function. Return the position of the first occurrence of an\n    // item in an array, or -1 if the item is not included in the array.\n    // Delegates to **ECMAScript 5**'s native `indexOf` if available.\n    // If the array is large and already in sort order, pass `true`\n    // for **isSorted** to use binary search.\n    _.indexOf = function (array, item, isSorted) {\n        if (array == null) return -1;\n        var i = 0, length = array.length;\n        if (isSorted) {\n            if (typeof isSorted == 'number') {\n                i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);\n            } else {\n                i = _.sortedIndex(array, item);\n                return array[i] === item ? i : -1;\n            }\n        }\n        if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);\n        for (; i < length; i++) if (array[i] === item) return i;\n        return -1;\n    };\n\n    // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.\n    _.lastIndexOf = function (array, item, from) {\n        if (array == null) return -1;\n        var hasIndex = from != null;\n        if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {\n            return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);\n        }\n        var i = (hasIndex ? from : array.length);\n        while (i--) if (array[i] === item) return i;\n        return -1;\n    };\n\n    // Generate an integer Array containing an arithmetic progression. A port of\n    // the native Python `range()` function. See\n    // [the Python documentation](http://docs.python.org/library/functions.html#range).\n    _.range = function (start, stop, step) {\n        if (arguments.length <= 1) {\n            stop = start || 0;\n            start = 0;\n        }\n        step = arguments[2] || 1;\n\n        var length = Math.max(Math.ceil((stop - start) / step), 0);\n        var idx = 0;\n        var range = new Array(length);\n\n        while (idx < length) {\n            range[idx++] = start;\n            start += step;\n        }\n\n        return range;\n    };\n\n    // Function (ahem) Functions\n    // ------------------\n\n    // Reusable constructor function for prototype setting.\n    var ctor = function () {\n    };\n\n    // Create a function bound to a given object (assigning `this`, and arguments,\n    // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n    // available.\n    _.bind = function (func, context) {\n        var args, bound;\n        if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n        if (!_.isFunction(func)) throw new TypeError;\n        args = slice.call(arguments, 2);\n        return bound = function () {\n            if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));\n            ctor.prototype = func.prototype;\n            var self = new ctor;\n            ctor.prototype = null;\n            var result = func.apply(self, args.concat(slice.call(arguments)));\n            if (Object(result) === result) return result;\n            return self;\n        };\n    };\n\n    // Partially apply a function by creating a version that has had some of its\n    // arguments pre-filled, without changing its dynamic `this` context.\n    _.partial = function (func) {\n        var args = slice.call(arguments, 1);\n        return function () {\n            return func.apply(this, args.concat(slice.call(arguments)));\n        };\n    };\n\n    // Bind all of an object's methods to that object. Useful for ensuring that\n    // all callbacks defined on an object belong to it.\n    _.bindAll = function (obj) {\n        var funcs = slice.call(arguments, 1);\n        if (funcs.length === 0) throw new Error(\"bindAll must be passed function names\");\n        each(funcs, function (f) {\n            obj[f] = _.bind(obj[f], obj);\n        });\n        return obj;\n    };\n\n    // Memoize an expensive function by storing its results.\n    _.memoize = function (func, hasher) {\n        var memo = {};\n        hasher || (hasher = _.identity);\n        return function () {\n            var key = hasher.apply(this, arguments);\n            return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));\n        };\n    };\n\n    // Delays a function for the given number of milliseconds, and then calls\n    // it with the arguments supplied.\n    _.delay = function (func, wait) {\n        var args = slice.call(arguments, 2);\n        return setTimeout(function () {\n            return func.apply(null, args);\n        }, wait);\n    };\n\n    // Defers a function, scheduling it to run after the current call stack has\n    // cleared.\n    _.defer = function (func) {\n        return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\n    };\n\n    // Returns a function, that, when invoked, will only be triggered at most once\n    // during a given window of time. Normally, the throttled function will run\n    // as much as it can, without ever going more than once per `wait` duration;\n    // but if you'd like to disable the execution on the leading edge, pass\n    // `{leading: false}`. To disable execution on the trailing edge, ditto.\n    _.throttle = function (func, wait, options) {\n        var context, args, result;\n        var timeout = null;\n        var previous = 0;\n        options || (options = {});\n        var later = function () {\n            previous = options.leading === false ? 0 : new Date;\n            timeout = null;\n            result = func.apply(context, args);\n        };\n        return function () {\n            var now = new Date;\n            if (!previous && options.leading === false) previous = now;\n            var remaining = wait - (now - previous);\n            context = this;\n            args = arguments;\n            if (remaining <= 0) {\n                clearTimeout(timeout);\n                timeout = null;\n                previous = now;\n                result = func.apply(context, args);\n            } else if (!timeout && options.trailing !== false) {\n                timeout = setTimeout(later, remaining);\n            }\n            return result;\n        };\n    };\n\n    // Returns a function, that, as long as it continues to be invoked, will not\n    // be triggered. The function will be called after it stops being called for\n    // N milliseconds. If `immediate` is passed, trigger the function on the\n    // leading edge, instead of the trailing.\n    _.debounce = function (func, wait, immediate) {\n        var timeout, args, context, timestamp, result;\n        return function () {\n            context = this;\n            args = arguments;\n            timestamp = new Date();\n            var later = function () {\n                var last = (new Date()) - timestamp;\n                if (last < wait) {\n                    timeout = setTimeout(later, wait - last);\n                } else {\n                    timeout = null;\n                    if (!immediate) result = func.apply(context, args);\n                }\n            };\n            var callNow = immediate && !timeout;\n            if (!timeout) {\n                timeout = setTimeout(later, wait);\n            }\n            if (callNow) result = func.apply(context, args);\n            return result;\n        };\n    };\n\n    // Returns a function that will be executed at most one time, no matter how\n    // often you call it. Useful for lazy initialization.\n    _.once = function (func) {\n        var ran = false, memo;\n        return function () {\n            if (ran) return memo;\n            ran = true;\n            memo = func.apply(this, arguments);\n            func = null;\n            return memo;\n        };\n    };\n\n    // Returns the first function passed as an argument to the second,\n    // allowing you to adjust arguments, run code before and after, and\n    // conditionally execute the original function.\n    _.wrap = function (func, wrapper) {\n        return function () {\n            var args = [func];\n            push.apply(args, arguments);\n            return wrapper.apply(this, args);\n        };\n    };\n\n    // Returns a function that is the composition of a list of functions, each\n    // consuming the return value of the function that follows.\n    _.compose = function () {\n        var funcs = arguments;\n        return function () {\n            var args = arguments;\n            for (var i = funcs.length - 1; i >= 0; i--) {\n                args = [funcs[i].apply(this, args)];\n            }\n            return args[0];\n        };\n    };\n\n    // Returns a function that will only be executed after being called N times.\n    _.after = function (times, func) {\n        return function () {\n            if (--times < 1) {\n                return func.apply(this, arguments);\n            }\n        };\n    };\n\n    // Object Functions\n    // ----------------\n\n    // Retrieve the names of an object's properties.\n    // Delegates to **ECMAScript 5**'s native `Object.keys`\n    _.keys = nativeKeys || function (obj) {\n            if (obj !== Object(obj)) throw new TypeError('Invalid object');\n            var keys = [];\n            for (var key in obj) if (_.has(obj, key)) keys.push(key);\n            return keys;\n        };\n\n    // Retrieve the values of an object's properties.\n    _.values = function (obj) {\n        var keys = _.keys(obj);\n        var length = keys.length;\n        var values = new Array(length);\n        for (var i = 0; i < length; i++) {\n            values[i] = obj[keys[i]];\n        }\n        return values;\n    };\n\n    // Convert an object into a list of `[key, value]` pairs.\n    _.pairs = function (obj) {\n        var keys = _.keys(obj);\n        var length = keys.length;\n        var pairs = new Array(length);\n        for (var i = 0; i < length; i++) {\n            pairs[i] = [keys[i], obj[keys[i]]];\n        }\n        return pairs;\n    };\n\n    // Invert the keys and values of an object. The values must be serializable.\n    _.invert = function (obj) {\n        var result = {};\n        var keys = _.keys(obj);\n        for (var i = 0, length = keys.length; i < length; i++) {\n            result[obj[keys[i]]] = keys[i];\n        }\n        return result;\n    };\n\n    // Return a sorted list of the function names available on the object.\n    // Aliased as `methods`\n    _.functions = _.methods = function (obj) {\n        var names = [];\n        for (var key in obj) {\n            if (_.isFunction(obj[key])) names.push(key);\n        }\n        return names.sort();\n    };\n\n    // Extend a given object with all the properties in passed-in object(s).\n    _.extend = function (obj) {\n        each(slice.call(arguments, 1), function (source) {\n            if (source) {\n                for (var prop in source) {\n                    obj[prop] = source[prop];\n                }\n            }\n        });\n        return obj;\n    };\n\n    // Return a copy of the object only containing the whitelisted properties.\n    _.pick = function (obj) {\n        var copy = {};\n        var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n        each(keys, function (key) {\n            if (key in obj) copy[key] = obj[key];\n        });\n        return copy;\n    };\n\n    // Return a copy of the object without the blacklisted properties.\n    _.omit = function (obj) {\n        var copy = {};\n        var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n        for (var key in obj) {\n            if (!_.contains(keys, key)) copy[key] = obj[key];\n        }\n        return copy;\n    };\n\n    // Fill in a given object with default properties.\n    _.defaults = function (obj) {\n        each(slice.call(arguments, 1), function (source) {\n            if (source) {\n                for (var prop in source) {\n                    if (obj[prop] === void 0) obj[prop] = source[prop];\n                }\n            }\n        });\n        return obj;\n    };\n\n    // Create a (shallow-cloned) duplicate of an object.\n    _.clone = function (obj) {\n        if (!_.isObject(obj)) return obj;\n        return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n    };\n\n    // Invokes interceptor with the obj, and then returns obj.\n    // The primary purpose of this method is to \"tap into\" a method chain, in\n    // order to perform operations on intermediate results within the chain.\n    _.tap = function (obj, interceptor) {\n        interceptor(obj);\n        return obj;\n    };\n\n    // Internal recursive comparison function for `isEqual`.\n    var eq = function (a, b, aStack, bStack) {\n        // Identical objects are equal. `0 === -0`, but they aren't identical.\n        // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\n        if (a === b) return a !== 0 || 1 / a == 1 / b;\n        // A strict comparison is necessary because `null == undefined`.\n        if (a == null || b == null) return a === b;\n        // Unwrap any wrapped objects.\n        if (a instanceof _) a = a._wrapped;\n        if (b instanceof _) b = b._wrapped;\n        // Compare `[[Class]]` names.\n        var className = toString.call(a);\n        if (className != toString.call(b)) return false;\n        switch (className) {\n            // Strings, numbers, dates, and booleans are compared by value.\n            case '[object String]':\n                // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n                // equivalent to `new String(\"5\")`.\n                return a == String(b);\n            case '[object Number]':\n                // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for\n                // other numeric values.\n                return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);\n            case '[object Date]':\n            case '[object Boolean]':\n                // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n                // millisecond representations. Note that invalid dates with millisecond representations\n                // of `NaN` are not equivalent.\n                return +a == +b;\n            // RegExps are compared by their source patterns and flags.\n            case '[object RegExp]':\n                return a.source == b.source &&\n                    a.global == b.global &&\n                    a.multiline == b.multiline &&\n                    a.ignoreCase == b.ignoreCase;\n        }\n        if (typeof a != 'object' || typeof b != 'object') return false;\n        // Assume equality for cyclic structures. The algorithm for detecting cyclic\n        // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n        var length = aStack.length;\n        while (length--) {\n            // Linear search. Performance is inversely proportional to the number of\n            // unique nested structures.\n            if (aStack[length] == a) return bStack[length] == b;\n        }\n        // Objects with different constructors are not equivalent, but `Object`s\n        // from different frames are.\n        var aCtor = a.constructor, bCtor = b.constructor;\n        if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&\n            _.isFunction(bCtor) && (bCtor instanceof bCtor))) {\n            return false;\n        }\n        // Add the first object to the stack of traversed objects.\n        aStack.push(a);\n        bStack.push(b);\n        var size = 0, result = true;\n        // Recursively compare objects and arrays.\n        if (className == '[object Array]') {\n            // Compare array lengths to determine if a deep comparison is necessary.\n            size = a.length;\n            result = size == b.length;\n            if (result) {\n                // Deep compare the contents, ignoring non-numeric properties.\n                while (size--) {\n                    if (!(result = eq(a[size], b[size], aStack, bStack))) break;\n                }\n            }\n        } else {\n            // Deep compare objects.\n            for (var key in a) {\n                if (_.has(a, key)) {\n                    // Count the expected number of properties.\n                    size++;\n                    // Deep compare each member.\n                    if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;\n                }\n            }\n            // Ensure that both objects contain the same number of properties.\n            if (result) {\n                for (key in b) {\n                    if (_.has(b, key) && !(size--)) break;\n                }\n                result = !size;\n            }\n        }\n        // Remove the first object from the stack of traversed objects.\n        aStack.pop();\n        bStack.pop();\n        return result;\n    };\n\n    // Perform a deep comparison to check if two objects are equal.\n    _.isEqual = function (a, b) {\n        return eq(a, b, [], []);\n    };\n\n    // Is a given array, string, or object empty?\n    // An \"empty\" object has no enumerable own-properties.\n    _.isEmpty = function (obj) {\n        if (obj == null) return true;\n        if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;\n        for (var key in obj) if (_.has(obj, key)) return false;\n        return true;\n    };\n\n    // Is a given value a DOM element?\n    _.isElement = function (obj) {\n        return !!(obj && obj.nodeType === 1);\n    };\n\n    // Is a given value an array?\n    // Delegates to ECMA5's native Array.isArray\n    _.isArray = nativeIsArray || function (obj) {\n            return toString.call(obj) == '[object Array]';\n        };\n\n    // Is a given variable an object?\n    _.isObject = function (obj) {\n        return obj === Object(obj);\n    };\n\n    // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.\n    each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function (name) {\n        _['is' + name] = function (obj) {\n            return toString.call(obj) == '[object ' + name + ']';\n        };\n    });\n\n    // Define a fallback version of the method in browsers (ahem, IE), where\n    // there isn't any inspectable \"Arguments\" type.\n    if (!_.isArguments(arguments)) {\n        _.isArguments = function (obj) {\n            return !!(obj && _.has(obj, 'callee'));\n        };\n    }\n\n    // Optimize `isFunction` if appropriate.\n    if (typeof (/./) !== 'function') {\n        _.isFunction = function (obj) {\n            return typeof obj === 'function';\n        };\n    }\n\n    // Is a given object a finite number?\n    _.isFinite = function (obj) {\n        return isFinite(obj) && !isNaN(parseFloat(obj));\n    };\n\n    // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n    _.isNaN = function (obj) {\n        return _.isNumber(obj) && obj != +obj;\n    };\n\n    // Is a given value a boolean?\n    _.isBoolean = function (obj) {\n        return obj === true || obj === false || toString.call(obj) == '[object Boolean]';\n    };\n\n    // Is a given value equal to null?\n    _.isNull = function (obj) {\n        return obj === null;\n    };\n\n    // Is a given variable undefined?\n    _.isUndefined = function (obj) {\n        return obj === void 0;\n    };\n\n    // Shortcut function for checking if an object has a given property directly\n    // on itself (in other words, not on a prototype).\n    _.has = function (obj, key) {\n        return hasOwnProperty.call(obj, key);\n    };\n\n    // Utility Functions\n    // -----------------\n\n    // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n    // previous owner. Returns a reference to the Underscore object.\n    _.noConflict = function () {\n        root._ = previousUnderscore;\n        return this;\n    };\n\n    // Keep the identity function around for default iterators.\n    _.identity = function (value) {\n        return value;\n    };\n\n    // Run a function **n** times.\n    _.times = function (n, iterator, context) {\n        var accum = Array(Math.max(0, n));\n        for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);\n        return accum;\n    };\n\n    // Return a random integer between min and max (inclusive).\n    _.random = function (min, max) {\n        if (max == null) {\n            max = min;\n            min = 0;\n        }\n        return min + Math.floor(Math.random() * (max - min + 1));\n    };\n\n    // List of HTML entities for escaping.\n    var entityMap = {\n        escape: {\n            '&': '&amp;',\n            '<': '&lt;',\n            '>': '&gt;',\n            '\"': '&quot;',\n            \"'\": '&#x27;'\n        }\n    };\n    entityMap.unescape = _.invert(entityMap.escape);\n\n    // Regexes containing the keys and values listed immediately above.\n    var entityRegexes = {\n        escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),\n        unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')\n    };\n\n    // Functions for escaping and unescaping strings to/from HTML interpolation.\n    _.each(['escape', 'unescape'], function (method) {\n        _[method] = function (string) {\n            if (string == null) return '';\n            return ('' + string).replace(entityRegexes[method], function (match) {\n                return entityMap[method][match];\n            });\n        };\n    });\n\n    // If the value of the named `property` is a function then invoke it with the\n    // `object` as context; otherwise, return it.\n    _.result = function (object, property) {\n        if (object == null) return void 0;\n        var value = object[property];\n        return _.isFunction(value) ? value.call(object) : value;\n    };\n\n    // Add your own custom functions to the Underscore object.\n    _.mixin = function (obj) {\n        each(_.functions(obj), function (name) {\n            var func = _[name] = obj[name];\n            _.prototype[name] = function () {\n                var args = [this._wrapped];\n                push.apply(args, arguments);\n                return result.call(this, func.apply(_, args));\n            };\n        });\n    };\n\n    // Generate a unique integer id (unique within the entire client session).\n    // Useful for temporary DOM ids.\n    var idCounter = 0;\n    _.uniqueId = function (prefix) {\n        var id = ++idCounter + '';\n        return prefix ? prefix + id : id;\n    };\n\n    // By default, Underscore uses ERB-style template delimiters, change the\n    // following template settings to use alternative delimiters.\n    _.templateSettings = {\n        evaluate: /<%([\\s\\S]+?)%>/g,\n        interpolate: /<%=([\\s\\S]+?)%>/g,\n        escape: /<%-([\\s\\S]+?)%>/g\n    };\n\n    // When customizing `templateSettings`, if you don't want to define an\n    // interpolation, evaluation or escaping regex, we need one that is\n    // guaranteed not to match.\n    var noMatch = /(.)^/;\n\n    // Certain characters need to be escaped so that they can be put into a\n    // string literal.\n    var escapes = {\n        \"'\": \"'\",\n        '\\\\': '\\\\',\n        '\\r': 'r',\n        '\\n': 'n',\n        '\\t': 't',\n        '\\u2028': 'u2028',\n        '\\u2029': 'u2029'\n    };\n\n    var escaper = /\\\\|'|\\r|\\n|\\t|\\u2028|\\u2029/g;\n\n    // JavaScript micro-templating, similar to John Resig's implementation.\n    // Underscore templating handles arbitrary delimiters, preserves whitespace,\n    // and correctly escapes quotes within interpolated code.\n    _.template = function (text, data, settings) {\n        var render;\n        settings = _.defaults({}, settings, _.templateSettings);\n\n        // Combine delimiters into one regular expression via alternation.\n        var matcher = new RegExp([\n                (settings.escape || noMatch).source,\n                (settings.interpolate || noMatch).source,\n                (settings.evaluate || noMatch).source\n            ].join('|') + '|$', 'g');\n\n        // Compile the template source, escaping string literals appropriately.\n        var index = 0;\n        var source = \"__p+='\";\n        text.replace(matcher, function (match, escape, interpolate, evaluate, offset) {\n            source += text.slice(index, offset)\n                .replace(escaper, function (match) {\n                    return '\\\\' + escapes[match];\n                });\n\n            if (escape) {\n                source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n            }\n            if (interpolate) {\n                source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n            }\n            if (evaluate) {\n                source += \"';\\n\" + evaluate + \"\\n__p+='\";\n            }\n            index = offset + match.length;\n            return match;\n        });\n        source += \"';\\n\";\n\n        // If a variable is not specified, place data values in local scope.\n        if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n        source = \"var __t,__p='',__j=Array.prototype.join,\" +\n            \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n            source + \"return __p;\\n\";\n\n        try {\n            render = new Function(settings.variable || 'obj', '_', source);\n        } catch (e) {\n            e.source = source;\n            throw e;\n        }\n\n        if (data) return render(data, _);\n        var template = function (data) {\n            return render.call(this, data, _);\n        };\n\n        // Provide the compiled function source as a convenience for precompilation.\n        template.source = 'function(' + (settings.variable || 'obj') + '){\\n' + source + '}';\n\n        return template;\n    };\n\n    // Add a \"chain\" function, which will delegate to the wrapper.\n    _.chain = function (obj) {\n        return _(obj).chain();\n    };\n\n    // OOP\n    // ---------------\n    // If Underscore is called as a function, it returns a wrapped object that\n    // can be used OO-style. This wrapper holds altered versions of all the\n    // underscore functions. Wrapped objects may be chained.\n\n    // Helper function to continue chaining intermediate results.\n    var result = function (obj) {\n        return this._chain ? _(obj).chain() : obj;\n    };\n\n    // Add all of the Underscore functions to the wrapper object.\n    _.mixin(_);\n\n    // Add all mutator Array functions to the wrapper.\n    each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function (name) {\n        var method = ArrayProto[name];\n        _.prototype[name] = function () {\n            var obj = this._wrapped;\n            method.apply(obj, arguments);\n            if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];\n            return result.call(this, obj);\n        };\n    });\n\n    // Add all accessor Array functions to the wrapper.\n    each(['concat', 'join', 'slice'], function (name) {\n        var method = ArrayProto[name];\n        _.prototype[name] = function () {\n            return result.call(this, method.apply(this._wrapped, arguments));\n        };\n    });\n\n    _.extend(_.prototype, {\n\n        // Start chaining a wrapped Underscore object.\n        chain: function () {\n            this._chain = true;\n            return this;\n        },\n\n        // Extracts the result from a wrapped and chained object.\n        value: function () {\n            return this._wrapped;\n        }\n\n    });\n\n}).call(window);", "//     Backbone.js 1.1.2\n\n//     (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Backbone may be freely distributed under the MIT license.\n//     For all details and documentation:\n//     http://backbonejs.org\n\n(function(root, factory) {\n\n  // Set up Backbone appropriately for the environment. Start with AMD.\n  if (typeof define === 'function' && define.amd) {\n    define(['underscore', 'jquery', 'exports'], function(_, $, exports) {\n      // Export global even in AMD case in case this script is loaded with\n      // others that may still expect a global Backbone.\n      root.Backbone = factory(root, exports, _, $);\n    });\n\n  // Next for Node.js or CommonJS. jQuery may not be needed as a module.\n  } else if (typeof exports !== 'undefined') {\n    factory(root, exports, _);\n\n  // Finally, as a browser global.\n  } else {\n    root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$));\n  }\n\n}(this, function(root, Backbone, _, $) {\n\n  // Initial Setup\n  // -------------\n\n  // Save the previous value of the `Backbone` variable, so that it can be\n  // restored later on, if `noConflict` is used.\n  var previousBackbone = root.Backbone;\n\n  // Create local references to array methods we'll want to use later.\n  var array = [];\n  var push = array.push;\n  var slice = array.slice;\n  var splice = array.splice;\n\n  // Current version of the library. Keep in sync with `package.json`.\n  Backbone.VERSION = '1.1.2';\n\n  // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns\n  // the `$` variable.\n  Backbone.$ = $;\n\n  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable\n  // to its previous owner. Returns a reference to this Backbone object.\n  Backbone.noConflict = function() {\n    root.Backbone = previousBackbone;\n    return this;\n  };\n\n  // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option\n  // will fake `\"PATCH\"`, `\"PUT\"` and `\"DELETE\"` requests via the `_method` parameter and\n  // set a `X-Http-Method-Override` header.\n  Backbone.emulateHTTP = false;\n\n  // Turn on `emulateJSON` to support legacy servers that can't deal with direct\n  // `application/json` requests ... will encode the body as\n  // `application/x-www-form-urlencoded` instead and will send the model in a\n  // form param named `model`.\n  Backbone.emulateJSON = false;\n\n  // Backbone.Events\n  // ---------------\n\n  // A module that can be mixed in to *any object* in order to provide it with\n  // custom events. You may bind with `on` or remove with `off` callback\n  // functions to an event; `trigger`-ing an event fires all callbacks in\n  // succession.\n  //\n  //     var object = {};\n  //     _.extend(object, Backbone.Events);\n  //     object.on('expand', function(){ alert('expanded'); });\n  //     object.trigger('expand');\n  //\n  var Events = Backbone.Events = {\n\n    // Bind an event to a `callback` function. Passing `\"all\"` will bind\n    // the callback to all events fired.\n    on: function(name, callback, context) {\n      if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;\n      this._events || (this._events = {});\n      var events = this._events[name] || (this._events[name] = []);\n      events.push({callback: callback, context: context, ctx: context || this});\n      return this;\n    },\n\n    // Bind an event to only be triggered a single time. After the first time\n    // the callback is invoked, it will be removed.\n    once: function(name, callback, context) {\n      if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;\n      var self = this;\n      var once = _.once(function() {\n        self.off(name, once);\n        callback.apply(this, arguments);\n      });\n      once._callback = callback;\n      return this.on(name, once, context);\n    },\n\n    // Remove one or many callbacks. If `context` is null, removes all\n    // callbacks with that function. If `callback` is null, removes all\n    // callbacks for the event. If `name` is null, removes all bound\n    // callbacks for all events.\n    off: function(name, callback, context) {\n      var retain, ev, events, names, i, l, j, k;\n      if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;\n      if (!name && !callback && !context) {\n        this._events = void 0;\n        return this;\n      }\n      names = name ? [name] : _.keys(this._events);\n      for (i = 0, l = names.length; i < l; i++) {\n        name = names[i];\n        if (events = this._events[name]) {\n          this._events[name] = retain = [];\n          if (callback || context) {\n            for (j = 0, k = events.length; j < k; j++) {\n              ev = events[j];\n              if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||\n                  (context && context !== ev.context)) {\n                retain.push(ev);\n              }\n            }\n          }\n          if (!retain.length) delete this._events[name];\n        }\n      }\n\n      return this;\n    },\n\n    // Trigger one or many events, firing all bound callbacks. Callbacks are\n    // passed the same arguments as `trigger` is, apart from the event name\n    // (unless you're listening on `\"all\"`, which will cause your callback to\n    // receive the true name of the event as the first argument).\n    trigger: function(name) {\n      if (!this._events) return this;\n      var args = slice.call(arguments, 1);\n      if (!eventsApi(this, 'trigger', name, args)) return this;\n      var events = this._events[name];\n      var allEvents = this._events.all;\n      if (events) triggerEvents(events, args);\n      if (allEvents) triggerEvents(allEvents, arguments);\n      return this;\n    },\n\n    // Tell this object to stop listening to either specific events ... or\n    // to every object it's currently listening to.\n    stopListening: function(obj, name, callback) {\n      var listeningTo = this._listeningTo;\n      if (!listeningTo) return this;\n      var remove = !name && !callback;\n      if (!callback && typeof name === 'object') callback = this;\n      if (obj) (listeningTo = {})[obj._listenId] = obj;\n      for (var id in listeningTo) {\n        obj = listeningTo[id];\n        obj.off(name, callback, this);\n        if (remove || _.isEmpty(obj._events)) delete this._listeningTo[id];\n      }\n      return this;\n    }\n\n  };\n\n  // Regular expression used to split event strings.\n  var eventSplitter = /\\s+/;\n\n  // Implement fancy features of the Events API such as multiple event\n  // names `\"change blur\"` and jQuery-style event maps `{change: action}`\n  // in terms of the existing API.\n  var eventsApi = function(obj, action, name, rest) {\n    if (!name) return true;\n\n    // Handle event maps.\n    if (typeof name === 'object') {\n      for (var key in name) {\n        obj[action].apply(obj, [key, name[key]].concat(rest));\n      }\n      return false;\n    }\n\n    // Handle space separated event names.\n    if (eventSplitter.test(name)) {\n      var names = name.split(eventSplitter);\n      for (var i = 0, l = names.length; i < l; i++) {\n        obj[action].apply(obj, [names[i]].concat(rest));\n      }\n      return false;\n    }\n\n    return true;\n  };\n\n  // A difficult-to-believe, but optimized internal dispatch function for\n  // triggering events. Tries to keep the usual cases speedy (most internal\n  // Backbone events have 3 arguments).\n  var triggerEvents = function(events, args) {\n    var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];\n    switch (args.length) {\n      case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;\n      case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;\n      case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;\n      case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;\n      default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;\n    }\n  };\n\n  var listenMethods = {listenTo: 'on', listenToOnce: 'once'};\n\n  // Inversion-of-control versions of `on` and `once`. Tell *this* object to\n  // listen to an event in another object ... keeping track of what it's\n  // listening to.\n  _.each(listenMethods, function(implementation, method) {\n    Events[method] = function(obj, name, callback) {\n      var listeningTo = this._listeningTo || (this._listeningTo = {});\n      var id = obj._listenId || (obj._listenId = _.uniqueId('l'));\n      listeningTo[id] = obj;\n      if (!callback && typeof name === 'object') callback = this;\n      obj[implementation](name, callback, this);\n      return this;\n    };\n  });\n\n  // Aliases for backwards compatibility.\n  Events.bind   = Events.on;\n  Events.unbind = Events.off;\n\n  // Allow the `Backbone` object to serve as a global event bus, for folks who\n  // want global \"pubsub\" in a convenient place.\n  _.extend(Backbone, Events);\n\n  // Backbone.Model\n  // --------------\n\n  // Backbone **Models** are the basic data object in the framework --\n  // frequently representing a row in a table in a database on your server.\n  // A discrete chunk of data and a bunch of useful, related methods for\n  // performing computations and transformations on that data.\n\n  // Create a new model with the specified attributes. A client id (`cid`)\n  // is automatically generated and assigned for you.\n  var Model = Backbone.Model = function(attributes, options) {\n    var attrs = attributes || {};\n    options || (options = {});\n    this.cid = _.uniqueId('c');\n    this.attributes = {};\n    if (options.collection) this.collection = options.collection;\n    if (options.parse) attrs = this.parse(attrs, options) || {};\n    attrs = _.defaults({}, attrs, _.result(this, 'defaults'));\n    this.set(attrs, options);\n    this.changed = {};\n    this.initialize.apply(this, arguments);\n  };\n\n  // Attach all inheritable methods to the Model prototype.\n  _.extend(Model.prototype, Events, {\n\n    // A hash of attributes whose current and previous value differ.\n    changed: null,\n\n    // The value returned during the last failed validation.\n    validationError: null,\n\n    // The default name for the JSON `id` attribute is `\"id\"`. MongoDB and\n    // CouchDB users may want to set this to `\"_id\"`.\n    idAttribute: 'id',\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Return a copy of the model's `attributes` object.\n    toJSON: function(options) {\n      return _.clone(this.attributes);\n    },\n\n    // Proxy `Backbone.sync` by default -- but override this if you need\n    // custom syncing semantics for *this* particular model.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Get the value of an attribute.\n    get: function(attr) {\n      return this.attributes[attr];\n    },\n\n    // Get the HTML-escaped value of an attribute.\n    escape: function(attr) {\n      return _.escape(this.get(attr));\n    },\n\n    // Returns `true` if the attribute contains a value that is not null\n    // or undefined.\n    has: function(attr) {\n      return this.get(attr) != null;\n    },\n\n    // Set a hash of model attributes on the object, firing `\"change\"`. This is\n    // the core primitive operation of a model, updating the data and notifying\n    // anyone who needs to know about the change in state. The heart of the beast.\n    set: function(key, val, options) {\n      var attr, attrs, unset, changes, silent, changing, prev, current;\n      if (key == null) return this;\n\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      if (typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options || (options = {});\n\n      // Run validation.\n      if (!this._validate(attrs, options)) return false;\n\n      // Extract attributes and options.\n      unset           = options.unset;\n      silent          = options.silent;\n      changes         = [];\n      changing        = this._changing;\n      this._changing  = true;\n\n      if (!changing) {\n        this._previousAttributes = _.clone(this.attributes);\n        this.changed = {};\n      }\n      current = this.attributes, prev = this._previousAttributes;\n\n      // Check for changes of `id`.\n      if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];\n\n      // For each `set` attribute, update or delete the current value.\n      for (attr in attrs) {\n        val = attrs[attr];\n        if (!_.isEqual(current[attr], val)) changes.push(attr);\n        if (!_.isEqual(prev[attr], val)) {\n          this.changed[attr] = val;\n        } else {\n          delete this.changed[attr];\n        }\n        unset ? delete current[attr] : current[attr] = val;\n      }\n\n      // Trigger all relevant attribute changes.\n      if (!silent) {\n        if (changes.length) this._pending = options;\n        for (var i = 0, l = changes.length; i < l; i++) {\n          this.trigger('change:' + changes[i], this, current[changes[i]], options);\n        }\n      }\n\n      // You might be wondering why there's a `while` loop here. Changes can\n      // be recursively nested within `\"change\"` events.\n      if (changing) return this;\n      if (!silent) {\n        while (this._pending) {\n          options = this._pending;\n          this._pending = false;\n          this.trigger('change', this, options);\n        }\n      }\n      this._pending = false;\n      this._changing = false;\n      return this;\n    },\n\n    // Remove an attribute from the model, firing `\"change\"`. `unset` is a noop\n    // if the attribute doesn't exist.\n    unset: function(attr, options) {\n      return this.set(attr, void 0, _.extend({}, options, {unset: true}));\n    },\n\n    // Clear all attributes on the model, firing `\"change\"`.\n    clear: function(options) {\n      var attrs = {};\n      for (var key in this.attributes) attrs[key] = void 0;\n      return this.set(attrs, _.extend({}, options, {unset: true}));\n    },\n\n    // Determine if the model has changed since the last `\"change\"` event.\n    // If you specify an attribute name, determine if that attribute has changed.\n    hasChanged: function(attr) {\n      if (attr == null) return !_.isEmpty(this.changed);\n      return _.has(this.changed, attr);\n    },\n\n    // Return an object containing all the attributes that have changed, or\n    // false if there are no changed attributes. Useful for determining what\n    // parts of a view need to be updated and/or what attributes need to be\n    // persisted to the server. Unset attributes will be set to undefined.\n    // You can also pass an attributes object to diff against the model,\n    // determining if there *would be* a change.\n    changedAttributes: function(diff) {\n      if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;\n      var val, changed = false;\n      var old = this._changing ? this._previousAttributes : this.attributes;\n      for (var attr in diff) {\n        if (_.isEqual(old[attr], (val = diff[attr]))) continue;\n        (changed || (changed = {}))[attr] = val;\n      }\n      return changed;\n    },\n\n    // Get the previous value of an attribute, recorded at the time the last\n    // `\"change\"` event was fired.\n    previous: function(attr) {\n      if (attr == null || !this._previousAttributes) return null;\n      return this._previousAttributes[attr];\n    },\n\n    // Get all of the attributes of the model at the time of the previous\n    // `\"change\"` event.\n    previousAttributes: function() {\n      return _.clone(this._previousAttributes);\n    },\n\n    // Fetch the model from the server. If the server's representation of the\n    // model differs from its current attributes, they will be overridden,\n    // triggering a `\"change\"` event.\n    fetch: function(options) {\n      options = options ? _.clone(options) : {};\n      if (options.parse === void 0) options.parse = true;\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        if (!model.set(model.parse(resp, options), options)) return false;\n        if (success) success(model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Set a hash of model attributes, and sync the model to the server.\n    // If the server returns an attributes hash that differs, the model's\n    // state will be `set` again.\n    save: function(key, val, options) {\n      var attrs, method, xhr, attributes = this.attributes;\n\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      if (key == null || typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options = _.extend({validate: true}, options);\n\n      // If we're not waiting and attributes exist, save acts as\n      // `set(attr).save(null, opts)` with validation. Otherwise, check if\n      // the model will be valid when the attributes, if any, are set.\n      if (attrs && !options.wait) {\n        if (!this.set(attrs, options)) return false;\n      } else {\n        if (!this._validate(attrs, options)) return false;\n      }\n\n      // Set temporary attributes if `{wait: true}`.\n      if (attrs && options.wait) {\n        this.attributes = _.extend({}, attributes, attrs);\n      }\n\n      // After a successful server-side save, the client is (optionally)\n      // updated with the server-side state.\n      if (options.parse === void 0) options.parse = true;\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        // Ensure attributes are restored during synchronous saves.\n        model.attributes = attributes;\n        var serverAttrs = model.parse(resp, options);\n        if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);\n        if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {\n          return false;\n        }\n        if (success) success(model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n\n      method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');\n      if (method === 'patch') options.attrs = attrs;\n      xhr = this.sync(method, this, options);\n\n      // Restore attributes.\n      if (attrs && options.wait) this.attributes = attributes;\n\n      return xhr;\n    },\n\n    // Destroy this model on the server if it was already persisted.\n    // Optimistically removes the model from its collection, if it has one.\n    // If `wait: true` is passed, waits for the server to respond before removal.\n    destroy: function(options) {\n      options = options ? _.clone(options) : {};\n      var model = this;\n      var success = options.success;\n\n      var destroy = function() {\n        model.trigger('destroy', model, model.collection, options);\n      };\n\n      options.success = function(resp) {\n        if (options.wait || model.isNew()) destroy();\n        if (success) success(model, resp, options);\n        if (!model.isNew()) model.trigger('sync', model, resp, options);\n      };\n\n      if (this.isNew()) {\n        options.success();\n        return false;\n      }\n      wrapError(this, options);\n\n      var xhr = this.sync('delete', this, options);\n      if (!options.wait) destroy();\n      return xhr;\n    },\n\n    // Default URL for the model's representation on the server -- if you're\n    // using Backbone's restful methods, override this to change the endpoint\n    // that will be called.\n    url: function() {\n      var base =\n        _.result(this, 'urlRoot') ||\n        _.result(this.collection, 'url') ||\n        urlError();\n      if (this.isNew()) return base;\n      return base.replace(/([^\\/])$/, '$1/') + encodeURIComponent(this.id);\n    },\n\n    // **parse** converts a response into the hash of attributes to be `set` on\n    // the model. The default implementation is just to pass the response along.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new model with identical attributes to this one.\n    clone: function() {\n      return new this.constructor(this.attributes);\n    },\n\n    // A model is new if it has never been saved to the server, and lacks an id.\n    isNew: function() {\n      return !this.has(this.idAttribute);\n    },\n\n    // Check if the model is currently in a valid state.\n    isValid: function(options) {\n      return this._validate({}, _.extend(options || {}, { validate: true }));\n    },\n\n    // Run validation against the next complete set of model attributes,\n    // returning `true` if all is well. Otherwise, fire an `\"invalid\"` event.\n    _validate: function(attrs, options) {\n      if (!options.validate || !this.validate) return true;\n      attrs = _.extend({}, this.attributes, attrs);\n      var error = this.validationError = this.validate(attrs, options) || null;\n      if (!error) return true;\n      this.trigger('invalid', this, error, _.extend(options, {validationError: error}));\n      return false;\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Model.\n  var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit'];\n\n  // Mix in each Underscore method as a proxy to `Model#attributes`.\n  _.each(modelMethods, function(method) {\n    Model.prototype[method] = function() {\n      var args = slice.call(arguments);\n      args.unshift(this.attributes);\n      return _[method].apply(_, args);\n    };\n  });\n\n  // Backbone.Collection\n  // -------------------\n\n  // If models tend to represent a single row of data, a Backbone Collection is\n  // more analagous to a table full of data ... or a small slice or page of that\n  // table, or a collection of rows that belong together for a particular reason\n  // -- all of the messages in this particular folder, all of the documents\n  // belonging to this particular author, and so on. Collections maintain\n  // indexes of their models, both in order, and for lookup by `id`.\n\n  // Create a new **Collection**, perhaps to contain a specific type of `model`.\n  // If a `comparator` is specified, the Collection will maintain\n  // its models in sort order, as they're added and removed.\n  var Collection = Backbone.Collection = function(models, options) {\n    options || (options = {});\n    if (options.model) this.model = options.model;\n    if (options.comparator !== void 0) this.comparator = options.comparator;\n    this._reset();\n    this.initialize.apply(this, arguments);\n    if (models) this.reset(models, _.extend({silent: true}, options));\n  };\n\n  // Default options for `Collection#set`.\n  var setOptions = {add: true, remove: true, merge: true};\n  var addOptions = {add: true, remove: false};\n\n  // Define the Collection's inheritable methods.\n  _.extend(Collection.prototype, Events, {\n\n    // The default model for a collection is just a **Backbone.Model**.\n    // This should be overridden in most cases.\n    model: Model,\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // The JSON representation of a Collection is an array of the\n    // models' attributes.\n    toJSON: function(options) {\n      return this.map(function(model){ return model.toJSON(options); });\n    },\n\n    // Proxy `Backbone.sync` by default.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Add a model, or list of models to the set.\n    add: function(models, options) {\n      return this.set(models, _.extend({merge: false}, options, addOptions));\n    },\n\n    // Remove a model, or a list of models from the set.\n    remove: function(models, options) {\n      var singular = !_.isArray(models);\n      models = singular ? [models] : _.clone(models);\n      options || (options = {});\n      var i, l, index, model;\n      for (i = 0, l = models.length; i < l; i++) {\n        model = models[i] = this.get(models[i]);\n        if (!model) continue;\n        delete this._byId[model.id];\n        delete this._byId[model.cid];\n        index = this.indexOf(model);\n        this.models.splice(index, 1);\n        this.length--;\n        if (!options.silent) {\n          options.index = index;\n          model.trigger('remove', model, this, options);\n        }\n        this._removeReference(model, options);\n      }\n      return singular ? models[0] : models;\n    },\n\n    // Update a collection by `set`-ing a new list of models, adding new ones,\n    // removing models that are no longer present, and merging models that\n    // already exist in the collection, as necessary. Similar to **Model#set**,\n    // the core operation for updating the data contained by the collection.\n    set: function(models, options) {\n      options = _.defaults({}, options, setOptions);\n      if (options.parse) models = this.parse(models, options);\n      var singular = !_.isArray(models);\n      models = singular ? (models ? [models] : []) : _.clone(models);\n      var i, l, id, model, attrs, existing, sort;\n      var at = options.at;\n      var targetModel = this.model;\n      var sortable = this.comparator && (at == null) && options.sort !== false;\n      var sortAttr = _.isString(this.comparator) ? this.comparator : null;\n      var toAdd = [], toRemove = [], modelMap = {};\n      var add = options.add, merge = options.merge, remove = options.remove;\n      var order = !sortable && add && remove ? [] : false;\n\n      // Turn bare objects into model references, and prevent invalid models\n      // from being added.\n      for (i = 0, l = models.length; i < l; i++) {\n        attrs = models[i] || {};\n        if (attrs instanceof Model) {\n          id = model = attrs;\n        } else {\n          id = attrs[targetModel.prototype.idAttribute || 'id'];\n        }\n\n        // If a duplicate is found, prevent it from being added and\n        // optionally merge it into the existing model.\n        if (existing = this.get(id)) {\n          if (remove) modelMap[existing.cid] = true;\n          if (merge) {\n            attrs = attrs === model ? model.attributes : attrs;\n            if (options.parse) attrs = existing.parse(attrs, options);\n            existing.set(attrs, options);\n            if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;\n          }\n          models[i] = existing;\n\n        // If this is a new, valid model, push it to the `toAdd` list.\n        } else if (add) {\n          model = models[i] = this._prepareModel(attrs, options);\n          if (!model) continue;\n          toAdd.push(model);\n          this._addReference(model, options);\n        }\n\n        // Do not add multiple models with the same `id`.\n        model = existing || model;\n        if (order && (model.isNew() || !modelMap[model.id])) order.push(model);\n        modelMap[model.id] = true;\n      }\n\n      // Remove nonexistent models if appropriate.\n      if (remove) {\n        for (i = 0, l = this.length; i < l; ++i) {\n          if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);\n        }\n        if (toRemove.length) this.remove(toRemove, options);\n      }\n\n      // See if sorting is needed, update `length` and splice in new models.\n      if (toAdd.length || (order && order.length)) {\n        if (sortable) sort = true;\n        this.length += toAdd.length;\n        if (at != null) {\n          for (i = 0, l = toAdd.length; i < l; i++) {\n            this.models.splice(at + i, 0, toAdd[i]);\n          }\n        } else {\n          if (order) this.models.length = 0;\n          var orderedModels = order || toAdd;\n          for (i = 0, l = orderedModels.length; i < l; i++) {\n            this.models.push(orderedModels[i]);\n          }\n        }\n      }\n\n      // Silently sort the collection if appropriate.\n      if (sort) this.sort({silent: true});\n\n      // Unless silenced, it's time to fire all appropriate add/sort events.\n      if (!options.silent) {\n        for (i = 0, l = toAdd.length; i < l; i++) {\n          (model = toAdd[i]).trigger('add', model, this, options);\n        }\n        if (sort || (order && order.length)) this.trigger('sort', this, options);\n      }\n\n      // Return the added (or merged) model (or models).\n      return singular ? models[0] : models;\n    },\n\n    // When you have more items than you want to add or remove individually,\n    // you can reset the entire set with a new list of models, without firing\n    // any granular `add` or `remove` events. Fires `reset` when finished.\n    // Useful for bulk operations and optimizations.\n    reset: function(models, options) {\n      options || (options = {});\n      for (var i = 0, l = this.models.length; i < l; i++) {\n        this._removeReference(this.models[i], options);\n      }\n      options.previousModels = this.models;\n      this._reset();\n      models = this.add(models, _.extend({silent: true}, options));\n      if (!options.silent) this.trigger('reset', this, options);\n      return models;\n    },\n\n    // Add a model to the end of the collection.\n    push: function(model, options) {\n      return this.add(model, _.extend({at: this.length}, options));\n    },\n\n    // Remove a model from the end of the collection.\n    pop: function(options) {\n      var model = this.at(this.length - 1);\n      this.remove(model, options);\n      return model;\n    },\n\n    // Add a model to the beginning of the collection.\n    unshift: function(model, options) {\n      return this.add(model, _.extend({at: 0}, options));\n    },\n\n    // Remove a model from the beginning of the collection.\n    shift: function(options) {\n      var model = this.at(0);\n      this.remove(model, options);\n      return model;\n    },\n\n    // Slice out a sub-array of models from the collection.\n    slice: function() {\n      return slice.apply(this.models, arguments);\n    },\n\n    // Get a model from the set by id.\n    get: function(obj) {\n      if (obj == null) return void 0;\n      return this._byId[obj] || this._byId[obj.id] || this._byId[obj.cid];\n    },\n\n    // Get the model at the given index.\n    at: function(index) {\n      return this.models[index];\n    },\n\n    // Return models with matching attributes. Useful for simple cases of\n    // `filter`.\n    where: function(attrs, first) {\n      if (_.isEmpty(attrs)) return first ? void 0 : [];\n      return this[first ? 'find' : 'filter'](function(model) {\n        for (var key in attrs) {\n          if (attrs[key] !== model.get(key)) return false;\n        }\n        return true;\n      });\n    },\n\n    // Return the first model with matching attributes. Useful for simple cases\n    // of `find`.\n    findWhere: function(attrs) {\n      return this.where(attrs, true);\n    },\n\n    // Force the collection to re-sort itself. You don't need to call this under\n    // normal circumstances, as the set will maintain sort order as each item\n    // is added.\n    sort: function(options) {\n      if (!this.comparator) throw new Error('Cannot sort a set without a comparator');\n      options || (options = {});\n\n      // Run sort based on type of `comparator`.\n      if (_.isString(this.comparator) || this.comparator.length === 1) {\n        this.models = this.sortBy(this.comparator, this);\n      } else {\n        this.models.sort(_.bind(this.comparator, this));\n      }\n\n      if (!options.silent) this.trigger('sort', this, options);\n      return this;\n    },\n\n    // Pluck an attribute from each model in the collection.\n    pluck: function(attr) {\n      return _.invoke(this.models, 'get', attr);\n    },\n\n    // Fetch the default set of models for this collection, resetting the\n    // collection when they arrive. If `reset: true` is passed, the response\n    // data will be passed through the `reset` method instead of `set`.\n    fetch: function(options) {\n      options = options ? _.clone(options) : {};\n      if (options.parse === void 0) options.parse = true;\n      var success = options.success;\n      var collection = this;\n      options.success = function(resp) {\n        var method = options.reset ? 'reset' : 'set';\n        collection[method](resp, options);\n        if (success) success(collection, resp, options);\n        collection.trigger('sync', collection, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Create a new instance of a model in this collection. Add the model to the\n    // collection immediately, unless `wait: true` is passed, in which case we\n    // wait for the server to agree.\n    create: function(model, options) {\n      options = options ? _.clone(options) : {};\n      if (!(model = this._prepareModel(model, options))) return false;\n      if (!options.wait) this.add(model, options);\n      var collection = this;\n      var success = options.success;\n      options.success = function(model, resp) {\n        if (options.wait) collection.add(model, options);\n        if (success) success(model, resp, options);\n      };\n      model.save(null, options);\n      return model;\n    },\n\n    // **parse** converts a response into a list of models to be added to the\n    // collection. The default implementation is just to pass it through.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new collection with an identical list of models as this one.\n    clone: function() {\n      return new this.constructor(this.models);\n    },\n\n    // Private method to reset all internal state. Called when the collection\n    // is first initialized or reset.\n    _reset: function() {\n      this.length = 0;\n      this.models = [];\n      this._byId  = {};\n    },\n\n    // Prepare a hash of attributes (or other model) to be added to this\n    // collection.\n    _prepareModel: function(attrs, options) {\n      if (attrs instanceof Model) return attrs;\n      options = options ? _.clone(options) : {};\n      options.collection = this;\n      var model = new this.model(attrs, options);\n      if (!model.validationError) return model;\n      this.trigger('invalid', this, model.validationError, options);\n      return false;\n    },\n\n    // Internal method to create a model's ties to a collection.\n    _addReference: function(model, options) {\n      this._byId[model.cid] = model;\n      if (model.id != null) this._byId[model.id] = model;\n      if (!model.collection) model.collection = this;\n      model.on('all', this._onModelEvent, this);\n    },\n\n    // Internal method to sever a model's ties to a collection.\n    _removeReference: function(model, options) {\n      if (this === model.collection) delete model.collection;\n      model.off('all', this._onModelEvent, this);\n    },\n\n    // Internal method called every time a model in the set fires an event.\n    // Sets need to update their indexes when models change ids. All other\n    // events simply proxy through. \"add\" and \"remove\" events that originate\n    // in other collections are ignored.\n    _onModelEvent: function(event, model, collection, options) {\n      if ((event === 'add' || event === 'remove') && collection !== this) return;\n      if (event === 'destroy') this.remove(model, options);\n      if (model && event === 'change:' + model.idAttribute) {\n        delete this._byId[model.previous(model.idAttribute)];\n        if (model.id != null) this._byId[model.id] = model;\n      }\n      this.trigger.apply(this, arguments);\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Collection.\n  // 90% of the core usefulness of Backbone Collections is actually implemented\n  // right here:\n  var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',\n    'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',\n    'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',\n    'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',\n    'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle',\n    'lastIndexOf', 'isEmpty', 'chain', 'sample'];\n\n  // Mix in each Underscore method as a proxy to `Collection#models`.\n  _.each(methods, function(method) {\n    Collection.prototype[method] = function() {\n      var args = slice.call(arguments);\n      args.unshift(this.models);\n      return _[method].apply(_, args);\n    };\n  });\n\n  // Underscore methods that take a property name as an argument.\n  var attributeMethods = ['groupBy', 'countBy', 'sortBy', 'indexBy'];\n\n  // Use attributes instead of properties.\n  _.each(attributeMethods, function(method) {\n    Collection.prototype[method] = function(value, context) {\n      var iterator = _.isFunction(value) ? value : function(model) {\n        return model.get(value);\n      };\n      return _[method](this.models, iterator, context);\n    };\n  });\n\n  // Backbone.View\n  // -------------\n\n  // Backbone Views are almost more convention than they are actual code. A View\n  // is simply a JavaScript object that represents a logical chunk of UI in the\n  // DOM. This might be a single item, an entire list, a sidebar or panel, or\n  // even the surrounding frame which wraps your whole app. Defining a chunk of\n  // UI as a **View** allows you to define your DOM events declaratively, without\n  // having to worry about render order ... and makes it easy for the view to\n  // react to specific changes in the state of your models.\n\n  // Creating a Backbone.View creates its initial element outside of the DOM,\n  // if an existing element is not provided...\n  var View = Backbone.View = function(options) {\n    this.cid = _.uniqueId('view');\n    options || (options = {});\n    _.extend(this, _.pick(options, viewOptions));\n    this._ensureElement();\n    this.initialize.apply(this, arguments);\n    this.delegateEvents();\n  };\n\n  // Cached regex to split keys for `delegate`.\n  var delegateEventSplitter = /^(\\S+)\\s*(.*)$/;\n\n  // List of view options to be merged as properties.\n  var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];\n\n  // Set up all inheritable **Backbone.View** properties and methods.\n  _.extend(View.prototype, Events, {\n\n    // The default `tagName` of a View's element is `\"div\"`.\n    tagName: 'div',\n\n    // jQuery delegate for element lookup, scoped to DOM elements within the\n    // current view. This should be preferred to global lookups where possible.\n    $: function(selector) {\n      return this.$el.find(selector);\n    },\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // **render** is the core function that your view should override, in order\n    // to populate its element (`this.el`), with the appropriate HTML. The\n    // convention is for **render** to always return `this`.\n    render: function() {\n      return this;\n    },\n\n    // Remove this view by taking the element out of the DOM, and removing any\n    // applicable Backbone.Events listeners.\n    remove: function() {\n      this.$el.remove();\n      this.stopListening();\n      return this;\n    },\n\n    // Change the view's element (`this.el` property), including event\n    // re-delegation.\n    setElement: function(element, delegate) {\n      if (this.$el) this.undelegateEvents();\n      this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);\n      this.el = this.$el[0];\n      if (delegate !== false) this.delegateEvents();\n      return this;\n    },\n\n    // Set callbacks, where `this.events` is a hash of\n    //\n    // *{\"event selector\": \"callback\"}*\n    //\n    //     {\n    //       'mousedown .title':  'edit',\n    //       'click .button':     'save',\n    //       'click .open':       function(e) { ... }\n    //     }\n    //\n    // pairs. Callbacks will be bound to the view, with `this` set properly.\n    // Uses event delegation for efficiency.\n    // Omitting the selector binds the event to `this.el`.\n    // This only works for delegate-able events: not `focus`, `blur`, and\n    // not `change`, `submit`, and `reset` in Internet Explorer.\n    delegateEvents: function(events) {\n      if (!(events || (events = _.result(this, 'events')))) return this;\n      this.undelegateEvents();\n      for (var key in events) {\n        var method = events[key];\n        if (!_.isFunction(method)) method = this[events[key]];\n        if (!method) continue;\n\n        var match = key.match(delegateEventSplitter);\n        var eventName = match[1], selector = match[2];\n        method = _.bind(method, this);\n        eventName += '.delegateEvents' + this.cid;\n        if (selector === '') {\n          this.$el.on(eventName, method);\n        } else {\n          this.$el.on(eventName, selector, method);\n        }\n      }\n      return this;\n    },\n\n    // Clears all callbacks previously bound to the view with `delegateEvents`.\n    // You usually don't need to use this, but may wish to if you have multiple\n    // Backbone views attached to the same DOM element.\n    undelegateEvents: function() {\n      this.$el.off('.delegateEvents' + this.cid);\n      return this;\n    },\n\n    // Ensure that the View has a DOM element to render into.\n    // If `this.el` is a string, pass it through `$()`, take the first\n    // matching element, and re-assign it to `el`. Otherwise, create\n    // an element from the `id`, `className` and `tagName` properties.\n    _ensureElement: function() {\n      if (!this.el) {\n        var attrs = _.extend({}, _.result(this, 'attributes'));\n        if (this.id) attrs.id = _.result(this, 'id');\n        if (this.className) attrs['class'] = _.result(this, 'className');\n        var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs);\n        this.setElement($el, false);\n      } else {\n        this.setElement(_.result(this, 'el'), false);\n      }\n    }\n\n  });\n\n  // Backbone.sync\n  // -------------\n\n  // Override this function to change the manner in which Backbone persists\n  // models to the server. You will be passed the type of request, and the\n  // model in question. By default, makes a RESTful Ajax request\n  // to the model's `url()`. Some possible customizations could be:\n  //\n  // * Use `setTimeout` to batch rapid-fire updates into a single request.\n  // * Send up the models as XML instead of JSON.\n  // * Persist models via WebSockets instead of Ajax.\n  //\n  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests\n  // as `POST`, with a `_method` parameter containing the true HTTP method,\n  // as well as all requests with the body as `application/x-www-form-urlencoded`\n  // instead of `application/json` with the model in a param named `model`.\n  // Useful when interfacing with server-side languages like **PHP** that make\n  // it difficult to read the body of `PUT` requests.\n  Backbone.sync = function(method, model, options) {\n    var type = methodMap[method];\n\n    // Default options, unless specified.\n    _.defaults(options || (options = {}), {\n      emulateHTTP: Backbone.emulateHTTP,\n      emulateJSON: Backbone.emulateJSON\n    });\n\n    // Default JSON-request options.\n    var params = {type: type, dataType: 'json'};\n\n    // Ensure that we have a URL.\n    if (!options.url) {\n      params.url = _.result(model, 'url') || urlError();\n    }\n\n    // Ensure that we have the appropriate request data.\n    if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {\n      params.contentType = 'application/json';\n      params.data = JSON.stringify(options.attrs || model.toJSON(options));\n    }\n\n    // For older servers, emulate JSON by encoding the request into an HTML-form.\n    if (options.emulateJSON) {\n      params.contentType = 'application/x-www-form-urlencoded';\n      params.data = params.data ? {model: params.data} : {};\n    }\n\n    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`\n    // And an `X-HTTP-Method-Override` header.\n    if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) {\n      params.type = 'POST';\n      if (options.emulateJSON) params.data._method = type;\n      var beforeSend = options.beforeSend;\n      options.beforeSend = function(xhr) {\n        xhr.setRequestHeader('X-HTTP-Method-Override', type);\n        if (beforeSend) return beforeSend.apply(this, arguments);\n      };\n    }\n\n    // Don't process data on a non-GET request.\n    if (params.type !== 'GET' && !options.emulateJSON) {\n      params.processData = false;\n    }\n\n    // If we're sending a `PATCH` request, and we're in an old Internet Explorer\n    // that still has ActiveX enabled by default, override jQuery to use that\n    // for XHR instead. Remove this line when jQuery supports `PATCH` on IE8.\n    if (params.type === 'PATCH' && noXhrPatch) {\n      params.xhr = function() {\n        return new ActiveXObject(\"Microsoft.XMLHTTP\");\n      };\n    }\n\n    // Make the request, allowing the user to override any Ajax options.\n    var xhr = options.xhr = Backbone.ajax(_.extend(params, options));\n    model.trigger('request', model, xhr, options);\n    return xhr;\n  };\n\n  var noXhrPatch =\n    typeof window !== 'undefined' && !!window.ActiveXObject &&\n      !(window.XMLHttpRequest && (new XMLHttpRequest).dispatchEvent);\n\n  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.\n  var methodMap = {\n    'create': 'POST',\n    'update': 'PUT',\n    'patch':  'PATCH',\n    'delete': 'DELETE',\n    'read':   'GET'\n  };\n\n  // Set the default implementation of `Backbone.ajax` to proxy through to `$`.\n  // Override this if you'd like to use a different library.\n  Backbone.ajax = function() {\n    return Backbone.$.ajax.apply(Backbone.$, arguments);\n  };\n\n  // Backbone.Router\n  // ---------------\n\n  // Routers map faux-URLs to actions, and fire events when routes are\n  // matched. Creating a new one sets its `routes` hash, if not set statically.\n  var Router = Backbone.Router = function(options) {\n    options || (options = {});\n    if (options.routes) this.routes = options.routes;\n    this._bindRoutes();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Cached regular expressions for matching named param parts and splatted\n  // parts of route strings.\n  var optionalParam = /\\((.*?)\\)/g;\n  var namedParam    = /(\\(\\?)?:\\w+/g;\n  var splatParam    = /\\*\\w+/g;\n  var escapeRegExp  = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n\n  // Set up all inheritable **Backbone.Router** properties and methods.\n  _.extend(Router.prototype, Events, {\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Manually bind a single named route to a callback. For example:\n    //\n    //     this.route('search/:query/p:num', 'search', function(query, num) {\n    //       ...\n    //     });\n    //\n    route: function(route, name, callback) {\n      if (!_.isRegExp(route)) route = this._routeToRegExp(route);\n      if (_.isFunction(name)) {\n        callback = name;\n        name = '';\n      }\n      if (!callback) callback = this[name];\n      var router = this;\n      Backbone.history.route(route, function(fragment) {\n        var args = router._extractParameters(route, fragment);\n        router.execute(callback, args);\n        router.trigger.apply(router, ['route:' + name].concat(args));\n        router.trigger('route', name, args);\n        Backbone.history.trigger('route', router, name, args);\n      });\n      return this;\n    },\n\n    // Execute a route handler with the provided parameters.  This is an\n    // excellent place to do pre-route setup or post-route cleanup.\n    execute: function(callback, args) {\n      if (callback) callback.apply(this, args);\n    },\n\n    // Simple proxy to `Backbone.history` to save a fragment into the history.\n    navigate: function(fragment, options) {\n      Backbone.history.navigate(fragment, options);\n      return this;\n    },\n\n    // Bind all defined routes to `Backbone.history`. We have to reverse the\n    // order of the routes here to support behavior where the most general\n    // routes can be defined at the bottom of the route map.\n    _bindRoutes: function() {\n      if (!this.routes) return;\n      this.routes = _.result(this, 'routes');\n      var route, routes = _.keys(this.routes);\n      while ((route = routes.pop()) != null) {\n        this.route(route, this.routes[route]);\n      }\n    },\n\n    // Convert a route string into a regular expression, suitable for matching\n    // against the current location hash.\n    _routeToRegExp: function(route) {\n      route = route.replace(escapeRegExp, '\\\\$&')\n                   .replace(optionalParam, '(?:$1)?')\n                   .replace(namedParam, function(match, optional) {\n                     return optional ? match : '([^/?]+)';\n                   })\n                   .replace(splatParam, '([^?]*?)');\n      return new RegExp('^' + route + '(?:\\\\?([\\\\s\\\\S]*))?$');\n    },\n\n    // Given a route, and a URL fragment that it matches, return the array of\n    // extracted decoded parameters. Empty or unmatched parameters will be\n    // treated as `null` to normalize cross-browser behavior.\n    _extractParameters: function(route, fragment) {\n      var params = route.exec(fragment).slice(1);\n      return _.map(params, function(param, i) {\n        // Don't decode the search params.\n        if (i === params.length - 1) return param || null;\n        return param ? decodeURIComponent(param) : null;\n      });\n    }\n\n  });\n\n  // Backbone.History\n  // ----------------\n\n  // Handles cross-browser history management, based on either\n  // [pushState](http://diveintohtml5.info/history.html) and real URLs, or\n  // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)\n  // and URL fragments. If the browser supports neither (old IE, natch),\n  // falls back to polling.\n  var History = Backbone.History = function() {\n    this.handlers = [];\n    _.bindAll(this, 'checkUrl');\n\n    // Ensure that `History` can be used outside of the browser.\n    if (typeof window !== 'undefined') {\n      this.location = window.location;\n      this.history = window.history;\n    }\n  };\n\n  // Cached regex for stripping a leading hash/slash and trailing space.\n  var routeStripper = /^[#\\/]|\\s+$/g;\n\n  // Cached regex for stripping leading and trailing slashes.\n  var rootStripper = /^\\/+|\\/+$/g;\n\n  // Cached regex for detecting MSIE.\n  var isExplorer = /msie [\\w.]+/;\n\n  // Cached regex for removing a trailing slash.\n  var trailingSlash = /\\/$/;\n\n  // Cached regex for stripping urls of hash.\n  var pathStripper = /#.*$/;\n\n  // Has the history handling already been started?\n  History.started = false;\n\n  // Set up all inheritable **Backbone.History** properties and methods.\n  _.extend(History.prototype, Events, {\n\n    // The default interval to poll for hash changes, if necessary, is\n    // twenty times a second.\n    interval: 50,\n\n    // Are we at the app root?\n    atRoot: function() {\n      return this.location.pathname.replace(/[^\\/]$/, '$&/') === this.root;\n    },\n\n    // Gets the true hash value. Cannot use location.hash directly due to bug\n    // in Firefox where location.hash will always be decoded.\n    getHash: function(window) {\n      var match = (window || this).location.href.match(/#(.*)$/);\n      return match ? match[1] : '';\n    },\n\n    // Get the cross-browser normalized URL fragment, either from the URL,\n    // the hash, or the override.\n    getFragment: function(fragment, forcePushState) {\n      if (fragment == null) {\n        if (this._hasPushState || !this._wantsHashChange || forcePushState) {\n          fragment = decodeURI(this.location.pathname + this.location.search);\n          var root = this.root.replace(trailingSlash, '');\n          if (!fragment.indexOf(root)) fragment = fragment.slice(root.length);\n        } else {\n          fragment = this.getHash();\n        }\n      }\n      return fragment.replace(routeStripper, '');\n    },\n\n    // Start the hash change handling, returning `true` if the current URL matches\n    // an existing route, and `false` otherwise.\n    start: function(options) {\n      if (History.started) throw new Error(\"Backbone.history has already been started\");\n      History.started = true;\n\n      // Figure out the initial configuration. Do we need an iframe?\n      // Is pushState desired ... is it available?\n      this.options          = _.extend({root: '/'}, this.options, options);\n      this.root             = this.options.root;\n      this._wantsHashChange = this.options.hashChange !== false;\n      this._wantsPushState  = !!this.options.pushState;\n      this._hasPushState    = !!(this.options.pushState && this.history && this.history.pushState);\n      var fragment          = this.getFragment();\n      var docMode           = document.documentMode;\n      var oldIE             = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));\n\n      // Normalize root to always include a leading and trailing slash.\n      this.root = ('/' + this.root + '/').replace(rootStripper, '/');\n\n      if (oldIE && this._wantsHashChange) {\n        var frame = Backbone.$('<iframe src=\"javascript:0\" tabindex=\"-1\">');\n        this.iframe = frame.hide().appendTo('body')[0].contentWindow;\n        this.navigate(fragment);\n      }\n\n      // Depending on whether we're using pushState or hashes, and whether\n      // 'onhashchange' is supported, determine how we check the URL state.\n      if (this._hasPushState) {\n        Backbone.$(window).on('popstate', this.checkUrl);\n      } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {\n        Backbone.$(window).on('hashchange', this.checkUrl);\n      } else if (this._wantsHashChange) {\n        this._checkUrlInterval = setInterval(this.checkUrl, this.interval);\n      }\n\n      // Determine if we need to change the base url, for a pushState link\n      // opened by a non-pushState browser.\n      this.fragment = fragment;\n      var loc = this.location;\n\n      // Transition from hashChange to pushState or vice versa if both are\n      // requested.\n      if (this._wantsHashChange && this._wantsPushState) {\n\n        // If we've started off with a route from a `pushState`-enabled\n        // browser, but we're currently in a browser that doesn't support it...\n        if (!this._hasPushState && !this.atRoot()) {\n          this.fragment = this.getFragment(null, true);\n          this.location.replace(this.root + '#' + this.fragment);\n          // Return immediately as browser will do redirect to new url\n          return true;\n\n        // Or if we've started out with a hash-based route, but we're currently\n        // in a browser where it could be `pushState`-based instead...\n        } else if (this._hasPushState && this.atRoot() && loc.hash) {\n          this.fragment = this.getHash().replace(routeStripper, '');\n          this.history.replaceState({}, document.title, this.root + this.fragment);\n        }\n\n      }\n\n      if (!this.options.silent) return this.loadUrl();\n    },\n\n    // Disable Backbone.history, perhaps temporarily. Not useful in a real app,\n    // but possibly useful for unit testing Routers.\n    stop: function() {\n      Backbone.$(window).off('popstate', this.checkUrl).off('hashchange', this.checkUrl);\n      if (this._checkUrlInterval) clearInterval(this._checkUrlInterval);\n      History.started = false;\n    },\n\n    // Add a route to be tested when the fragment changes. Routes added later\n    // may override previous routes.\n    route: function(route, callback) {\n      this.handlers.unshift({route: route, callback: callback});\n    },\n\n    // Checks the current URL to see if it has changed, and if it has,\n    // calls `loadUrl`, normalizing across the hidden iframe.\n    checkUrl: function(e) {\n      var current = this.getFragment();\n      if (current === this.fragment && this.iframe) {\n        current = this.getFragment(this.getHash(this.iframe));\n      }\n      if (current === this.fragment) return false;\n      if (this.iframe) this.navigate(current);\n      this.loadUrl();\n    },\n\n    // Attempt to load the current URL fragment. If a route succeeds with a\n    // match, returns `true`. If no defined routes matches the fragment,\n    // returns `false`.\n    loadUrl: function(fragment) {\n      fragment = this.fragment = this.getFragment(fragment);\n      return _.any(this.handlers, function(handler) {\n        if (handler.route.test(fragment)) {\n          handler.callback(fragment);\n          return true;\n        }\n      });\n    },\n\n    // Save a fragment into the hash history, or replace the URL state if the\n    // 'replace' option is passed. You are responsible for properly URL-encoding\n    // the fragment in advance.\n    //\n    // The options object can contain `trigger: true` if you wish to have the\n    // route callback be fired (not usually desirable), or `replace: true`, if\n    // you wish to modify the current URL without adding an entry to the history.\n    navigate: function(fragment, options) {\n      if (!History.started) return false;\n      if (!options || options === true) options = {trigger: !!options};\n\n      var url = this.root + (fragment = this.getFragment(fragment || ''));\n\n      // Strip the hash for matching.\n      fragment = fragment.replace(pathStripper, '');\n\n      if (this.fragment === fragment) return;\n      this.fragment = fragment;\n\n      // Don't include a trailing slash on the root.\n      if (fragment === '' && url !== '/') url = url.slice(0, -1);\n\n      // If pushState is available, we use it to set the fragment as a real URL.\n      if (this._hasPushState) {\n        this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);\n\n      // If hash changes haven't been explicitly disabled, update the hash\n      // fragment to store history.\n      } else if (this._wantsHashChange) {\n        this._updateHash(this.location, fragment, options.replace);\n        if (this.iframe && (fragment !== this.getFragment(this.getHash(this.iframe)))) {\n          // Opening and closing the iframe tricks IE7 and earlier to push a\n          // history entry on hash-tag change.  When replace is true, we don't\n          // want this.\n          if(!options.replace) this.iframe.document.open().close();\n          this._updateHash(this.iframe.location, fragment, options.replace);\n        }\n\n      // If you've told us that you explicitly don't want fallback hashchange-\n      // based history, then `navigate` becomes a page refresh.\n      } else {\n        return this.location.assign(url);\n      }\n      if (options.trigger) return this.loadUrl(fragment);\n    },\n\n    // Update the hash location, either replacing the current entry, or adding\n    // a new one to the browser history.\n    _updateHash: function(location, fragment, replace) {\n      if (replace) {\n        var href = location.href.replace(/(javascript:|#).*$/, '');\n        location.replace(href + '#' + fragment);\n      } else {\n        // Some browsers require that `hash` contains a leading #.\n        location.hash = '#' + fragment;\n      }\n    }\n\n  });\n\n  // Create the default Backbone.history.\n  Backbone.history = new History;\n\n  // Helpers\n  // -------\n\n  // Helper function to correctly set up the prototype chain, for subclasses.\n  // Similar to `goog.inherits`, but uses a hash of prototype properties and\n  // class properties to be extended.\n  var extend = function(protoProps, staticProps) {\n    var parent = this;\n    var child;\n\n    // The constructor function for the new subclass is either defined by you\n    // (the \"constructor\" property in your `extend` definition), or defaulted\n    // by us to simply call the parent's constructor.\n    if (protoProps && _.has(protoProps, 'constructor')) {\n      child = protoProps.constructor;\n    } else {\n      child = function(){ return parent.apply(this, arguments); };\n    }\n\n    // Add static properties to the constructor function, if supplied.\n    _.extend(child, parent, staticProps);\n\n    // Set the prototype chain to inherit from `parent`, without calling\n    // `parent`'s constructor function.\n    var Surrogate = function(){ this.constructor = child; };\n    Surrogate.prototype = parent.prototype;\n    child.prototype = new Surrogate;\n\n    // Add prototype properties (instance properties) to the subclass,\n    // if supplied.\n    if (protoProps) _.extend(child.prototype, protoProps);\n\n    // Set a convenience property in case the parent's prototype is needed\n    // later.\n    child.__super__ = parent.prototype;\n\n    return child;\n  };\n\n  // Set up inheritance for the model, collection, router, view and history.\n  Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend;\n\n  // Throw an error when a URL is needed, and none is supplied.\n  var urlError = function() {\n    throw new Error('A \"url\" property or function must be specified');\n  };\n\n  // Wrap an optional error callback with a fallback error event.\n  var wrapError = function(model, options) {\n    var error = options.error;\n    options.error = function(resp) {\n      if (error) error(model, resp, options);\n      model.trigger('error', model, resp, options);\n    };\n  };\n\n  return Backbone;\n\n}));", "/*****\r\n * @fileOverview Generating embedding options\r\n *\r\n *****/\r\n\r\nfire.provide('smore.Embedder');\r\nfire.require('fire.popover');\r\n\r\n/******\r\n * Generating embedding options\r\n *\r\n * @param {jQuery} el\r\n * @constructor\r\n */\r\nsmore.Embedder = function (el) {\r\n    /***\r\n     * The button that will open the embed box\r\n     * @type {jQuery}\r\n     * @private\r\n     */\r\n    this._el = el;\r\n\r\n    this._content = $('#embed-popover');\r\n\r\n    this._isFixed = this._el.data('fixed');\r\n    // setup embedding events\r\n    this._setupEvents();\r\n};\r\n\r\nsmore.Embedder.prototype = {\r\n\r\n\r\n    _setupEvents:function () {\r\n        this._el.click($.proxy(this._show, this));\r\n\r\n        this._content.find('.close').click(fire.popover.close);\r\n        this._embedCodeBox = this._content.find('.embed-code-box');\r\n\r\n        this._content.find('input').focus(function () {\r\n            var el = $(this);\r\n            window.setTimeout(function () {\r\n                el.select();\r\n            }, 50);\r\n        });\r\n\r\n\r\n    },\r\n\r\n    _show:function () {\r\n        this._updateEmbedCode();\r\n        this._content.find('.short-url').val(this._shortUrl());\r\n        fire.popover.show(this._el, this._content, '', this._isFixed);\r\n        window.setTimeout($.proxy(function () {\r\n            this._setupClipboard();\r\n        }, this), 50)\r\n\r\n    },\r\n\r\n    _url:function () {\r\n        return $('link[rel=canonical]').attr('href');\r\n    },\r\n\r\n    _shortUrl:function () {\r\n        return $('meta[name=shorturl]').attr('content');\r\n    },\r\n\r\n\r\n    _updateEmbedCode:function () {\r\n        var size = 'medium';\r\n\r\n        this._embedCodeBox.val(this._generateEmbedCode(this._url(), size));\r\n    },\r\n\r\n\r\n    _setupClipboard:function () {\r\n        if (this._clipboardSet) return;\r\n        this._setupClipboardButton($('#copy-short-url'), $('#short-url'));\r\n        this._setupClipboardButton($('#copy-embed-code'), $('#embed-code-box'));\r\n\r\n        this._clipboardSet = true;\r\n    },\r\n\r\n    _setupClipboardButton:function (button, input) {\r\n        var clip = new ZeroClipboard.Client();\r\n        clip.setHandCursor(true);\r\n\r\n        var cb = button;\r\n        cb.tipsy({trigger:'manual', fade:true});\r\n\r\n        clip.addEventListener('load', function (client) {\r\n        });\r\n\r\n        clip.addEventListener('mouseOver', function (client) {\r\n            cb.tipsy('show');\r\n        });\r\n\r\n        clip.addEventListener('mouseOut', function (client) {\r\n            cb.tipsy('hide');\r\n        });\r\n\r\n\r\n        clip.addEventListener('complete', function (client, text) {\r\n            var org = cb.attr('original-title');\r\n            cb.tipsy('hide');\r\n            cb.attr('title', 'Copied!');\r\n            cb.tipsy('show');\r\n            cb.attr('title', org);\r\n            // after completion, focus on the body to prevent flash from grabbing input like the asshole it is.\r\n\r\n\r\n            input.select().focus();\r\n        });\r\n\r\n        clip.glue(button.attr('id'), 'embed-container');\r\n\r\n        clip.setText(input.val());\r\n    },\r\n\r\n\r\n    /***\r\n     * Get an embed code\r\n     *\r\n     * @param {String} url\r\n     * @param {String} size\r\n     * @return {String}\r\n     * @private\r\n     */\r\n    _generateEmbedCode:function (url, size) {\r\n        size = size || 'medium';\r\n        var h;\r\n\r\n        switch (size) {\r\n            case 'small':\r\n                h = 300;\r\n                break;\r\n            case 'medium':\r\n                h = 600;\r\n                break;\r\n            case 'large':\r\n                h = 1000;\r\n                break;\r\n        }\r\n\r\n        return fire.format('<iframe width=\"100%\" height=\"{0}\" src=\"{1}?embed=1\" ' +\r\n            'scrolling=\"auto\" ' +\r\n            'frameborder=\"0\" ' +\r\n            'allowtransparency=\"true\" ' +\r\n            'style=\"min-width: 320px;border: none;\"></iframe>', h, url);\r\n    }\r\n};\r\n\r\n\r\n$(function () {\r\n    $('.embed-button').each(function () {\r\n        var e = new smore.Embedder($(this));\r\n    });\r\n});", "/*****\r\n * @fileOverview\r\n *\r\n *****/\r\n\r\nfire.provide('smore.HoverPop');\r\n\r\n/******\r\n *\r\n *\r\n * @params {jQuery} el\r\n * @params {String=} url optional url, will try to use el.data-pop-url if not provided\r\n * @constructor\r\n */\r\nsmore.HoverPop = function (el, url) {\r\n    this._el = el;\r\n    this._url = url || el.data('pop-url');\r\n    this._delay = el.data('pop-delay') || this._DEFAULT_DELAY_TIME;\r\n\r\n    this._setupEvents();\r\n    this._setupCard();\r\n};\r\n\r\nsmore.HoverPop.prototype = {\r\n\r\n    _DEFAULT_DELAY_TIME:400,\r\n\r\n    _setupEvents:function () {\r\n        this._el.mouseenter($.proxy(this._onElMouseEnter, this));\r\n        this._el.mouseleave($.proxy(this._onElMouseLeave, this));\r\n    },\r\n\r\n    _setupCard:function () {\r\n        this._pop = $('<div class=\"hover-pop\"><div class=\"tip\"></div><div class=\"content\"></div></div>');\r\n        this._content = this._pop.find('.content');\r\n    },\r\n\r\n    _onElMouseEnter:function () {\r\n        var r = this._getRequest();\r\n        this._active = true;\r\n        r.done(($.proxy(this._tryShowCard, this).delayed(this._delay)));\r\n    },\r\n\r\n    _onElMouseLeave:function () {\r\n        this._pop.hide();\r\n        this._active = false;\r\n    },\r\n\r\n    _tryShowCard:function (result) {\r\n        if (!this._active) return;\r\n\r\n        // update the result;\r\n        this._content.html(result);\r\n        // add pop to the el, helps with the mouse leave event\r\n        this._el.append(this._pop);\r\n        this._pop.show();\r\n\r\n        // hide it\r\n        this._pop.css('visibility', 'hidden');\r\n\r\n        this._positionPop();\r\n\r\n        this._pop.css('visibility', 'visible');\r\n    },\r\n\r\n    _positionPop:function () {\r\n\r\n        var o = this._el.offset();\r\n        var w = this._el.outerWidth();\r\n        var pw = this._pop.outerWidth();\r\n\r\n\r\n        var left = o.left + (w / 2) - (pw / 2);\r\n\r\n        var top = o.top + this._el.outerHeight() - 2;\r\n\r\n        this._pop.css({top:top, left:left});\r\n    },\r\n\r\n    _getRequest:function () {\r\n        if (!this._request) {\r\n            this._request = $.get(this._url);\r\n        }\r\n\r\n        return this._request;\r\n    }\r\n};\r\n\r\n\r\n$(function () {\r\n    $('[data-pop-url]').each(function () {\r\n        new smore.HoverPop($(this));\r\n    })\r\n});", "$(function () {\r\n\r\n    var lb = $('.badges-container');\r\n    var sal = $('.show-all-badges');\r\n    var hal = $('.hide-all-badges');\r\n    sal.click(function () {\r\n\r\n        lb.slideDown();\r\n        sal.hide();\r\n        hal.show();\r\n    });\r\n\r\n    hal.click(function () {\r\n\r\n        lb.slideUp();\r\n        hal.hide();\r\n        sal.show();\r\n    });\r\n});", "/*****\r\n * @fileOverview\r\n *\r\n *****/\r\n\r\nfire.provide('fire.forms.InputError');\r\n\r\n/******\r\n *\r\n * @param {jQuery} input\r\n * @constructor\r\n */\r\nfire.forms.InputError = function (input) {\r\n    /**\r\n     *\r\n     * @type {jQuery}\r\n     * @private\r\n     */\r\n    this._el = input;\r\n\r\n    this._setup();\r\n};\r\n\r\nfire.forms.InputError.prototype = {\r\n\r\n    /***\r\n     *\r\n     * @private\r\n     */\r\n    _setup:function () {\r\n        this._errorBox = $('<div class=\"error-message\"></div>').hide();\r\n        this._el.after(this._errorBox);\r\n    },\r\n\r\n    /***\r\n     * Set the error message and show the error\r\n     * @param {String} error\r\n     */\r\n    setError:function (error) {\r\n        this._errorBox.html(error);\r\n        this._errorBox.slideUp();\r\n        this._el.addClass('error');\r\n    },\r\n\r\n    /***\r\n     *  Remove error\r\n     */\r\n    removeError:function () {\r\n        this._errorBox.slideDown();\r\n        this._el.removeClass('error');\r\n    }\r\n};\r\n\r\n(function( $ ) {\r\n    $.fn.displayError = function(error) {\r\n        this.next('.error-message').remove();\r\n\r\n        // hide all info messages\r\n        this.next('.info-message').addClass('hidden-by-error-message');\r\n\r\n        this.addClass('error');\r\n        var el = $('<div class=\"error-message\"></div>');\r\n        el.hide();\r\n        this.after(el);\r\n\r\n\r\n        el.html(error);\r\n        el.slideDown();\r\n    };\r\n\r\n    $.fn.hideError = function() {\r\n        if (this.hasClass('error')) {\r\n            this.removeClass('error');\r\n            var el = this.next('.error-message');\r\n            el.slideUp(function() { el.remove() });\r\n\r\n            // if there's also a info message, reveal it\r\n            var hiddenEl = el.next('.hidden-by-error-message');\r\n            hiddenEl.removeClass('hidden-by-error-message');\r\n        }\r\n\r\n\r\n    };\r\n\r\n    $.fn.hideAllErrors = function() {\r\n        this.find('.error-message').slideUp();\r\n        this.find('.error').removeClass('error');\r\n        this.find('*').removeClass('hidden-by-error-message');\r\n    };\r\n\r\n\r\n\r\n})( jQuery );", "/*****\r\n * @fileOverview\r\n *\r\n *****/\r\n\r\nfire.provide('fire.ui.forms.validations');\r\n\r\nfire.ui.forms.validations = (function () {\r\n\r\n    function regexpValidator(validateRegexp, filterRegex, message, coerce) {\r\n        var r = {\r\n            /***\r\n             *\r\n             * @param {String} text\r\n             * @returns {Boolean}\r\n             */\r\n            validate:function (text) {\r\n                return validateRegexp.test((text || '').toLowerCase());\r\n            },\r\n\r\n            /****\r\n             *\r\n             * @param {String} text\r\n             * @returns {Boolean}\r\n             */\r\n            filter:function (text) {\r\n                return filterRegex.test(text.toLowerCase());\r\n            },\r\n\r\n            ERROR_MESSAGE:message\r\n        };\r\n\r\n        if (coerce) r.coerce = coerce;\r\n\r\n        return r;\r\n    }\r\n\r\n\r\n    /**************************** EMAIL VALIDATION ************************************/\r\n    var email = regexpValidator(\r\n        /^[_a-z0-9-+]+(\\.[_a-z0-9-+]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,})$/,\r\n        /[_a-z0-9-+\\.@]/,\r\n        'Not a valid email address'\r\n    );\r\n\r\n    /**************************** TWITTER VALIDATION ************************************/\r\n    var twitter = regexpValidator(\r\n        /^@?[_a-z0-9]+$/,\r\n        /[_a-z0-9@]/,\r\n        'Not a valid twitter handler',\r\n        function (text) {\r\n            if (text[0] === '@') return text;\r\n            return '@' + text;\r\n        });\r\n\r\n    /**************************** PHONE VALIDATION ************************************/\r\n    var phone = regexpValidator(\r\n        /^[0-9+\\- \\.\\(\\)]+$/,\r\n        /[0-9+\\- \\.\\(\\)]/,\r\n        'Not a valid phone number'\r\n    );\r\n\r\n    /**************************** URL VALIDATION ************************************/\r\n    var url = {\r\n\r\n        /***\r\n         *\r\n         * @param {String} text\r\n         * @returns {Boolean}\r\n         */\r\n        validate:function (text) {\r\n            text = (text || '').toLowerCase();\r\n            if (text.indexOf('http') === -1) {\r\n                text = 'http://' + text;\r\n            }\r\n            var exp = /^(https?):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i;\r\n            return exp.test(text);\r\n        },\r\n\r\n        filter:function (text) {\r\n            return (text !== ' ');\r\n        },\r\n\r\n\r\n        ERROR_MESSAGE:'Not a valid website'\r\n    };\r\n\r\n    /**************************** FACEBOOK VALIDATION ************************************/\r\n    var facebook = {\r\n\r\n        /***\r\n         *\r\n         * @param {String} text\r\n         * @returns {Boolean}\r\n         */\r\n        validate:function (text) {\r\n            text = (text || '').toLowerCase();\r\n            var slugMatch = /^([\\w\\-.]*)$/i;\r\n            var exp = /^(?:https?:\\/\\/)?(?:www.)?facebook.com\\/(?:(?:\\w)*#!\\/)?(?:pages\\/)?(?:[?\\w\\-]*\\/)?(?:profile.php\\?id=(?=\\d.*))?([\\w\\-.]*)/i;\r\n            return exp.test(text) || slugMatch.test(text);\r\n        },\r\n\r\n        filter:function (text) {\r\n            return (text !== ' ');\r\n        },\r\n\r\n        coerce:function (text) {\r\n            if (!text) return text;\r\n            var slugMatch = /^([\\w\\-.]*)$/i;\r\n            if (slugMatch.test(text)) {\r\n                text = 'facebook.com/' + text;\r\n            }\r\n            return text;\r\n        },\r\n\r\n\r\n        ERROR_MESSAGE:'Not a valid facebook adress'\r\n    };\r\n\r\n    /**************************** SCREEN NAME ************************************/\r\n\r\n    var screenname = regexpValidator(\r\n        /^[a-zA-Z-0-9\\-]+$/,\r\n        /^[a-zA-Z-0-9\\-]+$/,\r\n        'Not a valid screen name. (use alphanumeric chars and dashes)',\r\n        function (text) {\r\n            return text.toLowerCase();\r\n        }\r\n    );\r\n\r\n    return {\r\n        email:email,\r\n        twitter:twitter,\r\n        phone:phone,\r\n        url:url,\r\n        facebook:facebook,\r\n        screenname:screenname\r\n    }\r\n}());", "fire.provide('fire.ui.forms.field');\r\n\r\nfire.ui.forms.field = (function () {\r\n    var validations = fire.ui.forms.validations;\r\n\r\n    var ERROR_BOX_CLASS = 'error-message';\r\n    var INPUT_ERROR_CLASS = 'error';\r\n    var INPUT_VALID_CLASS = 'valid';\r\n    var VALIDATION_DELAY = 100;\r\n    var CACHE_KEY = 'fire-field';\r\n\r\n    function setupField(el, changeCallback) {\r\n        el = $(el);\r\n        var _isRequired = !!el.data('required');\r\n\r\n        // setup validations\r\n\r\n        // setup events\r\n        el.keyup(onKeyUp)\r\n            .blur(onBlur)\r\n            .on('cut paste', onClipboardTextChange)\r\n            .keypress(onKeyPress);\r\n\r\n        // setup validator\r\n        var _validator = setupValidation();\r\n\r\n        var _delayedValidation = validate.delayed(VALIDATION_DELAY);\r\n\r\n        // validate current value;\r\n        validateAndCoerce();\r\n\r\n        /**************************** Validation ************************************/\r\n\r\n        function setupValidation() {\r\n            return validations[el.data('validate')];\r\n        }\r\n\r\n        var _errorBox;\r\n\r\n        function getErrorBox() {\r\n            if (_errorBox) return _errorBox;\r\n\r\n            _errorBox = $('<div/>').addClass(ERROR_BOX_CLASS).hide();\r\n            if (_validator) _errorBox.html(_validator.ERROR_MESSAGE);\r\n            // add to dom\r\n            el.after(_errorBox);\r\n\r\n            return _errorBox;\r\n        }\r\n\r\n        function validateAndCoerce() {\r\n            if (validate() && !isEmpty()) coerce();\r\n            if (changeCallback) changeCallback(value());\r\n        }\r\n\r\n        function validate() {\r\n            // handle empty case\r\n            if (isEmpty()) {\r\n                if (_isRequired) return setValid(false);\r\n\r\n                // if not required, just set as empty and return true\r\n                hideError();\r\n                return true;\r\n            }\r\n\r\n            if (_validator) {\r\n                return setValid(_validator.validate(value()), _validator.ERROR_MESSAGE);\r\n            }\r\n\r\n            // nothing is wrong, set valid\r\n            return setValid(true);\r\n        }\r\n\r\n        function coerce() {\r\n            if (_validator && _validator.coerce) {\r\n                el.val(_validator.coerce(value()));\r\n            }\r\n        }\r\n\r\n        function hideError() {\r\n            el.removeClass(INPUT_ERROR_CLASS);\r\n            if (_errorBox) _errorBox.slideUp();\r\n        }\r\n\r\n        function setValid(isValid, error) {\r\n            if (isValid) {\r\n                hideError();\r\n                el.addClass(INPUT_VALID_CLASS);\r\n            } else {\r\n                showError(error);\r\n                el.removeClass(INPUT_VALID_CLASS);\r\n            }\r\n\r\n            return isValid;\r\n        }\r\n\r\n        function showError(message) {\r\n            el.addClass(INPUT_ERROR_CLASS);\r\n\r\n            if (message) {\r\n                // first slide and than set the html, because the jQuery html() method\r\n                // returns the html content, and slideDown animation is async\r\n                // http://api.jquery.com/html/\r\n                getErrorBox().slideDown().html(message);\r\n            }\r\n        }\r\n\r\n\r\n        function value() {\r\n            return $.trim(el.val());\r\n        }\r\n\r\n        function isEmpty() {\r\n            return !value();\r\n        }\r\n\r\n\r\n        /**************************** Field events ************************************/\r\n        function onKeyUp(e) {\r\n            _delayedValidation();\r\n        }\r\n\r\n        function onBlur(e) {\r\n            validateAndCoerce()\r\n        }\r\n\r\n        function onClipboardTextChange(e) {\r\n            setTimeout(validateAndCoerce, 100);\r\n        }\r\n\r\n        function onKeyPress(e) {\r\n            if (_validator && _validator.filter && isRelevantKey(e)) {\r\n                var s = String.fromCharCode(e.which);\r\n                if (!_validator.filter(s)) {\r\n                    e.preventDefault();\r\n                    e.stopPropagation();\r\n                }\r\n            }\r\n        }\r\n\r\n        function isRelevantKey(e) {\r\n            return !(e.ctrlKey || e.altKey || e.metaKey || e.which < 32);\r\n        }\r\n\r\n\r\n        var r = {\r\n            isValid:validate,\r\n            el:el\r\n        };\r\n\r\n        $.data(el, CACHE_KEY, r);\r\n        return r;\r\n    }\r\n\r\n    function getField(el, callback) {\r\n        return $.data(el, CACHE_KEY) || setupField(el, callback);\r\n    }\r\n\r\n    return getField;\r\n}());", "fire.provide('fire.ui.forms.form');\r\n\r\nfire.ui.forms.form = (function () {\r\n    var DISABLED_CLASS = 'disabled';\r\n    var CACHE_KEY = 'fire-form';\r\n\r\n    var forms = fire.ui.forms;\r\n\r\n    function getFieldElements(formEl) {\r\n        return $.makeArray(formEl.find('[data-required],[data-validate]'))\r\n    }\r\n\r\n\r\n    function validField(f) {\r\n        return f.isValid();\r\n    }\r\n\r\n    function setupForm(formEl, submitEl) {\r\n        formEl = $(formEl);\r\n        // submitEl\r\n        if (!submitEl) {\r\n            submitEl = formEl.find('input[type=submit]');\r\n        }\r\n\r\n        // setup fields\r\n        var _fields = getFieldElements(formEl).map(getField);\r\n\r\n        // setup events\r\n        formEl.submit(onFormSubmit);\r\n\r\n        function isValid() {\r\n            return !_fields || _fields.all(validField);\r\n        }\r\n\r\n        function validate() {\r\n            submitEl.toggleClass(DISABLED_CLASS, !isValid());\r\n        }\r\n\r\n        function getField(el) {\r\n            // get a field, with a change callback\r\n            return forms.field(el, validate);\r\n        }\r\n\r\n        function onFormSubmit(e) {\r\n            if (!isValid()) {\r\n                e.preventDefault();\r\n                e.stopPropagation();\r\n            }\r\n        }\r\n\r\n        var r = {\r\n            validate: validate,\r\n            el: formEl\r\n        };\r\n\r\n        // store in cache\r\n        $.data(formEl, CACHE_KEY, r);\r\n\r\n        // validate form\r\n\r\n        validate();\r\n        return r;\r\n    }\r\n\r\n\r\n    function getForm(formEl, submitEl) {\r\n        return $.data(formEl, CACHE_KEY) || setupForm(formEl, submitEl);\r\n    }\r\n\r\n    return getForm;\r\n}());", "/*****\r\n * Tiny, css based, mobile optimized slider\r\n */\r\n\r\nfire.provide('fire.ui.tinyslide');\r\n\r\n\r\nfire.ui.tinyslide = (function ($) {\r\n    var ITEM_SELECTOR = '.slide-item';\r\n    var ACTIVE_CLASS = 'active';\r\n    var CONTAINER_CLASS = 'tiny-slide';\r\n    var DELAY = 3000;\r\n    var ANIMATION_TIME = 800;\r\n\r\n    var isIE = $.browser.msie;\r\n\r\n    function hide(el) {\r\n        if (isIE) {\r\n            el.animate({opacity:0}, ANIMATION_TIME);\r\n        }\r\n        return el.removeClass(ACTIVE_CLASS);\r\n\r\n    }\r\n\r\n    function show(el) {\r\n        if (isIE) {\r\n            el.animate({opacity:1}, ANIMATION_TIME);\r\n        }\r\n        return el.addClass(ACTIVE_CLASS);\r\n    }\r\n\r\n\r\n    function slide(els, delay) {\r\n        delay = delay || DELAY;\r\n\r\n        // iterate over the given elements\r\n        els.each(function () {\r\n            var el = $(this);\r\n\r\n\r\n            var _current = el.find(ITEM_SELECTOR).first();\r\n\r\n            function progress() {\r\n                // skip invisible\r\n                if (el.is(':visible')) {\r\n                    var siblings = _current.siblings(ITEM_SELECTOR);\r\n                    var next = _current.next(ITEM_SELECTOR);\r\n                    if (!next.length) {\r\n                        next = siblings.first();\r\n                    }\r\n\r\n                    hide(_current);\r\n                    _current = show(next);\r\n                }\r\n\r\n\r\n                setTimeout(progress, delay);\r\n            }\r\n\r\n\r\n            el.addClass(CONTAINER_CLASS);\r\n            _current.addClass(ACTIVE_CLASS);\r\n\r\n            // start the loop\r\n            setTimeout(progress, delay);\r\n        });\r\n    }\r\n\r\n    return {slide:slide}\r\n}(jQuery));\r\n\r\n\r\n// auto setup\r\n$(function () {\r\n    fire.ui.tinyslide.slide($('.tiny-slide'));\r\n});\r\n", "/**\r\n * Created with PyCharm.\r\n * User: shlomiatar\r\n * Date: 08/08/12\r\n * Time: 18:08\r\n * To change this template use File | Settings | File Templates.\r\n */\r\n\r\ndefine('fire/util/functions', function() {\r\n    var _proto = Function.prototype;\r\n\r\n    /****\r\n     * A delayed decorator.\r\n     * Every subsequent call to this function will reset the timer.\r\n     * Highly useful for typing related events\r\n     *\r\n     * @param {Number} time\r\n     * @param {Object=} scope optional scope\r\n     * @return {Function}\r\n     */\r\n    _proto.delayed = function(time, scope) {\r\n        var func = this;\r\n\r\n        if (!scope) {\r\n            scope = this;\r\n        }\r\n\r\n        var result = function() {\r\n            // if already have a timeout, remove it\r\n            if (func._timeout) {\r\n                clearTimeout(func._timeout);\r\n            }\r\n\r\n            var args = $.makeArray(arguments);\r\n\r\n            func._timeout = setTimeout(function() {\r\n                // call the callback\r\n                func.apply(scope, args);\r\n            }, time);\r\n        };\r\n\r\n        result.now = function() {\r\n            if (func._timeout) {\r\n                clearTimeout(func._timeout);\r\n            }\r\n\r\n            func.apply(scope, $.makeArray(arguments));\r\n        };\r\n\r\n        return result;\r\n    };\r\n\r\n\r\n    /****\r\n     * A buffering decorator.\r\n     * No matter how many subsequent calls are done, the wrapped function will be fired once\r\n     * after the time is passed WITH THE LAST CALLED ARGUMENTS\r\n     *\r\n     * Useful for buffering event calls\r\n     *\r\n     * @param {Number} time\r\n     * @returns {Function}\r\n     */\r\n    _proto.buffered = function(time) {\r\n        var func = this;\r\n        return function() {\r\n            func._args = arguments;\r\n\r\n            // set the timeout\r\n            if (!func._timeout) {\r\n                func._timeout = setTimeout(function() {\r\n                    // call the func\r\n                    func.apply(this, func._args);\r\n                }, time);\r\n            }\r\n        };\r\n    };\r\n\r\n\r\n    /*****\r\n     * A caching system using jQuery.data() function.\r\n     * It's really useful for a 'getObject' pattern, when you want to never instantiate twice, and get a consistent\r\n     * result.\r\n     *\r\n     * @param {String} cacheKey\r\n     * @returns {Function}\r\n     */\r\n    _proto.elementCached = function(cacheKey) {\r\n        var func = this;\r\n        return function() {\r\n            var el = arguments[0];\r\n            // if the first argument is an element\r\n            if (el instanceof $ && el.length) {\r\n                // try to get from cache;\r\n                var d = $.data(el[0], cacheKey);\r\n                if (d) {\r\n                    return d;\r\n                }\r\n                // not in cache\r\n                var r = func.apply(this, arguments);\r\n                // store in cache\r\n                return $.data(el[0], cacheKey, r);\r\n            }\r\n            // else - invoke the function without caching\r\n            return func.apply(this, arguments);\r\n        };\r\n    };\r\n\r\n    /*****\r\n     * Auto triggers the given event on the given hub with the result of the function\r\n     *\r\n     * @param {jQuery} hub\r\n     * @param {String} name event name to trigger\r\n     */\r\n    _proto.triggers = function(hub, name) {\r\n        var func = this;\r\n        return function() {\r\n            // call\r\n            var r = func.apply(this, arguments);\r\n            hub.trigger(name, r);\r\n            return r;\r\n        };\r\n    };\r\n\r\n\r\n    /****\r\n     * Simple prototypical inheritance\r\n     *\r\n     * @param {!Function} parentCtor\r\n     */\r\n    _proto.inherits = function(parentCtor) {\r\n        if (!parentCtor) {\r\n            throw \"Can't inherit from an undefined parent class\";\r\n        }\r\n\r\n        var cls = this;\r\n        /** @constructor */\r\n        var TempCtor = function() {\r\n        };\r\n\r\n        // copy the prototype from parent into temp\r\n        TempCtor.prototype = parentCtor.prototype;\r\n\r\n        // set the\r\n        cls.__super__ = parentCtor.prototype;\r\n\r\n        var proto = cls.prototype;\r\n        /// apply overriden properties\r\n        cls.prototype = $.extend(\r\n            // cloned prototype from parent\r\n            new TempCtor(),\r\n            // cls prototype\r\n            proto,\r\n            // extra properties\r\n            {__super__: cls.__super__, constructor: cls});\r\n    };\r\n\r\n    /***\r\n     * Creates a function that can be aborted\r\n     * @param {Object=} scope\r\n     * @returns {Function}\r\n     */\r\n    _proto.abortable = function(scope) {\r\n        var func = this;\r\n\r\n        var r = function() {\r\n            if (this.aborted) {\r\n                return;\r\n            }\r\n\r\n            // call the inside function\r\n            return func.apply(scope || this, arguments);\r\n        };\r\n\r\n        r.abort = function() {\r\n            this.aborted = true;\r\n        };\r\n\r\n        return r;\r\n    };\r\n\r\n\r\n});", "define('fire/util/array', function (require) {\r\n    var _proto = Array.prototype;\r\n\r\n    // polyfills flag\r\n    // maybe in to future we could compile our code with legacy-ie flag to remove non important code\r\n    var POLYFILLS = true;\r\n\r\n\r\n    function normalize(items) {\r\n        if (items === null) return null;\r\n        if (Array.isArray(items)) return items.clone();\r\n        return [items];\r\n    }\r\n\r\n\r\n    /****\r\n     * Remove single or multiple items from the current array\r\n     * @param {*|Array} input\r\n     * @returns {Array}\r\n     */\r\n    _proto.remove = function (input) {\r\n        var items = normalize(input);\r\n        for (var i = 0; i < items.length; i++) {\r\n            var idx = this.indexOf(items[i]);\r\n            if (idx == -1) return this;\r\n            this.splice(idx, 1);\r\n        }\r\n        return this;\r\n    };\r\n\r\n\r\n    /***\r\n     * Removes elements that match the given lambda\r\n     * @param {function(*):boolean} lambda\r\n     * @returns {Array}\r\n     */\r\n    _proto.removeBy = function (lambda) {\r\n        return this.remove(this.where(lambda));\r\n    };\r\n\r\n    /***\r\n     * Insert the given item at the given index\r\n     * @param {*} item\r\n     * @param {number} idx\r\n     */\r\n    _proto.insert = function (item, idx) {\r\n        this.splice(idx, 0, item);\r\n    };\r\n\r\n\r\n    /***\r\n     * Inserts item before origItem\r\n     * @param {*} item\r\n     * @param {*} origItem\r\n     */\r\n    _proto.insertBefore = function (item, origItem) {\r\n        var idx = this.indexOf(origItem);\r\n        // if not found push it the the end\r\n        if (idx == -1) {\r\n            this.push(item);\r\n            return;\r\n        }\r\n\r\n        this.insert(item, idx);\r\n    };\r\n\r\n    /***\r\n     * Inserts item before origItem\r\n     * @param {*} item\r\n     * @param {*} origItem\r\n     */\r\n    _proto.insertAfter = function (item, origItem) {\r\n        var idx = this.indexOf(origItem);\r\n        // if not found push it the the end\r\n        if (idx == -1 || (idx + 1) > this.length) {\r\n            this.push(item);\r\n            return;\r\n        }\r\n\r\n        this.insert(item, idx + 1);\r\n    };\r\n\r\n\r\n    /**\r\n     * Duplicates the array\r\n     * @returns {Array}\r\n     */\r\n    _proto.clone = _proto.slice;\r\n\r\n    /***\r\n     * Checks if the given item is inside the current array\r\n     * @param {*} item\r\n     *\r\n     * @returns {boolean}\r\n     */\r\n    _proto.contains = function (item) {\r\n        return this.indexOf(item) != -1;\r\n    };\r\n\r\n\r\n    /***\r\n     * Returns the given array without the items from secondArray\r\n     * @param {Array} secondArray\r\n     * @returns {Array}\r\n     */\r\n    _proto.minus = function (secondArray) {\r\n        return this.clone().remove(secondArray);\r\n    };\r\n\r\n    /***\r\n     * Normalize input that can be single item or array to single array;\r\n     * @param items {Array/object}\r\n     * @returns {Array}\r\n     */\r\n    Array.normalize = normalize;\r\n\r\n    /***\r\n     * Returns the last element of the array\r\n     *\r\n     * @param {Function=} filter\r\n     * @returns {*}\r\n     */\r\n    _proto.last = function (filter) {\r\n        var arr = filter ? this.filter(filter) : this;\r\n        return arr[arr.length - 1];\r\n    };\r\n\r\n    /***\r\n     * Returns the first element of the array\r\n     *\r\n     * @param {Function=} filter\r\n     * @returns {*}\r\n     */\r\n    _proto.first = function (filter) {\r\n        var arr = filter ? this.filter(filter) : this;\r\n        return arr[0];\r\n    };\r\n\r\n\r\n    /***\r\n     * Adds the given item to the array only if not already inside\r\n     * returns true if the item was added\r\n     *\r\n     * @param {*} item\r\n     * @returns {boolean}\r\n     */\r\n    _proto.setPush = function (item) {\r\n        return !this.contains(item) && this.push(item);\r\n    };\r\n\r\n    /***\r\n     * Get a random item from the array\r\n     *\r\n     * @returns {*}\r\n     */\r\n    _proto.random = function () {\r\n        var i = Math.round((this.length - 1) * Math.random());\r\n        return this[i];\r\n    };\r\n\r\n    /****\r\n     * returns a unique representation of the array\r\n     *\r\n     * @returns {Array}\r\n     */\r\n    _proto.unique = function () {\r\n        var r = [];\r\n        for (var i = 0; i < this.length; i++) {\r\n            var el = this[i];\r\n            var idx = this.indexOf(el);\r\n            if (idx > -1 && idx < i) continue;\r\n            r.push(el);\r\n        }\r\n        return r;\r\n    };\r\n\r\n    _proto.sum = function (func) {\r\n        var o = 0;\r\n        for (var i = 0; i < this.length; i++) {\r\n            if (func) {\r\n                o += func(this[i]);\r\n            } else {\r\n                o += this[i];\r\n            }\r\n        }\r\n        return o;\r\n    };\r\n\r\n    /****\r\n     * Converts an array with arrays to a normal array\r\n     *\r\n     * @returns {Array}\r\n     */\r\n    _proto.flatten = function () {\r\n        var r = [];\r\n        for (var i = 0; i < this.length; i++) {\r\n            var o = this[i];\r\n            if (Array.isArray(o)) {\r\n                o.flatten().forEach(function (i) {\r\n                    r.push(i)\r\n                });\r\n            } else {\r\n                r.push(o);\r\n            }\r\n        }\r\n        return r;\r\n    };\r\n\r\n    /****\r\n     * Converts the given array to a dictionary type object\r\n     *\r\n     * converts [1,2,3,5] to {1:true, 2:true,3:true,5:true}\r\n     *\r\n     * @param {Array} array\r\n     * @returns {object.<*.boolean>}\r\n     */\r\n    Array.toObject = function (array) {\r\n        // empty object if no array/no items in array\r\n        if (!array || !array.length) return {};\r\n\r\n        var result = {};\r\n        for (var i = 0; i < array.length; i++) {\r\n            result[array[i]] = true;\r\n        }\r\n        return result;\r\n    };\r\n\r\n    function objectKeys(obj) {\r\n        var r = [];\r\n        for (var k in obj) {\r\n            r.push(k);\r\n        }\r\n        return r;\r\n    }\r\n\r\n    /**************************** POLYFILLS ************************************/\r\n\r\n    if (POLYFILLS) {\r\n        // isArray polyfill for older browsers\r\n        if (!Array.isArray) {\r\n            Array.isArray = function (val) {\r\n                return val &&\r\n                    typeof(val) === 'object' &&\r\n                    typeof(val.length) === 'number' &&\r\n                    typeof(val.splice) === 'function' && !(val.propertyIsEnumerable('length'));\r\n            }\r\n        }\r\n\r\n\r\n        // SUPPORT FOR ARRAYS IN IE8\r\n        if (!_proto.indexOf) {\r\n            _proto.indexOf = function (elt /*, from*/) {\r\n                var len = this.length >>> 0;\r\n\r\n                var from = Number(arguments[1]) || 0;\r\n                from = (from < 0)\r\n                    ? Math.ceil(from)\r\n                    : Math.floor(from);\r\n                if (from < 0)\r\n                    from += len;\r\n\r\n                for (; from < len; from++) {\r\n                    if (from in this &&\r\n                        this[from] === elt)\r\n                        return from;\r\n                }\r\n                return -1;\r\n            };\r\n        }\r\n\r\n        // polyfill for .some\r\n        if (!_proto.some) {\r\n            _proto.some = function (fn, scope) {\r\n                if (!fn) return false;\r\n                scope = scope || window;\r\n\r\n                for (var i = 0; i < this.length; i++) {\r\n                    if (fn.call(scope, this[i], i)) return true;\r\n                }\r\n\r\n                return false;\r\n            };\r\n        }\r\n\r\n        // polyfill for .forEach\r\n        if (!_proto.forEach) {\r\n            _proto.forEach = function (fn, scope) {\r\n                for (var i = 0, len = this.length; i < len; ++i) {\r\n                    fn.call(scope || this, this[i], i, this);\r\n                }\r\n            }\r\n        }\r\n\r\n        // polyfill for .filter\r\n        if (!_proto.filter) {\r\n            _proto.filter = function (fn, scope) {\r\n                var res = [];\r\n                if (!fn) return res;\r\n                scope = scope || window;\r\n\r\n                for (var i = 0; i < this.length; i++) {\r\n                    var v = this[i];\r\n                    if (fn.call(scope, v, i)) {\r\n                        res.push(v);\r\n                    }\r\n                }\r\n\r\n                return res;\r\n            };\r\n        }\r\n\r\n        if (!_proto.every) {\r\n            _proto.every = function (fn, scope) {\r\n                if (!fn) return true;\r\n                scope = scope || window;\r\n\r\n                for (var i = 0; i < this.length; i++) {\r\n                    if (!fn.call(scope, this[i], i)) return false;\r\n\r\n                }\r\n                return true;\r\n            };\r\n        }\r\n\r\n        if (!_proto.map) {\r\n            _proto.map = function (fn, scope) {\r\n                if (!fn) return this;\r\n                scope = scope || window;\r\n                var res = [];\r\n                for (var i = 0; i < this.length; i++) {\r\n                    res.push(fn.call(scope, this[i], i));\r\n                }\r\n\r\n                return res;\r\n            }\r\n        }\r\n    }\r\n\r\n    /**************************** BACKWARDS COMP ************************************/\r\n\r\n    /***\r\n     * @deprecated use .some\r\n     */\r\n    _proto.any = _proto.some;\r\n    /***\r\n     * @deprecated use .every\r\n     */\r\n    _proto.all = _proto.every;\r\n    /***\r\n     * @deprecated use .forEach\r\n     */\r\n    _proto.each = _proto.forEach;\r\n    /***\r\n     * @deprecated use .filter\r\n     */\r\n    _proto.where = _proto.filter;\r\n\r\n\r\n    /**************************** jQuery support ************************************/\r\n    if ('jQuery' in window) {\r\n        ['forEach', 'every', 'some', 'sum'].forEach(function (k) {\r\n            jQuery.fn[k] = _proto[k];\r\n        });\r\n    }\r\n\r\n\r\n    /**************************** range ************************************/\r\n\r\n    var FORMAT_REGXP = /\\{0\\}/g\r\n\r\n    /****\r\n     * Range function similar to python's range\r\n     * @param {Number} start\r\n     * @param {Number=} end\r\n     * @param {String=} format String of the format 'molsh_{0}_1', the function will an array with the strings and\r\n     *                         replace {0} with the index\r\n     * @return {Array}\r\n     */\r\n    function range(start, end, format) {\r\n        var r = [];\r\n\r\n        if (!end) {\r\n            end = start;\r\n            start = 0;\r\n        }\r\n\r\n        for (var i = start; i < end; i++) {\r\n            if (format) {\r\n                r.push(format.replace(FORMAT_REGXP, i));\r\n            } else {\r\n                r.push(i);\r\n            }\r\n        }\r\n\r\n        return r;\r\n    }\r\n\r\n    return {\r\n        toObject:Array.toObject,\r\n        keys:objectKeys,\r\n        range:range\r\n    }\r\n})\r\n;", "define('fire/util/bindable', function (require) {\r\n    // require array extensions\r\n    var array = require('fire/util/array');\r\n\r\n    /***\r\n     *\r\n     * @constructor\r\n     */\r\n    function Bindable() {\r\n        this._ev = $({});\r\n    }\r\n\r\n    var _proto = Bindable.prototype;\r\n\r\n    // create the delegates\r\n    ['on', 'off', 'bind', 'unbind', 'trigger', 'one'].forEach(function (i) {\r\n        _proto[i] = delegate(i);\r\n    });\r\n\r\n\r\n    /***\r\n     * Creates a delegate for a call to the event obj\r\n     * @param name\r\n     * @return {Function}\r\n     */\r\n    function delegate(name) {\r\n        return function () {\r\n            var e = this._ev;\r\n            e[name].apply(e, arguments);\r\n        }\r\n    }\r\n\r\n    return Bindable;\r\n});\r\n\r\n\r\n// backward compatability:\r\n/***\r\n * @deprecated\r\n * @type {Function}\r\n */\r\nfire.Bindable = fire.util.Bindable = fire.util.bindable;", "define('fire/ui/legacy_view', function (require) {\r\n\r\n    var functions = require('fire/util/functions');\r\n    var Bindable = require('fire/util/bindable');\r\n\r\n\r\n    /****\r\n     * @typedef {{el:jQuery,\r\n     *              attrs:Object,\r\n     *              className:string,\r\n     *              tagName:string}}\r\n     */\r\n    var ViewOptions;\r\n\r\n    /***\r\n     *\r\n     * @param {ViewOptions} options\r\n     * @constructor\r\n     * @extends {Bindable}\r\n     */\r\n    var View = function (options) {\r\n        Bindable.call(this);\r\n\r\n        /***\r\n         *\r\n         * @type {ViewOptions}\r\n         */\r\n        this.options = options;\r\n\r\n        // set class name\r\n        if (options.className) {\r\n            this.className = options.className;\r\n        }\r\n\r\n        // set attributes\r\n        if (options.attrs) {\r\n            this.attrs = $.extend({}, this.attrs || {}, options.attrs);\r\n        }\r\n\r\n        /***\r\n         * The view's element\r\n         * @type {jQuery}\r\n         */\r\n        this.el = this._setupEl(options.el);\r\n\r\n        this.delegateEvents(this.events);\r\n    };\r\n\r\n\r\n    View.prototype = {\r\n\r\n        /***\r\n         * The tag to create for the view\r\n         * @type {String}\r\n         */\r\n        tagName:'div',\r\n\r\n        /***\r\n         * css class to use\r\n         * @type {String}\r\n         */\r\n        className:'',\r\n\r\n        /***\r\n         * Attributes to set\r\n         * @type {Object}\r\n         */\r\n        attrs:{},\r\n\r\n        /*********************************************************************************\r\n         * Overrideables\r\n         *********************************************************************************/\r\n\r\n\r\n        /***\r\n         * renders the content of the view into the el\r\n         */\r\n        render:function () {\r\n            // no op\r\n        },\r\n\r\n\r\n        /***\r\n         * Overide this to have things happen before the view is removed\r\n         */\r\n        beforeRemove:function () {\r\n            // noop\r\n        },\r\n\r\n\r\n        /*********************************************************************************\r\n         * Removal and cleanup\r\n         *********************************************************************************/\r\n\r\n\r\n        /***\r\n         * Remove the view from the dom, undelegate events\r\n         */\r\n        remove:function () {\r\n            this.beforeRemove();\r\n            this.undelegateEvents(this.events);\r\n\r\n            // remove the el from the dom\r\n            this.el.remove();\r\n\r\n            this.removed = true;\r\n        },\r\n\r\n        /*********************************************************************************\r\n         * Element creations and event delegation\r\n         *********************************************************************************/\r\n\r\n        /***\r\n         * Prepare our element\r\n         * @param {String|jQuery} el\r\n         * @return {jQuery}\r\n         * @private\r\n         */\r\n        _setupEl:function (el) {\r\n            if (el) {\r\n                // el exists, select it and use the first\r\n                el = $(el).first();\r\n                if (!el.length) throw \"Element does not exist!\"\r\n            } else {\r\n                // no el - create one\r\n                el = $('<' + this.tagName + '/>');\r\n            }\r\n\r\n\r\n            // set attributes and classes\r\n            el.attr(this.attrs)\r\n                .addClass(this.className);\r\n\r\n            return el;\r\n        },\r\n\r\n        /***\r\n         * Delegate all the defined events to the current el\r\n         */\r\n        delegateEvents:function (events) {\r\n            this._extractEvents(events).forEach(function (o) {\r\n                this.el.delegate(o.selector, o.name, o.handler);\r\n            }, this);\r\n        },\r\n\r\n        /***\r\n         * Undelegate events\r\n         * @param {Object} events\r\n         */\r\n        undelegateEvents:function (events) {\r\n            this._extractEvents(events).forEach(function (o) {\r\n                this.el.undelegate(o.selector, o.name, o.handler);\r\n            }, this);\r\n        },\r\n\r\n        /***\r\n         *  Gets a simplified backbone style event dict of\r\n         *  {\r\n         *      'click .selector': 'eventname'\r\n         *  }\r\n         *\r\n         *  and returns a list of {handler, selector, eventType}\r\n         *\r\n         * @param {object<string,string>} events\r\n         * @returns {Array}\r\n         * @private\r\n         */\r\n        _extractEvents:function (events) {\r\n            var result = [];\r\n\r\n            if (!events) return result;\r\n\r\n\r\n            // go over all the selectors and register them with event handlers\r\n            for (var key in events) {\r\n\r\n                var firstSpace = key.indexOf(' ');\r\n\r\n                // Get the event name\r\n                var eventName = key.substring(0, firstSpace);\r\n\r\n                // get the selector\r\n                var selector = key.substr(firstSpace + 1);\r\n\r\n                // get the handler name\r\n                var handlerName = events[key];\r\n                // get the handler\r\n                var handler = this[handlerName];\r\n\r\n\r\n                // Raise an exception if there is no valid handler\r\n                if (!handler) throw (\"'\" + handlerName + \"' is null in \" + this);\r\n\r\n                result.push({name:eventName, selector:selector, handler:$.proxy(handler, this)});\r\n            }\r\n\r\n            return result;\r\n        },\r\n\r\n\r\n        /*********************************************************************************\r\n         * Utils\r\n         *********************************************************************************/\r\n\r\n        /***\r\n         * A shortcut to this.el.find(selector)\r\n         * @param {String} selector\r\n         * @return {jQuery}\r\n         */\r\n        $:function (selector) {\r\n            return this.el.find(selector);\r\n        }\r\n\r\n\r\n    };\r\n\r\n    // Inherit from Bindable\r\n    View.inherits(Bindable);\r\n\r\n\r\n    return View;\r\n});", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty,\n  slice = [].slice;\n\ndefine('fire/ui/view', function(require) {\n  var View, em;\n  em = require('fire/util/eventEmitter');\n\n  /*\n  The basic view building block\n   */\n  View = (function(superClass) {\n    extend(View, superClass);\n\n    function View(options) {\n      if (options == null) {\n        options = {};\n      }\n      this.options = options;\n      if (this.defaultOptions) {\n        this.options = $.extend({}, this.defaultOptions, options);\n      }\n      View.__super__.constructor.apply(this, arguments);\n      this._modifiers = {};\n      this.el = options.el;\n      if (!this.el) {\n        this.el = this.generate();\n      } else {\n        this.options = $.extend({}, this.defaultOptions, this.el.data(), options);\n      }\n      if (this.autoRender) {\n        this.render();\n        this.setup();\n      }\n    }\n\n    View.prototype.autoRender = true;\n\n    View.prototype.render = function() {\n      return null;\n    };\n\n    View.prototype.setup = function() {\n      if (this.attrs) {\n        this.el.attr(this.attrs);\n      }\n      if (this.cssClass) {\n        this.el.addClass(this.cssClass);\n      }\n      if (this.events) {\n        return this.delegate(this._extractEvents(this.events));\n      }\n    };\n\n    View.prototype.remove = function() {\n      if (this.beforeRemove) {\n        this.beforeRemove();\n      }\n      if (this.el) {\n        this.el.remove();\n      }\n      return this.removed = true;\n    };\n\n    View.prototype.find = function(selector) {\n      return this.el.find(selector);\n    };\n\n    View.prototype.delegate = function(events) {\n      var e, j, len, results;\n      results = [];\n      for (j = 0, len = events.length; j < len; j++) {\n        e = events[j];\n        results.push(this.el.on(e.name, e.selector, e.handler));\n      }\n      return results;\n    };\n\n    View.prototype.undelegate = function(events) {\n      var e, j, len, results;\n      results = [];\n      for (j = 0, len = events.length; j < len; j++) {\n        e = events[j];\n        results.push(this.el.off(e.name, e.selector, e.handler));\n      }\n      return results;\n    };\n\n    View.prototype.generate = function() {\n\n      /*\n      An override of view to allow quick generation of widget steps\n       */\n      var cls, h, selEl, selector;\n      if (this.templateSelector) {\n        selector = _.result(this, 'templateSelector');\n        selEl = $(selector);\n        h = selEl.html();\n        cls = selEl.data('class') || '';\n        if (!h) {\n          throw \"Could not find html content with the selector \" + selector + \".\";\n        }\n        return $('<div>').addClass(cls).append(h);\n      }\n    };\n\n    View.prototype._extractEvents = function(eventDict) {\n\n      /*\n      Converts an event dict to a list of event handlers\n       */\n      var extractEvent, k, v;\n      if (!eventDict) {\n        return [];\n      }\n      extractEvent = (function(_this) {\n        return function(key, handlerName) {\n          var handler, name, ref, selector;\n          ref = key.split(' '), name = ref[0], selector = 2 <= ref.length ? slice.call(ref, 1) : [];\n          handler = _this[handlerName];\n          if (!handler) {\n            throw \"The handler \" + handlerName + \" was not found in \" + _this;\n          }\n          return {\n            name: name,\n            selector: selector.join(' '),\n            handler: $.proxy(handler, _this)\n          };\n        };\n      })(this);\n      return (function() {\n        var results;\n        results = [];\n        for (k in eventDict) {\n          v = eventDict[k];\n          results.push(extractEvent(k, v));\n        }\n        return results;\n      })();\n    };\n\n    View.prototype.addModifier = function(modifier, allowDomUpdate) {\n      var u;\n      if (allowDomUpdate == null) {\n        allowDomUpdate = false;\n      }\n\n      /*\n      Add a modifier to the current view\n      \n      Params:\n        - modifier\n        - allowDomUpdate        Sets a delay so the browser could update the dom before applying the modifier\n       */\n      if (this.hasModifier(modifier)) {\n        return;\n      }\n      this._modifiers[modifier] = true;\n      u = (function(_this) {\n        return function() {\n          if (_this.el) {\n            return _this.el.addClass(\"is-\" + modifier);\n          }\n        };\n      })(this);\n      if (allowDomUpdate) {\n        return setTimeout(u, 20);\n      } else {\n        return u();\n      }\n    };\n\n    View.prototype.removeModifier = function(modifier) {\n\n      /*\n      Remove the modifier from the view\n      \n      Params:\n        - modifier\n       */\n      if (!this.hasModifier(modifier)) {\n        return;\n      }\n      delete this._modifiers[modifier];\n      if (this.el) {\n        return this.el.removeClass(\"is-\" + modifier);\n      }\n    };\n\n    View.prototype.hasModifier = function(modifier) {\n\n      /*\n      Checks if the given modifier is active\n      \n      Params:\n        - Modifier  The modifier\n      \n      Returns:\n        true if the view has the given modifier, false if not\n       */\n      return modifier in this._modifiers;\n    };\n\n    View.prototype.modifiers = function() {\n\n      /*\n      Returns a list of the active modifiers\n       */\n      var i;\n      return (function() {\n        var results;\n        results = [];\n        for (i in this._modifiers) {\n          results.push(i);\n        }\n        return results;\n      }).call(this);\n    };\n\n    return View;\n\n  })(em.Emitter);\n  return {\n    View: View\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\ndefine('fire/ui/overlay2', function(require) {\n  var FADE_DURATION, Overlay, SHIM_CLS, Z_INDEX, _body, _doc, _win;\n  Z_INDEX = 5000;\n  SHIM_CLS = 'fire-shim';\n  FADE_DURATION = 300;\n  _doc = $(document);\n  _body = $(_doc[0].body);\n  _win = $(window);\n  Overlay = (function() {\n    function Overlay(clickCallback, extraClass, zIndex) {\n      this.zIndex = zIndex != null ? zIndex : Z_INDEX;\n      this.position = bind(this.position, this);\n\n      /*\n      \n      Create an Overlay\n      \n      @param {Function=}  clickCallback an optional click callback\n      @param {String=}    extraClass    an optional class names to add  to the overlay\n      @param {Number=}    zIndex        an optional zIndex to set\n       */\n      this.el = $('<div>').addClass(SHIM_CLS).addClass(extraClass).css({\n        position: 'fixed',\n        'z-index': this.zIndex,\n        top: 0,\n        left: 0\n      });\n      this.position();\n      _body.prepend(this.el);\n      if (clickCallback) {\n        this.el.on('click', clickCallback);\n      }\n      _win.on('resize', this.position);\n    }\n\n    Overlay.prototype.position = function() {\n\n      /*\n      Reposition the Overlay div\n       */\n      return this.el.css({\n        width: _doc.width(),\n        height: _doc.height()\n      });\n    };\n\n    Overlay.prototype.remove = function(fade) {\n\n      /*\n      Remove the overlay\n      \n      @param {Boolean=} fade  use a fade animation when removing the element\n      \n      @returns {jQuery.Deferred} a deferred object that is resolved when the element is\n                                 removed\n       */\n      if (this.removed) {\n        return;\n      }\n      this.removed = true;\n      _win.off('resize', this.position);\n      if (fade) {\n        this.el.animate({\n          opacity: 0\n        }, FADE_DURATION);\n      }\n      return $.when(this.el).done((function(_this) {\n        return function() {\n          return _this.el.remove();\n        };\n      })(this));\n    };\n\n    return Overlay;\n\n  })();\n  return {\n    Overlay: Overlay\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\n\n/*\nProper view documentation\n */\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/views/PopoverView', function(require) {\n  var ACTIVE_CLASS, MARKUP, PopoverView, Z_INDEX, _body, _doc, _win, overlay, view;\n  overlay = require('fire/ui/overlay2');\n  view = require('fire/ui/view');\n  MARKUP = '<div class=\"popover\"><div class=\"arrow\"></div><div class=\"inner\"><div class=\"content\"></div></div></div>';\n  ACTIVE_CLASS = 'active';\n  Z_INDEX = 6000;\n  _doc = $(document);\n  _body = $(_doc[0].body);\n  _win = $(window);\n\n  /*\n    Provides a simple modal implementation\n   */\n  PopoverView = (function(superClass) {\n    extend(PopoverView, superClass);\n\n    function PopoverView() {\n      return PopoverView.__super__.constructor.apply(this, arguments);\n    }\n\n    PopoverView.prototype.overlayClose = true;\n\n    PopoverView.prototype.show = function(targetEl) {\n      this.targetEl = targetEl;\n      this.overlay = new overlay.Overlay(((function(_this) {\n        return function() {\n          return _this.onOverlayClicked();\n        };\n      })(this)), null, Z_INDEX - 1);\n      this.position();\n      this.targetEl.addClass(ACTIVE_CLASS);\n      this.positionHook = (function(_this) {\n        return function() {\n          return _this.position();\n        };\n      })(this);\n      _win.on('resize', this.positionHook);\n      return this.afterShow();\n    };\n\n    PopoverView.prototype.setup = function() {\n\n      /*\n        Override the View's setup method, to wrap the generated content\n       */\n      var position;\n      PopoverView.__super__.setup.apply(this, arguments);\n      if (this.options.fixed === true) {\n        position = 'fixed';\n      } else {\n        position = 'absolute';\n      }\n      this.wrap = $(MARKUP).css({\n        'z-index': Z_INDEX,\n        'position': position\n      }).hide().appendTo(_body);\n      this.wrap.find('.content').append(this.el);\n      return this.wrap.delegate('.fire-popover-close', 'click', (function(_this) {\n        return function() {\n          return _this.close();\n        };\n      })(this));\n    };\n\n    PopoverView.prototype.position = function() {\n\n      /*\n      Reposition the popover\n       */\n      var isAbove, left, o, popoverWidth, targetWidth, top;\n      o = this.targetEl.offset();\n      isAbove = this.targetEl.hasClass('pop-above') || this.options.isAbove;\n      if (isAbove) {\n        this.wrap.addClass('popover-above');\n      } else {\n        this.wrap.addClass('popover-below');\n      }\n      this.wrap.show();\n      targetWidth = this.targetEl.outerWidth();\n      popoverWidth = this.wrap.outerWidth();\n      left = this.calculateLeft(o.left, targetWidth, popoverWidth);\n      top = 0;\n      if (isAbove) {\n        top = o.top - this.wrap.outerHeight();\n      } else {\n        top = o.top + this.targetEl.outerHeight();\n      }\n      if (this.options.fixed === true) {\n        top -= document.body.scrollTop;\n        left -= document.body.scrollLeft;\n      }\n      this.wrap.css({\n        top: top - 2,\n        left: left\n      });\n      return setTimeout(((function(_this) {\n        return function() {\n          return _this.fixPlaceholders();\n        };\n      })(this)), 20);\n    };\n\n    PopoverView.prototype.calculateLeft = function(targetLeft, targetWidth, popoverWidth) {\n\n      /*\n      Calculate the left offset for the popover\n       */\n      var left, originalLeft, right, viewportWidth;\n      viewportWidth = _win.width();\n      originalLeft = left = targetLeft + (targetWidth / 2) - (popoverWidth / 2);\n      if (left < 0 && popoverWidth < viewportWidth) {\n        left = 5;\n      }\n      right = left + popoverWidth;\n      if (right > viewportWidth) {\n        left = viewportWidth - 5 - popoverWidth;\n      }\n      this.wrap.find('.arrow').css('margin-left', -10 + (originalLeft - left));\n      return left;\n    };\n\n    PopoverView.prototype.fixPlaceholders = function() {\n\n      /*\n      A little hack to apply the placeholder polyfill\n      On the new elements\n      \n      TODO:\n      Maybe this should be in the base view?\n      shlomiatar @ 02/04/13\n       */\n      var pf;\n      pf = $.fn.placeholderPolyfill;\n      if (pf) {\n        return pf(this.wrap, true);\n      }\n    };\n\n    PopoverView.prototype.onOverlayClicked = function() {\n      if (this.overlayClose) {\n        return this.close();\n      }\n    };\n\n    PopoverView.prototype.close = function() {\n\n      /*\n      Close the popover\n       */\n      if (this.onClose() === false) {\n        return;\n      }\n      this.unmask();\n      this.targetEl.removeClass(ACTIVE_CLASS);\n      this.overlay.remove();\n      this.wrap.hide();\n      return _win.off('resize', this.positionHook);\n    };\n\n    PopoverView.prototype.mask = function(text, cls) {\n\n      /*\n      Mask the popover with a message\n       */\n      var content;\n      this.unmask();\n      content = this.wrap.find('.content').first();\n      this.maskEl = $('<div class=\"popover-mask\"><div class=\"mask-content\">' + text + '</div></div> ');\n      if (cls) {\n        this.maskEl.addClass(cls);\n      }\n      this.maskEl.css({\n        width: content.outerWidth(),\n        height: content.outerHeight()\n      });\n      return content.before(this.maskEl);\n    };\n\n    PopoverView.prototype.unmask = function() {\n      if (this.maskEl) {\n        this.maskEl.remove();\n        return this.maskEl = null;\n      }\n    };\n\n    PopoverView.prototype.onClose = function() {};\n\n    PopoverView.prototype.afterShow = function() {};\n\n    return PopoverView;\n\n  })(view.View);\n  return {\n    PopoverView: PopoverView\n  };\n});\n", "/****\n *  @fileOverview\n *\n *\n *****/\n\ndefine('fire/ui/overlay', function (require) {\n    var Z_INDEX = 5000;\n    var SHIM_CLS = 'fire-shim';\n    var FADE_DURATION = 300;\n\n    var _doc = $(document);\n    var _body = $(_doc[0].body);\n    var _win = $(window);\n    var _current;\n\n    function show(zIndex, extraClass, closeOnClick) {\n        // remove previous shim\n        remove();\n\n        zIndex = zIndex || Z_INDEX;\n\n        // new deferred\n        var dfd = $.Deferred();\n\n        // create shim\n        var el = $('<div/>').addClass(SHIM_CLS + ' ' + (extraClass || ''));\n\n        // set current + css\n        _current = el.css({position: 'absolute', 'z-index': zIndex, top: 0, left: 0, overflow: 'hidden'});\n\n\n        // resize handler\n        _win.on('resize', position);\n\n        // position\n        position();\n        // add to dom\n        _body.prepend(el);\n\n        // click handler\n        el.click(function (e) {\n            dfd.resolve(e);\n            if (closeOnClick) {\n                remove();\n            }\n        });\n\n\n        // return promise\n        return dfd.promise();\n    }\n\n\n    /****\n     *\n     * @param {Boolean=} fade\n     */\n    function remove(fade) {\n        if (!_current) return;\n        _win.off('resize', position);\n\n        if (fade) {\n            _current.animate({opacity: 0}, FADE_DURATION);\n\n        }\n\n        // support for fade\n        return $.when(_current).done(function () {\n            if (_current) _current.remove();\n            _current = null;\n        })\n    }\n\n    function position() {\n        if (!_current) return;\n\n\n        // hide the overlay to not interfere with the scroll width/height calculation\n        _current.hide();\n        _current.css({width: _body[0].scrollWidth, height: _body[0].scrollHeight});\n        _current.show();\n    }\n\n\n    return {\n        show: show,\n        remove: remove\n    };\n\n});", "// Generated by CoffeeScript 1.12.7\n\n/*\n  mobile\n  ======\n\n  A set of utility methods for testing mobile devices and media queries.\n */\ndefine('fire/util/mobile', function(require) {\n  var isLandscape, isMiniLayout, isMobile, isPhone, isPortrait, isRetina, isTablet, mq;\n  mq = function(q) {\n\n    /*\n    Test a media query and see if it matches\n    \n    Params:\n      q   The media query to test for\n    \n    Examples:\n      mobile.mq(\"screen and (max-width: 600px)\")\n      => true\n     */\n    var m, matchMedia;\n    matchMedia = window.matchMedia || window.msMatchMedia;\n    if (!matchMedia) {\n      return false;\n    }\n    m = matchMedia(q);\n    return m && (m.matches || false);\n  };\n  isMobile = function() {\n\n    /*\n    Returns true if the device is a phone or a tablet\n     */\n    return isPhone() || isTablet();\n  };\n  isLandscape = function() {\n\n    /*\n    Returns true if our orientation is landscape\n     */\n    return mq('(orientation: landscape)');\n  };\n  isPortrait = function() {\n\n    /*\n    Returns true if our orientation is portrait\n     */\n    return mq('(orientation: portrait)');\n  };\n  isPhone = function() {\n\n    /*\n    Returns true if the device is a phone\n     */\n    return mq('only screen and (min-device-width: 320px) and (max-device-width: 480px)');\n  };\n  isTablet = function() {\n\n    /*\n    Returns true if the device is a tablet\n     */\n    return mq('only screen and (min-device-width:768px) and (max-device-width:1024px)');\n  };\n  isRetina = function() {\n\n    /*\n    Returns true if the device has high pixel density\n     */\n    return mq('only screen and (-webkit-min-device-pixel-ratio : 1.5)') || mq('only screen and (min-device-pixel-ratio : 1.5)');\n  };\n  isMiniLayout = function() {\n\n    /*\n    Returns true if the screen is in mini layout\n     */\n    return mq('only screen and (max-width: 720px)');\n  };\n  return {\n    mq: mq,\n    isMobile: isMobile,\n    isLandscape: isLandscape,\n    isPortrait: isPortrait,\n    isPhone: isPhone,\n    isTablet: isTablet,\n    isRetina: isRetina,\n    isMiniLayout: isMiniLayout\n  };\n});\n", "define('fire/ui/modal', function (require) {\r\n    var overlay = require('fire/ui/overlay');\r\n    var mobile = require('fire/util/mobile');\r\n\r\n    var Z_INDEX = 101;\r\n\r\n    var DEFAULTS = {\r\n        animate: true,\r\n        width: 500,\r\n        overlayClose: true,\r\n        loadingTitle: 'Loading...',\r\n        overlayClass: '',\r\n        close: null,\r\n        cssClass: '',\r\n        loadingSubtitle: '',\r\n        zIndex: Z_INDEX,\r\n        skipOverlay: false,\r\n        containerEl: false\r\n    };\r\n\r\n    var OVERLAY_CLASS = 'fire-modal-overlay';\r\n    var MODAL_CLASS = 'fire-modal';\r\n    var MOBILE_MODAL_CLASS = 'fire-modal-mobile';\r\n\r\n    var ANIMATION_DURATION = 250;\r\n\r\n\r\n    var _win = $(window);\r\n    var _body = $('body');\r\n\r\n    var _current, _options, _contentWrap, _locked;\r\n\r\n    // This should be extracted to a helper 'fire' library\r\n    var isTouch = \"ontouchend\" in document;\r\n\r\n    var _isPhone = mobile.isPhone();\r\n\r\n    /**************************** REMOTE URL ************************************/\r\n\r\n    function showUrl(url, options) {\r\n        // fetch the remote content\r\n        return showDeferred($.get(url), options);\r\n    }\r\n\r\n    function showDeferred(deferred, options) {\r\n        var dfd = $.Deferred();\r\n\r\n        // handle the case of a resolved deferred\r\n        if (deferred.state() === 'resolved') {\r\n            deferred.done(function (r) {\r\n                show(r, options).done(dfd.resolve);\r\n                return dfd.promise();\r\n            });\r\n            return dfd.promise();\r\n        }\r\n\r\n\r\n        // show the loading screen\r\n        show(getLoading(options), options).done(function () {\r\n            // When the deferred is completed\r\n            deferred.done(function (r) {\r\n                // replace content\r\n                _contentWrap.html(r);\r\n                position();\r\n                dfd.resolve(_current);\r\n            }).fail(function (r) {\r\n                // In case of an error\r\n                _contentWrap.html(getError());\r\n                _current.addClass(MODAL_CLASS + '-error');\r\n                position();\r\n                dfd.reject(_current);\r\n            });\r\n        });\r\n\r\n\r\n        return dfd.promise();\r\n    }\r\n\r\n\r\n    function getLoading(options) {\r\n        var o = $.extend({}, DEFAULTS, options || {});\r\n\r\n        return '<div class=\"spinner\"><h3><span></span>' + o.loadingTitle\r\n            + '</h3><p class=\"help-text\">' + o.loadingSubtitle\r\n            + '</p></div>'\r\n    }\r\n\r\n    function getError() {\r\n\r\n        return '<div class=\"' + MODAL_CLASS + '-error-content\"><h3 class=\"webfont\">Oops! Something bad happened :/</h3>' +\r\n            '<p>Hope we can still be friends...</p> ' +\r\n            '<p style=\"margin-top: 15px;\"><a class=\"' + MODAL_CLASS + '-close\">Close this</a> or <a href=\"mailto:hello@smore.com\">shower us with rage</a>.</div></div>';\r\n    }\r\n\r\n    /**************************** MODAL  ************************************/\r\n\r\n\r\n    function show(content, options) {\r\n\r\n        var dfd = $.Deferred();\r\n\r\n        // init options\r\n        _options = $.extend({}, DEFAULTS, options, {});\r\n\r\n        // close the currently open modal;\r\n        close();\r\n\r\n        if (_isPhone) {\r\n            return showPhone(content);\r\n        }\r\n\r\n        var containerEl = options.containerEl || _body;\r\n        _current = setup(content, MODAL_CLASS, containerEl);\r\n\r\n        // Store the container el\r\n        if (options.containerEl) {\r\n            _current.data('containerEl', options.containerEl);\r\n        }\r\n\r\n        _current.css('width', options.width);\r\n\r\n\r\n        if (!options.skipOverlay) {\r\n            var oc = OVERLAY_CLASS;\r\n            if (options.overlayClass) {\r\n                oc += (' ' + options.overlayClass);\r\n            }\r\n\r\n            // show overlay\r\n            var o = overlay.show(_options.zIndex, oc, _options.overlayClose);\r\n\r\n            // attach close\r\n            if (_options.overlayClose) {\r\n                o.done(close);\r\n            }\r\n        }\r\n\r\n        // position\r\n        position();\r\n\r\n        if (options.resolveBeforeAnimation) {\r\n            dfd.resolve(_current);\r\n        }\r\n\r\n        // apply show animation\r\n        if (_options.animate) {\r\n            animate('show', _current);\r\n        }\r\n\r\n        // resolve the deferred after the animation completion\r\n        $.when(_current).done(dfd.resolve);\r\n\r\n        // return deferred\r\n        return dfd.promise();\r\n    }\r\n\r\n    function position() {\r\n        if (!_current || _isPhone) return;\r\n        var width = _current.width();\r\n        var height = _current.height();\r\n\r\n        var left = 0;\r\n        var top = 0;\r\n\r\n        if (_current.data('containerEl')) {\r\n            var containerEl = _current.data('containerEl');\r\n\r\n            var containerHeight = containerEl.height();\r\n            var containerWidth = containerEl.width();\r\n\r\n            // put at screen center\r\n            top = (containerHeight / 2 ) - (height / 2);\r\n\r\n            // if our modal is too big for the screen, position it 50 pixel from the top\r\n            if (top < 0) {\r\n                top = 50;\r\n            }\r\n\r\n            left = (containerWidth / 2) - (width / 2);\r\n\r\n\r\n        } else {\r\n\r\n            var scrollTop = _win.scrollTop();\r\n            var scrollLeft = _win.scrollLeft();\r\n            var screenWidth = window.innerWidth || _win.width();\r\n            var screenHeight = window.innerHeight || _win.height();\r\n\r\n            // put at screen center\r\n            top = scrollTop + (screenHeight / 2 ) - (height / 2);\r\n\r\n            // if our modal is too big for the screen, position it 50 pixel from the top\r\n            if (top < scrollTop) {\r\n                top = scrollTop + 50;\r\n            }\r\n\r\n            left = scrollLeft + (screenWidth / 2) - (width / 2);\r\n        }\r\n\r\n\r\n        _current.css({\r\n            top: top,\r\n            left: left\r\n        });\r\n\r\n        window.setTimeout(fixPlaceholders, 20);\r\n    }\r\n\r\n    function setup(content, modalClass, containerEl) {\r\n        var c = $(content).show();\r\n\r\n        var dom = $('<div/>').addClass(modalClass + '  ' + (_options.cssClass || ''));\r\n        // wrap content with a wrapper div;\r\n        _contentWrap = c.wrap('<div/>').parent().addClass(MODAL_CLASS + '-content');\r\n\r\n        dom.append(_contentWrap);\r\n        containerEl.append(dom);\r\n\r\n\r\n        // delegate the 'fire-modal-close' class to close the modal\r\n        dom.delegate('.' + MODAL_CLASS + '-close', 'click', onCloseClicked);\r\n\r\n        return dom;\r\n    }\r\n\r\n    /***\r\n     *\r\n     * @param {string} type animation type (show/hide)\r\n     */\r\n    function animate(type, el) {\r\n        if (!el) return $.when();\r\n\r\n        // remove shadow for performance\r\n        el.addClass('no-shadow');\r\n\r\n        if (type === 'show') {\r\n            el.css({'margin-top': '-50px', opacity: 0})\r\n                .show()\r\n                .animate({'margin-top': 0, 'opacity': 1}, ANIMATION_DURATION);\r\n        }\r\n\r\n        if (type === 'hide') {\r\n            el\r\n                .animate({'margin-top': '50px', 'opacity': 0}, ANIMATION_DURATION);\r\n        }\r\n\r\n\r\n        return $.when(el).done(function () {\r\n            el.removeClass('no-shadow');\r\n        });\r\n    }\r\n\r\n    /***\r\n     *\r\n     * @param {Boolean=} fast should we use animation for the close?\r\n     */\r\n    function close(fast) {\r\n        if (!_current) return $.when();\r\n\r\n        if (_isPhone) return closePhone();\r\n\r\n        unlock();\r\n\r\n        var cur = _current;\r\n        // remove events\r\n        _win.off('resize', position);\r\n\r\n        // hide overlay\r\n        var o = overlay.remove(!fast && _options.animate);\r\n\r\n        // animate hide\r\n        if (_options.animate && !fast) {\r\n            animate('hide', cur);\r\n        }\r\n\r\n        // when done\r\n        return $.when(o, cur).done(function () {\r\n            // fix a tipsy issue\r\n            $('div.tipsy').hide();\r\n\r\n            if (_options && _options.close) {\r\n                _options.close(cur);\r\n            }\r\n            cur.detach();\r\n            var containerEl = _current.data('containerEl');\r\n\r\n            _contentWrap = _current = _options = cur = null;\r\n\r\n\r\n            if (containerEl) {\r\n                containerEl.remove();\r\n            }\r\n        });\r\n    }\r\n\r\n    /*********************************************************************************\r\n     * Phone width modal\r\n     *********************************************************************************/\r\n\r\n        // TODO - maybe restore the scroll position after a close?\r\n\r\n    function closePhone() {\r\n\r\n        var cur = _current;\r\n        if (_options && _options.close) _options.close(cur);\r\n        cur.remove();\r\n\r\n        // clean up everything\r\n        _contentWrap = _current = _options = cur = null;\r\n\r\n        // restore the body state\r\n        showBodyItems();\r\n\r\n        _body.removeClass('mobile-modal-body');\r\n\r\n        // restore the scroll top\r\n\r\n        if (_prePhoneScrollTop) {\r\n            _body.scrollTop(_prePhoneScrollTop);\r\n            _prePhoneScrollTop = null;\r\n        }\r\n\r\n        return $.when();\r\n    }\r\n\r\n    var _prePhoneScrollTop = null;\r\n\r\n    /***\r\n     * Show phone content\r\n     * @param content\r\n     */\r\n    function showPhone(content) {\r\n        // store the scroll top value\r\n        _prePhoneScrollTop = _body.scrollTop();\r\n\r\n        // hide body items\r\n        hideBodyItems();\r\n\r\n        // setup phone view\r\n        _current = setup(content, MOBILE_MODAL_CLASS,_body);\r\n\r\n        _body.addClass('mobile-modal-body');\r\n\r\n        // scroll to the top\r\n        _body.scrollTop(0);\r\n        return $.when(_current);\r\n    }\r\n\r\n    var _hiddenBodyItems;\r\n\r\n    function showBodyItems() {\r\n        // restore hidden body items\r\n        _hiddenBodyItems.show();\r\n\r\n        // remove current body items\r\n        _hiddenBodyItems = null;\r\n    }\r\n\r\n    function hideBodyItems() {\r\n        _hiddenBodyItems = _body.children(':visible').hide();\r\n    }\r\n\r\n\r\n    function fixPlaceholders() {\r\n        var pf = $.fn.placeholderPolyfill;\r\n        if (!_current || !pf) return;\r\n\r\n        // apply the placeholder on child elements\r\n        pf(_current, true);\r\n    }\r\n\r\n\r\n    function lock() {\r\n        _locked = true;\r\n\r\n        if (_current) _current.addClass('fire-modal-locked');\r\n    }\r\n\r\n    function unlock() {\r\n        _locked = false;\r\n\r\n        if (_current) _current.removeClass('fire-modal-locked');\r\n    }\r\n\r\n\r\n    function onCloseClicked(e) {\r\n        e.preventDefault();\r\n        e.stopImmediatePropagation();\r\n\r\n        var t = $(e.currentTarget);\r\n        if (_locked || t.hasClass('disabled')) return;\r\n\r\n        close();\r\n    }\r\n\r\n    // setup events\r\n\r\n    if (!isTouch) {\r\n        _win.on('resize', position);\r\n    }\r\n\r\n\r\n    var module = {\r\n        close: close,\r\n        show: show,\r\n        showUrl: showUrl,\r\n        showDeferred: showDeferred,\r\n        position: position,\r\n        lock: lock,\r\n        unlock: unlock\r\n    };\r\n\r\n\r\n    /*****\r\n     * Backward compatibility\r\n     * @deprecated\r\n     */\r\n    window.fire.modal = module;\r\n\r\n    /*****\r\n     * Backward compatibility\r\n     * @deprecated\r\n     */\r\n    window.fire.modal.reposition = position;\r\n\r\n\r\n    return module;\r\n});\r\n", "// Generated by CoffeeScript 1.12.7\n\n/*\n  TODO - Proper view documentation\n */\nvar bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/views/ModalView', function(require) {\n  var ModalView, history, modal, view;\n  modal = require('fire/ui/modal');\n  view = require('fire/ui/view');\n  history = require('fire/util/history');\n\n  /*\n    Provides a simple modal implementation\n  \n    @class ModalView\n   */\n  ModalView = (function(superClass) {\n    var PRELOAD_CACHE;\n\n    extend(ModalView, superClass);\n\n    PRELOAD_CACHE = {};\n\n    function ModalView(url1, options) {\n      this.url = url1;\n      this.onModalCompleted = bind(this.onModalCompleted, this);\n      ModalView.__super__.constructor.call(this, options);\n      if (this.enableHistory) {\n        this.historyHelper = history.getHelper((function(_this) {\n          return function(e, state) {\n            if (state && state.init) {\n              return _this.close();\n            }\n          };\n        })(this));\n      }\n      if (this.preload) {\n        this.getContent();\n      }\n    }\n\n    ModalView.prototype.autoRender = false;\n\n    ModalView.prototype.preload = false;\n\n    ModalView.prototype.show = function(modalOptions) {\n      var close;\n      close = $.proxy(this.onClose, this);\n      if (this.preload) {\n        modalOptions = $.extend({}, {\n          resolveBeforeAnimation: true,\n          close: close\n        }, modalOptions);\n      }\n      return modal.showDeferred(this.getContent(), modalOptions).always(this.onModalCompleted);\n    };\n\n    ModalView.prototype.onModalCompleted = function(el) {\n\n      /*\n      Happens when the modal creation is complete.\n      \n      We use this event to initalize the modal, setup history and call the render function\n       */\n      if (this.enableHistory) {\n        this.historyHelper.push({\n          init: true\n        });\n      }\n      this.el = el;\n      this.setup();\n      this.setupModalEvents();\n      this.render();\n      return modal.position();\n    };\n\n    ModalView.prototype.close = function(fast) {\n      return modal.close(fast);\n    };\n\n    ModalView.prototype.onClose = function() {\n\n      /*\n      Modals can override this to define behavior on close\n       */\n      return this.closed = true;\n    };\n\n    ModalView.prototype.setupModalEvents = function() {\n      return null;\n    };\n\n    ModalView.prototype.getContent = function() {\n\n      /*\n      Loads the content from the given url, if preload is defined, the content will be cached\n       */\n      var result;\n      if (this._loadedContent) {\n        return $.when(this._loadedContent);\n      }\n      result = this._loadContent();\n      if (this.preload) {\n        result.done((function(_this) {\n          return function(content) {\n            return _this._loadedContent = content;\n          };\n        })(this));\n      }\n      return result;\n    };\n\n    ModalView.prototype._loadContent = function() {\n\n      /*\n      Loads the content, use the preload cache if possible\n       */\n      var name;\n      if (!this.preload) {\n        return $.get(this.url);\n      }\n      return PRELOAD_CACHE[name = this.url] != null ? PRELOAD_CACHE[name] : PRELOAD_CACHE[name] = $.get(this.url);\n    };\n\n    ModalView.preloadUrl = function(url) {\n\n      /*\n      Preloads the url and stores it in cache for all the modals\n       */\n      return PRELOAD_CACHE[url] = $.get(url);\n    };\n\n    return ModalView;\n\n  })(view.View);\n  return {\n    ModalView: ModalView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/views/WizardView', function(require) {\n  var WizardView, history, view;\n  view = require('fire/ui/view');\n  history = require('fire/util/history');\n\n  /*\n  WizardView class\n  \n  The WizardView provides an abstraction to working with\n  wizard steps and some simple navigation/stack\n  \n  Example:\n    class MolshWizardView extends WizardView\n  \n       * Set the keys in the steps dict so that the goTo method will be\n       * able to initialize them\n      steps:\n        firstStep:  FirstStepView\n        secondStep: SecondStepView\n  \n  \n     * Initializing:\n    m = new MolshWizardView({el: $('#wizard-container')},'firstStep')\n  \n     * programmatically go to the second step\n    m.goTo('secondStep')\n  \n     * go back to the first step\n    m.back()\n   */\n  WizardView = (function(superClass) {\n    extend(WizardView, superClass);\n\n    function WizardView(options, startStep) {\n\n      /*\n      Create a new WizardView\n      \n      @param {Object} options     initial options for the view\n      @param {String} startStep   Optional step name to start with\n      \n      @option options {Object} context the default context\n       */\n      WizardView.__super__.constructor.call(this, options);\n      this.context = options.context || {};\n      this.step = null;\n      this.stack = [];\n      if (!this.steps) {\n        this.steps = {};\n      }\n      if (startStep) {\n        this.goTo(startStep);\n      }\n      if (this.options.enableHistory) {\n        this.setupHistoryTracking();\n      }\n    }\n\n    WizardView.prototype.back = function() {\n\n      /*\n      Navigate back to the previous step\n       */\n      var backStep, upcomingStep;\n      if (this.stack.length) {\n        upcomingStep = this.stack.pop();\n        backStep = this.step.getBackStep(upcomingStep);\n        this._popStatesUpTo(backStep);\n        return this._setStep(backStep);\n      }\n    };\n\n    WizardView.prototype.goTo = function(stepName) {\n\n      /*\n      Go to the given step name\n       */\n      if (this.step) {\n        this.stack.push(this.context.step);\n      }\n      this._setStep(stepName);\n      if (this.historyHelper) {\n        return this.historyHelper.push({\n          newStep: stepName\n        });\n      }\n    };\n\n    WizardView.prototype.setup = function() {\n      WizardView.__super__.setup.apply(this, arguments);\n      return this.el.on('click', '.wizard-back-button', (function(_this) {\n        return function() {\n          return _this.back();\n        };\n      })(this));\n    };\n\n    WizardView.prototype._setStep = function(stepName) {\n\n      /*\n      Set the current step from a given step name\n      \n      @param {String} stepName\n       */\n      var cls;\n      if (this.step) {\n        this.step.remove();\n      }\n      cls = this._getStepClass(stepName);\n      this.step = new cls(this);\n      this.el.append(this.step.el);\n      return this.context.step = stepName;\n    };\n\n    WizardView.prototype._popStatesUpTo = function(targetStep) {\n\n      /*\n      This method pops the stats up to the target state\n       */\n      var results;\n      if (this.stack.indexOf(targetStep) === -1) {\n        return;\n      }\n      results = [];\n      while (this.stack.pop() === !targetStep) {\n        results.push(this.historyHelper.pop());\n      }\n      return results;\n    };\n\n    WizardView.prototype._getStepClass = function(name) {\n\n      /*\n      Get the class matching the name\n       */\n      var cls;\n      cls = this.steps[name];\n      if (!cls) {\n        throw \"Can't get step \" + name + \". You should set the steps dict on your implementation\";\n      }\n      return cls;\n    };\n\n    WizardView.prototype.setupHistoryTracking = function() {\n\n      /*\n      Enables history tracking when setting steps / hitting the back button\n       */\n      this.historyHelper = history.getHelper((function(_this) {\n        return function(state) {\n          return _this.back();\n        };\n      })(this));\n      return this.historyHelper.push({\n        init: true\n      });\n    };\n\n    return WizardView;\n\n  })(view.View);\n  return {\n    WizardView: WizardView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/views/WizardStepView', function(require) {\n  var WizardStepView, view;\n  view = require('fire/ui/view');\n  WizardStepView = (function(superClass) {\n    extend(WizardStepView, superClass);\n\n    function WizardStepView(wizard, options) {\n      this.wizard = wizard;\n      this.context = this.wizard.context;\n      WizardStepView.__super__.constructor.call(this, options);\n    }\n\n    WizardStepView.prototype.getBackStep = function(upcomingStep) {\n\n      /*\n      This method can be overwritten by steps to provide a smarter \"back\" functionality\n      \n      Params:\n        - upcomingStep  The step that the stack gave us\n      \n      Returns:\n        The step the wizard should go to\n      \n      Note:\n        The wizard is responsible to clear the steps in the history/stack up to the given step\n       */\n      return upcomingStep;\n    };\n\n    return WizardStepView;\n\n  })(view.View);\n  return {\n    WizardStepView: WizardStepView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/views/FormView', function(require) {\n  var FieldView, FormView, vw;\n  vw = require('fire/ui/view');\n  FormView = (function(superClass) {\n    var FIELDS_SELECTOR, FORM_STATES;\n\n    extend(FormView, superClass);\n\n    function FormView() {\n      return FormView.__super__.constructor.apply(this, arguments);\n    }\n\n    FIELDS_SELECTOR = '.form-field, [data-required],[data-validate],[data-field]';\n\n    FORM_STATES = {\n      Error: 'error',\n      Empty: 'empty',\n      Good: 'good'\n    };\n\n    FormView.prototype.render = function() {\n      var i;\n      this.el.on('submit', (function(_this) {\n        return function(e) {\n          return _this.onFormSubmit(e);\n        };\n      })(this));\n      this.submitButton = this.find('.submit-button, input[type=submit]');\n      return this.fields = (function() {\n        var j, len, ref, results;\n        ref = this.find(FIELDS_SELECTOR);\n        results = [];\n        for (j = 0, len = ref.length; j < len; j++) {\n          i = ref[j];\n          results.push(this.getField(i));\n        }\n        return results;\n      }).call(this);\n    };\n\n    FormView.prototype.validate = function() {\n      var f, j, len, ref, results;\n      ref = this.fields;\n      results = [];\n      for (j = 0, len = ref.length; j < len; j++) {\n        f = ref[j];\n        results.push(f.validate());\n      }\n      return results;\n    };\n\n    FormView.prototype.onFormSubmit = function(e) {\n\n      /*\n       * Handle form submission. This method will try to validate the form, and stop submission\n       * If neccessary\n       */\n      this.validate();\n      this.notifyError();\n      if (!this.canSubmit()) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        e.stopPropagation();\n        this.el.addClass('form-has-errors');\n        return false;\n      } else {\n        this.el.removeClass('form-has-errors');\n      }\n      return this.submitButton.addClass('disabled').text('Please wait...');\n    };\n\n    FormView.prototype.canSubmit = function() {\n\n      /*\n       * Are we good for submission?\n       */\n      return this.fields.all(function(f) {\n        return f.isValid();\n      });\n    };\n\n    FormView.prototype.notifyError = function() {\n      if (this.canSubmit()) {\n        return;\n      }\n      return this.trigger('error', this.find('.field-has-errors'));\n    };\n\n    FormView.prototype.getField = function(el) {\n\n      /*\n       * Initalize a new field from the given element\n       */\n      var f;\n      el = $(el);\n      f = new FieldView({\n        el: el\n      });\n      return f;\n    };\n\n    return FormView;\n\n  })(vw.View);\n  FieldView = (function(superClass) {\n    var ERROR_CLASS, VALIDATION_DELAY;\n\n    extend(FieldView, superClass);\n\n    ERROR_CLASS = 'field-has-errors';\n\n    VALIDATION_DELAY = 100;\n\n    function FieldView() {\n      FieldView.__super__.constructor.apply(this, arguments);\n      this.delayedValidation = this.validateKeys.delayed(VALIDATION_DELAY, this);\n      if (this.el.attr('type') === 'checkbox') {\n        this.isCheckbox = true;\n      }\n    }\n\n    FieldView.prototype.render = function() {\n      this.el.addClass('molsh');\n      this.el.on('keyup', (function(_this) {\n        return function(e) {\n          return _this.onKeyUp(e);\n        };\n      })(this)).on('blur', (function(_this) {\n        return function(e) {\n          return _this.onBlur(e);\n        };\n      })(this)).on('cut paste', (function(_this) {\n        return function(e) {\n          return _this.onClipboardTextChange(e);\n        };\n      })(this));\n      return this.el.change((function(_this) {\n        return function(e) {\n          return _this.onKeyUp(e);\n        };\n      })(this));\n    };\n\n    FieldView.prototype.isEmpty = function() {\n      if (this.isCheckbox) {\n        return !this.el.is(':checked');\n      }\n      return !$.trim(this.el.val());\n    };\n\n    FieldView.prototype.isValid = function() {\n      if (this.el.data('required') && this.el.is(\":visible\") && !this.el.prop(\"disabled\")) {\n        return !this.isEmpty();\n      }\n      return true;\n    };\n\n    FieldView.prototype.validate = function() {\n\n      /*\n      This is called on field chnage/before submit making the form mark the errors\n       */\n      this.el.toggleClass(ERROR_CLASS, !this.isValid());\n      return this.trigger('change', this);\n    };\n\n    FieldView.prototype.validateKeys = function() {\n      if (this.isEmpty()) {\n        return this.el.removeClass(ERROR_CLASS);\n      } else {\n        return this.validate();\n      }\n    };\n\n    FieldView.prototype.onKeyUp = function(e) {\n      if (e.which === 9) {\n        return;\n      }\n      return this.delayedValidation();\n    };\n\n    FieldView.prototype.onBlur = function(e) {\n      if (this.isValid()) {\n        this.el.removeClass(ERROR_CLASS);\n      }\n      return this.trigger('change', this);\n    };\n\n    FieldView.prototype.onClipboardTextChange = function(e) {\n      return setTimeout(((function(_this) {\n        return function() {\n          return _this.validate();\n        };\n      })(this)), 100);\n    };\n\n    return FieldView;\n\n  })(vw.View);\n  return {\n    FormView: FormView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/forms/validators', function(require) {\n  var RequiredValidator, VALIDATORS, Validator, fromField;\n  VALIDATORS = [];\n  Validator = (function() {\n    function Validator(field1) {\n      this.field = field1;\n      null;\n    }\n\n    Validator.prototype.validate = function() {\n      throw 'NotImplemented';\n    };\n\n    return Validator;\n\n  })();\n  RequiredValidator = (function(superClass) {\n    var DEFAULT_REQUIRED_MESSAGE;\n\n    extend(RequiredValidator, superClass);\n\n    DEFAULT_REQUIRED_MESSAGE = 'This field is required';\n\n    function RequiredValidator() {\n      RequiredValidator.__super__.constructor.apply(this, arguments);\n      this.message = this.field.options.required;\n      if (this.message === true) {\n        this.message = DEFAULT_REQUIRED_MESSAGE;\n      }\n    }\n\n    RequiredValidator.prototype.validate = function() {\n      if (this.field.isEmpty()) {\n        return this.message;\n      }\n    };\n\n    RequiredValidator.isFieldMatch = function(field) {\n      return field.options.required;\n    };\n\n    return RequiredValidator;\n\n  })(Validator);\n  VALIDATORS.push(RequiredValidator);\n  fromField = function(fieldView) {\n\n    /*\n    Get a list of validators for the given field\n    \n    We will iterate over all the registered validators and their 'isFieldMatch' static method\n     */\n    var i, len, result, validatorClass;\n    result = [];\n    for (i = 0, len = VALIDATORS.length; i < len; i++) {\n      validatorClass = VALIDATORS[i];\n      if (validatorClass.isFieldMatch(fieldView)) {\n        result.push(new validatorClass(fieldView));\n      }\n    }\n    return result;\n  };\n  return {\n    fromField: fromField\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/forms/fieldView', function(require) {\n  var FieldView, validators, vw;\n  vw = require('fire/ui/view');\n  validators = require('./validators');\n  FieldView = (function(superClass) {\n    extend(FieldView, superClass);\n\n    function FieldView() {\n      return FieldView.__super__.constructor.apply(this, arguments);\n    }\n\n    FieldView.prototype.render = function() {\n      this.name = this.options.name || this.el.attr('name');\n      this.id = this.options.id || this.el.attr('id');\n      this.el.attr({\n        'name': this.name,\n        'id': this.id\n      });\n      this.setupInputEvents(this.el);\n      return this.setupValidators();\n    };\n\n    FieldView.prototype.setupInputEvents = function(inputEl) {\n\n      /*\n      Register different input events\n       */\n      inputEl.on('focus', (function(_this) {\n        return function(e) {\n          return _this.onInputFocus(e);\n        };\n      })(this));\n      return inputEl.on('blur', (function(_this) {\n        return function(e) {\n          return _this.onInputBlur(e);\n        };\n      })(this));\n    };\n\n    FieldView.prototype.setupValidators = function() {\n\n      /*\n      Initalize validation classes for the field\n       */\n      return this.validators = validators.fromField(this);\n    };\n\n    FieldView.prototype.onInputFocus = function(e) {\n      return this.addModifier('active');\n    };\n\n    FieldView.prototype.onInputBlur = function(e) {\n      return this.removeModifier('active');\n    };\n\n    FieldView.prototype.onChanged = function() {\n\n      /*\n      An internal event to update the empty modifier and status\n       */\n      if (this.isEmpty()) {\n        this.addModifier('empty');\n      } else {\n        this.removeModifier('empty');\n      }\n      return this.setValid();\n    };\n\n    FieldView.prototype.validateField = function() {\n\n      /*\n      Start the validation of the field\n       */\n      var error;\n      this.setValid();\n      error = this.validate();\n      if (error) {\n        this.setInvalid(error);\n        return false;\n      }\n      return true;\n    };\n\n    FieldView.prototype.validate = function() {\n\n      /*\n      handle the field validation.\n      \n      Returns\n        - nothing if the field is valid\n        - String if the field is invalid, the string will be used as the message\n       */\n      var error, i, len, ref, v;\n      ref = this.validators;\n      for (i = 0, len = ref.length; i < len; i++) {\n        v = ref[i];\n        error = v.validate();\n        if (error) {\n          return error;\n        }\n      }\n    };\n\n    FieldView.prototype.value = function() {\n\n      /*\n      Extract the value from the field\n       */\n      return $.trim(this.el.val());\n    };\n\n    FieldView.prototype.isEmpty = function() {\n\n      /*\n      Is this field empty\n       */\n      return !this.value();\n    };\n\n    FieldView.prototype.errorSpan = function() {\n\n      /*\n      Returns the error span element if available\n      \n      Error element id should be {original-field-id}-error.\n      \n      Returns\n        - jQuery element for the errorSpan\n       */\n      return $(\"#\" + this.id + \"-error\");\n    };\n\n    FieldView.prototype.setInvalid = function(message) {\n\n      /*\n      Show the error label, mark the field as invalid\n      \n      Params:\n        - message   The message to show in the error label\n       */\n      this.addModifier('invalid');\n      this.trigger('invalid', this);\n      return this.errorSpan().show().text(message);\n    };\n\n    FieldView.prototype.setValid = function() {\n\n      /*\n      Mark the field as valid\n       */\n      this.removeModifier('invalid');\n      this.trigger('valid', this);\n      return this.errorSpan().hide();\n    };\n\n    FieldView.prototype.enable = function() {\n\n      /*\n      Enables the field\n       */\n      return this.removeModifier('disabled');\n    };\n\n    FieldView.prototype.disable = function() {\n\n      /*\n      Disables the field\n       */\n      return this.addModifier('disabled');\n    };\n\n    FieldView.prototype.focus = function() {\n\n      /*\n      Sets the focus on the field\n       */\n      return this.el.focus();\n    };\n\n    FieldView.fromEl = function(el) {\n\n      /*\n      Creates a new FieldView instance for the given element\n      \n      FieldView subsclasses needs to register themselves using FieldView.register(selector, subclass)\n      \n      For example, if we want to have a special FieldView for checkboxes, we'll use\n      FieldView.register('input[type=checkbox]', CheckboxFieldView)\n      \n      \n      Params:\n        - el    The element that we're creating a FieldView for\n       */\n      var i, item, len, selectors;\n      el = $(el);\n      selectors = FieldView.selectors;\n      for (i = 0, len = selectors.length; i < len; i++) {\n        item = selectors[i];\n        if (el.is(item.selector)) {\n          return new item.subclass({\n            el: el\n          });\n        }\n      }\n      console.error(\"Can't find FieldView for \", el);\n      throw \"Can't find a FieldView for the field \" + el;\n    };\n\n    FieldView.selectors = [];\n\n    FieldView.register = function(selector, subclass) {\n\n      /*\n       * Registers FieldView subclass to a given selector.\n       * When the FieldView.fromEl(el) static method is called, it will try to match\n       * The field element to the selector. if the selector matches, it will instantiate the subclass\n       *\n       * Params:\n       *   - selector    a selector to test the field with\n       *   - subclass    The subclass of FieldView to instantiate if the selector matches\n       */\n      return FieldView.selectors.push({\n        selector: selector,\n        subclass: subclass\n      });\n    };\n\n    return FieldView;\n\n  })(vw.View);\n  return {\n    FieldView: FieldView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/forms/fields/textFieldView', function(require) {\n  var FIELD_VIEW_SELECTOR, TextFieldView, fv;\n  FIELD_VIEW_SELECTOR = 'input[type=text],input[type=email],input[type=search],input[type=url],input[type=password],select,textarea';\n  fv = require('fire/ui/forms/fieldView');\n  TextFieldView = (function(superClass) {\n    extend(TextFieldView, superClass);\n\n    function TextFieldView() {\n      return TextFieldView.__super__.constructor.apply(this, arguments);\n    }\n\n    TextFieldView.prototype.setupInputEvents = function() {\n      TextFieldView.__super__.setupInputEvents.apply(this, arguments);\n      this.el.on('input keyup', (function(_this) {\n        return function(e) {\n          return _this.onInput(e);\n        };\n      })(this));\n      return this.el.on('paste cut', (function(_this) {\n        return function(e) {\n          return _this.onClipboardTextChanged(e);\n        };\n      })(this));\n    };\n\n    TextFieldView.prototype.onInput = function(e) {\n\n      /*\n      Handle key up events\n      \n      Params:\n        - e    jQuery.Event\n       */\n      return this.onChanged();\n    };\n\n    TextFieldView.prototype.onClipboardTextChanged = function(e) {\n\n      /*\n      Handle cut/paste events\n      \n      Params:\n        - e   jQuery.Event\n       */\n      return this.onChanged();\n    };\n\n    TextFieldView.prototype.disable = function() {\n\n      /*\n      Disable the field\n       */\n      TextFieldView.__super__.disable.apply(this, arguments);\n      return this.el.attr('disabled', true);\n    };\n\n    TextFieldView.prototype.enable = function() {\n\n      /*\n      Enable the field\n       */\n      TextFieldView.__super__.enable.apply(this, arguments);\n      return this.el.removeAttr('disabled');\n    };\n\n    return TextFieldView;\n\n  })(fv.FieldView);\n  fv.FieldView.register(FIELD_VIEW_SELECTOR, TextFieldView);\n  return {\n    TextFieldView: TextFieldView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/forms/fields/checkboxFieldView', function(require) {\n  var CheckboxFieldView, FIELD_VIEW_SELECTOR, fv;\n  FIELD_VIEW_SELECTOR = 'input[type=checkbox]';\n  fv = require('fire/ui/forms/fieldView');\n  CheckboxFieldView = (function(superClass) {\n    extend(CheckboxFieldView, superClass);\n\n    function CheckboxFieldView() {\n      return CheckboxFieldView.__super__.constructor.apply(this, arguments);\n    }\n\n    CheckboxFieldView.prototype.value = function() {\n\n      /*\n      Extract the value from the field\n       */\n      return this.el.is(':checked');\n    };\n\n    return CheckboxFieldView;\n\n  })(fv.FieldView);\n  fv.FieldView.register(FIELD_VIEW_SELECTOR, CheckboxFieldView);\n  return {\n    CheckboxFieldView: CheckboxFieldView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/forms/fields/radioFieldView', function(require) {\n  var FIELD_VIEW_SELECTOR, RadioFieldView, fv;\n  FIELD_VIEW_SELECTOR = 'div.radio-container';\n  fv = require('fire/ui/forms/fieldView');\n  RadioFieldView = (function(superClass) {\n    extend(RadioFieldView, superClass);\n\n    function RadioFieldView() {\n      return RadioFieldView.__super__.constructor.apply(this, arguments);\n    }\n\n    RadioFieldView.prototype.value = function() {\n\n      /*\n      Extract the value from the field\n       */\n      return this.el.find('input:radio:checked').val();\n    };\n\n    RadioFieldView.prototype.setupInputEvents = function() {\n      var radios;\n      RadioFieldView.__super__.setupInputEvents.apply(this, arguments);\n      radios = this.el.find('input:radio');\n      radios.on('focus', (function(_this) {\n        return function(e) {\n          return _this.onInputFocus(e);\n        };\n      })(this));\n      radios.on('blur', (function(_this) {\n        return function(e) {\n          return _this.onInputBlur(e);\n        };\n      })(this));\n      return radios.on('change', (function(_this) {\n        return function(e) {\n          return _this.onChanged();\n        };\n      })(this));\n    };\n\n    return RadioFieldView;\n\n  })(fv.FieldView);\n  fv.FieldView.register(FIELD_VIEW_SELECTOR, RadioFieldView);\n  return {\n    RadioFieldView: RadioFieldView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('fire/ui/forms/fields/hiddenFieldView', function(require) {\n  var FIELD_VIEW_SELECTOR, HiddenFieldView, fv;\n  FIELD_VIEW_SELECTOR = 'input[type=hidden]';\n  fv = require('fire/ui/forms/fieldView');\n  HiddenFieldView = (function(superClass) {\n    extend(HiddenFieldView, superClass);\n\n    function HiddenFieldView() {\n      return HiddenFieldView.__super__.constructor.apply(this, arguments);\n    }\n\n    HiddenFieldView.prototype.setupInputEvents = function() {\n      return HiddenFieldView.__super__.setupInputEvents.apply(this, arguments);\n    };\n\n    HiddenFieldView.prototype.disable = function() {\n\n      /*\n      Disable the field\n       */\n      HiddenFieldView.__super__.disable.apply(this, arguments);\n      return this.el.attr('disabled', true);\n    };\n\n    HiddenFieldView.prototype.enable = function() {\n\n      /*\n      Enable the field\n       */\n      HiddenFieldView.__super__.enable.apply(this, arguments);\n      return this.el.removeAttr('disabled');\n    };\n\n    return HiddenFieldView;\n\n  })(fv.FieldView);\n  fv.FieldView.register(FIELD_VIEW_SELECTOR, HiddenFieldView);\n  return {\n    HiddenFieldView: HiddenFieldView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\n\n/*\n *  Fields loader\n *  ==============\n *\n *  This module loads the common fields from the fields folder.\n *\n *  Require this file instead of the fieldView file\n */\ndefine('fire/ui/forms/fields', function(require) {\n  var fv;\n  fv = require('./fieldView');\n  require('./fields/textFieldView');\n  require('./fields/checkboxFieldView');\n  require('./fields/radioFieldView');\n  require('./fields/hiddenFieldView');\n  return {\n    FieldView: fv.FieldView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty,\n  indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\ndefine('fire/ui/forms/formView', function(require) {\n  var ErrorCollection, FormView, arr, fv, mobile, safe, vw;\n  arr = require('fire/util/array');\n  vw = require('fire/ui/view');\n  safe = require('fire/net/safe');\n  fv = require('./fields');\n  mobile = require('fire/util/mobile');\n  FormView = (function(superClass) {\n    var ERROR_BOX_SELECTOR, SUBMIT_BUTTON_SELECTOR;\n\n    extend(FormView, superClass);\n\n    function FormView() {\n      return FormView.__super__.constructor.apply(this, arguments);\n    }\n\n    SUBMIT_BUTTON_SELECTOR = '.submit-button,input[type=submit]';\n\n    ERROR_BOX_SELECTOR = '.error-box';\n\n    FormView.prototype.cssClass = 'form-view';\n\n    FormView.prototype.defaultOptions = {\n      pleaseWaitText: 'Please Wait...',\n      fieldSelector: '.form-field',\n      deliveryMethod: 'ajax',\n      validationErrorMessage: 'Some of the fields are invalid.',\n      deliveryDelay: 300\n    };\n\n    FormView.prototype.render = function() {\n\n      /*\n      Setup all the fields, etc\n       */\n      this.setupFields();\n      this.setupSubmitButton();\n      this.errorBox = this.find(ERROR_BOX_SELECTOR).hide();\n      if (!this.options.action) {\n        return this.options.action = this.el.attr('action');\n      }\n    };\n\n    FormView.prototype.setupFields = function() {\n\n      /*\n      Initialize the fields for the form\n       */\n      var el, j, len, ref, results1;\n      this.fields = [];\n      ref = this.find(this.options.fieldSelector);\n      results1 = [];\n      for (j = 0, len = ref.length; j < len; j++) {\n        el = ref[j];\n        results1.push(this.fields.push(new fv.FieldView.fromEl(el)));\n      }\n      return results1;\n    };\n\n    FormView.prototype.setupSubmitButton = function() {\n\n      /*\n      Setup the submit button text\n       */\n      this.submitButton = this.find(SUBMIT_BUTTON_SELECTOR);\n      if (this.options.submitText) {\n        this.submitButtonText(this.options.submitText);\n      } else {\n        this.options.submitText = $.trim(this.submitButtonText());\n      }\n      return this.submitButton.click((function(_this) {\n        return function(e) {\n          return _this.onSubmitButtonClicked(e);\n        };\n      })(this));\n    };\n\n    FormView.prototype.onSubmitButtonClicked = function(e) {\n\n      /*\n      Handle clicks on the submission button\n       */\n      e.stopPropagation();\n      e.preventDefault();\n      return this.submit();\n    };\n\n    FormView.prototype.submit = function() {\n\n      /*\n      Tries to send the form\n      \n      Returns:\n        true if the form was delivered, false if not\n       */\n      if (this.hasModifier('disabled') || this.hasModifier('submitting')) {\n        return false;\n      }\n      if (this.validateForm()) {\n        this.deliverForm();\n        return true;\n      }\n      return false;\n    };\n\n    FormView.prototype.reset = function() {\n\n      /*\n      Clear the form\n       */\n      this.cleanup();\n      this.hideErrors();\n      return this.el[0].reset();\n    };\n\n    FormView.prototype.deliverForm = function() {\n\n      /*\n      Delivers the form, returns a deferred with completion/failure handling\n       */\n      var p, params, url;\n      this.addModifier('submitting');\n      this.trigger('submitstart', this);\n      this.submitButtonText(this.options.pleaseWaitText);\n      this.disable();\n      params = this.values();\n      url = this.options.action;\n      p = $.Deferred();\n      switch (this.options.deliveryMethod) {\n        case 'ajax':\n          p = safe.post(url, params);\n          break;\n        case 'form':\n          safe.form(url, params);\n          break;\n        case 'iframe':\n          p = safe.iframe(url, params);\n          break;\n        default:\n          throw \"Bad deliveryMethod: \" + this.options.deliveryMethod;\n      }\n      p.done((function(_this) {\n        return function(result) {\n          return _this.onDeliveryCompleted(result);\n        };\n      })(this));\n      p.fail((function(_this) {\n        return function(error, data) {\n          return _this.onDeliveryFailed(error, data);\n        };\n      })(this));\n      return p.promise();\n    };\n\n    FormView.prototype.onDeliveryCompleted = function(result) {\n\n      /*\n      Handles the successful completion of the form\n      \n      Params:\n        - form      The FormView\n        - result    The response from the server\n       */\n      this.result = result;\n      return setTimeout((function(_this) {\n        return function() {\n          _this.trigger('success', _this, result);\n          return _this.cleanup();\n        };\n      })(this), this.options.deliveryDelay);\n    };\n\n    FormView.prototype.onDeliveryFailed = function(error, data) {\n\n      /*\n      Handles a failed submission of the form\n      \n      Params:\n        - error       Error message\n        - data        Error result from the server\n       */\n      this.result = null;\n      return setTimeout((function(_this) {\n        return function() {\n          _this.errors = new ErrorCollection();\n          _this.processServerErrors(error, data, _this.errors);\n          _this.trigger('fail', _this, _this.error);\n          _this.showErrors();\n          return _this.cleanup();\n        };\n      })(this), this.options.deliveryDelay);\n    };\n\n    FormView.prototype.processServerErrors = function(message, data, error_collection) {\n\n      /*\n      Process the server error. return a proper error\n      \n      Params:\n        - message           The error value returned from the server\n        - data              The error data response from the server\n        - error_collection  The error collection. Implementations should append the errors to the collection\n       */\n      return error_collection.add('server_error', message, 'server_error');\n    };\n\n    FormView.prototype.cleanup = function() {\n\n      /*\n      Clean up the form\n       */\n      this.removeModifier('submitting');\n      this.trigger('submitcomplete', this);\n      this.submitButtonText(this.options.submitText);\n      return this.enable();\n    };\n\n    FormView.prototype.submitButtonText = function(text) {\n\n      /*\n      Sets the submit button text\n       */\n      if (this.submitButton.is('input')) {\n        if (text) {\n          return this.submitButton.val(text);\n        }\n        return this.submitButton.val();\n      }\n      if (text) {\n        return this.submitButton.text(text);\n      }\n      return this.submitButton.text();\n    };\n\n    FormView.prototype.values = function() {\n\n      /*\n      Extract the fields and get the values\n       */\n      var f, j, len, ref, values;\n      values = $.extend({}, this.options.extraParams);\n      ref = this.fields;\n      for (j = 0, len = ref.length; j < len; j++) {\n        f = ref[j];\n        values[f.name] = f.value();\n      }\n      return values;\n    };\n\n    FormView.prototype.validateForm = function() {\n\n      /*\n      Validates the fields and call a custom validation method\n      \n      Returns:\n        true if the form is valid, false if not\n       */\n      var field, results;\n      this.errors = new ErrorCollection();\n      this.validate(this.fields, this.errors);\n      results = (function() {\n        var j, len, ref, results1;\n        ref = this.fields;\n        results1 = [];\n        for (j = 0, len = ref.length; j < len; j++) {\n          field = ref[j];\n          results1.push(field.validateField());\n        }\n        return results1;\n      }).call(this);\n      if (indexOf.call(results, false) >= 0) {\n        this.errors.add('validation_error', this.options.validationErrorMessage);\n      }\n      if (this.errors.length) {\n        this.trigger('invalid', this);\n        this.addModifier('invalid');\n        this.showErrors();\n        return false;\n      } else {\n        this.trigger('valid', this);\n        this.removeModifier('invalid');\n        this.hideErrors();\n        return true;\n      }\n    };\n\n    FormView.prototype.validate = function(fields, errorCollecion) {\n\n      /*\n      An extra validation method that can be overriden by implemntations\n      \n      Params\n        - fields            A list of FieldView objects\n        - errorCollection   An ErrorCollection object that can be used to add errors to the form\n       */\n      return null;\n    };\n\n    FormView.prototype.showErrors = function() {\n\n      /*\n      Show the active errors\n       */\n      var e, h, j, len, ref;\n      h = '';\n      ref = this.errors.errors;\n      for (j = 0, len = ref.length; j < len; j++) {\n        e = ref[j];\n        if (e.description) {\n          h += \"<p>\" + e.description + \"</p>\";\n        }\n      }\n      if (h) {\n        return this.errorBox.html(h).show();\n      }\n    };\n\n    FormView.prototype.setError = function(message) {\n\n      /*\n      Override the errors with a custom message, show errors\n      \n      Params:\n        - message   Error message to show\n       */\n      this.errors = new ErrorCollection();\n      this.errors.add('custom', message);\n      return this.showErrors();\n    };\n\n    FormView.prototype.hideErrors = function() {\n\n      /*\n      Hide the errors\n       */\n      return this.errorBox.hide();\n    };\n\n    FormView.prototype.disable = function() {\n\n      /*\n      Disable the form.\n      \n      This method will:\n      - Add the `disabled` modifier to the form\n      - Call the `disable` method for all of the fields\n      - Add the `is-disabled` class to the submit button\n       */\n      var f, j, len, ref;\n      this.addModifier('disabled');\n      ref = this.fields;\n      for (j = 0, len = ref.length; j < len; j++) {\n        f = ref[j];\n        f.disable();\n      }\n      return this.submitButton.addClass('is-disabled');\n    };\n\n    FormView.prototype.enable = function() {\n\n      /*\n      Enables the form\n      \n      This method will:\n      - Remove the `disabled` modifier from the form\n      - Call the `enable` method for all of the fields\n      - Remove the `is-disabled` class from the submit button\n       */\n      var f, j, len, ref;\n      this.removeModifier('disabled');\n      ref = this.fields;\n      for (j = 0, len = ref.length; j < len; j++) {\n        f = ref[j];\n        f.enable();\n      }\n      return this.submitButton.removeClass('is-disabled');\n    };\n\n    FormView.prototype.field = function(fieldName) {\n\n      /*\n      Gets an instance of a field by name\n       */\n      return this.fields.filter(function(i) {\n        return i.name === fieldName;\n      })[0];\n    };\n\n    FormView.prototype.focus = function(fieldName) {\n      var ref, ref1;\n      if (fieldName == null) {\n        fieldName = null;\n      }\n\n      /*\n      Focus the form.\n      \n      If a field name is given, the form will try to focus on that field\n      If not - the form will focus on the first element\n      \n      Params:\n        - fieldName       (Optional) The field name to try and focus on\n       */\n      if (mobile.isPhone()) {\n        return;\n      }\n      if (fieldName) {\n        return (ref = this.field(fieldName)) != null ? ref.focus() : void 0;\n      } else {\n        return (ref1 = this.fields[0]) != null ? ref1.focus() : void 0;\n      }\n    };\n\n    return FormView;\n\n  })(vw.View);\n  ErrorCollection = (function() {\n    function ErrorCollection() {\n      this.clear();\n    }\n\n    ErrorCollection.prototype.add = function(name, description, type) {\n      if (type == null) {\n        type = null;\n      }\n      this.errors.push({\n        name: name,\n        description: description,\n        type: type\n      });\n      return this.length += 1;\n    };\n\n    ErrorCollection.prototype.clear = function() {\n      this.errors = [];\n      return this.length = 0;\n    };\n\n    return ErrorCollection;\n\n  })();\n  return {\n    FormView: FormView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('smore/ui/login/signupFormView', function(require) {\n  var SignupFormView, fv;\n  fv = require('fire/ui/forms/formView');\n  SignupFormView = (function(superClass) {\n    extend(SignupFormView, superClass);\n\n    function SignupFormView() {\n      SignupFormView.__super__.constructor.apply(this, arguments);\n      this.options.validationErrorMessage = '';\n    }\n\n    SignupFormView.prototype.processServerErrors = function(errorMessage, errorData, errorCollection) {\n\n      /*\n      Process the server error. return a proper error\n      \n      Params:\n        - errorMessage       The error value returned from the server\n        - errorData          The error data, as returned from the server\n        - errorCollection    The error collection. Implementations should append the errors to the collection\n       */\n      var field, firstProblem, i, len, p, problem, problems, ref;\n      switch (errorMessage) {\n        case 'invalid':\n          problems = errorData.code;\n          firstProblem = '';\n          for (i = 0, len = problems.length; i < len; i++) {\n            p = problems[i];\n            field = p[0], problem = p[1];\n            if ((ref = this.field(field)) != null) {\n              ref.setInvalid(problem);\n            }\n            firstProblem = firstProblem || problem;\n          }\n          return errorCollection.add('invalid', false);\n        case 'tryfacebook':\n          return errorCollection.add('tryfacebook', 'Try logging in with your Facebook account.');\n        case 'trygoogle':\n          return errorCollection.add('trygoogle', 'Try logging in with your Google account.');\n        case 'tryemail':\n          return errorCollection.add('tryemail', 'Try logging in with your email.');\n        case 'user exists':\n          return errorCollection.add('user exists', 'We already have a user with that email. Try logging in instead.', 'field_error', {\n            target: 'email'\n          });\n        default:\n          return errorCollection.add('unkown', 'Something is broken. Try again later :(');\n      }\n    };\n\n    return SignupFormView;\n\n  })(fv.FormView);\n  return {\n    SignupFormView: SignupFormView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('smore/ui/login/loginFormView', function(require) {\n  var LoginFormView, fv;\n  fv = require('fire/ui/forms/formView');\n  LoginFormView = (function(superClass) {\n    extend(LoginFormView, superClass);\n\n    function LoginFormView() {\n      LoginFormView.__super__.constructor.apply(this, arguments);\n      this.options.validationErrorMessage = '';\n    }\n\n    LoginFormView.prototype.processServerErrors = function(errorMessage, errorData, errorCollection) {\n\n      /*\n      Process the server error. return a proper error\n      \n      Params:\n        - errorMessage       The error value returned from the server\n        - errorData          The error data, as returned from the server\n        - errorCollection    The error collection. Implementations should append the errors to the collection\n       */\n      switch (errorMessage) {\n        case 'tryfacebook':\n          return errorCollection.add('tryfacebook', 'Try logging in with your Facebook account.');\n        case 'trygoogle':\n          return errorCollection.add('tryfacebook', 'Try logging in with your Google account.');\n        case 'invaliduser':\n          return errorCollection.add('invaliduser', 'Please enter your email', 'field_error', {\n            target: 'email'\n          });\n        case 'nouser':\n          return errorCollection.add('nouser', 'Wrong email or password', 'field_error', {\n            target: 'email'\n          });\n        case 'tryemail':\n          return errorCollection.add('tryemail', 'Try logging in with your email.');\n        case 'badpassword':\n          return errorCollection.add('badpassword', 'Wrong email or password', 'field_error', {\n            target: 'email'\n          });\n        default:\n          return errorCollection.add('unkown', 'Something is broken. Try again later :(');\n      }\n    };\n\n    return LoginFormView;\n\n  })(fv.FormView);\n  return {\n    LoginFormView: LoginFormView\n  };\n});\n", "define('fire/util/strings', function(require) {\r\n\r\n    var _proto = String.prototype;\r\n\r\n    /****\r\n     * Simple string format\r\n     *\r\n     * format('molsh {0}', 'dolsh')\r\n     * => 'molsh dolsh'\r\n     *\r\n     * @param {String} string\r\n     * @param {...string} varArgs\r\n     * @returns {string}\r\n     */\r\n    function format(string, varArgs) {\r\n        var s = arguments[0];\r\n        for (var i = 0; i < arguments.length - 1; i++) {\r\n            var reg = new RegExp(\"\\\\{\" + i + \"\\\\}\", \"gm\");\r\n            s = s.replace(reg, arguments[i + 1]);\r\n        }\r\n\r\n        return s;\r\n    }\r\n\r\n    // shortcut\r\n    _proto.format = format;\r\n\r\n    return {\r\n        format: format\r\n    };\r\n});", "define('fire/net/popup', function (require) {\r\n    var str = require('fire/util/strings');\r\n\r\n    var NO_DATA_CODE = 'NO_DATA';\r\n    var POPUP_CLOSED = 'POPUP_CLOSED';\r\n\r\n    /*****\r\n     * Opens a popup to the given url with the given width/height.\r\n     *\r\n     * Returns a deferred object that will be resolved with the value returned from the popup.\r\n     *\r\n     * This method generates a callback inside the window object and cleans up afterwards.\r\n     * The generated callback name is than sent with the url, so the popup will use it to resolve the call\r\n     *\r\n     * The deferred will be rejected if:\r\n     *  - The server returned an error\r\n     *  - The popup was closed before it was resolved\r\n     *\r\n     *\r\n     * The results from the server should be in the form:\r\n     *\r\n     * Success:\r\n     *  {status: 'success', result: <result data>}\r\n     *\r\n     * Error:\r\n     *  {status: 'error', message: <error message or code>}\r\n     *\r\n     *\r\n     * @param {String} url              the url for the popup\r\n     * @param {Number} width            popup width\r\n     * @param {Number} height           popup height\r\n     * @param {String=} callbackParam   an optional callback param. defaults to 'cb'\r\n     *\r\n     * @returns {jQuery.Deferred}\r\n     */\r\n    function popup(url, width, height, callbackParam) {\r\n        if (!url) {\r\n            throw \"Url must be defined!\";\r\n        }\r\n\r\n        // setup defaults\r\n        callbackParam = callbackParam || 'cb';\r\n\r\n        // create a new deferred\r\n        var dfd = $.Deferred();\r\n\r\n        // setup callback name\r\n        var cbName = '__pop_cb_' + (++_callbackId);\r\n\r\n\r\n        // an inner function to handle the result\r\n        function handleResult(data) {\r\n            // do nothing if we already handled it\r\n            if (dfd.state() !== 'pending') {\r\n                return;\r\n            }\r\n\r\n            // if there is no data or data is from an unexpected type\r\n            if (!data || typeof data !== 'object') {\r\n                // reject it\r\n                dfd.reject('NO_DATA');\r\n            }\r\n\r\n            // Switch by status code\r\n            switch (data.status) {\r\n                case 'success':\r\n                    dfd.resolve(data.result);\r\n                    break;\r\n                case 'error':\r\n                    dfd.reject(data.message);\r\n                    break;\r\n                default:\r\n                    dfd.reject(NO_DATA_CODE);\r\n            }\r\n\r\n            // cleanup\r\n            delete window[cbName];\r\n        }\r\n\r\n        // store the\r\n        window[cbName] = handleResult;\r\n\r\n        // setup the url\r\n        var popUrl = setupUrl(url, callbackParam, cbName);\r\n\r\n        //console.debug(\"Opening popup\", popUrl);\r\n\r\n        // open the popup\r\n        var popRef = openPopup(popUrl, width, height, function () {\r\n            handleResult({status: 'error', message: POPUP_CLOSED});\r\n        });\r\n\r\n        // return a read only promise\r\n        var promise = dfd.promise();\r\n\r\n        // add an abort method\r\n        promise.abort = function () {\r\n            tryAbort(popRef, dfd);\r\n        };\r\n\r\n        return promise;\r\n    }\r\n\r\n\r\n    /***\r\n     * We store the callback id\r\n     * @type {Number}\r\n     * @private\r\n     */\r\n    var _callbackId = 0;\r\n\r\n\r\n    /****\r\n     * Generate a url with the callback name and param\r\n     * @param {String} url\r\n     * @param {String} callbackParam\r\n     * @param {String} cbName\r\n     *\r\n     * @returns {String} the url with the callback\r\n     */\r\n    function setupUrl(url, callbackParam, cbName) {\r\n\r\n        var cb = callbackParam + '=' + cbName;\r\n\r\n        // Support for placeholder\r\n        if (url.indexOf('%{cb}') !== -1) {\r\n            return url.replace('%{cb}', cb);\r\n        }\r\n\r\n\r\n        // do we have a ? inside the url?\r\n        if (url.indexOf('?') === -1) {\r\n            // not? just add the cb with a ?\r\n            return url + '?' + cb;\r\n        } else {\r\n            return url + '&' + cb;\r\n        }\r\n    }\r\n\r\n    /***\r\n     * Opens the popup, fires the closeCb function when it is closed\r\n     *\r\n     * @param {String} url\r\n     * @param {Number} width\r\n     * @param {Number} height\r\n     * @param {Function} closeCb\r\n     * @param {String} frameName\r\n     */\r\n    function openPopup(url, width, height, closeCb, frameName) {\r\n        var popup = window.open(url, frameName || '', popupSettings(width, height));\r\n\r\n        // create an interval that test the popup\r\n        var interval = setInterval(function () {\r\n            // die if it's still open\r\n            if (popup && !popup.closed) {\r\n                return;\r\n            }\r\n            // else:\r\n\r\n            // stop interval\r\n            clearInterval(interval);\r\n\r\n            // call the closeCb:\r\n            closeCb();\r\n        }, 20);\r\n\r\n        return popup;\r\n    }\r\n\r\n    /***\r\n     * Tries to abort the given popup\r\n     * @param popRef\r\n     * @param {jQuery.Deferred} dfd\r\n     */\r\n    function tryAbort(popRef, dfd) {\r\n        // if the popup is already resolved, exit\r\n        if (dfd.state() !== 'pending') {\r\n            return;\r\n        }\r\n\r\n        // try to close the popup\r\n        try {\r\n            popRef.close();\r\n        } catch (e) {\r\n            // no-op\r\n        }\r\n    }\r\n\r\n    /***\r\n     *\r\n     * @param width\r\n     * @param height\r\n     * @returns {String} a string that represent popup settings\r\n     */\r\n    function popupSettings(width, height) {\r\n        return str.format('width={0},height={1},location=no,status=no', width, height);\r\n    }\r\n\r\n\r\n    return {\r\n        open: popup,\r\n        openPopup: openPopup\r\n    };\r\n});", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('smore/ui/login/facebookConnectView', function(require) {\n  var FacebookConnectView, popup, vw;\n  vw = require('fire/ui/view');\n  popup = require('fire/net/popup');\n  FacebookConnectView = (function(superClass) {\n    var POPUP_SIZE;\n\n    extend(FacebookConnectView, superClass);\n\n    function FacebookConnectView() {\n      return FacebookConnectView.__super__.constructor.apply(this, arguments);\n    }\n\n    POPUP_SIZE = {\n      width: 600,\n      height: 450\n    };\n\n    FacebookConnectView.prototype.cssClass = 'facebook-connect-button';\n\n    FacebookConnectView.prototype.events = {\n      'click': 'onConnectClicked'\n    };\n\n    FacebookConnectView.prototype.defaultOptions = {\n      pleaseWaitText: 'Please wait...',\n      connectUrl: '/app/users/connect'\n    };\n\n    FacebookConnectView.prototype.render = function() {\n\n      /*\n       */\n      this.textSpan = this.find('.text-content');\n      if (this.options.text) {\n        return this.textSpan.text(this.options.text);\n      } else {\n        return this.options.text = $.trim(this.textSpan.text());\n      }\n    };\n\n    FacebookConnectView.prototype.onConnectClicked = function(e) {\n\n      /*\n      Hanldes clicks on the button element\n       */\n      if (this.hasModifier('disabled') || this.hasModifier('connecting')) {\n        return;\n      }\n      this.addModifier('connecting');\n      this.trigger('connectstart', this);\n      this.disable();\n      this.textSpan.text(this.options.pleaseWaitText);\n      this.popup = popup.open(this.generateUrl(), POPUP_SIZE.width, POPUP_SIZE.height);\n      this.popup.done((function(_this) {\n        return function(r) {\n          return _this.onPopupComplete(r);\n        };\n      })(this));\n      return this.popup.fail((function(_this) {\n        return function(r) {\n          return _this.onPopupFailed(r);\n        };\n      })(this));\n    };\n\n    FacebookConnectView.prototype.generateUrl = function() {\n\n      /*\n      Generate url for the connect popup\n      \n      We're composing the url from three parts\n        - options.connectUrl\n        - options.buttonId\n        - options.connectParams\n       */\n      var params, query, url;\n      params = $.extend({}, this.options.connectParams);\n      if (this.options.buttonId) {\n        params['signup_button'] = this.options.buttonId;\n      }\n      if (this.options.signupSegment) {\n        params['segment'] = this.options.signupSegment;\n      }\n      query = $.param(params);\n      url = this.options.connectUrl;\n      if (url.indexOf('?') > 0) {\n        url += '&';\n      } else {\n        url += '?';\n      }\n      return url + query;\n    };\n\n    FacebookConnectView.prototype.onPopupComplete = function(result) {\n\n      /*\n      When the popup action is completed\n       */\n      var connectType;\n      if (result.is_new) {\n        connectType = 'signup';\n      } else {\n        connectType = 'login';\n      }\n      this.trigger('success', this, connectType, result);\n      this.trigger(connectType, this, result);\n      return this.cleanup();\n    };\n\n    FacebookConnectView.prototype.onPopupFailed = function(message) {\n\n      /*\n      When the popup action has failed\n       */\n      switch (message) {\n        case 'POPUP_CLOSED':\n        case 'fb_cancel':\n          this.trigger('cancel', this);\n          break;\n        default:\n          this.trigger('fail', this, message);\n      }\n      return this.cleanup();\n    };\n\n    FacebookConnectView.prototype.cleanup = function() {\n\n      /*\n      Clean up after successful/failed connection.\n      We need to enable buttons and remove connecting modifier\n       */\n      this.textSpan.text(this.options.text);\n      this.removeModifier('connecting');\n      this.trigger('connectcomplete', this);\n      this.enable();\n      return this.popup.abort();\n    };\n\n    FacebookConnectView.prototype.enable = function() {\n\n      /*\n      Enables the button\n       */\n      return this.removeModifier('disabled');\n    };\n\n    FacebookConnectView.prototype.disable = function() {\n\n      /*\n      Disables the button\n       */\n      return this.addModifier('disabled');\n    };\n\n    FacebookConnectView.prototype.beforeRemove = function() {\n\n      /*\n      Before remove, cleanup some resources, abort the popup etc\n       */\n      var ref;\n      return (ref = this.popup) != null ? ref.abort() : void 0;\n    };\n\n    return FacebookConnectView;\n\n  })(vw.View);\n  return {\n    FacebookConnectView: FacebookConnectView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('smore/ui/login/googleConnectView', function(require) {\n  var GoogleConnectView, vw;\n  vw = require('fire/ui/view');\n  GoogleConnectView = (function(superClass) {\n    extend(GoogleConnectView, superClass);\n\n    function GoogleConnectView(options) {\n      GoogleConnectView.__super__.constructor.call(this, options);\n      this.setupGoogleConnect();\n    }\n\n    GoogleConnectView.prototype.cssClass = 'google-connect-button';\n\n    GoogleConnectView.prototype.events = {\n      'click': 'onConnectClicked'\n    };\n\n    GoogleConnectView.prototype.defaultOptions = {\n      pleaseWaitText: 'Please wait...',\n      connectUrl: '/app/users/google_connect'\n    };\n\n    GoogleConnectView.prototype.render = function() {\n      this.textSpan = this.find('.text-content');\n      if (this.options.text) {\n        return this.textSpan.text(this.options.text);\n      } else {\n        return this.options.text = $.trim(this.textSpan.text());\n      }\n    };\n\n    GoogleConnectView.prototype.setupGoogleConnect = function() {\n      return gapi.load('auth2', (function(_this) {\n        return function() {\n          var error;\n          try {\n            return gapi.auth2.init({\n              client_id: window.__google_connect_client_id,\n              cookiepolicy: 'single_host_origin'\n            });\n          } catch (error1) {\n            error = error1;\n            return console.log(error);\n          }\n        };\n      })(this));\n    };\n\n    GoogleConnectView.prototype.onConnectClicked = function(e) {\n      if (this.hasModifier('disabled') || this.hasModifier('connecting')) {\n        return;\n      }\n      this.addModifier('connecting');\n      this.trigger('connectstart', this);\n      this.disable();\n      this.textSpan.text(this.options.pleaseWaitText);\n      return gapi.auth2.getAuthInstance().signIn().then((function(_this) {\n        return function(r) {\n          return _this.onGoogleConnectSuccess(r);\n        };\n      })(this), (function(_this) {\n        return function(r) {\n          return _this.onGoogleConnectError(r.error);\n        };\n      })(this));\n    };\n\n    GoogleConnectView.prototype.onServerSignupWithGoogle = function(data) {\n      var connectType, result;\n      if (data.status !== 'success') {\n        return this.onGoogleConnectError(data.message);\n      }\n      result = data.result;\n      if (result.is_new) {\n        connectType = 'signup';\n      } else {\n        connectType = 'login';\n      }\n      this.trigger('success', this, connectType, result);\n      this.trigger(connectType, this, result);\n      return this.cleanup();\n    };\n\n    GoogleConnectView.prototype.onGoogleConnectSuccess = function(googleUser) {\n      var params;\n      params = {\n        'idtoken': googleUser.getAuthResponse().id_token\n      };\n      if (this.options.buttonId) {\n        params['signup_button'] = this.options.buttonId;\n      }\n      if (this.options.signupSegment) {\n        params['segment'] = this.options.signupSegment;\n      }\n      return $.post('/app/users/google_login', params).done((function(_this) {\n        return function(r) {\n          return _this.onServerSignupWithGoogle(r);\n        };\n      })(this)).fail((function(_this) {\n        return function(r) {\n          return _this.onGoogleConnectError(r);\n        };\n      })(this));\n    };\n\n    GoogleConnectView.prototype.onGoogleConnectError = function(error) {\n      switch (error) {\n        case 'popup_closed_by_user':\n          this.trigger('cancel', this);\n          break;\n        default:\n          this.trigger('fail', this, error);\n      }\n      return this.cleanup();\n    };\n\n    GoogleConnectView.prototype.cleanup = function() {\n\n      /*\n      Clean up after successful/failed connection.\n      We need to enable buttons and remove connecting modifier\n       */\n      this.textSpan.text(this.options.text);\n      this.removeModifier('connecting');\n      this.trigger('connectcomplete', this);\n      return this.enable();\n    };\n\n    GoogleConnectView.prototype.enable = function() {\n\n      /*\n      Enables the button\n       */\n      return this.removeModifier('disabled');\n    };\n\n    GoogleConnectView.prototype.disable = function() {\n\n      /*\n      Disables the button\n       */\n      return this.addModifier('disabled');\n    };\n\n    return GoogleConnectView;\n\n  })(vw.View);\n  return {\n    GoogleConnectView: GoogleConnectView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\n\n/*\n * Report module\n * =============\n *\n * This is the new version of smore.report\n *\n * Reports events to mixpanel/google analytics\n *\n * Public Methods\n * --------------\n * - event(name, props={},unique=false}        Sends an event to mixpanel. returns a deferred object when the event\n *                                           has been sent successfully\n * - ab()                                    Returns a dict with the results of the current active a/b tests\n *\n */\ndefine('smore/util/report', function(require) {\n  var MIXPANEL_TIMEOUT, _uniqueEvents, getAbTestValues, track;\n  MIXPANEL_TIMEOUT = 300;\n  _uniqueEvents = {};\n  track = function(name, props, unique) {\n    var analytics, dfd, key;\n    if (props == null) {\n      props = {};\n    }\n    if (unique == null) {\n      unique = false;\n    }\n\n    /*\n    \n    Report an event to segment.io\n    \n    Params:\n      - name      Event name\n      - props     Optional properties to sedn with the event\n      - unique    Only send once for the given name and props\n    \n    Returns:\n        A deferred object, that will be resolve on success or rejected after MIXPANEL_TIMEOUT ms\n     */\n    analytics = window.analytics;\n    if (!name || !analytics.track) {\n      DEVMODE && console.error(\"analytics is not loaded or event name wasn't provided!\");\n      return;\n    }\n    props = $.extend(getAbTestValues(), props);\n    if (unique && window.JSON) {\n      key = name + \"-\" + (JSON.stringify(props));\n      if (key in _uniqueEvents) {\n        return;\n      }\n      _uniqueEvents[key] = true;\n    }\n    dfd = $.Deferred();\n    DEVMODE && console.log(\"%cevent:\", 'color:green', name, props, unique);\n    analytics.track(name, props, dfd.resolve);\n    setTimeout(dfd.reject, MIXPANEL_TIMEOUT);\n    return dfd.promise();\n  };\n  getAbTestValues = function() {\n\n    /*\n    Extract the a/b test values from the meta tags\n    \n    Returns:\n      A dict from the ab test key to the value\n     */\n    var el, els, i, key, len, values;\n    values = {};\n    els = $('.smore-ab-test-meta');\n    for (i = 0, len = els.length; i < len; i++) {\n      el = els[i];\n      key = el.getAttribute('key');\n      if (key) {\n        values[\"ab_test_\" + key] = el.getAttribute('content');\n      }\n    }\n    return values;\n  };\n  return {\n    track: track,\n    ab: getAbTestValues\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('smore/ui/login/modal', function(require) {\n  var CONTENT_ENDPOINT, DEFAULT_AFTER_SUCCESS_URL, LoginModalView, MODAL_OPTIONS, autoLogin, fbv, googleConnectView, isLoggedIn, lfv, mv, report, sfv, show;\n  mv = require('fire/ui/views/ModalView');\n  sfv = require('./signupFormView');\n  lfv = require('./loginFormView');\n  fbv = require('./facebookConnectView');\n  googleConnectView = require('./googleConnectView');\n  report = require('smore/util/report');\n  CONTENT_ENDPOINT = '/app/users/login_modal';\n  if (DEVMODE) {\n    CONTENT_ENDPOINT += '?_t=' + Number(new Date());\n  }\n  MODAL_OPTIONS = {\n    cssClass: 'base-modal login-modal',\n    width: 406,\n    overlayClose: true,\n    overlayClass: 'login-modal-overlay'\n  };\n  DEFAULT_AFTER_SUCCESS_URL = '/app';\n  LoginModalView = (function(superClass) {\n    var EVENTS;\n\n    extend(LoginModalView, superClass);\n\n    EVENTS = {\n      login_modal_open: 'LOGIN MODAL: Open'\n    };\n\n\n    /*\n      LoginModalViews\n    \n      @extends {ModalView}\n      @class\n     */\n\n    LoginModalView.prototype.preload = true;\n\n    LoginModalView.prototype.enableHistory = true;\n\n    LoginModalView.prototype.events = {\n      'click .switch-state': 'onSwitchStateClicked'\n    };\n\n    LoginModalView.prototype.defaultOptions = {\n      state: 'signup'\n    };\n\n    function LoginModalView(options) {\n\n      /*\n      \n       @param {String} state Starts the modal in a specifc state. state can be 'login' or 'signup'\n       */\n      LoginModalView.__super__.constructor.call(this, CONTENT_ENDPOINT, options);\n      this.state = this.options.state;\n    }\n\n    LoginModalView.prototype.render = function() {\n\n      /*\n        Initialize sub-views, like signup,login and facbook connect\n       */\n      var buttonId, segment, signupParams;\n      buttonId = this.options.buttonId;\n      signupParams = {\n        'signup_button': buttonId\n      };\n      segment = this._signupSegment();\n      if (segment) {\n        signupParams['segment'] = segment;\n      }\n      this.loginForm = new lfv.LoginFormView({\n        el: this.find('.login-form')\n      });\n      this.loginForm.on('success', (function(_this) {\n        return function(f, result) {\n          return _this.onSuccess('login', result);\n        };\n      })(this));\n      this.signupForm = new sfv.SignupFormView({\n        el: this.find('.signup-form'),\n        extraParams: signupParams\n      });\n      this.signupForm.on('success', (function(_this) {\n        return function(f, result) {\n          return _this.onSuccess('signup', result);\n        };\n      })(this));\n      this.signupGoogleConnect = new googleConnectView.GoogleConnectView({\n        el: this.find('.only-signup .google-connect-button'),\n        buttonId: buttonId,\n        signupSegment: segment\n      });\n      this.signupGoogleConnect.on('success', (function(_this) {\n        return function(f, type, result) {\n          return _this.onSuccess(type, result);\n        };\n      })(this)).on('fail', (function(_this) {\n        return function(fbc, msg) {\n          return _this.onSignupFailed(msg);\n        };\n      })(this));\n      this.loginGoogleConnect = new googleConnectView.GoogleConnectView({\n        el: this.find('.only-login .google-connect-button'),\n        buttonId: buttonId,\n        signupSegment: segment\n      });\n      this.loginGoogleConnect.on('success', (function(_this) {\n        return function(f, type, result) {\n          return _this.onSuccess(type, result);\n        };\n      })(this)).on('fail', (function(_this) {\n        return function(fbc, msg) {\n          return _this.onLoginFailed(msg);\n        };\n      })(this));\n      this.signupfbConnect = new fbv.FacebookConnectView({\n        el: this.find('.only-signup .facebook-connect-button'),\n        buttonId: buttonId,\n        signupSegment: segment\n      });\n      this.signupfbConnect.on('success', (function(_this) {\n        return function(f, type, result) {\n          return _this.onSuccess(type, result);\n        };\n      })(this)).on('fail', (function(_this) {\n        return function(fbc, msg) {\n          return _this.onSignupFailed(msg);\n        };\n      })(this));\n      this.loginfbConnect = new fbv.FacebookConnectView({\n        el: this.find('.only-login .facebook-connect-button'),\n        buttonId: buttonId,\n        signupSegment: segment\n      });\n      this.loginfbConnect.on('success', (function(_this) {\n        return function(f, type, result) {\n          return _this.onSuccess(type, result);\n        };\n      })(this)).on('fail', (function(_this) {\n        return function(fbc, msg) {\n          return _this.onLoginFailed(msg);\n        };\n      })(this));\n      this.setState(this.state);\n      this.setupDisableState(this.loginForm, this.loginfbConnect, this.loginGoogleConnect);\n      return this.setupDisableState(this.signupForm, this.signupfbConnect, this.signupGoogleConnect);\n    };\n\n    LoginModalView.prototype._signupSegment = function() {\n\n      /*\n      Get the the segment information from the meta tag \"smore:signup_segemnt\"\n       */\n      return $('meta[name=\"smore:signup_segment\"]').attr('value');\n    };\n\n    LoginModalView.prototype.setupDisableState = function(form, fbConnect, googleConnect) {\n\n      /*\n      Setup events to disable/enable the form when the fb-connect button is connecting.\n      Same thing goes the other way around: disable/enable fb-connect button when the form is being proccessed\n       */\n      form.on('submitstart', (function(_this) {\n        return function(f) {\n          fbConnect.disable();\n          googleConnect.disable();\n          return _this.addModifier('pending', true);\n        };\n      })(this));\n      form.on('submitcomplete', (function(_this) {\n        return function(f) {\n          fbConnect.enable();\n          googleConnect.enable();\n          return _this.removeModifier('pending');\n        };\n      })(this));\n      fbConnect.on('connectstart', (function(_this) {\n        return function(f) {\n          form.disable();\n          googleConnect.disable();\n          return _this.addModifier('pending', true);\n        };\n      })(this));\n      fbConnect.on('connectcomplete', (function(_this) {\n        return function(f) {\n          form.enable();\n          googleConnect.enable();\n          return _this.removeModifier('pending');\n        };\n      })(this));\n      googleConnect.on('connectstart', (function(_this) {\n        return function(f) {\n          form.disable();\n          fbConnect.disable();\n          return _this.addModifier('pending', true);\n        };\n      })(this));\n      return googleConnect.on('connectcomplete', (function(_this) {\n        return function(f) {\n          form.enable();\n          fbConnect.enable();\n          return _this.removeModifier('pending');\n        };\n      })(this));\n    };\n\n    LoginModalView.prototype.setState = function(state) {\n\n      /*\n      Switch between states for the modal\n      \n      State can be 'login' or 'signup'\n       */\n      this.removeModifier(this.state);\n      this.addModifier(state);\n      this.state = state;\n      if (state === 'login') {\n        return this.loginForm.focus();\n      } else {\n        return this.signupForm.focus();\n      }\n    };\n\n    LoginModalView.prototype.onSwitchStateClicked = function(e) {\n\n      /*\n      When someone clicks on the switch state label\n       */\n      var state;\n      state = $(e.currentTarget).data('target');\n      if (state) {\n        return this.setState(state);\n      }\n    };\n\n    LoginModalView.prototype.show = function() {\n      LoginModalView.__super__.show.call(this, MODAL_OPTIONS);\n      if (window.ga) {\n        return ga(\"send\", \"pageview\", \"/app/users/signup_modal\");\n      }\n    };\n\n    LoginModalView.prototype.onSuccess = function(type, result) {\n\n      /*\n      Login/Signup was successfully completed\n      \n      Params:\n        - type    login if we had a successful login, signup if we had a successful signup\n        - result  The result dictionary from the server\n       */\n      var r;\n      if (this.closed) {\n        return;\n      }\n      if (this.options.onSuccess) {\n        return this.options.onSuccess(this, type, result);\n      }\n      $('body').hide();\n      if (this.options.reloadOnly) {\n        return document.location.reload();\n      } else {\n        r = result.redirect_url || DEFAULT_AFTER_SUCCESS_URL;\n        if (r === 'app/reporting/report_errors') {\n          r = '/app';\n        }\n        return document.location = r;\n      }\n    };\n\n    LoginModalView.prototype.onLoginFailed = function(msg) {\n      return this.handleFailure(msg, this.loginForm);\n    };\n\n    LoginModalView.prototype.onSignupFailed = function(msg) {\n      return this.handleFailure(msg, this.signupForm);\n    };\n\n    LoginModalView.prototype.handleFailure = function(msg, form) {\n      var error;\n      error = \"Something is broken. Try again later: (\";\n      if (msg === 'tryemail') {\n        error = 'Try logging in with your email';\n      }\n      if (msg === 'trygoogle') {\n        error = 'Try logging in with your Google account';\n      }\n      if (msg === 'tryfacebook') {\n        error = 'Try logging in with your Facebook account';\n      }\n      return form.setError(error);\n    };\n\n    LoginModalView.prototype.onClose = function() {\n      LoginModalView.__super__.onClose.apply(this, arguments);\n      this.signupfbConnect.remove();\n      return this.loginfbConnect.remove();\n    };\n\n    return LoginModalView;\n\n  })(mv.ModalView);\n  show = function(el, options) {\n    var m, opts;\n    if (options == null) {\n      options = {};\n    }\n\n    /*\n    Show the login modal in case of\n    \n    Params:\n      - el        jQuery   The button element\n      - options            Optional options to add\n     */\n    opts = $.extend({}, el.data(), options);\n    m = new LoginModalView(opts);\n    m.show();\n    return m;\n  };\n  isLoggedIn = function() {\n\n    /*\n    Test if the user has a login cookie\n     */\n    var m;\n    m = document.cookie.match(/_L=\"?([A-Za-z0-9\\+\\/\\\\]*)\"?/);\n    return m && m.length >= 2;\n  };\n  autoLogin = function() {\n    $('.auto-quick-login').on('click', function(e) {\n      var t;\n      e.preventDefault();\n      t = $(e.currentTarget);\n      return show(t);\n    });\n    return mv.ModalView.preloadUrl(CONTENT_ENDPOINT);\n  };\n  $(autoLogin);\n  return {\n    LoginModalView: LoginModalView,\n    show: show,\n    isLoggedIn: isLoggedIn\n  };\n});\n", "define('smore/widgetInfo', function (require) {\r\n    var DATA_KEY = 'widget-info';\r\n\r\n    var EMPTY_INFO = {id:'', info:''};\r\n\r\n    function info(w) {\r\n        var w = $(w);\r\n\r\n        return {\r\n            id:w.attr('id') || '',\r\n            info:w.data(DATA_KEY) || ''\r\n        };\r\n    }\r\n\r\n    function fromEl(el) {\r\n        if (!el) return EMPTY_INFO;\r\n        el = $(el);\r\n        var w = el.parents('.widget').first();\r\n        if (!w || !w.length) return EMPTY_INFO;\r\n        return info(w);\r\n    }\r\n\r\n    return {\r\n        info:info,\r\n        fromEl:fromEl\r\n    };\r\n});", "// Generated by CoffeeScript 1.12.7\ndefine('smore/util/url', function(require) {\n\n  /*\n   * This file provide simple url utils\n   *\n   */\n  var _loc, baseDomain, domain, full;\n  _loc = document.location;\n  baseDomain = $('#smore_base_domain').attr('value');\n  domain = baseDomain || document.location.hostname;\n  full = _loc.protocol + \"//\" + domain;\n  if (_loc.port) {\n    full += ':' + _loc.port;\n  }\n  return {\n    domain: domain,\n    full: full\n  };\n});\n", "/****\r\n * Link Tracking\r\n * =============\r\n *\r\n * Convert links inside the flyer to trackable urls.\r\n *\r\n * Why do we need it?\r\n * ------------------\r\n *\r\n * This script changes the href of all the links in the flyer so they will be passed through the \"out\" endpoint for\r\n * logging.\r\n *\r\n * The script also handles mousedown/middleclick etc so the status bar will show the right \"original\" url\r\n * (without the tracking)\r\n *\r\n *\r\n * How does it work?\r\n * -----------------\r\n *\r\n * 1. When the DOM is ready, the function `track` is called (Only if the user is not the author)\r\n * 2. The function scans all the links that matches the `SELECTOR` const.\r\n * 3. If the link has the 'skip-tracking' class, it will be skipped\r\n * 4. If the link has the 'data-track-text' attribute, the script will use its content as the \"text\" of the link, if\r\n *    not, a fallback to the content of the text will be used\r\n * 5. The script will calculate the right url for tracking this link and will store it in the \"track-href\" attribute.\r\n * 6. The original href will be stored in the \"o-href\" attribute.\r\n * 7. The script will then register a one-time mousedown event on the link, that will setup the tracking process\r\n *\r\n *\r\n *\r\n *\r\n * Optional attributes/classes      Example                     Description\r\n * ---------------------------\r\n * `data-track-text`  (attr)        \"Download button\"           A way to override the link text, or set the link text for links\r\n *                                                              That have no textual content\r\n *\r\n * `data-id`          (attr)        \"download-link-bla\"         Specify link-id for the given link\r\n *\r\n * `data-track-type`  (attr)        \"button\",\"out\"              Specify what kind of tracking type do we use.\r\n *\r\n * `.skip-tracking`   (cls)         -                           The tracking algorithm will skip links with this class\r\n *\r\n *\r\n *\r\n *\r\n */\r\n\r\n\r\ndefine('show/linkTracking', function (require) {\r\n\r\n\r\n    var array = require('fire/util/array');\r\n    var str = require('fire/util/strings');\r\n    var isAuthor = require('smore/isAuthor');\r\n    var widgetInfo = require('smore/widgetInfo');\r\n    var url = require('smore/util/url');\r\n\r\n\r\n    var END_POINT = url.full + '/app/reporting/{0}/{1}?u={2}&t={3}&w={4}&i={5}&l={6}';\r\n    var SELECTOR = '.post-container a';\r\n\r\n    var FLYER_SHORT_KEY = $('#smore_short_key').attr('value');\r\n\r\n    /*********************************************************************************\r\n     * SETUP\r\n     *********************************************************************************/\r\n\r\n\r\n    /**\r\n     * Invoked on DOM ready, setup tracking for each link element matching `SELECTOR`\r\n     */\r\n    function init() {\r\n        $(SELECTOR).forEach(setupTracking);\r\n    }\r\n\r\n\r\n    /***\r\n     * Setup tracking for a given anchor element\r\n     *\r\n     * @param {Element} el\r\n     */\r\n    function setupTracking(el) {\r\n\r\n        var anchorEl = $(el);\r\n\r\n        // skip tracking for links with .skip-tracking\r\n        if (anchorEl.hasClass('skip-tracking')) return;\r\n\r\n        if (!anchorEl.attr('href')) {\r\n            return;\r\n        }\r\n\r\n        // Encode the href\r\n        var href = encodeURIComponent(anchorEl.attr('href'));\r\n\r\n        // Try to extract the text, trim it 200 chars\r\n        var t = $.trim(anchorEl.text().replace(/\\s+/g, ' ')).substr(0, 200);\r\n\r\n        // Try to get the text from `data-track-text` attribute, or use the extracted texts\r\n        var text = anchorEl.data('track-text') || encodeURIComponent(t);\r\n\r\n        // Use the widget info tool to extract the id\r\n        var w = widgetInfo.fromEl(anchorEl);\r\n\r\n        // Use the `data-id` attribute to extract the data\r\n        var id = anchorEl.data('id') || '';\r\n\r\n        var type = anchorEl.data('track-type') || 'out';\r\n\r\n        // Generate the tracking href\r\n        var trackHref = str.format(END_POINT, type, FLYER_SHORT_KEY, encodeURIComponent(href), text, w.id, w.info, id);\r\n\r\n        // Set the attributes for the tracking\r\n        anchorEl.attr({'o-href': href, 'track-href': trackHref})\r\n            .one('touchstart', onFirstTouchStart)\r\n            // Attach a one-time event handle for the first mouse down\r\n            .one('mousedown', onFirstMouseDown);\r\n    }\r\n\r\n\r\n    /***\r\n     * Initialize the tracking for the the given element\r\n     *\r\n     * We also pass the original mouse down event to immediately call the mouse down handler\r\n     *\r\n     * @param {jQuery.Event}    e\r\n     */\r\n    function onFirstMouseDown(e) {\r\n        var linkEl = $(e.currentTarget);\r\n\r\n        // If our link is marked by the touch event, there is no need to attach mouse events\r\n        if (linkEl.data(\"isTouch\")) {\r\n            return;\r\n        }\r\n\r\n        // Attach handlers\r\n        linkEl.on('mousedown', onMouseDown)\r\n            .on('mouseup', onMouseUp)\r\n            .on('mouseout', onMouseOut)\r\n            .on('click', onClick);\r\n\r\n        // finish with mouse down\r\n        onMouseDown(e);\r\n    }\r\n\r\n    /***\r\n     * Update the href for touch events\r\n     * @param e\r\n     */\r\n    function onFirstTouchStart(e) {\r\n        var a = $(e.currentTarget);\r\n        // Set as touch\r\n        a.data('isTouch', true);\r\n        setHref(a, a.attr('track-href'));\r\n    }\r\n\r\n    /**************************** Click handling ************************************/\r\n\r\n    /***\r\n     * Handle MouseDown *After* setup.\r\n     *\r\n     * This is used to support the case of middle click\r\n     *\r\n     * @param {jQuery.Event} e\r\n     */\r\n    function onMouseDown(e) {\r\n        if (e.button === 2) { // if middle click\r\n            var a = $(e.currentTarget);\r\n            // set the href\r\n            setHref(a, a.attr('track-href'));\r\n        }\r\n    }\r\n\r\n    /**\r\n     * On mouse up, we quickly set the active href to be the tracking href\r\n     * @param {jQuery.Event} e\r\n     */\r\n    function onMouseUp(e) {\r\n        var a = $(e.currentTarget);\r\n        setHref(a, a.attr('track-href'));\r\n    }\r\n\r\n    /**\r\n     * When the user's mouse is leaving the link, we want to restore the original href\r\n     * @param {jQuery.Event} e\r\n     */\r\n    function onMouseOut(e) {\r\n        var a = $(e.currentTarget);\r\n        setHref(a, a.attr('o-href'));\r\n    }\r\n\r\n    /***\r\n     * On click we do two things:\r\n     *\r\n     * - Set the href to the tracking href\r\n     * - Queue a change back to the original href after 100ms\r\n     *\r\n     * @param {jQuery.Event} e\r\n     */\r\n    function onClick(e) {\r\n        var a = $(e.currentTarget);\r\n\r\n        // set the url to the tracking href\r\n        setHref(a, a.attr('track-href'));\r\n\r\n        // restore the correct url after the click\r\n        setTimeout(function () {\r\n            setHref(a, a.attr('o-href'));\r\n        }, 100);\r\n    }\r\n\r\n\r\n    /*********************************************************************************\r\n     * Utils\r\n     *********************************************************************************/\r\n\r\n    /***\r\n     * Safely set the anchor's href attribute\r\n     *\r\n     * @param {jQuery} anchorEl\r\n     * @param {String} href\r\n     */\r\n    function setHref(anchorEl, href) {\r\n        href = decodeURIComponent(href);\r\n        // fix ie bug\r\n        if ($.browser.ie) {\r\n            var s = $('<span/>').appendTo(anchorEl);\r\n            anchorEl.attr('href', href);\r\n            s.remove();\r\n        } else {\r\n            anchorEl.attr('href', href);\r\n        }\r\n    }\r\n\r\n\r\n    // If the user is not the author of this flyer, init the click tracking\r\n    if (!isAuthor()) {\r\n        $(init);\r\n    }\r\n});", "define('smore/ui/flash', function (require) {\r\n\r\n    var FLASH_SELECTOR = '.flash-animation-container';\r\n    var FLASH_TIMEOUT = 5000;\r\n\r\n    function hideFlash() {\r\n        setTimeout(function () {\r\n            $(FLASH_SELECTOR).addClass('hidden');\r\n        }, FLASH_TIMEOUT);\r\n    }\r\n\r\n    $(hideFlash);\r\n});", "define('smore/boardLoader', function (require) {\r\n    // require waypoints.js\r\n\r\n\r\n    var END_POINT = '/app/discovery/board/';\r\n    var FLYER_SELECTOR = '.flyer';\r\n    var STEP = 25;\r\n\r\n    var _skip = 0, _key, _loaded = {}, _loading;\r\n\r\n    function setup() {\r\n\r\n        var b = $('.board-page');\r\n        if (!b.length) return;\r\n\r\n        _key = b.data('board');\r\n\r\n        _skip = b.data('skip');\r\n\r\n        _loading = b.find('.loading');\r\n\r\n        updateAndFilterLoaded(b);\r\n\r\n        // setup waypoint\r\n        _loading.waypoint(fetchMore, {offset:'150%'});\r\n    }\r\n\r\n    function updateAndFilterLoaded(el) {\r\n        var flyers = el.find(FLYER_SELECTOR);\r\n\r\n        flyers.each(function () {\r\n            // Get flyer\r\n            var f = $(this);\r\n\r\n            // Extract id\r\n            var id = f.data('id');\r\n\r\n            // If in loaded, remove the flyer\r\n            if (id in _loaded) {\r\n                f.remove();\r\n            } else {\r\n                _loaded[id] = 1;\r\n            }\r\n        })\r\n    }\r\n\r\n\r\n    function fetchMore(e, dir) {\r\n        if (dir === 'up') return;\r\n\r\n        _loading.addClass('active');\r\n\r\n\r\n        $.get(END_POINT + _key + '?' + $.param({\r\n            skip:_skip,\r\n            partial:true,\r\n            count:STEP\r\n        })).done(pushResult)\r\n            .fail(errorLoading);\r\n\r\n        _skip += STEP;\r\n    }\r\n\r\n    function pushResult(response) {\r\n        // Convert response to jQuery\r\n        var r = $('<div>' + response + '</div>');\r\n        // Filter for already loaded\r\n        updateAndFilterLoaded(r);\r\n\r\n        r.find('.flyer').addClass('pending').css('opacity',0);\r\n\r\n        // Push result before\r\n        _loading.before(r.html());\r\n\r\n        var flyers = _loading.prevAll('.pending.flyer');\r\n\r\n        flyers.animate({opacity:1}, 500, function () {\r\n            flyers.removeClass('pending');\r\n        });\r\n\r\n        _loading.removeClass('active');\r\n\r\n\r\n        // update waypoints\r\n        $.waypoints('refresh')\r\n    }\r\n\r\n    function errorLoading() {\r\n        // on error, try again in a few moments\r\n        setTimeout(fetchMore, 1000);\r\n        _loading.removeClass('active');\r\n    }\r\n\r\n\r\n    // setup on dom ready\r\n    $(setup);\r\n});", "define('fire/util/modernBrowser', function (require) {\r\n\r\n    /* Modernizr 2.5.3 (Custom Build) | MIT & BSD\r\n     * Build: http://www.modernizr.com/download/#-borderradius-boxshadow-hsla-opacity-rgba-canvas-testprop-testallprops-prefixes-domprefixes\r\n     */\r\n    var _modernizr=function(a,b,c){function x(a){i.cssText=a}function y(a,b){return x(l.join(a+\";\")+(b||\"\"))}function z(a,b){return typeof a===b}function A(a,b){return!!~(\"\"+a).indexOf(b)}function B(a,b){for(var d in a)if(i[a[d]]!==c)return b==\"pfx\"?a[d]:!0;return!1}function C(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:z(f,\"function\")?f.bind(d||b):f}return!1}function D(a,b,c){var d=a.charAt(0).toUpperCase()+a.substr(1),e=(a+\" \"+n.join(d+\" \")+d).split(\" \");return z(b,\"string\")||z(b,\"undefined\")?B(e,b):(e=(a+\" \"+o.join(d+\" \")+d).split(\" \"),C(e,b,c))}var d=\"2.5.3\",e={},f=b.documentElement,g=\"modernizr\",h=b.createElement(g),i=h.style,j,k={}.toString,l=\" -webkit- -moz- -o- -ms- \".split(\" \"),m=\"Webkit Moz O ms\",n=m.split(\" \"),o=m.toLowerCase().split(\" \"),p={},q={},r={},s=[],t=s.slice,u,v={}.hasOwnProperty,w;!z(v,\"undefined\")&&!z(v.call,\"undefined\")?w=function(a,b){return v.call(a,b)}:w=function(a,b){return b in a&&z(a.constructor.prototype[b],\"undefined\")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!=\"function\")throw new TypeError;var d=t.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(t.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(t.call(arguments)))};return e}),p.canvas=function(){var a=b.createElement(\"canvas\");return!!a.getContext&&!!a.getContext(\"2d\")},p.rgba=function(){return x(\"background-color:rgba(150,255,150,.5)\"),A(i.backgroundColor,\"rgba\")},p.hsla=function(){return x(\"background-color:hsla(120,40%,100%,.5)\"),A(i.backgroundColor,\"rgba\")||A(i.backgroundColor,\"hsla\")},p.borderradius=function(){return D(\"borderRadius\")},p.boxshadow=function(){return D(\"boxShadow\")},p.opacity=function(){return y(\"opacity:.55\"),/^0.55$/.test(i.opacity)};for(var E in p)w(p,E)&&(u=E.toLowerCase(),e[u]=p[E](),s.push((e[u]?\"\":\"no-\")+u));return x(\"\"),h=j=null,e._version=d,e._prefixes=l,e._domPrefixes=o,e._cssomPrefixes=n,e.testProp=function(a){return B([a])},e.testAllProps=D,e}(this,this.document);\r\n\r\n\r\n    function isModern() {\r\n        // test for modernizr results\r\n        if (_modernizr) {\r\n            return _modernizr.boxshadow &&\r\n                _modernizr.borderradius &&\r\n                _modernizr.canvas &&\r\n                _modernizr.hsla &&\r\n                _modernizr.opacity &&\r\n                _modernizr.rgba;\r\n        }\r\n    }\r\n\r\n    return isModern;\r\n});", "define('fire/ui/browserWarning', function (require) {\r\n\r\n    var modernBrowser = require('fire/util/modernBrowser');\r\n    var modal = require('fire/ui/modal');\r\n\r\n    function init(warningModal) {\r\n        warningModal = $(warningModal);\r\n\r\n        // Disabling the old browser warning\r\n        var enableCheck = false;\r\n\r\n        if (enableCheck && !modernBrowser()) {\r\n            return show(warningModal);\r\n        }\r\n\r\n        return $.when();\r\n    }\r\n\r\n    function show(modalEl) {\r\n        var dfd = $.Deferred();\r\n\r\n        modal.show(modalEl, {overlayClose:false}).done(function (el) {\r\n            el.find('.continue').click(function () {\r\n                modal.close().done(dfd.resolve);\r\n            });\r\n\r\n            el.find('.back').click(function () {\r\n                history.go(-1);\r\n            });\r\n\r\n        });\r\n\r\n        return dfd.promise();\r\n    }\r\n\r\n    return init;\r\n});", "define('author/ui/settings/privacy', function (require) {\r\n\r\n    var _privacy;\r\n\r\n    function value() {\r\n        return _privacy;\r\n    }\r\n\r\n\r\n    function init(el) {\r\n\r\n        // get all the privacy buttons\r\n        var items = el.find('.privacy-button');\r\n\r\n        items.click(onPrivacyButtonClicked);\r\n\r\n        _privacy = items.filter('.active').first().data('value');\r\n    }\r\n\r\n    function onPrivacyButtonClicked(e) {\r\n        var b = $(e.currentTarget);\r\n\r\n        var cur = _privacy;\r\n        _privacy = b.data('value');\r\n        var parent = b.parents('.privacy');\r\n\r\n        // remove everything\r\n        parent.removeClass('privacy-' + cur)\r\n            // add privacy\r\n            .addClass('privacy-' + _privacy);\r\n\r\n        b.addClass('active').siblings().removeClass('active');\r\n\r\n    }\r\n\r\n\r\n    return {\r\n        init:init,\r\n        value:value\r\n    }\r\n});", "define('author/ui/settings/domain', function (require) {\r\n\r\n    var safe = require('fire/net/safe');\r\n    var _value, _valid = true;\r\n\r\n    var TEST_DOMAIN_END_POINT = '/app/pages/test_domain';\r\n\r\n    function init(el) {\r\n        var box = el.find('#settings-domain');\r\n        setValue($.trim(box.val()));\r\n\r\n        box.on('keyup paste cut change', onBoxChanged.delayed(250));\r\n\r\n        el.find('.test-domain-button').click(onTestDomainClicked);\r\n    }\r\n\r\n    function setValue(val) {\r\n        _value = val;\r\n        var db = $('#test-domain-button');\r\n\r\n        if (!db.hasClass('loading')) db.toggleClass('disabled', !_value || !_valid);\r\n    }\r\n\r\n    function onBoxChanged(e) {\r\n        var b = $(e.currentTarget);\r\n\r\n        _value = verify(b);\r\n    }\r\n\r\n    function hideError(box) {\r\n        _valid = true;\r\n        $('#settings-domain-error').slideUp();\r\n        if (box) box.removeClass('error');\r\n    }\r\n\r\n    function showError(box, msg, skipInvalid) {\r\n        if (!skipInvalid) _valid = false;\r\n\r\n        $('#settings-domain-success').hide();\r\n        var error = $('#settings-domain-error');\r\n        if (msg) {\r\n            error.html(msg)\r\n        }\r\n        error.slideDown();\r\n        if (box) box.addClass('error');\r\n    }\r\n\r\n    function showSuccess() {\r\n        $('#settings-domain-success').slideDown();\r\n    }\r\n\r\n    function verify(b) {\r\n        var val = $.trim(b.val());\r\n\r\n        if (!val) {\r\n            hideError(b);\r\n            setValue(val);\r\n            return;\r\n        }\r\n\r\n        test(val, true).done(function () {\r\n            hideError(b);\r\n            setValue(val);\r\n        }).fail(function (errorMessage, status, jqXhr, data) {\r\n                var msg = getErrorMessage(errorMessage, data);\r\n                showError(b, msg);\r\n                setValue(val);\r\n            });\r\n    }\r\n\r\n    function getErrorMessage(e, c) {\r\n        switch (e) {\r\n            case 'domain_not_ready':\r\n                return \"Your domain doesn't point to smore.com.\";\r\n            case 'already_used':\r\n                return \"Your domain is already mapped to <a href='\" + c.page_link + \"'> this page</a>.\";\r\n            case 'invalid_domain':\r\n                return \"You can't use this domain :(\";\r\n            default:\r\n                return \"Something went wrong... :(\";\r\n        }\r\n    }\r\n\r\n\r\n    function test(val, quick) {\r\n        // quick test will not try to validate that the domain is already targeted at smore\r\n        // it will only test if domain is not already taken etc\r\n\r\n        return safe.post(TEST_DOMAIN_END_POINT, {\r\n            page_id:window.pageId,\r\n            domain:val,\r\n            quick:quick\r\n        })\r\n    }\r\n\r\n\r\n    function onTestDomainClicked(e) {\r\n        var b = $(e.currentTarget);\r\n        if (b.hasClass('disabled')) return;\r\n\r\n        var domainBox = $('#settings-domain');\r\n        var val = $.trim(domainBox.val());\r\n        b.text('Testing...').addClass('disabled loading');\r\n        domainBox.attr('disabled', true);\r\n\r\n        test(val, false).done(function () {\r\n            hideError(null);\r\n            showSuccess();\r\n        }).fail(function (errorMessage, status, jqXhr, data) {\r\n                var msg = getErrorMessage(errorMessage, data);\r\n                showError(null, msg, true);\r\n            }).always(function () {\r\n                b.text('Test domain').removeClass('disabled loading');\r\n                domainBox.removeAttr('disabled');\r\n            });\r\n\r\n    }\r\n\r\n\r\n    function value() {\r\n        return _value;\r\n    }\r\n\r\n    function isValid() {\r\n        return _valid;\r\n    }\r\n\r\n    return {\r\n        init:init,\r\n        value:value,\r\n        isValid:isValid\r\n    }\r\n\r\n});", "define('author/ui/settings/gaCode', function (require) {\r\n\r\n    var _value, _valid = true;\r\n    var UA_REGEXP = /^ua-\\d{4,9}-\\d{1,4}$/i;\r\n\r\n    function init(el) {\r\n        var box = el.find('#settings-ga-code');\r\n        _value = $.trim(box.val());\r\n\r\n        box.on('keyup paste cut change', onBoxChanged.delayed(100));\r\n    }\r\n\r\n    function onBoxChanged(e) {\r\n        var b = $(e.currentTarget);\r\n\r\n        _value = verify(b);\r\n    }\r\n\r\n    function hideError(box) {\r\n        _valid = true;\r\n        $('#ga-error').slideUp();\r\n        box.removeClass('error');\r\n    }\r\n\r\n    function showError(box) {\r\n        _valid = false;\r\n        $('#ga-error').slideDown();\r\n        box.addClass('error');\r\n    }\r\n\r\n    function verify(b) {\r\n        var val = $.trim(b.val());\r\n\r\n        if (!val) {\r\n            hideError(b);\r\n            return val;\r\n        }\r\n\r\n        if (UA_REGEXP.test(val)) {\r\n            hideError(b);\r\n            return val;\r\n        } else {\r\n            showError(b);\r\n            return '';\r\n        }\r\n    }\r\n\r\n    function value() {\r\n        return _value;\r\n    }\r\n\r\n\r\n    return {\r\n        init:init,\r\n        value:value,\r\n        isValid:function () {\r\n            return _valid\r\n        }\r\n    }\r\n\r\n});", "/*****\r\n * @fileOverview handles the author settings popover\r\n */\r\ndefine('author/ui/settings/modal', function(require) {\r\n\r\n    var safe = require('fire/net/safe');\r\n    var token = require('smore/token');\r\n    var json = require('fire/util/json');\r\n    var modal = require('fire/ui/modal');\r\n    var privacy = require('author/ui/settings/privacy');\r\n    var domain = require('author/ui/settings/domain');\r\n    var gaCode = require('author/ui/settings/gaCode');\r\n    var report = smore.report;\r\n\r\n    // Tracking events\r\n    var Events = {\r\n        open_modal: 'SETTINGS: open the settings modal'\r\n    };\r\n\r\n    safe.token(token);\r\n\r\n    // thanks to gilad's hack\r\n    var _flyerId;\r\n\r\n\r\n    var MODAL_ENDPOINT = '/app/pages/settings_modal/';\r\n    var SETTINGS_SAVE_ENDPOINT = '/app/pages/save_settings';\r\n\r\n\r\n    var MODAL_OPTIONS = {\r\n        cssClass: 'base-modal settings-modal',\r\n        width: 710,\r\n        overlayClose: false,\r\n        close: onClose\r\n    };\r\n\r\n    function show() {\r\n        modal.showUrl(MODAL_ENDPOINT + _flyerId, MODAL_OPTIONS).done(setupModal);\r\n        // report the event\r\n        report.track(Events.open_modal, {}, true);\r\n    }\r\n\r\n    var _validInterval, _saveButton;\r\n\r\n    function setupModal(el) {\r\n        setupCheckboxes(el);\r\n        privacy.init(el);\r\n        gaCode.init(el);\r\n        domain.init(el);\r\n\r\n        _saveButton = el.find('.save-settings').click(save);\r\n\r\n        function validTest() {\r\n            var valid = domain.isValid() && gaCode.isValid();\r\n            if (!_saveButton.hasClass('saving')) _saveButton.toggleClass('disabled', !valid);\r\n        }\r\n\r\n        _validInterval = setInterval(validTest, 100);\r\n\r\n        // Setup accordion\r\n\r\n        el.find('.accordion-header').click(onAccordionItemClicked);\r\n\r\n        // Some logic for toggling the disabled/enabled option\r\n        var audienceCollectionCheckbox = el.find('#settings-checkbox-collect-audience');\r\n        audienceCollectionCheckbox.change(function() {\r\n\r\n            var isChecked = audienceCollectionCheckbox.attr('checked');\r\n\r\n            var target = el.find('#subscribers-target');\r\n\r\n            if (isChecked) {\r\n                target.removeAttr('disabled');\r\n                target.parent().removeClass('disabled');\r\n            } else {\r\n                target.attr('disabled', true);\r\n                target.parent().addClass('disabled');\r\n            }\r\n        });\r\n    }\r\n\r\n\r\n    /***\r\n     * Handle accordion movements\r\n     * @param e\r\n     */\r\n    function onAccordionItemClicked(e) {\r\n        // get the header\r\n        var header = $(e.currentTarget);\r\n        var item = header.parent('.accordion-item');\r\n\r\n        if (item.hasClass('active')) {\r\n            return;\r\n        }\r\n\r\n        item.addClass('active').siblings('.accordion-item').removeClass('active');\r\n\r\n        // Mark all the previous item with the up class\r\n        item.prevAll('.accordion-item').find('.toggler').removeClass('up');\r\n\r\n        // Mark the next items with the up class\r\n        item.nextAll('.accordion-item').find('.toggler').addClass('up');\r\n    }\r\n\r\n    function onClose() {\r\n        clearInterval(_validInterval);\r\n    }\r\n\r\n\r\n    /*********************************************************************************\r\n     * Saving\r\n     *********************************************************************************/\r\n\r\n    var _originalSaveText;\r\n\r\n    function save(e) {\r\n        var b = $(e.currentTarget);\r\n        if (b.hasClass('disabled')) return;\r\n\r\n        var updatesMailingListId = $('#subscribers-target').val();\r\n\r\n        // options to send\r\n        var opts = {\r\n            page_id: _flyerId,\r\n            allow_social: getCheckboxValue('social'),\r\n            allow_related: getCheckboxValue('related'),\r\n            allow_profile: getCheckboxValue('profile'),\r\n            allow_branding: getCheckboxValue('branding'),\r\n            allow_contact_author: getCheckboxValue('contact-author'),\r\n            allow_collect_audience: getCheckboxValue('collect-audience'),\r\n            updates_mailing_list_id: updatesMailingListId,\r\n\r\n            domain: domain.value(),\r\n            privacy: privacy.value(),\r\n            google_analytics_code: gaCode.value()\r\n        };\r\n\r\n        // TODO - set the modal to \"Saving\" mode\r\n        _originalSaveText = b.text();\r\n        b.addClass('disabled saving').text('Saving...');\r\n\r\n        safe.post(SETTINGS_SAVE_ENDPOINT, opts).done(onSaveComplete).fail(onSaveFailed);\r\n    }\r\n\r\n    function onSaveComplete() {\r\n        // reload the page on completion\r\n        document.location.reload();\r\n    }\r\n\r\n    function onSaveFailed() {\r\n        alert('Oops! we had a problem on our server :( Please try again!');\r\n        _saveButton.removeClass('disabled saving').text(_originalSaveText);\r\n    }\r\n\r\n\r\n    /*********************************************************************************\r\n     * Checkboxes\r\n     *********************************************************************************/\r\n\r\n    function setupCheckboxes(el) {\r\n        var checkboxes = el.find('.checkboxes input[type=checkbox]').click(onTogglerClicked);\r\n\r\n        checkboxes.each(function() {\r\n            var el = $(this);\r\n            var key = el.data('item');\r\n\r\n            var lbl = el.parent();\r\n\r\n            lbl.mouseenter(function() {\r\n                getPreview(key).addClass('hover');\r\n            }).mouseleave(function() {\r\n                getPreview(key).removeClass('hover');\r\n            });\r\n\r\n        });\r\n\r\n\r\n        var previews = el.find('.settings-preview > div').click(onTogglerClicked);\r\n\r\n        previews.each(function() {\r\n            var el = $(this);\r\n            var key = el.data('item');\r\n\r\n            el.mouseenter(function() {\r\n                getPreview(key).addClass('hover');\r\n                getCheckbox(key).parent().addClass('hover');\r\n            }).mouseleave(function() {\r\n                getCheckbox(key).parent().removeClass('hover');\r\n                getPreview(key).removeClass('hover');\r\n            });\r\n        });\r\n\r\n    }\r\n\r\n    function onTogglerClicked(e) {\r\n        var t = $(e.currentTarget);\r\n        if (t.hasClass('disabled'))return;\r\n        var key = t.data('item');\r\n        if (!key) return;\r\n\r\n        var val = getCheckboxValue(key);\r\n\r\n        // if we've just clicked a checkbox, we enter the callback right after the value was changed,\r\n        // so we need to negate it\r\n        if (e.currentTarget.tagName === 'INPUT') {\r\n            val = !val;\r\n        }\r\n\r\n        if (val) {\r\n            getCheckbox(key).removeAttr('checked');\r\n            getPreview(key).addClass('inactive');\r\n        } else {\r\n            getCheckbox(key).attr('checked', true);\r\n            getPreview(key).removeClass('inactive');\r\n        }\r\n    }\r\n\r\n    function getCheckbox(key) {\r\n        return $('#settings-checkbox-' + key);\r\n    }\r\n\r\n    function getPreview(key) {\r\n        return $('.settings-preview-' + key);\r\n    }\r\n\r\n    function getCheckboxValue(key) {\r\n        return !!getCheckbox(key).attr('checked');\r\n    }\r\n\r\n    /**\r\n     * Setup all the events\r\n     */\r\n    function init() {\r\n        _flyerId = window.pageId;\r\n\r\n        $('#settings-button').click(show);\r\n    }\r\n\r\n    return {\r\n        init: init,\r\n        show: show\r\n    };\r\n});", "// Generated by CoffeeScript 1.12.7\nvar bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/test', function(require) {\n  var TEST_EMAIL_ENDPOINT, TestEmailPopover, popover, safe;\n  popover = require('fire/ui/views/PopoverView');\n  safe = require('fire/net/safe');\n  TEST_EMAIL_ENDPOINT = '/app/newsletters/test_email_flyer';\n  TestEmailPopover = (function(superClass) {\n    extend(TestEmailPopover, superClass);\n\n    TestEmailPopover.prototype.templateSelector = '#test-email-template';\n\n    TestEmailPopover.prototype.events = {\n      'click .send-test-email': 'onSendTestEmailClicked'\n    };\n\n    function TestEmailPopover(wizard, options) {\n      this.wizard = wizard;\n      this.onClose = bind(this.onClose, this);\n      this.onTestFailed = bind(this.onTestFailed, this);\n      this.onTestCompleted = bind(this.onTestCompleted, this);\n      this.toggleTestButton = bind(this.toggleTestButton, this);\n      TestEmailPopover.__super__.constructor.call(this, options);\n    }\n\n    TestEmailPopover.prototype.render = function() {\n      var targetEmail;\n      this.target = this.find('.target');\n      this.testButton = this.find('.send-test-email');\n      this.target.on('textchange', this.toggleTestButton);\n      targetEmail = this.wizard.context.targetEmail;\n      if (targetEmail) {\n        this.target.val(targetEmail);\n      }\n      return this.toggleTestButton();\n    };\n\n    TestEmailPopover.prototype.toggleTestButton = function() {\n      return this.testButton.toggleClass('disabled', !this.getTargetEmail());\n    };\n\n    TestEmailPopover.prototype.onSendTestEmailClicked = function() {\n      var info;\n      if (this.testButton.hasClass('disabled')) {\n        return;\n      }\n      info = this.wizard.context.toEmailConfig();\n      info['target_email'] = this.getTargetEmail();\n      this.mask('Sending...');\n      return safe.post(TEST_EMAIL_ENDPOINT, info).done(this.onTestCompleted).fail(this.onTestFailed);\n    };\n\n    TestEmailPopover.prototype.onTestCompleted = function() {\n      this.mask('Test email was sent!' + '<br/><a style=\"font-size:11px\" class=\"fire-popover-close\">Close</a>');\n      return setTimeout(((function(_this) {\n        return function() {\n          return _this.close();\n        };\n      })(this)), 4000);\n    };\n\n    TestEmailPopover.prototype.onTestFailed = function(err) {\n      var content;\n      if (!typeof err === 'string') {\n        err = '';\n      }\n      content = err || 'Something went wrong :( \\n Please try again...';\n      content += '<br/><a style=\"font-size:11px\" class=\"fire-popover-close\">Close</a>';\n      this.mask(content);\n      return setTimeout(((function(_this) {\n        return function() {\n          return _this.close();\n        };\n      })(this)), 4000);\n    };\n\n    TestEmailPopover.prototype.getTargetEmail = function() {\n      return $.trim(this.target.val());\n    };\n\n    TestEmailPopover.prototype.onClose = function() {\n      return this.wizard.context.targetEmail = $.trim(this.target.val());\n    };\n\n    return TestEmailPopover;\n\n  })(popover.PopoverView);\n  return {\n    TestEmailPopover: TestEmailPopover\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty,\n  indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\ndefine('author/ui/email/steps/BeforeSendStep', function(require) {\n  var BeforeSendStep, EditSenderPopover, GET_SEND_INFO_ENDPOINT, INVALID_EMAILS_REGEX, popover, safe, sv;\n  sv = require('fire/ui/views/WizardStepView');\n  popover = require('fire/ui/views/PopoverView');\n  safe = require('fire/net/safe');\n  GET_SEND_INFO_ENDPOINT = '/app/newsletters/get_send_info';\n  INVALID_EMAILS_REGEX = /(@smore\\.com|@smorepages.com)$/;\n\n  /*\n  The address entry step\n   */\n  BeforeSendStep = (function(superClass) {\n    extend(BeforeSendStep, superClass);\n\n    function BeforeSendStep() {\n      this._onSendInfoError = bind(this._onSendInfoError, this);\n      this._onSendInfoLoaded = bind(this._onSendInfoLoaded, this);\n      this.saveState = bind(this.saveState, this);\n      return BeforeSendStep.__super__.constructor.apply(this, arguments);\n    }\n\n    BeforeSendStep.prototype.templateSelector = '#newsletter-wizard-before-send-step';\n\n    BeforeSendStep.prototype.cssClass = 'before-send-step';\n\n    BeforeSendStep.prototype.events = {\n      'click .send-button': 'onSendButtonClicked',\n      'click .edit-list': 'onEditListClicked',\n      'click .edit-sender': 'onEditSenderClicked',\n      'click #save-to-list-checkbox': 'onSaveToListClicked'\n    };\n\n    BeforeSendStep.prototype.render = function() {\n      this.subject = this.find('.subject');\n      this.note = this.find('.note');\n      this.sendButton = this.find('.send-button');\n      this.saveToListCheckbox = this.find('#save-to-list-checkbox');\n      this._canSend = false;\n      if (this.context.subject) {\n        this.subject.val(this.context.subject);\n      }\n      if (this.context.note) {\n        this.note.val(this.context.note);\n      }\n      this.toggleSendButton();\n      this.note.add(this.subject).on('textchange', (function(_this) {\n        return function() {\n          _this.saveState();\n          return _this.toggleSendButton();\n        };\n      })(this));\n      this.updateRecipientsInfo();\n      this.subject.focus();\n      setTimeout(((function(_this) {\n        return function() {\n          return _this.subject.select();\n        };\n      })(this)), 100);\n      this.updateSender();\n      this.editSenderPopover = new EditSenderPopover(this.context, ((function(_this) {\n        return function() {\n          return _this.updateSender();\n        };\n      })(this)));\n      if (this.context.isQuickSend()) {\n        this.find('.save-to-list').show();\n        if (this.context.saveToList) {\n          return this.saveToListCheckbox.attr('checked', true);\n        } else {\n          return this.saveToListCheckbox.removeAttr('checked');\n        }\n      }\n    };\n\n    BeforeSendStep.prototype.onSaveToListClicked = function(e) {\n      this.context.saveToList = this.saveToListCheckbox.is(':checked');\n      return true;\n    };\n\n    BeforeSendStep.prototype.onEditListClicked = function() {\n\n      /*\n      Go to the list editing screen\n       */\n      if (this.context.isQuickSend()) {\n        return this.wizard.goTo('quickSend');\n      } else {\n        return this.wizard.goTo('chooseList');\n      }\n    };\n\n    BeforeSendStep.prototype.onSendButtonClicked = function() {\n\n      /*\n       */\n      if (this.sendButton.hasClass('disabled')) {\n        return false;\n      }\n      this.context.saveToList = this.saveToListCheckbox.is(':checked');\n      return this.wizard.goTo('sendStatus');\n    };\n\n    BeforeSendStep.prototype.onEditSenderClicked = function(e) {\n      var t;\n      t = $(e.currentTarget);\n      return this.editSenderPopover.show(t);\n    };\n\n    BeforeSendStep.prototype.updateSender = function() {\n      if (this.context.fromName) {\n        this.find('.from-name').text(this.context.fromName);\n      }\n      if (this.context.fromAddress) {\n        return this.find('.from-address').text(this.context.fromAddress);\n      }\n    };\n\n    BeforeSendStep.prototype.saveState = function() {\n      this.context.subject = $.trim(this.subject.val());\n      return this.context.note = $.trim(this.note.val());\n    };\n\n    BeforeSendStep.prototype.toggleSendButton = function() {\n      return this.sendButton.toggleClass('disabled', !this.canSend());\n    };\n\n    BeforeSendStep.prototype.getBackStep = function(upcomingStep) {\n\n      /*\n      Override the back functionality\n       */\n      if (this.context.isQuickSend()) {\n        return upcomingStep;\n      }\n      return \"chooseList\";\n    };\n\n    BeforeSendStep.prototype.canSend = function() {\n      var subj;\n      subj = $.trim(this.subject.val());\n      return subj && this._canSend;\n    };\n\n    BeforeSendStep.prototype.updateRecipientsInfo = function() {\n      var info;\n      info = {};\n      if (this.context.isQuickSend()) {\n        info['emails'] = this.context.emails;\n      } else {\n        info['list_id'] = this.context.selectedList.id;\n      }\n      return safe.post(GET_SEND_INFO_ENDPOINT, info).done(this._onSendInfoLoaded).fail(this._onSendInfoError);\n    };\n\n    BeforeSendStep.prototype._onSendInfoLoaded = function(result) {\n      var html, recipientsEl, statusEl, text;\n      this._canSend = result.can_send;\n      this.toggleSendButton();\n      recipientsEl = this.find('.recipients');\n      if (this.context.isQuickSend()) {\n        text = this._pluralizeHelper(result.valid, 'address', 'addresses');\n        recipientsEl.text(text);\n      } else {\n        html = this.context.selectedList.name + \"<span>(\" + (this._pluralizeHelper(result.total, 'email', 'emails')) + \")</span>\";\n        recipientsEl.addClass('list').html(html);\n      }\n      if (!result.can_send && result.reason) {\n        statusEl = this.find('.send-info-status');\n        statusEl.show().addClass('error');\n        statusEl.find('.status-message-text').text(result.reason);\n        if (result.show_upgrade) {\n          return statusEl.find('.upgrade-link').show();\n        }\n      }\n    };\n\n    BeforeSendStep.prototype._pluralizeHelper = function(count, singular, plural) {\n      if (count === 1) {\n        return count + \" \" + singular;\n      }\n      return count + \" \" + plural;\n    };\n\n    BeforeSendStep.prototype._onSendInfoError = function(error) {\n      return null;\n    };\n\n    return BeforeSendStep;\n\n  })(sv.WizardStepView);\n\n  /*\n  A popover to let the user edit the from details\n   */\n  EditSenderPopover = (function(superClass) {\n    extend(EditSenderPopover, superClass);\n\n    EditSenderPopover.prototype.templateSelector = '#edit-sender-popover';\n\n    EditSenderPopover.prototype.events = {\n      'click .save-button': 'onSaveButtonClicked'\n    };\n\n    function EditSenderPopover(context, callback, options) {\n      this.context = context;\n      this.callback = callback;\n      if (options == null) {\n        options = {};\n      }\n      EditSenderPopover.__super__.constructor.call(this, options);\n    }\n\n    EditSenderPopover.prototype.onSaveButtonClicked = function() {\n      if (this.saveButton.hasClass('disabled')) {\n        return;\n      }\n      this.context.fromName = $.trim(this.nameEl.val());\n      this.context.fromAddress = $.trim(this.addressEl.val());\n      this.callback();\n      return this.close();\n    };\n\n    EditSenderPopover.prototype.render = function() {\n      this.nameEl = this.find('.input-name');\n      this.addressEl = this.find('.input-address');\n      this.saveButton = this.find('.save-button');\n      return this.nameEl.add(this.addressEl).on('textchange', (function(_this) {\n        return function() {\n          return _this.onTextChanged();\n        };\n      })(this));\n    };\n\n    EditSenderPopover.prototype.afterShow = function() {\n      if (this.context.fromName) {\n        this.nameEl.val(this.context.fromName);\n      }\n      if (this.context.fromAddress) {\n        this.addressEl.val(this.context.fromAddress);\n      }\n      return this.onTextChanged();\n    };\n\n    EditSenderPopover.prototype.onTextChanged = function() {\n\n      /*\n       * Invoked when there is a change in the text fields\n       */\n      var address, isDisabled, name;\n      name = $.trim(this.nameEl.val());\n      address = $.trim(this.addressEl.val());\n      isDisabled = (!name) || (!address) || !this.isLegalEmail(address);\n      return this.saveButton.toggleClass('disabled', isDisabled);\n    };\n\n    EditSenderPopover.prototype.isLegalEmail = function(address) {\n      if (!(indexOf.call(address, '@') >= 0)) {\n        return false;\n      }\n      return this.addressEl.data('user-email') === address || !INVALID_EMAILS_REGEX.test(address);\n    };\n\n    return EditSenderPopover;\n\n  })(popover.PopoverView);\n  return {\n    BeforeSendStep: BeforeSendStep\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/model', function(require) {\n  var GET_LISTS_ENDPOINT, ListInfo, NEW_LIST_ENDPOINT, QuickSendList, SEND_LIST_ENDPOINT, SEND_QUICK_ENDPOINT, ServerList, UPDATE_LIST_ENDPOINT, VALIDATE_EMAILS_ENDPOINT, fromServerList, getLists, invalidStatsFromServer, listUpdateProblems, newList, safe, sendList, sendQuickList, updateList, validate;\n  safe = require('fire/net/safe');\n  ListInfo = (function() {\n    \"Base class for list info\";\n    function ListInfo() {\n      this.count = 0;\n      this.unsubscribed = [];\n    }\n\n    return ListInfo;\n\n  })();\n  ServerList = (function(superClass) {\n    extend(ServerList, superClass);\n\n    function ServerList(id1, name1, count) {\n      this.id = id1;\n      this.name = name1;\n      this.count = count;\n      null;\n    }\n\n    ServerList.fromServer = function(response) {\n      return new ServerList(response.id, response.name, response.count);\n    };\n\n    return ServerList;\n\n  })(ListInfo);\n  QuickSendList = (function(superClass) {\n    extend(QuickSendList, superClass);\n\n    function QuickSendList(emails) {\n      this.emails = emails;\n      this.count = this.emails.length;\n    }\n\n    return QuickSendList;\n\n  })(ListInfo);\n  GET_LISTS_ENDPOINT = '/app/lists/get_lists';\n  NEW_LIST_ENDPOINT = '/app/lists/create';\n  UPDATE_LIST_ENDPOINT = '/app/lists/update';\n  VALIDATE_EMAILS_ENDPOINT = '/app/newsletters/validate_emails';\n  SEND_LIST_ENDPOINT = '/app/newsletters/send_list';\n  SEND_QUICK_ENDPOINT = '/app/newsletters/send_quick';\n  fromServerList = function(l) {\n    return ServerList.fromServer(l);\n  };\n  invalidStatsFromServer = function(r) {\n    return {\n      validCount: r.valid_count,\n      invalidCount: r.invalid_count,\n      invalidRows: r.invalid_emails\n    };\n  };\n  listUpdateProblems = function(resp, r) {\n    if (r && r.code === 'validation_error') {\n      return {\n        validCount: r.validation_errors.valid_count,\n        invalidCount: r.validation_errors.invalid_count,\n        invalidRows: r.validation_errors.invalid_emails,\n        validationError: true\n      };\n    }\n    return r;\n  };\n  getLists = function() {\n\n    /*\n      Get a list of the user's lists from the server\n     */\n    return safe.post(GET_LISTS_ENDPOINT).then(function(r) {\n      return r.map(fromServerList);\n    });\n  };\n  newList = function(name, emailListString, force) {\n    if (force == null) {\n      force = false;\n    }\n\n    /*\n    Create a new list, this can return an error like the validate method, or if successful, return an instance of server\n    lis\n     */\n    return safe.post(NEW_LIST_ENDPOINT, {\n      name: name,\n      email_str: emailListString,\n      force: force\n    }).then(fromServerList, listUpdateProblems);\n  };\n  updateList = function(id, emailListString, force) {\n    if (force == null) {\n      force = false;\n    }\n\n    /*\n    Update a list by the given id\n     */\n    return safe.post(UPDATE_LIST_ENDPOINT, {\n      list_id: id,\n      email_str: emailListString,\n      force: force\n    }).then(fromServerList, listUpdateProblems);\n  };\n  validate = function(emailListString) {\n\n    /*\n    Validate an email string, return the validation stats (validCount, invalidCount, invalidEmails)\n     */\n    return safe.post(VALIDATE_EMAILS_ENDPOINT, {\n      emails: emailListString\n    }).then(invalidStatsFromServer);\n  };\n  sendList = function(id, config) {\n\n    /*\n    Send the list with the given email config\n     */\n    config['list_id'] = id;\n    return safe.post(SEND_LIST_ENDPOINT, config);\n  };\n  sendQuickList = function(emailListString, config, saveToList) {\n\n    /*\n    Sends a Quick list\n     */\n    config['emails'] = emailListString;\n    config['save_to_list'] = saveToList;\n    return safe.post(SEND_QUICK_ENDPOINT, config);\n  };\n  return {\n    newList: newList,\n    getLists: getLists,\n    updateList: updateList,\n    sendList: sendList,\n    sendQuickList: sendQuickList,\n    validate: validate\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/steps/ChooseListStep', function(require) {\n  var ChooseListStep, model, safe, sv;\n  sv = require('fire/ui/views/WizardStepView');\n  safe = require('fire/net/safe');\n  model = require('author/ui/email/model');\n\n  /*\n  The address entry step\n   */\n  ChooseListStep = (function(superClass) {\n    extend(ChooseListStep, superClass);\n\n    function ChooseListStep() {\n      this.renderLists = bind(this.renderLists, this);\n      this.updateListInfo = bind(this.updateListInfo, this);\n      return ChooseListStep.__super__.constructor.apply(this, arguments);\n    }\n\n    ChooseListStep.prototype.templateSelector = '#newsletter-wizard-choose-list-step';\n\n    ChooseListStep.prototype.cssClass = 'choose-list-step';\n\n    ChooseListStep.prototype.events = {\n      'click .continue-button': 'onContinueButtonClicked',\n      'click .create-new-list': 'onCreateListButtonClicked',\n      'click ul.lists li': 'onListItemSelected',\n      'dblclick ul.lists li': 'onListItemDblClicked'\n    };\n\n    ChooseListStep.prototype.render = function() {\n      this.continueButton = this.find('.continue-button');\n      this.editListCheckbox = this.find('#edit-list-checkbox');\n      this.lists = this.find('.lists');\n      return this.loadLists();\n    };\n\n    ChooseListStep.prototype.onContinueButtonClicked = function() {\n\n      /*\n      Handle sending the list creation and errors\n       */\n      var isEdit;\n      if (this.continueButton.hasClass('disabled')) {\n        return false;\n      }\n      isEdit = this.editListCheckbox.is(':checked');\n      if (isEdit) {\n        return this.wizard.goTo('editList');\n      } else {\n        return this.wizard.goTo('beforeSend');\n      }\n    };\n\n    ChooseListStep.prototype.toggleContinueButton = function() {\n      return this.continueButton.toggleClass('disabled', !this.context.selectedList);\n    };\n\n    ChooseListStep.prototype.toggleForcedEdit = function() {\n\n      /*\n      Set the edit list checkbox state based on the selected list\n       */\n      var list;\n      list = this.context.selectedList;\n      if (list && !list.count) {\n        return this.editListCheckbox.attr({\n          'checked': true,\n          disabled: true\n        });\n      } else {\n        return this.editListCheckbox.removeAttr('disabled').removeAttr('checked');\n      }\n    };\n\n    ChooseListStep.prototype.loadLists = function() {\n      return model.getLists().done(this.updateListInfo).done(this.renderLists);\n    };\n\n    ChooseListStep.prototype.updateListInfo = function(lists) {\n      var list, sl;\n      this._lists = lists;\n      sl = this.context.selectedList;\n      if (sl) {\n        list = this.listById(sl.id);\n        if (!list) {\n          return this.context.selectedList = null;\n        }\n      }\n    };\n\n    ChooseListStep.prototype.listById = function(id) {\n      var i, len, list, ref;\n      ref = this._lists;\n      for (i = 0, len = ref.length; i < len; i++) {\n        list = ref[i];\n        if (list.id === id) {\n          return list;\n        }\n      }\n    };\n\n    ChooseListStep.prototype.renderLists = function(lists) {\n\n      /*\n      Render the lists that we got from the server\n       */\n      var i, len, li, list, ref, result;\n      result = [];\n      this.lists.removeClass('loading');\n      for (i = 0, len = lists.length; i < len; i++) {\n        list = lists[i];\n        li = $(\"<li data-id=\\\"\" + list.id + \"\\\">\\n    <div class=\\\"info\\\" >\\n        <h5>\" + list.name + \" <small>(\" + (this._pluralizeHelper(list.count, 'recipient', 'recipients')) + \")</small></h5>\\n    </div>\\n</li>\");\n        if (list.id === ((ref = this.context.selectedList) != null ? ref.id : void 0)) {\n          li.addClass('selected');\n        }\n        result.push(li);\n      }\n      this.lists.empty().append(result);\n      this.toggleContinueButton();\n      return this.toggleForcedEdit();\n    };\n\n    ChooseListStep.prototype._pluralizeHelper = function(count, singular, plural) {\n      if (count === 1) {\n        return count + \" \" + singular;\n      }\n      return count + \" \" + plural;\n    };\n\n    ChooseListStep.prototype.onListItemSelected = function(e) {\n\n      /*\n      When we click on a list item\n       */\n      var item, list;\n      item = $(e.currentTarget);\n      list = this.listById(item.data('id'));\n      if (!list) {\n        return;\n      }\n      this.context.selectedList = list;\n      item.addClass('selected').siblings().removeClass('selected');\n      this.toggleForcedEdit();\n      return this.toggleContinueButton();\n    };\n\n    ChooseListStep.prototype.onListItemDblClicked = function(e) {\n\n      /*\n      When we click on a list item\n       */\n      e.preventDefault();\n      return this.onContinueButtonClicked(e);\n    };\n\n    ChooseListStep.prototype.onCreateListButtonClicked = function() {\n      return this.wizard.goTo('newList');\n    };\n\n    return ChooseListStep;\n\n  })(sv.WizardStepView);\n  return {\n    ChooseListStep: ChooseListStep\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/steps/EditListStep', function(require) {\n  var EditListStep, model, safe, sv;\n  sv = require('fire/ui/views/WizardStepView');\n  safe = require('fire/net/safe');\n  model = require('author/ui/email/model');\n\n  /*\n  The address entry step\n   */\n  EditListStep = (function(superClass) {\n    extend(EditListStep, superClass);\n\n    function EditListStep() {\n      this.onUpdateListFailed = bind(this.onUpdateListFailed, this);\n      this.onUpdateListCompleted = bind(this.onUpdateListCompleted, this);\n      this.toggleContinueButton = bind(this.toggleContinueButton, this);\n      return EditListStep.__super__.constructor.apply(this, arguments);\n    }\n\n    EditListStep.prototype.templateSelector = '#newsletter-wizard-edit-list-step';\n\n    EditListStep.prototype.cssClass = 'edit-list-step';\n\n    EditListStep.prototype.events = {\n      'click .continue-button': 'onContinueButtonClicked',\n      'click .skip-button': 'onSkipButtonClicked',\n      'click .import-button': 'onImportButtonClicked'\n    };\n\n    EditListStep.prototype.render = function() {\n\n      /*\n      We want to setup some events here\n       */\n      var list;\n      list = this.context.selectedList;\n      this.continueButton = this.find('.continue-button');\n      this.skipButton = this.find('.skip-button');\n      this.textarea = this.find('textarea').on('textchange', this.toggleContinueButton);\n      this.textarea.val(this.context.emails || '');\n      if (!$.browser.msie) {\n        setTimeout((function(_this) {\n          return function() {\n            return _this.textarea.focus();\n          };\n        })(this), 100);\n      }\n      this.toggleContinueButton();\n      this.find('.list-name').text(list.name);\n      if (!list.count) {\n        return this.skipButton.addClass('disabled');\n      }\n    };\n\n    EditListStep.prototype.toggleContinueButton = function() {\n      var val;\n      val = $.trim(this.textarea.val());\n      return this.continueButton.toggleClass('disabled', !val);\n    };\n\n    EditListStep.prototype.onContinueButtonClicked = function(e) {\n\n      /*\n      Handles clicking on the continue button\n       */\n      var emails;\n      if (this.continueButton.hasClass('disabled')) {\n        return false;\n      }\n      emails = $.trim(this.textarea.val());\n      if (!emails) {\n        return;\n      }\n      this.context.emails = emails;\n      this._buttonText = this.continueButton.text();\n      this.continueButton.addClass('disabled').text('Please wait...');\n      this.textarea.attr('disabled', true);\n      return model.updateList(this.context.selectedList.id, emails).done(this.onUpdateListCompleted).fail(this.onUpdateListFailed);\n    };\n\n    EditListStep.prototype.onUpdateListCompleted = function(result) {\n\n      /*\n      This is called when the request is completed\n      \n      @param {Object} results   a result object which contains the number of valid emails\n                                and a list of the invalid ones\n       */\n      this.context.emails = null;\n      return this.wizard.goTo('beforeSend');\n    };\n\n    EditListStep.prototype.onUpdateListFailed = function(err) {\n\n      /*\n      This is called when the validation check itself has failed.\n       */\n      var msg;\n      if (err.validationError) {\n        this.context.updateValidation(err);\n        return this.wizard.goTo('listEmailErrors');\n      } else {\n\n        /*\n        Show an error to the user\n         */\n        msg = err.message || 'Something went wrong. :-/ \\n Please try again!';\n        this.continueButton.removeClass('disabled').text(this._buttonText);\n        this.textarea.removeAttr('disabled');\n        return alert(msg);\n      }\n    };\n\n    EditListStep.prototype.onSkipButtonClicked = function(e) {\n      if (this.skipButton.hasClass('disabled')) {\n        return false;\n      }\n      return this.wizard.goTo('beforeSend');\n    };\n\n    EditListStep.prototype.onImportButtonClicked = function() {\n      return this.wizard.goTo('importContactsFile');\n    };\n\n    return EditListStep;\n\n  })(sv.WizardStepView);\n  return {\n    EditListStep: EditListStep\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/steps/ImportStep', function(require) {\n  var ImportStep, safe, sv;\n  sv = require('fire/ui/views/WizardStepView');\n  safe = require('fire/net/safe');\n\n  /*\n  The address entry step\n   */\n  ImportStep = (function(superClass) {\n    extend(ImportStep, superClass);\n\n    function ImportStep() {\n      return ImportStep.__super__.constructor.apply(this, arguments);\n    }\n\n    ImportStep.prototype.templateSelector = '#newsletter-wizard-import-step';\n\n    ImportStep.prototype.cssClass = 'import-step';\n\n    ImportStep.prototype.render = function() {\n      return null;\n    };\n\n    return ImportStep;\n\n  })(sv.WizardStepView);\n  return {\n    ImportStep: ImportStep\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/steps/NewListStep', function(require) {\n  var NewListStep, model, safe, sv;\n  sv = require('fire/ui/views/WizardStepView');\n  safe = require('fire/net/safe');\n  model = require('author/ui/email/model');\n\n  /*\n  The address entry step\n   */\n  NewListStep = (function(superClass) {\n    extend(NewListStep, superClass);\n\n    function NewListStep() {\n      this.onNewListFailed = bind(this.onNewListFailed, this);\n      this.onNewListCreated = bind(this.onNewListCreated, this);\n      this.toggleContinueButton = bind(this.toggleContinueButton, this);\n      return NewListStep.__super__.constructor.apply(this, arguments);\n    }\n\n    NewListStep.prototype.templateSelector = '#newsletter-wizard-new-list-step';\n\n    NewListStep.prototype.cssClass = 'new-list-step';\n\n    NewListStep.prototype.events = {\n      'click .continue-button': 'onContinueButtonClicked'\n    };\n\n    NewListStep.prototype.render = function() {\n\n      /*\n      We want to setup some events here\n       */\n      this.continueButton = this.find('.continue-button');\n      this.textarea = this.find('textarea').on('textchange', this.toggleContinueButton);\n      this.listName = this.find('.list-name').on('textchange', this.toggleContinueButton);\n      this.textarea.val(this.context.emails || '');\n      this.listName.val(this.context.newListName || '');\n      if (!$.browser.msie) {\n        setTimeout((function(_this) {\n          return function() {\n            return _this.listName.focus();\n          };\n        })(this), 100);\n      }\n      return this.toggleContinueButton();\n    };\n\n    NewListStep.prototype.toggleContinueButton = function() {\n\n      /*\n      Toggle the state of the continue button\n       */\n      var val;\n      val = $.trim(this.textarea.val()) && $.trim(this.listName.val());\n      return this.continueButton.toggleClass('disabled', !val);\n    };\n\n    NewListStep.prototype.onContinueButtonClicked = function() {\n\n      /*\n      Handle sending the list creation and errors\n       */\n      var emails, name;\n      if (this.continueButton.hasClass('disabled')) {\n        return;\n      }\n      emails = $.trim(this.textarea.val());\n      name = $.trim(this.listName.val());\n      if (!emails || !name) {\n        return;\n      }\n      this.context.emails = emails;\n      this.context.newListName = name;\n      this._buttonText = this.continueButton.text();\n      this.continueButton.addClass('disabled').text('Please wait...');\n      this.textarea.add(this.listName).attr('disabled', true);\n      return model.newList(name, emails).done(this.onNewListCreated).fail(this.onNewListFailed);\n    };\n\n    NewListStep.prototype.onNewListCreated = function(list) {\n\n      /*\n      Handle the result of a new list\n       */\n      this.context.newListName = null;\n      this.context.emails = null;\n      this.context.selectedList = list;\n      return this.wizard.goTo('beforeSend');\n    };\n\n    NewListStep.prototype.onNewListFailed = function(err) {\n\n      /*\n      We need to show the error box, and allow a way to call with force if relevant\n       */\n\n      /*\n      This is called when the validation check itself has failed.\n       */\n      var msg;\n      if (err.validationError) {\n        this.context.updateValidation(err);\n        return this.wizard.goTo('listEmailErrors');\n      } else {\n\n        /*\n        Show an error to the user\n         */\n        msg = err.message || 'Something went wrong. :-/ \\n Please try again!';\n        this.continueButton.removeClass('disabled').text(this._buttonText);\n        this.textarea.removeAttr('disabled');\n        return alert(msg);\n      }\n    };\n\n    return NewListStep;\n\n  })(sv.WizardStepView);\n  return {\n    NewListStep: NewListStep\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/steps/QuickSendStep', function(require) {\n  var QuickSendStep, model, sv;\n  sv = require('fire/ui/views/WizardStepView');\n  model = require('author/ui/email/model');\n\n  /*\n  The address entry step\n   */\n  QuickSendStep = (function(superClass) {\n    extend(QuickSendStep, superClass);\n\n    function QuickSendStep() {\n      this.onValidateEmailsFailed = bind(this.onValidateEmailsFailed, this);\n      this.onValidateEmailsCompleted = bind(this.onValidateEmailsCompleted, this);\n      this.toggleContinueButton = bind(this.toggleContinueButton, this);\n      return QuickSendStep.__super__.constructor.apply(this, arguments);\n    }\n\n    QuickSendStep.prototype.templateSelector = '#newsletter-wizard-quick-send-step';\n\n    QuickSendStep.prototype.cssClass = 'quick-send-step';\n\n    QuickSendStep.prototype.events = {\n      'click .continue-button': 'onContinueButtonClicked'\n    };\n\n    QuickSendStep.prototype.render = function() {\n\n      /*\n      We want to setup some events here\n       */\n      this.continueButton = this.find('.continue-button');\n      this.textarea = this.find('textarea').on('textchange', this.toggleContinueButton);\n      this.textarea.val(this.context.emails || '');\n      if (!$.browser.msie) {\n        setTimeout((function(_this) {\n          return function() {\n            return _this.textarea.focus();\n          };\n        })(this), 100);\n      }\n      return this.toggleContinueButton();\n    };\n\n    QuickSendStep.prototype.toggleContinueButton = function() {\n      var val;\n      val = $.trim(this.textarea.val());\n      return this.continueButton.toggleClass('disabled', !val);\n    };\n\n    QuickSendStep.prototype.onContinueButtonClicked = function(e) {\n\n      /*\n      Handles clicking on the continue button\n       */\n      var emails;\n      if (this.continueButton.hasClass('disabled')) {\n        return;\n      }\n      emails = $.trim(this.textarea.val());\n      if (!emails) {\n        return;\n      }\n      this.context.emails = emails;\n      this.continueButton.addClass('disabled').text('Please wait...');\n      this.textarea.attr('disabled', true);\n      return model.validate(emails).done(this.onValidateEmailsCompleted).fail(this.onValidateEmailsFailed);\n    };\n\n    QuickSendStep.prototype.onValidateEmailsCompleted = function(result) {\n\n      /*\n      This is called when the request is completed\n      \n      @param {Object} results   a result object which contains the number of valid emails\n                                and a list of the invalid ones\n       */\n      this.context.updateValidation(result);\n      if (this.context.hasInvalidEmails()) {\n        return this.wizard.goTo('emailErrors');\n      } else {\n        return this.wizard.goTo('beforeSend');\n      }\n    };\n\n    QuickSendStep.prototype.onValidateEmailsFailed = function(err) {\n\n      /*\n      This is called when the validation check itself has failed.\n       */\n      this.continueButton.removeClass('disabled').text('Continue');\n      this.textarea.removeAttr('disabled');\n      return alert('Something went wrong. :-/ \\n Please try again!');\n    };\n\n    return QuickSendStep;\n\n  })(sv.WizardStepView);\n  return {\n    QuickSendStep: QuickSendStep\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/steps/SendStatusStep', function(require) {\n  var SendStatusStep, model, sv;\n  sv = require('fire/ui/views/WizardStepView');\n  model = require('author/ui/email/model');\n\n  /*\n  The address entry step\n   */\n  SendStatusStep = (function(superClass) {\n    extend(SendStatusStep, superClass);\n\n    function SendStatusStep() {\n      return SendStatusStep.__super__.constructor.apply(this, arguments);\n    }\n\n    SendStatusStep.prototype.templateSelector = '#newsletter-wizard-send-status-step';\n\n    SendStatusStep.prototype.cssClass = 'send-status-step';\n\n    SendStatusStep.prototype.events = {\n      'click .go-back': 'onGoBackClicked'\n    };\n\n    SendStatusStep.prototype.render = function() {\n      return this.init();\n    };\n\n    SendStatusStep.prototype.init = function() {\n      return this._send().done((function(_this) {\n        return function(result) {\n          return _this.onSendingCompleted(result);\n        };\n      })(this)).fail((function(_this) {\n        return function(errorMsg, error) {\n          return _this.onSendingFailed(error);\n        };\n      })(this));\n    };\n\n    SendStatusStep.prototype._send = function() {\n      var config, ctx;\n      ctx = this.wizard.context;\n      config = ctx.toEmailConfig();\n      if (ctx.isQuickSend()) {\n        return model.sendQuickList(ctx.emails, config, ctx.saveToList);\n      } else {\n        return model.sendList(this.context.selectedList.id, config);\n      }\n    };\n\n    SendStatusStep.prototype.onSendingCompleted = function(result) {\n\n      /*\n       */\n      this.showSection('.sending-completion');\n      ga(\"send\", \"pageview\", \"/app/newsletters/send_completed\");\n      return this.wizard.context.resultPromise.resolve(result);\n    };\n\n    SendStatusStep.prototype.onSendingFailed = function(error) {\n\n      /*\n       */\n      if (error.code === 'sender_blocked') {\n        this.showSection('.sending-failed.blocked');\n        this.find('.wrapper').addClass('very-big');\n        return this.find('.content').addClass('blocked');\n      } else {\n        this.showSection('.sending-failed.error');\n        if (error.message) {\n          this.find('.wrapper').addClass('big');\n          return this.find('.sending-failed.error p.err').show().text(error.message);\n        }\n      }\n    };\n\n    SendStatusStep.prototype.showSection = function(selector) {\n      return this.find(selector).show().siblings().hide();\n    };\n\n    SendStatusStep.prototype.onGoBackClicked = function() {\n      return this.wizard.back();\n    };\n\n    return SendStatusStep;\n\n  })(sv.WizardStepView);\n  return {\n    SendStatusStep: SendStatusStep\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/steps/WelcomeStep', function(require) {\n  var CREDITS_ENDPOINT, WelcomeStep, safe, sv;\n  sv = require('fire/ui/views/WizardStepView');\n  safe = require('fire/net/safe');\n  CREDITS_ENDPOINT = '/app/newsletters/credits';\n\n  /*\n  The address entry step\n   */\n  WelcomeStep = (function(superClass) {\n    extend(WelcomeStep, superClass);\n\n    function WelcomeStep() {\n      return WelcomeStep.__super__.constructor.apply(this, arguments);\n    }\n\n    WelcomeStep.prototype.templateSelector = '#newsletter-wizard-welcome-step';\n\n    WelcomeStep.prototype.cssClass = 'welcome-step';\n\n    WelcomeStep.prototype.events = {\n      'click .quick-send': 'onQuickSendClicked',\n      'click .choose-list': 'onChooseListClicked',\n      'click .new-list': 'onNewListClicked'\n    };\n\n    WelcomeStep.prototype.render = function() {\n      this.context.reset();\n      if (this.usesOrgWideEmailCreditPool && !this.hasUnlimitedEmailCredits()) {\n        return this.loadLimitations();\n      }\n    };\n\n    WelcomeStep.prototype.hasUnlimitedEmailCredits = function() {\n      return this.find(\".has-unlimited-email-credits\").length > 0;\n    };\n\n    WelcomeStep.prototype.usesOrgWideEmailCreditPool = function() {\n      return this.find(\".uses-org-wide-email-credit-pool\").length > 0;\n    };\n\n    WelcomeStep.prototype.onChooseListClicked = function() {\n      return this.wizard.goTo('chooseList');\n    };\n\n    WelcomeStep.prototype.onQuickSendClicked = function() {\n      return this.wizard.goTo('quickSend');\n    };\n\n    WelcomeStep.prototype.onNewListClicked = function() {\n      return this.wizard.goTo('newList');\n    };\n\n    WelcomeStep.prototype.loadLimitations = function() {\n\n      /*\n      Load the credit information from the server\n       */\n      var targetEl;\n      targetEl = this.find('.limitation');\n      targetEl.empty().removeClass('error-loading').addClass('loading');\n      return safe.post(CREDITS_ENDPOINT).done(function(result) {\n        return targetEl.removeClass('loading').html(result);\n      }).fail(function(err) {\n        if (err.statusText) {\n          err = err.statusText;\n        }\n        return targetEl.removeClass('loading').addClass('error-loading').empty().append($('<p>').text(err));\n      });\n    };\n\n    return WelcomeStep;\n\n  })(sv.WizardStepView);\n  return {\n    WelcomeStep: WelcomeStep\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/steps/EmailErrorsStep', function(require) {\n  var EmailErrorsStep, safe, sv;\n  sv = require('fire/ui/views/WizardStepView');\n  safe = require('fire/net/safe');\n\n  /*\n  The address entry step\n   */\n  EmailErrorsStep = (function(superClass) {\n    extend(EmailErrorsStep, superClass);\n\n    function EmailErrorsStep() {\n      return EmailErrorsStep.__super__.constructor.apply(this, arguments);\n    }\n\n    EmailErrorsStep.prototype.templateSelector = '#newsletter-wizard-email-errors-step';\n\n    EmailErrorsStep.prototype.cssClass = 'email-errors-step';\n\n    EmailErrorsStep.prototype.events = {\n      'click .edit-button': 'onEditButtonClicked',\n      'click .continue-button': 'onContinueButtonClicked'\n    };\n\n    EmailErrorsStep.prototype.render = function() {\n      var i, invalidCount, listHtml, listItem, text;\n      invalidCount = this.context.invalidEmailsCount;\n      if (invalidCount === 1) {\n        text = \"1 email\";\n      } else {\n        text = invalidCount + \" emails\";\n      }\n      this.find('.invalid').text(text);\n      listItem = function(item) {\n        var name;\n        name = '';\n        if (item.name) {\n          name = '<span class=\"name\">' + (\"(\" + item.name + \")\") + '</span>';\n        }\n        return \"<li>\" + item.address + \" \" + name + \"</li>\";\n      };\n      listHtml = ((function() {\n        var j, len, ref, results;\n        ref = this.context.invalidRows;\n        results = [];\n        for (j = 0, len = ref.length; j < len; j++) {\n          i = ref[j];\n          results.push(listItem(i));\n        }\n        return results;\n      }).call(this)).join('');\n      this.find('.list-container > ul').append(listHtml);\n      if (!this.context.validEmailsCount) {\n        this.find('.continue-button').addClass('disabled');\n      }\n      return setTimeout((function(_this) {\n        return function() {\n          return _this.find('.edit-button').focus();\n        };\n      })(this), 100);\n    };\n\n    EmailErrorsStep.prototype.onEditButtonClicked = function() {\n\n      /*\n      Go back on click\n       */\n      return this.wizard.back();\n    };\n\n    EmailErrorsStep.prototype.onContinueButtonClicked = function(e) {\n\n      /*\n       */\n      var t;\n      t = $(e.currentTarget);\n      if (!t.hasClass('disabled')) {\n        return this.wizard.goTo('beforeSend');\n      }\n    };\n\n    return EmailErrorsStep;\n\n  })(sv.WizardStepView);\n  return {\n    EmailErrorsStep: EmailErrorsStep\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/steps/ListEmailErrorsStep', function(require) {\n  var EmailErrorsStep, ListEmailErrorsStep, model;\n  EmailErrorsStep = require('./EmailErrorsStep').EmailErrorsStep;\n  model = require('author/ui/email/model');\n\n  /*\n  The address entry step\n   */\n  ListEmailErrorsStep = (function(superClass) {\n    extend(ListEmailErrorsStep, superClass);\n\n    function ListEmailErrorsStep() {\n      this._showError = bind(this._showError, this);\n      this._onUpdateComplete = bind(this._onUpdateComplete, this);\n      this._onCreateComplete = bind(this._onCreateComplete, this);\n      return ListEmailErrorsStep.__super__.constructor.apply(this, arguments);\n    }\n\n    ListEmailErrorsStep.prototype.onContinueButtonClicked = function(e) {\n\n      /*\n       */\n      var ref, t;\n      t = $(e.currentTarget);\n      if (t.hasClass('disabled')) {\n        return false;\n      }\n      t.addClass('disalbed');\n      this._buttonText = t.text();\n      t.text('Please wait...');\n      if ((ref = this.context.selectedList) != null ? ref.id : void 0) {\n        return this._forceUpdateList();\n      } else {\n        return this._forceCreateList();\n      }\n    };\n\n    ListEmailErrorsStep.prototype._forceUpdateList = function() {\n\n      /*\n      Update the list with all the emails we have\n       */\n      return model.updateList(this.context.selectedList.id, this.context.emails, true).done(this._onUpdateComplete).fail(this._showError);\n    };\n\n    ListEmailErrorsStep.prototype._forceCreateList = function() {\n\n      /*\n      Update the list with all the emails we have\n       */\n      return model.newList(this.context.newListName, this.context.emails, true).done(this._onCreateComplete).fail(this._showError);\n    };\n\n    ListEmailErrorsStep.prototype._onCreateComplete = function(list) {\n      this.context.newListName = null;\n      this.context.emails = null;\n      this.context.selectedList = list;\n      return this.wizard.goTo('beforeSend');\n    };\n\n    ListEmailErrorsStep.prototype._onUpdateComplete = function() {\n      this.context.emails = null;\n      return this.wizard.goTo('beforeSend');\n    };\n\n    ListEmailErrorsStep.prototype._showError = function(err) {\n      var msg;\n      this.find('.continue-button').removeClass('disabled').text(this._buttonText);\n      msg = (err != null ? err.message : void 0) || 'Something went wrong. :-/ \\n Please try again!';\n      return alert(msg);\n    };\n\n    return ListEmailErrorsStep;\n\n  })(EmailErrorsStep);\n  return {\n    ListEmailErrorsStep: ListEmailErrorsStep\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/NewsletterWizardView', function(require) {\n  var BeforeSendStep, ChooseListStep, Context, EditListStep, EmailErrorsStep, ImportStep, ListEmailErrorsStep, NewListStep, NewsletterWizardView, QuickSendStep, SendStatusStep, WelcomeStep, safe, wv;\n  wv = require('fire/ui/views/WizardView');\n  safe = require('fire/net/safe');\n  BeforeSendStep = require('./steps/BeforeSendStep').BeforeSendStep;\n  ChooseListStep = require('./steps/ChooseListStep').ChooseListStep;\n  EditListStep = require('./steps/EditListStep').EditListStep;\n  ImportStep = require('./steps/ImportStep').ImportStep;\n  NewListStep = require('./steps/NewListStep').NewListStep;\n  QuickSendStep = require('./steps/QuickSendStep').QuickSendStep;\n  SendStatusStep = require('./steps/SendStatusStep').SendStatusStep;\n  WelcomeStep = require('./steps/WelcomeStep').WelcomeStep;\n  EmailErrorsStep = require('./steps/EmailErrorsStep').EmailErrorsStep;\n  ListEmailErrorsStep = require('./steps/ListEmailErrorsStep').ListEmailErrorsStep;\n  NewsletterWizardView = (function(superClass) {\n    extend(NewsletterWizardView, superClass);\n\n    function NewsletterWizardView() {\n      return NewsletterWizardView.__super__.constructor.apply(this, arguments);\n    }\n\n    NewsletterWizardView.prototype.steps = {\n      beforeSend: BeforeSendStep,\n      chooseList: ChooseListStep,\n      editList: EditListStep,\n      newList: NewListStep,\n      importStep: ImportStep,\n      quickSend: QuickSendStep,\n      sendStatus: SendStatusStep,\n      welcome: WelcomeStep,\n      emailErrors: EmailErrorsStep,\n      listEmailErrors: ListEmailErrorsStep\n    };\n\n    NewsletterWizardView.prototype.enableHistory = true;\n\n    return NewsletterWizardView;\n\n  })(wv.WizardView);\n  Context = (function() {\n\n    /*\n    Handles the context for the email wizard\n     */\n    function Context() {\n      this.reset();\n    }\n\n    Context.prototype.reset = function() {\n      this.pageId = window.pageId;\n      this.subject = $('#meta_title').attr('content');\n      this.note = null;\n      this.fromName = null;\n      this.fromAddress = null;\n      this.selectedList = null;\n      this.emails = null;\n      this.newListName = null;\n      this.validEmailsCount = 0;\n      this.invalidEmailsCount = 0;\n      this.invalidRows = null;\n      this.saveToList = true;\n      this.importPreview = null;\n      return this.importFileError = null;\n    };\n\n    Context.prototype.isQuickSend = function() {\n\n      /*\n      Check if the current wizard is in quick send mode\n       */\n      return this.selectedList === null;\n    };\n\n    Context.prototype.toEmailConfig = function() {\n\n      /*\n      Convert the context object to a \"Server Info\" object for sending to the server\n       */\n      return {\n        page_id: this.pageId,\n        subject: this.subject,\n        personal_message: this.note,\n        from_name: this.fromName,\n        from_email: this.fromAddress\n      };\n    };\n\n    Context.prototype.updateValidation = function(r) {\n      this.invalidEmailsCount = r.invalidCount;\n      this.invalidRows = r.invalidRows;\n      return this.validEmailsCount = r.validCount;\n    };\n\n    Context.prototype.hasInvalidEmails = function() {\n      return this.invalidEmailsCount > 0;\n    };\n\n    return Context;\n\n  })();\n  return {\n    NewsletterWizardView: NewsletterWizardView,\n    Context: Context\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/modal', function(require) {\n  var MODAL_ENDPOINT, MODAL_OPTIONS, NewsletterModalView, init, mv, test, wizard;\n  mv = require('fire/ui/views/ModalView');\n  wizard = require('author/ui/email/NewsletterWizardView');\n  test = require('author/ui/email/test');\n  MODAL_ENDPOINT = '/app/newsletters/modal/';\n  MODAL_OPTIONS = {\n    cssClass: 'base-modal newsletter-modal',\n    width: 600,\n    overlayClose: false\n  };\n\n  /*\n  Main Email modal view\n   */\n  NewsletterModalView = (function(superClass) {\n    extend(NewsletterModalView, superClass);\n\n    function NewsletterModalView(flyerId, options) {\n      NewsletterModalView.__super__.constructor.call(this, MODAL_ENDPOINT + flyerId, options);\n    }\n\n    NewsletterModalView.prototype.events = {\n      'click .test-email': 'onTestButtonClicked'\n    };\n\n    NewsletterModalView.prototype.enableHistory = true;\n\n    NewsletterModalView.prototype.render = function() {\n\n      /*\n        Handle the rendering of the email modal after it was created\n       */\n      var context, defaultFirstStep, firstStep, wizardContainer;\n      wizardContainer = this.find('.wizard-container');\n      if (wizardContainer.length === 0) {\n        return;\n      }\n      context = new wizard.Context();\n      defaultFirstStep = 'welcome';\n      firstStep = this.firstStep || defaultFirstStep;\n      context.firstStep = firstStep;\n      this.wizard = new wizard.NewsletterWizardView({\n        el: wizardContainer,\n        context: context,\n        enableHistory: true\n      }, firstStep);\n      return this.testEmailPopover = new test.TestEmailPopover(this.wizard);\n    };\n\n    NewsletterModalView.prototype.onTestButtonClicked = function(e) {\n      var t;\n      t = $(e.currentTarget);\n      return this.testEmailPopover.show(t);\n    };\n\n    return NewsletterModalView;\n\n  })(mv.ModalView);\n  init = function() {\n\n    /*\n      Register the event for showing the modal\n     */\n    var modal;\n    modal = new NewsletterModalView(window.pageId);\n    return $('#email-flyer-button').click(function(e) {\n      return modal.show(MODAL_OPTIONS);\n    });\n  };\n  return {\n    init: init\n  };\n});\n", "/***\r\n * @fileOverview\r\n * Initialize clipboard support for page url\r\n */\r\n\r\ndefine('author/ui/clipboard', function (require) {\r\n\r\n\r\n    function init() {\r\n        var clip = new ZeroClipboard.Client();\r\n        clip.setHandCursor(true);\r\n\r\n        var cb = $('#copy-button');\r\n        cb.tipsy({trigger: 'manual', fade: true});\r\n\r\n        clip.addEventListener('load', function (client) {\r\n        });\r\n\r\n        clip.addEventListener('mouseOver', function (client) {\r\n            cb.tipsy('show');\r\n        });\r\n\r\n        clip.addEventListener('mouseOut', function (client) {\r\n            cb.tipsy('hide');\r\n        });\r\n\r\n\r\n        clip.addEventListener('complete', function (client, text) {\r\n            var org = cb.attr('original-title');\r\n            cb.tipsy('hide');\r\n            cb.attr('title', 'Copied!');\r\n            cb.tipsy('show');\r\n            cb.attr('title', org);\r\n            // after completion, focus on the body to prevent flash from grabbing input like the asshole it is.\r\n\r\n            $('#url-container').focus();\r\n        });\r\n\r\n        clip.glue('copy-button', document.body);\r\n\r\n        clip.setText(cb.data('content'));\r\n    }\r\n\r\n\r\n    return {\r\n        init: init\r\n    }\r\n});", "// Generated by CoffeeScript 1.12.7\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/print', function(require) {\n\n  /*\n  Print popup ui\n   */\n  var Events, PrintPopoverView, _id, _short, popup, pv, report, safe;\n  pv = require('fire/ui/views/PopoverView');\n  popup = require('fire/net/popup');\n  safe = require('fire/net/safe');\n  _short = $('#smore_short_key').attr('value');\n  _id = 0;\n  report = smore.report;\n  Events = {\n    print_open_popover: 'PRINT: Open popover',\n    print_clicked_print: 'PRINT: Clicked on print',\n    print_cancel_generation: 'PRINT: Cancel generation',\n    print_error_on_generation: 'PRINT: Error on generation',\n    print_downloaded_jpg: 'PRINT: Downloaded jpg',\n    print_success: 'PRINT: print success'\n  };\n  PrintPopoverView = (function(superClass) {\n    var DOWNLOAD_JPG_ENDPOINT, DOWNLOAD_JPG_IFRAME_ENDPOINT, MAX_PAGE_HEIGHT, MAX_PAGE_HEIGHT_ERROR, PLEASE_WAIT_POPUP_ENDPOINT, POPOUP_WIDTH, POPUP_HEIGHT, PRINTING_MASK_HTML, PRINT_ENDPOINT;\n\n    extend(PrintPopoverView, superClass);\n\n    function PrintPopoverView() {\n      return PrintPopoverView.__super__.constructor.apply(this, arguments);\n    }\n\n    PLEASE_WAIT_POPUP_ENDPOINT = '/app/export/please_wait_popup';\n\n    POPOUP_WIDTH = 300;\n\n    POPUP_HEIGHT = 130;\n\n    PRINT_ENDPOINT = '/app/export/print_flyer';\n\n    PRINTING_MASK_HTML = 'Please wait...<br/><a class=\"gray-button cancel-print\" style=\"font-size:12px;margin-top:30px;line-height:14px;\">Cancel</a>';\n\n    DOWNLOAD_JPG_ENDPOINT = '/app/export/download_flyer';\n\n    DOWNLOAD_JPG_IFRAME_ENDPOINT = '/app/export/download_exported_content';\n\n    MAX_PAGE_HEIGHT = 16000;\n\n    MAX_PAGE_HEIGHT_ERROR = 'This flyer is too long to print :/';\n\n    PrintPopoverView.prototype.templateSelector = '#print-popover-template';\n\n    PrintPopoverView.prototype.events = {\n      'click .print-button': 'onPrintButtonClicked',\n      'click .download-jpg-button': 'onDownloadJpgClicked'\n    };\n\n    PrintPopoverView.prototype.render = function() {\n      var id;\n      PrintPopoverView.__super__.render.apply(this, arguments);\n      this.buttons = this.find('.print-button, .download-jpg-button');\n      this.label = this.find('label.show-branding');\n      this.checkbox = this.label.find('input.show-branding');\n      this.highQuality = this.find('input.high-quality');\n      id = \"show_branding-\" + (++_id);\n      this.label.attr('for', id);\n      this.checkbox.attr('id', id);\n      this.testPageLength();\n      return this.find('#high-quality-tooltip-trigger').attr('title', $('#high-quality-tooltip-content').html()).tipsy({\n        html: true,\n        opacity: 0.9,\n        fade: true\n      });\n    };\n\n    PrintPopoverView.prototype.afterShow = function() {\n\n      /*\n      Report events after showing the modal\n       */\n      return report.track(Events.print_open_popover);\n    };\n\n    PrintPopoverView.prototype.setup = function() {\n      PrintPopoverView.__super__.setup.apply(this, arguments);\n      return this.wrap.delegate('.cancel-print', 'click', (function(_this) {\n        return function(e) {\n          return _this.onCancelPrint(e);\n        };\n      })(this));\n    };\n\n    PrintPopoverView.prototype.disable = function() {\n      this.printing = true;\n      return this.mask(PRINTING_MASK_HTML);\n    };\n\n    PrintPopoverView.prototype.enable = function() {\n      this.printing = false;\n      return this.unmask();\n    };\n\n    PrintPopoverView.prototype.testPageLength = function() {\n\n      /*\n      Test if our page is too long\n       */\n      if ($('.display-page').height() > MAX_PAGE_HEIGHT) {\n        this.buttons.addClass('disabled');\n        return this.showError(MAX_PAGE_HEIGHT_ERROR);\n      }\n    };\n\n    PrintPopoverView.prototype.onPrintButtonClicked = function(e) {\n      var t;\n      t = $(e.currentTarget);\n      if (t.hasClass('disabled')) {\n        return;\n      }\n      this.find('.error-box').hide();\n      this.disable();\n      this.startPrintFlyer();\n      return report.track(Events.print_clicked_print);\n    };\n\n    PrintPopoverView.prototype.onDownloadJpgClicked = function(e) {\n      var dfd, t;\n      t = $(e.currentTarget);\n      if (t.hasClass('disabled')) {\n        return;\n      }\n      if (t.data('locked')) {\n        window.open(t.data('upgrade-url'));\n        return;\n      }\n      this.disable();\n      this.download = dfd = safe.post(DOWNLOAD_JPG_ENDPOINT + '/' + _short, {\n        show_branding: this.showBrandingValue(),\n        high_quality: this.highQualityValue()\n      });\n      return dfd.done((function(_this) {\n        return function(r) {\n          return _this.onDownloadCompleted(r);\n        };\n      })(this)).fail((function(_this) {\n        return function(msg, data) {\n          return _this.onPrintFailed(msg, data);\n        };\n      })(this));\n    };\n\n    PrintPopoverView.prototype.startPrintFlyer = function() {\n      var dfd, target;\n      target = this.generateTarget();\n      dfd = safe.callbackForm(PRINT_ENDPOINT + '/' + _short, {\n        show_branding: this.showBrandingValue(),\n        high_quality: this.highQualityValue()\n      }, target);\n      return dfd.done((function(_this) {\n        return function(r) {\n          return _this.onPrintCompleted(r);\n        };\n      })(this)).fail((function(_this) {\n        return function(msg, data) {\n          return _this.onPrintFailed(msg, data);\n        };\n      })(this));\n    };\n\n    PrintPopoverView.prototype.showBrandingValue = function() {\n      if (this.checkbox.is(':checked')) {\n        return 'true';\n      } else {\n\n      }\n      return 'false';\n    };\n\n    PrintPopoverView.prototype.highQualityValue = function() {\n      if (this.highQuality.is(':checked')) {\n        return 'true';\n      } else {\n        return 'false';\n      }\n    };\n\n    PrintPopoverView.prototype.generateTarget = function() {\n\n      /*\n      Generates an iframe (or a popover if we're on ie) and return it's name\n       */\n      var targetName;\n      targetName = \"print_flyer_frame\";\n      if ($.browser.msie) {\n        this.popup = popup.openPopup(PLEASE_WAIT_POPUP_ENDPOINT, POPOUP_WIDTH, POPUP_HEIGHT, ((function(_this) {\n          return function() {\n            return _this.onPopupClosed();\n          };\n        })(this)), targetName);\n      } else {\n        this.iframe = $('<iframe/>').attr({\n          'width': 1,\n          'height': 1,\n          name: targetName\n        }).css('visibility', 'hidden');\n        $(document.body).append(this.iframe);\n      }\n      return targetName;\n    };\n\n    PrintPopoverView.prototype.onCancelPrint = function() {\n      this.cleanup();\n      this.enable();\n      return report.track(Events.print_cancel_generation);\n    };\n\n    PrintPopoverView.prototype.onPopupClosed = function() {\n      return this.enable();\n    };\n\n    PrintPopoverView.prototype.onPrintCompleted = function(r) {\n      this.cleanup();\n      this.enable();\n      return report.track(Events.print_success);\n    };\n\n    PrintPopoverView.prototype.onDownloadCompleted = function(r) {\n      this.cleanup();\n      this.enable();\n      report.track(Events.print_downloaded_jpg);\n      return safe.iframe(DOWNLOAD_JPG_IFRAME_ENDPOINT, {\n        url: r,\n        flyer_id: window.pageId\n      });\n    };\n\n    PrintPopoverView.prototype.onPrintFailed = function(msg) {\n      this.cleanup();\n      this.enable();\n      this.showError(msg);\n      return report.track(Events.print_error_on_generation);\n    };\n\n    PrintPopoverView.prototype.cleanup = function() {\n      if (this.popup) {\n        this.popup.close();\n      }\n      if (this.download) {\n        this.download.abort();\n      }\n      if (this.iframe) {\n        return this.iframe.remove();\n      }\n    };\n\n    PrintPopoverView.prototype.showError = function(msg) {\n      return this.find('.error-box').show().find('.error-message').text(msg);\n    };\n\n    PrintPopoverView.prototype.onClose = function() {\n      if (this.printing) {\n        return false;\n      }\n      return true;\n    };\n\n    return PrintPopoverView;\n\n  })(pv.PopoverView);\n  return {\n    PrintPopoverView: PrintPopoverView\n  };\n});\n", "// Generated by CoffeeScript 1.12.7\n\n/*\n *  Add Email To Profile Popover\n *  ============================\n *\n *  This is a warning popover that is shown if the user doesn't have\n *  email defined in their profile\n *\n */\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('author/ui/email/addEmailToProfile', function(require) {\n  var AddEmailToProfile, pv;\n  pv = require('fire/ui/views/PopoverView');\n  AddEmailToProfile = (function(superClass) {\n    extend(AddEmailToProfile, superClass);\n\n    function AddEmailToProfile() {\n      return AddEmailToProfile.__super__.constructor.apply(this, arguments);\n    }\n\n    AddEmailToProfile.prototype.templateSelector = '#add-email-to-profile-popover';\n\n    return AddEmailToProfile;\n\n  })(pv.PopoverView);\n  return {\n    AddEmailToProfile: AddEmailToProfile\n  };\n});\n", "/*\n * fingerprintJS 0.5.4 - Fast browser fingerprint library\n * https://github.com/Valve/fingerprintjs\n * Copyright (c) 2013 Valentin Vasilyev (valentin.vasilyev@outlook.com)\n * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Replaced the original Murmur3 32bit hash with 128bit\n * See:\n *  https://github.com/yelled3/fingerprintjs\n *  https://github.com/Valve/fingerprintjs/pull/31\n */\n\n\ndefine(\"lib/fingerprint\", function (require) {\n    'use strict';\n\n    var Fingerprint = function (options) {\n        var nativeForEach, nativeMap;\n        nativeForEach = Array.prototype.forEach;\n        nativeMap = Array.prototype.map;\n\n        this.each = function (obj, iterator, context) {\n            if (obj === null) {\n                return;\n            }\n            if (nativeForEach && obj.forEach === nativeForEach) {\n                obj.forEach(iterator, context);\n            } else if (obj.length === +obj.length) {\n                for (var i = 0, l = obj.length; i < l; i++) {\n                    if (iterator.call(context, obj[i], i, obj) === {}) return;\n                }\n            } else {\n                for (var key in obj) {\n                    if (obj.hasOwnProperty(key)) {\n                        if (iterator.call(context, obj[key], key, obj) === {}) return;\n                    }\n                }\n            }\n        };\n\n        this.map = function (obj, iterator, context) {\n            var results = [];\n            // Not using strict equality so that this acts as a\n            // shortcut to checking for `null` and `undefined`.\n            if (obj == null) return results;\n            if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\n            this.each(obj, function (value, index, list) {\n                results[results.length] = iterator.call(context, value, index, list);\n            });\n            return results;\n        };\n\n        if (typeof options == 'object') {\n            this.hasher = options.hasher;\n            this.screen_resolution = options.screen_resolution;\n            this.screen_orientation = options.screen_orientation;\n            this.canvas = options.canvas;\n            this.ie_activex = options.ie_activex;\n        } else if (typeof options == 'function') {\n            this.hasher = options;\n        }\n    };\n\n    Fingerprint.prototype = {\n        get: function () {\n            var keys = [];\n            keys.push(navigator.userAgent);\n            keys.push(navigator.language);\n            keys.push(screen.colorDepth);\n            if (this.screen_resolution) {\n                var resolution = this.getScreenResolution();\n                if (typeof resolution !== 'undefined') { // headless browsers, such as phantomjs\n                    keys.push(this.getScreenResolution().join('x'));\n                }\n            }\n            keys.push(new Date().getTimezoneOffset());\n            keys.push(this.hasSessionStorage());\n            keys.push(this.hasLocalStorage());\n            keys.push(!!window.indexedDB);\n            //body might not be defined at this point or removed programmatically\n            if (document.body) {\n                keys.push(typeof(document.body.addBehavior));\n            } else {\n                keys.push(typeof undefined);\n            }\n            keys.push(typeof(window.openDatabase));\n            keys.push(navigator.cpuClass);\n            keys.push(navigator.platform);\n            keys.push(navigator.doNotTrack);\n            keys.push(this.getPluginsString());\n            if (this.canvas && this.isCanvasSupported()) {\n                keys.push(this.getCanvasFingerprint());\n            }\n            if (this.hasher) {\n                return this.hasher(keys.join('~~~'), 31);\n            } else {\n                return this.x64hash128(keys.join(\"~~~\"), 31);\n            }\n        },\n\n\n        /// MurmurHash3 related functions\n\n        //\n        // Given two 64bit ints (as an array of two 32bit ints) returns the two\n        // added together as a 64bit int (as an array of two 32bit ints).\n        //\n        x64Add: function (m, n) {\n            m = [m[0] >>> 16, m[0] & 0xffff, m[1] >>> 16, m[1] & 0xffff];\n            n = [n[0] >>> 16, n[0] & 0xffff, n[1] >>> 16, n[1] & 0xffff];\n            var o = [0, 0, 0, 0];\n            o[3] += m[3] + n[3];\n            o[2] += o[3] >>> 16;\n            o[3] &= 0xffff;\n            o[2] += m[2] + n[2];\n            o[1] += o[2] >>> 16;\n            o[2] &= 0xffff;\n            o[1] += m[1] + n[1];\n            o[0] += o[1] >>> 16;\n            o[1] &= 0xffff;\n            o[0] += m[0] + n[0];\n            o[0] &= 0xffff;\n            return [(o[0] << 16) | o[1], (o[2] << 16) | o[3]];\n        },\n\n        //\n        // Given two 64bit ints (as an array of two 32bit ints) returns the two\n        // multiplied together as a 64bit int (as an array of two 32bit ints).\n        //\n        x64Multiply: function (m, n) {\n            m = [m[0] >>> 16, m[0] & 0xffff, m[1] >>> 16, m[1] & 0xffff];\n            n = [n[0] >>> 16, n[0] & 0xffff, n[1] >>> 16, n[1] & 0xffff];\n            var o = [0, 0, 0, 0];\n            o[3] += m[3] * n[3];\n            o[2] += o[3] >>> 16;\n            o[3] &= 0xffff;\n            o[2] += m[2] * n[3];\n            o[1] += o[2] >>> 16;\n            o[2] &= 0xffff;\n            o[2] += m[3] * n[2];\n            o[1] += o[2] >>> 16;\n            o[2] &= 0xffff;\n            o[1] += m[1] * n[3];\n            o[0] += o[1] >>> 16;\n            o[1] &= 0xffff;\n            o[1] += m[2] * n[2];\n            o[0] += o[1] >>> 16;\n            o[1] &= 0xffff;\n            o[1] += m[3] * n[1];\n            o[0] += o[1] >>> 16;\n            o[1] &= 0xffff;\n            o[0] += (m[0] * n[3]) + (m[1] * n[2]) + (m[2] * n[1]) + (m[3] * n[0]);\n            o[0] &= 0xffff;\n            return [(o[0] << 16) | o[1], (o[2] << 16) | o[3]];\n        },\n        //\n        // Given a 64bit int (as an array of two 32bit ints) and an int\n        // representing a number of bit positions, returns the 64bit int (as an\n        // array of two 32bit ints) rotated left by that number of positions.\n        //\n        x64Rotl: function (m, n) {\n            n %= 64;\n            if (n === 32) {\n                return [m[1], m[0]];\n            }\n            else if (n < 32) {\n                return [(m[0] << n) | (m[1] >>> (32 - n)), (m[1] << n) | (m[0] >>> (32 - n))];\n            }\n            else {\n                n -= 32;\n                return [(m[1] << n) | (m[0] >>> (32 - n)), (m[0] << n) | (m[1] >>> (32 - n))];\n            }\n        },\n        //\n        // Given a 64bit int (as an array of two 32bit ints) and an int\n        // representing a number of bit positions, returns the 64bit int (as an\n        // array of two 32bit ints) shifted left by that number of positions.\n        //\n        x64LeftShift: function (m, n) {\n            n %= 64;\n            if (n === 0) {\n                return m;\n            }\n            else if (n < 32) {\n                return [(m[0] << n) | (m[1] >>> (32 - n)), m[1] << n];\n            }\n            else {\n                return [m[1] << (n - 32), 0];\n            }\n        },\n        //\n        // Given two 64bit ints (as an array of two 32bit ints) returns the two\n        // xored together as a 64bit int (as an array of two 32bit ints).\n        //\n        x64Xor: function (m, n) {\n            return [m[0] ^ n[0], m[1] ^ n[1]];\n        },\n        //\n        // Given a block, returns murmurHash3's final x64 mix of that block.\n        // (`[0, h[0] >>> 1]` is a 33 bit unsigned right shift. This is the\n        // only place where we need to right shift 64bit ints.)\n        //\n        x64Fmix: function (h) {\n            h = this.x64Xor(h, [0, h[0] >>> 1]);\n            h = this.x64Multiply(h, [0xff51afd7, 0xed558ccd]);\n            h = this.x64Xor(h, [0, h[0] >>> 1]);\n            h = this.x64Multiply(h, [0xc4ceb9fe, 0x1a85ec53]);\n            h = this.x64Xor(h, [0, h[0] >>> 1]);\n            return h;\n        },\n\n        //\n        // Given a string and an optional seed as an int, returns a 128 bit\n        // hash using the x64 flavor of MurmurHash3, as an unsigned hex.\n        //\n        x64hash128: function (key, seed) {\n            key = key || \"\";\n            seed = seed || 0;\n            var remainder = key.length % 16;\n            var bytes = key.length - remainder;\n            var h1 = [0, seed];\n            var h2 = [0, seed];\n            var k1 = [0, 0];\n            var k2 = [0, 0];\n            var c1 = [0x87c37b91, 0x114253d5];\n            var c2 = [0x4cf5ad43, 0x2745937f];\n            for (var i = 0; i < bytes; i = i + 16) {\n                k1 = [((key.charCodeAt(i + 4) & 0xff)) | ((key.charCodeAt(i + 5) & 0xff) << 8) | ((key.charCodeAt(i + 6) & 0xff) << 16) | ((key.charCodeAt(i + 7) & 0xff) << 24), ((key.charCodeAt(i) & 0xff)) | ((key.charCodeAt(i + 1) & 0xff) << 8) | ((key.charCodeAt(i + 2) & 0xff) << 16) | ((key.charCodeAt(i + 3) & 0xff) << 24)];\n                k2 = [((key.charCodeAt(i + 12) & 0xff)) | ((key.charCodeAt(i + 13) & 0xff) << 8) | ((key.charCodeAt(i + 14) & 0xff) << 16) | ((key.charCodeAt(i + 15) & 0xff) << 24), ((key.charCodeAt(i + 8) & 0xff)) | ((key.charCodeAt(i + 9) & 0xff) << 8) | ((key.charCodeAt(i + 10) & 0xff) << 16) | ((key.charCodeAt(i + 11) & 0xff) << 24)];\n                k1 = this.x64Multiply(k1, c1);\n                k1 = this.x64Rotl(k1, 31);\n                k1 = this.x64Multiply(k1, c2);\n                h1 = this.x64Xor(h1, k1);\n                h1 = this.x64Rotl(h1, 27);\n                h1 = this.x64Add(h1, h2);\n                h1 = this.x64Add(this.x64Multiply(h1, [0, 5]), [0, 0x52dce729]);\n                k2 = this.x64Multiply(k2, c2);\n                k2 = this.x64Rotl(k2, 33);\n                k2 = this.x64Multiply(k2, c1);\n                h2 = this.x64Xor(h2, k2);\n                h2 = this.x64Rotl(h2, 31);\n                h2 = this.x64Add(h2, h1);\n                h2 = this.x64Add(this.x64Multiply(h2, [0, 5]), [0, 0x38495ab5]);\n            }\n            k1 = [0, 0];\n            k2 = [0, 0];\n            switch (remainder) {\n                case 15:\n                    k2 = this.x64Xor(k2, this.x64LeftShift([0, key.charCodeAt(i + 14)], 48));\n                case 14:\n                    k2 = this.x64Xor(k2, this.x64LeftShift([0, key.charCodeAt(i + 13)], 40));\n                case 13:\n                    k2 = this.x64Xor(k2, this.x64LeftShift([0, key.charCodeAt(i + 12)], 32));\n                case 12:\n                    k2 = this.x64Xor(k2, this.x64LeftShift([0, key.charCodeAt(i + 11)], 24));\n                case 11:\n                    k2 = this.x64Xor(k2, this.x64LeftShift([0, key.charCodeAt(i + 10)], 16));\n                case 10:\n                    k2 = this.x64Xor(k2, this.x64LeftShift([0, key.charCodeAt(i + 9)], 8));\n                case 9:\n                    k2 = this.x64Xor(k2, [0, key.charCodeAt(i + 8)]);\n                    k2 = this.x64Multiply(k2, c2);\n                    k2 = this.x64Rotl(k2, 33);\n                    k2 = this.x64Multiply(k2, c1);\n                    h2 = this.x64Xor(h2, k2);\n                case 8:\n                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 7)], 56));\n                case 7:\n                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 6)], 48));\n                case 6:\n                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 5)], 40));\n                case 5:\n                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 4)], 32));\n                case 4:\n                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 3)], 24));\n                case 3:\n                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 2)], 16));\n                case 2:\n                    k1 = this.x64Xor(k1, this.x64LeftShift([0, key.charCodeAt(i + 1)], 8));\n                case 1:\n                    k1 = this.x64Xor(k1, [0, key.charCodeAt(i)]);\n                    k1 = this.x64Multiply(k1, c1);\n                    k1 = this.x64Rotl(k1, 31);\n                    k1 = this.x64Multiply(k1, c2);\n                    h1 = this.x64Xor(h1, k1);\n            }\n            h1 = this.x64Xor(h1, [0, key.length]);\n            h2 = this.x64Xor(h2, [0, key.length]);\n            h1 = this.x64Add(h1, h2);\n            h2 = this.x64Add(h2, h1);\n            h1 = this.x64Fmix(h1);\n            h2 = this.x64Fmix(h2);\n            h1 = this.x64Add(h1, h2);\n            h2 = this.x64Add(h2, h1);\n            return (\"00000000\" + (h1[0] >>> 0).toString(16)).slice(-8) + (\"00000000\" + (h1[1] >>> 0).toString(16)).slice(-8) + (\"00000000\" + (h2[0] >>> 0).toString(16)).slice(-8) + (\"00000000\" + (h2[1] >>> 0).toString(16)).slice(-8);\n        },\n\n        // https://bugzilla.mozilla.org/show_bug.cgi?id=781447\n        hasLocalStorage: function () {\n            try {\n                return !!window.localStorage;\n            } catch (e) {\n                return true; // SecurityError when referencing it means it exists\n            }\n        },\n\n        hasSessionStorage: function () {\n            try {\n                return !!window.sessionStorage;\n            } catch (e) {\n                return true; // SecurityError when referencing it means it exists\n            }\n        },\n\n        isCanvasSupported: function () {\n            var elem = document.createElement('canvas');\n            return !!(elem.getContext && elem.getContext('2d'));\n        },\n\n        isIE: function () {\n            if (navigator.appName === 'Microsoft Internet Explorer') {\n                return true;\n            } else if (navigator.appName === 'Netscape' && /Trident/.test(navigator.userAgent)) {// IE 11\n                return true;\n            }\n            return false;\n        },\n\n        getPluginsString: function () {\n            if (this.isIE() && this.ie_activex) {\n                return this.getIEPluginsString();\n            } else {\n                return this.getRegularPluginsString();\n            }\n        },\n\n        getRegularPluginsString: function () {\n            return this.map(navigator.plugins, function (p) {\n                var mimeTypes = this.map(p, function (mt) {\n                    return [mt.type, mt.suffixes].join('~');\n                }).join(',');\n                return [p.name, p.description, mimeTypes].join('::');\n            }, this).join(';');\n        },\n\n        getIEPluginsString: function () {\n            if (window.ActiveXObject) {\n                var names = ['ShockwaveFlash.ShockwaveFlash',//flash plugin\n                    'AcroPDF.PDF', // Adobe PDF reader 7+\n                    'PDF.PdfCtrl', // Adobe PDF reader 6 and earlier, brrr\n                    'QuickTime.QuickTime', // QuickTime\n                    // 5 versions of real players\n                    'rmocx.RealPlayer G2 Control',\n                    'rmocx.RealPlayer G2 Control.1',\n                    'RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)',\n                    'RealVideo.RealVideo(tm) ActiveX Control (32-bit)',\n                    'RealPlayer',\n                    'SWCtl.SWCtl', // ShockWave player\n                    'WMPlayer.OCX', // Windows media player\n                    'AgControl.AgControl', // Silverlight\n                    'Skype.Detection'];\n\n                // starting to detect plugins in IE\n                return this.map(names, function (name) {\n                    try {\n                        new ActiveXObject(name);\n                        return name;\n                    } catch (e) {\n                        return null;\n                    }\n                }).join(';');\n            } else {\n                return \"\"; // behavior prior version 0.5.0, not breaking backwards compat.\n            }\n        },\n\n        getScreenResolution: function () {\n            var resolution;\n            if (this.screen_orientation) {\n                resolution = (screen.height > screen.width) ? [screen.height, screen.width] : [screen.width, screen.height];\n            } else {\n                resolution = [screen.height, screen.width];\n            }\n            return resolution;\n        },\n\n        getCanvasFingerprint: function () {\n            var canvas = document.createElement('canvas');\n            var ctx = canvas.getContext('2d');\n            // https://www.browserleaks.com/canvas#how-does-it-work\n            var txt = 'http://valve.github.io';\n            ctx.textBaseline = \"top\";\n            ctx.font = \"14px 'Arial'\";\n            ctx.textBaseline = \"alphabetic\";\n            ctx.fillStyle = \"#f60\";\n            ctx.fillRect(125, 1, 62, 20);\n            ctx.fillStyle = \"#069\";\n            ctx.fillText(txt, 2, 15);\n            ctx.fillStyle = \"rgba(102, 204, 0, 0.7)\";\n            ctx.fillText(txt, 4, 17);\n            return canvas.toDataURL();\n        }\n    };\n\n\n    return Fingerprint;\n\n});\n", "define('smore/util/fingerprint', function (require) {\n    /****\n     * A utility function that fingerprints a user and reports our server\n     *\n     */\n\n    var Fingerprint = require('lib/fingerprint');\n    var mobile = require('fire/util/mobile');\n    var token = require('smore/token');\n    var safe = require('fire/net/safe');\n    var REPORTING_ENDPOINT = '/app/users/info';// A special route that really goes to /app/reporting/fingerprint\n\n\n    function fingerprint() {\n        return new Fingerprint().get();\n    }\n\n\n    function report() {\n        // Update the token\n        safe.token(token);\n\n        // since mobile share of browsers is much more uniform,\n        // so fingerprinting should be used only as a supplementary identifying mechanism there.\n        if (mobile.isMobile()) {\n            return;\n        }\n\n        var fp = fingerprint();\n\n        // report\n        safe.post(REPORTING_ENDPOINT, {'fp': fp});\n    }\n\n    return {\n        fingerprint: fingerprint,\n        report: report\n    };\n});", "/* globals Backbone, _ */\n\ndefine(\"smore/ui/views/overlay\", function (require) {\n\n    /***\n     * OverlayView\n     * =========\n     *\n     * Draws an overlay on on the screen.\n     *\n     * This view is responsible for:\n     * - VIEW RESPONSIBILITIES\n     *\n     * Markup structure\n     * ----------------\n     * this.el -> div.smore-overlay   The root element\n     *\n     *\n     * Available option keys\n     * ----------------------\n     * - `clickCallback`    A function that will be called when someone clicks on the overlay\n     * - `type`             A type for the overlay, can be \"modal\" or \"popover\"\n     *\n     *\n     * Usage\n     * -----\n     *\n     * >>> var o = new OverlayView({clickCallback: myAwesomeFunction});\n     * >>> o.show();\n     * >>> o.hide();\n     *\n     *\n     *\n     *\n     * Events\n     * ------\n     *\n     * @class OverlayView\n     * @extends {Backbone.View}\n     * @constructor\n     */\n    var OverlayView = Backbone.View.extend({\n\n        className: 'smore-overlay',\n\n        events: {\n            'click': '_onOverlayClicked'\n        },\n\n\n        initialize: function (options) {\n            this.options = options || {};\n            this.closeOnClick = this.options.closeOnClick || false;\n            this.allowAccessToolbar = this.options.allowAccessToolbar || false;\n\n            this.type = this.options.type || 'modal';\n\n            this.scrollContainer = $('<div/>').addClass('smore-modal-scroll-wrapper')\n                .attr('id', 'modal-scroll-container');\n\n        },\n\n        /***\n         * Handles clicks on the overlay\n         *\n         * If clickCallback was defined, we will call it\n         *\n         * @param {jQuery.Event} e\n         * @private\n         */\n        _onOverlayClicked: function (e) {\n            var clickedOnOverlay = e.target === this.el || e.target === this.scrollContainer.get(0);\n\n            if (!clickedOnOverlay) {\n                return;\n            }\n\n            var cb = this.options.clickCallback;\n\n            // Invoke if this is a function;\n            if (_.isFunction(cb)) {\n                cb();\n            }\n\n            if (this.closeOnClick) {\n                this.hide();\n            }\n        },\n\n\n        /***\n         * Shows the overlay\n         */\n        show: function () {\n\n            // Render\n            this.render();\n            this.$el.addClass('smore-overlay-' + this.type);\n\n            if (this.allowAccessToolbar) {\n                this.$el.addClass('smore-overlay-bellow-toolbar');\n            }\n\n            if (this.type === 'modal' || this.type === 'modal-fixed') {\n                this.$el.append(this.scrollContainer);\n            }\n\n            // add our el\n            var container = this.getContainer();\n\n            if (this.type !== 'modal-fixed') {\n                this.$el.css('min-height', this.getMinHeight(container[0]));\n            }\n\n\n            container.prepend(this.el);\n\n            // Show and add class active for animation\n            this.$el.show().addClass('active');\n\n        },\n\n\n        hide: function () {\n            this.$el.removeClass('active');\n\n            var el = this.$el;\n\n            if (this.type === 'popover-transparent') {\n                el.remove();\n                this.trigger('close');\n            } else {\n                var self = this;\n                // Wait for transition to over\n                el.transitionEnd(function () {\n                    el.remove();\n                    self.trigger('close');\n                });\n            }\n        },\n\n        getContainer: function () {\n            var result = $('#modal-scroll-container');\n\n            if (result.length && this.type !== 'modal') {\n                return result;\n            }\n\n            return $('body');\n        },\n\n        /***\n         * Calculate the minimum height for the container\n         * @param container\n         */\n        getMinHeight: function (container) {\n            if (container.tagName === 'BODY') {\n                return Math.max(container.scrollHeight, window.innerHeight);\n            }\n\n            return container.scrollHeight;\n        }\n    });\n\n\n    return {\n        OverlayView: OverlayView\n    };\n\n});", "define('fire/ui/raf', function (require) {\n\n    /***\n     * raf.js\n     * ==========\n     *\n     * RequestAnimationFrame utilities and tools\n     *\n     * This module provides some tools for high performance rendering etc\n     *\n     * We also enable queuing of action for each animation frame for better performance\n     *\n     */\n\n\n    var _raf = window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||\n        window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;\n\n\n    // Are we in legacy mode?\n    var _isLegacy = !_raf;\n    var LEGACY_TIMEOUT = 20;\n\n    var _queue = [];\n\n\n    /***\n     * Queue a function to run on the next request animation frame\n     *\n     * You can provide a context for the function\n     *\n     * @param {Function} callback\n     * @param {Object=} context\n     */\n    function queue(callback, context) {\n        // Apply context\n        if (context) {\n            callback = $.proxy(callback, context);\n        }\n\n        // Add to the queue\n        _queue.push(callback);\n\n        if (_isLegacy) {\n            window.setTimeout(executeQueue, LEGACY_TIMEOUT);\n        } else {\n            _raf(executeQueue);\n        }\n    }\n\n    var _runningQueue = false;\n\n    function executeQueue() {\n        if (!_queue.length) {\n            return;\n        }\n\n        // Copy the queue\n        var items = _queue;\n        // clear the queue\n        _queue = [];\n\n        _runningQueue = true;\n\n        // Execute all the callbacks in the queue\n        for (var i = 0; i < items.length; i++) {\n            items[i]();\n        }\n\n        _runningQueue = false;\n    }\n\n    /***\n     * Execute a callback in RAF context, or if we're already in an RAF context, instantly run it.\n     *\n     * @param {Function} callback\n     * @param {Object=} context\n     */\n    function queueOrInline(callback, context) {\n        if (_runningQueue) {\n            // Apply context\n            if (context) {\n                callback = $.proxy(callback, context);\n            }\n\n            // execute\n            callback();\n        } else {\n\n        // Else - queue\n        queue(callback, context);\n        }\n\n    }\n\n\n    /***\n     * Wraps a function that we wish to execute inside a requestAnimationFrame context\n     * @param {Function} func   the function we wish to wrap\n     * @param {Object} context  Optional context for the execution\n     * @returns {Function} a wrapped function that will be executed using the queue\n     */\n    function wrap(func, context) {\n        if (!context) {\n            context = window;\n        }\n\n        var result = function () {\n            var args = arguments;\n\n\n            queue(function () {\n                func.apply(context, args);\n            });\n        };\n\n        return result;\n    }\n\n\n    return {\n        queue: queue,\n        wrap: wrap,\n        queueOrInline: queueOrInline\n    };\n});", "/* globals Backbone, _ */\n\ndefine(\"smore/ui/views/modal\", function (require) {\n\n    var safe = require('fire/net/safe');\n    var overlay = require('./overlay');\n    var raf = require('fire/ui/raf');\n    var history = require('fire/util/history');\n    var mobile = require('fire/util/mobile');\n\n    var _win = $(window);\n    var _body = $(document.body);\n\n    /***\n     * ModalView\n     * =========\n     *\n     * The new version of the modal view. Based on Backbone views, with support for subviews and moving between them.\n     *\n     * This view is responsible for:\n     * - Loading the content of the view from a remote endpoint/promise/template\n     * - Opening the modal and blocking the screen\n     * - Support for subviews, called steps and the ability to go to specific ones (for example, a billing modal with\n     *   a pre-step of explanation, before showing the payment step\n     * - The \"show\" method returns a promise, which can be resolved with a value by passing it to complete, or rejected\n     *   if the \"close\" method was called\n     *\n     *\n     * Markup structure\n     * ----------------\n     * this.el -> div.smore-modal-container           The root element\n     *\n     *\n     * Available option keys\n     * ----------------------\n     * - `templateSelector`          Selector to use for getting the template for the modal.\n     * - `contentEndpoint`           Url that will be used for fetching the content of the modal\n     * - `overlayClose`              Is clicking on the overlay layer closes the modal? (Default to false)\n     * - `useSafePost`               Should the modal request the content using safe post? (Default to false)\n     *\n     * - `loadingTitle`              Text to show when loading the modal\n     * - `hideClose`              Hide all the 'fire-modal-close' buttons\n     *\n     *\n     * Subviews\n     * --------\n     * Sometimes you want to re-use views in your modal. Historically, you would use the `render` method\n     * To initialize your subviews. However, some of the modals we built returns different content based on the user\n     * state, and requires some boiler-plate code to decide which sub-views to initialize.\n     *\n     * The solution is the subviews option key. Similar to the `events` option key, a subclass can define its subviews\n     * and the template can reference them using a special declarative syntax\n     *\n     * Example:\n     *\n     * On our SomeModalView class:\n     *\n     * ```\n     * subviews: {\n     *      'billing-upgrade-confirmation': '_getBillingUpgradeView',\n     *      'another-cool-view': AmazinglyCoolView,\n     * },\n     *\n     * _getBillingUpgradeView: function(el){\n     *    return new UpgradeConfirmationView({el: el})\n     * }\n     * ```\n     *\n     * On our modal template:\n     *\n     * ```\n     * <div data-subview=\"billing-upgrade-confirmation\"></div>\n     * ```\n     * After our modal was loaded, we initiate the subviews.\n     *\n     *\n     * Steps\n     * -----\n     * Some of our modals have multiple screens (offer -> confirmation etc.). We call these screens \"steps\".\n     *\n     * We can easily define steps in our modal template:\n     * ```\n     * <div data-step=\"my-cool-step\"></div>\n     * ```\n     *\n     * When the modal is loaded, the ModalView will scan the dom and build a list of all of the available steps\n     * Your event handlers can then use the `goStep(<step-key>)` method or `nextStep()`/`prevStep()`\n     * to navigate your steps.\n     *\n     * The active step adds the `step-<step-key>' class to the modal container, for easing the css process\n     *\n     * You could also pass the `startStep` param to the `show()` method in order to choose which step to start from as\n     * your modal is loaded\n     *\n     * You can also use the special classes `.go-to-step`, `.go-to-prev-step` and `.go-to-next-step` as a declarative\n     * way to navigate from your templates\n     *\n     * Example:\n     * ```\n     *\n     *  <a class=\"button go-to-step\" data-key=\"confirmation-step\">Get offer now</a>\n     *  <a class=\"go-to-next-step\">Or skip</a>\n     *\n     * ```\n     *\n     *\n     *\n     *\n     *\n     * @class ModalView\n     * @extends {Backbone.View}\n     * @constructor\n     */\n    var ModalView = Backbone.View.extend({\n\n        /***\n         * Sets the default options for the ModalView\n         */\n        defaultOptions: {\n            overlayClose: false,\n            loadingTitle: 'Loading...',\n            hideClose: false,\n            allowAccessToolbar: false,\n            modalType: 'modal' // can be modal / modal-fixed\n        },\n\n\n        /***\n         * Sets the template selector for the content of the modal\n         *\n         * Example:\n         * >>> templateSelector: '#molsh-modal'\n         *\n         * @type {String}\n         */\n        templateSelector: '',\n\n\n        /***\n         * Sets a url for the modal to load from\n         *\n         * Example:\n         * >>> contentEndpoint: '/app/molsh/dolsh'\n         *\n         * @type {String}\n         */\n        contentEndpoint: '',\n\n\n        /***\n         * Should the get content method use safe post for fetching the modal?\n         *\n         *\n         * @type {Boolean}\n         */\n        useSafePost: false,\n\n        /**\n         * Get the params that will be sent to the modal endpoint\n         * Defaults to false for no params\n         *\n         * @returns {Object}\n         */\n        contentParams: function () {\n            return undefined;\n        },\n\n\n        /***\n         * Initialize our modal\n         *\n         * @param {object} options\n         */\n        initialize: function (options) {\n\n            /***\n             * Create a new promise for the modal.\n             *\n             * The promise will be resolved when someone is\n             *\n             * @type {jQuery.Deferred}\n             */\n            this.result = $.Deferred();\n\n\n            this.options = _.extend({}, this.defaultOptions, options || {});\n\n            // Register base event\n            this.events = _.extend({}, {\n                'click .fire-modal-close': '_onCloseClicked',\n                'click .go-to-step': '_onGoStepClicked',\n                'click .go-to-next-step': '_onNextStepClicked',\n                'click .go-to-prev-step': '_onPrevStepClicked',\n                'click .go-back-step': '_onBackStepClicked'\n            }, this.events);\n\n\n            this.overlayClose = this.options.overlayClose || false;\n\n            if (this.options.hideClose) {\n                this.$el.addClass('hide-close');\n            }\n\n            // Register resize handler, we throttle it to once in 50 ms\n            _win.on('resize', _.throttle($.proxy(this.position, this), 50));\n\n            // Empty steps stack\n            this._stepsStack = [];\n        },\n\n\n        /*********************************************************************************\n         * Getting content\n         *********************************************************************************/\n\n        /***\n         * Fetch the content of the modal and return a promise that will be resolved when\n         * The modal content was loaded\n         *\n         * The promise will resolve with the html content for the modal\n         *\n         * @returns {jQuery.Deferred}\n         */\n        getContent: function () {\n            var promise = $.Deferred();\n\n            // Gets the value of templateSelector. If templateSelector is a function, it\n            // will evaluate it and return the result\n\n            var templateSelector = _.result(this, 'templateSelector');\n\n            // If we have template selector defined, use it\n            if (templateSelector) {\n                var content = $(templateSelector).html();\n\n                if (content) {\n                    content = this.renderContent(content);\n                    promise.resolve(content);\n                } else {\n                    promise.reject(\"Template '\" + templateSelector + '\" was not found');\n                }\n\n                return promise;\n            }\n\n            // Else, we have to get it from the server\n            var endpoint = _.result(this, 'contentEndpoint');\n\n            // If we have no endpoint, fail\n            if (!endpoint) {\n                promise.reject(\"No endpoint was defined for \" + this);\n                return promise;\n            }\n\n            // Get the params\n            var params = _.result(this, 'contentParams');\n\n            if (_.result(this, 'useSafePost')) {\n                // If we can use safe post, return the promise from it\n                return safe.post(endpoint, params);\n            }\n\n            // Else, use $.get\n            return $.get(endpoint, params);\n        },\n\n        renderContent: function (templateContent) {\n            return templateContent;\n        },\n\n        isFixedModal: function () {\n            return this.options.modalType === 'modal-fixed';\n        },\n\n\n        /*********************************************************************************\n         * Closing and showing the modal\n         *********************************************************************************/\n\n        /**\n         * Opens the modal, returns a promise that will be resolved when the modal was closed\n         *\n         * The promise will resolved if the modal was closed using \"complete\" or rejected if the modal was\n         * closed using the \"close\" method\n         *\n         * @params {String} (optional) A key for the step to show first\n         * @returns {jQuery.Deferred}\n         */\n        show: function (startStep) {\n\n            this._startStep = startStep || (this.steps || [])[0];\n\n            // Set the container for the modal and add it into the overlay\n            this.$el.addClass('smore-modal-container');\n            if (this._startStep) {\n                this.$el.addClass('step-' + (this._startStep || ''));\n            }\n\n            if (this.options.containerEl) {\n                this._wrapper = $('<div/>').addClass('internal-modal-container').appendTo(this.options.containerEl);\n                this._wrapper.append(this.$el);\n\n            } else {\n                // Show the modal\n                this.overlay = new overlay.OverlayView({\n                    closeOnClick: this.overlayClose,\n                    type: this.options.modalType,\n                    allowAccessToolbar: this.options.allowAccessToolbar\n                });\n\n                this.overlay.scrollContainer.append(this.$el);\n                this.overlay.show();\n\n                var self = this;\n                this.overlay.on('close', function () {\n                   self.trigger('close');\n                });\n            }\n\n\n            // Get the content promise\n            var content = this.getContent();\n\n            // function to execute if we're still waiting after the delay time\n            var pending = function () {\n                if (content.state() === 'pending') {\n                    // Set the html to be loading\n                    this.showLoading();\n                }\n            };\n\n            // Only show the loading screen if the loading hasn't completed in 150ms\n            window.setTimeout($.proxy(pending, this), 150);\n\n\n            // Register callback for loading of the content\n            content.done($.proxy(this._onShowLoadingDone, this));\n            content.fail($.proxy(this._onShowLoadingFailed, this));\n\n\n            return this.result;\n        },\n\n        showLoading: function () {\n            this._setHtml(this.getLoadingContent());\n        },\n\n        /***\n         * Handles the completion of loading the html.\n         *\n         * @param {String} html\n         * @private\n         */\n        _onShowLoadingDone: function (html) {\n            this._setHtml(html, function () {\n                // This method will run after the html was set and the modal was re-positioned\n\n                // Setup history\n                this.setupHistory();\n\n                // Setup steps\n                this.setupSteps();\n\n                // Setup subviews\n                this.setupSubviews();\n\n                // Call the render function\n                this.render();\n\n                this.onShow();\n            });\n        },\n\n        onShow: function () {\n            // override in subclass\n        },\n\n        /***\n         * If for some reason the loading has failed\n         * @param error\n         * @private\n         */\n        _onShowLoadingFailed: function (error) {\n            this._setHtml(this.getErrorContent(error));\n        },\n\n        /***\n         * Sets the modal html\n         * @param {String} html\n         * @param {Function=} onCompleted Callback function to run after the html was rendered on the\n         *                                  modal was positioned (The callback is executed in the context of the\n         *                                  ModalView.\n         *\n         * @private\n         */\n        _setHtml: function (html, onCompleted) {\n            // Run it in request animation frame\n            raf.queue(function () {\n\n                // If mobile add mobile classes to the body\n                if (mobile.isMiniLayout()) {\n                    _body.addClass('smore-mobile-modal');\n                }\n\n                this.$el.html(html);\n                // Reposition the modal, after the html was set\n                this.position();\n\n                if (_.isFunction(onCompleted)) {\n                    onCompleted.call(this);\n                }\n\n            }, this);\n        },\n\n\n        /***\n         * Renders a simple html to show when loading the flyer\n         */\n        getLoadingContent: function () {\n            return '<div class=\"smore-modal-loading\">' +\n                '<div class=\"indicator\">' +\n                '<div class=\"spinner\">' +\n                '<div class=\"rect1\"></div>' +\n                '<div class=\"rect2\"></div>' +\n                '<div class=\"rect3\"></div>' +\n                '<div class=\"rect4\"></div>' +\n                '<div class=\"rect5\"></div>' +\n                '</div></div><h3><span>' +\n                this.options.loadingTitle +\n                '</span></h3></div>';\n        },\n\n        /***\n         *\n         * @param error\n         */\n        getErrorContent: function (error) {\n            return '<div class=\"smore-modal-error\"><h3>Oops! Something bad happened :/</h3>' +\n                '<p>Hope we can still be friends...</p> ' +\n                '<p><a class=\"smore-modal-close fire-modal-close\">Close this</a> or ' +\n                '<a href=\"mailto:hello@smore.com\">Contact support and tell us what happend</a>.</div></div>';\n        },\n\n        /***\n         * Centers the modal vertically\n         */\n        position: function () {\n            // Do nothing if our el is not inside the dom yet\n            if (!this.el.parentNode) {\n                return;\n            }\n\n            var minTop = 70;\n\n            var height = this.$el.height();\n\n            var screenHeight = window.innerHeight || _win.height();\n\n            // Handle internal modal wrapper\n            if (this.options.containerEl) {\n                screenHeight = this.options.containerEl.height();\n            }\n\n            // put at screen center\n            var scrollTop = $(window).scrollTop();\n            // disable scroll for fixed modals\n            if (this.isFixedModal()) {\n                scrollTop = 0;\n            }\n\n            var top = (screenHeight / 2 ) - (height / 2) + scrollTop;\n\n            // Set a minimum top\n            top = Math.max(minTop, top);\n            // Set the top and apply animation\n            this.$el.css('margin-top', top).addClass('active');\n        },\n\n        /***\n         * Closes the modal, resolve its promise with the the given result\n         *\n         * @param {*} result\n         */\n        complete: function (result) {\n\n            this.onComplete(result);\n\n            // Close the modal\n            this._closeModal();\n\n            this.result.resolve(result);\n        },\n\n        /***\n         * A useful placeholder for sub classes.\n         * This can be used for reporting purposes etc.\n         *\n         *\n         * @param {*} result\n         */\n        onComplete: function (result) {\n            // no-op\n        },\n\n        /***\n         * Close the modal, rejecting the `result` promise\n         */\n        close: function (cancelReason) {\n\n            this.onClose(cancelReason);\n\n            // Close the modal\n            this._closeModal();\n\n            this.trigger('close');\n\n            this.result.reject(cancelReason);\n        },\n\n        /***\n         * A useful placeholder for sub classes.\n         * This can be used for reporting purposes etc.\n         *\n         *\n         * @param {*} cancelReason\n         */\n        onClose: function (cancelReason) {\n            // no-op\n        },\n\n        /***\n         * The actual method that hides the modal\n         * @private\n         */\n        _closeModal: function () {\n            // Drop animation\n            this.$el.addClass('drop');\n\n            // Hide the overlay\n            if (this.overlay) {\n                this.overlay.hide();\n            }\n\n            var internalWrapper = this._wrapper;\n\n            var el = this.$el;\n\n            // When everything is completed, remove the element\n            el.transitionEnd(function () {\n                el.remove();\n\n                // remove mobile class from body\n                _body.removeClass('smore-mobile-modal');\n\n                if (internalWrapper) {\n                    internalWrapper.remove();\n                }\n            });\n\n            // remove history helper\n            if (this._historyHelper) {\n                this._historyHelper.remove();\n                this._historyHelper = null;\n            }\n\n\n        },\n\n        /*********************************************************************************\n         * Subviews\n         *********************************************************************************/\n\n        /***\n         * Initialize subviews\n         */\n        setupSubviews: function () {\n\n            // Get the dict for the view keys\n            var subviews = _.result(this, 'subviews');\n\n            // we will use the reference for our internal views\n            var _this = this;\n\n            // Iterate over the subviews in our loaded dom\n            this.$('[data-subview]').each(function () {\n                var el = $(this);\n\n                var key = el.data('subview');\n                var viewCls = subviews[key];\n\n                if (!key || !viewCls) {\n                    console.error(\"Can't find view for key: \", key, \"el:\", el);\n                    return;\n                }\n\n                // initialize the view using the the class we have\n                var view;\n                // If it's a view class create it\n                if (viewCls.__super__) {\n                    // Create the view, pass it the viewCls\n                    view = new viewCls({el: el});\n                } else {\n                    // If it's a string, get it from the class\n                    if (_.isString(viewCls)) {\n\n                        var targetFn = _this[viewCls];\n\n                        if (!targetFn) {\n                            throw \"Cant find the key '\" + viewCls + \"'\";\n                        }\n\n                        // Set the function\n                        viewCls = targetFn;\n                    }\n\n                    // run the function that initialize it, run it in the context of the modal\n                    view = viewCls.call(_this, el);\n\n                }\n\n                // Skip if we don't have a view\n                if (!view) {\n                    return;\n                }\n\n                // set reference\n                view.modal = _this;\n\n                // We render everything inside an RAF for performance reasons\n                raf.queue(view.render, view);\n            });\n\n        },\n\n\n        /*********************************************************************************\n         * Steps\n         *********************************************************************************/\n\n        /***\n         * Setup the steps, if defined\n         */\n        setupSteps: function () {\n\n            // Find all the step elements\n            this._stepEls = this.$('[data-step]');\n\n            // Find all the steps and store them in 'this.steps'\n            this.steps = this._stepEls.map(function () {\n                return $(this).data('step');\n            }).get();\n\n            // If we have steps, show the first step or the startStep\n            if (!this.steps.length) {\n                return;\n            }\n\n            this._startStep = this._startStep || (this.steps || [])[0];\n\n\n            this.goStep(this._startStep);\n\n        },\n\n        _getStepEl: function (stepKey) {\n            return this._stepEls.filter('[data-step=\"' + stepKey + '\"]');\n        },\n\n        /***\n         * Go to a given step key\n         * @param {String} stepKey\n         * @param {Boolean=} skipStack   Will not add the current step to the stack\n         */\n        goStep: function (stepKey, skipStack) {\n            var stepEl = this._getStepEl(stepKey);\n\n            if (!stepEl.length) {\n                console.error(\"Can't find step with key\", stepKey, \"steps:\", this._stepEls);\n                return;\n            }\n\n            // else:\n            // Do everything inside an RAF for performance reasons\n            raf.queueOrInline(function () {\n\n                // Add and remove the step keys\n                if (this._currentSection) {\n                    this.$el.removeClass('step-' + this._currentSection);\n\n                    if (!skipStack) {\n                        // Store the step in the stack\n                        this._stepsStack.push(this._currentSection);\n                    }\n                }\n\n                this.$el.addClass('step-' + stepKey);\n\n                // Hide all other steps\n                this._stepEls.hide();\n                // Show selected step\n                stepEl.show();\n\n                // Call position to re-position our modal\n                this.position();\n\n                // Store the current step\n                this._currentSection = stepKey;\n\n                /**\n                 * Store the current step element\n                 * @type {jQuery}\n                 */\n                this.currentStepEl = stepEl;\n\n                if (!skipStack) {\n                    this._historyHelper.push({step: this._currentSection});\n                }\n\n                // Notify\n                this.onStepActivated(stepKey);\n\n            }, this);\n        },\n\n        goBackStep: function () {\n            if (!this._stepsStack.length) {\n                return;\n            }\n\n            var upcomingStep = this._stepsStack.pop();\n\n            this.goStep(upcomingStep, true);\n        },\n\n        _stepIdx: function (stepKey) {\n            return this.steps.indexOf(stepKey);\n        },\n\n        /***\n         * Go to the next step\n         */\n        nextStep: function () {\n            // // Default - first step\n            var nextStep = this.steps[0];\n\n            if (this._currentSection) {\n                var idx = this._stepIdx(this._currentSection);\n\n\n                nextStep = this.steps[idx + 1];\n\n                if (!nextStep) {\n                    return;\n                }\n            }\n\n            this.goStep(nextStep);\n        },\n\n        /***\n         * Go to previous step\n         */\n        prevStep: function () {\n            // Default - first step\n            var prevStep = this.steps[0];\n\n            if (this._currentSection) {\n                var idx = this._stepIdx(this._currentSection);\n\n\n                prevStep = this.steps[idx - 1];\n\n                if (!prevStep) {\n                    return;\n                }\n            }\n\n            this.goStep(prevStep);\n        },\n\n        /***\n         * A method for implementers of modals, to allow them to handle cases when a step is activated\n         * @param {String} stepKey\n         */\n        onStepActivated: function (stepKey) {\n            // no-op\n        },\n\n        /*********************************************************************************\n         * History\n         *********************************************************************************/\n        setupHistory: function () {\n            this._historyHelper = history.getHelper($.proxy(this._onHistoryPopState, this));\n        },\n\n\n        /*********************************************************************************\n         * Event handlers\n         *********************************************************************************/\n\n        /***\n         * Handle history events\n         * @private\n         */\n        _onHistoryPopState: function (e, state) {\n            if (state.step) {\n                this.goBackStep();\n            }\n        },\n\n        _onCloseClicked: function (e) {\n            e.preventDefault();\n            e.stopImmediatePropagation();\n            this.close('clicked_on_cancel');\n        },\n\n        _onNextStepClicked: function (e) {\n            var t = $(e.currentTarget);\n            if (t.hasClass('disabled')) {\n                return;\n            }\n            this.nextStep();\n        },\n\n        _onPrevStepClicked: function (e) {\n            var t = $(e.currentTarget);\n            if (t.hasClass('disabled')) {\n                return;\n            }\n            this.prevStep();\n        },\n\n        _onGoStepClicked: function (e) {\n            var t = $(e.currentTarget);\n            if (t.hasClass('disabled')) {\n                return;\n            }\n\n            var key = t.data('key');\n            if (key) {\n                this.goStep(key);\n            }\n        },\n\n        _onBackStepClicked: function (e) {\n            var t = $(e.currentTarget);\n            if (t.hasClass('disabled')) {\n                return;\n            }\n\n            // Go back a step\n            this.goBackStep();\n        }\n    });\n\n\n    return {\n        ModalView: ModalView\n    };\n});", "define('fire/ui/pleaseWait', function(require) {\n    /***\n     * pleaseWait.js\n     * =============\n     *\n     *  A helper method to handling disable/enable items when using a promise\n     *\n     *  Usage:\n     *\n     *  pleaseWait.wait(promise, '.confirm-button')\n     *  >>> Disable the elements (add disabled class, add disabled attribute) and re-enable them when the promise is\n     *  >>> rejected or resolved\n     *\n     *  pleaseWait.wait(promise, $el, 'Please wait...')\n     *  >>> Disable the element and set it's text to 'Please wait...') restore everything back when the promise is\n     *  >>> rejected or resolved\n     */\n\n\n    /***\n     *\n     * @param {jQuery.Deferred} promise     The promise we're waiting for\n     * @param {string|jQuery}   selector    The selector we're going to enable/disable\n     * @param {string=}         waitText    (optional) Please wait text, to set for the element\n     *\n     * @return {jQuery.Deferred} the original promise for chaining purposes\n     */\n    function wait(promise, selector, waitText) {\n\n        // If we're already resolved or rejected, there is nothing to do\n        if (promise.state() !== 'pending') {\n            return promise;\n        }\n\n        // Get the selector\n        selector = $(selector);\n        var _currentText;\n\n        // Store current text\n        if (waitText) {\n            _currentText = selector.text();\n        }\n\n\n        // Start by disabling\n        selector.addClass('disabled').attr('disabled', true);\n\n        // Set the wait text\n        if (waitText) {\n            selector.text(waitText);\n        }\n\n        // Restore everything here\n        promise.always(function() {\n            selector.removeClass('disabled').removeAttr('disabled');\n\n            // Restore text\n            if (_currentText) {\n                selector.text(_currentText);\n            }\n        });\n\n        // return the promise\n        return promise;\n    }\n\n    /***\n     *\n     * @param {jQuery|string} selector\n     *\n     * @return {Boolean} true if the selector is disabled false if not\n     */\n    function disabled(selector) {\n        return $(selector).is('.disabled');\n    }\n\n\n    return {\n        wait: wait,\n        disabled: disabled\n    };\n});", "/* globals Backbone, _ */\n\ndefine(\"educator_community/EducatorsSubmitForm\", function (require) {\n\n    var pleaseWait = require('fire/ui/pleaseWait');\n    var safe = require('fire/net/safe');\n\n    var SHARE_SUBMIT_ENDPOINT = 'hive/submit/';\n    var MAX_FLYER_DESCRIPTION_LENGTH = 400;\n\n    /**\n     * Educators Submit Form\n     */\n    var EducatorsSubmitForm = Backbone.View.extend({\n\n        initialize: function (options) {\n            options = options || {};\n            this.flyerId = options.flyerId;\n            this.onShareSubmitDone = options.onShareSubmitDone;\n            this.selectedCategory = null;\n            this.allowedToSubmit = false;\n        },\n\n        render: function () {\n            // Setup the facebook share callback\n\n            this._guidelinesCheckbox = this.$('.guidelines-checkbox');\n            this._submitButton = this.$('.submit-flyer-button');\n            this._flyerDescriptionInput = this.$('.flyer-description');\n            this._categoryButtons = this.$('.flyer-category-button');\n\n            this._submitButton.click($.proxy(this._onSubmitButtonClicked, this));\n            this._guidelinesCheckbox.click($.proxy(this._onGuidelinesClicked, this));\n\n\n            var self = this;\n            this._categoryButtons.click(function(){\n                var selectedButton = $(this);\n                self._onCategoryButtonClicked(selectedButton);\n            });\n\n            this._validateForm();\n        },\n\n        _onCategoryButtonClicked: function (selectedButtonEl) {\n            // unselect the current button\n            this._categoryButtons.removeClass('selected');\n\n            selectedButtonEl.addClass('selected');\n            this.selectedCategory = selectedButtonEl.data('category');\n            this._validateForm();\n        },\n\n        _onGuidelinesClicked: function () {\n            this._validateForm();\n        },\n\n        _validateForm: function () {\n            var isValid = this._isAgreedToGuidelines() && this._isCategorySelected();\n\n            this._toggleSubmitButton(isValid);\n\n            this.allowedToSubmit = isValid;\n        },\n\n        _isAgreedToGuidelines: function () {\n            return this._guidelinesCheckbox.is(':checked');\n        },\n\n        _isCategorySelected: function () {\n            return !!this.selectedCategory;\n        },\n\n        _flyerDescription: function () {\n            return this._flyerDescriptionInput.val();\n        },\n\n        _toggleSubmitButton: function (isActive) {\n            this._submitButton.toggleClass('disabled', !isActive);\n        },\n\n        _onSubmitButtonClicked: function () {\n            if (!this.allowedToSubmit) {\n                return;\n            }\n\n            // Create a safe post request\n            var promise = safe.post(this._getSubmitUrl(), {\n                description: this._flyerDescription(),\n                category: this.selectedCategory\n            });\n\n            // Set the button as pending\n            pleaseWait.wait(promise, this._submitButton, 'Please wait...');\n\n            promise.done($.proxy(function() {\n                this.onShareSubmitDone();\n            }, this));\n\n            promise.error(function(err) {\n                window.alert(err);\n            });\n        },\n\n        _getSubmitUrl: function() {\n            return SHARE_SUBMIT_ENDPOINT + this.flyerId;\n        }\n    });\n\n    return {\n        EducatorsSubmitForm: EducatorsSubmitForm\n    };\n});", "/* globals Backbone, _ */\n\ndefine(\"educator_community/educatorShareModal\", function (require) {\n\n    var ModalView = require('smore/ui/views/modal').ModalView;\n    var EducatorsSubmitForm = require('./EducatorsSubmitForm').EducatorsSubmitForm;\n\n    /***\n     * EducatorShareModal\n     */\n    var EducatorShareModal = ModalView.extend({\n\n        className: 'educator-share-modal',\n\n        contentEndpoint: function () {\n            return '/hive/share_modal/' + this.flyerId();\n        },\n\n        // Register views\n        subviews: {\n            'educators-submit-form': '_setupEducatorsSubmitForm'\n        },\n\n\n        events: {\n            //'click .reload-button': '_onReloadButtonClicked'\n        },\n\n        flyerId: function () {\n            return this.options.flyerId;\n        },\n\n        _setupEducatorsSubmitForm: function (el) {\n            this._setupIntroStep();\n            return new EducatorsSubmitForm({\n                el: el,\n                flyerId: this.flyerId(),\n                onShareSubmitDone: $.proxy(this._onShareSubmitDone, this)\n            });\n        },\n\n        _setupIntroStep: function () {\n            var intro = this.$('.educators-share-intro-container');\n            intro.show();\n            intro.find('.start-button').click(function(){\n                intro.fadeOut();\n            });\n        },\n\n        _onShareSubmitDone: function () {\n            this.goStep('educators-share-success');\n        }\n\n    });\n\n\n\n    var educatorShareModal = null;\n\n    /***\n     * Opens a new modal\n     *\n     * @param {String} flyerId       The flyerId we're promotion\n     */\n    function show(flyerId) {\n        educatorShareModal = new EducatorShareModal({flyerId: flyerId});\n        educatorShareModal.show();\n        return educatorShareModal;\n    }\n\n    function isShown() {\n        return educatorShareModal && educatorShareModal.isShown;\n    }\n\n    /**\n     * Close the modal\n     */\n    function close() {\n        educatorShareModal.close();\n    }\n\n    return {\n        show: show,\n        isShown: isShown,\n        close: close\n    };\n\n});", "/****\r\n * Initialize the author tools in here\r\n */\r\ndefine('author/ui/tools', function (require) {\r\n    var clipboard = require('./clipboard');\r\n    var settingsModal = require('./settings/modal');\r\n    var emailModal = require('./email/modal');\r\n    var addEmail = require('./email/addEmailToProfile');\r\n    var isAuthor = require('smore/isAuthor');\r\n    var browserWarning = require('fire/ui/browserWarning');\r\n    var print = require('./print');\r\n    var _short = $('#smore_short_key').attr('value');\r\n    var fingerprint = require('smore/util/fingerprint');\r\n    var EducatorShareModal = require('educator_community/educatorShareModal');\r\n\r\n\r\n    function analyticsModal() {\r\n        return window.smore.analyticsModal;\r\n    }\r\n\r\n    function init() {\r\n        // sanity check\r\n        if (!isAuthor()) {\r\n            return;\r\n        }\r\n\r\n        // setup browser warning\r\n        browserWarning('#browser-warning-modal');\r\n\r\n\r\n        // init modals\r\n        settingsModal.init();\r\n        clipboard.init();\r\n        emailModal.init();\r\n\r\n\r\n        // New modal\r\n\r\n\r\n        // setup the 'add email to profile' popover\r\n        $('#add-email-to-profile-button').click(function (e) {\r\n            var t = $(e.currentTarget);\r\n            var p = new addEmail.AddEmailToProfile({});\r\n            p.show(t);\r\n        });\r\n\r\n        // privacy button\r\n        $('.private-badge').click(settingsModal.show);\r\n\r\n        // Analytics button\r\n        $('.author-toolbox .analytics-button').click(function (e) {\r\n            analyticsModal().show();\r\n        });\r\n\r\n        // Email Analytics button\r\n        $('.author-toolbox .secondary-analytics-button.email').click(function (e) {\r\n            analyticsModal().show('emails');\r\n        });\r\n\r\n        // Event RSVP button\r\n        $('.author-toolbox .secondary-analytics-button.rsvp').click(function (e) {\r\n            analyticsModal().show('rsvp');\r\n        });\r\n\r\n        // Author inquiries button\r\n        $('.author-toolbox .secondary-analytics-button.author-inquiries').click(function (e) {\r\n            analyticsModal().show('authorInquiries');\r\n        });\r\n\r\n        // Educator community share button\r\n        $('.author-show .open-educator-share-button').click(function () {\r\n            openEducatorShareModal();\r\n        });\r\n\r\n        function openEducatorShareModal() {\r\n            if (EducatorShareModal.isShown()) {\r\n                return;\r\n            }\r\n\r\n            EducatorShareModal.show(window.pageId);\r\n        }\r\n\r\n        // Email analytics hash\r\n        if (document.location.hash === '#email-report') {\r\n            // wait for a second\r\n            setTimeout(function () {\r\n                analyticsModal().show('emails');\r\n            }, 1000);\r\n        }\r\n\r\n\r\n        // Email analytics hash\r\n        if (document.location.hash === '#rsvp-report') {\r\n            // wait for a second\r\n            setTimeout(function () {\r\n                analyticsModal().show('rsvp');\r\n            }, 1000);\r\n        }\r\n\r\n\r\n        // Email analytics hash\r\n        if (document.location.hash === '#author-inquiries-report') {\r\n            // wait for a second\r\n            setTimeout(function () {\r\n                analyticsModal().show('authorInquiries');\r\n            }, 1000);\r\n        }\r\n\r\n        // regular analytics hash\r\n        if (document.location.hash === '#flyer-analytics') {\r\n            // wait for a second\r\n            setTimeout(function () {\r\n                analyticsModal().show();\r\n            }, 1000);\r\n        }\r\n\r\n        // print popover\r\n        var printPP = new print.PrintPopoverView();\r\n\r\n        $('.author-toolbox .open-print-popover').on('click', function (e) {\r\n            var t = $(e.currentTarget);\r\n\r\n            printPP.show(t);\r\n        });\r\n\r\n        // Report fingerprint\r\n        fingerprint.report();\r\n    }\r\n\r\n    $(init);\r\n});", "// Generated by CoffeeScript 1.12.7\n\n/*\n  Event widget handlers\n */\nvar extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\ndefine('show/widgets/event', function(require) {\n  var EventRSVPView, FLYER_ID, RSVP_ENDPOINT, RSVP_SELECTOR, formView, isAuthor, setupRsvp, vw;\n  isAuthor = require('smore/isAuthor');\n  formView = require('fire/ui/forms/formView');\n  vw = require('fire/ui/view');\n  RSVP_ENDPOINT = '/app/flyer_actions/rsvp_attend';\n  RSVP_SELECTOR = '.event-rsvp-container';\n  FLYER_ID = $('#smore_flyer_id').attr('value');\n  if (!FLYER_ID) {\n    return;\n  }\n  EventRSVPView = (function(superClass) {\n    var SUCCESS_TEXT;\n\n    extend(EventRSVPView, superClass);\n\n    function EventRSVPView() {\n      return EventRSVPView.__super__.constructor.apply(this, arguments);\n    }\n\n    SUCCESS_TEXT = ' is now attending this event.';\n\n    EventRSVPView.prototype.render = function() {\n\n      /*\n      Renders the RSVP view\n       */\n      if (isAuthor()) {\n        this.addModifier('author');\n        return;\n      }\n      this.addModifier('visitor');\n      this._success = this.find('.success-box');\n      this._subEmail = this.find('.form-field.email-address');\n      this._form = new formView.FormView({\n        el: this.find('.event-rsvp-form'),\n        action: RSVP_ENDPOINT,\n        extraParams: {\n          'page': FLYER_ID,\n          'event': this.el.data('id')\n        }\n      });\n      this._form.on('submitstart', (function(_this) {\n        return function() {\n          return _this._success.hide();\n        };\n      })(this));\n      return this._form.on('success', (function(_this) {\n        return function() {\n          return _this.onFormSucceed();\n        };\n      })(this));\n    };\n\n    EventRSVPView.prototype.onFormSucceed = function() {\n\n      /*\n      Handle form success\n       */\n      this._success.show().text(this._subEmail.val() + SUCCESS_TEXT);\n      return this._form.reset();\n    };\n\n    return EventRSVPView;\n\n  })(vw.View);\n  setupRsvp = function() {\n\n    /*\n    Setup all RSVP widgets\n     */\n    var el, els, i, len, results;\n    els = $(RSVP_SELECTOR);\n    results = [];\n    for (i = 0, len = els.length; i < len; i++) {\n      el = els[i];\n      results.push(new EventRSVPView({\n        el: $(el)\n      }));\n    }\n    return results;\n  };\n  return $(setupRsvp);\n});\n", "/* globals Backbone, _ */\n\ndefine('billing/ui/ChangePlanView', function(require) {\n\n    var pleaseWait = require('fire/ui/pleaseWait');\n    var safe = require('fire/net/safe');\n\n\n    /***\n     * ChangePlanView.js\n     * =================\n     *\n     * A base view that's being used by Upgrade, Downgrade and Cancel views\n     *\n     * Handles calling to the server and setting the new plan\n     *\n     * Will trigger the 'changeCompleted' event when the change plan action was completed\n     */\n\n\n    /**\n     * @const\n     * @type {string}\n     */\n    var CHANGE_PLAN_ENDPOINT = '/app/billing/change_pro_plan';\n\n\n    /***\n     *\n     * @extends {Backbone.View}\n     * @constructor\n     */\n    var ChangePlanView = Backbone.View.extend({\n\n        initialize: function(options) {\n            // Get the plan change from the options\n            this.planChange = options.planChange;\n\n            // Register events (We do it in order to free the sub views to use the 'events' dicts\n\n            this.delegateEvents({'click button.confirm-button': '_onConfirmButtonClicked'});\n\n            if (!options.skipReportOpen) {\n                this.reportOpen();\n            }\n\n        },\n\n        /***\n         * Handles the confirm button events\n         *\n         * @param {jQuery.Event} e\n         * @protected\n         */\n        _onConfirmButtonClicked: function(e) {\n            // If the button is disabled, return\n            var t = $(e.currentTarget);\n\n            if (pleaseWait.disabled(t)) {\n                return false;\n            }\n\n            // Clear errors\n            this.setError(false);\n\n            // Create a safe post request\n            var p = safe.post(CHANGE_PLAN_ENDPOINT, this.planChange.toServer());\n\n            // Set the button as pending\n            pleaseWait.wait(p, t, 'Please wait...');\n            // Disable the back button\n            pleaseWait.wait(p, this.$('.modal-back-button, .fire-modal-close'));\n\n            // Set completion callbacks\n            p.done($.proxy(this.onChangePlanCompleted, this));\n            p.fail($.proxy(this.onChangePlanFailed, this));\n        },\n\n        /**\n         * Handles completions\n         * @param result\n         */\n        onChangePlanCompleted: function(result) {\n\n            var r = this.reportCompleteChange();\n            var _this = this;\n\n            function trigger() {\n                _this.trigger('changeCompleted', _this);\n            }\n\n            if (r && r.always) {\n                // wait for the report to complete and than close the modal\n\n                r.always(trigger());\n            } else {\n                trigger();\n            }\n        },\n\n\n        /***\n         * Handles an error when changing plans\n         * @param {string} errorText\n         */\n        onChangePlanFailed: function(errorText) {\n            // Show error\n            this.setError(errorText);\n        },\n\n\n        /***\n         * A hook for reporting the completion of the change to mixpanel\n         */\n        reportCompleteChange: function() {\n            // no-op\n        },\n\n        /***\n         * A hook for reporting the opening of the view to mixpanel\n         */\n        reportOpen: function() {\n            //\n        },\n\n        /**\n         * Set the error message. if errorText is false, hide the error box\n         * @param {string|boolean} errorText\n         */\n        setError: function(errorText) {\n            var el = this.$el.find('.error');\n\n            // Show if we have the error text\n            if (errorText) {\n                el.show().find('p').text(errorText);\n            } else {\n                el.hide();\n            }\n        }\n\n    });\n\n\n    return ChangePlanView;\n});\n", "/* globals smore */\r\ndefine('billing/events', function (require) {\r\n    /***\r\n     * Utilities and tools to track events inside the pricing/billing process\r\n     */\r\n\r\n    var PREFIX = 'BILLING: ';\r\n\r\n    // the mixpanel call\r\n    var track = smore.report.track;\r\n\r\n\r\n    var Events = {\r\n        opened_pricing_page: 'Opened pricing page',\r\n        opened_education_pricing_page: 'Opened education pricing page',\r\n        opened_education_bulk_page: 'Opened education bulk page',\r\n        opened_standalone_upgrade_page: 'Opened standalone upgrade page',\r\n        clicked_choose_this_plan: 'Clicked choose this plan',\r\n        signup_modal_opened: 'Signup modal opened',\r\n        signup_modal_closed: 'Signup modal closed',\r\n        entered_name_in_signup_form: 'Entered name in signup form',\r\n        entered_cc_in_signup_flow: 'Entered cc in signup form',\r\n        clicked_completed_purchase: 'Clicked on Complete Purchase',\r\n        validation_error_before_complete_purchase: 'Validation error before complete purchase',\r\n        server_error_in_signing_up: 'Server error in signing up',\r\n        signup_complete: 'Signup complete',\r\n\r\n        focused_on_cc_field: 'Focused on the cc field',\r\n        focused_on_name_field: 'Focused on the name field',\r\n        focused_on_cvc_field: 'Focused on the cvc field',\r\n\r\n        // Downgrade/Upgrade\r\n        opened_downgrade_modal: 'Opened downgrade modal',\r\n        opened_upgrade_modal: 'Opened upgrade modal',\r\n        completed_upgrade: 'Completed upgrade',\r\n        completed_downgrade: 'Completed downgrade',\r\n\r\n        // Cancel modal\r\n        opened_cancel_modal: 'Opened cancel modal',\r\n        completed_cancel: 'Completed cancel',\r\n        took_cancel_offer: 'Took cancel offer',\r\n\r\n        // Credits modal\r\n\r\n        opened_credits_modal: 'Opened credits modal',\r\n        opened_credits_modal_plan_upgrade: 'Opened credits modal plan upgrade',\r\n        upgraded_to_plan_from_credits_modal: 'Upgraded to plan through credits modal',\r\n        opened_flyer_packs_intro: 'Opened flyer packs intro step',\r\n        opened_flyer_pack_option: 'Opened flyer pack option',\r\n        opened_share_for_credits: 'Opened share for credits',\r\n        completed_share_for_credits: 'Completed share for credits',\r\n        completed_flyer_pack_purchase: 'Completed flyer pack purchase',\r\n\r\n        // Annual upgrade\r\n        opened_switch_to_yearly_plan_page: 'Opened switch to yearly plan page'\r\n    };\r\n\r\n\r\n    /***\r\n     * Get a parameter from query string\r\n     * http://stackoverflow.com/a/901144\r\n     *\r\n     * @param name\r\n     * @returns {string}\r\n     */\r\n    function getParameterByName(name) {\r\n        name = name.replace(/[\\[]/, \"\\\\\\[\").replace(/[\\]]/, \"\\\\\\]\");\r\n        var regexS = \"[\\\\?&]\" + name + \"=([^&#]*)\";\r\n        var regex = new RegExp(regexS);\r\n        var results = regex.exec(window.location.search);\r\n        if (results === null) {\r\n            return \"\";\r\n        }\r\n        else {\r\n            return decodeURIComponent(results[1].replace(/\\+/g, \" \"));\r\n        }\r\n\r\n    }\r\n\r\n    // extract the upgrade reason if relevant\r\n    var _upgradeReason = getParameterByName('ur') || 'N/A';\r\n\r\n\r\n    /***\r\n     * Report an event\r\n     * @param eventName\r\n     * @param extraProps\r\n     * @param once\r\n     * @returns {jQuery.Deferred}\r\n     */\r\n    function report(eventName, extraProps, once) {\r\n        if (!eventName) {\r\n            return $.when();\r\n        }\r\n\r\n\r\n        var base = {};\r\n\r\n        if (_upgradeReason) {\r\n            base.upgrade_reason = _upgradeReason;\r\n        }\r\n\r\n        var props = $.extend(base, extraProps || {});\r\n\r\n\r\n        return track(PREFIX + eventName, props, once);\r\n    }\r\n\r\n\r\n    return {\r\n        report: report,\r\n        Events: Events,\r\n        reason: _upgradeReason\r\n    };\r\n});", "/* globals Backbone */\n\ndefine('billing/ui/UpgradeView', function(require) {\n\n    var ChangePlanView = require('./ChangePlanView');\n\n    var events = require('billing/events');\n\n    /***\n     * UpgradeView.js\n     * ==========\n     *\n     * UpgradeView\n     */\n\n    var UpgradeView = ChangePlanView.extend({\n\n\n        reportOpen: function() {\n            events.report(events.Events.opened_upgrade_modal, {requested_plan: this.planChange.plan});\n        },\n\n        reportCompleteChange: function() {\n            return events.report(events.Events.completed_upgrade, {requested_plan: this.planChange.plan});\n        }\n\n    });\n\n\n    return UpgradeView;\n});\n", "define('billing/PlanChange', function(require) {\n\n    /***\n     * PlanChange.js\n     * ==========\n     *\n     * A simple class to hold information about plan change, like upgrade reason, target plan and coupon code\n     *\n     */\n\n\n    /***\n     *\n     * @class PlanChange\n     * @param {string!} plan                The target plan for the plan change.\n     * @param {string=} upgradeReason       (optional) Upgrade reason for the change\n     * @param {string=} coupon              (optional) Coupon code being used\n     * @constructor\n     */\n    function PlanChange(plan, upgradeReason, coupon) {\n        this.plan = plan;\n        this.upgradeReason = upgradeReason;\n        this.coupon = coupon;\n    }\n\n    PlanChange.prototype = {\n        /**\n         * Convert the plan change to the format on the server side\n         */\n        toServer: function() {\n            var r = {\n                'requested_plan': this.plan\n            };\n\n            // Set upgrade reason\n            if (this.upgradeReason) {\n                r.upgrade_reason = this.upgradeReason;\n            }\n\n\n            // Set coupon\n            if (this.coupon) {\n                r.coupon_code = this.coupon;\n            }\n\n            return r;\n        }\n    };\n\n\n    return PlanChange;\n});", "define('billing/provider', function(require) {\r\n\r\n    var PROVIDER_KEY = 'stripe';\r\n\r\n    /***\r\n     *\r\n     * @param {{number: String,\r\n     *          cvc: String,\r\n     *          exp_month:String,\r\n     *          exp_year:String,\r\n     *          name:String   }} ccData\r\n     */\r\n    function paymentData(ccData) {\r\n        var dfd = $.Deferred();\r\n\r\n        // validate on the client side\r\n        var v = validate(ccData);\r\n\r\n        // if valid\r\n        if (v.valid) {\r\n            // send to stripe\r\n            stripe().createToken(ccData, function(status, response) {\r\n                if (response.error) {\r\n                    dfd.reject(response.error.message);\r\n                } else {\r\n                    var paymentData = {\r\n                        stripe_token: response.id,\r\n                        provider: PROVIDER_KEY\r\n                    };\r\n\r\n                    dfd.resolve(paymentData);\r\n                }\r\n            });\r\n\r\n        } else {\r\n            // not valid on the client side, reject\r\n            dfd.reject(v.errors[0].reason);\r\n        }\r\n\r\n\r\n        return dfd.promise();\r\n    }\r\n\r\n\r\n    function validate(ccData) {\r\n        var errors = [];\r\n\r\n        if (!ccData.name) {\r\n            errors.push({field: 'name', reason: 'Invalid card holder name.'});\r\n        }\r\n\r\n        if (!stripe().card.validateCardNumber(ccData.number)) {\r\n            errors.push({field: 'number', reason: 'Invalid credit card number.'});\r\n        }\r\n\r\n        if (!stripe().card.validateCVC(ccData.cvc)) {\r\n            errors.push({field: 'cvc', reason: 'Invalid CVC.'});\r\n        }\r\n\r\n        if (!stripe().card.validateExpiry(ccData.exp_month, ccData.exp_year)) {\r\n            errors.push({field: 'exp_month', reason: 'Invalid expiry date.'});\r\n            errors.push({field: 'exp_year', reason: 'Invalid expiry date.'});\r\n        }\r\n\r\n        return {valid: !errors.length, errors: errors};\r\n    }\r\n\r\n\r\n    function stripe() {\r\n        if (!_setupCompleted) {\r\n            setup();\r\n        }\r\n\r\n        return window.Stripe;\r\n    }\r\n\r\n    function cardType(cardNumber) {\r\n        return stripe().card.cardType(cardNumber);\r\n    }\r\n\r\n    var _setupCompleted = false;\r\n\r\n    /***\r\n     * Setup on the first run\r\n     */\r\n    function setup() {\r\n        var key = $('meta[name=\"smore:stripe_public_key\"]').attr('value');\r\n        if (!key) {\r\n            throw \"No stripe key was provided! add meta tag with smore:stripe_public_key to the page\";\r\n        }\r\n\r\n        window.Stripe.setPublishableKey(key);\r\n\r\n        // Mark as completed\r\n        _setupCompleted = true;\r\n    }\r\n\r\n\r\n    // Check if we have the stripe api, if not, load it\r\n    if (!window.Stripe) {\r\n        var script = document.createElement('script');\r\n        script.setAttribute('type', 'text/javascript');\r\n        script.setAttribute('src', 'https://js.stripe.com/v2/');\r\n        document.body.appendChild(script);\r\n    }\r\n\r\n\r\n    return {\r\n        validate: validate,\r\n        cardType: cardType,\r\n        paymentData: paymentData\r\n    };\r\n});", "/* globals Backbone, _ */\n\ndefine('billing/ui/PaymentFormView', function(require) {\n\n    var provider = require('billing/provider');\n    var json = require('fire/util/json');\n    var safe = require('fire/net/safe');\n    var token = require('smore/token');\n    var events = require('billing/events');\n    var pleaseWait = require('fire/ui/pleaseWait');\n\n    // Set the token\n    safe.token(token);\n\n    /***\n     * PaymentFormView.js\n     * ==========\n     *\n     * A modern view to replace paymentForm.js\n     */\n\n\n    /***\n     * Payment form, uses the stripe api\n     *\n     *\n     * Available option keys\n     * ----------------------\n     * - `endpointUrl`          The url to submit the billing data to\n     * - `params`               Extra params to send with the billing data. Useful for 'upgrade_reason' etc.\n     * - `completionUrl`        Optional url to redirect the user to after the purchase. The default will reload the page\n     * - `onSuccess`            Overrides the success behavior\n     *\n     *\n     * @constructor\n     * @class {PaymentFormView}\n     * @extends {Backbone.View}\n     */\n    var PaymentFormView = Backbone.View.extend({\n\n        initialize: function(options) {\n            this.options = options;\n            this.endpointUrl = options.endpointUrl;\n            this.params = options.params;\n            this.completionUrl = options.completionUrl;\n            this.onSuccess = options.onSuccess;\n        },\n\n        events: {\n            /**\n             * Fields events\n             */\n            'keyup .payment-card-number': '_onCardNumberChanged',\n            'change .payment-card-number': '_onCardNumberChanged',\n            'blur .payment-card-number': '_onCardNumberBlur',\n            'keypress .payment-card-number': '_maskNonNumericChars',\n            'keypress .payment-cvc': '_maskNonNumericChars',\n            'blur .payment-name-on-card': '_onNameBlur',\n\n            /***\n             * Submit events\n             */\n\n            'click .submit-button': '_onSubmitFormClicked',\n            'click .supported-cards': '_onSupportedCardsClicked'\n        },\n\n        /**\n         *\n         */\n        render: function() {\n            // Store the fields\n            this._fields = {\n                name: this.$('.payment-name-on-card'),\n                number: this.$('.payment-card-number'),\n                cvc: this.$('.payment-cvc'),\n                exp_month: this.$('.payment-expiration-month'),\n                exp_year: this.$('.payment-expiration-year')\n            };\n        },\n\n        /*********************************************************************************\n         * Handlers\n         *********************************************************************************/\n\n        /***\n         * We use this to update the card type\n         * @param e\n         * @private\n         */\n        _onCardNumberChanged: function(e) {\n            var t = $(e.currentTarget);\n            var val = $.trim(t.val());\n\n            this._setCard(provider.cardType(val));\n        },\n\n        _onCardNumberBlur: function(e) {\n\n        },\n\n        _maskNonNumericChars: function(e) {\n\n        },\n\n        _onNameBlur: function(e) {\n\n        },\n\n        _onSubmitFormClicked: function(e) {\n            // If the button is disabled, return\n            var t = $(e.currentTarget);\n\n            if (pleaseWait.disabled(t)) {\n                return false;\n            }\n\n            // Extract the cc data\n            var data = this._ccData();\n            var validateInfo = provider.validate(data);\n\n            this._updateErrors(validateInfo);\n\n            if (validateInfo.valid) {\n                // Submit\n                this._submitForm(data);\n            }\n\n            // No need to handle errors here, because the `_updateErrors` method will show them\n        },\n\n        _onSupportedCardsClicked: function(e) {\n\n        },\n\n\n        /*********************************************************************************\n         * Form handling\n         *********************************************************************************/\n\n        /***\n         * Show an error message\n         * @param msg\n         * @private\n         */\n        _setError: function(msg) {\n            var err = this.$('.error');\n            if (msg === false) {\n                err.hide();\n            } else {\n                err.show().find('p').text(msg);\n            }\n        },\n\n        _updateErrors: function(validationInfo) {\n            // remove all error class\n            this.$('.cc-validate').removeClass('input-error');\n\n\n            // Go over validation info\n            for (var i = 0; i < validationInfo.errors.length; i++) {\n                var err = validationInfo.errors[i];\n\n                var target = this._fields[err.field];\n\n                if (target) {\n                    target.addClass('input-error');\n                }\n\n            }\n\n            // Our error message is the first error\n            if (validationInfo.errors.length) {\n                this._setError(validationInfo.errors[0].reason);\n            }\n        },\n\n\n        /***\n         * Get credit card data we pass to our provider\n         * @private\n         */\n        _ccData: function() {\n            var data = {};\n\n            // Only get the fields we need\n            var targetFields = _.pick(this._fields, 'number', 'cvc', 'exp_month', 'exp_year', 'name');\n\n            _.each(targetFields, function(field, key) {\n                data[key] = $.trim(field.val());\n            });\n\n            return data;\n        },\n\n\n        /***\n         *\n         * @private\n         */\n        _submitForm: function(ccData) {\n            // Hide all errors\n            this._setError(false);\n\n            var submitButton = this.$('.submit-button');\n            var disabledElements = this.$('.cc-validate, .fire-modal-close');\n\n            // Get billing data from the payment provider\n            var p = provider.paymentData(ccData)\n                .pipe($.proxy(this._onProviderDataSuccess, this));\n\n            // Disable the submit button\n            pleaseWait.wait(p, submitButton, 'Please wait...');\n            // Disable other elements\n            pleaseWait.wait(p, disabledElements);\n\n            // Register fail/success handlers\n\n            p.fail($.proxy(this._onPaymentFailed, this));\n            p.done($.proxy(this._onPaymentSuccess, this));\n        },\n\n        /**\n         * Update the server with the billing data and extra information\n         * @param billingData\n         * @returns {$.Deferred}\n         * @private\n         */\n        _onProviderDataSuccess: function(billingData) {\n            var params = _.extend({billing_data: json.encode(billingData)}, this.options.params || {});\n            return safe.post(this.endpointUrl, params);\n        },\n\n\n        /***\n         * Show an error message if something is wrong\n         * @param err\n         * @private\n         */\n        _onPaymentFailed: function(err) {\n            this._setError(err);\n        },\n\n\n        /***\n         * Handle successful payment\n         * @private\n         */\n        _onPaymentSuccess: function() {\n            var cb = this.onSuccess || this._defaultSuccessHandler;\n\n            cb(this);\n        },\n\n        /***\n         * The default handler refreshes the page after it scrolls it to the top and hides the content\n         *\n         * to override this behavior, use options.onSuccess\n         *\n         * @private\n         */\n        _defaultSuccessHandler: function(self) {\n            // scroll to top\n            $('html,body').scrollTop(0)\n                .hide(); // hide all the content\n\n            // if we have a completion url\n            if (self.completionUrl) {\n                document.location = self.completionUrl;\n            } else {\n                // reload the page\n                document.location.reload();\n            }\n        },\n\n        /*********************************************************************************\n         * Helpers\n         *********************************************************************************/\n\n        /**\n         *\n         * @param cardType\n         * @private\n         */\n        _setCard: function(cardType) {\n            cardType = cardType.toLowerCase().replace(/\\s/g, '-');\n            // Add card icon\n            this.$('.card-type').removeClass('visa american-express diners-club mastercard discover jcb unknown')\n                .addClass(cardType);\n        }\n\n\n    });\n\n\n    return PaymentFormView;\n});", "/* globals Backbone, _ */\n\ndefine('billing/ui/PaidItemConfirmationView', function(require) {\n\n    var safe = require('fire/net/safe');\n    var events = require('billing/events');\n    var pleaseWait = require('fire/ui/pleaseWait');\n\n\n    var PAID_ITEM_ENDPOINT = '/app/billing/purchase_paid_item';\n\n\n    /***\n     * PaidItemConfirmationView\n     *\n     *\n     * Available option keys\n     * ----------------------\n     * - `endpointUrl`          The url to submit the billing data to\n     *\n     *\n     * @constructor\n     * @class {PaidItemConfirmationView}\n     * @extends {Backbone.View}\n     */\n    var PaidItemConfirmationView = Backbone.View.extend({\n\n        initialize: function(options) {\n            this.paidItemKey = options.paidItemKey;\n            this.params = options.params;\n            this.completionUrl = options.completionUrl;\n            this.onSuccess = options.onSuccess;\n        },\n\n        events: {\n            /***\n             * Submit events\n             */\n\n            'click .confirm-button': '_onConfirmButtonClicked'\n        },\n\n        /***\n         * Show an error message\n         * @param msg\n         * @private\n         */\n        _setError: function(msg) {\n            var err = this.$('.error');\n            if (msg === false) {\n                err.hide();\n            } else {\n                err.show().find('p').text(msg);\n            }\n        },\n\n        _onConfirmButtonClicked: function(e) {\n            // If the button is disabled, return\n            var t = $(e.currentTarget);\n\n            if (pleaseWait.disabled(t)) {\n                return false;\n            }\n\n            var params = _.extend({paid_item_key: this.paidItemKey}, this.params || {});\n\n            var p = safe.post(PAID_ITEM_ENDPOINT, params);\n            var disabledItems = this.$('.modal-back-button');\n\n\n            pleaseWait.wait(p, t, 'Please wait...');\n            pleaseWait.wait(p, disabledItems);\n\n            p.done($.proxy(this._onPaymentSuccess, this));\n            p.fail($.proxy(this._onPaymentFailed, this));\n        },\n\n\n        /***\n         * Handle successful payment\n         * @private\n         */\n        _onPaymentSuccess: function() {\n            var cb = this.onSuccess || this._defaultSuccessHandler;\n\n            cb(this);\n        },\n\n        /***\n         * Show an error message if something is wrong\n         * @param err\n         * @private\n         */\n        _onPaymentFailed: function(err) {\n            this._setError(err);\n        },\n\n        /***\n         * The default handler refreshes the page after it scrolls it to the top and hides the content\n         *\n         * to override this behavior, use options.onSuccess\n         *\n         * @private\n         */\n        _defaultSuccessHandler: function(self) {\n            // scroll to top\n            $('html,body').scrollTop(0)\n                .hide(); // hide all the content\n\n            // if we have a completion url\n            if (self.completionUrl) {\n                document.location = self.completionUrl;\n            } else {\n                // reload the page\n                document.location.reload();\n            }\n        }\n\n    });\n\n\n    return PaidItemConfirmationView;\n});", "/* globals Backbone, _ */\n\ndefine(\"components/credits/shareForCredits\", function (require) {\n\n    var pleaseWait = require('fire/ui/pleaseWait');\n    var popup = require('fire/net/popup');\n    var safe = require('fire/net/safe');\n\n    // Apply the offer\n    var OFFER_ENDPOINT = '/app/billing/apply_offer_after_sharing';\n\n    /**\n     * Share for credits view.\n     * ======================\n     *\n     * Handles Facebook and Twitter sharing of Smore and giving the user credits after the Share\n     *\n     *\n     * @class {ShareForCreditsView}\n     * @constructor\n     * @extends {Backbone.View}\n     */\n    var ShareForCreditsView = Backbone.View.extend({\n\n        /****\n         * Setup\n         * =====\n         */\n\n        initialize: function () {\n            // load the twitter api\n            this._twitter();\n        },\n\n        render: function () {\n            // Setup the facebook share callback\n\n            this._facebookButton = this.$('.facebook-share');\n            this._twitterButton = this.$('.twitter-share');\n\n            this._facebookButton.click($.proxy(this._onFacebookButtonClicked, this));\n\n\n            // register to the twitter callback and apply it on the button\n            // The twitter intent api handles opening the popup for us, so no need to handle click events\n            var onTweetCompleted = $.proxy(this._onTweetCompleted, this);\n\n            this._twitter().ready(function (twttr) {\n                // Now bind our custom intent events\n                twttr.events.bind('tweet', onTweetCompleted);\n            });\n        },\n\n\n        /***\n         * Load the twitter api\n         * @private\n         */\n        _twitter: function () {\n            // Clear a fix we added to the social counting\n            if (window.twttr && window.twttr.__smoreFix) {\n                window.twttr = null;\n            }\n\n            window.twttr = (function (d, s, id) {\n                var t, js, fjs = d.getElementsByTagName(s)[0];\n                if (d.getElementById(id)) {\n                    return window.twttr;\n                }\n                js = d.createElement(s);\n                js.id = id;\n                js.src = \"https://platform.twitter.com/widgets.js\";\n                fjs.parentNode.insertBefore(js, fjs);\n                return window.twttr || (t = { _e: [], ready: function (f) {\n                    t._e.push(f);\n                } });\n            }(document, \"script\", \"twitter-wjs\"));\n\n            return window.twttr;\n        },\n\n\n        /****\n         * Handle Tweet and facebook\n         * =========================\n         */\n\n\n        /***\n         * Handle click events on the facebook button\n         * @param e\n         * @private\n         */\n        _onFacebookButtonClicked: function (e) {\n            // Cancel click event\n            e.preventDefault();\n            e.stopPropagation();\n\n            // Get current target\n            var t = $(e.currentTarget);\n            // Do nothing if it's disabled\n            if (pleaseWait.disabled(t)) {\n                return;\n            }\n\n            // Get the popup url\n            var href = t.attr('href');\n\n            var promise = popup.open(href, 500, 400);\n\n            promise = promise.then($.proxy(this._onShareCompleted, this));\n            this._setButtonLoading(promise, t);\n            promise.done($.proxy(this._updateState, this));\n        },\n\n\n        /***\n         * Mark a button as loading,\n         *\n         * Simple error handling\n         *\n         * @param {jQuery.Deferred} promise\n         * @param {jQuery} button\n         * @private\n         */\n        _setButtonLoading: function (promise, button) {\n            promise.fail(function (message) {\n                if (message === 'POPUP_CLOSED') {\n                    return;\n                }\n                window.alert(message);\n            });\n\n\n            // Disable it while the popup is opened / the request is sent to the server\n            pleaseWait.wait(promise, button);\n            pleaseWait.wait(promise, button.find('button span'), 'Facebook window open');\n            pleaseWait.wait(promise, button.find('button p'), 'Share to continue...');\n        },\n\n\n        /***\n         * Handle Tweet completion\n         *\n         * @param intentEvent\n         * @private\n         */\n        _onTweetCompleted: function (intentEvent) {\n            var promise = this._requestOffer('twitter');\n            this._setButtonLoading(promise, this._twitterButton);\n            promise.done($.proxy(this._updateState, this));\n        },\n\n\n        /***\n         *\n         * @param postId\n         * @private\n         */\n        _onShareCompleted: function (postId) {\n            return this._requestOffer('facebook');\n        },\n\n        /****\n         * Utils\n         * =====\n         */\n\n\n\n        /***\n         * Request an offer from the server\n         * @param service\n         * @private\n         */\n        _requestOffer: function (service) {\n            //\n            return safe.post(OFFER_ENDPOINT, {service: service});\n\n        },\n\n\n        /***\n         *\n         * @param {Object} result\n         * @private\n         */\n        _updateState: function (result) {\n\n\n            if (result.facebook) {\n                this._facebookButton.addClass('disabled')\n                    .addClass('has-tooltip').attr('title', 'You already shared on Facebook')\n                    .removeAttr('href');\n\n            }\n\n            if (result.twitter) {\n                this._twitterButton.addClass('disabled')\n                    .addClass('has-tooltip').attr('title', 'You already shared on Twitter')\n                    .removeAttr('href');\n            }\n\n            // Notify the parent modal on successful share\n            this.modal.onShareCompleted(result);\n        }\n    });\n\n    return {\n        ShareForCreditsView: ShareForCreditsView\n    };\n});", "/* globals Backbone, _ */\n\ndefine(\"components/credits/CreditsModal\", function (require) {\n\n    var ModalView = require('smore/ui/views/modal').ModalView;\n\n    // Upgrade view\n    var UpgradeView = require('billing/ui/UpgradeView');\n    var PlanChange = require('billing/PlanChange');\n    var PaymentFormView = require('billing/ui/PaymentFormView');\n    var PaidItemConfirmationView = require('billing/ui/PaidItemConfirmationView');\n    var ShareForCreditsView = require('./shareForCredits').ShareForCreditsView;\n\n\n    var PAID_ITEM_ENDPOINT = '/app/billing/purchase_paid_item';\n\n    var events = require('billing/events');\n\n    /***\n     * CreditsModal\n     * =========\n     *\n     * Show us a credit upgrade modal when the user needs to buy credits.\n     *\n     * This view is responsible for:\n     * - Showing the user the options for upgrade\n     * - Opening up the single time payment modal\n     * - Redirecting the users who choose to upgrade to the pricing page?\n     *\n     * Markup structure\n     * ----------------\n     * this.el -> *           The root element\n     *\n     *\n     * Events\n     * ------\n     *\n     * @class CreditsModal\n     * @extends {smore.ui.views.modal.ModalView}\n     * @constructor\n     */\n    var CreditsModal = ModalView.extend({\n\n        className: 'credits-modal',\n\n        contentEndpoint: '/app/billing/credits_modal_content',\n\n        // Register views\n        subviews: {\n            /***\n             * Setup the billing upgrade view\n             * @param el\n             */\n            'billing-upgrade-confirmation': '_setupPlanUpgradeConfirmation',\n\n            'paid-item-payment-form': '_setupPaidItemForm',\n\n            'paid-item-payment-confirmation': '_setupPaidItemConfirmation',\n\n            // Use the view\n            'share-for-credits-view': ShareForCreditsView\n        },\n\n\n        events: {\n            'click .reload-button': '_onReloadButtonClicked'\n        },\n\n        /*********************************************************************************\n         * Setting up subviews\n         *********************************************************************************/\n\n        _setupPlanUpgradeConfirmation: function (el) {\n            el = $(el);\n\n            var plan = el.data('plan');\n\n            if (!plan) {\n                console.error(\"No data-plan attribute was found for \", el);\n                return null;\n            }\n\n            // New plan change, with the correct upgrade reason\n            var pc = new PlanChange(plan, 'flyer-credits-upgrade-from-credits-modal');\n            var view = new UpgradeView({el: el, planChange: pc, skipReportOpen: true});\n            this.listenTo(view, 'changeCompleted', $.proxy(this._onUpgradeCompleted, this));\n            return view;\n        },\n\n\n        _setupPaidItemForm: function (el) {\n            var paidItemKey = el.data('paid-item');\n            return new PaymentFormView({el: el,\n                params: {paid_item_key: paidItemKey},\n                endpointUrl: PAID_ITEM_ENDPOINT,\n                onSuccess: $.proxy(this._onPaidItemFormPurchase, this)\n            });\n        },\n\n        _setupPaidItemConfirmation: function (el) {\n            var paidItemKey = el.data('paid-item');\n\n            return new PaidItemConfirmationView({el: el,\n                paidItemKey: paidItemKey,\n                onSuccess: $.proxy(this._onPaidItemConfirmPurchase, this)\n            });\n        },\n\n\n        /*********************************************************************************\n         * Handling events and reporting\n         *********************************************************************************/\n\n\n\n        /***\n         * Handle upgrades to pro plans from inside the modal\n         * @private\n         */\n        _onUpgradeCompleted: function (upgradeView) {\n            // report to mixpanel\n            var dfd = this._report(events.Events.upgraded_to_plan_from_credits_modal,\n                {requested_plan: upgradeView.planChange.plan});\n\n            this._hideAndReloadOnCompletion(dfd);\n        },\n\n\n        /***\n         * When a paid item is purchased\n         * @private\n         */\n        _onPaidItemConfirmPurchase: function (confirmationView) {\n            var dfd = this._report(events.Events.completed_flyer_pack_purchase,\n                {requested_flyer_pack: confirmationView.paidItemKey});\n\n            this._hideAndReloadOnCompletion(dfd);\n        },\n\n        /***\n         * Handle completion of paid item forms\n         * @param formView\n         * @private\n         */\n        _onPaidItemFormPurchase: function (formView) {\n            // report to mixpanel\n            var dfd = this._report(events.Events.completed_flyer_pack_purchase,\n                {requested_flyer_pack: formView.params.paid_item_key});\n\n            this._hideAndReloadOnCompletion(dfd);\n        },\n\n        /***\n         * Handle steps activation\n         * @param stepKey\n         */\n        onStepActivated: function (stepKey) {\n\n            switch (stepKey) {\n                // The modal was opened\n                case 'no-credits-info':\n                    this._report(events.Events.opened_credits_modal);\n                    break;\n                // The user has gone to the buying packages intro\n                case 'buy-pack-intro':\n                    this._report(events.Events.opened_flyer_packs_intro);\n                    break;\n\n                case 'buy-pack-single':\n                    this._report(events.Events.opened_flyer_pack_option, {requested_flyer_pack: 'flyer_pack_single'});\n                    this._focusOnCCNumber();\n                    break;\n                case 'buy-pack-basic':\n                    this._report(events.Events.opened_flyer_pack_option, {requested_flyer_pack: 'flyer_pack_basic'});\n                    this._focusOnCCNumber();\n                    break;\n                case 'buy-pack-economy':\n                    this._report(events.Events.opened_flyer_pack_option, {requested_flyer_pack: 'flyer_pack_economy'});\n                    this._focusOnCCNumber();\n                    break;\n\n                case 'upgrade-to-business':\n                    this._report(events.Events.opened_credits_modal_plan_upgrade, {requested_plan: 'silver'});\n                    break;\n\n                case 'upgrade-to-corporate':\n                    this._report(events.Events.opened_credits_modal_plan_upgrade, {requested_plan: 'gold99'});\n                    break;\n\n                // The share-to-get-credit steps\n                case 'share-for-credits':\n                    this._report(events.Events.opened_share_for_credits);\n                    break;\n\n                case 'share-for-credits-success':\n                    // send the share results, so we know which service was used\n                    this._report(events.Events.completed_share_for_credits, this._shareResults);\n                    break;\n\n\n                default:\n                    break;\n            }\n        },\n\n\n        /***\n         * Called from the ShareWithCredits view.\n         *\n         * This will go to the success step and update the classes according to the result\n         * @param result\n         */\n        onShareCompleted: function (result) {\n            this._shareResults = result;\n            this.goStep('share-for-credits-success');\n\n            // the main el\n            var el = this.$('.credits-success-wrapper .main-content');\n\n            el.removeClass('success-facebook success-twitter success-both');\n\n            if (result.facebook && result.twitter) {\n                el.addClass('success-both');\n            } else {\n\n                el.toggleClass('success-facebook', !!result.facebook);\n                el.toggleClass('success-twitter', !!result.twitter);\n            }\n\n\n        },\n\n        /***\n         * Handle clicks on a.reload-button\n         * @private\n         */\n        _onReloadButtonClicked: function () {\n            this._hideAndReloadOnCompletion($.when());\n        },\n\n\n        /*********************************************************************************\n         * Utils\n         *********************************************************************************/\n\n        /***\n         * Hides the dom, reloads page when the given deferred is resolved or rejected\n         *\n         * @param deferred\n         * @private\n         */\n        _hideAndReloadOnCompletion: function (deferred) {\n            // scroll to top\n            $('html,body').scrollTop(0)\n                .hide(); // hide all the content\n\n            // Reload the page\n            deferred.always(function () {\n                document.location.reload();\n            });\n        },\n\n        _report: function (eventName, props) {\n\n            var defaultProps = {\n                credits_modal_context: this.options.openingContext\n            };\n\n            var p = _.extend(defaultProps, props || {});\n\n            return events.report(eventName, p);\n        },\n\n        /***\n         * A helper function to focus the user on the credit card number field\n         * @private\n         */\n        _focusOnCCNumber: function () {\n            if (!this.currentStepEl) {\n                return;\n            }\n\n            var field = this.currentStepEl.find('.payment-card-number');\n\n            // If we have this field, focus on it\n            if (field.length) {\n                setTimeout(function () {\n                    field.focus();\n                }, 50);\n            }\n        }\n    });\n\n\n    return CreditsModal;\n\n});", "define('author/ui/duplicate', function (require) {\n    var safe = require('fire/net/safe');\n    var CreditsModal = require('components/credits/CreditsModal');\n\n    function init() {\n        $('.duplicate-link a').click(duplicateFlyerClicked);\n    }\n\n    function duplicateFlyerClicked() {\n        if (!window.confirm(\"Create a copy of this newsletter and edit the copy?\")) {\n            return;\n        }\n            \n        var parameters = {\n            id: window.pageId\n        };\n\n        safe.post('/app/pages/duplicate', parameters)\n            .done(function (data) {\n                // Data is the URL\n                // Let's just redirect to it\n                document.location.href = data;\n\n            }).fail(function (err, res) {\n            if (res && res.code && res.code === 'no_credits') {\n                // Show the credits modal\n                var modal = new CreditsModal({\n                    overlayClose: true,\n                    allowAccessToolbar: true,\n                    openingContext: 'old-flyer-duplicate'\n                });\n                modal.show();\n            }\n        });\n    }\n\n    $(init);\n});"], "sources": ["js/_consts.js", "js/smore/token.js", "js/smore/isAuthor.js", "js/fire/net/safe.js", "js/fire/net/social.js", "js/fire/util/hub.js", "js/fire/util/json.js", "js/fire/fx/easing.js", "js/lib/fancybox.js", "js/lib/ZeroClipboard.js", "js/lib/autofit.js", "js/lib/waypoints.js", "js/show/widgets/pictures.js", "js/show/widgets/videos.js", "js/fire/util/history.js", "js/fire/util/eventEmitter.js", "js/lib/underscore.js", "js/lib/backbone.js", "js/smore/app/embedder.js", "js/smore/app/hoverPop.js", "js/smore/app/badgeToggle.js", "js/fire/forms/inputError.js", "js/fire/ui/forms/validations.js", "js/fire/ui/forms/field.js", "js/fire/ui/forms/form.js", "js/fire/ui/tinyslide.js", "js/fire/util/functions.js", "js/fire/util/array.js", "js/fire/util/bindable.js", "js/fire/ui/legacy_view.js", "js/fire/ui/view.js", "js/fire/ui/overlay2.js", "js/fire/ui/views/PopoverView.js", "js/fire/ui/overlay.js", "js/fire/util/mobile.js", "js/fire/ui/modal.js", "js/fire/ui/views/ModalView.js", "js/fire/ui/views/WizardView.js", "js/fire/ui/views/WizardStepView.js", "js/fire/ui/views/FormView.js", "js/fire/ui/forms/validators.js", "js/fire/ui/forms/fieldView.js", "js/fire/ui/forms/fields/textFieldView.js", "js/fire/ui/forms/fields/checkboxFieldView.js", "js/fire/ui/forms/fields/radioFieldView.js", "js/fire/ui/forms/fields/hiddenFieldView.js", "js/fire/ui/forms/fields.js", "js/fire/ui/forms/formView.js", "js/smore/ui/login/signupFormView.js", "js/smore/ui/login/loginFormView.js", "js/fire/util/strings.js", "js/fire/net/popup.js", "js/smore/ui/login/facebookConnectView.js", "js/smore/ui/login/googleConnectView.js", "js/smore/util/report.js", "js/smore/ui/login/modal.js", "js/smore/widgetInfo.js", "js/smore/util/url.js", "js/show/linkTracking.js", "js/smore/ui/flash.js", "js/smore/boardLoader.js", "js/fire/util/modernBrowser.js", "js/fire/ui/browserWarning.js", "js/author/ui/settings/privacy.js", "js/author/ui/settings/domain.js", "js/author/ui/settings/gaCode.js", "js/author/ui/settings/modal.js", "js/author/ui/email/test.js", "js/author/ui/email/steps/BeforeSendStep.js", "js/author/ui/email/model.js", "js/author/ui/email/steps/ChooseListStep.js", "js/author/ui/email/steps/EditListStep.js", "js/author/ui/email/steps/ImportStep.js", "js/author/ui/email/steps/NewListStep.js", "js/author/ui/email/steps/QuickSendStep.js", "js/author/ui/email/steps/SendStatusStep.js", "js/author/ui/email/steps/WelcomeStep.js", "js/author/ui/email/steps/EmailErrorsStep.js", "js/author/ui/email/steps/ListEmailErrorsStep.js", "js/author/ui/email/NewsletterWizardView.js", "js/author/ui/email/modal.js", "js/author/ui/clipboard.js", "js/author/ui/print.js", "js/author/ui/email/addEmailToProfile.js", "js/lib/fingerprint.js", "js/smore/util/fingerprint.js", "js/smore/ui/views/overlay.js", "js/fire/ui/raf.js", "js/smore/ui/views/modal.js", "js/fire/ui/pleaseWait.js", "js/educator_community/EducatorsSubmitForm.js", "js/educator_community/educatorShareModal.js", "js/author/ui/tools.js", "js/show/widgets/event.js", "js/billing/ui/ChangePlanView.js", "js/billing/events.js", "js/billing/ui/UpgradeView.js", "js/billing/PlanChange.js", "js/billing/provider.js", "js/billing/ui/PaymentFormView.js", "js/billing/ui/PaidItemConfirmationView.js", "js/components/credits/shareForCredits.js", "js/components/credits/CreditsModal.js", "js/author/ui/duplicate.js"], "version": 3, "names": ["DEVMODE", "STATIC_URI_PREFIX", "define", "require", "token", "m", "document", "cookie", "match", "length", "isAuthor", "$", "attr", "post", "uri", "params", "successFunc", "opts", "extend", "_token", "o", "url", "type", "success", "data", "p", "ajax", "call", "then", "handleRequest", "handleFailedRequest", "done", "error", "fail", "complete", "always", "abort", "setRequestHeader", "getAllResponseHeaders", "getResponseHeader", "jqXhr", "statusText", "dfd", "Deferred", "reject", "GENERIC_ERROR_MESSAGE", "textStatus", "status", "resolve", "result", "message", "iframeEl", "fromForm", "i", "getIframe", "name", "registerCallback", "_iframe_id", "form", "promise", "window", "smore", "_iframeId", "css", "HIDDEN_CSS", "body", "append", "val", "targetFrame", "appendTo", "_body", "method", "target", "action", "enctype", "k", "submit", "callbackForm", "baseForm", "callbackParam", "cbName", "base", "visibility", "width", "height", "position", "left", "top", "iframe", "count", "endpoint", "formatter", "dataType", "pipe", "facebook", "query", "fbFilter", "twitter", "twitterFilter", "pinterest", "pinterestFilter", "_total", "cache", "func", "key", "_cache", "c", "force", "encode", "JSON", "stringify", "decode", "parse", "path", "obj", "fallback", "part", "parts", "split", "cur", "shift", "setPath", "value", "jQuery", "easing", "easeOutQuad", "x", "t", "b", "d", "easeInCubic", "easeOutCubic", "easeOutQuart", "easeOutSine", "Math", "sin", "PI", "easeOutBack", "s", "undefined", "tmp", "loading", "overlay", "wrap", "outer", "content", "close", "title", "nav_left", "nav_right", "loadingTimer", "start_pos", "final_pos", "MIN_WIDTH", "selectedIndex", "selectedOpts", "selectedArray", "currentIndex", "currentOpts", "currentArray", "ajaxLoader", "imgPreloader", "Image", "imgRegExp", "swfRegExp", "loadingFrame", "titleHeight", "titleStr", "busy", "fx", "prop", "isIE6", "browser", "msie", "version", "XMLHttpRequest", "_abort", "hide", "onerror", "onload", "empty", "_error", "onError", "titleShow", "html", "_process_inline", "_start", "href", "str", "emb", "ret", "fn", "fancybox", "defaults", "onStart", "nodeName", "orig", "children", "titleFromAlt", "test", "hasClass", "indexOf", "substr", "autoDimensions", "modal", "overlayShow", "hideOnOverlayClick", "hideOnContentClick", "enableEscapeButton", "showCloseButton", "padding", "parseInt", "margin", "unbind", "bind", "this", "replaceWith", "parent", "is", "insertBefore", "showActivity", "_process_image", "src", "scrolling", "each", "swf", "win", "errorThrown", "_show", "w", "h", "toString", "parseFloat", "wrapInner", "max", "id", "alt", "pos", "equal", "onCleanup", "event", "trigger", "add", "titlePosition", "background-color", "overlayColor", "opacity", "overlayOpacity", "cursor", "filter", "style", "one", "show", "_get_zoom_to", "_process_title", "fadeTo", "changeFade", "finish_resizing", "contents", "_finish", "removeAttr", "border-width", "animate", "duration", "changeSpeed", "easingChange", "step", "_draw", "transitionIn", "_get_zoom_from", "speedIn", "easingIn", "fadeIn", "_format_title", "removeClass", "isFunction", "titleFormat", "addClass", "marginLeft", "marginRight", "outerHeight", "bottom", "paddingLeft", "paddingRight", "_set_navigation", "enableKeyboardNav", "e", "keyCode", "preventDefault", "tagName", "showNavArrows", "cyclic", "support", "get", "removeAttribute", "resize", "centerOnScroll", "center", "Date", "getTime", "onComplete", "_preload_images", "objNext", "dim", "_get_viewport", "scrollLeft", "scrollTop", "ratio", "view", "to", "autoScale", "double_padding", "min", "_get_obj_pos", "offset", "from", "_animate_loading", "clearInterval", "options", "metadata", "blur", "rel", "index", "push", "arguments", "isArray", "j", "merge", "setInterval", "hideActivity", "next", "prev", "cancel", "onCancel", "_cleanup", "fadeOut", "onClosed", "find", "location", "stop", "transitionOut", "speedOut", "easingOut", "align", "init", "click", "mousewheel", "delta", "clientHeight", "scrollHeight", "prependTo", "wmode", "ready", "ZeroClipboard", "clients", "moviePath", "port", "nextId", "thingy", "getElementById", "display", "className", "classes", "idx", "splice", "join", "RegExp", "setMoviePath", "dispatch", "eventName", "args", "client", "receiveEvent", "register", "getDOMObjectPosition", "stopObj", "info", "offsetWidth", "offsetHeight", "offsetLeft", "offsetTop", "offsetParent", "Client", "elem", "handlers", "movieId", "glue", "prototype", "movie", "clipText", "handCursorEnabled", "cssEffects", "appendElem", "stylesToAdd", "domElement", "zIndex", "getElementsByTagName", "box", "div", "createElement", "addedStyle", "appendChild", "innerHTML", "getHTML", "flashvars", "navigator", "userAgent", "protocol", "reposition", "destroy", "removeChild", "setText", "newText", "addEventListener", "toLowerCase", "replace", "setHandCursor", "enabled", "setCSSEffects", "self", "setTimeout", "recoverActive", "len", "countLines", "span", "rects", "getClientRects", "total", "lastTop", "r", "pxToInt", "round", "Number", "fontSize", "clear", "getComputedStyle", "setFontSize", "size", "String", "_debug", "items", "internalAutoFit", "maxSize", "minSize", "maxLines", "curFontSize", "curLines", "guessNextFontSize", "doAutoFit", "maxFontSize", "minFontSize", "priority", "nextFontSize", "minLinesCount", "MINIMUM_FONT_SIZE_IN_PX", "dataAttribute", "defaultValue", "getAttribute", "getSpecialSize", "baseSize", "attributeName", "+=", "-=", "sign", "autoFitSpan", "baseFontSize", "disableRTL", "finalSize", "normalizeRatio", "MAX_RATIO", "isDisabled", "autofit", "el", "when", "n", "slice", "amd", "l", "f", "u", "a", "y", "v", "g", "horizontal", "vertical", "$element", "element", "didResize", "didScroll", "oldScroll", "waypoints", "doScroll", "settings", "scrollThrottle", "resizeThrottle", "newScroll", "forward", "backward", "sort", "reverse", "continuous", "refresh", "isWindow", "contextOffset", "contextScroll", "contextDimension", "offsetProp", "apply", "ceil", "onlyOnScroll", "checkEmpty", "isEmptyObject", "axis", "callback", "handler", "context", "triggerOnce", "disable", "enable", "getWaypointsByElement", "map", "closest", "_invoke", "_traverse", "aggregate", "inArray", "pushStack", "isPlainObject", "viewportHeight", "innerHeight", "unique", "above", "_filter", "below", "right", "extendFn", "load", "setup", "addMagnify", "pics", "array", "description", "htmlDesc", "cls", "decodeURIComponent", "pictures", "pic", "widget", "parents", "first", "widget_id", "hub", "WIDGET_CLASS_REGEX", "onMessage", "originalEvent", "origin", "vimeo", "youtube", "getVideoInfo", "frame", "json", "player_id", "_isPlaying", "playerState", "contentWindow", "postMessage", "registerYoutube", "setupYoutube", "YOUTUBE_SELECTOR", "forEach", "_win", "on", "HISTORY_ID", "HISTORY_KEY", "StateHelper", "getKey", "onHistoryPopState", "state", "current", "history", "pushState", "pop", "remove", "off", "getHelper", "Emitter", "__ev", "_guid", "getGuid", "__findCallbackIdx", "guid", "ref", "Array", "root", "previousUnderscore", "_", "breaker", "ArrayProto", "ObjProto", "Object", "FuncProto", "Function", "concat", "hasOwnProperty", "nativeForEach", "nativeMap", "nativeReduce", "reduce", "nativeReduceRight", "reduceRight", "nativeFilter", "nativeEvery", "every", "nativeSome", "some", "nativeIndexOf", "nativeLastIndexOf", "lastIndexOf", "nativeIsArray", "nativeKeys", "keys", "nativeBind", "_wrapped", "exports", "module", "_underscore", "VERSION", "iterator", "collect", "results", "list", "reduceError", "foldl", "inject", "memo", "initial", "TypeError", "foldr", "detect", "any", "select", "all", "identity", "contains", "include", "invoke", "isFunc", "pluck", "where", "attrs", "isEmpty", "findWhere", "Infinity", "computed", "shuffle", "rand", "shuffled", "random", "sample", "guard", "lookupIterator", "sortBy", "criteria", "group", "behavior", "groupBy", "has", "indexBy", "countBy", "sortedIndex", "low", "high", "mid", "toArray", "values", "head", "take", "last", "rest", "tail", "drop", "compact", "flatten", "input", "shallow", "output", "isArguments", "without", "difference", "uniq", "isSorted", "seen", "union", "intersection", "item", "other", "zip", "object", "hasIndex", "range", "start", "ctor", "bound", "partial", "bindAll", "funcs", "Error", "memoize", "hasher", "delay", "wait", "defer", "throttle", "timeout", "previous", "later", "leading", "now", "remaining", "clearTimeout", "trailing", "debounce", "immediate", "timestamp", "callNow", "once", "ran", "wrapper", "compose", "after", "times", "pairs", "invert", "functions", "methods", "names", "source", "pick", "copy", "omit", "clone", "isObject", "tap", "interceptor", "eq", "aStack", "bStack", "global", "multiline", "ignoreCase", "aCtor", "constructor", "bCtor", "isEqual", "isString", "isElement", "nodeType", "isFinite", "isNaN", "isNumber", "isBoolean", "isNull", "isUndefined", "noConflict", "accum", "floor", "entityMap", "escape", "&", "<", ">", "\"", "'", "unescape", "entityRegexes", "string", "property", "mixin", "idCounter", "uniqueId", "prefix", "templateSettings", "evaluate", "interpolate", "noMatch", "escapes", "\\", "\r", "\n", "\t", "\u2028", "\u2029", "escaper", "template", "text", "render", "matcher", "variable", "chain", "_chain", "factory", "Backbone", "Zepto", "ender", "previousBackbone", "emulateHTTP", "emulateJSON", "Events", "eventsApi", "_events", "events", "ctx", "_callback", "retain", "ev", "allEvents", "triggerEvents", "stopListening", "listeningTo", "_listeningTo", "_listenId", "eventSplitter", "a1", "a2", "a3", "listenMethods", "listenTo", "listenToOnce", "implementation", "Model", "attributes", "cid", "collection", "set", "changed", "initialize", "validationError", "idAttribute", "toJSON", "sync", "unset", "changes", "silent", "changing", "_validate", "_changing", "_previousAttributes", "_pending", "hasChanged", "changedAttributes", "diff", "old", "previousAttributes", "fetch", "model", "resp", "wrapError", "save", "xhr", "validate", "serverAttrs", "isNew", "patch", "urlError", "encodeURIComponent", "isValid", "modelMethods", "unshift", "Collection", "models", "comparator", "_reset", "reset", "setOptions", "addOptions", "singular", "_byId", "_removeReference", "existing", "at", "targetModel", "sortable", "sortAttr", "toAdd", "toRemove", "modelMap", "order", "_prepareModel", "_addReference", "orderedModels", "previousModels", "create", "_onModelEvent", "attributeMethods", "View", "viewOptions", "_ensureElement", "delegateEvents", "delegateEventSplitter", "selector", "$el", "setElement", "delegate", "undelegateEvents", "methodMap", "contentType", "_method", "beforeSend", "processData", "noXhrPatch", "ActiveXObject", "dispatchEvent", "update", "delete", "read", "Router", "routes", "_bindRoutes", "optionalParam", "namedParam", "splatParam", "escapeRegExp", "route", "isRegExp", "_routeToRegExp", "router", "fragment", "_extractParameters", "execute", "navigate", "optional", "exec", "param", "History", "routeStripper", "rootStripper", "isExplorer", "trailingSlash", "pathStripper", "started", "interval", "atRoot", "pathname", "getHash", "getFragment", "forcePushState", "_hasPushState", "_wantsHashChange", "decodeURI", "search", "hashChange", "_wantsPushState", "docMode", "documentMode", "oldIE", "checkUrl", "_checkUrlInterval", "loc", "hash", "replaceState", "loadUrl", "assign", "_updateHash", "open", "protoProps", "staticProps", "child", "Surrogate", "__super__", "fire", "provide", "Embedder", "_el", "_content", "_isFixed", "_setupEvents", "proxy", "popover", "_embedCodeBox", "focus", "_updateEmbedCode", "_shortUrl", "_setupClipboard", "_url", "_generateEmbedCode", "_clipboardSet", "_setupClipboardButton", "button", "clip", "cb", "tipsy", "fade", "org", "format", "HoverPop", "_delay", "_DEFAULT_DELAY_TIME", "_setupCard", "mouseenter", "_onElMouseEnter", "mouseleave", "_onElMouseLeave", "_pop", "_getRequest", "_active", "_tryShowCard", "delayed", "_positionPop", "outerWidth", "pw", "_request", "lb", "sal", "hal", "slideDown", "slideUp", "forms", "InputError", "_setup", "_errorBox", "setError", "removeError", "displayError", "hideError", "hiddenEl", "hideAllErrors", "ui", "validations", "regexpValidator", "validateRegexp", "filterRegex", "coerce", "ERROR_MESSAGE", "email", "phone", "exp", "slugMatch", "screenname", "field", "setupField", "changeCallback", "setupValidation", "getErrorBox", "ERROR_BOX_CLASS", "_validator", "validateAndCoerce", "_isRequired", "setValid", "INPUT_ERROR_CLASS", "INPUT_VALID_CLASS", "showError", "trim", "onKeyUp", "_delayedValidation", "onBlur", "onClipboardTextChange", "onKeyPress", "isRelevantKey", "fromCharCode", "which", "stopPropagation", "ctrlKey", "altKey", "metaKey", "keyup", "keypress", "VALIDATION_DELAY", "CACHE_KEY", "getField", "getFieldElements", "formEl", "makeArray", "validField", "setupForm", "submitEl", "_fields", "toggleClass", "DISABLED_CLASS", "onFormSubmit", "getForm", "tinyslide", "isIE", "ANIMATION_TIME", "ACTIVE_CLASS", "slide", "els", "DELAY", "progress", "siblings", "_current", "ITEM_SELECTOR", "CONTAINER_CLASS", "_proto", "time", "scope", "_timeout", "buffered", "_args", "elementCached", "cacheKey", "triggers", "inherits", "parentCtor", "TempCtor", "proto", "abortable", "aborted", "normalize", "objectKeys", "end", "FORMAT_REGXP", "POLYFILLS", "removeBy", "lambda", "insert", "origItem", "insertAfter", "minus", "secondArray", "arr", "setPush", "sum", "toObject", "propertyIsEnumerable", "elt", "res", "Bindable", "_ev", "util", "bindable", "_setupEl", "beforeRemove", "removed", "_extractEvents", "undelegate", "firstSpace", "substring", "handlerName", "hasProp", "em", "superClass", "defaultOptions", "_modifiers", "generate", "autoRender", "cssClass", "selEl", "templateSelector", "eventDict", "extractEvent", "_this", "addModifier", "modifier", "allowDomUpdate", "hasModifier", "removeModifier", "modifiers", "me", "FADE_DURATION", "Overlay", "SHIM_CLS", "Z_INDEX", "_doc", "clickCallback", "extraClass", "z-index", "prepend", "MARKUP", "PopoverView", "overlayClose", "targetEl", "onOverlayClicked", "positionHook", "afterShow", "fixed", "isAbove", "popoverWidth", "targetWidth", "calculateLeft", "fixPlaceholders", "targetLeft", "originalLeft", "viewportWidth", "pf", "placeholderPolyfill", "onClose", "unmask", "mask", "maskEl", "before", "closeOnClick", "overflow", "scrollWidth", "isLandscape", "isMiniLayout", "isMobile", "isPhone", "isPortrait", "isRetina", "isTablet", "mq", "q", "matchMedia", "msMatchMedia", "matches", "showUrl", "showDeferred", "deferred", "getLoading", "_contentWrap", "getError", "MODAL_CLASS", "DEFAULTS", "loadingTitle", "loadingSubtitle", "_options", "_isPhone", "showPhone", "containerEl", "skipOverlay", "oc", "OVERLAY_CLASS", "overlayClass", "resolveBeforeAnimation", "containerHeight", "containerWidth", "screenWidth", "innerWidth", "screenHeight", "modalClass", "dom", "onCloseClicked", "margin-top", "ANIMATION_DURATION", "fast", "closePhone", "unlock", "detach", "showBodyItems", "_prePhoneScrollTop", "hideBodyItems", "MOBILE_MODAL_CLASS", "_hiddenBodyItems", "lock", "_locked", "stopImmediatePropagation", "currentTarget", "mobile", "isTouch", "ModalView", "url1", "onModalCompleted", "enableHistory", "historyHelper", "preload", "getContent", "PRELOAD_CACHE", "modalOptions", "setupModalEvents", "closed", "_loadedContent", "_loadContent", "preloadUrl", "WizardView", "startStep", "stack", "steps", "goTo", "setupHistoryTracking", "back", "backStep", "upcomingStep", "getBackStep", "_popStatesUpTo", "_setStep", "stepName", "newStep", "_getStepClass", "targetStep", "WizardStepView", "wizard", "FieldView", "FormView", "vw", "FIELDS_SELECTOR", "FORM_STATES", "Empty", "Good", "submitButton", "fields", "notifyError", "canSubmit", "delayedValidation", "validateKeys", "isCheckbox", "ERROR_CLASS", "change", "RequiredValidator", "VALIDATORS", "Validator", "fromField", "field1", "required", "DEFAULT_REQUIRED_MESSAGE", "isFieldMatch", "fieldView", "validatorClass", "validators", "setupInputEvents", "setupValidators", "inputEl", "onInputFocus", "onInputBlur", "onChanged", "validateField", "setInvalid", "errorSpan", "fromEl", "selectors", "subclass", "console", "FIELD_VIEW_SELECTOR", "TextFieldView", "fv", "onInput", "onClipboardTextChanged", "CheckboxFieldView", "RadioFieldView", "radios", "HiddenFieldView", "ErrorCollection", "safe", "ERROR_BOX_SELECTOR", "SUBMIT_BUTTON_SELECTOR", "pleaseWaitText", "fieldSelector", "deliveryMethod", "validationErrorMessage", "deliveryDelay", "setupFields", "setupSubmitButton", "errorBox", "results1", "submitText", "submitButtonText", "onSubmitButtonClicked", "validateForm", "deliverForm", "cleanup", "hideErrors", "onDeliveryCompleted", "onDeliveryFailed", "errors", "processServerErrors", "showErrors", "error_collection", "extraParams", "errorCollecion", "fieldName", "ref1", "SignupFormView", "errorMessage", "errorData", "errorCollection", "firstProblem", "problem", "problems", "code", "LoginFormView", "varArgs", "reg", "popup", "handleResult", "NO_DATA_CODE", "_callbackId", "popUrl", "setupUrl", "popRef", "openPopup", "POPUP_CLOSED", "tryAbort", "closeCb", "frameName", "popupSettings", "FacebookConnectView", "POPUP_SIZE", "connectUrl", "textSpan", "onConnectClicked", "generateUrl", "onPopupComplete", "onPopupFailed", "connectParams", "buttonId", "signupSegment", "connectType", "is_new", "GoogleConnectView", "setupGoogleConnect", "gapi", "auth2", "client_id", "__google_connect_client_id", "cookiepolicy", "error1", "log", "getAuthInstance", "signIn", "onGoogleConnectSuccess", "onGoogleConnectError", "onServerSignupWithGoogle", "googleUser", "idtoken", "getAuthResponse", "id_token", "MIXPANEL_TIMEOUT", "_uniqueEvents", "getAbTestValues", "track", "props", "analytics", "ab", "CONTENT_ENDPOINT", "DEFAULT_AFTER_SUCCESS_URL", "LoginModalView", "MODAL_OPTIONS", "autoLogin", "fbv", "googleConnectView", "isLoggedIn", "lfv", "mv", "report", "sfv", "EVENTS", "login_modal_open", "click .switch-state", "segment", "signupParams", "signup_button", "_signupSegment", "loginForm", "onSuccess", "signupForm", "signupGoogleConnect", "fbc", "msg", "onSignupFailed", "loginGoogleConnect", "onLoginFailed", "signupfbConnect", "loginfbConnect", "setState", "setupDisableState", "fbConnect", "googleConnect", "onSwitchStateClicked", "ga", "reloadOnly", "reload", "redirect_url", "handleFailure", "DATA_KEY", "EMPTY_INFO", "_loc", "baseDomain", "domain", "full", "hostname", "SELECTOR", "setupTracking", "anchorEl", "widgetInfo", "trackHref", "END_POINT", "FLYER_SHORT_KEY", "o-href", "track-href", "onFirstTouchStart", "onFirstMouseDown", "linkEl", "onMouseDown", "onMouseUp", "onMouseOut", "onClick", "setHref", "ie", "hideFlash", "FLASH_SELECTOR", "FLASH_TIMEOUT", "_key", "_skip", "_loading", "updateAndFilterLoaded", "waypoint", "fetchMore", "flyers", "FLYER_SELECTOR", "_loaded", "dir", "skip", "STEP", "pushResult", "errorLoading", "response", "prevAll", "isModern", "_modernizr", "boxshadow", "borderradius", "canvas", "hsla", "rgba", "cssText", "z", "A", "B", "C", "D", "charAt", "toUpperCase", "documentElement", "getContext", "backgroundColor", "E", "_version", "_prefixes", "_domPrefixes", "_cssomPrefixes", "testProp", "testAllProps", "warningModal", "enableCheck", "modernBrowser", "modalEl", "go", "_privacy", "onPrivacyButtonClicked", "setValue", "onBoxChanged", "onTestDomainClicked", "_value", "db", "_valid", "verify", "skipInvalid", "showSuccess", "getErrorMessage", "page_link", "quick", "TEST_DOMAIN_END_POINT", "page_id", "pageId", "domainBox", "UA_REGEXP", "MODAL_ENDPOINT", "_flyerId", "setupModal", "open_modal", "validTest", "valid", "gaCode", "_saveButton", "setupCheckboxes", "privacy", "_validInterval", "onAccordionItemClicked", "audienceCollectionCheckbox", "isChecked", "header", "nextAll", "updatesMailingListId", "allow_social", "getCheckboxValue", "allow_related", "allow_profile", "allow_branding", "allow_contact_author", "allow_collect_audience", "updates_mailing_list_id", "google_analytics_code", "_originalSaveText", "SETTINGS_SAVE_ENDPOINT", "onSaveComplete", "onSaveFailed", "alert", "checkboxes", "onTogglerClicked", "lbl", "getPreview", "previews", "getCheckbox", "TEST_EMAIL_ENDPOINT", "TestEmailPopover", "onTestFailed", "onTestCompleted", "toggleTestButton", "click .send-test-email", "targetEmail", "testButton", "getTargetEmail", "onSendTestEmailClicked", "toEmailConfig", "err", "BeforeSendStep", "EditSenderPopover", "GET_SEND_INFO_ENDPOINT", "INVALID_EMAILS_REGEX", "sv", "_onSendInfoError", "_onSendInfoLoaded", "saveState", "click .send-button", "click .edit-list", "click .edit-sender", "click #save-to-list-checkbox", "subject", "note", "sendButton", "saveToListCheckbox", "_canSend", "toggleSendButton", "updateRecipientsInfo", "updateSender", "editSenderPopover", "isQuickSend", "saveToList", "onSaveToListClicked", "onEditListClicked", "onSendButtonClicked", "onEditSenderClicked", "fromName", "fromAddress", "canSend", "subj", "emails", "selectedList", "recipientsEl", "statusEl", "can_send", "_pluralizeHelper", "reason", "show_upgrade", "plural", "click .save-button", "onSaveButtonClicked", "saveButton", "nameEl", "addressEl", "onTextChanged", "address", "isLegalEmail", "GET_LISTS_ENDPOINT", "ListInfo", "NEW_LIST_ENDPOINT", "QuickSendList", "SEND_LIST_ENDPOINT", "SEND_QUICK_ENDPOINT", "ServerList", "UPDATE_LIST_ENDPOINT", "VALIDATE_EMAILS_ENDPOINT", "fromServerList", "getLists", "invalidStatsFromServer", "listUpdateProblems", "newList", "sendList", "sendQuickList", "updateList", "unsubscribed", "id1", "name1", "fromServer", "validCount", "valid_count", "invalidCount", "invalid_count", "invalidRows", "invalid_emails", "validation_errors", "emailListString", "email_str", "list_id", "config", "ChooseListStep", "renderLists", "updateListInfo", "click .continue-button", "click .create-new-list", "click ul.lists li", "dblclick ul.lists li", "continueButton", "editListCheckbox", "lists", "loadLists", "onContinueButtonClicked", "isEdit", "toggleContinueButton", "toggleForcedEdit", "checked", "disabled", "sl", "_lists", "listById", "li", "onListItemSelected", "onListItemDblClicked", "onCreateListButtonClicked", "EditListStep", "onUpdateListFailed", "onUpdateListCompleted", "click .skip-button", "click .import-button", "skipButton", "textarea", "_buttonText", "updateValidation", "onSkipButtonClicked", "onImportButtonClicked", "ImportStep", "NewListStep", "onNewListFailed", "onNewListCreated", "listName", "newListName", "QuickSendStep", "onValidateEmailsFailed", "onValidateEmailsCompleted", "hasInvalidEmails", "SendStatusStep", "click .go-back", "_send", "onSendingCompleted", "errorMsg", "onSendingFailed", "showSection", "resultPromise", "onGoBackClicked", "CREDITS_ENDPOINT", "WelcomeStep", "click .quick-send", "click .choose-list", "click .new-list", "usesOrgWideEmailCreditPool", "hasUnlimitedEmailCredits", "loadLimitations", "onChooseListClicked", "onQuickSendClicked", "onNewListClicked", "EmailErrorsStep", "click .edit-button", "listHtml", "listItem", "invalidEmailsCount", "validEmailsCount", "onEditButtonClicked", "ListEmailErrorsStep", "_showError", "_onUpdateComplete", "_onCreateComplete", "_forceUpdateList", "_forceCreateList", "Context", "NewsletterWizardView", "wv", "chooseList", "editList", "importStep", "quickSend", "sendStatus", "welcome", "emailErrors", "listEmailErrors", "importPreview", "importFileError", "personal_message", "from_name", "from_email", "NewsletterModalView", "flyerId", "click .test-email", "defaultFirstStep", "firstStep", "wizardContainer", "testEmailPopover", "onTestButtonClicked", "PrintPopoverView", "_id", "_short", "pv", "print_open_popover", "print_clicked_print", "print_cancel_generation", "print_error_on_generation", "print_downloaded_jpg", "print_success", "DOWNLOAD_JPG_ENDPOINT", "DOWNLOAD_JPG_IFRAME_ENDPOINT", "MAX_PAGE_HEIGHT", "MAX_PAGE_HEIGHT_ERROR", "PLEASE_WAIT_POPUP_ENDPOINT", "POPOUP_WIDTH", "POPUP_HEIGHT", "PRINTING_MASK_HTML", "PRINT_ENDPOINT", "click .print-button", "click .download-jpg-button", "buttons", "label", "checkbox", "highQuality", "testPageLength", "onCancelPrint", "printing", "onPrintButtonClicked", "startPrintFlyer", "onDownloadJpgClicked", "download", "show_branding", "showBrandingValue", "high_quality", "highQualityValue", "onDownloadCompleted", "onPrintFailed", "generateTarget", "onPrintCompleted", "targetName", "onPopupClosed", "flyer_id", "AddEmailToProfile", "Fingerprint", "screen_resolution", "screen_orientation", "ie_activex", "language", "screen", "colorDepth", "resolution", "getScreenResolution", "getTimezoneOffset", "hasSessionStorage", "hasLocalStorage", "indexedDB", "cpuClass", "platform", "doNotTrack", "getPluginsString", "isCanvasSupported", "getCanvasFingerprint", "x64hash128", "x64Add", "x64Multiply", "x64Rotl", "x64LeftShift", "x64Xor", "x64Fmix", "seed", "remainder", "bytes", "h1", "h2", "k1", "k2", "c1", "c2", "charCodeAt", "localStorage", "sessionStorage", "appName", "getIEPluginsString", "getRegularPluginsString", "plugins", "mimeTypes", "mt", "suffixes", "txt", "textBaseline", "font", "fillStyle", "fillRect", "fillText", "toDataURL", "fingerprint", "fp", "REPORTING_ENDPOINT", "OverlayView", "allowAccessToolbar", "scrollContainer", "_onOverlayClicked", "clickedOnOverlay", "container", "getContainer", "getMinHeight", "transitionEnd", "queue", "_queue", "_isLegacy", "executeQueue", "LEGACY_TIMEOUT", "_raf", "_runningQueue", "queueOrInline", "requestAnimationFrame", "mozRequestAnimationFrame", "webkitRequestAnimationFrame", "msRequestAnimationFrame", "raf", "hideClose", "modalType", "contentEndpoint", "useSafePost", "contentParams", "click .fire-modal-close", "click .go-to-step", "click .go-to-next-step", "click .go-to-prev-step", "click .go-back-step", "_stepsStack", "renderContent", "templateContent", "isFixedModal", "_startStep", "_wrapper", "pending", "showLoading", "_onShowLoadingDone", "_onShowLoadingFailed", "_setHtml", "getLoadingContent", "setupHistory", "setupSteps", "setupSubviews", "onShow", "getErrorContent", "onCompleted", "parentNode", "minTop", "_closeModal", "cancelReason", "internalWrapper", "_historyHelper", "subviews", "viewCls", "targetFn", "_stepEls", "goStep", "_getStepEl", "stepKey", "skipStack", "stepEl", "_currentSection", "currentStepEl", "onStepActivated", "goBackStep", "_stepIdx", "nextStep", "prevStep", "_onHistoryPopState", "_onCloseClicked", "_onNextStepClicked", "_onPrevStepClicked", "_onGoStepClicked", "_onBackStepClicked", "waitText", "_currentText", "pleaseWait", "SHARE_SUBMIT_ENDPOINT", "EducatorsSubmitForm", "onShareSubmitDone", "selectedCategory", "allowedToSubmit", "_guidelinesCheckbox", "_submitButton", "_flyerDescriptionInput", "_categoryButtons", "_onSubmitButtonClicked", "_onGuidelinesClicked", "selectedButton", "_onCategoryButtonClicked", "_validateForm", "selectedButtonEl", "_isAgreedToGuidelines", "_isCategorySelected", "_toggleSubmitButton", "_flyerDescription", "isActive", "_getSubmitUrl", "category", "educatorShareModal", "EducatorShareModal", "isShown", "educators-submit-form", "_setupEducatorsSubmitForm", "_setupIntroStep", "_onShareSubmitDone", "intro", "analyticsModal", "openEducatorShareModal", "browserWarning", "settingsModal", "clipboard", "emailModal", "addEmail", "printPP", "print", "EventRSVPView", "FLYER_ID", "RSVP_ENDPOINT", "RSVP_SELECTOR", "formView", "setupRsvp", "SUCCESS_TEXT", "_success", "_subEmail", "_form", "page", "onFormSucceed", "CHANGE_PLAN_ENDPOINT", "ChangePlanView", "planChange", "click button.confirm-button", "skipReportOpen", "reportOpen", "_onConfirmButtonClicked", "toServer", "onChangePlanCompleted", "onChangePlanFailed", "reportCompleteChange", "errorText", "getParameterByName", "regexS", "regex", "extraProps", "_upgradeReason", "upgrade_reason", "PREFIX", "opened_pricing_page", "opened_education_pricing_page", "opened_education_bulk_page", "opened_standalone_upgrade_page", "clicked_choose_this_plan", "signup_modal_opened", "signup_modal_closed", "entered_name_in_signup_form", "entered_cc_in_signup_flow", "clicked_completed_purchase", "validation_error_before_complete_purchase", "server_error_in_signing_up", "signup_complete", "focused_on_cc_field", "focused_on_name_field", "focused_on_cvc_field", "opened_downgrade_modal", "opened_upgrade_modal", "completed_upgrade", "completed_downgrade", "opened_cancel_modal", "completed_cancel", "took_cancel_offer", "opened_credits_modal", "opened_credits_modal_plan_upgrade", "upgraded_to_plan_from_credits_modal", "opened_flyer_packs_intro", "opened_flyer_pack_option", "opened_share_for_credits", "completed_share_for_credits", "completed_flyer_pack_purchase", "opened_switch_to_yearly_plan_page", "UpgradeView", "requested_plan", "plan", "PlanChange", "upgradeReason", "coupon", "coupon_code", "paymentData", "ccData", "stripe", "createToken", "stripe_token", "provider", "PROVIDER_KEY", "card", "validateCardNumber", "number", "validateCVC", "cvc", "validateExpiry", "exp_month", "exp_year", "_setupCompleted", "Stripe", "cardType", "cardNumber", "setPublishableKey", "script", "setAttribute", "PaymentFormView", "endpointUrl", "completionUrl", "keyup .payment-card-number", "change .payment-card-number", "blur .payment-card-number", "keypress .payment-card-number", "keypress .payment-cvc", "blur .payment-name-on-card", "click .submit-button", "click .supported-cards", "_onCardNumberChanged", "_setCard", "_onCardNumberBlur", "_maskNonNumericChars", "_onNameBlur", "_onSubmitFormClicked", "_ccData", "validateInfo", "_updateErrors", "_submitForm", "_onSupportedCardsClicked", "_setError", "validationInfo", "targetFields", "disabledElements", "_onProviderDataSuccess", "_onPaymentFailed", "_onPaymentSuccess", "billingData", "billing_data", "_defaultSuccessHandler", "PAID_ITEM_ENDPOINT", "PaidItemConfirmationView", "paidItemKey", "click .confirm-button", "paid_item_key", "disabledItems", "OFFER_ENDPOINT", "ShareForCreditsView", "_twitter", "_facebookButton", "_twitterButton", "_onFacebookButtonClicked", "onTweetCompleted", "_onTweetCompleted", "twttr", "__smoreFix", "js", "fjs", "_e", "_onShareCompleted", "_setButtonLoading", "_updateState", "intentEvent", "_requestOffer", "postId", "service", "onShareCompleted", "CreditsModal", "billing-upgrade-confirmation", "paid-item-payment-form", "paid-item-payment-confirmation", "share-for-credits-view", "click .reload-button", "_setupPlanUpgradeConfirmation", "pc", "_onUpgradeCompleted", "_setupPaidItemForm", "_onPaidItemFormPurchase", "_setupPaidItemConfirmation", "_onPaidItemConfirmPurchase", "upgradeView", "_report", "_hideAndReloadOnCompletion", "confirmationView", "requested_flyer_pack", "_focusOnCCNumber", "_shareResults", "_onReloadButtonClicked", "defaultProps", "credits_modal_context", "openingContext", "duplicateFlyerClicked", "confirm", "parameters"], "file": "/js/page.a1289406.js"}