{"mappings": "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", "sourcesContent": ["\n\n        var DEVMODE=false;\n        var STATIC_URI_PREFIX=\"https://s.smore.com/\";\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}));", "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", "/*\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 * @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});", "/*\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});", "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;", "// 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", "// 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 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\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", "// 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\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", "define('show/pageEvents', function (require) {\r\n    var hub = require('fire/util/hub');\r\n    var isAuthor = require('smore/isAuthor');\r\n\r\n\r\n    // require waypoints.js\r\n    // require store.js\r\n\r\n\r\n    function setup() {\r\n        // set reached the end of page\r\n        $('#end-of-page').waypoint(reachedEndOfPage, {offset: '120%'});\r\n    }\r\n\r\n    function reachedEndOfPage(e, dir) {\r\n        var key = window.pageId + '_reached_bottom';\r\n        if (store.get(key)) return;\r\n        if (dir === 'down') {\r\n            hub.trigger('show:reached_end_of_page');\r\n            store.set(key, true);\r\n        }\r\n    }\r\n\r\n\r\n    if (!isAuthor()) $(setup);\r\n});", "/****\r\n * @fileOverview reports on all the stored events\r\n ****/\r\n\r\ndefine('show/reporter', function (require) {\r\n    var hub = require('fire/util/hub');\r\n    var token = require('smore/token');\r\n    var safe = require('fire/net/safe');\r\n    var json = require('fire/util/json');\r\n\r\n\r\n    // todo replace this with a proper entrypoint for show\r\n    // sets the safe posts token\r\n    safe.token(token);\r\n\r\n    var END_POINT = '/app/reporting/page_event/';\r\n\r\n    function pageEvent(key, widget, target) {\r\n        if (!window.pageId || !key) return;\r\n        var d = {event_key:key};\r\n        if (widget) d.widget = widget;\r\n        if (target) d.target = target;\r\n\r\n        return safe.post(END_POINT + window.pageId, d);\r\n    }\r\n\r\n    function onReachEndOfPage(e) {\r\n        pageEvent('reached_bottom');\r\n    }\r\n\r\n\r\n    function onVideoPlayed(e, info) {\r\n\r\n    }\r\n\r\n    /**************************** REGISTER EVENTS ************************************/\r\n\r\n        // end of page\r\n    hub.on('show:reached_end_of_page', onReachEndOfPage);\r\n\r\n    // === widgets ===\r\n    hub.on('widgets:video:played', onVideoPlayed);\r\n    hub.on('widgets:audio:played');\r\n\r\n\r\n});\r\n", "/* globals _ */\n\ndefine('show/mobile', function (require) {\n    /***\n     * Mobile related fixes for show pages\n     *\n     */\n\n    var mobile = require('fire/util/mobile');\n\n    var REMOVE_ON_MOBILE_SELECTOR = $('.no-tablet, .only-screenshot, .remove-on-mobile');\n\n    /***\n     * Fix the mobile header RTL by querying the DOM of the header widget and testing for span.rtl elements\n     *\n     * Notes:\n     *  - Why not do it on the server side\n     *      Our server side code (as well as the client side code in the editor) tests for RTL during rendering only,\n     *      and our mobile headers are being rendered as part of the show page, OUTSIDE of the the flyer rendering\n     *      process. This will likely changed on the upcoming versions of the editor.\n     */\n    function mobileHeaderRTLfix() {\n        var headerWidget = $('.widget-header-text');\n        var mobileHeader = $('.mini-flyer-header');\n\n        // Go over all the selectors\n        _.each(['.theme-title', '.theme-subtitle'], function (selector) {\n\n            if (headerWidget.find(selector + ' span.rtl').length) {\n                mobileHeader.find(selector).css('direction', 'rtl');\n            }\n        });\n\n    }\n\n\n    /***\n     * Remove mobile elements, add the window.smoreIsPhone property\n     */\n    function removeMobileElements() {\n\n        // Remove non mobile elements\n        if (mobile.isMobile()) {\n            $(REMOVE_ON_MOBILE_SELECTOR).remove();\n        }\n\n        if (mobile.isPhone()) {\n            $('.no-mobile, .no-mobile iframe').remove();\n\n            // Set the global \"smoreIsPhone\"\n            window.smoreIsPhone = true;\n        }\n    }\n\n\n    // Call it on dom ready\n    $(function () {\n\n        // Remove mobile elements\n        removeMobileElements();\n\n        // fix RTL headers\n        mobileHeaderRTLfix();\n\n\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});", "fire.provide('smore.clickable');\r\n\r\n\r\nsmore.clickable = function (selector) {\r\n\r\n    var currentUrl = $('link[rel=canonical]').attr('href') + '?ref=email-content';\r\n\r\n    selector.each(function () {\r\n        var el = $(this);\r\n\r\n        var c = el.data('clicktarget');\r\n        // skip if not sharp\r\n        if (c !== '#') return;\r\n        var id = el.attr('id');\r\n        if (!id) {\r\n            var p = el.parents('.widget').first();\r\n            id = p.attr('id');\r\n        }\r\n\r\n        if (id) el.attr('data-clicktarget', currentUrl + '#' + id);\r\n    });\r\n};\r\n\r\nsmore.clickable.setAllTarget = function () {\r\n    $('a').attr('target', '_blank');\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", "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});", "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});", "// 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});", "/***\r\n * @fileOverview\r\n * Loads sample flyers from the server.\r\n */\r\n\r\ndefine('show/sidebar', function (require) {\r\n    var SAMPLE_SELECTOR = '.load-related';\r\n\r\n    var _relatedLoader;\r\n    var _loaded = false;\r\n\r\n    function loadSidebarSamples() {\r\n        $(SAMPLE_SELECTOR).each(function () {\r\n            var el = $(this);\r\n            var url = el.data('url');\r\n            if (!url) return;\r\n            var count = el.data('count') || 5;\r\n            if (!_relatedLoader) {\r\n                _relatedLoader = $.ajax(url, {dataType:'jsonp', crossDomain:true});\r\n            }\r\n\r\n            _relatedLoader.done(\r\n                function (r) {\r\n                    if (_loaded) return;\r\n\r\n                    el.removeClass('loading');\r\n                    _loaded = true;\r\n\r\n                    // Clear the content before adding a new one\r\n                    var flyerEl = el.find('.sample-flyers');\r\n                    flyerEl.html('');\r\n\r\n                    $($('<div>' + r.flyers + '</div>').children().slice(0, count)).appendTo(flyerEl);\r\n\r\n                    el.find('.board-name').html('More ' + r.board.title);\r\n                    el.find('.board-link').attr('href', r.board.url);\r\n\r\n            });\r\n\r\n            window.setTimeout(function() { onLoadTimeoutOrFail(el) }, 10000);\r\n        })\r\n    }\r\n\r\n    function onLoadTimeoutOrFail(el) {\r\n        if (!_loaded) {\r\n            el.addClass('error').removeClass('loading');\r\n            _loaded = true;\r\n        }\r\n    }\r\n\r\n    // load sidebar samples after the page was loaded\r\n    $(loadSidebarSamples);\r\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});", "/*****\r\n * @fileOverview\r\n * Popover tool\r\n *****/\r\n\r\ndefine('fire/ui/popover', function (require) {\r\n    var overlay = require('fire/ui/overlay');\r\n\r\n    var ACTIVE_CLASS = 'active';\r\n\r\n    var _doc = $(document);\r\n    var _body = $(_doc[0].body);\r\n    var _win = $(window);\r\n\r\n    var _isFixed, _isAbove, _contentEl, _isCenterOnArrow;\r\n\r\n    /****\r\n     *\r\n     * @param targetEl\r\n     * @param popoverEl\r\n     * @param wrapperCls\r\n     * @param {Boolean=} isFixed\r\n     * @param {Boolean|Function=} overlayClose\r\n     * @return {$.Deferred}\r\n     */\r\n    function show(targetEl, popoverEl, wrapperCls, isFixed, overlayClose) {\r\n        if (overlayClose === undefined) overlayClose = true;\r\n\r\n        // close any current popover\r\n        close();\r\n\r\n        var dfd = $.Deferred();\r\n        // create overlay, attach to when user clicked\r\n        var o = overlay.show();\r\n\r\n        if (overlayClose) {\r\n\r\n            // handle a tester function\r\n            if ($.isFunction(overlayClose)) {\r\n                o.done(function () {\r\n                    if (overlayClose()) {\r\n                        close();\r\n                        dfd.resolve();\r\n                    }\r\n                });\r\n            } else {\r\n                o.done(close).done(dfd.resolve);\r\n            }\r\n        }\r\n\r\n        _isFixed = isFixed;\r\n\r\n        _isAbove = targetEl.hasClass('pop-above');\r\n        _isCenterOnArrow = targetEl.hasClass('pop-center-arrow');\r\n\r\n        _target = targetEl;\r\n\r\n        _contentEl = popoverEl;\r\n        // generate element\r\n        _current = generate();\r\n\r\n        _popoverArrow = _current.find('.arrow');\r\n\r\n        if (wrapperCls) _current.addClass(wrapperCls);\r\n\r\n        // add to body\r\n        _body.append(_current);\r\n\r\n        position();\r\n\r\n        _target.addClass(ACTIVE_CLASS);\r\n\r\n        // register position\r\n        _win.on('resize', refresh);\r\n\r\n        var p = dfd.promise();\r\n        p.el = _current;\r\n        return p;\r\n    }\r\n\r\n\r\n    function refresh() {\r\n\r\n        if (_current && _target) {\r\n            _current.css('position', getPos());\r\n            position();\r\n        }\r\n    }\r\n\r\n    function position() {\r\n        var targetOffset = getOffset(_target);\r\n        var targetWidth = _target.outerWidth();\r\n        var popoverWidth = _current.outerWidth();\r\n\r\n        var left;\r\n        if (_isCenterOnArrow) {\r\n            var arrowRightOffset = parseInt(_popoverArrow.css('right'));\r\n            var arrowCenter = _popoverArrow.outerWidth() / 2;\r\n            left = targetOffset.left + (targetWidth / 2) - popoverWidth + arrowRightOffset + arrowCenter;\r\n        } else {\r\n            left = targetOffset.left + (targetWidth / 2) - (popoverWidth / 2);\r\n        }\r\n\r\n        var top = 0;\r\n        if (_isAbove) {\r\n            top = targetOffset.top - _current.outerHeight() - 2;\r\n        } else {\r\n            top = targetOffset.top + _target.outerHeight() - 2;\r\n        }\r\n        _current.css({top:top, left:left});\r\n\r\n        window.setTimeout(fixPlaceholders, 20);\r\n    }\r\n\r\n\r\n    function getOffset(el) {\r\n        var o = el.offset();\r\n        if (_isFixed) {\r\n            var st = _win.scrollTop();\r\n            var sl = _win.scrollLeft();\r\n\r\n            return {\r\n                left:o.left - sl,\r\n                top:o.top - st\r\n            }\r\n        } else {\r\n            return o;\r\n        }\r\n    }\r\n\r\n    function getPos() {\r\n        return _isFixed ? 'fixed' : 'absolute';\r\n    }\r\n\r\n    /*****\r\n     * Generate the popover markup\r\n     *\r\n     * @returns {jQuery}\r\n     * @private\r\n     */\r\n    function generate() {\r\n        var markup = $('<div class=\"popover\"><div class=\"arrow\"></div><div class=\"inner\"><div class=\"content\"></div></div></div>');\r\n\r\n        markup.addClass(_isAbove ? 'popover-above' : 'popover-below');\r\n        // set z-index above the shim\r\n        markup.css({'z-index':6000, 'position':getPos()});\r\n\r\n        _contentEl.show();\r\n\r\n        // append the content el and return\r\n        markup.find('.content').append(_contentEl);\r\n        return markup;\r\n    }\r\n\r\n    var _popoverArrow = null;\r\n\r\n    /****\r\n     * Current popover\r\n     * @type {jQuery}\r\n     * @private\r\n     */\r\n    var _current = null;\r\n\r\n    /****\r\n     * Current popover\r\n     * @type {jQuery}\r\n     * @private\r\n     */\r\n    var _target = null;\r\n\r\n    /****\r\n     * Hides the current popover\r\n     */\r\n    function close() {\r\n        hideMask();\r\n\r\n        if (!_current) return;\r\n        // detach content from the dom before we remove current\r\n        if (_contentEl) {\r\n            // push it to the body and hide it\r\n            _body.append(_contentEl.hide());\r\n        }\r\n\r\n        if (_current) _current.remove();\r\n        if (_target) _target.removeClass(ACTIVE_CLASS);\r\n\r\n        _contentEl = _current = _target = null;\r\n\r\n        overlay.remove();\r\n    }\r\n\r\n    var _mask;\r\n\r\n    function mask(text, cls) {\r\n        if (!_current) return;\r\n        hideMask();\r\n\r\n        var content = _current.find('.content').first();\r\n        var mask = $('<div class=\"popover-mask\"><div class=\"mask-content\">' + text + '</div></div> ');\r\n        if (cls) mask.addClass(cls);\r\n\r\n        mask.css({\r\n            width:content.outerWidth(),\r\n            height:content.outerHeight()\r\n        });\r\n\r\n        content.before(mask);\r\n\r\n        _mask = mask;\r\n    }\r\n\r\n    function hideMask() {\r\n        if (!_mask) return;\r\n        _mask.remove();\r\n        _mask = null;\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    return {\r\n        mask:mask,\r\n        hideMask:hideMask,\r\n        close:close,\r\n        refresh:refresh,\r\n        show:show\r\n    }\r\n\r\n});\r\n\r\n// backwards compatability\r\n/****\r\n *\r\n * @deprecated\r\n */\r\nfire.popover = fire.ui.popover;", "/***\r\n * @fileOverview\r\n * In charge of our footer - video and quicklogin. Also in charge of the report bar.\r\n */\r\n\r\ndefine('show/footer', function (require) {\r\n    var popover = require('fire/ui/popover');\r\n    var _reportButton = $('.report-button');\r\n    var _reportPopover = $('.report-popover');\r\n    var _translateButton = $('.translate-button');\r\n    var _translatePopover = $('.translate-popover');\r\n    var _sendReport = _reportPopover.find('.send');\r\n    var _closeTranlsate = _translatePopover.find('.gray-button');\r\n    var _reportInput = _reportPopover.find('textarea');\r\n\r\n    var SENDING_MESSAGE = 'Reporting...';\r\n    var DONE_MESSAGE = 'newsletter reported! Thank you!';\r\n    var COMPLETE_HIDE_TIMEOUT = 1500;\r\n\r\n    function onReportClicked(e) {\r\n        // show popover, hide it when someone clicks outside of it\r\n        popover.show(_reportButton, _reportPopover).done(popover.close);\r\n\r\n        // focus on the input\r\n        window.setTimeout(function () {\r\n            _reportPopover.find('textarea').focus();\r\n        }, 100);\r\n    }\r\n\r\n    function onTranslateClick(e){\r\n        popover.show(_translateButton, _translatePopover).done(popover.close);\r\n    }\r\n\r\n    function onSendReportClicked(e) {\r\n        popover.mask(SENDING_MESSAGE);\r\n\r\n        $.safePost('/app/pages/report_offensive',\r\n            {\r\n                page_id: window.pageId,\r\n                reason: $.trim(_reportInput.val())\r\n            })\r\n            .always(onSendComplete);\r\n    }\r\n\r\n    function onSendComplete() {\r\n        popover.mask(DONE_MESSAGE);\r\n        setTimeout(hide, COMPLETE_HIDE_TIMEOUT);\r\n    }\r\n\r\n    function hide() {\r\n        popover.close();\r\n        reset();\r\n    }\r\n\r\n    function reset() {\r\n        popover.hideMask();\r\n        _reportInput.val('');\r\n    }\r\n\r\n    function onKeyUp(e) {\r\n        if (e.which == 27) {// esc\r\n            hide();\r\n            return;\r\n        }\r\n    }\r\n\r\n    function setupEvents() {\r\n        // setup video with fancybox\r\n        $('.play-smore-video').fancybox({\r\n            type:'iframe',\r\n            href:'https://player.vimeo.com/video/29872340?autoplay=1',\r\n            orig:$('.footer-video .play-video'),\r\n            width:700,\r\n            height:390\r\n        });\r\n\r\n        // Setup popover for report\r\n        _reportButton.click(onReportClicked);\r\n        _sendReport.click(onSendReportClicked);\r\n        _reportInput.keyup(onKeyUp);\r\n        _reportPopover.find('.cancel').click(hide);\r\n        _translateButton.click(onTranslateClick);\r\n        _closeTranlsate.click(popover.close);\r\n    }\r\n\r\n    // setup events\r\n    $(setupEvents);\r\n});", "define('show/stickyShare', function (require) {\r\n\r\n    // Require waypoints.js\r\n\r\n    var TOP_HEIGHT = 158;\r\n    var EOP_OFFSET = 85;\r\n\r\n    var _socialBar = $('.social-floater');\r\n\r\n\r\n    var _endOfPage = $('#end-of-page');\r\n\r\n\r\n    function setup() {\r\n        var floaterH = _socialBar.outerHeight();\r\n        _endOfPage.waypoint(function (e, direction) {\r\n            if (direction === 'down') {\r\n                var top = _endOfPage.offset().top - floaterH - EOP_OFFSET;\r\n\r\n                top = Math.max(top, EOP_OFFSET + 1);\r\n                _socialBar.css({top:top, position:'absolute'});\r\n\r\n            } else {\r\n                _socialBar.css({top:'auto', position:'fixed'});\r\n\r\n            }\r\n\r\n        }, {\r\n            offset:TOP_HEIGHT + floaterH + 6\r\n        })\r\n    }\r\n\r\n    $(setup);\r\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});", "/***\n * @fileOverview\n * Org duplicate box -- if you're in an org and you look at flyers from others in the org, you'll see\n * this box allowing you to duplicate the flyer to your account.\n */\n\ndefine('show/orgDuplicate', function (require) {\n\n    var DUPLICATE_ENDPOINT = '/app/pages/duplicate_to_account';\n    var WAIT_TEXT = 'Please wait...';\n    var pleaseWait = require('fire/ui/pleaseWait');\n    var duplicateButton = $('.org-duplicate-button');\n\n    function onDuplicateSuccess(data) {\n        document.location = data;\n\n        // Make sure the button stays disabled till the redirect\n        duplicateButton.addClass('disabled').attr('disabled', true).text(WAIT_TEXT);\n\n    }\n\n    function onDuplicateFailed(data) {\n        alert(data.message);\n    }\n\n    function onOrgDuplicateClicked(e) {\n        // Show a confirmation box\n        if (!confirm(\"Make a copy of this newsletter and start editing?\")) {\n            return;\n        }\n\n        // Start the request\n        var postPromise = $.safePost(DUPLICATE_ENDPOINT, {id: window.pageId});\n\n        // Disable the button\n        pleaseWait.wait(postPromise, duplicateButton, WAIT_TEXT);\n\n        // On complete\n        postPromise.done(onDuplicateSuccess).fail(onDuplicateFailed);\n    }\n\n    duplicateButton.click(onOrgDuplicateClicked);\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", "/***\n * @fileOverview\n * Org duplicate box -- if you're in an org and you look at flyers from others in the org, you'll see\n * this box allowing you to duplicate the flyer to your account.\n */\n\ndefine('show/suggestedFlyerDuplicate', function (require) {\n\n    var report = require('smore/util/report');\n    var DUPLICATE_ENDPOINT = '/app/pages/duplicate_suggested_flyer/';\n    var pleaseWait = require('fire/ui/pleaseWait');\n    var duplicateButton = $('.suggested-flyer-duplicate-button');\n\n    var COPY_SUGGESTED_FLYER_BUTTON_CLICKED_EVENT = 'FLYER: Copy suggested flyer clicked';\n    var OPENED_SUGGESTED_FLYER_EVENT = 'FLYER: Opened suggested flyer';\n\n    function onSuggestedFlyerDuplicateClicked(e) {\n        try {\n            report.track(COPY_SUGGESTED_FLYER_BUTTON_CLICKED_EVENT, getPageData());\n        } finally {\n            window.location = DUPLICATE_ENDPOINT + window.pageId;\n        }\n    }\n\n    function getPageData() {\n        return {\n            flyer_id: window.pageId\n        };\n    }\n\n    function setupSuggestedFlyer() {\n        duplicateButton.click(onSuggestedFlyerDuplicateClicked);\n\n        if (!!window.__isSuggestedFlyer) {\n            try {\n                report.track(OPENED_SUGGESTED_FLYER_EVENT, getPageData());\n            } catch (e) {\n            }\n        }\n    }\n\n    $(setupSuggestedFlyer);\n});", "// Generated by CoffeeScript 1.12.7\ndefine('show/signupPopover', function(require) {\n  var SignupPopover, isAuthor;\n  isAuthor = require('smore/isAuthor');\n\n  /*\n  Opens and controls the signup popover.\n  \n  Notes:\n    - When a visitor clicks on the close button, the popver is closed and we store\n      a session cookie named `ssp`.\n   */\n  SignupPopover = (function() {\n    var POPOVER_SHOW_TIMEOUT, SESSION_COOKIE;\n\n    POPOVER_SHOW_TIMEOUT = 25 * 1000;\n\n    SESSION_COOKIE = 'ssp=true';\n\n    function SignupPopover() {\n      this.popover = $('#signup-popover');\n      this.signupButton = this.popover.find('.signup-button');\n      this.setupEvents();\n      if (!this.isClosed()) {\n        this.queue();\n      }\n    }\n\n    SignupPopover.prototype.setupEvents = function() {\n      return this.popover.find('.close').click((function(_this) {\n        return function() {\n          return _this.onCloseClicked();\n        };\n      })(this));\n    };\n\n    SignupPopover.prototype.queue = function() {\n\n      /*\n      Set timeout to show the popover\n       */\n      return setTimeout(((function(_this) {\n        return function() {\n          return _this.show();\n        };\n      })(this)), POPOVER_SHOW_TIMEOUT);\n    };\n\n    SignupPopover.prototype.isClosed = function() {\n      return isAuthor() || document.cookie.indexOf(SESSION_COOKIE) !== -1;\n    };\n\n    SignupPopover.prototype.show = function() {\n\n      /*\n      Make the popover visible\n       */\n      this.popover.addClass('active');\n      return setTimeout(((function(_this) {\n        return function() {\n          return _this.popover.css('opacity', 1);\n        };\n      })(this)), 100);\n    };\n\n    SignupPopover.prototype.onCloseClicked = function() {\n\n      /*\n      Closes the popover, stores a session cookie to skip showing it again\n       */\n      this.popover.removeClass('active');\n      return document.cookie = SESSION_COOKIE;\n    };\n\n    return SignupPopover;\n\n  })();\n  return $(function() {\n    return new SignupPopover();\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\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\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('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/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\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", "/* 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});", "/*\n * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined\n * in FIPS 180-2\n * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for details.\n * Also http://anmar.eu.org/projects/jssha2/\n */\n\n\ndefine('lib/sha256', function(require) {\n    /*\n     * Configurable variables. You may need to tweak these to be compatible with\n     * the server-side, but the defaults work in most cases.\n     */\n    var hexcase = 0;  /* hex output format. 0 - lowercase; 1 - uppercase        */\n    var b64pad  = \"\"; /* base-64 pad character. \"=\" for strict RFC compliance   */\n\n    /*\n     * These are the functions you'll usually want to call\n     * They take string arguments and return either hex or base-64 encoded strings\n     */\n    function hex_sha256(s)    { return rstr2hex(rstr_sha256(str2rstr_utf8(s))); }\n    function b64_sha256(s)    { return rstr2b64(rstr_sha256(str2rstr_utf8(s))); }\n    function any_sha256(s, e) { return rstr2any(rstr_sha256(str2rstr_utf8(s)), e); }\n    function hex_hmac_sha256(k, d)\n      { return rstr2hex(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d))); }\n    function b64_hmac_sha256(k, d)\n      { return rstr2b64(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d))); }\n    function any_hmac_sha256(k, d, e)\n      { return rstr2any(rstr_hmac_sha256(str2rstr_utf8(k), str2rstr_utf8(d)), e); }\n\n    /*\n     * Perform a simple self-test to see if the VM is working\n     */\n    function sha256_vm_test()\n    {\n      return hex_sha256(\"abc\").toLowerCase() ==\n                \"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad\";\n    }\n\n    /*\n     * Calculate the sha256 of a raw string\n     */\n    function rstr_sha256(s)\n    {\n      return binb2rstr(binb_sha256(rstr2binb(s), s.length * 8));\n    }\n\n    /*\n     * Calculate the HMAC-sha256 of a key and some data (raw strings)\n     */\n    function rstr_hmac_sha256(key, data)\n    {\n      var bkey = rstr2binb(key);\n      if(bkey.length > 16) bkey = binb_sha256(bkey, key.length * 8);\n\n      var ipad = Array(16), opad = Array(16);\n      for(var i = 0; i < 16; i++)\n      {\n        ipad[i] = bkey[i] ^ 0x36363636;\n        opad[i] = bkey[i] ^ 0x5C5C5C5C;\n      }\n\n      var hash = binb_sha256(ipad.concat(rstr2binb(data)), 512 + data.length * 8);\n      return binb2rstr(binb_sha256(opad.concat(hash), 512 + 256));\n    }\n\n    /*\n     * Convert a raw string to a hex string\n     */\n    function rstr2hex(input)\n    {\n      try { hexcase } catch(e) { hexcase=0; }\n      var hex_tab = hexcase ? \"0123456789ABCDEF\" : \"0123456789abcdef\";\n      var output = \"\";\n      var x;\n      for(var i = 0; i < input.length; i++)\n      {\n        x = input.charCodeAt(i);\n        output += hex_tab.charAt((x >>> 4) & 0x0F)\n               +  hex_tab.charAt( x        & 0x0F);\n      }\n      return output;\n    }\n\n    /*\n     * Convert a raw string to a base-64 string\n     */\n    function rstr2b64(input)\n    {\n      try { b64pad } catch(e) { b64pad=''; }\n      var tab = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n      var output = \"\";\n      var len = input.length;\n      for(var i = 0; i < len; i += 3)\n      {\n        var triplet = (input.charCodeAt(i) << 16)\n                    | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)\n                    | (i + 2 < len ? input.charCodeAt(i+2)      : 0);\n        for(var j = 0; j < 4; j++)\n        {\n          if(i * 8 + j * 6 > input.length * 8) output += b64pad;\n          else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);\n        }\n      }\n      return output;\n    }\n\n    /*\n     * Convert a raw string to an arbitrary string encoding\n     */\n    function rstr2any(input, encoding)\n    {\n      var divisor = encoding.length;\n      var remainders = Array();\n      var i, q, x, quotient;\n\n      /* Convert to an array of 16-bit big-endian values, forming the dividend */\n      var dividend = Array(Math.ceil(input.length / 2));\n      for(i = 0; i < dividend.length; i++)\n      {\n        dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);\n      }\n\n      /*\n       * Repeatedly perform a long division. The binary array forms the dividend,\n       * the length of the encoding is the divisor. Once computed, the quotient\n       * forms the dividend for the next step. We stop when the dividend is zero.\n       * All remainders are stored for later use.\n       */\n      while(dividend.length > 0)\n      {\n        quotient = Array();\n        x = 0;\n        for(i = 0; i < dividend.length; i++)\n        {\n          x = (x << 16) + dividend[i];\n          q = Math.floor(x / divisor);\n          x -= q * divisor;\n          if(quotient.length > 0 || q > 0)\n            quotient[quotient.length] = q;\n        }\n        remainders[remainders.length] = x;\n        dividend = quotient;\n      }\n\n      /* Convert the remainders to the output string */\n      var output = \"\";\n      for(i = remainders.length - 1; i >= 0; i--)\n        output += encoding.charAt(remainders[i]);\n\n      /* Append leading zero equivalents */\n      var full_length = Math.ceil(input.length * 8 /\n                                        (Math.log(encoding.length) / Math.log(2)))\n      for(i = output.length; i < full_length; i++)\n        output = encoding[0] + output;\n\n      return output;\n    }\n\n    /*\n     * Encode a string as utf-8.\n     * For efficiency, this assumes the input is valid utf-16.\n     */\n    function str2rstr_utf8(input)\n    {\n      var output = \"\";\n      var i = -1;\n      var x, y;\n\n      while(++i < input.length)\n      {\n        /* Decode utf-16 surrogate pairs */\n        x = input.charCodeAt(i);\n        y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;\n        if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)\n        {\n          x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);\n          i++;\n        }\n\n        /* Encode output as utf-8 */\n        if(x <= 0x7F)\n          output += String.fromCharCode(x);\n        else if(x <= 0x7FF)\n          output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),\n                                        0x80 | ( x         & 0x3F));\n        else if(x <= 0xFFFF)\n          output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),\n                                        0x80 | ((x >>> 6 ) & 0x3F),\n                                        0x80 | ( x         & 0x3F));\n        else if(x <= 0x1FFFFF)\n          output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),\n                                        0x80 | ((x >>> 12) & 0x3F),\n                                        0x80 | ((x >>> 6 ) & 0x3F),\n                                        0x80 | ( x         & 0x3F));\n      }\n      return output;\n    }\n\n    /*\n     * Encode a string as utf-16\n     */\n    function str2rstr_utf16le(input)\n    {\n      var output = \"\";\n      for(var i = 0; i < input.length; i++)\n        output += String.fromCharCode( input.charCodeAt(i)        & 0xFF,\n                                      (input.charCodeAt(i) >>> 8) & 0xFF);\n      return output;\n    }\n\n    function str2rstr_utf16be(input)\n    {\n      var output = \"\";\n      for(var i = 0; i < input.length; i++)\n        output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,\n                                       input.charCodeAt(i)        & 0xFF);\n      return output;\n    }\n\n    /*\n     * Convert a raw string to an array of big-endian words\n     * Characters >255 have their high-byte silently ignored.\n     */\n    function rstr2binb(input)\n    {\n      var output = Array(input.length >> 2);\n      for(var i = 0; i < output.length; i++)\n        output[i] = 0;\n      for(var i = 0; i < input.length * 8; i += 8)\n        output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);\n      return output;\n    }\n\n    /*\n     * Convert an array of big-endian words to a string\n     */\n    function binb2rstr(input)\n    {\n      var output = \"\";\n      for(var i = 0; i < input.length * 32; i += 8)\n        output += String.fromCharCode((input[i>>5] >>> (24 - i % 32)) & 0xFF);\n      return output;\n    }\n\n    /*\n     * Main sha256 function, with its support functions\n     */\n    function sha256_S (X, n) {return ( X >>> n ) | (X << (32 - n));}\n    function sha256_R (X, n) {return ( X >>> n );}\n    function sha256_Ch(x, y, z) {return ((x & y) ^ ((~x) & z));}\n    function sha256_Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));}\n    function sha256_Sigma0256(x) {return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));}\n    function sha256_Sigma1256(x) {return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));}\n    function sha256_Gamma0256(x) {return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));}\n    function sha256_Gamma1256(x) {return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));}\n    function sha256_Sigma0512(x) {return (sha256_S(x, 28) ^ sha256_S(x, 34) ^ sha256_S(x, 39));}\n    function sha256_Sigma1512(x) {return (sha256_S(x, 14) ^ sha256_S(x, 18) ^ sha256_S(x, 41));}\n    function sha256_Gamma0512(x) {return (sha256_S(x, 1)  ^ sha256_S(x, 8) ^ sha256_R(x, 7));}\n    function sha256_Gamma1512(x) {return (sha256_S(x, 19) ^ sha256_S(x, 61) ^ sha256_R(x, 6));}\n\n    var sha256_K = new Array\n    (\n      1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993,\n      -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,\n      1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,\n      264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986,\n      -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,\n      113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,\n      1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885,\n      -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,\n      430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,\n      1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872,\n      -1866530822, -1538233109, -1090935817, -965641998\n    );\n\n    function binb_sha256(m, l)\n    {\n      var HASH = new Array(1779033703, -1150833019, 1013904242, -1521486534,\n                           1359893119, -1694144372, 528734635, 1541459225);\n      var W = new Array(64);\n      var a, b, c, d, e, f, g, h;\n      var i, j, T1, T2;\n\n      /* append padding */\n      m[l >> 5] |= 0x80 << (24 - l % 32);\n      m[((l + 64 >> 9) << 4) + 15] = l;\n\n      for(i = 0; i < m.length; i += 16)\n      {\n        a = HASH[0];\n        b = HASH[1];\n        c = HASH[2];\n        d = HASH[3];\n        e = HASH[4];\n        f = HASH[5];\n        g = HASH[6];\n        h = HASH[7];\n\n        for(j = 0; j < 64; j++)\n        {\n          if (j < 16) W[j] = m[j + i];\n          else W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),\n                                                sha256_Gamma0256(W[j - 15])), W[j - 16]);\n\n          T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),\n                                                              sha256_K[j]), W[j]);\n          T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));\n          h = g;\n          g = f;\n          f = e;\n          e = safe_add(d, T1);\n          d = c;\n          c = b;\n          b = a;\n          a = safe_add(T1, T2);\n        }\n\n        HASH[0] = safe_add(a, HASH[0]);\n        HASH[1] = safe_add(b, HASH[1]);\n        HASH[2] = safe_add(c, HASH[2]);\n        HASH[3] = safe_add(d, HASH[3]);\n        HASH[4] = safe_add(e, HASH[4]);\n        HASH[5] = safe_add(f, HASH[5]);\n        HASH[6] = safe_add(g, HASH[6]);\n        HASH[7] = safe_add(h, HASH[7]);\n      }\n      return HASH;\n    }\n\n    function safe_add (x, y)\n    {\n      var lsw = (x & 0xFFFF) + (y & 0xFFFF);\n      var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n      return (msw << 16) | (lsw & 0xFFFF);\n    }\n\n    return hex_sha256;\n});", "/* globals Backbone, _ */\n\ndefine(\"show/actions/contactAuthorModal\", function(require) {\n\n    var ModalView = require('smore/ui/views/modal').ModalView;\n\n    var FormView = require('fire/ui/forms/formView').FormView;\n\n    var hexSha256 = require('lib/sha256');\n\n    /***\n     * ContactAuthorModal\n     * ==================\n     *\n     * This modal provides visitors with the option to contact the author of the flyer by sending a message\n     *\n     * Usage\n     * -----\n     *\n     * var c = new ContactAuthorModal({flyerId: <flyerId>});\n     * c.show();\n     *\n     *\n     *\n     * Markup structure\n     * ----------------\n     * this.el -> *           The root element\n     *\n     *\n     * Events\n     * ------\n     *\n     * @class ContactAuthorModal\n     * @extends {smore.ui.views.modal.ModalView}\n     * @constructor\n     */\n    var ContactAuthorModal = ModalView.extend({\n\n        className: 'contact-author-modal',\n\n        /***\n         * Returns the url for loading the modal\n         * @returns {string}\n         */\n        contentEndpoint: function() {\n            return '/app/flyer_actions/contact_author_modal/' + this.options.flyerId;\n        },\n\n        render: function() {\n\n            // render the form view\n            this._formView = new FormView({\n                el: this.$('.contact-author-form'),\n                action: '/app/flyer_actions/contact_author/' + this.options.flyerId\n            });\n\n            // Hash the token in place\n            var tokenField = this.$('.contact-author-form .secure-token');\n            tokenField.val(hexSha256(tokenField.val()));\n\n            // setup success event:\n\n            this._formView.on('success', $.proxy(function() {\n                // Hide the form\n                this._formView.el.hide();\n                this.$('.contact-author-header').hide();\n\n                // Show success box\n                this.$('.success-box').show();\n            }, this));\n\n            // Set focus on the first field\n\n            var firstField = this._formView.el.find('input').first()\n\n            setTimeout(function() {\n                firstField.focus();\n            }, 100);\n        }\n    });\n\n\n    return {ContactAuthorModal: ContactAuthorModal};\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", "define('show/actions/subscribeToAuthorPopover', function(require) {\n\n    var PopoverView = require('fire/ui/views/PopoverView').PopoverView;\n    var FormView = require('fire/ui/forms/formView').FormView;\n\n    /***\n     * SubscribeToAuthorPopover\n     * ======================\n     *\n     * Provides a way to signup someone to a special list\n     *\n     *\n     * Usage:\n     *\n     * pv = new SubscribeToAuthorPopover();\n     * pv.on('listCreated',<callback>);\n     * pv.show(molsh);\n     *\n     *\n     *\n     * @param options\n     * @extends {PopoverView}\n     * @constructor\n     */\n    function SubscribeToAuthorPopover(options) {\n        PopoverView.call(this, options);\n    }\n\n    SubscribeToAuthorPopover.prototype = {\n\n        templateSelector: '#subscribe-to-author-popover',\n\n        events: {\n        },\n\n        /***\n         * Render the popover content\n         *\n         * Setup events and elements\n         */\n        render: function() {\n\n            // render the form view\n            this._formView = new FormView({\n                el: this.find('form.subscribe-to-author'),\n                action: '/app/flyer_actions/subscribe_to_author/' + this.options.flyerId\n            });\n\n\n            this._formView.on('success', $.proxy(function() {\n                // Hide the form\n                this._formView.el.hide();\n\n                // Show success box\n                this.find('.success-box').show();\n            }, this));\n        },\n\n\n        /***\n         * Clear the form and set the focus after we show the popover\n         * @private\n         */\n        afterShow: function() {\n            // Clear input\n            var input = this.find('#subscribe-name');\n\n\n            // set focus\n            window.setTimeout(function() {\n                input.focus();\n            }, 100);\n        }\n\n    };\n\n    // Inherit\n\n    SubscribeToAuthorPopover.inherits(PopoverView);\n\n\n    return {SubscribeToAuthorPopover: SubscribeToAuthorPopover};\n\n});", "define('show/actions/actions', function (require) {\n\n    /****\n     * actions module\n     * ==============\n     *\n     * Bootstraps all the flyer actions\n     *\n     *\n     * Special classes and elements\n     * ----------------------------\n     *\n     * .open-contact-author[data-flyer-id=<current_flyer_id<]   Will open the contact author modal\n     *\n     *\n     * .open-subscribe-author[data-flyer-id=<current_flyer_id]  Will open the subscribe to author popover\n     *\n     *\n     *\n     */\n\n\n        // Required actions\n    var ContactAuthorModal = require('./contactAuthorModal').ContactAuthorModal;\n    var SubscribeToAuthorPopover = require('./subscribeToAuthorPopover').SubscribeToAuthorPopover;\n\n    var LIKE_FLYER_ENDPOINT = '/app/pages/like_flyer';\n\n\n    /***\n     * Setup events on dom ready\n     */\n    function setupEvents() {\n        $('.open-contact-author').click(onContactAuthorClicked);\n        $('.open-subscribe-author').click(onSubscribeAuthorClicked);\n        $('.like-flyer-button').click(onLikeFlyerButtonClicked);\n    }\n\n    function onLikeFlyerButtonClicked(e) {\n        var el = $(e.currentTarget);\n        var flyerId = el.data('flyer-id');\n\n        if (!flyerId) {\n            return;\n        }\n\n        var likeFlyerBox = $('.like-flyer-box');\n        likeFlyerBox.addClass('already-likes');\n\n        var likeCounter = $('.social-counter .count.likes');\n        var currentLikeCount = parseInt(likeCounter.text(), 10);\n        likeCounter.text(currentLikeCount + 1);\n\n        $.ajax({\n            url: LIKE_FLYER_ENDPOINT,\n            data: {\n                'page_id': flyerId\n            },\n            error: function () {\n                likeFlyerBox.removeClass('already-likes');\n                likeCounter.text(currentLikeCount);\n            }\n        });\n    }\n\n    /**\n     * Handle the contact author clicks\n     * @param e\n     */\n    function onContactAuthorClicked(e) {\n        var el = $(e.currentTarget);\n\n        var flyerId = el.data('flyer-id');\n\n        if (!flyerId) {\n            return;\n        }\n\n        // new contact author modal\n        var c = new ContactAuthorModal({flyerId: flyerId});\n\n        // show it\n        c.show();\n    }\n\n    /**\n     * Handle the subscribe author clicks\n     * @param e\n     */\n    function onSubscribeAuthorClicked(e) {\n        var el = $(e.currentTarget);\n\n        var flyerId = el.data('flyer-id');\n\n        if (!flyerId) {\n            return;\n        }\n\n        // new contact author modal\n        var c = new SubscribeToAuthorPopover({flyerId: flyerId});\n\n        // show it\n        c.show(el);\n    }\n\n\n    // Register for DOM ready event\n    $(setupEvents);\n});", "define('show/actions/accessibilityBar', function (require) {\n\n    // CSS Classes that change the newsletter layout according to the ADA requirements.\n    // See accessibility.scss\n    var HIGH_CONTRAST_CLASS = 'ada-high-contrast';\n    var MEDIUM_FONT_CLASS = 'ada-medium-font-size';\n    var LARGE_FONT_CLASS = 'ada-large-font-size';\n\n    var _barEl = $('.accessibility-bar');\n\n    var _body = $('body');\n\n    function setup() {\n        _barEl.find('.font-size a').click(onFontSizeClicked);\n        _barEl.find('.toggle-contrast').click(onContrastToggleClicked);\n        _barEl.find('.translate').click(onTranslateButtonClicked);\n\n        // NOTE: The Report button is already handled in footer.js\n    }\n\n    function onFontSizeClicked(e) {\n        var target = $(e.currentTarget);\n        var size = target.data('size');\n\n        // mark as active + remove active from others\n        target.addClass('active').siblings('a').removeClass('active');\n\n        _body.removeClass(MEDIUM_FONT_CLASS).removeClass(LARGE_FONT_CLASS);\n\n        switch (size) {\n            case 'medium':\n                _body.removeClass(LARGE_FONT_CLASS).addClass(MEDIUM_FONT_CLASS);\n                break;\n            case 'large':\n                _body.removeClass(MEDIUM_FONT_CLASS).addClass(LARGE_FONT_CLASS);\n                break;\n            default:\n                // do remove all\n                _body.removeClass(MEDIUM_FONT_CLASS).removeClass(LARGE_FONT_CLASS);\n        }\n\n\n    }\n\n\n    function onContrastToggleClicked(e){\n        var target = $(e.currentTarget);\n\n        if(target.hasClass('active')){\n            target.removeClass('active');\n            _body.removeClass(HIGH_CONTRAST_CLASS);\n        } else{\n            target.addClass('active');\n            _body.addClass(HIGH_CONTRAST_CLASS);\n        }\n\n    }\n\n\n    function onTranslateButtonClicked(e) {\n\n    }\n\n\n    // Register for DOM ready event\n    $(setup);\n});"], "sources": ["js/_consts.js", "js/lib/underscore.js", "js/lib/backbone.js", "js/smore/token.js", "js/smore/isAuthor.js", "js/fire/net/safe.js", "js/fire/fx/easing.js", "js/fire/util/hub.js", "js/fire/util/json.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/array.js", "js/fire/util/eventEmitter.js", "js/fire/ui/view.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/util/mobile.js", "js/fire/ui/forms/formView.js", "js/show/widgets/event.js", "js/show/pageEvents.js", "js/show/reporter.js", "js/show/mobile.js", "js/smore/app/embedder.js", "js/smore/app/clickable.js", "js/fire/ui/tinyslide.js", "js/smore/widgetInfo.js", "js/fire/util/strings.js", "js/smore/util/url.js", "js/show/linkTracking.js", "js/show/sidebar.js", "js/fire/ui/overlay.js", "js/fire/ui/popover.js", "js/show/footer.js", "js/show/stickyShare.js", "js/fire/ui/pleaseWait.js", "js/show/orgDuplicate.js", "js/smore/util/report.js", "js/show/suggestedFlyerDuplicate.js", "js/show/signupPopover.js", "js/fire/ui/modal.js", "js/fire/util/history.js", "js/fire/ui/views/ModalView.js", "js/smore/ui/login/signupFormView.js", "js/smore/ui/login/loginFormView.js", "js/fire/net/popup.js", "js/smore/ui/login/facebookConnectView.js", "js/smore/ui/login/googleConnectView.js", "js/smore/ui/login/modal.js", "js/smore/ui/views/overlay.js", "js/fire/ui/raf.js", "js/smore/ui/views/modal.js", "js/lib/sha256.js", "js/show/actions/contactAuthorModal.js", "js/fire/ui/overlay2.js", "js/fire/ui/views/PopoverView.js", "js/show/actions/subscribeToAuthorPopover.js", "js/show/actions/actions.js", "js/show/actions/accessibilityBar.js"], "version": 3, "names": ["DEVMODE", "STATIC_URI_PREFIX", "root", "this", "previousUnderscore", "_", "breaker", "ArrayProto", "Array", "prototype", "ObjProto", "Object", "FuncProto", "Function", "push", "slice", "concat", "toString", "hasOwnProperty", "nativeForEach", "forEach", "nativeMap", "map", "nativeReduce", "reduce", "nativeReduceRight", "reduceRight", "nativeFilter", "filter", "nativeEvery", "every", "nativeSome", "some", "nativeIndexOf", "indexOf", "nativeLastIndexOf", "lastIndexOf", "nativeIsArray", "isArray", "nativeKeys", "keys", "nativeBind", "bind", "obj", "_wrapped", "exports", "module", "_underscore", "VERSION", "each", "iterator", "context", "length", "i", "call", "collect", "results", "value", "index", "list", "reduceError", "foldl", "inject", "memo", "initial", "arguments", "TypeError", "foldr", "find", "detect", "result", "any", "select", "reject", "all", "identity", "contains", "include", "target", "invoke", "method", "args", "isFunc", "isFunction", "apply", "pluck", "key", "where", "attrs", "first", "isEmpty", "findWhere", "max", "Math", "Infinity", "computed", "min", "shuffle", "rand", "shuffled", "random", "sample", "n", "guard", "lookupIterator", "sortBy", "criteria", "sort", "left", "right", "a", "b", "group", "behavior", "groupBy", "has", "indexBy", "countBy", "sortedIndex", "array", "low", "high", "mid", "toArray", "values", "size", "head", "take", "last", "rest", "tail", "drop", "compact", "flatten", "input", "shallow", "output", "isArguments", "without", "difference", "uniq", "unique", "isSorted", "seen", "union", "intersection", "item", "other", "zip", "object", "from", "hasIndex", "range", "start", "stop", "step", "ceil", "idx", "ctor", "func", "bound", "self", "partial", "bindAll", "funcs", "Error", "f", "memoize", "hasher", "delay", "wait", "setTimeout", "defer", "throttle", "options", "timeout", "previous", "later", "leading", "Date", "now", "remaining", "clearTimeout", "trailing", "debounce", "immediate", "timestamp", "callNow", "once", "ran", "wrap", "wrapper", "compose", "after", "times", "pairs", "invert", "functions", "methods", "names", "extend", "source", "prop", "pick", "copy", "omit", "defaults", "clone", "isObject", "tap", "interceptor", "eq", "aStack", "bStack", "className", "String", "global", "multiline", "ignoreCase", "aCtor", "constructor", "bCtor", "pop", "isEqual", "isString", "isElement", "nodeType", "name", "isFinite", "isNaN", "parseFloat", "isNumber", "isBoolean", "isNull", "isUndefined", "noConflict", "accum", "floor", "entityMap", "escape", "&", "<", ">", "\"", "'", "unescape", "entityRegexes", "RegExp", "join", "string", "replace", "match", "property", "mixin", "idCounter", "uniqueId", "prefix", "id", "templateSettings", "evaluate", "interpolate", "noMatch", "escapes", "\\", "\r", "\n", "\t", "\u2028", "\u2029", "escaper", "template", "text", "data", "settings", "render", "matcher", "offset", "variable", "e", "chain", "_chain", "window", "factory", "define", "amd", "$", "Backbone", "jQuery", "Zepto", "ender", "previousBackbone", "splice", "emulateHTTP", "emulateJSON", "Events", "on", "callback", "eventsApi", "_events", "events", "ctx", "off", "_callback", "retain", "ev", "l", "j", "k", "trigger", "allEvents", "triggerEvents", "stopListening", "listeningTo", "_listeningTo", "remove", "_listenId", "eventSplitter", "action", "test", "split", "a1", "a2", "a3", "listenMethods", "listenTo", "listenToOnce", "implementation", "unbind", "Model", "attributes", "cid", "collection", "parse", "set", "changed", "initialize", "validationError", "idAttribute", "toJSON", "sync", "get", "attr", "val", "unset", "changes", "silent", "changing", "prev", "current", "_validate", "_changing", "_previousAttributes", "_pending", "clear", "hasChanged", "changedAttributes", "diff", "old", "previousAttributes", "fetch", "model", "success", "resp", "wrapError", "save", "xhr", "validate", "serverAttrs", "isNew", "patch", "destroy", "url", "base", "urlError", "encodeURIComponent", "isValid", "error", "modelMethods", "unshift", "Collection", "models", "comparator", "_reset", "reset", "setOptions", "add", "merge", "addOptions", "singular", "_byId", "_removeReference", "existing", "at", "targetModel", "sortable", "sortAttr", "toAdd", "toRemove", "modelMap", "order", "_prepareModel", "_addReference", "orderedModels", "previousModels", "shift", "create", "_onModelEvent", "event", "attributeMethods", "View", "viewOptions", "_ensureElement", "delegateEvents", "delegateEventSplitter", "tagName", "selector", "$el", "setElement", "element", "delegate", "undelegateEvents", "el", "eventName", "type", "methodMap", "params", "dataType", "contentType", "JSON", "stringify", "_method", "beforeSend", "setRequestHeader", "processData", "noXhrPatch", "ActiveXObject", "ajax", "XMLHttpRequest", "dispatchEvent", "update", "delete", "read", "Router", "routes", "_bindRoutes", "optionalParam", "namedParam", "splatParam", "escapeRegExp", "route", "isRegExp", "_routeToRegExp", "router", "history", "fragment", "_extractParameters", "execute", "navigate", "optional", "exec", "param", "decodeURIComponent", "History", "handlers", "location", "routeStripper", "rootStripper", "isExplorer", "trailingSlash", "pathStripper", "started", "interval", "atRoot", "pathname", "getHash", "href", "getFragment", "forcePushState", "_hasPushState", "_wantsHashChange", "decodeURI", "search", "hashChange", "_wantsPushState", "pushState", "docMode", "document", "documentMode", "oldIE", "navigator", "userAgent", "toLowerCase", "frame", "iframe", "hide", "appendTo", "contentWindow", "checkUrl", "_checkUrlInterval", "setInterval", "loc", "hash", "replaceState", "title", "loadUrl", "clearInterval", "handler", "assign", "_updateHash", "open", "close", "protoProps", "staticProps", "child", "parent", "Surrogate", "__super__", "require", "token", "m", "cookie", "isAuthor", "post", "uri", "successFunc", "opts", "_token", "o", "p", "then", "handleRequest", "handleFailedRequest", "done", "fail", "complete", "always", "abort", "getAllResponseHeaders", "getResponseHeader", "jqXhr", "statusText", "dfd", "Deferred", "GENERIC_ERROR_MESSAGE", "textStatus", "status", "resolve", "message", "iframeEl", "fromForm", "getIframe", "registerCallback", "_iframe_id", "form", "promise", "smore", "_iframeId", "css", "HIDDEN_CSS", "body", "append", "targetFrame", "_body", "enctype", "submit", "callbackForm", "baseForm", "callbackParam", "cbName", "visibility", "width", "height", "position", "top", "easing", "easeOutQuad", "x", "t", "c", "d", "easeInCubic", "easeOutCubic", "easeOutQuart", "easeOutSine", "sin", "PI", "easeOutBack", "s", "undefined", "encode", "decode", "path", "fallback", "part", "parts", "cur", "setPath", "tmp", "loading", "overlay", "outer", "content", "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", "isIE6", "browser", "msie", "version", "_abort", "onerror", "onload", "empty", "_error", "onError", "titleShow", "html", "_process_inline", "_start", "str", "emb", "ret", "fn", "fancybox", "onStart", "nodeName", "orig", "children", "titleFromAlt", "hasClass", "substr", "autoDimensions", "modal", "overlayShow", "hideOnOverlayClick", "hideOnContentClick", "enableEscapeButton", "showCloseButton", "padding", "parseInt", "margin", "replaceWith", "is", "insertBefore", "showActivity", "_process_image", "src", "scrolling", "swf", "win", "errorThrown", "_show", "w", "h", "wrapInner", "alt", "pos", "equal", "onCleanup", "titlePosition", "background-color", "overlayColor", "opacity", "overlayOpacity", "cursor", "style", "one", "show", "_get_zoom_to", "_process_title", "fadeTo", "changeFade", "finish_resizing", "contents", "_finish", "removeAttr", "border-width", "animate", "duration", "changeSpeed", "easingChange", "_draw", "transitionIn", "_get_zoom_from", "speedIn", "easingIn", "fadeIn", "_format_title", "removeClass", "titleFormat", "addClass", "marginLeft", "marginRight", "outerHeight", "bottom", "paddingLeft", "paddingRight", "_set_navigation", "enableKeyboardNav", "keyCode", "preventDefault", "showNavArrows", "cyclic", "support", "removeAttribute", "resize", "centerOnScroll", "center", "getTime", "onComplete", "_preload_images", "objNext", "dim", "_get_viewport", "scrollLeft", "scrollTop", "ratio", "view", "to", "autoScale", "double_padding", "_get_obj_pos", "_animate_loading", "metadata", "blur", "rel", "hideActivity", "next", "cancel", "onCancel", "_cleanup", "fadeOut", "onClosed", "transitionOut", "speedOut", "easingOut", "align", "init", "click", "mousewheel", "delta", "clientHeight", "scrollHeight", "prependTo", "wmode", "ready", "ZeroClipboard", "clients", "moviePath", "port", "nextId", "thingy", "getElementById", "display", "classes", "setMoviePath", "dispatch", "client", "receiveEvent", "register", "getDOMObjectPosition", "stopObj", "info", "offsetWidth", "offsetHeight", "offsetLeft", "offsetTop", "offsetParent", "Client", "elem", "movieId", "glue", "movie", "clipText", "handCursorEnabled", "cssEffects", "appendElem", "stylesToAdd", "domElement", "zIndex", "getElementsByTagName", "box", "div", "createElement", "addedStyle", "appendChild", "innerHTML", "getHTML", "flashvars", "protocol", "reposition", "removeChild", "setText", "newText", "addEventListener", "setHandCursor", "enabled", "setCSSEffects", "recoverActive", "len", "countLines", "span", "rects", "getClientRects", "total", "lastTop", "r", "pxToInt", "round", "Number", "fontSize", "getComputedStyle", "setFontSize", "_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", "when", "u", "y", "v", "g", "horizontal", "vertical", "$element", "didResize", "didScroll", "oldScroll", "waypoints", "doScroll", "scrollThrottle", "resizeThrottle", "newScroll", "forward", "backward", "reverse", "continuous", "refresh", "isWindow", "contextOffset", "contextScroll", "contextDimension", "offsetProp", "onlyOnScroll", "checkEmpty", "isEmptyObject", "axis", "triggerOnce", "disable", "enable", "getWaypointsByElement", "closest", "_invoke", "_traverse", "aggregate", "inArray", "pushStack", "isPlainObject", "viewportHeight", "innerHeight", "above", "_filter", "below", "extendFn", "load", "setup", "addMagnify", "pics", "description", "htmlDesc", "cls", "pictures", "pic", "widget", "parents", "widget_id", "hub", "WIDGET_CLASS_REGEX", "onMessage", "originalEvent", "origin", "vimeo", "youtube", "getVideoInfo", "json", "player_id", "_isPlaying", "playerState", "postMessage", "registerYoutube", "setupYoutube", "YOUTUBE_SELECTOR", "_win", "normalize", "objectKeys", "end", "format", "FORMAT_REGXP", "_proto", "POLYFILLS", "removeBy", "lambda", "insert", "origItem", "insertAfter", "minus", "secondArray", "arr", "setPush", "sum", "toObject", "propertyIsEnumerable", "elt", "scope", "res", "Emitter", "__ev", "_guid", "getGuid", "__findCallbackIdx", "guid", "ref", "hasProp", "em", "superClass", "defaultOptions", "_modifiers", "generate", "autoRender", "cssClass", "_extractEvents", "beforeRemove", "removed", "undelegate", "selEl", "templateSelector", "eventDict", "extractEvent", "_this", "handlerName", "proxy", "addModifier", "modifier", "allowDomUpdate", "hasModifier", "removeModifier", "modifiers", "RequiredValidator", "VALIDATORS", "Validator", "fromField", "field1", "field", "required", "DEFAULT_REQUIRED_MESSAGE", "isFieldMatch", "fieldView", "validatorClass", "FieldView", "validators", "vw", "setupInputEvents", "setupValidators", "inputEl", "onInputFocus", "onInputBlur", "onChanged", "setValid", "validateField", "setInvalid", "trim", "errorSpan", "focus", "fromEl", "selectors", "subclass", "console", "FIELD_VIEW_SELECTOR", "TextFieldView", "fv", "onInput", "onClipboardTextChanged", "CheckboxFieldView", "RadioFieldView", "radios", "HiddenFieldView", "isLandscape", "isMiniLayout", "isMobile", "isPhone", "isPortrait", "isRetina", "isTablet", "mq", "q", "matchMedia", "msMatchMedia", "matches", "ErrorCollection", "FormView", "mobile", "safe", "ERROR_BOX_SELECTOR", "SUBMIT_BUTTON_SELECTOR", "pleaseWaitText", "fieldSelector", "deliveryMethod", "validationErrorMessage", "deliveryDelay", "setupFields", "setupSubmitButton", "errorBox", "results1", "fields", "submitButton", "submitText", "submitButtonText", "onSubmitButtonClicked", "stopPropagation", "validateForm", "deliverForm", "cleanup", "hideErrors", "onDeliveryCompleted", "onDeliveryFailed", "errors", "processServerErrors", "showErrors", "error_collection", "extraParams", "errorCollecion", "setError", "fieldName", "ref1", "EventRSVPView", "FLYER_ID", "RSVP_ENDPOINT", "RSVP_SELECTOR", "formView", "setupRsvp", "SUCCESS_TEXT", "_success", "_subEmail", "_form", "page", "onFormSucceed", "els", "waypoint", "reachedEndOfPage", "dir", "pageId", "store", "pageEvent", "event_key", "END_POINT", "onReachEndOfPage", "onVideoPlayed", "mobileHeaderRTLfix", "headerWidget", "mobileHeader", "removeMobileElements", "REMOVE_ON_MOBILE_SELECTOR", "smoreIsPhone", "fire", "provide", "Embedder", "_el", "_content", "_isFixed", "_setupEvents", "popover", "_embedCodeBox", "_updateEmbedCode", "_shortUrl", "_setupClipboard", "_url", "_generateEmbedCode", "_clipboardSet", "_setupClipboardButton", "button", "clip", "cb", "tipsy", "fade", "org", "clickable", "currentUrl", "setAllTarget", "ui", "tinyslide", "isIE", "ANIMATION_TIME", "ACTIVE_CLASS", "slide", "DELAY", "progress", "siblings", "_current", "ITEM_SELECTOR", "CONTAINER_CLASS", "DATA_KEY", "EMPTY_INFO", "varArgs", "reg", "_loc", "baseDomain", "domain", "full", "hostname", "SELECTOR", "setupTracking", "anchorEl", "widgetInfo", "trackHref", "FLYER_SHORT_KEY", "o-href", "track-href", "onFirstTouchStart", "onFirstMouseDown", "linkEl", "currentTarget", "onMouseDown", "onMouseUp", "onMouseOut", "onClick", "setHref", "ie", "loadSidebarSamples", "SAMPLE_SELECTOR", "count", "_relatedLoader", "crossDomain", "_loaded", "flyerEl", "flyers", "board", "onLoadTimeoutOrFail", "extraClass", "closeOnClick", "Z_INDEX", "SHIM_CLS", "z-index", "overflow", "prepend", "FADE_DURATION", "scrollWidth", "_doc", "targetEl", "popoverEl", "wrapperCls", "isFixed", "overlayClose", "_isAbove", "_isCenterOnArrow", "_target", "_contentEl", "_popoverArrow", "getPos", "targetOffset", "getOffset", "targetWidth", "outerWidth", "popoverWidth", "arrowRightOffset", "arrowCenter", "fixPlaceholders", "st", "sl", "markup", "hideMask", "mask", "before", "_mask", "pf", "placeholderPolyfill", "onReportClicked", "_reportButton", "_reportPopover", "onTranslateClick", "_translateButton", "_translatePopover", "onSendReportClicked", "SENDING_MESSAGE", "safePost", "page_id", "reason", "_reportInput", "onSendComplete", "DONE_MESSAGE", "COMPLETE_HIDE_TIMEOUT", "onKeyUp", "which", "setupEvents", "_sendReport", "keyup", "_closeTranlsate", "floaterH", "_socialBar", "_endOfPage", "direction", "EOP_OFFSET", "TOP_HEIGHT", "waitText", "state", "_currentText", "disabled", "onDuplicateSuccess", "duplicateButton", "WAIT_TEXT", "onDuplicateFailed", "alert", "onOrgDuplicateClicked", "confirm", "postPromise", "DUPLICATE_ENDPOINT", "pleaseWait", "MIXPANEL_TIMEOUT", "_uniqueEvents", "getAbTestValues", "track", "props", "analytics", "log", "ab", "onSuggestedFlyerDuplicateClicked", "report", "COPY_SUGGESTED_FLYER_BUTTON_CLICKED_EVENT", "getPageData", "flyer_id", "setupSuggestedFlyer", "__isSuggestedFlyer", "OPENED_SUGGESTED_FLYER_EVENT", "SignupPopover", "signupButton", "isClosed", "queue", "POPOVER_SHOW_TIMEOUT", "SESSION_COOKIE", "onCloseClicked", "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", "margin-top", "ANIMATION_DURATION", "fast", "closePhone", "unlock", "detach", "showBodyItems", "_prePhoneScrollTop", "hideBodyItems", "MOBILE_MODAL_CLASS", "_hiddenBodyItems", "lock", "_locked", "stopImmediatePropagation", "isTouch", "HISTORY_ID", "HISTORY_KEY", "StateHelper", "getKey", "onHistoryPopState", "getHelper", "me", "ModalView", "url1", "onModalCompleted", "enableHistory", "historyHelper", "preload", "getContent", "PRELOAD_CACHE", "modalOptions", "onClose", "setupModalEvents", "closed", "_loadedContent", "_loadContent", "preloadUrl", "SignupFormView", "errorMessage", "errorData", "errorCollection", "firstProblem", "problem", "problems", "code", "LoginFormView", "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", "query", "connectParams", "buttonId", "signupSegment", "connectType", "is_new", "GoogleConnectView", "setupGoogleConnect", "gapi", "auth2", "client_id", "__google_connect_client_id", "cookiepolicy", "error1", "getAuthInstance", "signIn", "onGoogleConnectSuccess", "onGoogleConnectError", "onServerSignupWithGoogle", "googleUser", "idtoken", "getAuthResponse", "id_token", "CONTENT_ENDPOINT", "DEFAULT_AFTER_SUCCESS_URL", "LoginModalView", "MODAL_OPTIONS", "autoLogin", "fbv", "googleConnectView", "isLoggedIn", "lfv", "mv", "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", "OverlayView", "allowAccessToolbar", "scrollContainer", "_onOverlayClicked", "clickedOnOverlay", "clickCallback", "container", "getContainer", "getMinHeight", "transitionEnd", "_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", "endpoint", "templateContent", "isFixedModal", "startStep", "_startStep", "steps", "_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", "upcomingStep", "_stepIdx", "nextStep", "prevStep", "_onHistoryPopState", "_onCloseClicked", "_onNextStepClicked", "_onPrevStepClicked", "_onGoStepClicked", "_onBackStepClicked", "hex_sha256", "rstr2hex", "rstr_sha256", "str2rstr_utf8", "binb2rstr", "binb_sha256", "rstr2binb", "hexcase", "hex_tab", "charCodeAt", "charAt", "fromCharCode", "sha256_S", "X", "sha256_R", "sha256_Ch", "z", "sha256_Maj", "sha256_Sigma0256", "sha256_Sigma1256", "sha256_Gamma0256", "sha256_Gamma1256", "T1", "T2", "HASH", "W", "safe_add", "sha256_K", "lsw", "msw", "hexSha256", "ContactAuthorModal", "flyerId", "_formView", "tokenField", "firstField", "Overlay", "MARKUP", "PopoverView", "onOverlayClicked", "positionHook", "afterShow", "fixed", "isAbove", "calculateLeft", "targetLeft", "originalLeft", "viewportWidth", "unmask", "maskEl", "SubscribeToAuthorPopover", "inherits", "onContactAuthorClicked", "onSubscribeAuthorClicked", "onLikeFlyerButtonClicked", "likeFlyerBox", "likeCounter", "currentLikeCount", "LIKE_FLYER_ENDPOINT", "_barEl", "onFontSizeClicked", "onContrastToggleClicked", "onTranslateButtonClicked", "MEDIUM_FONT_CLASS", "LARGE_FONT_CLASS", "HIGH_CONTRAST_CLASS"], "file": "/js/show.3269c9da.js"}