Created
March 21, 2014 19:23
-
-
Save matthewkremer/9694063 to your computer and use it in GitHub Desktop.
Firebase Simple Login without Cookies
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var COMPILED = false; | |
var goog = goog || {}; | |
goog.global = this; | |
goog.global.CLOSURE_DEFINES; | |
goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) { | |
var parts = name.split("."); | |
var cur = opt_objectToExportTo || goog.global; | |
if (!(parts[0] in cur) && cur.execScript) { | |
cur.execScript("var " + parts[0]); | |
} | |
for (var part;parts.length && (part = parts.shift());) { | |
if (!parts.length && opt_object !== undefined) { | |
cur[part] = opt_object; | |
} else { | |
if (cur[part]) { | |
cur = cur[part]; | |
} else { | |
cur = cur[part] = {}; | |
} | |
} | |
} | |
}; | |
goog.define = function(name, defaultValue) { | |
var value = defaultValue; | |
if (!COMPILED) { | |
if (goog.global.CLOSURE_DEFINES && Object.prototype.hasOwnProperty.call(goog.global.CLOSURE_DEFINES, name)) { | |
value = goog.global.CLOSURE_DEFINES[name]; | |
} | |
} | |
goog.exportPath_(name, value); | |
}; | |
goog.DEBUG = true; | |
goog.define("goog.LOCALE", "en"); | |
goog.define("goog.TRUSTED_SITE", true); | |
goog.provide = function(name) { | |
if (!COMPILED) { | |
if (goog.isProvided_(name)) { | |
throw Error('Namespace "' + name + '" already declared.'); | |
} | |
delete goog.implicitNamespaces_[name]; | |
var namespace = name; | |
while (namespace = namespace.substring(0, namespace.lastIndexOf("."))) { | |
if (goog.getObjectByName(namespace)) { | |
break; | |
} | |
goog.implicitNamespaces_[namespace] = true; | |
} | |
} | |
goog.exportPath_(name); | |
}; | |
goog.setTestOnly = function(opt_message) { | |
if (COMPILED && !goog.DEBUG) { | |
opt_message = opt_message || ""; | |
throw Error("Importing test-only code into non-debug environment" + opt_message ? ": " + opt_message : "."); | |
} | |
}; | |
goog.forwardDeclare = function(name) { | |
}; | |
if (!COMPILED) { | |
goog.isProvided_ = function(name) { | |
return!goog.implicitNamespaces_[name] && goog.isDefAndNotNull(goog.getObjectByName(name)); | |
}; | |
goog.implicitNamespaces_ = {}; | |
} | |
goog.getObjectByName = function(name, opt_obj) { | |
var parts = name.split("."); | |
var cur = opt_obj || goog.global; | |
for (var part;part = parts.shift();) { | |
if (goog.isDefAndNotNull(cur[part])) { | |
cur = cur[part]; | |
} else { | |
return null; | |
} | |
} | |
return cur; | |
}; | |
goog.globalize = function(obj, opt_global) { | |
var global = opt_global || goog.global; | |
for (var x in obj) { | |
global[x] = obj[x]; | |
} | |
}; | |
goog.addDependency = function(relPath, provides, requires) { | |
if (goog.DEPENDENCIES_ENABLED) { | |
var provide, require; | |
var path = relPath.replace(/\\/g, "/"); | |
var deps = goog.dependencies_; | |
for (var i = 0;provide = provides[i];i++) { | |
deps.nameToPath[provide] = path; | |
if (!(path in deps.pathToNames)) { | |
deps.pathToNames[path] = {}; | |
} | |
deps.pathToNames[path][provide] = true; | |
} | |
for (var j = 0;require = requires[j];j++) { | |
if (!(path in deps.requires)) { | |
deps.requires[path] = {}; | |
} | |
deps.requires[path][require] = true; | |
} | |
} | |
}; | |
goog.define("goog.ENABLE_DEBUG_LOADER", true); | |
goog.require = function(name) { | |
if (!COMPILED) { | |
if (goog.isProvided_(name)) { | |
return; | |
} | |
if (goog.ENABLE_DEBUG_LOADER) { | |
var path = goog.getPathFromDeps_(name); | |
if (path) { | |
goog.included_[path] = true; | |
goog.writeScripts_(); | |
return; | |
} | |
} | |
var errorMessage = "goog.require could not find: " + name; | |
if (goog.global.console) { | |
goog.global.console["error"](errorMessage); | |
} | |
throw Error(errorMessage); | |
} | |
}; | |
goog.basePath = ""; | |
goog.global.CLOSURE_BASE_PATH; | |
goog.global.CLOSURE_NO_DEPS; | |
goog.global.CLOSURE_IMPORT_SCRIPT; | |
goog.nullFunction = function() { | |
}; | |
goog.identityFunction = function(opt_returnValue, var_args) { | |
return opt_returnValue; | |
}; | |
goog.abstractMethod = function() { | |
throw Error("unimplemented abstract method"); | |
}; | |
goog.addSingletonGetter = function(ctor) { | |
ctor.getInstance = function() { | |
if (ctor.instance_) { | |
return ctor.instance_; | |
} | |
if (goog.DEBUG) { | |
goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = ctor; | |
} | |
return ctor.instance_ = new ctor; | |
}; | |
}; | |
goog.instantiatedSingletons_ = []; | |
goog.DEPENDENCIES_ENABLED = !COMPILED && goog.ENABLE_DEBUG_LOADER; | |
if (goog.DEPENDENCIES_ENABLED) { | |
goog.included_ = {}; | |
goog.dependencies_ = {pathToNames:{}, nameToPath:{}, requires:{}, visited:{}, written:{}}; | |
goog.inHtmlDocument_ = function() { | |
var doc = goog.global.document; | |
return typeof doc != "undefined" && "write" in doc; | |
}; | |
goog.findBasePath_ = function() { | |
if (goog.global.CLOSURE_BASE_PATH) { | |
goog.basePath = goog.global.CLOSURE_BASE_PATH; | |
return; | |
} else { | |
if (!goog.inHtmlDocument_()) { | |
return; | |
} | |
} | |
var doc = goog.global.document; | |
var scripts = doc.getElementsByTagName("script"); | |
for (var i = scripts.length - 1;i >= 0;--i) { | |
var src = scripts[i].src; | |
var qmark = src.lastIndexOf("?"); | |
var l = qmark == -1 ? src.length : qmark; | |
if (src.substr(l - 7, 7) == "base.js") { | |
goog.basePath = src.substr(0, l - 7); | |
return; | |
} | |
} | |
}; | |
goog.importScript_ = function(src) { | |
var importScript = goog.global.CLOSURE_IMPORT_SCRIPT || goog.writeScriptTag_; | |
if (!goog.dependencies_.written[src] && importScript(src)) { | |
goog.dependencies_.written[src] = true; | |
} | |
}; | |
goog.writeScriptTag_ = function(src) { | |
if (goog.inHtmlDocument_()) { | |
var doc = goog.global.document; | |
if (doc.readyState == "complete") { | |
var isDeps = /\bdeps.js$/.test(src); | |
if (isDeps) { | |
return false; | |
} else { | |
throw Error('Cannot write "' + src + '" after document load'); | |
} | |
} | |
doc.write('<script type="text/javascript" src="' + src + '"></' + "script>"); | |
return true; | |
} else { | |
return false; | |
} | |
}; | |
goog.writeScripts_ = function() { | |
var scripts = []; | |
var seenScript = {}; | |
var deps = goog.dependencies_; | |
function visitNode(path) { | |
if (path in deps.written) { | |
return; | |
} | |
if (path in deps.visited) { | |
if (!(path in seenScript)) { | |
seenScript[path] = true; | |
scripts.push(path); | |
} | |
return; | |
} | |
deps.visited[path] = true; | |
if (path in deps.requires) { | |
for (var requireName in deps.requires[path]) { | |
if (!goog.isProvided_(requireName)) { | |
if (requireName in deps.nameToPath) { | |
visitNode(deps.nameToPath[requireName]); | |
} else { | |
throw Error("Undefined nameToPath for " + requireName); | |
} | |
} | |
} | |
} | |
if (!(path in seenScript)) { | |
seenScript[path] = true; | |
scripts.push(path); | |
} | |
} | |
for (var path in goog.included_) { | |
if (!deps.written[path]) { | |
visitNode(path); | |
} | |
} | |
for (var i = 0;i < scripts.length;i++) { | |
if (scripts[i]) { | |
goog.importScript_(goog.basePath + scripts[i]); | |
} else { | |
throw Error("Undefined script input"); | |
} | |
} | |
}; | |
goog.getPathFromDeps_ = function(rule) { | |
if (rule in goog.dependencies_.nameToPath) { | |
return goog.dependencies_.nameToPath[rule]; | |
} else { | |
return null; | |
} | |
}; | |
goog.findBasePath_(); | |
if (!goog.global.CLOSURE_NO_DEPS) { | |
goog.importScript_(goog.basePath + "deps.js"); | |
} | |
} | |
goog.typeOf = function(value) { | |
var s = typeof value; | |
if (s == "object") { | |
if (value) { | |
if (value instanceof Array) { | |
return "array"; | |
} else { | |
if (value instanceof Object) { | |
return s; | |
} | |
} | |
var className = Object.prototype.toString.call((value)); | |
if (className == "[object Window]") { | |
return "object"; | |
} | |
if (className == "[object Array]" || typeof value.length == "number" && (typeof value.splice != "undefined" && (typeof value.propertyIsEnumerable != "undefined" && !value.propertyIsEnumerable("splice")))) { | |
return "array"; | |
} | |
if (className == "[object Function]" || typeof value.call != "undefined" && (typeof value.propertyIsEnumerable != "undefined" && !value.propertyIsEnumerable("call"))) { | |
return "function"; | |
} | |
} else { | |
return "null"; | |
} | |
} else { | |
if (s == "function" && typeof value.call == "undefined") { | |
return "object"; | |
} | |
} | |
return s; | |
}; | |
goog.isDef = function(val) { | |
return val !== undefined; | |
}; | |
goog.isNull = function(val) { | |
return val === null; | |
}; | |
goog.isDefAndNotNull = function(val) { | |
return val != null; | |
}; | |
goog.isArray = function(val) { | |
return goog.typeOf(val) == "array"; | |
}; | |
goog.isArrayLike = function(val) { | |
var type = goog.typeOf(val); | |
return type == "array" || type == "object" && typeof val.length == "number"; | |
}; | |
goog.isDateLike = function(val) { | |
return goog.isObject(val) && typeof val.getFullYear == "function"; | |
}; | |
goog.isString = function(val) { | |
return typeof val == "string"; | |
}; | |
goog.isBoolean = function(val) { | |
return typeof val == "boolean"; | |
}; | |
goog.isNumber = function(val) { | |
return typeof val == "number"; | |
}; | |
goog.isFunction = function(val) { | |
return goog.typeOf(val) == "function"; | |
}; | |
goog.isObject = function(val) { | |
var type = typeof val; | |
return type == "object" && val != null || type == "function"; | |
}; | |
goog.getUid = function(obj) { | |
return obj[goog.UID_PROPERTY_] || (obj[goog.UID_PROPERTY_] = ++goog.uidCounter_); | |
}; | |
goog.hasUid = function(obj) { | |
return!!obj[goog.UID_PROPERTY_]; | |
}; | |
goog.removeUid = function(obj) { | |
if ("removeAttribute" in obj) { | |
obj.removeAttribute(goog.UID_PROPERTY_); | |
} | |
try { | |
delete obj[goog.UID_PROPERTY_]; | |
} catch (ex) { | |
} | |
}; | |
goog.UID_PROPERTY_ = "closure_uid_" + (Math.random() * 1E9 >>> 0); | |
goog.uidCounter_ = 0; | |
goog.getHashCode = goog.getUid; | |
goog.removeHashCode = goog.removeUid; | |
goog.cloneObject = function(obj) { | |
var type = goog.typeOf(obj); | |
if (type == "object" || type == "array") { | |
if (obj.clone) { | |
return obj.clone(); | |
} | |
var clone = type == "array" ? [] : {}; | |
for (var key in obj) { | |
clone[key] = goog.cloneObject(obj[key]); | |
} | |
return clone; | |
} | |
return obj; | |
}; | |
goog.bindNative_ = function(fn, selfObj, var_args) { | |
return(fn.call.apply(fn.bind, arguments)); | |
}; | |
goog.bindJs_ = function(fn, selfObj, var_args) { | |
if (!fn) { | |
throw new Error; | |
} | |
if (arguments.length > 2) { | |
var boundArgs = Array.prototype.slice.call(arguments, 2); | |
return function() { | |
var newArgs = Array.prototype.slice.call(arguments); | |
Array.prototype.unshift.apply(newArgs, boundArgs); | |
return fn.apply(selfObj, newArgs); | |
}; | |
} else { | |
return function() { | |
return fn.apply(selfObj, arguments); | |
}; | |
} | |
}; | |
goog.bind = function(fn, selfObj, var_args) { | |
if (Function.prototype.bind && Function.prototype.bind.toString().indexOf("native code") != -1) { | |
goog.bind = goog.bindNative_; | |
} else { | |
goog.bind = goog.bindJs_; | |
} | |
return goog.bind.apply(null, arguments); | |
}; | |
goog.partial = function(fn, var_args) { | |
var args = Array.prototype.slice.call(arguments, 1); | |
return function() { | |
var newArgs = args.slice(); | |
newArgs.push.apply(newArgs, arguments); | |
return fn.apply(this, newArgs); | |
}; | |
}; | |
goog.mixin = function(target, source) { | |
for (var x in source) { | |
target[x] = source[x]; | |
} | |
}; | |
goog.now = goog.TRUSTED_SITE && Date.now || function() { | |
return+new Date; | |
}; | |
goog.globalEval = function(script) { | |
if (goog.global.execScript) { | |
goog.global.execScript(script, "JavaScript"); | |
} else { | |
if (goog.global.eval) { | |
if (goog.evalWorksForGlobals_ == null) { | |
goog.global.eval("var _et_ = 1;"); | |
if (typeof goog.global["_et_"] != "undefined") { | |
delete goog.global["_et_"]; | |
goog.evalWorksForGlobals_ = true; | |
} else { | |
goog.evalWorksForGlobals_ = false; | |
} | |
} | |
if (goog.evalWorksForGlobals_) { | |
goog.global.eval(script); | |
} else { | |
var doc = goog.global.document; | |
var scriptElt = doc.createElement("script"); | |
scriptElt.type = "text/javascript"; | |
scriptElt.defer = false; | |
scriptElt.appendChild(doc.createTextNode(script)); | |
doc.body.appendChild(scriptElt); | |
doc.body.removeChild(scriptElt); | |
} | |
} else { | |
throw Error("goog.globalEval not available"); | |
} | |
} | |
}; | |
goog.evalWorksForGlobals_ = null; | |
goog.cssNameMapping_; | |
goog.cssNameMappingStyle_; | |
goog.getCssName = function(className, opt_modifier) { | |
var getMapping = function(cssName) { | |
return goog.cssNameMapping_[cssName] || cssName; | |
}; | |
var renameByParts = function(cssName) { | |
var parts = cssName.split("-"); | |
var mapped = []; | |
for (var i = 0;i < parts.length;i++) { | |
mapped.push(getMapping(parts[i])); | |
} | |
return mapped.join("-"); | |
}; | |
var rename; | |
if (goog.cssNameMapping_) { | |
rename = goog.cssNameMappingStyle_ == "BY_WHOLE" ? getMapping : renameByParts; | |
} else { | |
rename = function(a) { | |
return a; | |
}; | |
} | |
if (opt_modifier) { | |
return className + "-" + rename(opt_modifier); | |
} else { | |
return rename(className); | |
} | |
}; | |
goog.setCssNameMapping = function(mapping, opt_style) { | |
goog.cssNameMapping_ = mapping; | |
goog.cssNameMappingStyle_ = opt_style; | |
}; | |
goog.global.CLOSURE_CSS_NAME_MAPPING; | |
if (!COMPILED && goog.global.CLOSURE_CSS_NAME_MAPPING) { | |
goog.cssNameMapping_ = goog.global.CLOSURE_CSS_NAME_MAPPING; | |
} | |
goog.getMsg = function(str, opt_values) { | |
var values = opt_values || {}; | |
for (var key in values) { | |
var value = ("" + values[key]).replace(/\$/g, "$$$$"); | |
str = str.replace(new RegExp("\\{\\$" + key + "\\}", "gi"), value); | |
} | |
return str; | |
}; | |
goog.getMsgWithFallback = function(a, b) { | |
return a; | |
}; | |
goog.exportSymbol = function(publicPath, object, opt_objectToExportTo) { | |
goog.exportPath_(publicPath, object, opt_objectToExportTo); | |
}; | |
goog.exportProperty = function(object, publicName, symbol) { | |
object[publicName] = symbol; | |
}; | |
goog.inherits = function(childCtor, parentCtor) { | |
function tempCtor() { | |
} | |
tempCtor.prototype = parentCtor.prototype; | |
childCtor.superClass_ = parentCtor.prototype; | |
childCtor.prototype = new tempCtor; | |
childCtor.prototype.constructor = childCtor; | |
childCtor.base = function(me, methodName, var_args) { | |
var args = Array.prototype.slice.call(arguments, 2); | |
return parentCtor.prototype[methodName].apply(me, args); | |
}; | |
}; | |
goog.base = function(me, opt_methodName, var_args) { | |
var caller = arguments.callee.caller; | |
if (goog.DEBUG) { | |
if (!caller) { | |
throw Error("arguments.caller not defined. goog.base() expects not " + "to be running in strict mode. See " + "http://www.ecma-international.org/ecma-262/5.1/#sec-C"); | |
} | |
} | |
if (caller.superClass_) { | |
return caller.superClass_.constructor.apply(me, Array.prototype.slice.call(arguments, 1)); | |
} | |
var args = Array.prototype.slice.call(arguments, 2); | |
var foundCaller = false; | |
for (var ctor = me.constructor;ctor;ctor = ctor.superClass_ && ctor.superClass_.constructor) { | |
if (ctor.prototype[opt_methodName] === caller) { | |
foundCaller = true; | |
} else { | |
if (foundCaller) { | |
return ctor.prototype[opt_methodName].apply(me, args); | |
} | |
} | |
} | |
if (me[opt_methodName] === caller) { | |
return me.constructor.prototype[opt_methodName].apply(me, args); | |
} else { | |
throw Error("goog.base called from a method of one name " + "to a method of a different name"); | |
} | |
}; | |
goog.scope = function(fn) { | |
fn.call(goog.global); | |
}; | |
goog.provide("fb.simplelogin.Vars"); | |
goog.provide("fb.simplelogin.Vars_"); | |
fb.simplelogin.Vars_ = function() { | |
this.apiHost = "https://auth.firebase.com"; | |
}; | |
fb.simplelogin.Vars_.prototype.setApiHost = function(apiHost) { | |
this.apiHost = apiHost; | |
}; | |
fb.simplelogin.Vars_.prototype.getApiHost = function() { | |
return this.apiHost; | |
}; | |
fb.simplelogin.Vars = new fb.simplelogin.Vars_; | |
goog.provide("goog.json"); | |
goog.provide("goog.json.Replacer"); | |
goog.provide("goog.json.Reviver"); | |
goog.provide("goog.json.Serializer"); | |
goog.define("goog.json.USE_NATIVE_JSON", false); | |
goog.json.isValid_ = function(s) { | |
if (/^\s*$/.test(s)) { | |
return false; | |
} | |
var backslashesRe = /\\["\\\/bfnrtu]/g; | |
var simpleValuesRe = /"[^"\\\n\r\u2028\u2029\x00-\x08\x0a-\x1f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; | |
var openBracketsRe = /(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g; | |
var remainderRe = /^[\],:{}\s\u2028\u2029]*$/; | |
return remainderRe.test(s.replace(backslashesRe, "@").replace(simpleValuesRe, "]").replace(openBracketsRe, "")); | |
}; | |
goog.json.parse = goog.json.USE_NATIVE_JSON ? (goog.global["JSON"]["parse"]) : function(s) { | |
var o = String(s); | |
if (goog.json.isValid_(o)) { | |
try { | |
return(eval("(" + o + ")")); | |
} catch (ex) { | |
} | |
} | |
throw Error("Invalid JSON string: " + o); | |
}; | |
goog.json.unsafeParse = goog.json.USE_NATIVE_JSON ? (goog.global["JSON"]["parse"]) : function(s) { | |
return(eval("(" + s + ")")); | |
}; | |
goog.json.Replacer; | |
goog.json.Reviver; | |
goog.json.serialize = goog.json.USE_NATIVE_JSON ? (goog.global["JSON"]["stringify"]) : function(object, opt_replacer) { | |
return(new goog.json.Serializer(opt_replacer)).serialize(object); | |
}; | |
goog.json.Serializer = function(opt_replacer) { | |
this.replacer_ = opt_replacer; | |
}; | |
goog.json.Serializer.prototype.serialize = function(object) { | |
var sb = []; | |
this.serialize_(object, sb); | |
return sb.join(""); | |
}; | |
goog.json.Serializer.prototype.serialize_ = function(object, sb) { | |
switch(typeof object) { | |
case "string": | |
this.serializeString_((object), sb); | |
break; | |
case "number": | |
this.serializeNumber_((object), sb); | |
break; | |
case "boolean": | |
sb.push(object); | |
break; | |
case "undefined": | |
sb.push("null"); | |
break; | |
case "object": | |
if (object == null) { | |
sb.push("null"); | |
break; | |
} | |
if (goog.isArray(object)) { | |
this.serializeArray((object), sb); | |
break; | |
} | |
this.serializeObject_((object), sb); | |
break; | |
case "function": | |
break; | |
default: | |
throw Error("Unknown type: " + typeof object);; | |
} | |
}; | |
goog.json.Serializer.charToJsonCharCache_ = {'"':'\\"', "\\":"\\\\", "/":"\\/", "\b":"\\b", "\f":"\\f", "\n":"\\n", "\r":"\\r", "\t":"\\t", "\x0B":"\\u000b"}; | |
goog.json.Serializer.charsToReplace_ = /\uffff/.test("\uffff") ? /[\\\"\x00-\x1f\x7f-\uffff]/g : /[\\\"\x00-\x1f\x7f-\xff]/g; | |
goog.json.Serializer.prototype.serializeString_ = function(s, sb) { | |
sb.push('"', s.replace(goog.json.Serializer.charsToReplace_, function(c) { | |
if (c in goog.json.Serializer.charToJsonCharCache_) { | |
return goog.json.Serializer.charToJsonCharCache_[c]; | |
} | |
var cc = c.charCodeAt(0); | |
var rv = "\\u"; | |
if (cc < 16) { | |
rv += "000"; | |
} else { | |
if (cc < 256) { | |
rv += "00"; | |
} else { | |
if (cc < 4096) { | |
rv += "0"; | |
} | |
} | |
} | |
return goog.json.Serializer.charToJsonCharCache_[c] = rv + cc.toString(16); | |
}), '"'); | |
}; | |
goog.json.Serializer.prototype.serializeNumber_ = function(n, sb) { | |
sb.push(isFinite(n) && !isNaN(n) ? n : "null"); | |
}; | |
goog.json.Serializer.prototype.serializeArray = function(arr, sb) { | |
var l = arr.length; | |
sb.push("["); | |
var sep = ""; | |
for (var i = 0;i < l;i++) { | |
sb.push(sep); | |
var value = arr[i]; | |
this.serialize_(this.replacer_ ? this.replacer_.call(arr, String(i), value) : value, sb); | |
sep = ","; | |
} | |
sb.push("]"); | |
}; | |
goog.json.Serializer.prototype.serializeObject_ = function(obj, sb) { | |
sb.push("{"); | |
var sep = ""; | |
for (var key in obj) { | |
if (Object.prototype.hasOwnProperty.call(obj, key)) { | |
var value = obj[key]; | |
if (typeof value != "function") { | |
sb.push(sep); | |
this.serializeString_(key, sb); | |
sb.push(":"); | |
this.serialize_(this.replacer_ ? this.replacer_.call(obj, key, value) : value, sb); | |
sep = ","; | |
} | |
} | |
} | |
sb.push("}"); | |
}; | |
goog.provide("fb.simplelogin.util.json"); | |
goog.require("goog.json"); | |
fb.simplelogin.util.json.eval = function(str) { | |
if (typeof JSON !== "undefined" && goog.isDef(JSON.parse)) { | |
return JSON.parse(str); | |
} else { | |
return goog.json.parse(str); | |
} | |
}; | |
fb.simplelogin.util.json.stringify = function(data) { | |
if (typeof JSON !== "undefined" && goog.isDef(JSON.stringify)) { | |
return JSON.stringify(data); | |
} else { | |
return goog.json.serialize(data); | |
} | |
}; | |
goog.provide("fb.simplelogin.transports.Transport"); | |
fb.simplelogin.Transport = function() { | |
}; | |
fb.simplelogin.Transport.prototype.open = function(url, options, onComplete) { | |
}; | |
goog.provide("fb.simplelogin.transports.Popup"); | |
goog.require("fb.simplelogin.transports.Transport"); | |
fb.simplelogin.Popup = function() { | |
}; | |
fb.simplelogin.Popup.prototype.open = function(url, options, onComplete) { | |
}; | |
goog.provide("fb.simplelogin.util.misc"); | |
goog.require("goog.json"); | |
fb.simplelogin.util.misc.parseUrl = function(url) { | |
var a = document.createElement("a"); | |
a.href = url; | |
return{protocol:a.protocol.replace(":", ""), host:a.hostname, port:a.port, query:a.search, params:fb.simplelogin.util.misc.parseQuerystring(a.search), hash:a.hash.replace("#", ""), path:a.pathname.replace(/^([^\/])/, "/$1")}; | |
}; | |
fb.simplelogin.util.misc.parseQuerystring = function(str) { | |
var obj = {}; | |
var tokens = str.replace(/^\?/, "").split("&"); | |
for (var i = 0;i < tokens.length;i++) { | |
if (tokens[i]) { | |
var key = tokens[i].split("="); | |
obj[key[0]] = key[1]; | |
} | |
} | |
return obj; | |
}; | |
goog.provide("fb.simplelogin.transports.CordovaInAppBrowser"); | |
goog.provide("fb.simplelogin.transports.CordovaInAppBrowser_"); | |
goog.require("fb.simplelogin.transports.Popup"); | |
goog.require("fb.simplelogin.Vars"); | |
goog.require("fb.simplelogin.util.json"); | |
goog.require("fb.simplelogin.util.misc"); | |
var popupTimeout = 4E4; | |
fb.simplelogin.transports.CordovaInAppBrowser_ = function() { | |
}; | |
fb.simplelogin.transports.CordovaInAppBrowser_.prototype.open = function(url, options, onComplete) { | |
callbackInvoked = false; | |
var callbackHandler = function() { | |
var args = Array.prototype.slice.apply(arguments); | |
if (!callbackInvoked) { | |
callbackInvoked = true; | |
onComplete.apply(null, args); | |
} | |
}; | |
var windowRef = window["open"](url + "&transport=internal-redirect-hash", "blank", "location=no"); | |
windowRef.addEventListener("loadstop", function(event) { | |
var result; | |
if (event && event["url"]) { | |
var urlObj = fb.simplelogin.util.misc.parseUrl(event["url"]); | |
if (urlObj["path"] !== "/blank/page.html") { | |
return; | |
} | |
windowRef.close(); | |
try { | |
var urlHashEncoded = fb.simplelogin.util.misc.parseQuerystring(decodeURIComponent(urlObj["hash"])); | |
var temporaryResult = {}; | |
for (var key in urlHashEncoded) { | |
temporaryResult[key] = fb.simplelogin.util.json.eval(urlHashEncoded[key]); | |
} | |
result = temporaryResult; | |
} catch (e) { | |
} | |
if (result && (result["token"] && result["user"])) { | |
callbackHandler(null, result); | |
} else { | |
if (result && result["error"]) { | |
callbackHandler(result["error"]); | |
} else { | |
callbackHandler({code:"UNKNOWN_ERROR", message:"An unknown error occurred."}); | |
} | |
} | |
} | |
}); | |
windowRef.addEventListener("exit", function(event) { | |
callbackHandler({code:"USER_DENIED", message:"User cancelled the authentication request."}); | |
}); | |
setTimeout(function() { | |
if (windowRef && windowRef["close"]) { | |
windowRef["close"](); | |
} | |
}, popupTimeout); | |
}; | |
fb.simplelogin.transports.CordovaInAppBrowser = new fb.simplelogin.transports.CordovaInAppBrowser_; | |
goog.provide("fb.simplelogin.Errors"); | |
var messagePrefix = "FirebaseSimpleLogin: "; | |
var errors = {"UNKNOWN_ERROR":"An unknown error occurred.", "INVALID_EMAIL":"Invalid email specified.", "INVALID_PASSWORD":"Invalid password specified.", "USER_DENIED":"User cancelled the authentication request.", "TRIGGER_IO_TABS":'The "forge.tabs" module required when using Firebase Simple Login and Trigger.io. Without this module included and enabled, login attempts to OAuth authentication providers will not be able to complete.'}; | |
fb.simplelogin.Errors.format = function(errorCode, errorMessage) { | |
var code = errorCode || "UNKNOWN_ERROR", message = errorMessage || errors[code], data = {}, args = arguments; | |
if (args.length === 2) { | |
code = args[0]; | |
message = args[1]; | |
} else { | |
if (args.length === 1) { | |
if (typeof args[0] === "object" && (args[0].code && args[0].message)) { | |
code = args[0].code; | |
message = args[0].message; | |
data = args[0].data; | |
} else { | |
if (typeof args[0] === "string") { | |
code = args[0]; | |
message = ""; | |
} | |
} | |
} | |
} | |
var error = new Error(messagePrefix + message); | |
error.code = code; | |
if (data) { | |
error.data = data; | |
} | |
return error; | |
}; | |
fb.simplelogin.Errors.get = function(code) { | |
if (!errors[code]) { | |
code = "UNKNOWN_ERROR"; | |
} | |
return fb.simplelogin.Errors.format(code, errors[code]); | |
}; | |
goog.provide("fb.simplelogin.transports.WinChan"); | |
goog.require("fb.simplelogin.transports.Transport"); | |
goog.require("fb.simplelogin.Vars"); | |
goog.require("fb.simplelogin.util.json"); | |
fb.simplelogin.transports.WinChan = function() { | |
var RELAY_FRAME_NAME = "__winchan_relay_frame"; | |
var CLOSE_CMD = "die"; | |
function addListener(w, event, cb) { | |
if (w.attachEvent) { | |
w.attachEvent("on" + event, cb); | |
} else { | |
if (w.addEventListener) { | |
w.addEventListener(event, cb, false); | |
} | |
} | |
} | |
function removeListener(w, event, cb) { | |
if (w.detachEvent) { | |
w.detachEvent("on" + event, cb); | |
} else { | |
if (w.removeEventListener) { | |
w.removeEventListener(event, cb, false); | |
} | |
} | |
} | |
function isInternetExplorer() { | |
var rv = -1; | |
var ua = navigator.userAgent; | |
if (navigator.appName === "Microsoft Internet Explorer") { | |
var re = /MSIE ([0-9]{1,}[\.0-9]{0,})/; | |
var match = ua.match(re); | |
if (match && match.length > 1) { | |
rv = parseFloat(match[1]); | |
} | |
} else { | |
if (ua.indexOf("Trident") > -1) { | |
var re = /rv:([0-9]{2,2}[\.0-9]{0,})/; | |
var match = ua.match(re); | |
if (match && match.length > 1) { | |
rv = parseFloat(match[1]); | |
} | |
} | |
} | |
return rv >= 8; | |
} | |
function isFennec() { | |
try { | |
var userAgent = navigator.userAgent; | |
return userAgent.indexOf("Fennec/") != -1 || userAgent.indexOf("Firefox/") != -1 && userAgent.indexOf("Android") != -1; | |
} catch (e) { | |
} | |
return false; | |
} | |
function isSupported() { | |
return fb.simplelogin.util.json && (fb.simplelogin.util.json.eval && (fb.simplelogin.util.json.stringify && window.postMessage)); | |
} | |
function extractOrigin(url) { | |
if (!/^https?:\/\//.test(url)) { | |
url = window.location.href; | |
} | |
var m = /^(https?:\/\/[\-_a-zA-Z\.0-9:]+)/.exec(url); | |
if (m) { | |
return m[1]; | |
} | |
return url; | |
} | |
function findRelay() { | |
var loc = window.location; | |
var frames = window.opener.frames; | |
var origin = loc.protocol + "//" + loc.host; | |
for (var i = frames.length - 1;i >= 0;i--) { | |
try { | |
if (frames[i].location.href.indexOf(origin) === 0 && frames[i].name === RELAY_FRAME_NAME) { | |
return frames[i]; | |
} | |
} catch (e) { | |
} | |
} | |
return; | |
} | |
var isIE = isInternetExplorer(); | |
if (isSupported()) { | |
return{open:function(url, opts, cb) { | |
if (!cb) { | |
throw "missing required callback argument"; | |
} | |
opts.url = url; | |
var err; | |
if (!opts.url) { | |
err = "missing required 'url' parameter"; | |
} | |
if (!opts.relay_url) { | |
err = "missing required 'relay_url' parameter"; | |
} | |
if (err) { | |
setTimeout(function() { | |
cb(err); | |
}, 0); | |
} | |
if (!opts.window_name) { | |
opts.window_name = null; | |
} | |
if (!opts.window_features || isFennec()) { | |
opts.window_features = undefined; | |
} | |
var iframe; | |
var origin = extractOrigin(opts.url); | |
if (origin !== extractOrigin(opts.relay_url)) { | |
return setTimeout(function() { | |
cb("invalid arguments: origin of url and relay_url must match"); | |
}, 0); | |
} | |
var messageTarget; | |
if (isIE) { | |
iframe = document.createElement("iframe"); | |
iframe.setAttribute("src", opts.relay_url); | |
iframe.style.display = "none"; | |
iframe.setAttribute("name", RELAY_FRAME_NAME); | |
document.body.appendChild(iframe); | |
messageTarget = iframe.contentWindow; | |
} | |
var w = window.open(opts.url, opts.window_name, opts.window_features); | |
if (!messageTarget) { | |
messageTarget = w; | |
} | |
var closeInterval = setInterval(function() { | |
if (w && w.closed) { | |
cleanup(); | |
if (cb) { | |
cb("unknown closed window"); | |
cb = null; | |
} | |
} | |
}, 500); | |
var req = fb.simplelogin.util.json.stringify({a:"request", d:opts.params}); | |
function cleanup() { | |
if (iframe) { | |
document.body.removeChild(iframe); | |
} | |
iframe = undefined; | |
if (closeInterval) { | |
closeInterval = clearInterval(closeInterval); | |
} | |
removeListener(window, "message", onMessage); | |
removeListener(window, "unload", cleanup); | |
if (w) { | |
try { | |
w.close(); | |
} catch (securityViolation) { | |
messageTarget.postMessage(CLOSE_CMD, origin); | |
} | |
} | |
w = messageTarget = undefined; | |
} | |
addListener(window, "unload", cleanup); | |
function onMessage(e) { | |
if (e.origin !== origin) { | |
return; | |
} | |
try { | |
var d = fb.simplelogin.util.json.eval(e.data); | |
if (d.a === "ready") { | |
messageTarget.postMessage(req, origin); | |
} else { | |
if (d.a === "error") { | |
cleanup(); | |
if (cb) { | |
cb(d.d); | |
cb = null; | |
} | |
} else { | |
if (d.a === "response") { | |
cleanup(); | |
if (cb) { | |
cb(null, d.d); | |
cb = null; | |
} | |
} | |
} | |
} | |
} catch (err) { | |
} | |
} | |
addListener(window, "message", onMessage); | |
return{close:cleanup, focus:function() { | |
if (w) { | |
try { | |
w.focus(); | |
} catch (e) { | |
} | |
} | |
}}; | |
}, onOpen:function(cb) { | |
var o = "*"; | |
var msgTarget = isIE ? findRelay() : window.opener; | |
if (!msgTarget) { | |
throw "can't find relay frame"; | |
} | |
function doPost(msg) { | |
msg = fb.simplelogin.util.json.stringify(msg); | |
if (isIE) { | |
msgTarget.doPost(msg, o); | |
} else { | |
msgTarget.postMessage(msg, o); | |
} | |
} | |
function onMessage(e) { | |
var d; | |
try { | |
d = fb.simplelogin.util.json.eval(e.data); | |
} catch (err) { | |
} | |
if (!d || d.a !== "request") { | |
return; | |
} | |
removeListener(window, "message", onMessage); | |
o = e.origin; | |
if (cb) { | |
setTimeout(function() { | |
cb(o, d.d, function(r) { | |
cb = undefined; | |
doPost({a:"response", d:r}); | |
}); | |
}, 0); | |
} | |
} | |
function onDie(e) { | |
if (e.data === CLOSE_CMD) { | |
try { | |
window.close(); | |
} catch (o_O) { | |
} | |
} | |
} | |
addListener(isIE ? msgTarget : window, "message", onMessage); | |
addListener(isIE ? msgTarget : window, "message", onDie); | |
try { | |
doPost({a:"ready"}); | |
} catch (e) { | |
addListener(msgTarget, "load", function(e) { | |
doPost({a:"ready"}); | |
}); | |
} | |
var onUnload = function() { | |
try { | |
removeListener(isIE ? msgTarget : window, "message", onDie); | |
} catch (ohWell) { | |
} | |
if (cb) { | |
doPost({a:"error", d:"client closed window"}); | |
} | |
cb = undefined; | |
try { | |
window.close(); | |
} catch (e) { | |
} | |
}; | |
addListener(window, "unload", onUnload); | |
return{detach:function() { | |
removeListener(window, "unload", onUnload); | |
}}; | |
}}; | |
} else { | |
return{open:function(url, winopts, arg, cb) { | |
setTimeout(function() { | |
cb("unsupported browser"); | |
}, 0); | |
}, onOpen:function(cb) { | |
setTimeout(function() { | |
cb("unsupported browser"); | |
}, 0); | |
}}; | |
} | |
}(); | |
goog.provide("fb.simplelogin.transports.TriggerIoTab"); | |
goog.provide("fb.simplelogin.transports.TriggerIoTab_"); | |
goog.require("fb.simplelogin.transports.Popup"); | |
goog.require("fb.simplelogin.Vars"); | |
goog.require("fb.simplelogin.util.json"); | |
goog.require("fb.simplelogin.util.misc"); | |
fb.simplelogin.transports.TriggerIoTab_ = function() { | |
}; | |
fb.simplelogin.transports.TriggerIoTab_.prototype.open = function(url, options, onComplete) { | |
var Forge, Tabs; | |
try { | |
Forge = window["forge"]; | |
Tabs = Forge["tabs"]; | |
} catch (err) { | |
return onComplete({code:"TRIGGER_IO_TABS", message:'"forge.tabs" module required when using Firebase Simple Login and Trigger.io'}); | |
} | |
callbackInvoked = false; | |
var callbackHandler = function() { | |
var args = Array.prototype.slice.apply(arguments); | |
if (!callbackInvoked) { | |
callbackInvoked = true; | |
onComplete.apply(null, args); | |
} | |
}; | |
forge.tabs.openWithOptions({url:url + "&transport=internal-redirect-hash", pattern:fb.simplelogin.Vars.getApiHost() + "/blank/page*"}, function(data) { | |
var result; | |
if (data && data["url"]) { | |
try { | |
var urlObj = fb.simplelogin.util.misc.parseUrl(data["url"]); | |
var urlHashEncoded = fb.simplelogin.util.misc.parseQuerystring(decodeURIComponent(urlObj["hash"])); | |
var temporaryResult = {}; | |
for (var key in urlHashEncoded) { | |
temporaryResult[key] = fb.simplelogin.util.json.eval(urlHashEncoded[key]); | |
} | |
result = temporaryResult; | |
} catch (e) { | |
} | |
} | |
if (result && (result["token"] && result["user"])) { | |
callbackHandler(null, result); | |
} else { | |
if (result && result["error"]) { | |
callbackHandler(result["error"]); | |
} else { | |
callbackHandler({code:"UNKNOWN_ERROR", message:"An unknown error occurred."}); | |
} | |
} | |
}, function(err) { | |
callbackHandler({code:"UNKNOWN_ERROR", message:"An unknown error occurred."}); | |
}); | |
}; | |
fb.simplelogin.transports.TriggerIoTab = new fb.simplelogin.transports.TriggerIoTab_; | |
goog.provide("fb.simplelogin.util.sjcl"); | |
var sjcl = {cipher:{}, hash:{}, keyexchange:{}, mode:{}, misc:{}, codec:{}, exception:{corrupt:function(a) { | |
this.toString = function() { | |
return "CORRUPT: " + this.message; | |
}; | |
this.message = a; | |
}, invalid:function(a) { | |
this.toString = function() { | |
return "INVALID: " + this.message; | |
}; | |
this.message = a; | |
}, bug:function(a) { | |
this.toString = function() { | |
return "BUG: " + this.message; | |
}; | |
this.message = a; | |
}, notReady:function(a) { | |
this.toString = function() { | |
return "NOT READY: " + this.message; | |
}; | |
this.message = a; | |
}}}; | |
if (typeof module != "undefined" && module.exports) { | |
module.exports = sjcl; | |
} | |
sjcl.cipher.aes = function(a) { | |
this.h[0][0][0] || this.w(); | |
var b, c, d, e, f = this.h[0][4], g = this.h[1]; | |
b = a.length; | |
var h = 1; | |
if (b !== 4 && (b !== 6 && b !== 8)) { | |
throw new sjcl.exception.invalid("invalid aes key size"); | |
} | |
this.a = [d = a.slice(0), e = []]; | |
for (a = b;a < 4 * b + 28;a++) { | |
c = d[a - 1]; | |
if (a % b === 0 || b === 8 && a % b === 4) { | |
c = f[c >>> 24] << 24 ^ f[c >> 16 & 255] << 16 ^ f[c >> 8 & 255] << 8 ^ f[c & 255]; | |
if (a % b === 0) { | |
c = c << 8 ^ c >>> 24 ^ h << 24; | |
h = h << 1 ^ (h >> 7) * 283; | |
} | |
} | |
d[a] = d[a - b] ^ c; | |
} | |
for (b = 0;a;b++, a--) { | |
c = d[b & 3 ? a : a - 4]; | |
e[b] = a <= 4 || b < 4 ? c : g[0][f[c >>> 24]] ^ g[1][f[c >> 16 & 255]] ^ g[2][f[c >> 8 & 255]] ^ g[3][f[c & 255]]; | |
} | |
}; | |
sjcl.cipher.aes.prototype = {encrypt:function(a) { | |
return this.G(a, 0); | |
}, decrypt:function(a) { | |
return this.G(a, 1); | |
}, h:[[[], [], [], [], []], [[], [], [], [], []]], w:function() { | |
var a = this.h[0], b = this.h[1], c = a[4], d = b[4], e, f, g, h = [], i = [], k, j, l, m; | |
for (e = 0;e < 256;e++) { | |
i[(h[e] = e << 1 ^ (e >> 7) * 283) ^ e] = e; | |
} | |
for (f = g = 0;!c[f];f ^= k || 1, g = i[g] || 1) { | |
l = g ^ g << 1 ^ g << 2 ^ g << 3 ^ g << 4; | |
l = l >> 8 ^ l & 255 ^ 99; | |
c[f] = l; | |
d[l] = f; | |
j = h[e = h[k = h[f]]]; | |
m = j * 16843009 ^ e * 65537 ^ k * 257 ^ f * 16843008; | |
j = h[l] * 257 ^ l * 16843008; | |
for (e = 0;e < 4;e++) { | |
a[e][f] = j = j << 24 ^ j >>> 8; | |
b[e][l] = m = m << 24 ^ m >>> 8; | |
} | |
} | |
for (e = 0;e < 5;e++) { | |
a[e] = a[e].slice(0); | |
b[e] = b[e].slice(0); | |
} | |
}, G:function(a, b) { | |
if (a.length !== 4) { | |
throw new sjcl.exception.invalid("invalid aes block size"); | |
} | |
var c = this.a[b], d = a[0] ^ c[0], e = a[b ? 3 : 1] ^ c[1], f = a[2] ^ c[2]; | |
a = a[b ? 1 : 3] ^ c[3]; | |
var g, h, i, k = c.length / 4 - 2, j, l = 4, m = [0, 0, 0, 0]; | |
g = this.h[b]; | |
var n = g[0], o = g[1], p = g[2], q = g[3], r = g[4]; | |
for (j = 0;j < k;j++) { | |
g = n[d >>> 24] ^ o[e >> 16 & 255] ^ p[f >> 8 & 255] ^ q[a & 255] ^ c[l]; | |
h = n[e >>> 24] ^ o[f >> 16 & 255] ^ p[a >> 8 & 255] ^ q[d & 255] ^ c[l + 1]; | |
i = n[f >>> 24] ^ o[a >> 16 & 255] ^ p[d >> 8 & 255] ^ q[e & 255] ^ c[l + 2]; | |
a = n[a >>> 24] ^ o[d >> 16 & 255] ^ p[e >> 8 & 255] ^ q[f & 255] ^ c[l + 3]; | |
l += 4; | |
d = g; | |
e = h; | |
f = i; | |
} | |
for (j = 0;j < 4;j++) { | |
m[b ? 3 & -j : j] = r[d >>> 24] << 24 ^ r[e >> 16 & 255] << 16 ^ r[f >> 8 & 255] << 8 ^ r[a & 255] ^ c[l++]; | |
g = d; | |
d = e; | |
e = f; | |
f = a; | |
a = g; | |
} | |
return m; | |
}}; | |
sjcl.bitArray = {bitSlice:function(a, b, c) { | |
a = sjcl.bitArray.N(a.slice(b / 32), 32 - (b & 31)).slice(1); | |
return c === undefined ? a : sjcl.bitArray.clamp(a, c - b); | |
}, extract:function(a, b, c) { | |
var d = Math.floor(-b - c & 31); | |
return((b + c - 1 ^ b) & -32 ? a[b / 32 | 0] << 32 - d ^ a[b / 32 + 1 | 0] >>> d : a[b / 32 | 0] >>> d) & (1 << c) - 1; | |
}, concat:function(a, b) { | |
if (a.length === 0 || b.length === 0) { | |
return a.concat(b); | |
} | |
var c = a[a.length - 1], d = sjcl.bitArray.getPartial(c); | |
return d === 32 ? a.concat(b) : sjcl.bitArray.N(b, d, c | 0, a.slice(0, a.length - 1)); | |
}, bitLength:function(a) { | |
var b = a.length; | |
if (b === 0) { | |
return 0; | |
} | |
return(b - 1) * 32 + sjcl.bitArray.getPartial(a[b - 1]); | |
}, clamp:function(a, b) { | |
if (a.length * 32 < b) { | |
return a; | |
} | |
a = a.slice(0, Math.ceil(b / 32)); | |
var c = a.length; | |
b &= 31; | |
if (c > 0 && b) { | |
a[c - 1] = sjcl.bitArray.partial(b, a[c - 1] & 2147483648 >> b - 1, 1); | |
} | |
return a; | |
}, partial:function(a, b, c) { | |
if (a === 32) { | |
return b; | |
} | |
return(c ? b | 0 : b << 32 - a) + a * 1099511627776; | |
}, getPartial:function(a) { | |
return Math.round(a / 1099511627776) || 32; | |
}, equal:function(a, b) { | |
if (sjcl.bitArray.bitLength(a) !== sjcl.bitArray.bitLength(b)) { | |
return false; | |
} | |
var c = 0, d; | |
for (d = 0;d < a.length;d++) { | |
c |= a[d] ^ b[d]; | |
} | |
return c === 0; | |
}, N:function(a, b, c, d) { | |
var e; | |
e = 0; | |
if (d === undefined) { | |
d = []; | |
} | |
for (;b >= 32;b -= 32) { | |
d.push(c); | |
c = 0; | |
} | |
if (b === 0) { | |
return d.concat(a); | |
} | |
for (e = 0;e < a.length;e++) { | |
d.push(c | a[e] >>> b); | |
c = a[e] << 32 - b; | |
} | |
e = a.length ? a[a.length - 1] : 0; | |
a = sjcl.bitArray.getPartial(e); | |
d.push(sjcl.bitArray.partial(b + a & 31, b + a > 32 ? c : d.pop(), 1)); | |
return d; | |
}, O:function(a, b) { | |
return[a[0] ^ b[0], a[1] ^ b[1], a[2] ^ b[2], a[3] ^ b[3]]; | |
}}; | |
sjcl.codec.utf8String = {fromBits:function(a) { | |
var b = "", c = sjcl.bitArray.bitLength(a), d, e; | |
for (d = 0;d < c / 8;d++) { | |
if ((d & 3) === 0) { | |
e = a[d / 4]; | |
} | |
b += String.fromCharCode(e >>> 24); | |
e <<= 8; | |
} | |
return decodeURIComponent(escape(b)); | |
}, toBits:function(a) { | |
a = unescape(encodeURIComponent(a)); | |
var b = [], c, d = 0; | |
for (c = 0;c < a.length;c++) { | |
d = d << 8 | a.charCodeAt(c); | |
if ((c & 3) === 3) { | |
b.push(d); | |
d = 0; | |
} | |
} | |
c & 3 && b.push(sjcl.bitArray.partial(8 * (c & 3), d)); | |
return b; | |
}}; | |
sjcl.codec.base64 = {C:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", fromBits:function(a, b, c) { | |
var d = "", e = 0, f = sjcl.codec.base64.C, g = 0, h = sjcl.bitArray.bitLength(a); | |
if (c) { | |
f = f.substr(0, 62) + "-_"; | |
} | |
for (c = 0;d.length * 6 < h;) { | |
d += f.charAt((g ^ a[c] >>> e) >>> 26); | |
if (e < 6) { | |
g = a[c] << 6 - e; | |
e += 26; | |
c++; | |
} else { | |
g <<= 6; | |
e -= 6; | |
} | |
} | |
for (;d.length & 3 && !b;) { | |
d += "="; | |
} | |
return d; | |
}, toBits:function(a, b) { | |
a = a.replace(/\s|=/g, ""); | |
var c = [], d = 0, e = sjcl.codec.base64.C, f = 0, g; | |
if (b) { | |
e = e.substr(0, 62) + "-_"; | |
} | |
for (b = 0;b < a.length;b++) { | |
g = e.indexOf(a.charAt(b)); | |
if (g < 0) { | |
throw new sjcl.exception.invalid("this isn't base64!"); | |
} | |
if (d > 26) { | |
d -= 26; | |
c.push(f ^ g >>> d); | |
f = g << 32 - d; | |
} else { | |
d += 6; | |
f ^= g << 32 - d; | |
} | |
} | |
d & 56 && c.push(sjcl.bitArray.partial(d & 56, f, 1)); | |
return c; | |
}}; | |
sjcl.codec.base64url = {fromBits:function(a) { | |
return sjcl.codec.base64.fromBits(a, 1, 1); | |
}, toBits:function(a) { | |
return sjcl.codec.base64.toBits(a, 1); | |
}}; | |
sjcl.hash.sha256 = function(a) { | |
this.a[0] || this.w(); | |
if (a) { | |
this.m = a.m.slice(0); | |
this.i = a.i.slice(0); | |
this.e = a.e; | |
} else { | |
this.reset(); | |
} | |
}; | |
sjcl.hash.sha256.hash = function(a) { | |
return(new sjcl.hash.sha256).update(a).finalize(); | |
}; | |
sjcl.hash.sha256.prototype = {blockSize:512, reset:function() { | |
this.m = this.L.slice(0); | |
this.i = []; | |
this.e = 0; | |
return this; | |
}, update:function(a) { | |
if (typeof a === "string") { | |
a = sjcl.codec.utf8String.toBits(a); | |
} | |
var b, c = this.i = sjcl.bitArray.concat(this.i, a); | |
b = this.e; | |
a = this.e = b + sjcl.bitArray.bitLength(a); | |
for (b = 512 + b & -512;b <= a;b += 512) { | |
this.B(c.splice(0, 16)); | |
} | |
return this; | |
}, finalize:function() { | |
var a, b = this.i, c = this.m; | |
b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(1, 1)]); | |
for (a = b.length + 2;a & 15;a++) { | |
b.push(0); | |
} | |
b.push(Math.floor(this.e / 4294967296)); | |
for (b.push(this.e | 0);b.length;) { | |
this.B(b.splice(0, 16)); | |
} | |
this.reset(); | |
return c; | |
}, L:[], a:[], w:function() { | |
function a(e) { | |
return(e - Math.floor(e)) * 4294967296 | 0; | |
} | |
var b = 0, c = 2, d; | |
a: for (;b < 64;c++) { | |
for (d = 2;d * d <= c;d++) { | |
if (c % d === 0) { | |
continue a; | |
} | |
} | |
if (b < 8) { | |
this.L[b] = a(Math.pow(c, 0.5)); | |
} | |
this.a[b] = a(Math.pow(c, 1 / 3)); | |
b++; | |
} | |
}, B:function(a) { | |
var b, c, d = a.slice(0), e = this.m, f = this.a, g = e[0], h = e[1], i = e[2], k = e[3], j = e[4], l = e[5], m = e[6], n = e[7]; | |
for (a = 0;a < 64;a++) { | |
if (a < 16) { | |
b = d[a]; | |
} else { | |
b = d[a + 1 & 15]; | |
c = d[a + 14 & 15]; | |
b = d[a & 15] = (b >>> 7 ^ b >>> 18 ^ b >>> 3 ^ b << 25 ^ b << 14) + (c >>> 17 ^ c >>> 19 ^ c >>> 10 ^ c << 15 ^ c << 13) + d[a & 15] + d[a + 9 & 15] | 0; | |
} | |
b = b + n + (j >>> 6 ^ j >>> 11 ^ j >>> 25 ^ j << 26 ^ j << 21 ^ j << 7) + (m ^ j & (l ^ m)) + f[a]; | |
n = m; | |
m = l; | |
l = j; | |
j = k + b | 0; | |
k = i; | |
i = h; | |
h = g; | |
g = b + (h & i ^ k & (h ^ i)) + (h >>> 2 ^ h >>> 13 ^ h >>> 22 ^ h << 30 ^ h << 19 ^ h << 10) | 0; | |
} | |
e[0] = e[0] + g | 0; | |
e[1] = e[1] + h | 0; | |
e[2] = e[2] + i | 0; | |
e[3] = e[3] + k | 0; | |
e[4] = e[4] + j | 0; | |
e[5] = e[5] + l | 0; | |
e[6] = e[6] + m | 0; | |
e[7] = e[7] + n | 0; | |
}}; | |
sjcl.mode.ccm = {name:"ccm", encrypt:function(a, b, c, d, e) { | |
var f, g = b.slice(0), h = sjcl.bitArray, i = h.bitLength(c) / 8, k = h.bitLength(g) / 8; | |
e = e || 64; | |
d = d || []; | |
if (i < 7) { | |
throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes"); | |
} | |
for (f = 2;f < 4 && k >>> 8 * f;f++) { | |
} | |
if (f < 15 - i) { | |
f = 15 - i; | |
} | |
c = h.clamp(c, 8 * (15 - f)); | |
b = sjcl.mode.ccm.F(a, b, c, d, e, f); | |
g = sjcl.mode.ccm.H(a, g, c, b, e, f); | |
return h.concat(g.data, g.tag); | |
}, decrypt:function(a, b, c, d, e) { | |
e = e || 64; | |
d = d || []; | |
var f = sjcl.bitArray, g = f.bitLength(c) / 8, h = f.bitLength(b), i = f.clamp(b, h - e), k = f.bitSlice(b, h - e); | |
h = (h - e) / 8; | |
if (g < 7) { | |
throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes"); | |
} | |
for (b = 2;b < 4 && h >>> 8 * b;b++) { | |
} | |
if (b < 15 - g) { | |
b = 15 - g; | |
} | |
c = f.clamp(c, 8 * (15 - b)); | |
i = sjcl.mode.ccm.H(a, i, c, k, e, b); | |
a = sjcl.mode.ccm.F(a, i.data, c, d, e, b); | |
if (!f.equal(i.tag, a)) { | |
throw new sjcl.exception.corrupt("ccm: tag doesn't match"); | |
} | |
return i.data; | |
}, F:function(a, b, c, d, e, f) { | |
var g = [], h = sjcl.bitArray, i = h.O; | |
e /= 8; | |
if (e % 2 || (e < 4 || e > 16)) { | |
throw new sjcl.exception.invalid("ccm: invalid tag length"); | |
} | |
if (d.length > 4294967295 || b.length > 4294967295) { | |
throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data"); | |
} | |
f = [h.partial(8, (d.length ? 64 : 0) | e - 2 << 2 | f - 1)]; | |
f = h.concat(f, c); | |
f[3] |= h.bitLength(b) / 8; | |
f = a.encrypt(f); | |
if (d.length) { | |
c = h.bitLength(d) / 8; | |
if (c <= 65279) { | |
g = [h.partial(16, c)]; | |
} else { | |
if (c <= 4294967295) { | |
g = h.concat([h.partial(16, 65534)], [c]); | |
} | |
} | |
g = h.concat(g, d); | |
for (d = 0;d < g.length;d += 4) { | |
f = a.encrypt(i(f, g.slice(d, d + 4).concat([0, 0, 0]))); | |
} | |
} | |
for (d = 0;d < b.length;d += 4) { | |
f = a.encrypt(i(f, b.slice(d, d + 4).concat([0, 0, 0]))); | |
} | |
return h.clamp(f, e * 8); | |
}, H:function(a, b, c, d, e, f) { | |
var g, h = sjcl.bitArray; | |
g = h.O; | |
var i = b.length, k = h.bitLength(b); | |
c = h.concat([h.partial(8, f - 1)], c).concat([0, 0, 0]).slice(0, 4); | |
d = h.bitSlice(g(d, a.encrypt(c)), 0, e); | |
if (!i) { | |
return{tag:d, data:[]}; | |
} | |
for (g = 0;g < i;g += 4) { | |
c[3]++; | |
e = a.encrypt(c); | |
b[g] ^= e[0]; | |
b[g + 1] ^= e[1]; | |
b[g + 2] ^= e[2]; | |
b[g + 3] ^= e[3]; | |
} | |
return{tag:d, data:h.clamp(b, k)}; | |
}}; | |
sjcl.misc.hmac = function(a, b) { | |
this.K = b = b || sjcl.hash.sha256; | |
var c = [[], []], d = b.prototype.blockSize / 32; | |
this.k = [new b, new b]; | |
if (a.length > d) { | |
a = b.hash(a); | |
} | |
for (b = 0;b < d;b++) { | |
c[0][b] = a[b] ^ 909522486; | |
c[1][b] = a[b] ^ 1549556828; | |
} | |
this.k[0].update(c[0]); | |
this.k[1].update(c[1]); | |
}; | |
sjcl.misc.hmac.prototype.encrypt = sjcl.misc.hmac.prototype.mac = function(a) { | |
a = (new this.K(this.k[0])).update(a).finalize(); | |
return(new this.K(this.k[1])).update(a).finalize(); | |
}; | |
sjcl.misc.pbkdf2 = function(a, b, c, d, e) { | |
c = c || 1E3; | |
if (d < 0 || c < 0) { | |
throw sjcl.exception.invalid("invalid params to pbkdf2"); | |
} | |
if (typeof a === "string") { | |
a = sjcl.codec.utf8String.toBits(a); | |
} | |
e = e || sjcl.misc.hmac; | |
a = new e(a); | |
var f, g, h, i, k = [], j = sjcl.bitArray; | |
for (i = 1;32 * k.length < (d || 1);i++) { | |
e = f = a.encrypt(j.concat(b, [i])); | |
for (g = 1;g < c;g++) { | |
f = a.encrypt(f); | |
for (h = 0;h < f.length;h++) { | |
e[h] ^= f[h]; | |
} | |
} | |
k = k.concat(e); | |
} | |
if (d) { | |
k = j.clamp(k, d); | |
} | |
return k; | |
}; | |
sjcl.random = {randomWords:function(a, b) { | |
var c = []; | |
b = this.isReady(b); | |
var d; | |
if (b === 0) { | |
throw new sjcl.exception.notReady("generator isn't seeded"); | |
} else { | |
b & 2 && this.T(!(b & 1)); | |
} | |
for (b = 0;b < a;b += 4) { | |
(b + 1) % 65536 === 0 && this.J(); | |
d = this.u(); | |
c.push(d[0], d[1], d[2], d[3]); | |
} | |
this.J(); | |
return c.slice(0, a); | |
}, setDefaultParanoia:function(a) { | |
this.s = a; | |
}, addEntropy:function(a, b, c) { | |
c = c || "user"; | |
var d, e, f = (new Date).valueOf(), g = this.p[c], h = this.isReady(), i = 0; | |
d = this.D[c]; | |
if (d === undefined) { | |
d = this.D[c] = this.Q++; | |
} | |
if (g === undefined) { | |
g = this.p[c] = 0; | |
} | |
this.p[c] = (this.p[c] + 1) % this.b.length; | |
switch(typeof a) { | |
case "number": | |
if (b === undefined) { | |
b = 1; | |
} | |
this.b[g].update([d, this.t++, 1, b, f, 1, a | 0]); | |
break; | |
case "object": | |
c = Object.prototype.toString.call(a); | |
if (c === "[object Uint32Array]") { | |
e = []; | |
for (c = 0;c < a.length;c++) { | |
e.push(a[c]); | |
} | |
a = e; | |
} else { | |
if (c !== "[object Array]") { | |
i = 1; | |
} | |
for (c = 0;c < a.length && !i;c++) { | |
if (typeof a[c] != "number") { | |
i = 1; | |
} | |
} | |
} | |
if (!i) { | |
if (b === undefined) { | |
for (c = b = 0;c < a.length;c++) { | |
for (e = a[c];e > 0;) { | |
b++; | |
e >>>= 1; | |
} | |
} | |
} | |
this.b[g].update([d, this.t++, 2, b, f, a.length].concat(a)); | |
} | |
break; | |
case "string": | |
if (b === undefined) { | |
b = a.length; | |
} | |
this.b[g].update([d, this.t++, 3, b, f, a.length]); | |
this.b[g].update(a); | |
break; | |
default: | |
i = 1; | |
} | |
if (i) { | |
throw new sjcl.exception.bug("random: addEntropy only supports number, array of numbers or string"); | |
} | |
this.j[g] += b; | |
this.f += b; | |
if (h === 0) { | |
this.isReady() !== 0 && this.I("seeded", Math.max(this.g, this.f)); | |
this.I("progress", this.getProgress()); | |
} | |
}, isReady:function(a) { | |
a = this.A[a !== undefined ? a : this.s]; | |
return this.g && this.g >= a ? this.j[0] > 80 && (new Date).valueOf() > this.M ? 3 : 1 : this.f >= a ? 2 : 0; | |
}, getProgress:function(a) { | |
a = this.A[a ? a : this.s]; | |
return this.g >= a ? 1 : this.f > a ? 1 : this.f / a; | |
}, startCollectors:function() { | |
if (!this.l) { | |
if (window.addEventListener) { | |
window.addEventListener("load", this.n, false); | |
window.addEventListener("mousemove", this.o, false); | |
} else { | |
if (document.attachEvent) { | |
document.attachEvent("onload", this.n); | |
document.attachEvent("onmousemove", this.o); | |
} else { | |
throw new sjcl.exception.bug("can't attach event"); | |
} | |
} | |
this.l = true; | |
} | |
}, stopCollectors:function() { | |
if (this.l) { | |
if (window.removeEventListener) { | |
window.removeEventListener("load", this.n, false); | |
window.removeEventListener("mousemove", this.o, false); | |
} else { | |
if (window.detachEvent) { | |
window.detachEvent("onload", this.n); | |
window.detachEvent("onmousemove", this.o); | |
} | |
} | |
this.l = false; | |
} | |
}, addEventListener:function(a, b) { | |
this.q[a][this.P++] = b; | |
}, removeEventListener:function(a, b) { | |
var c; | |
a = this.q[a]; | |
var d = []; | |
for (c in a) { | |
a.hasOwnProperty(c) && (a[c] === b && d.push(c)); | |
} | |
for (b = 0;b < d.length;b++) { | |
c = d[b]; | |
delete a[c]; | |
} | |
}, b:[new sjcl.hash.sha256], j:[0], z:0, p:{}, t:0, D:{}, Q:0, g:0, f:0, M:0, a:[0, 0, 0, 0, 0, 0, 0, 0], d:[0, 0, 0, 0], r:undefined, s:6, l:false, q:{progress:{}, seeded:{}}, P:0, A:[0, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024], u:function() { | |
for (var a = 0;a < 4;a++) { | |
this.d[a] = this.d[a] + 1 | 0; | |
if (this.d[a]) { | |
break; | |
} | |
} | |
return this.r.encrypt(this.d); | |
}, J:function() { | |
this.a = this.u().concat(this.u()); | |
this.r = new sjcl.cipher.aes(this.a); | |
}, S:function(a) { | |
this.a = sjcl.hash.sha256.hash(this.a.concat(a)); | |
this.r = new sjcl.cipher.aes(this.a); | |
for (a = 0;a < 4;a++) { | |
this.d[a] = this.d[a] + 1 | 0; | |
if (this.d[a]) { | |
break; | |
} | |
} | |
}, T:function(a) { | |
var b = [], c = 0, d; | |
this.M = b[0] = (new Date).valueOf() + 3E4; | |
for (d = 0;d < 16;d++) { | |
b.push(Math.random() * 4294967296 | 0); | |
} | |
for (d = 0;d < this.b.length;d++) { | |
b = b.concat(this.b[d].finalize()); | |
c += this.j[d]; | |
this.j[d] = 0; | |
if (!a && this.z & 1 << d) { | |
break; | |
} | |
} | |
if (this.z >= 1 << this.b.length) { | |
this.b.push(new sjcl.hash.sha256); | |
this.j.push(0); | |
} | |
this.f -= c; | |
if (c > this.g) { | |
this.g = c; | |
} | |
this.z++; | |
this.S(b); | |
}, o:function(a) { | |
sjcl.random.addEntropy([a.x || (a.clientX || (a.offsetX || 0)), a.y || (a.clientY || (a.offsetY || 0))], 2, "mouse"); | |
}, n:function() { | |
sjcl.random.addEntropy((new Date).valueOf(), 2, "loadtime"); | |
}, I:function(a, b) { | |
var c; | |
a = sjcl.random.q[a]; | |
var d = []; | |
for (c in a) { | |
a.hasOwnProperty(c) && d.push(a[c]); | |
} | |
for (c = 0;c < d.length;c++) { | |
d[c](b); | |
} | |
}}; | |
try { | |
var s = new Uint32Array(32); | |
crypto.getRandomValues(s); | |
sjcl.random.addEntropy(s, 1024, "crypto['getRandomValues']"); | |
} catch (t) { | |
} | |
sjcl.json = {defaults:{v:1, iter:1E3, ks:128, ts:64, mode:"ccm", adata:"", cipher:"aes"}, encrypt:function(a, b, c, d) { | |
c = c || {}; | |
d = d || {}; | |
var e = sjcl.json, f = e.c({iv:sjcl.random.randomWords(4, 0)}, e.defaults), g; | |
e.c(f, c); | |
c = f.adata; | |
if (typeof f.salt === "string") { | |
f.salt = sjcl.codec.base64.toBits(f.salt); | |
} | |
if (typeof f.iv === "string") { | |
f.iv = sjcl.codec.base64.toBits(f.iv); | |
} | |
if (!sjcl.mode[f.mode] || (!sjcl.cipher[f.cipher] || (typeof a === "string" && f.iter <= 100 || (f.ts !== 64 && (f.ts !== 96 && f.ts !== 128) || (f.ks !== 128 && (f.ks !== 192 && f.ks !== 256) || (f.iv.length < 2 || f.iv.length > 4)))))) { | |
throw new sjcl.exception.invalid("json encrypt: invalid parameters"); | |
} | |
if (typeof a === "string") { | |
g = sjcl.misc.cachedPbkdf2(a, f); | |
a = g.key.slice(0, f.ks / 32); | |
f.salt = g.salt; | |
} | |
if (typeof b === "string") { | |
b = sjcl.codec.utf8String.toBits(b); | |
} | |
if (typeof c === "string") { | |
c = sjcl.codec.utf8String.toBits(c); | |
} | |
g = new sjcl.cipher[f.cipher](a); | |
e.c(d, f); | |
d.key = a; | |
f.ct = sjcl.mode[f.mode].encrypt(g, b, f.iv, c, f.ts); | |
return e.encode(f); | |
}, decrypt:function(a, b, c, d) { | |
c = c || {}; | |
d = d || {}; | |
var e = sjcl.json; | |
b = e.c(e.c(e.c({}, e.defaults), e.decode(b)), c, true); | |
var f; | |
c = b.adata; | |
if (typeof b.salt === "string") { | |
b.salt = sjcl.codec.base64.toBits(b.salt); | |
} | |
if (typeof b.iv === "string") { | |
b.iv = sjcl.codec.base64.toBits(b.iv); | |
} | |
if (!sjcl.mode[b.mode] || (!sjcl.cipher[b.cipher] || (typeof a === "string" && b.iter <= 100 || (b.ts !== 64 && (b.ts !== 96 && b.ts !== 128) || (b.ks !== 128 && (b.ks !== 192 && b.ks !== 256) || (!b.iv || (b.iv.length < 2 || b.iv.length > 4))))))) { | |
throw new sjcl.exception.invalid("json decrypt: invalid parameters"); | |
} | |
if (typeof a === "string") { | |
f = sjcl.misc.cachedPbkdf2(a, b); | |
a = f.key.slice(0, b.ks / 32); | |
b.salt = f.salt; | |
} | |
if (typeof c === "string") { | |
c = sjcl.codec.utf8String.toBits(c); | |
} | |
f = new sjcl.cipher[b.cipher](a); | |
c = sjcl.mode[b.mode].decrypt(f, b.ct, b.iv, c, b.ts); | |
e.c(d, b); | |
d.key = a; | |
return sjcl.codec.utf8String.fromBits(c); | |
}, encode:function(a) { | |
var b, c = "{", d = ""; | |
for (b in a) { | |
if (a.hasOwnProperty(b)) { | |
if (!b.match(/^[a-z0-9]+$/i)) { | |
throw new sjcl.exception.invalid("json encode: invalid property name"); | |
} | |
c += d + '"' + b + '":'; | |
d = ","; | |
switch(typeof a[b]) { | |
case "number": | |
; | |
case "boolean": | |
c += a[b]; | |
break; | |
case "string": | |
c += '"' + escape(a[b]) + '"'; | |
break; | |
case "object": | |
c += '"' + sjcl.codec.base64.fromBits(a[b], 0) + '"'; | |
break; | |
default: | |
throw new sjcl.exception.bug("json encode: unsupported type");; | |
} | |
} | |
} | |
return c + "}"; | |
}, decode:function(a) { | |
a = a.replace(/\s/g, ""); | |
if (!a.match(/^\{.*\}$/)) { | |
throw new sjcl.exception.invalid("json decode: this isn't json!"); | |
} | |
a = a.replace(/^\{|\}$/g, "").split(/,/); | |
var b = {}, c, d; | |
for (c = 0;c < a.length;c++) { | |
if (!(d = a[c].match(/^(?:(["']?)([a-z][a-z0-9]*)\1):(?:(\d+)|"([a-z0-9+\/%*_.@=\-]*)")$/i))) { | |
throw new sjcl.exception.invalid("json decode: this isn't json!"); | |
} | |
b[d[2]] = d[3] ? parseInt(d[3], 10) : d[2].match(/^(ct|salt|iv)$/) ? sjcl.codec.base64.toBits(d[4]) : unescape(d[4]); | |
} | |
return b; | |
}, c:function(a, b, c) { | |
if (a === undefined) { | |
a = {}; | |
} | |
if (b === undefined) { | |
return a; | |
} | |
var d; | |
for (d in b) { | |
if (b.hasOwnProperty(d)) { | |
if (c && (a[d] !== undefined && a[d] !== b[d])) { | |
throw new sjcl.exception.invalid("required parameter overridden"); | |
} | |
a[d] = b[d]; | |
} | |
} | |
return a; | |
}, V:function(a, b) { | |
var c = {}, d; | |
for (d in a) { | |
if (a.hasOwnProperty(d) && a[d] !== b[d]) { | |
c[d] = a[d]; | |
} | |
} | |
return c; | |
}, U:function(a, b) { | |
var c = {}, d; | |
for (d = 0;d < b.length;d++) { | |
if (a[b[d]] !== undefined) { | |
c[b[d]] = a[b[d]]; | |
} | |
} | |
return c; | |
}}; | |
sjcl.encrypt = sjcl.json.encrypt; | |
sjcl.decrypt = sjcl.json.decrypt; | |
sjcl.misc.R = {}; | |
sjcl.misc.cachedPbkdf2 = function(a, b) { | |
var c = sjcl.misc.R, d; | |
b = b || {}; | |
d = b.iter || 1E3; | |
c = c[a] = c[a] || {}; | |
d = c[d] = c[d] || {firstSalt:b.salt && b.salt.length ? b.salt.slice(0) : sjcl.random.randomWords(2, 0)}; | |
c = b.salt === undefined ? d.firstSalt : b.salt; | |
d[c] = d[c] || sjcl.misc.pbkdf2(a, c, b.iter); | |
return{key:d[c].slice(0), salt:c.slice(0)}; | |
}; | |
goog.provide("fb.simplelogin.util.env"); | |
fb.simplelogin.util.env.hasLocalStorage = function(str) { | |
try { | |
if (localStorage) { | |
localStorage.setItem("firebase-sentinel", "test"); | |
var result = localStorage.getItem("firebase-sentinel"); | |
localStorage.removeItem("firebase-sentinel"); | |
return result === "test"; | |
} | |
} catch (e) { | |
} | |
return false; | |
}; | |
fb.simplelogin.util.env.hasSessionStorage = function(str) { | |
try { | |
if (sessionStorage) { | |
sessionStorage.setItem("firebase-sentinel", "test"); | |
var result = sessionStorage.getItem("firebase-sentinel"); | |
sessionStorage.removeItem("firebase-sentinel"); | |
return result === "test"; | |
} | |
} catch (e) { | |
} | |
return false; | |
}; | |
fb.simplelogin.util.env.isMobileCordovaInAppBrowser = function() { | |
return(window["cordova"] || (window["CordovaInAppBrowser"] || window["phonegap"])) && /ios|iphone|ipod|ipad|android/i.test(navigator.userAgent); | |
}; | |
fb.simplelogin.util.env.isMobileTriggerIoTab = function() { | |
return window["forge"] && /ios|iphone|ipod|ipad|android/i.test(navigator.userAgent); | |
}; | |
fb.simplelogin.util.env.isWindowsMetro = function() { | |
return!!window["Windows"] && /^ms-appx:/.test(location.href); | |
}; | |
fb.simplelogin.util.env.isChromeiOS = function() { | |
return!!navigator.userAgent.match(/CriOS/); | |
}; | |
fb.simplelogin.util.env.isTwitteriOS = function() { | |
return!!navigator.userAgent.match(/Twitter for iPhone/); | |
}; | |
fb.simplelogin.util.env.isFacebookiOS = function() { | |
return!!navigator.userAgent.match(/FBAN\/FBIOS/); | |
}; | |
fb.simplelogin.util.env.isWindowsPhone = function() { | |
return!!navigator.userAgent.match(/Windows Phone/); | |
}; | |
fb.simplelogin.util.env.isStandaloneiOS = function() { | |
return!!window.navigator.standalone; | |
}; | |
fb.simplelogin.util.env.isPhantomJS = function() { | |
return!!navigator.userAgent.match(/PhantomJS/); | |
}; | |
goog.provide("goog.dom.NodeType"); | |
goog.dom.NodeType = {ELEMENT:1, ATTRIBUTE:2, TEXT:3, CDATA_SECTION:4, ENTITY_REFERENCE:5, ENTITY:6, PROCESSING_INSTRUCTION:7, COMMENT:8, DOCUMENT:9, DOCUMENT_TYPE:10, DOCUMENT_FRAGMENT:11, NOTATION:12}; | |
goog.provide("goog.debug.Error"); | |
goog.debug.Error = function(opt_msg) { | |
if (Error.captureStackTrace) { | |
Error.captureStackTrace(this, goog.debug.Error); | |
} else { | |
var stack = (new Error).stack; | |
if (stack) { | |
this.stack = stack; | |
} | |
} | |
if (opt_msg) { | |
this.message = String(opt_msg); | |
} | |
}; | |
goog.inherits(goog.debug.Error, Error); | |
goog.debug.Error.prototype.name = "CustomError"; | |
goog.provide("goog.string"); | |
goog.provide("goog.string.Unicode"); | |
goog.string.Unicode = {NBSP:"\u00a0"}; | |
goog.string.startsWith = function(str, prefix) { | |
return str.lastIndexOf(prefix, 0) == 0; | |
}; | |
goog.string.endsWith = function(str, suffix) { | |
var l = str.length - suffix.length; | |
return l >= 0 && str.indexOf(suffix, l) == l; | |
}; | |
goog.string.caseInsensitiveStartsWith = function(str, prefix) { | |
return goog.string.caseInsensitiveCompare(prefix, str.substr(0, prefix.length)) == 0; | |
}; | |
goog.string.caseInsensitiveEndsWith = function(str, suffix) { | |
return goog.string.caseInsensitiveCompare(suffix, str.substr(str.length - suffix.length, suffix.length)) == 0; | |
}; | |
goog.string.caseInsensitiveEquals = function(str1, str2) { | |
return str1.toLowerCase() == str2.toLowerCase(); | |
}; | |
goog.string.subs = function(str, var_args) { | |
var splitParts = str.split("%s"); | |
var returnString = ""; | |
var subsArguments = Array.prototype.slice.call(arguments, 1); | |
while (subsArguments.length && splitParts.length > 1) { | |
returnString += splitParts.shift() + subsArguments.shift(); | |
} | |
return returnString + splitParts.join("%s"); | |
}; | |
goog.string.collapseWhitespace = function(str) { | |
return str.replace(/[\s\xa0]+/g, " ").replace(/^\s+|\s+$/g, ""); | |
}; | |
goog.string.isEmpty = function(str) { | |
return/^[\s\xa0]*$/.test(str); | |
}; | |
goog.string.isEmptySafe = function(str) { | |
return goog.string.isEmpty(goog.string.makeSafe(str)); | |
}; | |
goog.string.isBreakingWhitespace = function(str) { | |
return!/[^\t\n\r ]/.test(str); | |
}; | |
goog.string.isAlpha = function(str) { | |
return!/[^a-zA-Z]/.test(str); | |
}; | |
goog.string.isNumeric = function(str) { | |
return!/[^0-9]/.test(str); | |
}; | |
goog.string.isAlphaNumeric = function(str) { | |
return!/[^a-zA-Z0-9]/.test(str); | |
}; | |
goog.string.isSpace = function(ch) { | |
return ch == " "; | |
}; | |
goog.string.isUnicodeChar = function(ch) { | |
return ch.length == 1 && (ch >= " " && ch <= "~") || ch >= "\u0080" && ch <= "\ufffd"; | |
}; | |
goog.string.stripNewlines = function(str) { | |
return str.replace(/(\r\n|\r|\n)+/g, " "); | |
}; | |
goog.string.canonicalizeNewlines = function(str) { | |
return str.replace(/(\r\n|\r|\n)/g, "\n"); | |
}; | |
goog.string.normalizeWhitespace = function(str) { | |
return str.replace(/\xa0|\s/g, " "); | |
}; | |
goog.string.normalizeSpaces = function(str) { | |
return str.replace(/\xa0|[ \t]+/g, " "); | |
}; | |
goog.string.collapseBreakingSpaces = function(str) { | |
return str.replace(/[\t\r\n ]+/g, " ").replace(/^[\t\r\n ]+|[\t\r\n ]+$/g, ""); | |
}; | |
goog.string.trim = function(str) { | |
return str.replace(/^[\s\xa0]+|[\s\xa0]+$/g, ""); | |
}; | |
goog.string.trimLeft = function(str) { | |
return str.replace(/^[\s\xa0]+/, ""); | |
}; | |
goog.string.trimRight = function(str) { | |
return str.replace(/[\s\xa0]+$/, ""); | |
}; | |
goog.string.caseInsensitiveCompare = function(str1, str2) { | |
var test1 = String(str1).toLowerCase(); | |
var test2 = String(str2).toLowerCase(); | |
if (test1 < test2) { | |
return-1; | |
} else { | |
if (test1 == test2) { | |
return 0; | |
} else { | |
return 1; | |
} | |
} | |
}; | |
goog.string.numerateCompareRegExp_ = /(\.\d+)|(\d+)|(\D+)/g; | |
goog.string.numerateCompare = function(str1, str2) { | |
if (str1 == str2) { | |
return 0; | |
} | |
if (!str1) { | |
return-1; | |
} | |
if (!str2) { | |
return 1; | |
} | |
var tokens1 = str1.toLowerCase().match(goog.string.numerateCompareRegExp_); | |
var tokens2 = str2.toLowerCase().match(goog.string.numerateCompareRegExp_); | |
var count = Math.min(tokens1.length, tokens2.length); | |
for (var i = 0;i < count;i++) { | |
var a = tokens1[i]; | |
var b = tokens2[i]; | |
if (a != b) { | |
var num1 = parseInt(a, 10); | |
if (!isNaN(num1)) { | |
var num2 = parseInt(b, 10); | |
if (!isNaN(num2) && num1 - num2) { | |
return num1 - num2; | |
} | |
} | |
return a < b ? -1 : 1; | |
} | |
} | |
if (tokens1.length != tokens2.length) { | |
return tokens1.length - tokens2.length; | |
} | |
return str1 < str2 ? -1 : 1; | |
}; | |
goog.string.urlEncode = function(str) { | |
return encodeURIComponent(String(str)); | |
}; | |
goog.string.urlDecode = function(str) { | |
return decodeURIComponent(str.replace(/\+/g, " ")); | |
}; | |
goog.string.newLineToBr = function(str, opt_xml) { | |
return str.replace(/(\r\n|\r|\n)/g, opt_xml ? "<br />" : "<br>"); | |
}; | |
goog.string.htmlEscape = function(str, opt_isLikelyToContainHtmlChars) { | |
if (opt_isLikelyToContainHtmlChars) { | |
return str.replace(goog.string.amperRe_, "&").replace(goog.string.ltRe_, "<").replace(goog.string.gtRe_, ">").replace(goog.string.quotRe_, """).replace(goog.string.singleQuoteRe_, "'"); | |
} else { | |
if (!goog.string.allRe_.test(str)) { | |
return str; | |
} | |
if (str.indexOf("&") != -1) { | |
str = str.replace(goog.string.amperRe_, "&"); | |
} | |
if (str.indexOf("<") != -1) { | |
str = str.replace(goog.string.ltRe_, "<"); | |
} | |
if (str.indexOf(">") != -1) { | |
str = str.replace(goog.string.gtRe_, ">"); | |
} | |
if (str.indexOf('"') != -1) { | |
str = str.replace(goog.string.quotRe_, """); | |
} | |
if (str.indexOf("'") != -1) { | |
str = str.replace(goog.string.singleQuoteRe_, "'"); | |
} | |
return str; | |
} | |
}; | |
goog.string.amperRe_ = /&/g; | |
goog.string.ltRe_ = /</g; | |
goog.string.gtRe_ = />/g; | |
goog.string.quotRe_ = /"/g; | |
goog.string.singleQuoteRe_ = /'/g; | |
goog.string.allRe_ = /[&<>"']/; | |
goog.string.unescapeEntities = function(str) { | |
if (goog.string.contains(str, "&")) { | |
if ("document" in goog.global) { | |
return goog.string.unescapeEntitiesUsingDom_(str); | |
} else { | |
return goog.string.unescapePureXmlEntities_(str); | |
} | |
} | |
return str; | |
}; | |
goog.string.unescapeEntitiesWithDocument = function(str, document) { | |
if (goog.string.contains(str, "&")) { | |
return goog.string.unescapeEntitiesUsingDom_(str, document); | |
} | |
return str; | |
}; | |
goog.string.unescapeEntitiesUsingDom_ = function(str, opt_document) { | |
var seen = {"&":"&", "<":"<", ">":">", """:'"'}; | |
var div; | |
if (opt_document) { | |
div = opt_document.createElement("div"); | |
} else { | |
div = document.createElement("div"); | |
} | |
return str.replace(goog.string.HTML_ENTITY_PATTERN_, function(s, entity) { | |
var value = seen[s]; | |
if (value) { | |
return value; | |
} | |
if (entity.charAt(0) == "#") { | |
var n = Number("0" + entity.substr(1)); | |
if (!isNaN(n)) { | |
value = String.fromCharCode(n); | |
} | |
} | |
if (!value) { | |
div.innerHTML = s + " "; | |
value = div.firstChild.nodeValue.slice(0, -1); | |
} | |
return seen[s] = value; | |
}); | |
}; | |
goog.string.unescapePureXmlEntities_ = function(str) { | |
return str.replace(/&([^;]+);/g, function(s, entity) { | |
switch(entity) { | |
case "amp": | |
return "&"; | |
case "lt": | |
return "<"; | |
case "gt": | |
return ">"; | |
case "quot": | |
return'"'; | |
default: | |
if (entity.charAt(0) == "#") { | |
var n = Number("0" + entity.substr(1)); | |
if (!isNaN(n)) { | |
return String.fromCharCode(n); | |
} | |
} | |
return s; | |
} | |
}); | |
}; | |
goog.string.HTML_ENTITY_PATTERN_ = /&([^;\s<&]+);?/g; | |
goog.string.whitespaceEscape = function(str, opt_xml) { | |
return goog.string.newLineToBr(str.replace(/ /g, "  "), opt_xml); | |
}; | |
goog.string.stripQuotes = function(str, quoteChars) { | |
var length = quoteChars.length; | |
for (var i = 0;i < length;i++) { | |
var quoteChar = length == 1 ? quoteChars : quoteChars.charAt(i); | |
if (str.charAt(0) == quoteChar && str.charAt(str.length - 1) == quoteChar) { | |
return str.substring(1, str.length - 1); | |
} | |
} | |
return str; | |
}; | |
goog.string.truncate = function(str, chars, opt_protectEscapedCharacters) { | |
if (opt_protectEscapedCharacters) { | |
str = goog.string.unescapeEntities(str); | |
} | |
if (str.length > chars) { | |
str = str.substring(0, chars - 3) + "..."; | |
} | |
if (opt_protectEscapedCharacters) { | |
str = goog.string.htmlEscape(str); | |
} | |
return str; | |
}; | |
goog.string.truncateMiddle = function(str, chars, opt_protectEscapedCharacters, opt_trailingChars) { | |
if (opt_protectEscapedCharacters) { | |
str = goog.string.unescapeEntities(str); | |
} | |
if (opt_trailingChars && str.length > chars) { | |
if (opt_trailingChars > chars) { | |
opt_trailingChars = chars; | |
} | |
var endPoint = str.length - opt_trailingChars; | |
var startPoint = chars - opt_trailingChars; | |
str = str.substring(0, startPoint) + "..." + str.substring(endPoint); | |
} else { | |
if (str.length > chars) { | |
var half = Math.floor(chars / 2); | |
var endPos = str.length - half; | |
half += chars % 2; | |
str = str.substring(0, half) + "..." + str.substring(endPos); | |
} | |
} | |
if (opt_protectEscapedCharacters) { | |
str = goog.string.htmlEscape(str); | |
} | |
return str; | |
}; | |
goog.string.specialEscapeChars_ = {"\x00":"\\0", "\b":"\\b", "\f":"\\f", "\n":"\\n", "\r":"\\r", "\t":"\\t", "\x0B":"\\x0B", '"':'\\"', "\\":"\\\\"}; | |
goog.string.jsEscapeCache_ = {"'":"\\'"}; | |
goog.string.quote = function(s) { | |
s = String(s); | |
if (s.quote) { | |
return s.quote(); | |
} else { | |
var sb = ['"']; | |
for (var i = 0;i < s.length;i++) { | |
var ch = s.charAt(i); | |
var cc = ch.charCodeAt(0); | |
sb[i + 1] = goog.string.specialEscapeChars_[ch] || (cc > 31 && cc < 127 ? ch : goog.string.escapeChar(ch)); | |
} | |
sb.push('"'); | |
return sb.join(""); | |
} | |
}; | |
goog.string.escapeString = function(str) { | |
var sb = []; | |
for (var i = 0;i < str.length;i++) { | |
sb[i] = goog.string.escapeChar(str.charAt(i)); | |
} | |
return sb.join(""); | |
}; | |
goog.string.escapeChar = function(c) { | |
if (c in goog.string.jsEscapeCache_) { | |
return goog.string.jsEscapeCache_[c]; | |
} | |
if (c in goog.string.specialEscapeChars_) { | |
return goog.string.jsEscapeCache_[c] = goog.string.specialEscapeChars_[c]; | |
} | |
var rv = c; | |
var cc = c.charCodeAt(0); | |
if (cc > 31 && cc < 127) { | |
rv = c; | |
} else { | |
if (cc < 256) { | |
rv = "\\x"; | |
if (cc < 16 || cc > 256) { | |
rv += "0"; | |
} | |
} else { | |
rv = "\\u"; | |
if (cc < 4096) { | |
rv += "0"; | |
} | |
} | |
rv += cc.toString(16).toUpperCase(); | |
} | |
return goog.string.jsEscapeCache_[c] = rv; | |
}; | |
goog.string.toMap = function(s) { | |
var rv = {}; | |
for (var i = 0;i < s.length;i++) { | |
rv[s.charAt(i)] = true; | |
} | |
return rv; | |
}; | |
goog.string.contains = function(s, ss) { | |
return s.indexOf(ss) != -1; | |
}; | |
goog.string.countOf = function(s, ss) { | |
return s && ss ? s.split(ss).length - 1 : 0; | |
}; | |
goog.string.removeAt = function(s, index, stringLength) { | |
var resultStr = s; | |
if (index >= 0 && (index < s.length && stringLength > 0)) { | |
resultStr = s.substr(0, index) + s.substr(index + stringLength, s.length - index - stringLength); | |
} | |
return resultStr; | |
}; | |
goog.string.remove = function(s, ss) { | |
var re = new RegExp(goog.string.regExpEscape(ss), ""); | |
return s.replace(re, ""); | |
}; | |
goog.string.removeAll = function(s, ss) { | |
var re = new RegExp(goog.string.regExpEscape(ss), "g"); | |
return s.replace(re, ""); | |
}; | |
goog.string.regExpEscape = function(s) { | |
return String(s).replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, "\\$1").replace(/\x08/g, "\\x08"); | |
}; | |
goog.string.repeat = function(string, length) { | |
return(new Array(length + 1)).join(string); | |
}; | |
goog.string.padNumber = function(num, length, opt_precision) { | |
var s = goog.isDef(opt_precision) ? num.toFixed(opt_precision) : String(num); | |
var index = s.indexOf("."); | |
if (index == -1) { | |
index = s.length; | |
} | |
return goog.string.repeat("0", Math.max(0, length - index)) + s; | |
}; | |
goog.string.makeSafe = function(obj) { | |
return obj == null ? "" : String(obj); | |
}; | |
goog.string.buildString = function(var_args) { | |
return Array.prototype.join.call(arguments, ""); | |
}; | |
goog.string.getRandomString = function() { | |
var x = 2147483648; | |
return Math.floor(Math.random() * x).toString(36) + Math.abs(Math.floor(Math.random() * x) ^ goog.now()).toString(36); | |
}; | |
goog.string.compareVersions = function(version1, version2) { | |
var order = 0; | |
var v1Subs = goog.string.trim(String(version1)).split("."); | |
var v2Subs = goog.string.trim(String(version2)).split("."); | |
var subCount = Math.max(v1Subs.length, v2Subs.length); | |
for (var subIdx = 0;order == 0 && subIdx < subCount;subIdx++) { | |
var v1Sub = v1Subs[subIdx] || ""; | |
var v2Sub = v2Subs[subIdx] || ""; | |
var v1CompParser = new RegExp("(\\d*)(\\D*)", "g"); | |
var v2CompParser = new RegExp("(\\d*)(\\D*)", "g"); | |
do { | |
var v1Comp = v1CompParser.exec(v1Sub) || ["", "", ""]; | |
var v2Comp = v2CompParser.exec(v2Sub) || ["", "", ""]; | |
if (v1Comp[0].length == 0 && v2Comp[0].length == 0) { | |
break; | |
} | |
var v1CompNum = v1Comp[1].length == 0 ? 0 : parseInt(v1Comp[1], 10); | |
var v2CompNum = v2Comp[1].length == 0 ? 0 : parseInt(v2Comp[1], 10); | |
order = goog.string.compareElements_(v1CompNum, v2CompNum) || (goog.string.compareElements_(v1Comp[2].length == 0, v2Comp[2].length == 0) || goog.string.compareElements_(v1Comp[2], v2Comp[2])); | |
} while (order == 0); | |
} | |
return order; | |
}; | |
goog.string.compareElements_ = function(left, right) { | |
if (left < right) { | |
return-1; | |
} else { | |
if (left > right) { | |
return 1; | |
} | |
} | |
return 0; | |
}; | |
goog.string.HASHCODE_MAX_ = 4294967296; | |
goog.string.hashCode = function(str) { | |
var result = 0; | |
for (var i = 0;i < str.length;++i) { | |
result = 31 * result + str.charCodeAt(i); | |
result %= goog.string.HASHCODE_MAX_; | |
} | |
return result; | |
}; | |
goog.string.uniqueStringCounter_ = Math.random() * 2147483648 | 0; | |
goog.string.createUniqueString = function() { | |
return "goog_" + goog.string.uniqueStringCounter_++; | |
}; | |
goog.string.toNumber = function(str) { | |
var num = Number(str); | |
if (num == 0 && goog.string.isEmpty(str)) { | |
return NaN; | |
} | |
return num; | |
}; | |
goog.string.isLowerCamelCase = function(str) { | |
return/^[a-z]+([A-Z][a-z]*)*$/.test(str); | |
}; | |
goog.string.isUpperCamelCase = function(str) { | |
return/^([A-Z][a-z]*)+$/.test(str); | |
}; | |
goog.string.toCamelCase = function(str) { | |
return String(str).replace(/\-([a-z])/g, function(all, match) { | |
return match.toUpperCase(); | |
}); | |
}; | |
goog.string.toSelectorCase = function(str) { | |
return String(str).replace(/([A-Z])/g, "-$1").toLowerCase(); | |
}; | |
goog.string.toTitleCase = function(str, opt_delimiters) { | |
var delimiters = goog.isString(opt_delimiters) ? goog.string.regExpEscape(opt_delimiters) : "\\s"; | |
delimiters = delimiters ? "|[" + delimiters + "]+" : ""; | |
var regexp = new RegExp("(^" + delimiters + ")([a-z])", "g"); | |
return str.replace(regexp, function(all, p1, p2) { | |
return p1 + p2.toUpperCase(); | |
}); | |
}; | |
goog.string.parseInt = function(value) { | |
if (isFinite(value)) { | |
value = String(value); | |
} | |
if (goog.isString(value)) { | |
return/^\s*-?0x/i.test(value) ? parseInt(value, 16) : parseInt(value, 10); | |
} | |
return NaN; | |
}; | |
goog.string.splitLimit = function(str, separator, limit) { | |
var parts = str.split(separator); | |
var returnVal = []; | |
while (limit > 0 && parts.length) { | |
returnVal.push(parts.shift()); | |
limit--; | |
} | |
if (parts.length) { | |
returnVal.push(parts.join(separator)); | |
} | |
return returnVal; | |
}; | |
goog.provide("goog.asserts"); | |
goog.provide("goog.asserts.AssertionError"); | |
goog.require("goog.debug.Error"); | |
goog.require("goog.dom.NodeType"); | |
goog.require("goog.string"); | |
goog.define("goog.asserts.ENABLE_ASSERTS", goog.DEBUG); | |
goog.asserts.AssertionError = function(messagePattern, messageArgs) { | |
messageArgs.unshift(messagePattern); | |
goog.debug.Error.call(this, goog.string.subs.apply(null, messageArgs)); | |
messageArgs.shift(); | |
this.messagePattern = messagePattern; | |
}; | |
goog.inherits(goog.asserts.AssertionError, goog.debug.Error); | |
goog.asserts.AssertionError.prototype.name = "AssertionError"; | |
goog.asserts.doAssertFailure_ = function(defaultMessage, defaultArgs, givenMessage, givenArgs) { | |
var message = "Assertion failed"; | |
if (givenMessage) { | |
message += ": " + givenMessage; | |
var args = givenArgs; | |
} else { | |
if (defaultMessage) { | |
message += ": " + defaultMessage; | |
args = defaultArgs; | |
} | |
} | |
throw new goog.asserts.AssertionError("" + message, args || []); | |
}; | |
goog.asserts.assert = function(condition, opt_message, var_args) { | |
if (goog.asserts.ENABLE_ASSERTS && !condition) { | |
goog.asserts.doAssertFailure_("", null, opt_message, Array.prototype.slice.call(arguments, 2)); | |
} | |
return condition; | |
}; | |
goog.asserts.fail = function(opt_message, var_args) { | |
if (goog.asserts.ENABLE_ASSERTS) { | |
throw new goog.asserts.AssertionError("Failure" + (opt_message ? ": " + opt_message : ""), Array.prototype.slice.call(arguments, 1)); | |
} | |
}; | |
goog.asserts.assertNumber = function(value, opt_message, var_args) { | |
if (goog.asserts.ENABLE_ASSERTS && !goog.isNumber(value)) { | |
goog.asserts.doAssertFailure_("Expected number but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)); | |
} | |
return(value); | |
}; | |
goog.asserts.assertString = function(value, opt_message, var_args) { | |
if (goog.asserts.ENABLE_ASSERTS && !goog.isString(value)) { | |
goog.asserts.doAssertFailure_("Expected string but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)); | |
} | |
return(value); | |
}; | |
goog.asserts.assertFunction = function(value, opt_message, var_args) { | |
if (goog.asserts.ENABLE_ASSERTS && !goog.isFunction(value)) { | |
goog.asserts.doAssertFailure_("Expected function but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)); | |
} | |
return(value); | |
}; | |
goog.asserts.assertObject = function(value, opt_message, var_args) { | |
if (goog.asserts.ENABLE_ASSERTS && !goog.isObject(value)) { | |
goog.asserts.doAssertFailure_("Expected object but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)); | |
} | |
return(value); | |
}; | |
goog.asserts.assertArray = function(value, opt_message, var_args) { | |
if (goog.asserts.ENABLE_ASSERTS && !goog.isArray(value)) { | |
goog.asserts.doAssertFailure_("Expected array but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)); | |
} | |
return(value); | |
}; | |
goog.asserts.assertBoolean = function(value, opt_message, var_args) { | |
if (goog.asserts.ENABLE_ASSERTS && !goog.isBoolean(value)) { | |
goog.asserts.doAssertFailure_("Expected boolean but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)); | |
} | |
return(value); | |
}; | |
goog.asserts.assertElement = function(value, opt_message, var_args) { | |
if (goog.asserts.ENABLE_ASSERTS && (!goog.isObject(value) || value.nodeType != goog.dom.NodeType.ELEMENT)) { | |
goog.asserts.doAssertFailure_("Expected Element but got %s: %s.", [goog.typeOf(value), value], opt_message, Array.prototype.slice.call(arguments, 2)); | |
} | |
return(value); | |
}; | |
goog.asserts.assertInstanceof = function(value, type, opt_message, var_args) { | |
if (goog.asserts.ENABLE_ASSERTS && !(value instanceof type)) { | |
goog.asserts.doAssertFailure_("instanceof check failed.", null, opt_message, Array.prototype.slice.call(arguments, 3)); | |
} | |
return value; | |
}; | |
goog.asserts.assertObjectPrototypeIsIntact = function() { | |
for (var key in Object.prototype) { | |
goog.asserts.fail(key + " should not be enumerable in Object.prototype."); | |
} | |
}; | |
goog.provide("goog.events.EventId"); | |
goog.events.EventId = function(eventId) { | |
this.id = eventId; | |
}; | |
goog.events.EventId.prototype.toString = function() { | |
return this.id; | |
}; | |
goog.provide("goog.events.Listenable"); | |
goog.provide("goog.events.ListenableKey"); | |
goog.require("goog.events.EventId"); | |
goog.events.Listenable = function() { | |
}; | |
goog.events.Listenable.IMPLEMENTED_BY_PROP = "closure_listenable_" + (Math.random() * 1E6 | 0); | |
goog.events.Listenable.addImplementation = function(cls) { | |
cls.prototype[goog.events.Listenable.IMPLEMENTED_BY_PROP] = true; | |
}; | |
goog.events.Listenable.isImplementedBy = function(obj) { | |
try { | |
return!!(obj && obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]); | |
} catch (e) { | |
return false; | |
} | |
}; | |
goog.events.Listenable.prototype.listen; | |
goog.events.Listenable.prototype.listenOnce; | |
goog.events.Listenable.prototype.unlisten; | |
goog.events.Listenable.prototype.unlistenByKey; | |
goog.events.Listenable.prototype.dispatchEvent; | |
goog.events.Listenable.prototype.removeAllListeners; | |
goog.events.Listenable.prototype.getParentEventTarget; | |
goog.events.Listenable.prototype.fireListeners; | |
goog.events.Listenable.prototype.getListeners; | |
goog.events.Listenable.prototype.getListener; | |
goog.events.Listenable.prototype.hasListener; | |
goog.events.ListenableKey = function() { | |
}; | |
goog.events.ListenableKey.counter_ = 0; | |
goog.events.ListenableKey.reserveKey = function() { | |
return++goog.events.ListenableKey.counter_; | |
}; | |
goog.events.ListenableKey.prototype.src; | |
goog.events.ListenableKey.prototype.type; | |
goog.events.ListenableKey.prototype.listener; | |
goog.events.ListenableKey.prototype.capture; | |
goog.events.ListenableKey.prototype.handler; | |
goog.events.ListenableKey.prototype.key; | |
goog.provide("goog.events.Listener"); | |
goog.require("goog.events.ListenableKey"); | |
goog.events.Listener = function(listener, proxy, src, type, capture, opt_handler) { | |
if (goog.events.Listener.ENABLE_MONITORING) { | |
this.creationStack = (new Error).stack; | |
} | |
this.listener = listener; | |
this.proxy = proxy; | |
this.src = src; | |
this.type = type; | |
this.capture = !!capture; | |
this.handler = opt_handler; | |
this.key = goog.events.ListenableKey.reserveKey(); | |
this.callOnce = false; | |
this.removed = false; | |
}; | |
goog.define("goog.events.Listener.ENABLE_MONITORING", false); | |
goog.events.Listener.prototype.creationStack; | |
goog.events.Listener.prototype.markAsRemoved = function() { | |
this.removed = true; | |
this.listener = null; | |
this.proxy = null; | |
this.src = null; | |
this.handler = null; | |
}; | |
goog.provide("goog.object"); | |
goog.object.forEach = function(obj, f, opt_obj) { | |
for (var key in obj) { | |
f.call(opt_obj, obj[key], key, obj); | |
} | |
}; | |
goog.object.filter = function(obj, f, opt_obj) { | |
var res = {}; | |
for (var key in obj) { | |
if (f.call(opt_obj, obj[key], key, obj)) { | |
res[key] = obj[key]; | |
} | |
} | |
return res; | |
}; | |
goog.object.map = function(obj, f, opt_obj) { | |
var res = {}; | |
for (var key in obj) { | |
res[key] = f.call(opt_obj, obj[key], key, obj); | |
} | |
return res; | |
}; | |
goog.object.some = function(obj, f, opt_obj) { | |
for (var key in obj) { | |
if (f.call(opt_obj, obj[key], key, obj)) { | |
return true; | |
} | |
} | |
return false; | |
}; | |
goog.object.every = function(obj, f, opt_obj) { | |
for (var key in obj) { | |
if (!f.call(opt_obj, obj[key], key, obj)) { | |
return false; | |
} | |
} | |
return true; | |
}; | |
goog.object.getCount = function(obj) { | |
var rv = 0; | |
for (var key in obj) { | |
rv++; | |
} | |
return rv; | |
}; | |
goog.object.getAnyKey = function(obj) { | |
for (var key in obj) { | |
return key; | |
} | |
}; | |
goog.object.getAnyValue = function(obj) { | |
for (var key in obj) { | |
return obj[key]; | |
} | |
}; | |
goog.object.contains = function(obj, val) { | |
return goog.object.containsValue(obj, val); | |
}; | |
goog.object.getValues = function(obj) { | |
var res = []; | |
var i = 0; | |
for (var key in obj) { | |
res[i++] = obj[key]; | |
} | |
return res; | |
}; | |
goog.object.getKeys = function(obj) { | |
var res = []; | |
var i = 0; | |
for (var key in obj) { | |
res[i++] = key; | |
} | |
return res; | |
}; | |
goog.object.getValueByKeys = function(obj, var_args) { | |
var isArrayLike = goog.isArrayLike(var_args); | |
var keys = isArrayLike ? var_args : arguments; | |
for (var i = isArrayLike ? 0 : 1;i < keys.length;i++) { | |
obj = obj[keys[i]]; | |
if (!goog.isDef(obj)) { | |
break; | |
} | |
} | |
return obj; | |
}; | |
goog.object.containsKey = function(obj, key) { | |
return key in obj; | |
}; | |
goog.object.containsValue = function(obj, val) { | |
for (var key in obj) { | |
if (obj[key] == val) { | |
return true; | |
} | |
} | |
return false; | |
}; | |
goog.object.findKey = function(obj, f, opt_this) { | |
for (var key in obj) { | |
if (f.call(opt_this, obj[key], key, obj)) { | |
return key; | |
} | |
} | |
return undefined; | |
}; | |
goog.object.findValue = function(obj, f, opt_this) { | |
var key = goog.object.findKey(obj, f, opt_this); | |
return key && obj[key]; | |
}; | |
goog.object.isEmpty = function(obj) { | |
for (var key in obj) { | |
return false; | |
} | |
return true; | |
}; | |
goog.object.clear = function(obj) { | |
for (var i in obj) { | |
delete obj[i]; | |
} | |
}; | |
goog.object.remove = function(obj, key) { | |
var rv; | |
if (rv = key in obj) { | |
delete obj[key]; | |
} | |
return rv; | |
}; | |
goog.object.add = function(obj, key, val) { | |
if (key in obj) { | |
throw Error('The object already contains the key "' + key + '"'); | |
} | |
goog.object.set(obj, key, val); | |
}; | |
goog.object.get = function(obj, key, opt_val) { | |
if (key in obj) { | |
return obj[key]; | |
} | |
return opt_val; | |
}; | |
goog.object.set = function(obj, key, value) { | |
obj[key] = value; | |
}; | |
goog.object.setIfUndefined = function(obj, key, value) { | |
return key in obj ? obj[key] : obj[key] = value; | |
}; | |
goog.object.clone = function(obj) { | |
var res = {}; | |
for (var key in obj) { | |
res[key] = obj[key]; | |
} | |
return res; | |
}; | |
goog.object.unsafeClone = function(obj) { | |
var type = goog.typeOf(obj); | |
if (type == "object" || type == "array") { | |
if (obj.clone) { | |
return obj.clone(); | |
} | |
var clone = type == "array" ? [] : {}; | |
for (var key in obj) { | |
clone[key] = goog.object.unsafeClone(obj[key]); | |
} | |
return clone; | |
} | |
return obj; | |
}; | |
goog.object.transpose = function(obj) { | |
var transposed = {}; | |
for (var key in obj) { | |
transposed[obj[key]] = key; | |
} | |
return transposed; | |
}; | |
goog.object.PROTOTYPE_FIELDS_ = ["constructor", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "toLocaleString", "toString", "valueOf"]; | |
goog.object.extend = function(target, var_args) { | |
var key, source; | |
for (var i = 1;i < arguments.length;i++) { | |
source = arguments[i]; | |
for (key in source) { | |
target[key] = source[key]; | |
} | |
for (var j = 0;j < goog.object.PROTOTYPE_FIELDS_.length;j++) { | |
key = goog.object.PROTOTYPE_FIELDS_[j]; | |
if (Object.prototype.hasOwnProperty.call(source, key)) { | |
target[key] = source[key]; | |
} | |
} | |
} | |
}; | |
goog.object.create = function(var_args) { | |
var argLength = arguments.length; | |
if (argLength == 1 && goog.isArray(arguments[0])) { | |
return goog.object.create.apply(null, arguments[0]); | |
} | |
if (argLength % 2) { | |
throw Error("Uneven number of arguments"); | |
} | |
var rv = {}; | |
for (var i = 0;i < argLength;i += 2) { | |
rv[arguments[i]] = arguments[i + 1]; | |
} | |
return rv; | |
}; | |
goog.object.createSet = function(var_args) { | |
var argLength = arguments.length; | |
if (argLength == 1 && goog.isArray(arguments[0])) { | |
return goog.object.createSet.apply(null, arguments[0]); | |
} | |
var rv = {}; | |
for (var i = 0;i < argLength;i++) { | |
rv[arguments[i]] = true; | |
} | |
return rv; | |
}; | |
goog.object.createImmutableView = function(obj) { | |
var result = obj; | |
if (Object.isFrozen && !Object.isFrozen(obj)) { | |
result = Object.create(obj); | |
Object.freeze(result); | |
} | |
return result; | |
}; | |
goog.object.isImmutableView = function(obj) { | |
return!!Object.isFrozen && Object.isFrozen(obj); | |
}; | |
goog.provide("goog.array"); | |
goog.provide("goog.array.ArrayLike"); | |
goog.require("goog.asserts"); | |
goog.define("goog.NATIVE_ARRAY_PROTOTYPES", goog.TRUSTED_SITE); | |
goog.define("goog.array.ASSUME_NATIVE_FUNCTIONS", false); | |
goog.array.ArrayLike; | |
goog.array.peek = function(array) { | |
return array[array.length - 1]; | |
}; | |
goog.array.ARRAY_PROTOTYPE_ = Array.prototype; | |
goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.indexOf) ? function(arr, obj, opt_fromIndex) { | |
goog.asserts.assert(arr.length != null); | |
return goog.array.ARRAY_PROTOTYPE_.indexOf.call(arr, obj, opt_fromIndex); | |
} : function(arr, obj, opt_fromIndex) { | |
var fromIndex = opt_fromIndex == null ? 0 : opt_fromIndex < 0 ? Math.max(0, arr.length + opt_fromIndex) : opt_fromIndex; | |
if (goog.isString(arr)) { | |
if (!goog.isString(obj) || obj.length != 1) { | |
return-1; | |
} | |
return arr.indexOf(obj, fromIndex); | |
} | |
for (var i = fromIndex;i < arr.length;i++) { | |
if (i in arr && arr[i] === obj) { | |
return i; | |
} | |
} | |
return-1; | |
}; | |
goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.lastIndexOf) ? function(arr, obj, opt_fromIndex) { | |
goog.asserts.assert(arr.length != null); | |
var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex; | |
return goog.array.ARRAY_PROTOTYPE_.lastIndexOf.call(arr, obj, fromIndex); | |
} : function(arr, obj, opt_fromIndex) { | |
var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex; | |
if (fromIndex < 0) { | |
fromIndex = Math.max(0, arr.length + fromIndex); | |
} | |
if (goog.isString(arr)) { | |
if (!goog.isString(obj) || obj.length != 1) { | |
return-1; | |
} | |
return arr.lastIndexOf(obj, fromIndex); | |
} | |
for (var i = fromIndex;i >= 0;i--) { | |
if (i in arr && arr[i] === obj) { | |
return i; | |
} | |
} | |
return-1; | |
}; | |
goog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.forEach) ? function(arr, f, opt_obj) { | |
goog.asserts.assert(arr.length != null); | |
goog.array.ARRAY_PROTOTYPE_.forEach.call(arr, f, opt_obj); | |
} : function(arr, f, opt_obj) { | |
var l = arr.length; | |
var arr2 = goog.isString(arr) ? arr.split("") : arr; | |
for (var i = 0;i < l;i++) { | |
if (i in arr2) { | |
f.call(opt_obj, arr2[i], i, arr); | |
} | |
} | |
}; | |
goog.array.forEachRight = function(arr, f, opt_obj) { | |
var l = arr.length; | |
var arr2 = goog.isString(arr) ? arr.split("") : arr; | |
for (var i = l - 1;i >= 0;--i) { | |
if (i in arr2) { | |
f.call(opt_obj, arr2[i], i, arr); | |
} | |
} | |
}; | |
goog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.filter) ? function(arr, f, opt_obj) { | |
goog.asserts.assert(arr.length != null); | |
return goog.array.ARRAY_PROTOTYPE_.filter.call(arr, f, opt_obj); | |
} : function(arr, f, opt_obj) { | |
var l = arr.length; | |
var res = []; | |
var resLength = 0; | |
var arr2 = goog.isString(arr) ? arr.split("") : arr; | |
for (var i = 0;i < l;i++) { | |
if (i in arr2) { | |
var val = arr2[i]; | |
if (f.call(opt_obj, val, i, arr)) { | |
res[resLength++] = val; | |
} | |
} | |
} | |
return res; | |
}; | |
goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.map) ? function(arr, f, opt_obj) { | |
goog.asserts.assert(arr.length != null); | |
return goog.array.ARRAY_PROTOTYPE_.map.call(arr, f, opt_obj); | |
} : function(arr, f, opt_obj) { | |
var l = arr.length; | |
var res = new Array(l); | |
var arr2 = goog.isString(arr) ? arr.split("") : arr; | |
for (var i = 0;i < l;i++) { | |
if (i in arr2) { | |
res[i] = f.call(opt_obj, arr2[i], i, arr); | |
} | |
} | |
return res; | |
}; | |
goog.array.reduce = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.reduce) ? function(arr, f, val, opt_obj) { | |
goog.asserts.assert(arr.length != null); | |
if (opt_obj) { | |
f = goog.bind(f, opt_obj); | |
} | |
return goog.array.ARRAY_PROTOTYPE_.reduce.call(arr, f, val); | |
} : function(arr, f, val, opt_obj) { | |
var rval = val; | |
goog.array.forEach(arr, function(val, index) { | |
rval = f.call(opt_obj, rval, val, index, arr); | |
}); | |
return rval; | |
}; | |
goog.array.reduceRight = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.reduceRight) ? function(arr, f, val, opt_obj) { | |
goog.asserts.assert(arr.length != null); | |
if (opt_obj) { | |
f = goog.bind(f, opt_obj); | |
} | |
return goog.array.ARRAY_PROTOTYPE_.reduceRight.call(arr, f, val); | |
} : function(arr, f, val, opt_obj) { | |
var rval = val; | |
goog.array.forEachRight(arr, function(val, index) { | |
rval = f.call(opt_obj, rval, val, index, arr); | |
}); | |
return rval; | |
}; | |
goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.some) ? function(arr, f, opt_obj) { | |
goog.asserts.assert(arr.length != null); | |
return goog.array.ARRAY_PROTOTYPE_.some.call(arr, f, opt_obj); | |
} : function(arr, f, opt_obj) { | |
var l = arr.length; | |
var arr2 = goog.isString(arr) ? arr.split("") : arr; | |
for (var i = 0;i < l;i++) { | |
if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) { | |
return true; | |
} | |
} | |
return false; | |
}; | |
goog.array.every = goog.NATIVE_ARRAY_PROTOTYPES && (goog.array.ASSUME_NATIVE_FUNCTIONS || goog.array.ARRAY_PROTOTYPE_.every) ? function(arr, f, opt_obj) { | |
goog.asserts.assert(arr.length != null); | |
return goog.array.ARRAY_PROTOTYPE_.every.call(arr, f, opt_obj); | |
} : function(arr, f, opt_obj) { | |
var l = arr.length; | |
var arr2 = goog.isString(arr) ? arr.split("") : arr; | |
for (var i = 0;i < l;i++) { | |
if (i in arr2 && !f.call(opt_obj, arr2[i], i, arr)) { | |
return false; | |
} | |
} | |
return true; | |
}; | |
goog.array.count = function(arr, f, opt_obj) { | |
var count = 0; | |
goog.array.forEach(arr, function(element, index, arr) { | |
if (f.call(opt_obj, element, index, arr)) { | |
++count; | |
} | |
}, opt_obj); | |
return count; | |
}; | |
goog.array.find = function(arr, f, opt_obj) { | |
var i = goog.array.findIndex(arr, f, opt_obj); | |
return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i]; | |
}; | |
goog.array.findIndex = function(arr, f, opt_obj) { | |
var l = arr.length; | |
var arr2 = goog.isString(arr) ? arr.split("") : arr; | |
for (var i = 0;i < l;i++) { | |
if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) { | |
return i; | |
} | |
} | |
return-1; | |
}; | |
goog.array.findRight = function(arr, f, opt_obj) { | |
var i = goog.array.findIndexRight(arr, f, opt_obj); | |
return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i]; | |
}; | |
goog.array.findIndexRight = function(arr, f, opt_obj) { | |
var l = arr.length; | |
var arr2 = goog.isString(arr) ? arr.split("") : arr; | |
for (var i = l - 1;i >= 0;i--) { | |
if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) { | |
return i; | |
} | |
} | |
return-1; | |
}; | |
goog.array.contains = function(arr, obj) { | |
return goog.array.indexOf(arr, obj) >= 0; | |
}; | |
goog.array.isEmpty = function(arr) { | |
return arr.length == 0; | |
}; | |
goog.array.clear = function(arr) { | |
if (!goog.isArray(arr)) { | |
for (var i = arr.length - 1;i >= 0;i--) { | |
delete arr[i]; | |
} | |
} | |
arr.length = 0; | |
}; | |
goog.array.insert = function(arr, obj) { | |
if (!goog.array.contains(arr, obj)) { | |
arr.push(obj); | |
} | |
}; | |
goog.array.insertAt = function(arr, obj, opt_i) { | |
goog.array.splice(arr, opt_i, 0, obj); | |
}; | |
goog.array.insertArrayAt = function(arr, elementsToAdd, opt_i) { | |
goog.partial(goog.array.splice, arr, opt_i, 0).apply(null, elementsToAdd); | |
}; | |
goog.array.insertBefore = function(arr, obj, opt_obj2) { | |
var i; | |
if (arguments.length == 2 || (i = goog.array.indexOf(arr, opt_obj2)) < 0) { | |
arr.push(obj); | |
} else { | |
goog.array.insertAt(arr, obj, i); | |
} | |
}; | |
goog.array.remove = function(arr, obj) { | |
var i = goog.array.indexOf(arr, obj); | |
var rv; | |
if (rv = i >= 0) { | |
goog.array.removeAt(arr, i); | |
} | |
return rv; | |
}; | |
goog.array.removeAt = function(arr, i) { | |
goog.asserts.assert(arr.length != null); | |
return goog.array.ARRAY_PROTOTYPE_.splice.call(arr, i, 1).length == 1; | |
}; | |
goog.array.removeIf = function(arr, f, opt_obj) { | |
var i = goog.array.findIndex(arr, f, opt_obj); | |
if (i >= 0) { | |
goog.array.removeAt(arr, i); | |
return true; | |
} | |
return false; | |
}; | |
goog.array.concat = function(var_args) { | |
return goog.array.ARRAY_PROTOTYPE_.concat.apply(goog.array.ARRAY_PROTOTYPE_, arguments); | |
}; | |
goog.array.toArray = function(object) { | |
var length = object.length; | |
if (length > 0) { | |
var rv = new Array(length); | |
for (var i = 0;i < length;i++) { | |
rv[i] = object[i]; | |
} | |
return rv; | |
} | |
return[]; | |
}; | |
goog.array.clone = goog.array.toArray; | |
goog.array.extend = function(arr1, var_args) { | |
for (var i = 1;i < arguments.length;i++) { | |
var arr2 = arguments[i]; | |
var isArrayLike; | |
if (goog.isArray(arr2) || (isArrayLike = goog.isArrayLike(arr2)) && Object.prototype.hasOwnProperty.call(arr2, "callee")) { | |
arr1.push.apply(arr1, arr2); | |
} else { | |
if (isArrayLike) { | |
var len1 = arr1.length; | |
var len2 = arr2.length; | |
for (var j = 0;j < len2;j++) { | |
arr1[len1 + j] = arr2[j]; | |
} | |
} else { | |
arr1.push(arr2); | |
} | |
} | |
} | |
}; | |
goog.array.splice = function(arr, index, howMany, var_args) { | |
goog.asserts.assert(arr.length != null); | |
return goog.array.ARRAY_PROTOTYPE_.splice.apply(arr, goog.array.slice(arguments, 1)); | |
}; | |
goog.array.slice = function(arr, start, opt_end) { | |
goog.asserts.assert(arr.length != null); | |
if (arguments.length <= 2) { | |
return goog.array.ARRAY_PROTOTYPE_.slice.call(arr, start); | |
} else { | |
return goog.array.ARRAY_PROTOTYPE_.slice.call(arr, start, opt_end); | |
} | |
}; | |
goog.array.removeDuplicates = function(arr, opt_rv, opt_hashFn) { | |
var returnArray = opt_rv || arr; | |
var defaultHashFn = function(item) { | |
return goog.isObject(current) ? "o" + goog.getUid(current) : (typeof current).charAt(0) + current; | |
}; | |
var hashFn = opt_hashFn || defaultHashFn; | |
var seen = {}, cursorInsert = 0, cursorRead = 0; | |
while (cursorRead < arr.length) { | |
var current = arr[cursorRead++]; | |
var key = hashFn(current); | |
if (!Object.prototype.hasOwnProperty.call(seen, key)) { | |
seen[key] = true; | |
returnArray[cursorInsert++] = current; | |
} | |
} | |
returnArray.length = cursorInsert; | |
}; | |
goog.array.binarySearch = function(arr, target, opt_compareFn) { | |
return goog.array.binarySearch_(arr, opt_compareFn || goog.array.defaultCompare, false, target); | |
}; | |
goog.array.binarySelect = function(arr, evaluator, opt_obj) { | |
return goog.array.binarySearch_(arr, evaluator, true, undefined, opt_obj); | |
}; | |
goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target, opt_selfObj) { | |
var left = 0; | |
var right = arr.length; | |
var found; | |
while (left < right) { | |
var middle = left + right >> 1; | |
var compareResult; | |
if (isEvaluator) { | |
compareResult = compareFn.call(opt_selfObj, arr[middle], middle, arr); | |
} else { | |
compareResult = compareFn(opt_target, arr[middle]); | |
} | |
if (compareResult > 0) { | |
left = middle + 1; | |
} else { | |
right = middle; | |
found = !compareResult; | |
} | |
} | |
return found ? left : ~left; | |
}; | |
goog.array.sort = function(arr, opt_compareFn) { | |
arr.sort(opt_compareFn || goog.array.defaultCompare); | |
}; | |
goog.array.stableSort = function(arr, opt_compareFn) { | |
for (var i = 0;i < arr.length;i++) { | |
arr[i] = {index:i, value:arr[i]}; | |
} | |
var valueCompareFn = opt_compareFn || goog.array.defaultCompare; | |
function stableCompareFn(obj1, obj2) { | |
return valueCompareFn(obj1.value, obj2.value) || obj1.index - obj2.index; | |
} | |
goog.array.sort(arr, stableCompareFn); | |
for (var i = 0;i < arr.length;i++) { | |
arr[i] = arr[i].value; | |
} | |
}; | |
goog.array.sortObjectsByKey = function(arr, key, opt_compareFn) { | |
var compare = opt_compareFn || goog.array.defaultCompare; | |
goog.array.sort(arr, function(a, b) { | |
return compare(a[key], b[key]); | |
}); | |
}; | |
goog.array.isSorted = function(arr, opt_compareFn, opt_strict) { | |
var compare = opt_compareFn || goog.array.defaultCompare; | |
for (var i = 1;i < arr.length;i++) { | |
var compareResult = compare(arr[i - 1], arr[i]); | |
if (compareResult > 0 || compareResult == 0 && opt_strict) { | |
return false; | |
} | |
} | |
return true; | |
}; | |
goog.array.equals = function(arr1, arr2, opt_equalsFn) { | |
if (!goog.isArrayLike(arr1) || (!goog.isArrayLike(arr2) || arr1.length != arr2.length)) { | |
return false; | |
} | |
var l = arr1.length; | |
var equalsFn = opt_equalsFn || goog.array.defaultCompareEquality; | |
for (var i = 0;i < l;i++) { | |
if (!equalsFn(arr1[i], arr2[i])) { | |
return false; | |
} | |
} | |
return true; | |
}; | |
goog.array.compare3 = function(arr1, arr2, opt_compareFn) { | |
var compare = opt_compareFn || goog.array.defaultCompare; | |
var l = Math.min(arr1.length, arr2.length); | |
for (var i = 0;i < l;i++) { | |
var result = compare(arr1[i], arr2[i]); | |
if (result != 0) { | |
return result; | |
} | |
} | |
return goog.array.defaultCompare(arr1.length, arr2.length); | |
}; | |
goog.array.defaultCompare = function(a, b) { | |
return a > b ? 1 : a < b ? -1 : 0; | |
}; | |
goog.array.defaultCompareEquality = function(a, b) { | |
return a === b; | |
}; | |
goog.array.binaryInsert = function(array, value, opt_compareFn) { | |
var index = goog.array.binarySearch(array, value, opt_compareFn); | |
if (index < 0) { | |
goog.array.insertAt(array, value, -(index + 1)); | |
return true; | |
} | |
return false; | |
}; | |
goog.array.binaryRemove = function(array, value, opt_compareFn) { | |
var index = goog.array.binarySearch(array, value, opt_compareFn); | |
return index >= 0 ? goog.array.removeAt(array, index) : false; | |
}; | |
goog.array.bucket = function(array, sorter, opt_obj) { | |
var buckets = {}; | |
for (var i = 0;i < array.length;i++) { | |
var value = array[i]; | |
var key = sorter.call(opt_obj, value, i, array); | |
if (goog.isDef(key)) { | |
var bucket = buckets[key] || (buckets[key] = []); | |
bucket.push(value); | |
} | |
} | |
return buckets; | |
}; | |
goog.array.toObject = function(arr, keyFunc, opt_obj) { | |
var ret = {}; | |
goog.array.forEach(arr, function(element, index) { | |
ret[keyFunc.call(opt_obj, element, index, arr)] = element; | |
}); | |
return ret; | |
}; | |
goog.array.range = function(startOrEnd, opt_end, opt_step) { | |
var array = []; | |
var start = 0; | |
var end = startOrEnd; | |
var step = opt_step || 1; | |
if (opt_end !== undefined) { | |
start = startOrEnd; | |
end = opt_end; | |
} | |
if (step * (end - start) < 0) { | |
return[]; | |
} | |
if (step > 0) { | |
for (var i = start;i < end;i += step) { | |
array.push(i); | |
} | |
} else { | |
for (var i = start;i > end;i += step) { | |
array.push(i); | |
} | |
} | |
return array; | |
}; | |
goog.array.repeat = function(value, n) { | |
var array = []; | |
for (var i = 0;i < n;i++) { | |
array[i] = value; | |
} | |
return array; | |
}; | |
goog.array.flatten = function(var_args) { | |
var result = []; | |
for (var i = 0;i < arguments.length;i++) { | |
var element = arguments[i]; | |
if (goog.isArray(element)) { | |
result.push.apply(result, goog.array.flatten.apply(null, element)); | |
} else { | |
result.push(element); | |
} | |
} | |
return result; | |
}; | |
goog.array.rotate = function(array, n) { | |
goog.asserts.assert(array.length != null); | |
if (array.length) { | |
n %= array.length; | |
if (n > 0) { | |
goog.array.ARRAY_PROTOTYPE_.unshift.apply(array, array.splice(-n, n)); | |
} else { | |
if (n < 0) { | |
goog.array.ARRAY_PROTOTYPE_.push.apply(array, array.splice(0, -n)); | |
} | |
} | |
} | |
return array; | |
}; | |
goog.array.moveItem = function(arr, fromIndex, toIndex) { | |
goog.asserts.assert(fromIndex >= 0 && fromIndex < arr.length); | |
goog.asserts.assert(toIndex >= 0 && toIndex < arr.length); | |
var removedItems = goog.array.ARRAY_PROTOTYPE_.splice.call(arr, fromIndex, 1); | |
goog.array.ARRAY_PROTOTYPE_.splice.call(arr, toIndex, 0, removedItems[0]); | |
}; | |
goog.array.zip = function(var_args) { | |
if (!arguments.length) { | |
return[]; | |
} | |
var result = []; | |
for (var i = 0;true;i++) { | |
var value = []; | |
for (var j = 0;j < arguments.length;j++) { | |
var arr = arguments[j]; | |
if (i >= arr.length) { | |
return result; | |
} | |
value.push(arr[i]); | |
} | |
result.push(value); | |
} | |
}; | |
goog.array.shuffle = function(arr, opt_randFn) { | |
var randFn = opt_randFn || Math.random; | |
for (var i = arr.length - 1;i > 0;i--) { | |
var j = Math.floor(randFn() * (i + 1)); | |
var tmp = arr[i]; | |
arr[i] = arr[j]; | |
arr[j] = tmp; | |
} | |
}; | |
goog.provide("goog.events.ListenerMap"); | |
goog.require("goog.array"); | |
goog.require("goog.events.Listener"); | |
goog.require("goog.object"); | |
goog.events.ListenerMap = function(src) { | |
this.src = src; | |
this.listeners = {}; | |
this.typeCount_ = 0; | |
}; | |
goog.events.ListenerMap.prototype.getTypeCount = function() { | |
return this.typeCount_; | |
}; | |
goog.events.ListenerMap.prototype.getListenerCount = function() { | |
var count = 0; | |
for (var type in this.listeners) { | |
count += this.listeners[type].length; | |
} | |
return count; | |
}; | |
goog.events.ListenerMap.prototype.add = function(type, listener, callOnce, opt_useCapture, opt_listenerScope) { | |
var typeStr = type.toString(); | |
var listenerArray = this.listeners[typeStr]; | |
if (!listenerArray) { | |
listenerArray = this.listeners[typeStr] = []; | |
this.typeCount_++; | |
} | |
var listenerObj; | |
var index = goog.events.ListenerMap.findListenerIndex_(listenerArray, listener, opt_useCapture, opt_listenerScope); | |
if (index > -1) { | |
listenerObj = listenerArray[index]; | |
if (!callOnce) { | |
listenerObj.callOnce = false; | |
} | |
} else { | |
listenerObj = new goog.events.Listener(listener, null, this.src, typeStr, !!opt_useCapture, opt_listenerScope); | |
listenerObj.callOnce = callOnce; | |
listenerArray.push(listenerObj); | |
} | |
return listenerObj; | |
}; | |
goog.events.ListenerMap.prototype.remove = function(type, listener, opt_useCapture, opt_listenerScope) { | |
var typeStr = type.toString(); | |
if (!(typeStr in this.listeners)) { | |
return false; | |
} | |
var listenerArray = this.listeners[typeStr]; | |
var index = goog.events.ListenerMap.findListenerIndex_(listenerArray, listener, opt_useCapture, opt_listenerScope); | |
if (index > -1) { | |
var listenerObj = listenerArray[index]; | |
listenerObj.markAsRemoved(); | |
goog.array.removeAt(listenerArray, index); | |
if (listenerArray.length == 0) { | |
delete this.listeners[typeStr]; | |
this.typeCount_--; | |
} | |
return true; | |
} | |
return false; | |
}; | |
goog.events.ListenerMap.prototype.removeByKey = function(listener) { | |
var type = listener.type; | |
if (!(type in this.listeners)) { | |
return false; | |
} | |
var removed = goog.array.remove(this.listeners[type], listener); | |
if (removed) { | |
listener.markAsRemoved(); | |
if (this.listeners[type].length == 0) { | |
delete this.listeners[type]; | |
this.typeCount_--; | |
} | |
} | |
return removed; | |
}; | |
goog.events.ListenerMap.prototype.removeAll = function(opt_type) { | |
var typeStr = opt_type && opt_type.toString(); | |
var count = 0; | |
for (var type in this.listeners) { | |
if (!typeStr || type == typeStr) { | |
var listenerArray = this.listeners[type]; | |
for (var i = 0;i < listenerArray.length;i++) { | |
++count; | |
listenerArray[i].markAsRemoved(); | |
} | |
delete this.listeners[type]; | |
this.typeCount_--; | |
} | |
} | |
return count; | |
}; | |
goog.events.ListenerMap.prototype.getListeners = function(type, capture) { | |
var listenerArray = this.listeners[type.toString()]; | |
var rv = []; | |
if (listenerArray) { | |
for (var i = 0;i < listenerArray.length;++i) { | |
var listenerObj = listenerArray[i]; | |
if (listenerObj.capture == capture) { | |
rv.push(listenerObj); | |
} | |
} | |
} | |
return rv; | |
}; | |
goog.events.ListenerMap.prototype.getListener = function(type, listener, capture, opt_listenerScope) { | |
var listenerArray = this.listeners[type.toString()]; | |
var i = -1; | |
if (listenerArray) { | |
i = goog.events.ListenerMap.findListenerIndex_(listenerArray, listener, capture, opt_listenerScope); | |
} | |
return i > -1 ? listenerArray[i] : null; | |
}; | |
goog.events.ListenerMap.prototype.hasListener = function(opt_type, opt_capture) { | |
var hasType = goog.isDef(opt_type); | |
var typeStr = hasType ? opt_type.toString() : ""; | |
var hasCapture = goog.isDef(opt_capture); | |
return goog.object.some(this.listeners, function(listenerArray, type) { | |
for (var i = 0;i < listenerArray.length;++i) { | |
if ((!hasType || listenerArray[i].type == typeStr) && (!hasCapture || listenerArray[i].capture == opt_capture)) { | |
return true; | |
} | |
} | |
return false; | |
}); | |
}; | |
goog.events.ListenerMap.findListenerIndex_ = function(listenerArray, listener, opt_useCapture, opt_listenerScope) { | |
for (var i = 0;i < listenerArray.length;++i) { | |
var listenerObj = listenerArray[i]; | |
if (!listenerObj.removed && (listenerObj.listener == listener && (listenerObj.capture == !!opt_useCapture && listenerObj.handler == opt_listenerScope))) { | |
return i; | |
} | |
} | |
return-1; | |
}; | |
goog.provide("goog.userAgent"); | |
goog.require("goog.string"); | |
goog.define("goog.userAgent.ASSUME_IE", false); | |
goog.define("goog.userAgent.ASSUME_GECKO", false); | |
goog.define("goog.userAgent.ASSUME_WEBKIT", false); | |
goog.define("goog.userAgent.ASSUME_MOBILE_WEBKIT", false); | |
goog.define("goog.userAgent.ASSUME_OPERA", false); | |
goog.define("goog.userAgent.ASSUME_ANY_VERSION", false); | |
goog.userAgent.BROWSER_KNOWN_ = goog.userAgent.ASSUME_IE || (goog.userAgent.ASSUME_GECKO || (goog.userAgent.ASSUME_MOBILE_WEBKIT || (goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_OPERA))); | |
goog.userAgent.getUserAgentString = function() { | |
return goog.global["navigator"] ? goog.global["navigator"].userAgent : null; | |
}; | |
goog.userAgent.getNavigator = function() { | |
return goog.global["navigator"]; | |
}; | |
goog.userAgent.init_ = function() { | |
goog.userAgent.detectedOpera_ = false; | |
goog.userAgent.detectedIe_ = false; | |
goog.userAgent.detectedWebkit_ = false; | |
goog.userAgent.detectedMobile_ = false; | |
goog.userAgent.detectedGecko_ = false; | |
var ua; | |
if (!goog.userAgent.BROWSER_KNOWN_ && (ua = goog.userAgent.getUserAgentString())) { | |
var navigator = goog.userAgent.getNavigator(); | |
goog.userAgent.detectedOpera_ = goog.string.startsWith(ua, "Opera"); | |
goog.userAgent.detectedIe_ = !goog.userAgent.detectedOpera_ && (goog.string.contains(ua, "MSIE") || goog.string.contains(ua, "Trident")); | |
goog.userAgent.detectedWebkit_ = !goog.userAgent.detectedOpera_ && goog.string.contains(ua, "WebKit"); | |
goog.userAgent.detectedMobile_ = goog.userAgent.detectedWebkit_ && goog.string.contains(ua, "Mobile"); | |
goog.userAgent.detectedGecko_ = !goog.userAgent.detectedOpera_ && (!goog.userAgent.detectedWebkit_ && (!goog.userAgent.detectedIe_ && navigator.product == "Gecko")); | |
} | |
}; | |
if (!goog.userAgent.BROWSER_KNOWN_) { | |
goog.userAgent.init_(); | |
} | |
goog.userAgent.OPERA = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_OPERA : goog.userAgent.detectedOpera_; | |
goog.userAgent.IE = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_IE : goog.userAgent.detectedIe_; | |
goog.userAgent.GECKO = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_GECKO : goog.userAgent.detectedGecko_; | |
goog.userAgent.WEBKIT = goog.userAgent.BROWSER_KNOWN_ ? goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_MOBILE_WEBKIT : goog.userAgent.detectedWebkit_; | |
goog.userAgent.MOBILE = goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.detectedMobile_; | |
goog.userAgent.SAFARI = goog.userAgent.WEBKIT; | |
goog.userAgent.determinePlatform_ = function() { | |
var navigator = goog.userAgent.getNavigator(); | |
return navigator && navigator.platform || ""; | |
}; | |
goog.userAgent.PLATFORM = goog.userAgent.determinePlatform_(); | |
goog.define("goog.userAgent.ASSUME_MAC", false); | |
goog.define("goog.userAgent.ASSUME_WINDOWS", false); | |
goog.define("goog.userAgent.ASSUME_LINUX", false); | |
goog.define("goog.userAgent.ASSUME_X11", false); | |
goog.define("goog.userAgent.ASSUME_ANDROID", false); | |
goog.define("goog.userAgent.ASSUME_IPHONE", false); | |
goog.define("goog.userAgent.ASSUME_IPAD", false); | |
goog.userAgent.PLATFORM_KNOWN_ = goog.userAgent.ASSUME_MAC || (goog.userAgent.ASSUME_WINDOWS || (goog.userAgent.ASSUME_LINUX || (goog.userAgent.ASSUME_X11 || (goog.userAgent.ASSUME_ANDROID || (goog.userAgent.ASSUME_IPHONE || goog.userAgent.ASSUME_IPAD))))); | |
goog.userAgent.initPlatform_ = function() { | |
goog.userAgent.detectedMac_ = goog.string.contains(goog.userAgent.PLATFORM, "Mac"); | |
goog.userAgent.detectedWindows_ = goog.string.contains(goog.userAgent.PLATFORM, "Win"); | |
goog.userAgent.detectedLinux_ = goog.string.contains(goog.userAgent.PLATFORM, "Linux"); | |
goog.userAgent.detectedX11_ = !!goog.userAgent.getNavigator() && goog.string.contains(goog.userAgent.getNavigator()["appVersion"] || "", "X11"); | |
var ua = goog.userAgent.getUserAgentString(); | |
goog.userAgent.detectedAndroid_ = !!ua && goog.string.contains(ua, "Android"); | |
goog.userAgent.detectedIPhone_ = !!ua && goog.string.contains(ua, "iPhone"); | |
goog.userAgent.detectedIPad_ = !!ua && goog.string.contains(ua, "iPad"); | |
}; | |
if (!goog.userAgent.PLATFORM_KNOWN_) { | |
goog.userAgent.initPlatform_(); | |
} | |
goog.userAgent.MAC = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_MAC : goog.userAgent.detectedMac_; | |
goog.userAgent.WINDOWS = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_WINDOWS : goog.userAgent.detectedWindows_; | |
goog.userAgent.LINUX = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_LINUX : goog.userAgent.detectedLinux_; | |
goog.userAgent.X11 = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_X11 : goog.userAgent.detectedX11_; | |
goog.userAgent.ANDROID = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_ANDROID : goog.userAgent.detectedAndroid_; | |
goog.userAgent.IPHONE = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPHONE : goog.userAgent.detectedIPhone_; | |
goog.userAgent.IPAD = goog.userAgent.PLATFORM_KNOWN_ ? goog.userAgent.ASSUME_IPAD : goog.userAgent.detectedIPad_; | |
goog.userAgent.determineVersion_ = function() { | |
var version = "", re; | |
if (goog.userAgent.OPERA && goog.global["opera"]) { | |
var operaVersion = goog.global["opera"].version; | |
version = typeof operaVersion == "function" ? operaVersion() : operaVersion; | |
} else { | |
if (goog.userAgent.GECKO) { | |
re = /rv\:([^\);]+)(\)|;)/; | |
} else { | |
if (goog.userAgent.IE) { | |
re = /\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/; | |
} else { | |
if (goog.userAgent.WEBKIT) { | |
re = /WebKit\/(\S+)/; | |
} | |
} | |
} | |
if (re) { | |
var arr = re.exec(goog.userAgent.getUserAgentString()); | |
version = arr ? arr[1] : ""; | |
} | |
} | |
if (goog.userAgent.IE) { | |
var docMode = goog.userAgent.getDocumentMode_(); | |
if (docMode > parseFloat(version)) { | |
return String(docMode); | |
} | |
} | |
return version; | |
}; | |
goog.userAgent.getDocumentMode_ = function() { | |
var doc = goog.global["document"]; | |
return doc ? doc["documentMode"] : undefined; | |
}; | |
goog.userAgent.VERSION = goog.userAgent.determineVersion_(); | |
goog.userAgent.compare = function(v1, v2) { | |
return goog.string.compareVersions(v1, v2); | |
}; | |
goog.userAgent.isVersionOrHigherCache_ = {}; | |
goog.userAgent.isVersionOrHigher = function(version) { | |
return goog.userAgent.ASSUME_ANY_VERSION || (goog.userAgent.isVersionOrHigherCache_[version] || (goog.userAgent.isVersionOrHigherCache_[version] = goog.string.compareVersions(goog.userAgent.VERSION, version) >= 0)); | |
}; | |
goog.userAgent.isVersion = goog.userAgent.isVersionOrHigher; | |
goog.userAgent.isDocumentModeOrHigher = function(documentMode) { | |
return goog.userAgent.IE && goog.userAgent.DOCUMENT_MODE >= documentMode; | |
}; | |
goog.userAgent.isDocumentMode = goog.userAgent.isDocumentModeOrHigher; | |
goog.userAgent.DOCUMENT_MODE = function() { | |
var doc = goog.global["document"]; | |
if (!doc || !goog.userAgent.IE) { | |
return undefined; | |
} | |
var mode = goog.userAgent.getDocumentMode_(); | |
return mode || (doc["compatMode"] == "CSS1Compat" ? parseInt(goog.userAgent.VERSION, 10) : 5); | |
}(); | |
goog.provide("goog.events.BrowserFeature"); | |
goog.require("goog.userAgent"); | |
goog.events.BrowserFeature = {HAS_W3C_BUTTON:!goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9), HAS_W3C_EVENT_SUPPORT:!goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9), SET_KEY_CODE_TO_PREVENT_DEFAULT:goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("9"), HAS_NAVIGATOR_ONLINE_PROPERTY:!goog.userAgent.WEBKIT || goog.userAgent.isVersionOrHigher("528"), HAS_HTML5_NETWORK_EVENT_SUPPORT:goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher("1.9b") || (goog.userAgent.IE && | |
goog.userAgent.isVersionOrHigher("8") || (goog.userAgent.OPERA && goog.userAgent.isVersionOrHigher("9.5") || goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher("528"))), HTML5_NETWORK_EVENTS_FIRE_ON_BODY:goog.userAgent.GECKO && !goog.userAgent.isVersionOrHigher("8") || goog.userAgent.IE && !goog.userAgent.isVersionOrHigher("9"), TOUCH_ENABLED:"ontouchstart" in goog.global || (!!(goog.global["document"] && (document.documentElement && "ontouchstart" in document.documentElement)) || !!(goog.global["navigator"] && | |
goog.global["navigator"]["msMaxTouchPoints"]))}; | |
goog.provide("goog.debug.EntryPointMonitor"); | |
goog.provide("goog.debug.entryPointRegistry"); | |
goog.require("goog.asserts"); | |
goog.debug.EntryPointMonitor = function() { | |
}; | |
goog.debug.EntryPointMonitor.prototype.wrap; | |
goog.debug.EntryPointMonitor.prototype.unwrap; | |
goog.debug.entryPointRegistry.refList_ = []; | |
goog.debug.entryPointRegistry.monitors_ = []; | |
goog.debug.entryPointRegistry.monitorsMayExist_ = false; | |
goog.debug.entryPointRegistry.register = function(callback) { | |
goog.debug.entryPointRegistry.refList_[goog.debug.entryPointRegistry.refList_.length] = callback; | |
if (goog.debug.entryPointRegistry.monitorsMayExist_) { | |
var monitors = goog.debug.entryPointRegistry.monitors_; | |
for (var i = 0;i < monitors.length;i++) { | |
callback(goog.bind(monitors[i].wrap, monitors[i])); | |
} | |
} | |
}; | |
goog.debug.entryPointRegistry.monitorAll = function(monitor) { | |
goog.debug.entryPointRegistry.monitorsMayExist_ = true; | |
var transformer = goog.bind(monitor.wrap, monitor); | |
for (var i = 0;i < goog.debug.entryPointRegistry.refList_.length;i++) { | |
goog.debug.entryPointRegistry.refList_[i](transformer); | |
} | |
goog.debug.entryPointRegistry.monitors_.push(monitor); | |
}; | |
goog.debug.entryPointRegistry.unmonitorAllIfPossible = function(monitor) { | |
var monitors = goog.debug.entryPointRegistry.monitors_; | |
goog.asserts.assert(monitor == monitors[monitors.length - 1], "Only the most recent monitor can be unwrapped."); | |
var transformer = goog.bind(monitor.unwrap, monitor); | |
for (var i = 0;i < goog.debug.entryPointRegistry.refList_.length;i++) { | |
goog.debug.entryPointRegistry.refList_[i](transformer); | |
} | |
monitors.length--; | |
}; | |
goog.provide("goog.events.EventType"); | |
goog.require("goog.userAgent"); | |
goog.events.getVendorPrefixedName_ = function(eventName) { | |
return goog.userAgent.WEBKIT ? "webkit" + eventName : goog.userAgent.OPERA ? "o" + eventName.toLowerCase() : eventName.toLowerCase(); | |
}; | |
goog.events.EventType = {CLICK:"click", DBLCLICK:"dblclick", MOUSEDOWN:"mousedown", MOUSEUP:"mouseup", MOUSEOVER:"mouseover", MOUSEOUT:"mouseout", MOUSEMOVE:"mousemove", MOUSEENTER:"mouseenter", MOUSELEAVE:"mouseleave", SELECTSTART:"selectstart", KEYPRESS:"keypress", KEYDOWN:"keydown", KEYUP:"keyup", BLUR:"blur", FOCUS:"focus", DEACTIVATE:"deactivate", FOCUSIN:goog.userAgent.IE ? "focusin" : "DOMFocusIn", FOCUSOUT:goog.userAgent.IE ? "focusout" : "DOMFocusOut", CHANGE:"change", SELECT:"select", SUBMIT:"submit", | |
INPUT:"input", PROPERTYCHANGE:"propertychange", DRAGSTART:"dragstart", DRAG:"drag", DRAGENTER:"dragenter", DRAGOVER:"dragover", DRAGLEAVE:"dragleave", DROP:"drop", DRAGEND:"dragend", TOUCHSTART:"touchstart", TOUCHMOVE:"touchmove", TOUCHEND:"touchend", TOUCHCANCEL:"touchcancel", BEFOREUNLOAD:"beforeunload", CONSOLEMESSAGE:"consolemessage", CONTEXTMENU:"contextmenu", DOMCONTENTLOADED:"DOMContentLoaded", ERROR:"error", HELP:"help", LOAD:"load", LOSECAPTURE:"losecapture", ORIENTATIONCHANGE:"orientationchange", | |
READYSTATECHANGE:"readystatechange", RESIZE:"resize", SCROLL:"scroll", UNLOAD:"unload", HASHCHANGE:"hashchange", PAGEHIDE:"pagehide", PAGESHOW:"pageshow", POPSTATE:"popstate", COPY:"copy", PASTE:"paste", CUT:"cut", BEFORECOPY:"beforecopy", BEFORECUT:"beforecut", BEFOREPASTE:"beforepaste", ONLINE:"online", OFFLINE:"offline", MESSAGE:"message", CONNECT:"connect", ANIMATIONSTART:goog.events.getVendorPrefixedName_("AnimationStart"), ANIMATIONEND:goog.events.getVendorPrefixedName_("AnimationEnd"), ANIMATIONITERATION:goog.events.getVendorPrefixedName_("AnimationIteration"), | |
TRANSITIONEND:goog.events.getVendorPrefixedName_("TransitionEnd"), POINTERDOWN:"pointerdown", POINTERUP:"pointerup", POINTERCANCEL:"pointercancel", POINTERMOVE:"pointermove", POINTEROVER:"pointerover", POINTEROUT:"pointerout", POINTERENTER:"pointerenter", POINTERLEAVE:"pointerleave", GOTPOINTERCAPTURE:"gotpointercapture", LOSTPOINTERCAPTURE:"lostpointercapture", MSGESTURECHANGE:"MSGestureChange", MSGESTUREEND:"MSGestureEnd", MSGESTUREHOLD:"MSGestureHold", MSGESTURESTART:"MSGestureStart", MSGESTURETAP:"MSGestureTap", | |
MSGOTPOINTERCAPTURE:"MSGotPointerCapture", MSINERTIASTART:"MSInertiaStart", MSLOSTPOINTERCAPTURE:"MSLostPointerCapture", MSPOINTERCANCEL:"MSPointerCancel", MSPOINTERDOWN:"MSPointerDown", MSPOINTERENTER:"MSPointerEnter", MSPOINTERHOVER:"MSPointerHover", MSPOINTERLEAVE:"MSPointerLeave", MSPOINTERMOVE:"MSPointerMove", MSPOINTEROUT:"MSPointerOut", MSPOINTEROVER:"MSPointerOver", MSPOINTERUP:"MSPointerUp", TEXTINPUT:"textinput", COMPOSITIONSTART:"compositionstart", COMPOSITIONUPDATE:"compositionupdate", | |
COMPOSITIONEND:"compositionend", EXIT:"exit", LOADABORT:"loadabort", LOADCOMMIT:"loadcommit", LOADREDIRECT:"loadredirect", LOADSTART:"loadstart", LOADSTOP:"loadstop", RESPONSIVE:"responsive", SIZECHANGED:"sizechanged", UNRESPONSIVE:"unresponsive", VISIBILITYCHANGE:"visibilitychange", STORAGE:"storage"}; | |
goog.provide("goog.disposable.IDisposable"); | |
goog.disposable.IDisposable = function() { | |
}; | |
goog.disposable.IDisposable.prototype.dispose; | |
goog.disposable.IDisposable.prototype.isDisposed; | |
goog.provide("goog.Disposable"); | |
goog.provide("goog.dispose"); | |
goog.provide("goog.disposeAll"); | |
goog.require("goog.disposable.IDisposable"); | |
goog.Disposable = function() { | |
if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) { | |
if (goog.Disposable.INCLUDE_STACK_ON_CREATION) { | |
this.creationStack = (new Error).stack; | |
} | |
goog.Disposable.instances_[goog.getUid(this)] = this; | |
} | |
}; | |
goog.Disposable.MonitoringMode = {OFF:0, PERMANENT:1, INTERACTIVE:2}; | |
goog.define("goog.Disposable.MONITORING_MODE", 0); | |
goog.define("goog.Disposable.INCLUDE_STACK_ON_CREATION", true); | |
goog.Disposable.instances_ = {}; | |
goog.Disposable.getUndisposedObjects = function() { | |
var ret = []; | |
for (var id in goog.Disposable.instances_) { | |
if (goog.Disposable.instances_.hasOwnProperty(id)) { | |
ret.push(goog.Disposable.instances_[Number(id)]); | |
} | |
} | |
return ret; | |
}; | |
goog.Disposable.clearUndisposedObjects = function() { | |
goog.Disposable.instances_ = {}; | |
}; | |
goog.Disposable.prototype.disposed_ = false; | |
goog.Disposable.prototype.onDisposeCallbacks_; | |
goog.Disposable.prototype.creationStack; | |
goog.Disposable.prototype.isDisposed = function() { | |
return this.disposed_; | |
}; | |
goog.Disposable.prototype.getDisposed = goog.Disposable.prototype.isDisposed; | |
goog.Disposable.prototype.dispose = function() { | |
if (!this.disposed_) { | |
this.disposed_ = true; | |
this.disposeInternal(); | |
if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) { | |
var uid = goog.getUid(this); | |
if (goog.Disposable.MONITORING_MODE == goog.Disposable.MonitoringMode.PERMANENT && !goog.Disposable.instances_.hasOwnProperty(uid)) { | |
throw Error(this + " did not call the goog.Disposable base " + "constructor or was disposed of after a clearUndisposedObjects " + "call"); | |
} | |
delete goog.Disposable.instances_[uid]; | |
} | |
} | |
}; | |
goog.Disposable.prototype.registerDisposable = function(disposable) { | |
this.addOnDisposeCallback(goog.partial(goog.dispose, disposable)); | |
}; | |
goog.Disposable.prototype.addOnDisposeCallback = function(callback, opt_scope) { | |
if (!this.onDisposeCallbacks_) { | |
this.onDisposeCallbacks_ = []; | |
} | |
this.onDisposeCallbacks_.push(goog.bind(callback, opt_scope)); | |
}; | |
goog.Disposable.prototype.disposeInternal = function() { | |
if (this.onDisposeCallbacks_) { | |
while (this.onDisposeCallbacks_.length) { | |
this.onDisposeCallbacks_.shift()(); | |
} | |
} | |
}; | |
goog.Disposable.isDisposed = function(obj) { | |
if (obj && typeof obj.isDisposed == "function") { | |
return obj.isDisposed(); | |
} | |
return false; | |
}; | |
goog.dispose = function(obj) { | |
if (obj && typeof obj.dispose == "function") { | |
obj.dispose(); | |
} | |
}; | |
goog.disposeAll = function(var_args) { | |
for (var i = 0, len = arguments.length;i < len;++i) { | |
var disposable = arguments[i]; | |
if (goog.isArrayLike(disposable)) { | |
goog.disposeAll.apply(null, disposable); | |
} else { | |
goog.dispose(disposable); | |
} | |
} | |
}; | |
goog.provide("goog.events.Event"); | |
goog.provide("goog.events.EventLike"); | |
goog.require("goog.Disposable"); | |
goog.require("goog.events.EventId"); | |
goog.events.EventLike; | |
goog.events.Event = function(type, opt_target) { | |
this.type = type instanceof goog.events.EventId ? String(type) : type; | |
this.target = opt_target; | |
this.currentTarget = this.target; | |
this.propagationStopped_ = false; | |
this.defaultPrevented = false; | |
this.returnValue_ = true; | |
}; | |
goog.events.Event.prototype.disposeInternal = function() { | |
}; | |
goog.events.Event.prototype.dispose = function() { | |
}; | |
goog.events.Event.prototype.stopPropagation = function() { | |
this.propagationStopped_ = true; | |
}; | |
goog.events.Event.prototype.preventDefault = function() { | |
this.defaultPrevented = true; | |
this.returnValue_ = false; | |
}; | |
goog.events.Event.stopPropagation = function(e) { | |
e.stopPropagation(); | |
}; | |
goog.events.Event.preventDefault = function(e) { | |
e.preventDefault(); | |
}; | |
goog.provide("goog.reflect"); | |
goog.reflect.object = function(type, object) { | |
return object; | |
}; | |
goog.reflect.sinkValue = function(x) { | |
goog.reflect.sinkValue[" "](x); | |
return x; | |
}; | |
goog.reflect.sinkValue[" "] = goog.nullFunction; | |
goog.reflect.canAccessProperty = function(obj, prop) { | |
try { | |
goog.reflect.sinkValue(obj[prop]); | |
return true; | |
} catch (e) { | |
} | |
return false; | |
}; | |
goog.provide("goog.events.BrowserEvent"); | |
goog.provide("goog.events.BrowserEvent.MouseButton"); | |
goog.require("goog.events.BrowserFeature"); | |
goog.require("goog.events.Event"); | |
goog.require("goog.events.EventType"); | |
goog.require("goog.reflect"); | |
goog.require("goog.userAgent"); | |
goog.events.BrowserEvent = function(opt_e, opt_currentTarget) { | |
goog.events.BrowserEvent.base(this, "constructor", opt_e ? opt_e.type : ""); | |
this.target = null; | |
this.currentTarget = null; | |
this.relatedTarget = null; | |
this.offsetX = 0; | |
this.offsetY = 0; | |
this.clientX = 0; | |
this.clientY = 0; | |
this.screenX = 0; | |
this.screenY = 0; | |
this.button = 0; | |
this.keyCode = 0; | |
this.charCode = 0; | |
this.ctrlKey = false; | |
this.altKey = false; | |
this.shiftKey = false; | |
this.metaKey = false; | |
this.state = null; | |
this.platformModifierKey = false; | |
this.event_ = null; | |
if (opt_e) { | |
this.init(opt_e, opt_currentTarget); | |
} | |
}; | |
goog.inherits(goog.events.BrowserEvent, goog.events.Event); | |
goog.events.BrowserEvent.MouseButton = {LEFT:0, MIDDLE:1, RIGHT:2}; | |
goog.events.BrowserEvent.IEButtonMap = [1, 4, 2]; | |
goog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) { | |
var type = this.type = e.type; | |
this.target = (e.target) || e.srcElement; | |
this.currentTarget = (opt_currentTarget); | |
var relatedTarget = (e.relatedTarget); | |
if (relatedTarget) { | |
if (goog.userAgent.GECKO) { | |
if (!goog.reflect.canAccessProperty(relatedTarget, "nodeName")) { | |
relatedTarget = null; | |
} | |
} | |
} else { | |
if (type == goog.events.EventType.MOUSEOVER) { | |
relatedTarget = e.fromElement; | |
} else { | |
if (type == goog.events.EventType.MOUSEOUT) { | |
relatedTarget = e.toElement; | |
} | |
} | |
} | |
this.relatedTarget = relatedTarget; | |
this.offsetX = goog.userAgent.WEBKIT || e.offsetX !== undefined ? e.offsetX : e.layerX; | |
this.offsetY = goog.userAgent.WEBKIT || e.offsetY !== undefined ? e.offsetY : e.layerY; | |
this.clientX = e.clientX !== undefined ? e.clientX : e.pageX; | |
this.clientY = e.clientY !== undefined ? e.clientY : e.pageY; | |
this.screenX = e.screenX || 0; | |
this.screenY = e.screenY || 0; | |
this.button = e.button; | |
this.keyCode = e.keyCode || 0; | |
this.charCode = e.charCode || (type == "keypress" ? e.keyCode : 0); | |
this.ctrlKey = e.ctrlKey; | |
this.altKey = e.altKey; | |
this.shiftKey = e.shiftKey; | |
this.metaKey = e.metaKey; | |
this.platformModifierKey = goog.userAgent.MAC ? e.metaKey : e.ctrlKey; | |
this.state = e.state; | |
this.event_ = e; | |
if (e.defaultPrevented) { | |
this.preventDefault(); | |
} | |
}; | |
goog.events.BrowserEvent.prototype.isButton = function(button) { | |
if (!goog.events.BrowserFeature.HAS_W3C_BUTTON) { | |
if (this.type == "click") { | |
return button == goog.events.BrowserEvent.MouseButton.LEFT; | |
} else { | |
return!!(this.event_.button & goog.events.BrowserEvent.IEButtonMap[button]); | |
} | |
} else { | |
return this.event_.button == button; | |
} | |
}; | |
goog.events.BrowserEvent.prototype.isMouseActionButton = function() { | |
return this.isButton(goog.events.BrowserEvent.MouseButton.LEFT) && !(goog.userAgent.WEBKIT && (goog.userAgent.MAC && this.ctrlKey)); | |
}; | |
goog.events.BrowserEvent.prototype.stopPropagation = function() { | |
goog.events.BrowserEvent.superClass_.stopPropagation.call(this); | |
if (this.event_.stopPropagation) { | |
this.event_.stopPropagation(); | |
} else { | |
this.event_.cancelBubble = true; | |
} | |
}; | |
goog.events.BrowserEvent.prototype.preventDefault = function() { | |
goog.events.BrowserEvent.superClass_.preventDefault.call(this); | |
var be = this.event_; | |
if (!be.preventDefault) { | |
be.returnValue = false; | |
if (goog.events.BrowserFeature.SET_KEY_CODE_TO_PREVENT_DEFAULT) { | |
try { | |
var VK_F1 = 112; | |
var VK_F12 = 123; | |
if (be.ctrlKey || be.keyCode >= VK_F1 && be.keyCode <= VK_F12) { | |
be.keyCode = -1; | |
} | |
} catch (ex) { | |
} | |
} | |
} else { | |
be.preventDefault(); | |
} | |
}; | |
goog.events.BrowserEvent.prototype.getBrowserEvent = function() { | |
return this.event_; | |
}; | |
goog.events.BrowserEvent.prototype.disposeInternal = function() { | |
}; | |
goog.provide("goog.events"); | |
goog.provide("goog.events.CaptureSimulationMode"); | |
goog.provide("goog.events.Key"); | |
goog.provide("goog.events.ListenableType"); | |
goog.require("goog.array"); | |
goog.require("goog.asserts"); | |
goog.require("goog.debug.entryPointRegistry"); | |
goog.require("goog.events.BrowserEvent"); | |
goog.require("goog.events.BrowserFeature"); | |
goog.require("goog.events.Listenable"); | |
goog.require("goog.events.ListenerMap"); | |
goog.events.Key; | |
goog.events.ListenableType; | |
goog.events.listeners_ = {}; | |
goog.events.LISTENER_MAP_PROP_ = "closure_lm_" + (Math.random() * 1E6 | 0); | |
goog.events.onString_ = "on"; | |
goog.events.onStringMap_ = {}; | |
goog.events.CaptureSimulationMode = {OFF_AND_FAIL:0, OFF_AND_SILENT:1, ON:2}; | |
goog.define("goog.events.CAPTURE_SIMULATION_MODE", 2); | |
goog.events.listenerCountEstimate_ = 0; | |
goog.events.listen = function(src, type, listener, opt_capt, opt_handler) { | |
if (goog.isArray(type)) { | |
for (var i = 0;i < type.length;i++) { | |
goog.events.listen(src, type[i], listener, opt_capt, opt_handler); | |
} | |
return null; | |
} | |
listener = goog.events.wrapListener(listener); | |
if (goog.events.Listenable.isImplementedBy(src)) { | |
return src.listen((type), listener, opt_capt, opt_handler); | |
} else { | |
return goog.events.listen_((src), type, listener, false, opt_capt, opt_handler); | |
} | |
}; | |
goog.events.listen_ = function(src, type, listener, callOnce, opt_capt, opt_handler) { | |
if (!type) { | |
throw Error("Invalid event type"); | |
} | |
var capture = !!opt_capt; | |
if (capture && !goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) { | |
if (goog.events.CAPTURE_SIMULATION_MODE == goog.events.CaptureSimulationMode.OFF_AND_FAIL) { | |
goog.asserts.fail("Can not register capture listener in IE8-."); | |
return null; | |
} else { | |
if (goog.events.CAPTURE_SIMULATION_MODE == goog.events.CaptureSimulationMode.OFF_AND_SILENT) { | |
return null; | |
} | |
} | |
} | |
var listenerMap = goog.events.getListenerMap_(src); | |
if (!listenerMap) { | |
src[goog.events.LISTENER_MAP_PROP_] = listenerMap = new goog.events.ListenerMap(src); | |
} | |
var listenerObj = listenerMap.add(type, listener, callOnce, opt_capt, opt_handler); | |
if (listenerObj.proxy) { | |
return listenerObj; | |
} | |
var proxy = goog.events.getProxy(); | |
listenerObj.proxy = proxy; | |
proxy.src = src; | |
proxy.listener = listenerObj; | |
if (src.addEventListener) { | |
src.addEventListener(type, proxy, capture); | |
} else { | |
src.attachEvent(goog.events.getOnString_(type), proxy); | |
} | |
goog.events.listenerCountEstimate_++; | |
return listenerObj; | |
}; | |
goog.events.getProxy = function() { | |
var proxyCallbackFunction = goog.events.handleBrowserEvent_; | |
var f = goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT ? function(eventObject) { | |
return proxyCallbackFunction.call(f.src, f.listener, eventObject); | |
} : function(eventObject) { | |
var v = proxyCallbackFunction.call(f.src, f.listener, eventObject); | |
if (!v) { | |
return v; | |
} | |
}; | |
return f; | |
}; | |
goog.events.listenOnce = function(src, type, listener, opt_capt, opt_handler) { | |
if (goog.isArray(type)) { | |
for (var i = 0;i < type.length;i++) { | |
goog.events.listenOnce(src, type[i], listener, opt_capt, opt_handler); | |
} | |
return null; | |
} | |
listener = goog.events.wrapListener(listener); | |
if (goog.events.Listenable.isImplementedBy(src)) { | |
return src.listenOnce((type), listener, opt_capt, opt_handler); | |
} else { | |
return goog.events.listen_((src), type, listener, true, opt_capt, opt_handler); | |
} | |
}; | |
goog.events.listenWithWrapper = function(src, wrapper, listener, opt_capt, opt_handler) { | |
wrapper.listen(src, listener, opt_capt, opt_handler); | |
}; | |
goog.events.unlisten = function(src, type, listener, opt_capt, opt_handler) { | |
if (goog.isArray(type)) { | |
for (var i = 0;i < type.length;i++) { | |
goog.events.unlisten(src, type[i], listener, opt_capt, opt_handler); | |
} | |
return null; | |
} | |
listener = goog.events.wrapListener(listener); | |
if (goog.events.Listenable.isImplementedBy(src)) { | |
return src.unlisten((type), listener, opt_capt, opt_handler); | |
} | |
if (!src) { | |
return false; | |
} | |
var capture = !!opt_capt; | |
var listenerMap = goog.events.getListenerMap_((src)); | |
if (listenerMap) { | |
var listenerObj = listenerMap.getListener((type), listener, capture, opt_handler); | |
if (listenerObj) { | |
return goog.events.unlistenByKey(listenerObj); | |
} | |
} | |
return false; | |
}; | |
goog.events.unlistenByKey = function(key) { | |
if (goog.isNumber(key)) { | |
return false; | |
} | |
var listener = (key); | |
if (!listener || listener.removed) { | |
return false; | |
} | |
var src = listener.src; | |
if (goog.events.Listenable.isImplementedBy(src)) { | |
return src.unlistenByKey(listener); | |
} | |
var type = listener.type; | |
var proxy = listener.proxy; | |
if (src.removeEventListener) { | |
src.removeEventListener(type, proxy, listener.capture); | |
} else { | |
if (src.detachEvent) { | |
src.detachEvent(goog.events.getOnString_(type), proxy); | |
} | |
} | |
goog.events.listenerCountEstimate_--; | |
var listenerMap = goog.events.getListenerMap_((src)); | |
if (listenerMap) { | |
listenerMap.removeByKey(listener); | |
if (listenerMap.getTypeCount() == 0) { | |
listenerMap.src = null; | |
src[goog.events.LISTENER_MAP_PROP_] = null; | |
} | |
} else { | |
listener.markAsRemoved(); | |
} | |
return true; | |
}; | |
goog.events.unlistenWithWrapper = function(src, wrapper, listener, opt_capt, opt_handler) { | |
wrapper.unlisten(src, listener, opt_capt, opt_handler); | |
}; | |
goog.events.removeAll = function(opt_obj, opt_type) { | |
if (!opt_obj) { | |
return 0; | |
} | |
if (goog.events.Listenable.isImplementedBy(opt_obj)) { | |
return opt_obj.removeAllListeners(opt_type); | |
} | |
var listenerMap = goog.events.getListenerMap_((opt_obj)); | |
if (!listenerMap) { | |
return 0; | |
} | |
var count = 0; | |
for (var type in listenerMap.listeners) { | |
if (!opt_type || type == opt_type) { | |
var listeners = goog.array.clone(listenerMap.listeners[type]); | |
for (var i = 0;i < listeners.length;++i) { | |
if (goog.events.unlistenByKey(listeners[i])) { | |
++count; | |
} | |
} | |
} | |
} | |
return count; | |
}; | |
goog.events.removeAllNativeListeners = function() { | |
goog.events.listenerCountEstimate_ = 0; | |
return 0; | |
}; | |
goog.events.getListeners = function(obj, type, capture) { | |
if (goog.events.Listenable.isImplementedBy(obj)) { | |
return obj.getListeners(type, capture); | |
} else { | |
if (!obj) { | |
return[]; | |
} | |
var listenerMap = goog.events.getListenerMap_((obj)); | |
return listenerMap ? listenerMap.getListeners(type, capture) : []; | |
} | |
}; | |
goog.events.getListener = function(src, type, listener, opt_capt, opt_handler) { | |
type = (type); | |
listener = goog.events.wrapListener(listener); | |
var capture = !!opt_capt; | |
if (goog.events.Listenable.isImplementedBy(src)) { | |
return src.getListener(type, listener, capture, opt_handler); | |
} | |
if (!src) { | |
return null; | |
} | |
var listenerMap = goog.events.getListenerMap_((src)); | |
if (listenerMap) { | |
return listenerMap.getListener(type, listener, capture, opt_handler); | |
} | |
return null; | |
}; | |
goog.events.hasListener = function(obj, opt_type, opt_capture) { | |
if (goog.events.Listenable.isImplementedBy(obj)) { | |
return obj.hasListener(opt_type, opt_capture); | |
} | |
var listenerMap = goog.events.getListenerMap_((obj)); | |
return!!listenerMap && listenerMap.hasListener(opt_type, opt_capture); | |
}; | |
goog.events.expose = function(e) { | |
var str = []; | |
for (var key in e) { | |
if (e[key] && e[key].id) { | |
str.push(key + " = " + e[key] + " (" + e[key].id + ")"); | |
} else { | |
str.push(key + " = " + e[key]); | |
} | |
} | |
return str.join("\n"); | |
}; | |
goog.events.getOnString_ = function(type) { | |
if (type in goog.events.onStringMap_) { | |
return goog.events.onStringMap_[type]; | |
} | |
return goog.events.onStringMap_[type] = goog.events.onString_ + type; | |
}; | |
goog.events.fireListeners = function(obj, type, capture, eventObject) { | |
if (goog.events.Listenable.isImplementedBy(obj)) { | |
return obj.fireListeners(type, capture, eventObject); | |
} | |
return goog.events.fireListeners_(obj, type, capture, eventObject); | |
}; | |
goog.events.fireListeners_ = function(obj, type, capture, eventObject) { | |
var retval = 1; | |
var listenerMap = goog.events.getListenerMap_((obj)); | |
if (listenerMap) { | |
var listenerArray = listenerMap.listeners[type]; | |
if (listenerArray) { | |
listenerArray = goog.array.clone(listenerArray); | |
for (var i = 0;i < listenerArray.length;i++) { | |
var listener = listenerArray[i]; | |
if (listener && (listener.capture == capture && !listener.removed)) { | |
retval &= goog.events.fireListener(listener, eventObject) !== false; | |
} | |
} | |
} | |
} | |
return Boolean(retval); | |
}; | |
goog.events.fireListener = function(listener, eventObject) { | |
var listenerFn = listener.listener; | |
var listenerHandler = listener.handler || listener.src; | |
if (listener.callOnce) { | |
goog.events.unlistenByKey(listener); | |
} | |
return listenerFn.call(listenerHandler, eventObject); | |
}; | |
goog.events.getTotalListenerCount = function() { | |
return goog.events.listenerCountEstimate_; | |
}; | |
goog.events.dispatchEvent = function(src, e) { | |
goog.asserts.assert(goog.events.Listenable.isImplementedBy(src), "Can not use goog.events.dispatchEvent with " + "non-goog.events.Listenable instance."); | |
return src.dispatchEvent(e); | |
}; | |
goog.events.protectBrowserEventEntryPoint = function(errorHandler) { | |
goog.events.handleBrowserEvent_ = errorHandler.protectEntryPoint(goog.events.handleBrowserEvent_); | |
}; | |
goog.events.handleBrowserEvent_ = function(listener, opt_evt) { | |
if (listener.removed) { | |
return true; | |
} | |
if (!goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) { | |
var ieEvent = opt_evt || (goog.getObjectByName("window.event")); | |
var evt = new goog.events.BrowserEvent(ieEvent, this); | |
var retval = true; | |
if (goog.events.CAPTURE_SIMULATION_MODE == goog.events.CaptureSimulationMode.ON) { | |
if (!goog.events.isMarkedIeEvent_(ieEvent)) { | |
goog.events.markIeEvent_(ieEvent); | |
var ancestors = []; | |
for (var parent = evt.currentTarget;parent;parent = parent.parentNode) { | |
ancestors.push(parent); | |
} | |
var type = listener.type; | |
for (var i = ancestors.length - 1;!evt.propagationStopped_ && i >= 0;i--) { | |
evt.currentTarget = ancestors[i]; | |
retval &= goog.events.fireListeners_(ancestors[i], type, true, evt); | |
} | |
for (var i = 0;!evt.propagationStopped_ && i < ancestors.length;i++) { | |
evt.currentTarget = ancestors[i]; | |
retval &= goog.events.fireListeners_(ancestors[i], type, false, evt); | |
} | |
} | |
} else { | |
retval = goog.events.fireListener(listener, evt); | |
} | |
return retval; | |
} | |
return goog.events.fireListener(listener, new goog.events.BrowserEvent(opt_evt, this)); | |
}; | |
goog.events.markIeEvent_ = function(e) { | |
var useReturnValue = false; | |
if (e.keyCode == 0) { | |
try { | |
e.keyCode = -1; | |
return; | |
} catch (ex) { | |
useReturnValue = true; | |
} | |
} | |
if (useReturnValue || (e.returnValue) == undefined) { | |
e.returnValue = true; | |
} | |
}; | |
goog.events.isMarkedIeEvent_ = function(e) { | |
return e.keyCode < 0 || e.returnValue != undefined; | |
}; | |
goog.events.uniqueIdCounter_ = 0; | |
goog.events.getUniqueId = function(identifier) { | |
return identifier + "_" + goog.events.uniqueIdCounter_++; | |
}; | |
goog.events.getListenerMap_ = function(src) { | |
var listenerMap = src[goog.events.LISTENER_MAP_PROP_]; | |
return listenerMap instanceof goog.events.ListenerMap ? listenerMap : null; | |
}; | |
goog.events.LISTENER_WRAPPER_PROP_ = "__closure_events_fn_" + (Math.random() * 1E9 >>> 0); | |
goog.events.wrapListener = function(listener) { | |
goog.asserts.assert(listener, "Listener can not be null."); | |
if (goog.isFunction(listener)) { | |
return listener; | |
} | |
goog.asserts.assert(listener.handleEvent, "An object listener must have handleEvent method."); | |
return listener[goog.events.LISTENER_WRAPPER_PROP_] || (listener[goog.events.LISTENER_WRAPPER_PROP_] = function(e) { | |
return listener.handleEvent(e); | |
}); | |
}; | |
goog.debug.entryPointRegistry.register(function(transformer) { | |
goog.events.handleBrowserEvent_ = transformer(goog.events.handleBrowserEvent_); | |
}); | |
goog.provide("goog.uri.utils"); | |
goog.provide("goog.uri.utils.ComponentIndex"); | |
goog.provide("goog.uri.utils.QueryArray"); | |
goog.provide("goog.uri.utils.QueryValue"); | |
goog.provide("goog.uri.utils.StandardQueryParam"); | |
goog.require("goog.asserts"); | |
goog.require("goog.string"); | |
goog.require("goog.userAgent"); | |
goog.uri.utils.CharCode_ = {AMPERSAND:38, EQUAL:61, HASH:35, QUESTION:63}; | |
goog.uri.utils.buildFromEncodedParts = function(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) { | |
var out = ""; | |
if (opt_scheme) { | |
out += opt_scheme + ":"; | |
} | |
if (opt_domain) { | |
out += "//"; | |
if (opt_userInfo) { | |
out += opt_userInfo + "@"; | |
} | |
out += opt_domain; | |
if (opt_port) { | |
out += ":" + opt_port; | |
} | |
} | |
if (opt_path) { | |
out += opt_path; | |
} | |
if (opt_queryData) { | |
out += "?" + opt_queryData; | |
} | |
if (opt_fragment) { | |
out += "#" + opt_fragment; | |
} | |
return out; | |
}; | |
goog.uri.utils.splitRe_ = new RegExp("^" + "(?:" + "([^:/?#.]+)" + ":)?" + "(?://" + "(?:([^/?#]*)@)?" + "([^/#?]*?)" + "(?::([0-9]+))?" + "(?=[/#?]|$)" + ")?" + "([^?#]+)?" + "(?:\\?([^#]*))?" + "(?:#(.*))?" + "$"); | |
goog.uri.utils.ComponentIndex = {SCHEME:1, USER_INFO:2, DOMAIN:3, PORT:4, PATH:5, QUERY_DATA:6, FRAGMENT:7}; | |
goog.uri.utils.split = function(uri) { | |
goog.uri.utils.phishingProtection_(); | |
return(uri.match(goog.uri.utils.splitRe_)); | |
}; | |
goog.uri.utils.needsPhishingProtection_ = goog.userAgent.WEBKIT; | |
goog.uri.utils.phishingProtection_ = function() { | |
if (goog.uri.utils.needsPhishingProtection_) { | |
goog.uri.utils.needsPhishingProtection_ = false; | |
var location = goog.global["location"]; | |
if (location) { | |
var href = location["href"]; | |
if (href) { | |
var domain = goog.uri.utils.getDomain(href); | |
if (domain && domain != location["hostname"]) { | |
goog.uri.utils.needsPhishingProtection_ = true; | |
throw Error(); | |
} | |
} | |
} | |
} | |
}; | |
goog.uri.utils.decodeIfPossible_ = function(uri) { | |
return uri && decodeURIComponent(uri); | |
}; | |
goog.uri.utils.getComponentByIndex_ = function(componentIndex, uri) { | |
return goog.uri.utils.split(uri)[componentIndex] || null; | |
}; | |
goog.uri.utils.getScheme = function(uri) { | |
return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.SCHEME, uri); | |
}; | |
goog.uri.utils.getEffectiveScheme = function(uri) { | |
var scheme = goog.uri.utils.getScheme(uri); | |
if (!scheme && self.location) { | |
var protocol = self.location.protocol; | |
scheme = protocol.substr(0, protocol.length - 1); | |
} | |
return scheme ? scheme.toLowerCase() : ""; | |
}; | |
goog.uri.utils.getUserInfoEncoded = function(uri) { | |
return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.USER_INFO, uri); | |
}; | |
goog.uri.utils.getUserInfo = function(uri) { | |
return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getUserInfoEncoded(uri)); | |
}; | |
goog.uri.utils.getDomainEncoded = function(uri) { | |
return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.DOMAIN, uri); | |
}; | |
goog.uri.utils.getDomain = function(uri) { | |
return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getDomainEncoded(uri)); | |
}; | |
goog.uri.utils.getPort = function(uri) { | |
return Number(goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.PORT, uri)) || null; | |
}; | |
goog.uri.utils.getPathEncoded = function(uri) { | |
return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.PATH, uri); | |
}; | |
goog.uri.utils.getPath = function(uri) { | |
return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getPathEncoded(uri)); | |
}; | |
goog.uri.utils.getQueryData = function(uri) { | |
return goog.uri.utils.getComponentByIndex_(goog.uri.utils.ComponentIndex.QUERY_DATA, uri); | |
}; | |
goog.uri.utils.getFragmentEncoded = function(uri) { | |
var hashIndex = uri.indexOf("#"); | |
return hashIndex < 0 ? null : uri.substr(hashIndex + 1); | |
}; | |
goog.uri.utils.setFragmentEncoded = function(uri, fragment) { | |
return goog.uri.utils.removeFragment(uri) + (fragment ? "#" + fragment : ""); | |
}; | |
goog.uri.utils.getFragment = function(uri) { | |
return goog.uri.utils.decodeIfPossible_(goog.uri.utils.getFragmentEncoded(uri)); | |
}; | |
goog.uri.utils.getHost = function(uri) { | |
var pieces = goog.uri.utils.split(uri); | |
return goog.uri.utils.buildFromEncodedParts(pieces[goog.uri.utils.ComponentIndex.SCHEME], pieces[goog.uri.utils.ComponentIndex.USER_INFO], pieces[goog.uri.utils.ComponentIndex.DOMAIN], pieces[goog.uri.utils.ComponentIndex.PORT]); | |
}; | |
goog.uri.utils.getPathAndAfter = function(uri) { | |
var pieces = goog.uri.utils.split(uri); | |
return goog.uri.utils.buildFromEncodedParts(null, null, null, null, pieces[goog.uri.utils.ComponentIndex.PATH], pieces[goog.uri.utils.ComponentIndex.QUERY_DATA], pieces[goog.uri.utils.ComponentIndex.FRAGMENT]); | |
}; | |
goog.uri.utils.removeFragment = function(uri) { | |
var hashIndex = uri.indexOf("#"); | |
return hashIndex < 0 ? uri : uri.substr(0, hashIndex); | |
}; | |
goog.uri.utils.haveSameDomain = function(uri1, uri2) { | |
var pieces1 = goog.uri.utils.split(uri1); | |
var pieces2 = goog.uri.utils.split(uri2); | |
return pieces1[goog.uri.utils.ComponentIndex.DOMAIN] == pieces2[goog.uri.utils.ComponentIndex.DOMAIN] && (pieces1[goog.uri.utils.ComponentIndex.SCHEME] == pieces2[goog.uri.utils.ComponentIndex.SCHEME] && pieces1[goog.uri.utils.ComponentIndex.PORT] == pieces2[goog.uri.utils.ComponentIndex.PORT]); | |
}; | |
goog.uri.utils.assertNoFragmentsOrQueries_ = function(uri) { | |
if (goog.DEBUG && (uri.indexOf("#") >= 0 || uri.indexOf("?") >= 0)) { | |
throw Error("goog.uri.utils: Fragment or query identifiers are not " + "supported: [" + uri + "]"); | |
} | |
}; | |
goog.uri.utils.QueryValue; | |
goog.uri.utils.QueryArray; | |
goog.uri.utils.appendQueryData_ = function(buffer) { | |
if (buffer[1]) { | |
var baseUri = (buffer[0]); | |
var hashIndex = baseUri.indexOf("#"); | |
if (hashIndex >= 0) { | |
buffer.push(baseUri.substr(hashIndex)); | |
buffer[0] = baseUri = baseUri.substr(0, hashIndex); | |
} | |
var questionIndex = baseUri.indexOf("?"); | |
if (questionIndex < 0) { | |
buffer[1] = "?"; | |
} else { | |
if (questionIndex == baseUri.length - 1) { | |
buffer[1] = undefined; | |
} | |
} | |
} | |
return buffer.join(""); | |
}; | |
goog.uri.utils.appendKeyValuePairs_ = function(key, value, pairs) { | |
if (goog.isArray(value)) { | |
goog.asserts.assertArray(value); | |
for (var j = 0;j < value.length;j++) { | |
goog.uri.utils.appendKeyValuePairs_(key, String(value[j]), pairs); | |
} | |
} else { | |
if (value != null) { | |
pairs.push("&", key, value === "" ? "" : "=", goog.string.urlEncode(value)); | |
} | |
} | |
}; | |
goog.uri.utils.buildQueryDataBuffer_ = function(buffer, keysAndValues, opt_startIndex) { | |
goog.asserts.assert(Math.max(keysAndValues.length - (opt_startIndex || 0), 0) % 2 == 0, "goog.uri.utils: Key/value lists must be even in length."); | |
for (var i = opt_startIndex || 0;i < keysAndValues.length;i += 2) { | |
goog.uri.utils.appendKeyValuePairs_(keysAndValues[i], keysAndValues[i + 1], buffer); | |
} | |
return buffer; | |
}; | |
goog.uri.utils.buildQueryData = function(keysAndValues, opt_startIndex) { | |
var buffer = goog.uri.utils.buildQueryDataBuffer_([], keysAndValues, opt_startIndex); | |
buffer[0] = ""; | |
return buffer.join(""); | |
}; | |
goog.uri.utils.buildQueryDataBufferFromMap_ = function(buffer, map) { | |
for (var key in map) { | |
goog.uri.utils.appendKeyValuePairs_(key, map[key], buffer); | |
} | |
return buffer; | |
}; | |
goog.uri.utils.buildQueryDataFromMap = function(map) { | |
var buffer = goog.uri.utils.buildQueryDataBufferFromMap_([], map); | |
buffer[0] = ""; | |
return buffer.join(""); | |
}; | |
goog.uri.utils.appendParams = function(uri, var_args) { | |
return goog.uri.utils.appendQueryData_(arguments.length == 2 ? goog.uri.utils.buildQueryDataBuffer_([uri], arguments[1], 0) : goog.uri.utils.buildQueryDataBuffer_([uri], arguments, 1)); | |
}; | |
goog.uri.utils.appendParamsFromMap = function(uri, map) { | |
return goog.uri.utils.appendQueryData_(goog.uri.utils.buildQueryDataBufferFromMap_([uri], map)); | |
}; | |
goog.uri.utils.appendParam = function(uri, key, opt_value) { | |
var paramArr = [uri, "&", key]; | |
if (goog.isDefAndNotNull(opt_value)) { | |
paramArr.push("=", goog.string.urlEncode(opt_value)); | |
} | |
return goog.uri.utils.appendQueryData_(paramArr); | |
}; | |
goog.uri.utils.findParam_ = function(uri, startIndex, keyEncoded, hashOrEndIndex) { | |
var index = startIndex; | |
var keyLength = keyEncoded.length; | |
while ((index = uri.indexOf(keyEncoded, index)) >= 0 && index < hashOrEndIndex) { | |
var precedingChar = uri.charCodeAt(index - 1); | |
if (precedingChar == goog.uri.utils.CharCode_.AMPERSAND || precedingChar == goog.uri.utils.CharCode_.QUESTION) { | |
var followingChar = uri.charCodeAt(index + keyLength); | |
if (!followingChar || (followingChar == goog.uri.utils.CharCode_.EQUAL || (followingChar == goog.uri.utils.CharCode_.AMPERSAND || followingChar == goog.uri.utils.CharCode_.HASH))) { | |
return index; | |
} | |
} | |
index += keyLength + 1; | |
} | |
return-1; | |
}; | |
goog.uri.utils.hashOrEndRe_ = /#|$/; | |
goog.uri.utils.hasParam = function(uri, keyEncoded) { | |
return goog.uri.utils.findParam_(uri, 0, keyEncoded, uri.search(goog.uri.utils.hashOrEndRe_)) >= 0; | |
}; | |
goog.uri.utils.getParamValue = function(uri, keyEncoded) { | |
var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_); | |
var foundIndex = goog.uri.utils.findParam_(uri, 0, keyEncoded, hashOrEndIndex); | |
if (foundIndex < 0) { | |
return null; | |
} else { | |
var endPosition = uri.indexOf("&", foundIndex); | |
if (endPosition < 0 || endPosition > hashOrEndIndex) { | |
endPosition = hashOrEndIndex; | |
} | |
foundIndex += keyEncoded.length + 1; | |
return goog.string.urlDecode(uri.substr(foundIndex, endPosition - foundIndex)); | |
} | |
}; | |
goog.uri.utils.getParamValues = function(uri, keyEncoded) { | |
var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_); | |
var position = 0; | |
var foundIndex; | |
var result = []; | |
while ((foundIndex = goog.uri.utils.findParam_(uri, position, keyEncoded, hashOrEndIndex)) >= 0) { | |
position = uri.indexOf("&", foundIndex); | |
if (position < 0 || position > hashOrEndIndex) { | |
position = hashOrEndIndex; | |
} | |
foundIndex += keyEncoded.length + 1; | |
result.push(goog.string.urlDecode(uri.substr(foundIndex, position - foundIndex))); | |
} | |
return result; | |
}; | |
goog.uri.utils.trailingQueryPunctuationRe_ = /[?&]($|#)/; | |
goog.uri.utils.removeParam = function(uri, keyEncoded) { | |
var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_); | |
var position = 0; | |
var foundIndex; | |
var buffer = []; | |
while ((foundIndex = goog.uri.utils.findParam_(uri, position, keyEncoded, hashOrEndIndex)) >= 0) { | |
buffer.push(uri.substring(position, foundIndex)); | |
position = Math.min(uri.indexOf("&", foundIndex) + 1 || hashOrEndIndex, hashOrEndIndex); | |
} | |
buffer.push(uri.substr(position)); | |
return buffer.join("").replace(goog.uri.utils.trailingQueryPunctuationRe_, "$1"); | |
}; | |
goog.uri.utils.setParam = function(uri, keyEncoded, value) { | |
return goog.uri.utils.appendParam(goog.uri.utils.removeParam(uri, keyEncoded), keyEncoded, value); | |
}; | |
goog.uri.utils.appendPath = function(baseUri, path) { | |
goog.uri.utils.assertNoFragmentsOrQueries_(baseUri); | |
if (goog.string.endsWith(baseUri, "/")) { | |
baseUri = baseUri.substr(0, baseUri.length - 1); | |
} | |
if (goog.string.startsWith(path, "/")) { | |
path = path.substr(1); | |
} | |
return goog.string.buildString(baseUri, "/", path); | |
}; | |
goog.uri.utils.setPath = function(uri, path) { | |
if (!goog.string.startsWith(path, "/")) { | |
path = "/" + path; | |
} | |
var parts = goog.uri.utils.split(uri); | |
return goog.uri.utils.buildFromEncodedParts(parts[goog.uri.utils.ComponentIndex.SCHEME], parts[goog.uri.utils.ComponentIndex.USER_INFO], parts[goog.uri.utils.ComponentIndex.DOMAIN], parts[goog.uri.utils.ComponentIndex.PORT], path, parts[goog.uri.utils.ComponentIndex.QUERY_DATA], parts[goog.uri.utils.ComponentIndex.FRAGMENT]); | |
}; | |
goog.uri.utils.StandardQueryParam = {RANDOM:"zx"}; | |
goog.uri.utils.makeUnique = function(uri) { | |
return goog.uri.utils.setParam(uri, goog.uri.utils.StandardQueryParam.RANDOM, goog.string.getRandomString()); | |
}; | |
goog.provide("goog.events.EventTarget"); | |
goog.require("goog.Disposable"); | |
goog.require("goog.array"); | |
goog.require("goog.asserts"); | |
goog.require("goog.events"); | |
goog.require("goog.events.Event"); | |
goog.require("goog.events.Listenable"); | |
goog.require("goog.events.ListenerMap"); | |
goog.require("goog.object"); | |
goog.events.EventTarget = function() { | |
goog.Disposable.call(this); | |
this.eventTargetListeners_ = new goog.events.ListenerMap(this); | |
this.actualEventTarget_ = this; | |
}; | |
goog.inherits(goog.events.EventTarget, goog.Disposable); | |
goog.events.Listenable.addImplementation(goog.events.EventTarget); | |
goog.events.EventTarget.MAX_ANCESTORS_ = 1E3; | |
goog.events.EventTarget.prototype.parentEventTarget_ = null; | |
goog.events.EventTarget.prototype.getParentEventTarget = function() { | |
return this.parentEventTarget_; | |
}; | |
goog.events.EventTarget.prototype.setParentEventTarget = function(parent) { | |
this.parentEventTarget_ = parent; | |
}; | |
goog.events.EventTarget.prototype.addEventListener = function(type, handler, opt_capture, opt_handlerScope) { | |
goog.events.listen(this, type, handler, opt_capture, opt_handlerScope); | |
}; | |
goog.events.EventTarget.prototype.removeEventListener = function(type, handler, opt_capture, opt_handlerScope) { | |
goog.events.unlisten(this, type, handler, opt_capture, opt_handlerScope); | |
}; | |
goog.events.EventTarget.prototype.dispatchEvent = function(e) { | |
this.assertInitialized_(); | |
var ancestorsTree, ancestor = this.getParentEventTarget(); | |
if (ancestor) { | |
ancestorsTree = []; | |
var ancestorCount = 1; | |
for (;ancestor;ancestor = ancestor.getParentEventTarget()) { | |
ancestorsTree.push(ancestor); | |
goog.asserts.assert(++ancestorCount < goog.events.EventTarget.MAX_ANCESTORS_, "infinite loop"); | |
} | |
} | |
return goog.events.EventTarget.dispatchEventInternal_(this.actualEventTarget_, e, ancestorsTree); | |
}; | |
goog.events.EventTarget.prototype.disposeInternal = function() { | |
goog.events.EventTarget.superClass_.disposeInternal.call(this); | |
this.removeAllListeners(); | |
this.parentEventTarget_ = null; | |
}; | |
goog.events.EventTarget.prototype.listen = function(type, listener, opt_useCapture, opt_listenerScope) { | |
this.assertInitialized_(); | |
return this.eventTargetListeners_.add(String(type), listener, false, opt_useCapture, opt_listenerScope); | |
}; | |
goog.events.EventTarget.prototype.listenOnce = function(type, listener, opt_useCapture, opt_listenerScope) { | |
return this.eventTargetListeners_.add(String(type), listener, true, opt_useCapture, opt_listenerScope); | |
}; | |
goog.events.EventTarget.prototype.unlisten = function(type, listener, opt_useCapture, opt_listenerScope) { | |
return this.eventTargetListeners_.remove(String(type), listener, opt_useCapture, opt_listenerScope); | |
}; | |
goog.events.EventTarget.prototype.unlistenByKey = function(key) { | |
return this.eventTargetListeners_.removeByKey(key); | |
}; | |
goog.events.EventTarget.prototype.removeAllListeners = function(opt_type) { | |
if (!this.eventTargetListeners_) { | |
return 0; | |
} | |
return this.eventTargetListeners_.removeAll(opt_type); | |
}; | |
goog.events.EventTarget.prototype.fireListeners = function(type, capture, eventObject) { | |
var listenerArray = this.eventTargetListeners_.listeners[String(type)]; | |
if (!listenerArray) { | |
return true; | |
} | |
listenerArray = goog.array.clone(listenerArray); | |
var rv = true; | |
for (var i = 0;i < listenerArray.length;++i) { | |
var listener = listenerArray[i]; | |
if (listener && (!listener.removed && listener.capture == capture)) { | |
var listenerFn = listener.listener; | |
var listenerHandler = listener.handler || listener.src; | |
if (listener.callOnce) { | |
this.unlistenByKey(listener); | |
} | |
rv = listenerFn.call(listenerHandler, eventObject) !== false && rv; | |
} | |
} | |
return rv && eventObject.returnValue_ != false; | |
}; | |
goog.events.EventTarget.prototype.getListeners = function(type, capture) { | |
return this.eventTargetListeners_.getListeners(String(type), capture); | |
}; | |
goog.events.EventTarget.prototype.getListener = function(type, listener, capture, opt_listenerScope) { | |
return this.eventTargetListeners_.getListener(String(type), listener, capture, opt_listenerScope); | |
}; | |
goog.events.EventTarget.prototype.hasListener = function(opt_type, opt_capture) { | |
var id = goog.isDef(opt_type) ? String(opt_type) : undefined; | |
return this.eventTargetListeners_.hasListener(id, opt_capture); | |
}; | |
goog.events.EventTarget.prototype.setTargetForTesting = function(target) { | |
this.actualEventTarget_ = target; | |
}; | |
goog.events.EventTarget.prototype.assertInitialized_ = function() { | |
goog.asserts.assert(this.eventTargetListeners_, "Event target is not initialized. Did you call the superclass " + "(goog.events.EventTarget) constructor?"); | |
}; | |
goog.events.EventTarget.dispatchEventInternal_ = function(target, e, opt_ancestorsTree) { | |
var type = e.type || (e); | |
if (goog.isString(e)) { | |
e = new goog.events.Event(e, target); | |
} else { | |
if (!(e instanceof goog.events.Event)) { | |
var oldEvent = e; | |
e = new goog.events.Event(type, target); | |
goog.object.extend(e, oldEvent); | |
} else { | |
e.target = e.target || target; | |
} | |
} | |
var rv = true, currentTarget; | |
if (opt_ancestorsTree) { | |
for (var i = opt_ancestorsTree.length - 1;!e.propagationStopped_ && i >= 0;i--) { | |
currentTarget = e.currentTarget = opt_ancestorsTree[i]; | |
rv = currentTarget.fireListeners(type, true, e) && rv; | |
} | |
} | |
if (!e.propagationStopped_) { | |
currentTarget = e.currentTarget = target; | |
rv = currentTarget.fireListeners(type, true, e) && rv; | |
if (!e.propagationStopped_) { | |
rv = currentTarget.fireListeners(type, false, e) && rv; | |
} | |
} | |
if (opt_ancestorsTree) { | |
for (i = 0;!e.propagationStopped_ && i < opt_ancestorsTree.length;i++) { | |
currentTarget = e.currentTarget = opt_ancestorsTree[i]; | |
rv = currentTarget.fireListeners(type, false, e) && rv; | |
} | |
} | |
return rv; | |
}; | |
goog.provide("goog.Timer"); | |
goog.require("goog.events.EventTarget"); | |
goog.Timer = function(opt_interval, opt_timerObject) { | |
goog.events.EventTarget.call(this); | |
this.interval_ = opt_interval || 1; | |
this.timerObject_ = opt_timerObject || goog.Timer.defaultTimerObject; | |
this.boundTick_ = goog.bind(this.tick_, this); | |
this.last_ = goog.now(); | |
}; | |
goog.inherits(goog.Timer, goog.events.EventTarget); | |
goog.Timer.MAX_TIMEOUT_ = 2147483647; | |
goog.Timer.prototype.enabled = false; | |
goog.Timer.defaultTimerObject = goog.global; | |
goog.Timer.intervalScale = 0.8; | |
goog.Timer.prototype.timer_ = null; | |
goog.Timer.prototype.getInterval = function() { | |
return this.interval_; | |
}; | |
goog.Timer.prototype.setInterval = function(interval) { | |
this.interval_ = interval; | |
if (this.timer_ && this.enabled) { | |
this.stop(); | |
this.start(); | |
} else { | |
if (this.timer_) { | |
this.stop(); | |
} | |
} | |
}; | |
goog.Timer.prototype.tick_ = function() { | |
if (this.enabled) { | |
var elapsed = goog.now() - this.last_; | |
if (elapsed > 0 && elapsed < this.interval_ * goog.Timer.intervalScale) { | |
this.timer_ = this.timerObject_.setTimeout(this.boundTick_, this.interval_ - elapsed); | |
return; | |
} | |
if (this.timer_) { | |
this.timerObject_.clearTimeout(this.timer_); | |
this.timer_ = null; | |
} | |
this.dispatchTick(); | |
if (this.enabled) { | |
this.timer_ = this.timerObject_.setTimeout(this.boundTick_, this.interval_); | |
this.last_ = goog.now(); | |
} | |
} | |
}; | |
goog.Timer.prototype.dispatchTick = function() { | |
this.dispatchEvent(goog.Timer.TICK); | |
}; | |
goog.Timer.prototype.start = function() { | |
this.enabled = true; | |
if (!this.timer_) { | |
this.timer_ = this.timerObject_.setTimeout(this.boundTick_, this.interval_); | |
this.last_ = goog.now(); | |
} | |
}; | |
goog.Timer.prototype.stop = function() { | |
this.enabled = false; | |
if (this.timer_) { | |
this.timerObject_.clearTimeout(this.timer_); | |
this.timer_ = null; | |
} | |
}; | |
goog.Timer.prototype.disposeInternal = function() { | |
goog.Timer.superClass_.disposeInternal.call(this); | |
this.stop(); | |
delete this.timerObject_; | |
}; | |
goog.Timer.TICK = "tick"; | |
goog.Timer.callOnce = function(listener, opt_delay, opt_handler) { | |
if (goog.isFunction(listener)) { | |
if (opt_handler) { | |
listener = goog.bind(listener, opt_handler); | |
} | |
} else { | |
if (listener && typeof listener.handleEvent == "function") { | |
listener = goog.bind(listener.handleEvent, listener); | |
} else { | |
throw Error("Invalid listener argument"); | |
} | |
} | |
if (opt_delay > goog.Timer.MAX_TIMEOUT_) { | |
return-1; | |
} else { | |
return goog.Timer.defaultTimerObject.setTimeout(listener, opt_delay || 0); | |
} | |
}; | |
goog.Timer.clear = function(timerId) { | |
goog.Timer.defaultTimerObject.clearTimeout(timerId); | |
}; | |
goog.provide("goog.structs"); | |
goog.require("goog.array"); | |
goog.require("goog.object"); | |
goog.structs.getCount = function(col) { | |
if (typeof col.getCount == "function") { | |
return col.getCount(); | |
} | |
if (goog.isArrayLike(col) || goog.isString(col)) { | |
return col.length; | |
} | |
return goog.object.getCount(col); | |
}; | |
goog.structs.getValues = function(col) { | |
if (typeof col.getValues == "function") { | |
return col.getValues(); | |
} | |
if (goog.isString(col)) { | |
return col.split(""); | |
} | |
if (goog.isArrayLike(col)) { | |
var rv = []; | |
var l = col.length; | |
for (var i = 0;i < l;i++) { | |
rv.push(col[i]); | |
} | |
return rv; | |
} | |
return goog.object.getValues(col); | |
}; | |
goog.structs.getKeys = function(col) { | |
if (typeof col.getKeys == "function") { | |
return col.getKeys(); | |
} | |
if (typeof col.getValues == "function") { | |
return undefined; | |
} | |
if (goog.isArrayLike(col) || goog.isString(col)) { | |
var rv = []; | |
var l = col.length; | |
for (var i = 0;i < l;i++) { | |
rv.push(i); | |
} | |
return rv; | |
} | |
return goog.object.getKeys(col); | |
}; | |
goog.structs.contains = function(col, val) { | |
if (typeof col.contains == "function") { | |
return col.contains(val); | |
} | |
if (typeof col.containsValue == "function") { | |
return col.containsValue(val); | |
} | |
if (goog.isArrayLike(col) || goog.isString(col)) { | |
return goog.array.contains((col), val); | |
} | |
return goog.object.containsValue(col, val); | |
}; | |
goog.structs.isEmpty = function(col) { | |
if (typeof col.isEmpty == "function") { | |
return col.isEmpty(); | |
} | |
if (goog.isArrayLike(col) || goog.isString(col)) { | |
return goog.array.isEmpty((col)); | |
} | |
return goog.object.isEmpty(col); | |
}; | |
goog.structs.clear = function(col) { | |
if (typeof col.clear == "function") { | |
col.clear(); | |
} else { | |
if (goog.isArrayLike(col)) { | |
goog.array.clear((col)); | |
} else { | |
goog.object.clear(col); | |
} | |
} | |
}; | |
goog.structs.forEach = function(col, f, opt_obj) { | |
if (typeof col.forEach == "function") { | |
col.forEach(f, opt_obj); | |
} else { | |
if (goog.isArrayLike(col) || goog.isString(col)) { | |
goog.array.forEach((col), f, opt_obj); | |
} else { | |
var keys = goog.structs.getKeys(col); | |
var values = goog.structs.getValues(col); | |
var l = values.length; | |
for (var i = 0;i < l;i++) { | |
f.call(opt_obj, values[i], keys && keys[i], col); | |
} | |
} | |
} | |
}; | |
goog.structs.filter = function(col, f, opt_obj) { | |
if (typeof col.filter == "function") { | |
return col.filter(f, opt_obj); | |
} | |
if (goog.isArrayLike(col) || goog.isString(col)) { | |
return goog.array.filter((col), f, opt_obj); | |
} | |
var rv; | |
var keys = goog.structs.getKeys(col); | |
var values = goog.structs.getValues(col); | |
var l = values.length; | |
if (keys) { | |
rv = {}; | |
for (var i = 0;i < l;i++) { | |
if (f.call(opt_obj, values[i], keys[i], col)) { | |
rv[keys[i]] = values[i]; | |
} | |
} | |
} else { | |
rv = []; | |
for (var i = 0;i < l;i++) { | |
if (f.call(opt_obj, values[i], undefined, col)) { | |
rv.push(values[i]); | |
} | |
} | |
} | |
return rv; | |
}; | |
goog.structs.map = function(col, f, opt_obj) { | |
if (typeof col.map == "function") { | |
return col.map(f, opt_obj); | |
} | |
if (goog.isArrayLike(col) || goog.isString(col)) { | |
return goog.array.map((col), f, opt_obj); | |
} | |
var rv; | |
var keys = goog.structs.getKeys(col); | |
var values = goog.structs.getValues(col); | |
var l = values.length; | |
if (keys) { | |
rv = {}; | |
for (var i = 0;i < l;i++) { | |
rv[keys[i]] = f.call(opt_obj, values[i], keys[i], col); | |
} | |
} else { | |
rv = []; | |
for (var i = 0;i < l;i++) { | |
rv[i] = f.call(opt_obj, values[i], undefined, col); | |
} | |
} | |
return rv; | |
}; | |
goog.structs.some = function(col, f, opt_obj) { | |
if (typeof col.some == "function") { | |
return col.some(f, opt_obj); | |
} | |
if (goog.isArrayLike(col) || goog.isString(col)) { | |
return goog.array.some((col), f, opt_obj); | |
} | |
var keys = goog.structs.getKeys(col); | |
var values = goog.structs.getValues(col); | |
var l = values.length; | |
for (var i = 0;i < l;i++) { | |
if (f.call(opt_obj, values[i], keys && keys[i], col)) { | |
return true; | |
} | |
} | |
return false; | |
}; | |
goog.structs.every = function(col, f, opt_obj) { | |
if (typeof col.every == "function") { | |
return col.every(f, opt_obj); | |
} | |
if (goog.isArrayLike(col) || goog.isString(col)) { | |
return goog.array.every((col), f, opt_obj); | |
} | |
var keys = goog.structs.getKeys(col); | |
var values = goog.structs.getValues(col); | |
var l = values.length; | |
for (var i = 0;i < l;i++) { | |
if (!f.call(opt_obj, values[i], keys && keys[i], col)) { | |
return false; | |
} | |
} | |
return true; | |
}; | |
goog.provide("goog.net.ErrorCode"); | |
goog.net.ErrorCode = {NO_ERROR:0, ACCESS_DENIED:1, FILE_NOT_FOUND:2, FF_SILENT_ERROR:3, CUSTOM_ERROR:4, EXCEPTION:5, HTTP_ERROR:6, ABORT:7, TIMEOUT:8, OFFLINE:9}; | |
goog.net.ErrorCode.getDebugMessage = function(errorCode) { | |
switch(errorCode) { | |
case goog.net.ErrorCode.NO_ERROR: | |
return "No Error"; | |
case goog.net.ErrorCode.ACCESS_DENIED: | |
return "Access denied to content document"; | |
case goog.net.ErrorCode.FILE_NOT_FOUND: | |
return "File not found"; | |
case goog.net.ErrorCode.FF_SILENT_ERROR: | |
return "Firefox silently errored"; | |
case goog.net.ErrorCode.CUSTOM_ERROR: | |
return "Application custom error"; | |
case goog.net.ErrorCode.EXCEPTION: | |
return "An exception occurred"; | |
case goog.net.ErrorCode.HTTP_ERROR: | |
return "Http response at 400 or 500 level"; | |
case goog.net.ErrorCode.ABORT: | |
return "Request was aborted"; | |
case goog.net.ErrorCode.TIMEOUT: | |
return "Request timed out"; | |
case goog.net.ErrorCode.OFFLINE: | |
return "The resource is not available offline"; | |
default: | |
return "Unrecognized error code"; | |
} | |
}; | |
goog.provide("goog.net.HttpStatus"); | |
goog.net.HttpStatus = {CONTINUE:100, SWITCHING_PROTOCOLS:101, OK:200, CREATED:201, ACCEPTED:202, NON_AUTHORITATIVE_INFORMATION:203, NO_CONTENT:204, RESET_CONTENT:205, PARTIAL_CONTENT:206, MULTIPLE_CHOICES:300, MOVED_PERMANENTLY:301, FOUND:302, SEE_OTHER:303, NOT_MODIFIED:304, USE_PROXY:305, TEMPORARY_REDIRECT:307, BAD_REQUEST:400, UNAUTHORIZED:401, PAYMENT_REQUIRED:402, FORBIDDEN:403, NOT_FOUND:404, METHOD_NOT_ALLOWED:405, NOT_ACCEPTABLE:406, PROXY_AUTHENTICATION_REQUIRED:407, REQUEST_TIMEOUT:408, | |
CONFLICT:409, GONE:410, LENGTH_REQUIRED:411, PRECONDITION_FAILED:412, REQUEST_ENTITY_TOO_LARGE:413, REQUEST_URI_TOO_LONG:414, UNSUPPORTED_MEDIA_TYPE:415, REQUEST_RANGE_NOT_SATISFIABLE:416, EXPECTATION_FAILED:417, INTERNAL_SERVER_ERROR:500, NOT_IMPLEMENTED:501, BAD_GATEWAY:502, SERVICE_UNAVAILABLE:503, GATEWAY_TIMEOUT:504, HTTP_VERSION_NOT_SUPPORTED:505, QUIRK_IE_NO_CONTENT:1223}; | |
goog.net.HttpStatus.isSuccess = function(status) { | |
switch(status) { | |
case goog.net.HttpStatus.OK: | |
; | |
case goog.net.HttpStatus.CREATED: | |
; | |
case goog.net.HttpStatus.ACCEPTED: | |
; | |
case goog.net.HttpStatus.NO_CONTENT: | |
; | |
case goog.net.HttpStatus.PARTIAL_CONTENT: | |
; | |
case goog.net.HttpStatus.NOT_MODIFIED: | |
; | |
case goog.net.HttpStatus.QUIRK_IE_NO_CONTENT: | |
return true; | |
default: | |
return false; | |
} | |
}; | |
goog.provide("goog.net.XhrLike"); | |
goog.net.XhrLike = function() { | |
}; | |
goog.net.XhrLike.OrNative; | |
goog.net.XhrLike.prototype.onreadystatechange; | |
goog.net.XhrLike.prototype.responseText; | |
goog.net.XhrLike.prototype.responseXML; | |
goog.net.XhrLike.prototype.readyState; | |
goog.net.XhrLike.prototype.status; | |
goog.net.XhrLike.prototype.statusText; | |
goog.net.XhrLike.prototype.open = function(method, url, opt_async, opt_user, opt_password) { | |
}; | |
goog.net.XhrLike.prototype.send = function(opt_data) { | |
}; | |
goog.net.XhrLike.prototype.abort = function() { | |
}; | |
goog.net.XhrLike.prototype.setRequestHeader = function(header, value) { | |
}; | |
goog.net.XhrLike.prototype.getResponseHeader = function(header) { | |
}; | |
goog.net.XhrLike.prototype.getAllResponseHeaders = function() { | |
}; | |
goog.provide("goog.net.XmlHttpFactory"); | |
goog.require("goog.net.XhrLike"); | |
goog.net.XmlHttpFactory = function() { | |
}; | |
goog.net.XmlHttpFactory.prototype.cachedOptions_ = null; | |
goog.net.XmlHttpFactory.prototype.createInstance = goog.abstractMethod; | |
goog.net.XmlHttpFactory.prototype.getOptions = function() { | |
return this.cachedOptions_ || (this.cachedOptions_ = this.internalGetOptions()); | |
}; | |
goog.net.XmlHttpFactory.prototype.internalGetOptions = goog.abstractMethod; | |
goog.provide("goog.net.WrapperXmlHttpFactory"); | |
goog.require("goog.net.XhrLike"); | |
goog.require("goog.net.XmlHttpFactory"); | |
goog.net.WrapperXmlHttpFactory = function(xhrFactory, optionsFactory) { | |
goog.net.XmlHttpFactory.call(this); | |
this.xhrFactory_ = xhrFactory; | |
this.optionsFactory_ = optionsFactory; | |
}; | |
goog.inherits(goog.net.WrapperXmlHttpFactory, goog.net.XmlHttpFactory); | |
goog.net.WrapperXmlHttpFactory.prototype.createInstance = function() { | |
return this.xhrFactory_(); | |
}; | |
goog.net.WrapperXmlHttpFactory.prototype.getOptions = function() { | |
return this.optionsFactory_(); | |
}; | |
goog.provide("goog.net.DefaultXmlHttpFactory"); | |
goog.provide("goog.net.XmlHttp"); | |
goog.provide("goog.net.XmlHttp.OptionType"); | |
goog.provide("goog.net.XmlHttp.ReadyState"); | |
goog.provide("goog.net.XmlHttpDefines"); | |
goog.require("goog.asserts"); | |
goog.require("goog.net.WrapperXmlHttpFactory"); | |
goog.require("goog.net.XmlHttpFactory"); | |
goog.net.XmlHttp = function() { | |
return goog.net.XmlHttp.factory_.createInstance(); | |
}; | |
goog.define("goog.net.XmlHttp.ASSUME_NATIVE_XHR", false); | |
goog.net.XmlHttpDefines = {}; | |
goog.define("goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR", false); | |
goog.net.XmlHttp.getOptions = function() { | |
return goog.net.XmlHttp.factory_.getOptions(); | |
}; | |
goog.net.XmlHttp.OptionType = {USE_NULL_FUNCTION:0, LOCAL_REQUEST_ERROR:1}; | |
goog.net.XmlHttp.ReadyState = {UNINITIALIZED:0, LOADING:1, LOADED:2, INTERACTIVE:3, COMPLETE:4}; | |
goog.net.XmlHttp.factory_; | |
goog.net.XmlHttp.setFactory = function(factory, optionsFactory) { | |
goog.net.XmlHttp.setGlobalFactory(new goog.net.WrapperXmlHttpFactory(goog.asserts.assert(factory), goog.asserts.assert(optionsFactory))); | |
}; | |
goog.net.XmlHttp.setGlobalFactory = function(factory) { | |
goog.net.XmlHttp.factory_ = factory; | |
}; | |
goog.net.DefaultXmlHttpFactory = function() { | |
goog.net.XmlHttpFactory.call(this); | |
}; | |
goog.inherits(goog.net.DefaultXmlHttpFactory, goog.net.XmlHttpFactory); | |
goog.net.DefaultXmlHttpFactory.prototype.createInstance = function() { | |
var progId = this.getProgId_(); | |
if (progId) { | |
return new ActiveXObject(progId); | |
} else { | |
return new XMLHttpRequest; | |
} | |
}; | |
goog.net.DefaultXmlHttpFactory.prototype.internalGetOptions = function() { | |
var progId = this.getProgId_(); | |
var options = {}; | |
if (progId) { | |
options[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] = true; | |
options[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR] = true; | |
} | |
return options; | |
}; | |
goog.net.DefaultXmlHttpFactory.prototype.ieProgId_; | |
goog.net.DefaultXmlHttpFactory.prototype.getProgId_ = function() { | |
if (goog.net.XmlHttp.ASSUME_NATIVE_XHR || goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR) { | |
return ""; | |
} | |
if (!this.ieProgId_ && (typeof XMLHttpRequest == "undefined" && typeof ActiveXObject != "undefined")) { | |
var ACTIVE_X_IDENTS = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]; | |
for (var i = 0;i < ACTIVE_X_IDENTS.length;i++) { | |
var candidate = ACTIVE_X_IDENTS[i]; | |
try { | |
new ActiveXObject(candidate); | |
this.ieProgId_ = candidate; | |
return candidate; | |
} catch (e) { | |
} | |
} | |
throw Error("Could not create ActiveXObject. ActiveX might be disabled," + " or MSXML might not be installed"); | |
} | |
return(this.ieProgId_); | |
}; | |
goog.net.XmlHttp.setGlobalFactory(new goog.net.DefaultXmlHttpFactory); | |
goog.provide("goog.net.EventType"); | |
goog.net.EventType = {COMPLETE:"complete", SUCCESS:"success", ERROR:"error", ABORT:"abort", READY:"ready", READY_STATE_CHANGE:"readystatechange", TIMEOUT:"timeout", INCREMENTAL_DATA:"incrementaldata", PROGRESS:"progress"}; | |
goog.provide("goog.structs.Collection"); | |
goog.structs.Collection = function() { | |
}; | |
goog.structs.Collection.prototype.add; | |
goog.structs.Collection.prototype.remove; | |
goog.structs.Collection.prototype.contains; | |
goog.structs.Collection.prototype.getCount; | |
goog.provide("goog.functions"); | |
goog.functions.constant = function(retValue) { | |
return function() { | |
return retValue; | |
}; | |
}; | |
goog.functions.FALSE = goog.functions.constant(false); | |
goog.functions.TRUE = goog.functions.constant(true); | |
goog.functions.NULL = goog.functions.constant(null); | |
goog.functions.identity = function(opt_returnValue, var_args) { | |
return opt_returnValue; | |
}; | |
goog.functions.error = function(message) { | |
return function() { | |
throw Error(message); | |
}; | |
}; | |
goog.functions.fail = function(err) { | |
return function() { | |
throw err; | |
}; | |
}; | |
goog.functions.lock = function(f, opt_numArgs) { | |
opt_numArgs = opt_numArgs || 0; | |
return function() { | |
return f.apply(this, Array.prototype.slice.call(arguments, 0, opt_numArgs)); | |
}; | |
}; | |
goog.functions.nth = function(n) { | |
return function() { | |
return arguments[n]; | |
}; | |
}; | |
goog.functions.withReturnValue = function(f, retValue) { | |
return goog.functions.sequence(f, goog.functions.constant(retValue)); | |
}; | |
goog.functions.compose = function(fn, var_args) { | |
var functions = arguments; | |
var length = functions.length; | |
return function() { | |
var result; | |
if (length) { | |
result = functions[length - 1].apply(this, arguments); | |
} | |
for (var i = length - 2;i >= 0;i--) { | |
result = functions[i].call(this, result); | |
} | |
return result; | |
}; | |
}; | |
goog.functions.sequence = function(var_args) { | |
var functions = arguments; | |
var length = functions.length; | |
return function() { | |
var result; | |
for (var i = 0;i < length;i++) { | |
result = functions[i].apply(this, arguments); | |
} | |
return result; | |
}; | |
}; | |
goog.functions.and = function(var_args) { | |
var functions = arguments; | |
var length = functions.length; | |
return function() { | |
for (var i = 0;i < length;i++) { | |
if (!functions[i].apply(this, arguments)) { | |
return false; | |
} | |
} | |
return true; | |
}; | |
}; | |
goog.functions.or = function(var_args) { | |
var functions = arguments; | |
var length = functions.length; | |
return function() { | |
for (var i = 0;i < length;i++) { | |
if (functions[i].apply(this, arguments)) { | |
return true; | |
} | |
} | |
return false; | |
}; | |
}; | |
goog.functions.not = function(f) { | |
return function() { | |
return!f.apply(this, arguments); | |
}; | |
}; | |
goog.functions.create = function(constructor, var_args) { | |
var temp = function() { | |
}; | |
temp.prototype = constructor.prototype; | |
var obj = new temp; | |
constructor.apply(obj, Array.prototype.slice.call(arguments, 1)); | |
return obj; | |
}; | |
goog.define("goog.functions.CACHE_RETURN_VALUE", true); | |
goog.functions.cacheReturnValue = function(fn) { | |
var called = false; | |
var value; | |
return function() { | |
if (!goog.functions.CACHE_RETURN_VALUE) { | |
return fn(); | |
} | |
if (!called) { | |
value = fn(); | |
called = true; | |
} | |
return value; | |
}; | |
}; | |
goog.provide("goog.math"); | |
goog.require("goog.array"); | |
goog.require("goog.asserts"); | |
goog.math.randomInt = function(a) { | |
return Math.floor(Math.random() * a); | |
}; | |
goog.math.uniformRandom = function(a, b) { | |
return a + Math.random() * (b - a); | |
}; | |
goog.math.clamp = function(value, min, max) { | |
return Math.min(Math.max(value, min), max); | |
}; | |
goog.math.modulo = function(a, b) { | |
var r = a % b; | |
return r * b < 0 ? r + b : r; | |
}; | |
goog.math.lerp = function(a, b, x) { | |
return a + x * (b - a); | |
}; | |
goog.math.nearlyEquals = function(a, b, opt_tolerance) { | |
return Math.abs(a - b) <= (opt_tolerance || 1E-6); | |
}; | |
goog.math.standardAngle = function(angle) { | |
return goog.math.modulo(angle, 360); | |
}; | |
goog.math.toRadians = function(angleDegrees) { | |
return angleDegrees * Math.PI / 180; | |
}; | |
goog.math.toDegrees = function(angleRadians) { | |
return angleRadians * 180 / Math.PI; | |
}; | |
goog.math.angleDx = function(degrees, radius) { | |
return radius * Math.cos(goog.math.toRadians(degrees)); | |
}; | |
goog.math.angleDy = function(degrees, radius) { | |
return radius * Math.sin(goog.math.toRadians(degrees)); | |
}; | |
goog.math.angle = function(x1, y1, x2, y2) { | |
return goog.math.standardAngle(goog.math.toDegrees(Math.atan2(y2 - y1, x2 - x1))); | |
}; | |
goog.math.angleDifference = function(startAngle, endAngle) { | |
var d = goog.math.standardAngle(endAngle) - goog.math.standardAngle(startAngle); | |
if (d > 180) { | |
d = d - 360; | |
} else { | |
if (d <= -180) { | |
d = 360 + d; | |
} | |
} | |
return d; | |
}; | |
goog.math.sign = function(x) { | |
return x == 0 ? 0 : x < 0 ? -1 : 1; | |
}; | |
goog.math.longestCommonSubsequence = function(array1, array2, opt_compareFn, opt_collectorFn) { | |
var compare = opt_compareFn || function(a, b) { | |
return a == b; | |
}; | |
var collect = opt_collectorFn || function(i1, i2) { | |
return array1[i1]; | |
}; | |
var length1 = array1.length; | |
var length2 = array2.length; | |
var arr = []; | |
for (var i = 0;i < length1 + 1;i++) { | |
arr[i] = []; | |
arr[i][0] = 0; | |
} | |
for (var j = 0;j < length2 + 1;j++) { | |
arr[0][j] = 0; | |
} | |
for (i = 1;i <= length1;i++) { | |
for (j = 1;j <= length2;j++) { | |
if (compare(array1[i - 1], array2[j - 1])) { | |
arr[i][j] = arr[i - 1][j - 1] + 1; | |
} else { | |
arr[i][j] = Math.max(arr[i - 1][j], arr[i][j - 1]); | |
} | |
} | |
} | |
var result = []; | |
var i = length1, j = length2; | |
while (i > 0 && j > 0) { | |
if (compare(array1[i - 1], array2[j - 1])) { | |
result.unshift(collect(i - 1, j - 1)); | |
i--; | |
j--; | |
} else { | |
if (arr[i - 1][j] > arr[i][j - 1]) { | |
i--; | |
} else { | |
j--; | |
} | |
} | |
} | |
return result; | |
}; | |
goog.math.sum = function(var_args) { | |
return(goog.array.reduce(arguments, function(sum, value) { | |
return sum + value; | |
}, 0)); | |
}; | |
goog.math.average = function(var_args) { | |
return goog.math.sum.apply(null, arguments) / arguments.length; | |
}; | |
goog.math.sampleVariance = function(var_args) { | |
var sampleSize = arguments.length; | |
if (sampleSize < 2) { | |
return 0; | |
} | |
var mean = goog.math.average.apply(null, arguments); | |
var variance = goog.math.sum.apply(null, goog.array.map(arguments, function(val) { | |
return Math.pow(val - mean, 2); | |
})) / (sampleSize - 1); | |
return variance; | |
}; | |
goog.math.standardDeviation = function(var_args) { | |
return Math.sqrt(goog.math.sampleVariance.apply(null, arguments)); | |
}; | |
goog.math.isInt = function(num) { | |
return isFinite(num) && num % 1 == 0; | |
}; | |
goog.math.isFiniteNumber = function(num) { | |
return isFinite(num) && !isNaN(num); | |
}; | |
goog.math.log10Floor = function(num) { | |
if (num > 0) { | |
var x = Math.round(Math.log(num) * Math.LOG10E); | |
return x - (Math.pow(10, x) > num); | |
} | |
return num == 0 ? -Infinity : NaN; | |
}; | |
goog.math.safeFloor = function(num, opt_epsilon) { | |
goog.asserts.assert(!goog.isDef(opt_epsilon) || opt_epsilon > 0); | |
return Math.floor(num + (opt_epsilon || 2E-15)); | |
}; | |
goog.math.safeCeil = function(num, opt_epsilon) { | |
goog.asserts.assert(!goog.isDef(opt_epsilon) || opt_epsilon > 0); | |
return Math.ceil(num - (opt_epsilon || 2E-15)); | |
}; | |
goog.provide("goog.iter"); | |
goog.provide("goog.iter.Iterable"); | |
goog.provide("goog.iter.Iterator"); | |
goog.provide("goog.iter.StopIteration"); | |
goog.require("goog.array"); | |
goog.require("goog.asserts"); | |
goog.require("goog.functions"); | |
goog.require("goog.math"); | |
goog.iter.Iterable; | |
if ("StopIteration" in goog.global) { | |
goog.iter.StopIteration = goog.global["StopIteration"]; | |
} else { | |
goog.iter.StopIteration = Error("StopIteration"); | |
} | |
goog.iter.Iterator = function() { | |
}; | |
goog.iter.Iterator.prototype.next = function() { | |
throw goog.iter.StopIteration; | |
}; | |
goog.iter.Iterator.prototype.__iterator__ = function(opt_keys) { | |
return this; | |
}; | |
goog.iter.toIterator = function(iterable) { | |
if (iterable instanceof goog.iter.Iterator) { | |
return iterable; | |
} | |
if (typeof iterable.__iterator__ == "function") { | |
return iterable.__iterator__(false); | |
} | |
if (goog.isArrayLike(iterable)) { | |
var i = 0; | |
var newIter = new goog.iter.Iterator; | |
newIter.next = function() { | |
while (true) { | |
if (i >= iterable.length) { | |
throw goog.iter.StopIteration; | |
} | |
if (!(i in iterable)) { | |
i++; | |
continue; | |
} | |
return iterable[i++]; | |
} | |
}; | |
return newIter; | |
} | |
throw Error("Not implemented"); | |
}; | |
goog.iter.forEach = function(iterable, f, opt_obj) { | |
if (goog.isArrayLike(iterable)) { | |
try { | |
goog.array.forEach((iterable), f, opt_obj); | |
} catch (ex) { | |
if (ex !== goog.iter.StopIteration) { | |
throw ex; | |
} | |
} | |
} else { | |
iterable = goog.iter.toIterator(iterable); | |
try { | |
while (true) { | |
f.call(opt_obj, iterable.next(), undefined, iterable); | |
} | |
} catch (ex) { | |
if (ex !== goog.iter.StopIteration) { | |
throw ex; | |
} | |
} | |
} | |
}; | |
goog.iter.filter = function(iterable, f, opt_obj) { | |
var iterator = goog.iter.toIterator(iterable); | |
var newIter = new goog.iter.Iterator; | |
newIter.next = function() { | |
while (true) { | |
var val = iterator.next(); | |
if (f.call(opt_obj, val, undefined, iterator)) { | |
return val; | |
} | |
} | |
}; | |
return newIter; | |
}; | |
goog.iter.range = function(startOrStop, opt_stop, opt_step) { | |
var start = 0; | |
var stop = startOrStop; | |
var step = opt_step || 1; | |
if (arguments.length > 1) { | |
start = startOrStop; | |
stop = opt_stop; | |
} | |
if (step == 0) { | |
throw Error("Range step argument must not be zero"); | |
} | |
var newIter = new goog.iter.Iterator; | |
newIter.next = function() { | |
if (step > 0 && start >= stop || step < 0 && start <= stop) { | |
throw goog.iter.StopIteration; | |
} | |
var rv = start; | |
start += step; | |
return rv; | |
}; | |
return newIter; | |
}; | |
goog.iter.join = function(iterable, deliminator) { | |
return goog.iter.toArray(iterable).join(deliminator); | |
}; | |
goog.iter.map = function(iterable, f, opt_obj) { | |
var iterator = goog.iter.toIterator(iterable); | |
var newIter = new goog.iter.Iterator; | |
newIter.next = function() { | |
var val = iterator.next(); | |
return f.call(opt_obj, val, undefined, iterator); | |
}; | |
return newIter; | |
}; | |
goog.iter.reduce = function(iterable, f, val, opt_obj) { | |
var rval = val; | |
goog.iter.forEach(iterable, function(val) { | |
rval = f.call(opt_obj, rval, val); | |
}); | |
return rval; | |
}; | |
goog.iter.some = function(iterable, f, opt_obj) { | |
iterable = goog.iter.toIterator(iterable); | |
try { | |
while (true) { | |
if (f.call(opt_obj, iterable.next(), undefined, iterable)) { | |
return true; | |
} | |
} | |
} catch (ex) { | |
if (ex !== goog.iter.StopIteration) { | |
throw ex; | |
} | |
} | |
return false; | |
}; | |
goog.iter.every = function(iterable, f, opt_obj) { | |
iterable = goog.iter.toIterator(iterable); | |
try { | |
while (true) { | |
if (!f.call(opt_obj, iterable.next(), undefined, iterable)) { | |
return false; | |
} | |
} | |
} catch (ex) { | |
if (ex !== goog.iter.StopIteration) { | |
throw ex; | |
} | |
} | |
return true; | |
}; | |
goog.iter.chain = function(var_args) { | |
var iterator = goog.iter.toIterator(arguments); | |
var iter = new goog.iter.Iterator; | |
var current = null; | |
iter.next = function() { | |
while (true) { | |
if (current == null) { | |
var it = iterator.next(); | |
current = goog.iter.toIterator(it); | |
} | |
try { | |
return current.next(); | |
} catch (ex) { | |
if (ex !== goog.iter.StopIteration) { | |
throw ex; | |
} | |
current = null; | |
} | |
} | |
}; | |
return iter; | |
}; | |
goog.iter.chainFromIterable = function(iterable) { | |
return goog.iter.chain.apply(undefined, iterable); | |
}; | |
goog.iter.dropWhile = function(iterable, f, opt_obj) { | |
var iterator = goog.iter.toIterator(iterable); | |
var newIter = new goog.iter.Iterator; | |
var dropping = true; | |
newIter.next = function() { | |
while (true) { | |
var val = iterator.next(); | |
if (dropping && f.call(opt_obj, val, undefined, iterator)) { | |
continue; | |
} else { | |
dropping = false; | |
} | |
return val; | |
} | |
}; | |
return newIter; | |
}; | |
goog.iter.takeWhile = function(iterable, f, opt_obj) { | |
var iterator = goog.iter.toIterator(iterable); | |
var newIter = new goog.iter.Iterator; | |
var taking = true; | |
newIter.next = function() { | |
while (true) { | |
if (taking) { | |
var val = iterator.next(); | |
if (f.call(opt_obj, val, undefined, iterator)) { | |
return val; | |
} else { | |
taking = false; | |
} | |
} else { | |
throw goog.iter.StopIteration; | |
} | |
} | |
}; | |
return newIter; | |
}; | |
goog.iter.toArray = function(iterable) { | |
if (goog.isArrayLike(iterable)) { | |
return goog.array.toArray((iterable)); | |
} | |
iterable = goog.iter.toIterator(iterable); | |
var array = []; | |
goog.iter.forEach(iterable, function(val) { | |
array.push(val); | |
}); | |
return array; | |
}; | |
goog.iter.equals = function(iterable1, iterable2) { | |
var fillValue = {}; | |
var pairs = goog.iter.zipLongest(fillValue, iterable1, iterable2); | |
return goog.iter.every(pairs, function(pair) { | |
return pair[0] == pair[1]; | |
}); | |
}; | |
goog.iter.nextOrValue = function(iterable, defaultValue) { | |
try { | |
return goog.iter.toIterator(iterable).next(); | |
} catch (e) { | |
if (e != goog.iter.StopIteration) { | |
throw e; | |
} | |
return defaultValue; | |
} | |
}; | |
goog.iter.product = function(var_args) { | |
var someArrayEmpty = goog.array.some(arguments, function(arr) { | |
return!arr.length; | |
}); | |
if (someArrayEmpty || !arguments.length) { | |
return new goog.iter.Iterator; | |
} | |
var iter = new goog.iter.Iterator; | |
var arrays = arguments; | |
var indicies = goog.array.repeat(0, arrays.length); | |
iter.next = function() { | |
if (indicies) { | |
var retVal = goog.array.map(indicies, function(valueIndex, arrayIndex) { | |
return arrays[arrayIndex][valueIndex]; | |
}); | |
for (var i = indicies.length - 1;i >= 0;i--) { | |
goog.asserts.assert(indicies); | |
if (indicies[i] < arrays[i].length - 1) { | |
indicies[i]++; | |
break; | |
} | |
if (i == 0) { | |
indicies = null; | |
break; | |
} | |
indicies[i] = 0; | |
} | |
return retVal; | |
} | |
throw goog.iter.StopIteration; | |
}; | |
return iter; | |
}; | |
goog.iter.cycle = function(iterable) { | |
var baseIterator = goog.iter.toIterator(iterable); | |
var cache = []; | |
var cacheIndex = 0; | |
var iter = new goog.iter.Iterator; | |
var useCache = false; | |
iter.next = function() { | |
var returnElement = null; | |
if (!useCache) { | |
try { | |
returnElement = baseIterator.next(); | |
cache.push(returnElement); | |
return returnElement; | |
} catch (e) { | |
if (e != goog.iter.StopIteration || goog.array.isEmpty(cache)) { | |
throw e; | |
} | |
useCache = true; | |
} | |
} | |
returnElement = cache[cacheIndex]; | |
cacheIndex = (cacheIndex + 1) % cache.length; | |
return returnElement; | |
}; | |
return iter; | |
}; | |
goog.iter.count = function(opt_start, opt_step) { | |
var counter = opt_start || 0; | |
var step = goog.isDef(opt_step) ? opt_step : 1; | |
var iter = new goog.iter.Iterator; | |
iter.next = function() { | |
var returnValue = counter; | |
counter += step; | |
return returnValue; | |
}; | |
return iter; | |
}; | |
goog.iter.repeat = function(value) { | |
var iter = new goog.iter.Iterator; | |
iter.next = goog.functions.constant(value); | |
return iter; | |
}; | |
goog.iter.accumulate = function(iterable) { | |
var iterator = goog.iter.toIterator(iterable); | |
var total = 0; | |
var iter = new goog.iter.Iterator; | |
iter.next = function() { | |
total += iterator.next(); | |
return total; | |
}; | |
return iter; | |
}; | |
goog.iter.zip = function(var_args) { | |
var args = arguments; | |
var iter = new goog.iter.Iterator; | |
if (args.length > 0) { | |
var iterators = goog.array.map(args, goog.iter.toIterator); | |
iter.next = function() { | |
var arr = goog.array.map(iterators, function(it) { | |
return it.next(); | |
}); | |
return arr; | |
}; | |
} | |
return iter; | |
}; | |
goog.iter.zipLongest = function(fillValue, var_args) { | |
var args = goog.array.slice(arguments, 1); | |
var iter = new goog.iter.Iterator; | |
if (args.length > 0) { | |
var iterators = goog.array.map(args, goog.iter.toIterator); | |
iter.next = function() { | |
var iteratorsHaveValues = false; | |
var arr = goog.array.map(iterators, function(it) { | |
var returnValue; | |
try { | |
returnValue = it.next(); | |
iteratorsHaveValues = true; | |
} catch (ex) { | |
if (ex !== goog.iter.StopIteration) { | |
throw ex; | |
} | |
returnValue = fillValue; | |
} | |
return returnValue; | |
}); | |
if (!iteratorsHaveValues) { | |
throw goog.iter.StopIteration; | |
} | |
return arr; | |
}; | |
} | |
return iter; | |
}; | |
goog.iter.compress = function(iterable, selectors) { | |
var selectorIterator = goog.iter.toIterator(selectors); | |
return goog.iter.filter(iterable, function() { | |
return!!selectorIterator.next(); | |
}); | |
}; | |
goog.iter.GroupByIterator_ = function(iterable, opt_keyFunc) { | |
this.iterator = goog.iter.toIterator(iterable); | |
this.keyFunc = opt_keyFunc || goog.functions.identity; | |
this.targetKey; | |
this.currentKey; | |
this.currentValue; | |
}; | |
goog.inherits(goog.iter.GroupByIterator_, goog.iter.Iterator); | |
goog.iter.GroupByIterator_.prototype.next = function() { | |
while (this.currentKey == this.targetKey) { | |
this.currentValue = this.iterator.next(); | |
this.currentKey = this.keyFunc(this.currentValue); | |
} | |
this.targetKey = this.currentKey; | |
return[this.currentKey, this.groupItems_(this.targetKey)]; | |
}; | |
goog.iter.GroupByIterator_.prototype.groupItems_ = function(targetKey) { | |
var arr = []; | |
while (this.currentKey == targetKey) { | |
arr.push(this.currentValue); | |
try { | |
this.currentValue = this.iterator.next(); | |
} catch (ex) { | |
if (ex !== goog.iter.StopIteration) { | |
throw ex; | |
} | |
break; | |
} | |
this.currentKey = this.keyFunc(this.currentValue); | |
} | |
return arr; | |
}; | |
goog.iter.groupBy = function(iterable, opt_keyFunc) { | |
return new goog.iter.GroupByIterator_(iterable, opt_keyFunc); | |
}; | |
goog.iter.tee = function(iterable, opt_num) { | |
var iterator = goog.iter.toIterator(iterable); | |
var num = goog.isNumber(opt_num) ? opt_num : 2; | |
var buffers = goog.array.map(goog.array.range(num), function() { | |
return[]; | |
}); | |
var addNextIteratorValueToBuffers = function() { | |
var val = iterator.next(); | |
goog.array.forEach(buffers, function(buffer) { | |
buffer.push(val); | |
}); | |
}; | |
var createIterator = function(buffer) { | |
var iter = new goog.iter.Iterator; | |
iter.next = function() { | |
if (goog.array.isEmpty(buffer)) { | |
addNextIteratorValueToBuffers(); | |
} | |
goog.asserts.assert(!goog.array.isEmpty(buffer)); | |
return buffer.shift(); | |
}; | |
return iter; | |
}; | |
return goog.array.map(buffers, createIterator); | |
}; | |
goog.iter.enumerate = function(iterable, opt_start) { | |
return goog.iter.zip(goog.iter.count(opt_start), iterable); | |
}; | |
goog.iter.limit = function(iterable, limitSize) { | |
goog.asserts.assert(goog.math.isInt(limitSize) && limitSize >= 0); | |
var iterator = goog.iter.toIterator(iterable); | |
var iter = new goog.iter.Iterator; | |
var remaining = limitSize; | |
iter.next = function() { | |
if (remaining-- > 0) { | |
return iterator.next(); | |
} | |
throw goog.iter.StopIteration; | |
}; | |
return iter; | |
}; | |
goog.iter.consume = function(iterable, count) { | |
goog.asserts.assert(goog.math.isInt(count) && count >= 0); | |
var iterator = goog.iter.toIterator(iterable); | |
while (count-- > 0) { | |
goog.iter.nextOrValue(iterator, null); | |
} | |
return iterator; | |
}; | |
goog.iter.slice = function(iterable, start, opt_end) { | |
goog.asserts.assert(goog.math.isInt(start) && start >= 0); | |
var iterator = goog.iter.consume(iterable, start); | |
if (goog.isNumber(opt_end)) { | |
goog.asserts.assert(goog.math.isInt((opt_end)) && opt_end >= start); | |
iterator = goog.iter.limit(iterator, opt_end - start); | |
} | |
return iterator; | |
}; | |
goog.iter.hasDuplicates_ = function(arr) { | |
var deduped = []; | |
goog.array.removeDuplicates(arr, deduped); | |
return arr.length != deduped.length; | |
}; | |
goog.iter.permutations = function(iterable, opt_length) { | |
var elements = goog.iter.toArray(iterable); | |
var length = goog.isNumber(opt_length) ? opt_length : elements.length; | |
var sets = goog.array.repeat(elements, length); | |
var product = goog.iter.product.apply(undefined, sets); | |
return goog.iter.filter(product, function(arr) { | |
return!goog.iter.hasDuplicates_(arr); | |
}); | |
}; | |
goog.iter.combinations = function(iterable, length) { | |
var elements = goog.iter.toArray(iterable); | |
var indexes = goog.iter.range(elements.length); | |
var indexIterator = goog.iter.permutations(indexes, length); | |
var sortedIndexIterator = goog.iter.filter(indexIterator, function(arr) { | |
return goog.array.isSorted(arr); | |
}); | |
var iter = new goog.iter.Iterator; | |
function getIndexFromElements(index) { | |
return elements[index]; | |
} | |
iter.next = function() { | |
return goog.array.map((sortedIndexIterator.next()), getIndexFromElements); | |
}; | |
return iter; | |
}; | |
goog.iter.combinationsWithReplacement = function(iterable, length) { | |
var elements = goog.iter.toArray(iterable); | |
var indexes = goog.array.range(elements.length); | |
var sets = goog.array.repeat(indexes, length); | |
var indexIterator = goog.iter.product.apply(undefined, sets); | |
var sortedIndexIterator = goog.iter.filter(indexIterator, function(arr) { | |
return goog.array.isSorted(arr); | |
}); | |
var iter = new goog.iter.Iterator; | |
function getIndexFromElements(index) { | |
return elements[index]; | |
} | |
iter.next = function() { | |
return goog.array.map((sortedIndexIterator.next()), getIndexFromElements); | |
}; | |
return iter; | |
}; | |
goog.provide("goog.structs.Map"); | |
goog.require("goog.iter.Iterator"); | |
goog.require("goog.iter.StopIteration"); | |
goog.require("goog.object"); | |
goog.structs.Map = function(opt_map, var_args) { | |
this.map_ = {}; | |
this.keys_ = []; | |
this.count_ = 0; | |
this.version_ = 0; | |
var argLength = arguments.length; | |
if (argLength > 1) { | |
if (argLength % 2) { | |
throw Error("Uneven number of arguments"); | |
} | |
for (var i = 0;i < argLength;i += 2) { | |
this.set(arguments[i], arguments[i + 1]); | |
} | |
} else { | |
if (opt_map) { | |
this.addAll((opt_map)); | |
} | |
} | |
}; | |
goog.structs.Map.prototype.getCount = function() { | |
return this.count_; | |
}; | |
goog.structs.Map.prototype.getValues = function() { | |
this.cleanupKeysArray_(); | |
var rv = []; | |
for (var i = 0;i < this.keys_.length;i++) { | |
var key = this.keys_[i]; | |
rv.push(this.map_[key]); | |
} | |
return rv; | |
}; | |
goog.structs.Map.prototype.getKeys = function() { | |
this.cleanupKeysArray_(); | |
return(this.keys_.concat()); | |
}; | |
goog.structs.Map.prototype.containsKey = function(key) { | |
return goog.structs.Map.hasKey_(this.map_, key); | |
}; | |
goog.structs.Map.prototype.containsValue = function(val) { | |
for (var i = 0;i < this.keys_.length;i++) { | |
var key = this.keys_[i]; | |
if (goog.structs.Map.hasKey_(this.map_, key) && this.map_[key] == val) { | |
return true; | |
} | |
} | |
return false; | |
}; | |
goog.structs.Map.prototype.equals = function(otherMap, opt_equalityFn) { | |
if (this === otherMap) { | |
return true; | |
} | |
if (this.count_ != otherMap.getCount()) { | |
return false; | |
} | |
var equalityFn = opt_equalityFn || goog.structs.Map.defaultEquals; | |
this.cleanupKeysArray_(); | |
for (var key, i = 0;key = this.keys_[i];i++) { | |
if (!equalityFn(this.get(key), otherMap.get(key))) { | |
return false; | |
} | |
} | |
return true; | |
}; | |
goog.structs.Map.defaultEquals = function(a, b) { | |
return a === b; | |
}; | |
goog.structs.Map.prototype.isEmpty = function() { | |
return this.count_ == 0; | |
}; | |
goog.structs.Map.prototype.clear = function() { | |
this.map_ = {}; | |
this.keys_.length = 0; | |
this.count_ = 0; | |
this.version_ = 0; | |
}; | |
goog.structs.Map.prototype.remove = function(key) { | |
if (goog.structs.Map.hasKey_(this.map_, key)) { | |
delete this.map_[key]; | |
this.count_--; | |
this.version_++; | |
if (this.keys_.length > 2 * this.count_) { | |
this.cleanupKeysArray_(); | |
} | |
return true; | |
} | |
return false; | |
}; | |
goog.structs.Map.prototype.cleanupKeysArray_ = function() { | |
if (this.count_ != this.keys_.length) { | |
var srcIndex = 0; | |
var destIndex = 0; | |
while (srcIndex < this.keys_.length) { | |
var key = this.keys_[srcIndex]; | |
if (goog.structs.Map.hasKey_(this.map_, key)) { | |
this.keys_[destIndex++] = key; | |
} | |
srcIndex++; | |
} | |
this.keys_.length = destIndex; | |
} | |
if (this.count_ != this.keys_.length) { | |
var seen = {}; | |
var srcIndex = 0; | |
var destIndex = 0; | |
while (srcIndex < this.keys_.length) { | |
var key = this.keys_[srcIndex]; | |
if (!goog.structs.Map.hasKey_(seen, key)) { | |
this.keys_[destIndex++] = key; | |
seen[key] = 1; | |
} | |
srcIndex++; | |
} | |
this.keys_.length = destIndex; | |
} | |
}; | |
goog.structs.Map.prototype.get = function(key, opt_val) { | |
if (goog.structs.Map.hasKey_(this.map_, key)) { | |
return this.map_[key]; | |
} | |
return opt_val; | |
}; | |
goog.structs.Map.prototype.set = function(key, value) { | |
if (!goog.structs.Map.hasKey_(this.map_, key)) { | |
this.count_++; | |
this.keys_.push(key); | |
this.version_++; | |
} | |
this.map_[key] = value; | |
}; | |
goog.structs.Map.prototype.addAll = function(map) { | |
var keys, values; | |
if (map instanceof goog.structs.Map) { | |
keys = map.getKeys(); | |
values = map.getValues(); | |
} else { | |
keys = goog.object.getKeys(map); | |
values = goog.object.getValues(map); | |
} | |
for (var i = 0;i < keys.length;i++) { | |
this.set(keys[i], values[i]); | |
} | |
}; | |
goog.structs.Map.prototype.clone = function() { | |
return new goog.structs.Map(this); | |
}; | |
goog.structs.Map.prototype.transpose = function() { | |
var transposed = new goog.structs.Map; | |
for (var i = 0;i < this.keys_.length;i++) { | |
var key = this.keys_[i]; | |
var value = this.map_[key]; | |
transposed.set(value, key); | |
} | |
return transposed; | |
}; | |
goog.structs.Map.prototype.toObject = function() { | |
this.cleanupKeysArray_(); | |
var obj = {}; | |
for (var i = 0;i < this.keys_.length;i++) { | |
var key = this.keys_[i]; | |
obj[key] = this.map_[key]; | |
} | |
return obj; | |
}; | |
goog.structs.Map.prototype.getKeyIterator = function() { | |
return this.__iterator__(true); | |
}; | |
goog.structs.Map.prototype.getValueIterator = function() { | |
return this.__iterator__(false); | |
}; | |
goog.structs.Map.prototype.__iterator__ = function(opt_keys) { | |
this.cleanupKeysArray_(); | |
var i = 0; | |
var keys = this.keys_; | |
var map = this.map_; | |
var version = this.version_; | |
var selfObj = this; | |
var newIter = new goog.iter.Iterator; | |
newIter.next = function() { | |
while (true) { | |
if (version != selfObj.version_) { | |
throw Error("The map has changed since the iterator was created"); | |
} | |
if (i >= keys.length) { | |
throw goog.iter.StopIteration; | |
} | |
var key = keys[i++]; | |
return opt_keys ? key : map[key]; | |
} | |
}; | |
return newIter; | |
}; | |
goog.structs.Map.hasKey_ = function(obj, key) { | |
return Object.prototype.hasOwnProperty.call(obj, key); | |
}; | |
goog.provide("goog.structs.Set"); | |
goog.require("goog.structs"); | |
goog.require("goog.structs.Collection"); | |
goog.require("goog.structs.Map"); | |
goog.structs.Set = function(opt_values) { | |
this.map_ = new goog.structs.Map; | |
if (opt_values) { | |
this.addAll(opt_values); | |
} | |
}; | |
goog.structs.Set.getKey_ = function(val) { | |
var type = typeof val; | |
if (type == "object" && val || type == "function") { | |
return "o" + goog.getUid((val)); | |
} else { | |
return type.substr(0, 1) + val; | |
} | |
}; | |
goog.structs.Set.prototype.getCount = function() { | |
return this.map_.getCount(); | |
}; | |
goog.structs.Set.prototype.add = function(element) { | |
this.map_.set(goog.structs.Set.getKey_(element), element); | |
}; | |
goog.structs.Set.prototype.addAll = function(col) { | |
var values = goog.structs.getValues(col); | |
var l = values.length; | |
for (var i = 0;i < l;i++) { | |
this.add(values[i]); | |
} | |
}; | |
goog.structs.Set.prototype.removeAll = function(col) { | |
var values = goog.structs.getValues(col); | |
var l = values.length; | |
for (var i = 0;i < l;i++) { | |
this.remove(values[i]); | |
} | |
}; | |
goog.structs.Set.prototype.remove = function(element) { | |
return this.map_.remove(goog.structs.Set.getKey_(element)); | |
}; | |
goog.structs.Set.prototype.clear = function() { | |
this.map_.clear(); | |
}; | |
goog.structs.Set.prototype.isEmpty = function() { | |
return this.map_.isEmpty(); | |
}; | |
goog.structs.Set.prototype.contains = function(element) { | |
return this.map_.containsKey(goog.structs.Set.getKey_(element)); | |
}; | |
goog.structs.Set.prototype.containsAll = function(col) { | |
return goog.structs.every(col, this.contains, this); | |
}; | |
goog.structs.Set.prototype.intersection = function(col) { | |
var result = new goog.structs.Set; | |
var values = goog.structs.getValues(col); | |
for (var i = 0;i < values.length;i++) { | |
var value = values[i]; | |
if (this.contains(value)) { | |
result.add(value); | |
} | |
} | |
return result; | |
}; | |
goog.structs.Set.prototype.difference = function(col) { | |
var result = this.clone(); | |
result.removeAll(col); | |
return result; | |
}; | |
goog.structs.Set.prototype.getValues = function() { | |
return this.map_.getValues(); | |
}; | |
goog.structs.Set.prototype.clone = function() { | |
return new goog.structs.Set(this); | |
}; | |
goog.structs.Set.prototype.equals = function(col) { | |
return this.getCount() == goog.structs.getCount(col) && this.isSubsetOf(col); | |
}; | |
goog.structs.Set.prototype.isSubsetOf = function(col) { | |
var colCount = goog.structs.getCount(col); | |
if (this.getCount() > colCount) { | |
return false; | |
} | |
if (!(col instanceof goog.structs.Set) && colCount > 5) { | |
col = new goog.structs.Set(col); | |
} | |
return goog.structs.every(this, function(value) { | |
return goog.structs.contains(col, value); | |
}); | |
}; | |
goog.structs.Set.prototype.__iterator__ = function(opt_keys) { | |
return this.map_.__iterator__(false); | |
}; | |
goog.provide("goog.debug"); | |
goog.require("goog.array"); | |
goog.require("goog.string"); | |
goog.require("goog.structs.Set"); | |
goog.require("goog.userAgent"); | |
goog.define("goog.debug.LOGGING_ENABLED", goog.DEBUG); | |
goog.debug.catchErrors = function(logFunc, opt_cancel, opt_target) { | |
var target = opt_target || goog.global; | |
var oldErrorHandler = target.onerror; | |
var retVal = !!opt_cancel; | |
if (goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher("535.3")) { | |
retVal = !retVal; | |
} | |
target.onerror = function(message, url, line, opt_col, opt_error) { | |
if (oldErrorHandler) { | |
oldErrorHandler(message, url, line, opt_col, opt_error); | |
} | |
logFunc({message:message, fileName:url, line:line, col:opt_col, error:opt_error}); | |
return retVal; | |
}; | |
}; | |
goog.debug.expose = function(obj, opt_showFn) { | |
if (typeof obj == "undefined") { | |
return "undefined"; | |
} | |
if (obj == null) { | |
return "NULL"; | |
} | |
var str = []; | |
for (var x in obj) { | |
if (!opt_showFn && goog.isFunction(obj[x])) { | |
continue; | |
} | |
var s = x + " = "; | |
try { | |
s += obj[x]; | |
} catch (e) { | |
s += "*** " + e + " ***"; | |
} | |
str.push(s); | |
} | |
return str.join("\n"); | |
}; | |
goog.debug.deepExpose = function(obj, opt_showFn) { | |
var str = []; | |
var helper = function(obj, space, parentSeen) { | |
var nestspace = space + " "; | |
var seen = new goog.structs.Set(parentSeen); | |
var indentMultiline = function(str) { | |
return str.replace(/\n/g, "\n" + space); | |
}; | |
try { | |
if (!goog.isDef(obj)) { | |
str.push("undefined"); | |
} else { | |
if (goog.isNull(obj)) { | |
str.push("NULL"); | |
} else { | |
if (goog.isString(obj)) { | |
str.push('"' + indentMultiline(obj) + '"'); | |
} else { | |
if (goog.isFunction(obj)) { | |
str.push(indentMultiline(String(obj))); | |
} else { | |
if (goog.isObject(obj)) { | |
if (seen.contains(obj)) { | |
str.push("*** reference loop detected ***"); | |
} else { | |
seen.add(obj); | |
str.push("{"); | |
for (var x in obj) { | |
if (!opt_showFn && goog.isFunction(obj[x])) { | |
continue; | |
} | |
str.push("\n"); | |
str.push(nestspace); | |
str.push(x + " = "); | |
helper(obj[x], nestspace, seen); | |
} | |
str.push("\n" + space + "}"); | |
} | |
} else { | |
str.push(obj); | |
} | |
} | |
} | |
} | |
} | |
} catch (e) { | |
str.push("*** " + e + " ***"); | |
} | |
}; | |
helper(obj, "", new goog.structs.Set); | |
return str.join(""); | |
}; | |
goog.debug.exposeArray = function(arr) { | |
var str = []; | |
for (var i = 0;i < arr.length;i++) { | |
if (goog.isArray(arr[i])) { | |
str.push(goog.debug.exposeArray(arr[i])); | |
} else { | |
str.push(arr[i]); | |
} | |
} | |
return "[ " + str.join(", ") + " ]"; | |
}; | |
goog.debug.exposeException = function(err, opt_fn) { | |
try { | |
var e = goog.debug.normalizeErrorObject(err); | |
var error = "Message: " + goog.string.htmlEscape(e.message) + '\nUrl: <a href="view-source:' + e.fileName + '" target="_new">' + e.fileName + "</a>\nLine: " + e.lineNumber + "\n\nBrowser stack:\n" + goog.string.htmlEscape(e.stack + "-> ") + "[end]\n\nJS stack traversal:\n" + goog.string.htmlEscape(goog.debug.getStacktrace(opt_fn) + "-> "); | |
return error; | |
} catch (e2) { | |
return "Exception trying to expose exception! You win, we lose. " + e2; | |
} | |
}; | |
goog.debug.normalizeErrorObject = function(err) { | |
var href = goog.getObjectByName("window.location.href"); | |
if (goog.isString(err)) { | |
return{"message":err, "name":"Unknown error", "lineNumber":"Not available", "fileName":href, "stack":"Not available"}; | |
} | |
var lineNumber, fileName; | |
var threwError = false; | |
try { | |
lineNumber = err.lineNumber || (err.line || "Not available"); | |
} catch (e) { | |
lineNumber = "Not available"; | |
threwError = true; | |
} | |
try { | |
fileName = err.fileName || (err.filename || (err.sourceURL || (goog.global["$googDebugFname"] || href))); | |
} catch (e) { | |
fileName = "Not available"; | |
threwError = true; | |
} | |
if (threwError || (!err.lineNumber || (!err.fileName || (!err.stack || (!err.message || !err.name))))) { | |
return{"message":err.message || "Not available", "name":err.name || "UnknownError", "lineNumber":lineNumber, "fileName":fileName, "stack":err.stack || "Not available"}; | |
} | |
return err; | |
}; | |
goog.debug.enhanceError = function(err, opt_message) { | |
var error = typeof err == "string" ? Error(err) : err; | |
if (!error.stack) { | |
error.stack = goog.debug.getStacktrace(arguments.callee.caller); | |
} | |
if (opt_message) { | |
var x = 0; | |
while (error["message" + x]) { | |
++x; | |
} | |
error["message" + x] = String(opt_message); | |
} | |
return error; | |
}; | |
goog.debug.getStacktraceSimple = function(opt_depth) { | |
var sb = []; | |
var fn = arguments.callee.caller; | |
var depth = 0; | |
while (fn && (!opt_depth || depth < opt_depth)) { | |
sb.push(goog.debug.getFunctionName(fn)); | |
sb.push("()\n"); | |
try { | |
fn = fn.caller; | |
} catch (e) { | |
sb.push("[exception trying to get caller]\n"); | |
break; | |
} | |
depth++; | |
if (depth >= goog.debug.MAX_STACK_DEPTH) { | |
sb.push("[...long stack...]"); | |
break; | |
} | |
} | |
if (opt_depth && depth >= opt_depth) { | |
sb.push("[...reached max depth limit...]"); | |
} else { | |
sb.push("[end]"); | |
} | |
return sb.join(""); | |
}; | |
goog.debug.MAX_STACK_DEPTH = 50; | |
goog.debug.getStacktrace = function(opt_fn) { | |
return goog.debug.getStacktraceHelper_(opt_fn || arguments.callee.caller, []); | |
}; | |
goog.debug.getStacktraceHelper_ = function(fn, visited) { | |
var sb = []; | |
if (goog.array.contains(visited, fn)) { | |
sb.push("[...circular reference...]"); | |
} else { | |
if (fn && visited.length < goog.debug.MAX_STACK_DEPTH) { | |
sb.push(goog.debug.getFunctionName(fn) + "("); | |
var args = fn.arguments; | |
for (var i = 0;args && i < args.length;i++) { | |
if (i > 0) { | |
sb.push(", "); | |
} | |
var argDesc; | |
var arg = args[i]; | |
switch(typeof arg) { | |
case "object": | |
argDesc = arg ? "object" : "null"; | |
break; | |
case "string": | |
argDesc = arg; | |
break; | |
case "number": | |
argDesc = String(arg); | |
break; | |
case "boolean": | |
argDesc = arg ? "true" : "false"; | |
break; | |
case "function": | |
argDesc = goog.debug.getFunctionName(arg); | |
argDesc = argDesc ? argDesc : "[fn]"; | |
break; | |
case "undefined": | |
; | |
default: | |
argDesc = typeof arg; | |
break; | |
} | |
if (argDesc.length > 40) { | |
argDesc = argDesc.substr(0, 40) + "..."; | |
} | |
sb.push(argDesc); | |
} | |
visited.push(fn); | |
sb.push(")\n"); | |
try { | |
sb.push(goog.debug.getStacktraceHelper_(fn.caller, visited)); | |
} catch (e) { | |
sb.push("[exception trying to get caller]\n"); | |
} | |
} else { | |
if (fn) { | |
sb.push("[...long stack...]"); | |
} else { | |
sb.push("[end]"); | |
} | |
} | |
} | |
return sb.join(""); | |
}; | |
goog.debug.setFunctionResolver = function(resolver) { | |
goog.debug.fnNameResolver_ = resolver; | |
}; | |
goog.debug.getFunctionName = function(fn) { | |
if (goog.debug.fnNameCache_[fn]) { | |
return goog.debug.fnNameCache_[fn]; | |
} | |
if (goog.debug.fnNameResolver_) { | |
var name = goog.debug.fnNameResolver_(fn); | |
if (name) { | |
goog.debug.fnNameCache_[fn] = name; | |
return name; | |
} | |
} | |
var functionSource = String(fn); | |
if (!goog.debug.fnNameCache_[functionSource]) { | |
var matches = /function ([^\(]+)/.exec(functionSource); | |
if (matches) { | |
var method = matches[1]; | |
goog.debug.fnNameCache_[functionSource] = method; | |
} else { | |
goog.debug.fnNameCache_[functionSource] = "[Anonymous]"; | |
} | |
} | |
return goog.debug.fnNameCache_[functionSource]; | |
}; | |
goog.debug.makeWhitespaceVisible = function(string) { | |
return string.replace(/ /g, "[_]").replace(/\f/g, "[f]").replace(/\n/g, "[n]\n").replace(/\r/g, "[r]").replace(/\t/g, "[t]"); | |
}; | |
goog.debug.fnNameCache_ = {}; | |
goog.debug.fnNameResolver_; | |
goog.provide("goog.debug.LogRecord"); | |
goog.debug.LogRecord = function(level, msg, loggerName, opt_time, opt_sequenceNumber) { | |
this.reset(level, msg, loggerName, opt_time, opt_sequenceNumber); | |
}; | |
goog.debug.LogRecord.prototype.time_; | |
goog.debug.LogRecord.prototype.level_; | |
goog.debug.LogRecord.prototype.msg_; | |
goog.debug.LogRecord.prototype.loggerName_; | |
goog.debug.LogRecord.prototype.sequenceNumber_ = 0; | |
goog.debug.LogRecord.prototype.exception_ = null; | |
goog.debug.LogRecord.prototype.exceptionText_ = null; | |
goog.define("goog.debug.LogRecord.ENABLE_SEQUENCE_NUMBERS", true); | |
goog.debug.LogRecord.nextSequenceNumber_ = 0; | |
goog.debug.LogRecord.prototype.reset = function(level, msg, loggerName, opt_time, opt_sequenceNumber) { | |
if (goog.debug.LogRecord.ENABLE_SEQUENCE_NUMBERS) { | |
this.sequenceNumber_ = typeof opt_sequenceNumber == "number" ? opt_sequenceNumber : goog.debug.LogRecord.nextSequenceNumber_++; | |
} | |
this.time_ = opt_time || goog.now(); | |
this.level_ = level; | |
this.msg_ = msg; | |
this.loggerName_ = loggerName; | |
delete this.exception_; | |
delete this.exceptionText_; | |
}; | |
goog.debug.LogRecord.prototype.getLoggerName = function() { | |
return this.loggerName_; | |
}; | |
goog.debug.LogRecord.prototype.getException = function() { | |
return this.exception_; | |
}; | |
goog.debug.LogRecord.prototype.setException = function(exception) { | |
this.exception_ = exception; | |
}; | |
goog.debug.LogRecord.prototype.getExceptionText = function() { | |
return this.exceptionText_; | |
}; | |
goog.debug.LogRecord.prototype.setExceptionText = function(text) { | |
this.exceptionText_ = text; | |
}; | |
goog.debug.LogRecord.prototype.setLoggerName = function(loggerName) { | |
this.loggerName_ = loggerName; | |
}; | |
goog.debug.LogRecord.prototype.getLevel = function() { | |
return this.level_; | |
}; | |
goog.debug.LogRecord.prototype.setLevel = function(level) { | |
this.level_ = level; | |
}; | |
goog.debug.LogRecord.prototype.getMessage = function() { | |
return this.msg_; | |
}; | |
goog.debug.LogRecord.prototype.setMessage = function(msg) { | |
this.msg_ = msg; | |
}; | |
goog.debug.LogRecord.prototype.getMillis = function() { | |
return this.time_; | |
}; | |
goog.debug.LogRecord.prototype.setMillis = function(time) { | |
this.time_ = time; | |
}; | |
goog.debug.LogRecord.prototype.getSequenceNumber = function() { | |
return this.sequenceNumber_; | |
}; | |
goog.provide("goog.debug.LogBuffer"); | |
goog.require("goog.asserts"); | |
goog.require("goog.debug.LogRecord"); | |
goog.debug.LogBuffer = function() { | |
goog.asserts.assert(goog.debug.LogBuffer.isBufferingEnabled(), "Cannot use goog.debug.LogBuffer without defining " + "goog.debug.LogBuffer.CAPACITY."); | |
this.clear(); | |
}; | |
goog.debug.LogBuffer.getInstance = function() { | |
if (!goog.debug.LogBuffer.instance_) { | |
goog.debug.LogBuffer.instance_ = new goog.debug.LogBuffer; | |
} | |
return goog.debug.LogBuffer.instance_; | |
}; | |
goog.define("goog.debug.LogBuffer.CAPACITY", 0); | |
goog.debug.LogBuffer.prototype.buffer_; | |
goog.debug.LogBuffer.prototype.curIndex_; | |
goog.debug.LogBuffer.prototype.isFull_; | |
goog.debug.LogBuffer.prototype.addRecord = function(level, msg, loggerName) { | |
var curIndex = (this.curIndex_ + 1) % goog.debug.LogBuffer.CAPACITY; | |
this.curIndex_ = curIndex; | |
if (this.isFull_) { | |
var ret = this.buffer_[curIndex]; | |
ret.reset(level, msg, loggerName); | |
return ret; | |
} | |
this.isFull_ = curIndex == goog.debug.LogBuffer.CAPACITY - 1; | |
return this.buffer_[curIndex] = new goog.debug.LogRecord(level, msg, loggerName); | |
}; | |
goog.debug.LogBuffer.isBufferingEnabled = function() { | |
return goog.debug.LogBuffer.CAPACITY > 0; | |
}; | |
goog.debug.LogBuffer.prototype.clear = function() { | |
this.buffer_ = new Array(goog.debug.LogBuffer.CAPACITY); | |
this.curIndex_ = -1; | |
this.isFull_ = false; | |
}; | |
goog.debug.LogBuffer.prototype.forEachRecord = function(func) { | |
var buffer = this.buffer_; | |
if (!buffer[0]) { | |
return; | |
} | |
var curIndex = this.curIndex_; | |
var i = this.isFull_ ? curIndex : -1; | |
do { | |
i = (i + 1) % goog.debug.LogBuffer.CAPACITY; | |
func((buffer[i])); | |
} while (i != curIndex); | |
}; | |
goog.provide("goog.debug.LogManager"); | |
goog.provide("goog.debug.Loggable"); | |
goog.provide("goog.debug.Logger"); | |
goog.provide("goog.debug.Logger.Level"); | |
goog.require("goog.array"); | |
goog.require("goog.asserts"); | |
goog.require("goog.debug"); | |
goog.require("goog.debug.LogBuffer"); | |
goog.require("goog.debug.LogRecord"); | |
goog.debug.Loggable; | |
goog.debug.Logger = function(name) { | |
this.name_ = name; | |
this.parent_ = null; | |
this.level_ = null; | |
this.children_ = null; | |
this.handlers_ = null; | |
}; | |
goog.define("goog.debug.Logger.ENABLE_HIERARCHY", true); | |
if (!goog.debug.Logger.ENABLE_HIERARCHY) { | |
goog.debug.Logger.rootHandlers_ = []; | |
goog.debug.Logger.rootLevel_; | |
} | |
goog.debug.Logger.Level = function(name, value) { | |
this.name = name; | |
this.value = value; | |
}; | |
goog.debug.Logger.Level.prototype.toString = function() { | |
return this.name; | |
}; | |
goog.debug.Logger.Level.OFF = new goog.debug.Logger.Level("OFF", Infinity); | |
goog.debug.Logger.Level.SHOUT = new goog.debug.Logger.Level("SHOUT", 1200); | |
goog.debug.Logger.Level.SEVERE = new goog.debug.Logger.Level("SEVERE", 1E3); | |
goog.debug.Logger.Level.WARNING = new goog.debug.Logger.Level("WARNING", 900); | |
goog.debug.Logger.Level.INFO = new goog.debug.Logger.Level("INFO", 800); | |
goog.debug.Logger.Level.CONFIG = new goog.debug.Logger.Level("CONFIG", 700); | |
goog.debug.Logger.Level.FINE = new goog.debug.Logger.Level("FINE", 500); | |
goog.debug.Logger.Level.FINER = new goog.debug.Logger.Level("FINER", 400); | |
goog.debug.Logger.Level.FINEST = new goog.debug.Logger.Level("FINEST", 300); | |
goog.debug.Logger.Level.ALL = new goog.debug.Logger.Level("ALL", 0); | |
goog.debug.Logger.Level.PREDEFINED_LEVELS = [goog.debug.Logger.Level.OFF, goog.debug.Logger.Level.SHOUT, goog.debug.Logger.Level.SEVERE, goog.debug.Logger.Level.WARNING, goog.debug.Logger.Level.INFO, goog.debug.Logger.Level.CONFIG, goog.debug.Logger.Level.FINE, goog.debug.Logger.Level.FINER, goog.debug.Logger.Level.FINEST, goog.debug.Logger.Level.ALL]; | |
goog.debug.Logger.Level.predefinedLevelsCache_ = null; | |
goog.debug.Logger.Level.createPredefinedLevelsCache_ = function() { | |
goog.debug.Logger.Level.predefinedLevelsCache_ = {}; | |
for (var i = 0, level;level = goog.debug.Logger.Level.PREDEFINED_LEVELS[i];i++) { | |
goog.debug.Logger.Level.predefinedLevelsCache_[level.value] = level; | |
goog.debug.Logger.Level.predefinedLevelsCache_[level.name] = level; | |
} | |
}; | |
goog.debug.Logger.Level.getPredefinedLevel = function(name) { | |
if (!goog.debug.Logger.Level.predefinedLevelsCache_) { | |
goog.debug.Logger.Level.createPredefinedLevelsCache_(); | |
} | |
return goog.debug.Logger.Level.predefinedLevelsCache_[name] || null; | |
}; | |
goog.debug.Logger.Level.getPredefinedLevelByValue = function(value) { | |
if (!goog.debug.Logger.Level.predefinedLevelsCache_) { | |
goog.debug.Logger.Level.createPredefinedLevelsCache_(); | |
} | |
if (value in goog.debug.Logger.Level.predefinedLevelsCache_) { | |
return goog.debug.Logger.Level.predefinedLevelsCache_[value]; | |
} | |
for (var i = 0;i < goog.debug.Logger.Level.PREDEFINED_LEVELS.length;++i) { | |
var level = goog.debug.Logger.Level.PREDEFINED_LEVELS[i]; | |
if (level.value <= value) { | |
return level; | |
} | |
} | |
return null; | |
}; | |
goog.debug.Logger.getLogger = function(name) { | |
return goog.debug.LogManager.getLogger(name); | |
}; | |
goog.debug.Logger.logToProfilers = function(msg) { | |
if (goog.global["console"]) { | |
if (goog.global["console"]["timeStamp"]) { | |
goog.global["console"]["timeStamp"](msg); | |
} else { | |
if (goog.global["console"]["markTimeline"]) { | |
goog.global["console"]["markTimeline"](msg); | |
} | |
} | |
} | |
if (goog.global["msWriteProfilerMark"]) { | |
goog.global["msWriteProfilerMark"](msg); | |
} | |
}; | |
goog.debug.Logger.prototype.getName = function() { | |
return this.name_; | |
}; | |
goog.debug.Logger.prototype.addHandler = function(handler) { | |
if (goog.debug.LOGGING_ENABLED) { | |
if (goog.debug.Logger.ENABLE_HIERARCHY) { | |
if (!this.handlers_) { | |
this.handlers_ = []; | |
} | |
this.handlers_.push(handler); | |
} else { | |
goog.asserts.assert(!this.name_, "Cannot call addHandler on a non-root logger when " + "goog.debug.Logger.ENABLE_HIERARCHY is false."); | |
goog.debug.Logger.rootHandlers_.push(handler); | |
} | |
} | |
}; | |
goog.debug.Logger.prototype.removeHandler = function(handler) { | |
if (goog.debug.LOGGING_ENABLED) { | |
var handlers = goog.debug.Logger.ENABLE_HIERARCHY ? this.handlers_ : goog.debug.Logger.rootHandlers_; | |
return!!handlers && goog.array.remove(handlers, handler); | |
} else { | |
return false; | |
} | |
}; | |
goog.debug.Logger.prototype.getParent = function() { | |
return this.parent_; | |
}; | |
goog.debug.Logger.prototype.getChildren = function() { | |
if (!this.children_) { | |
this.children_ = {}; | |
} | |
return this.children_; | |
}; | |
goog.debug.Logger.prototype.setLevel = function(level) { | |
if (goog.debug.LOGGING_ENABLED) { | |
if (goog.debug.Logger.ENABLE_HIERARCHY) { | |
this.level_ = level; | |
} else { | |
goog.asserts.assert(!this.name_, "Cannot call setLevel() on a non-root logger when " + "goog.debug.Logger.ENABLE_HIERARCHY is false."); | |
goog.debug.Logger.rootLevel_ = level; | |
} | |
} | |
}; | |
goog.debug.Logger.prototype.getLevel = function() { | |
return goog.debug.LOGGING_ENABLED ? this.level_ : goog.debug.Logger.Level.OFF; | |
}; | |
goog.debug.Logger.prototype.getEffectiveLevel = function() { | |
if (!goog.debug.LOGGING_ENABLED) { | |
return goog.debug.Logger.Level.OFF; | |
} | |
if (!goog.debug.Logger.ENABLE_HIERARCHY) { | |
return goog.debug.Logger.rootLevel_; | |
} | |
if (this.level_) { | |
return this.level_; | |
} | |
if (this.parent_) { | |
return this.parent_.getEffectiveLevel(); | |
} | |
goog.asserts.fail("Root logger has no level set."); | |
return null; | |
}; | |
goog.debug.Logger.prototype.isLoggable = function(level) { | |
return goog.debug.LOGGING_ENABLED && level.value >= this.getEffectiveLevel().value; | |
}; | |
goog.debug.Logger.prototype.log = function(level, msg, opt_exception) { | |
if (goog.debug.LOGGING_ENABLED && this.isLoggable(level)) { | |
if (goog.isFunction(msg)) { | |
msg = msg(); | |
} | |
this.doLogRecord_(this.getLogRecord(level, msg, opt_exception)); | |
} | |
}; | |
goog.debug.Logger.prototype.getLogRecord = function(level, msg, opt_exception) { | |
if (goog.debug.LogBuffer.isBufferingEnabled()) { | |
var logRecord = goog.debug.LogBuffer.getInstance().addRecord(level, msg, this.name_) | |
} else { | |
logRecord = new goog.debug.LogRecord(level, String(msg), this.name_); | |
} | |
if (opt_exception) { | |
logRecord.setException(opt_exception); | |
logRecord.setExceptionText(goog.debug.exposeException(opt_exception, arguments.callee.caller)); | |
} | |
return logRecord; | |
}; | |
goog.debug.Logger.prototype.shout = function(msg, opt_exception) { | |
if (goog.debug.LOGGING_ENABLED) { | |
this.log(goog.debug.Logger.Level.SHOUT, msg, opt_exception); | |
} | |
}; | |
goog.debug.Logger.prototype.severe = function(msg, opt_exception) { | |
if (goog.debug.LOGGING_ENABLED) { | |
this.log(goog.debug.Logger.Level.SEVERE, msg, opt_exception); | |
} | |
}; | |
goog.debug.Logger.prototype.warning = function(msg, opt_exception) { | |
if (goog.debug.LOGGING_ENABLED) { | |
this.log(goog.debug.Logger.Level.WARNING, msg, opt_exception); | |
} | |
}; | |
goog.debug.Logger.prototype.info = function(msg, opt_exception) { | |
if (goog.debug.LOGGING_ENABLED) { | |
this.log(goog.debug.Logger.Level.INFO, msg, opt_exception); | |
} | |
}; | |
goog.debug.Logger.prototype.config = function(msg, opt_exception) { | |
if (goog.debug.LOGGING_ENABLED) { | |
this.log(goog.debug.Logger.Level.CONFIG, msg, opt_exception); | |
} | |
}; | |
goog.debug.Logger.prototype.fine = function(msg, opt_exception) { | |
if (goog.debug.LOGGING_ENABLED) { | |
this.log(goog.debug.Logger.Level.FINE, msg, opt_exception); | |
} | |
}; | |
goog.debug.Logger.prototype.finer = function(msg, opt_exception) { | |
if (goog.debug.LOGGING_ENABLED) { | |
this.log(goog.debug.Logger.Level.FINER, msg, opt_exception); | |
} | |
}; | |
goog.debug.Logger.prototype.finest = function(msg, opt_exception) { | |
if (goog.debug.LOGGING_ENABLED) { | |
this.log(goog.debug.Logger.Level.FINEST, msg, opt_exception); | |
} | |
}; | |
goog.debug.Logger.prototype.logRecord = function(logRecord) { | |
if (goog.debug.LOGGING_ENABLED && this.isLoggable(logRecord.getLevel())) { | |
this.doLogRecord_(logRecord); | |
} | |
}; | |
goog.debug.Logger.prototype.doLogRecord_ = function(logRecord) { | |
goog.debug.Logger.logToProfilers("log:" + logRecord.getMessage()); | |
if (goog.debug.Logger.ENABLE_HIERARCHY) { | |
var target = this; | |
while (target) { | |
target.callPublish_(logRecord); | |
target = target.getParent(); | |
} | |
} else { | |
for (var i = 0, handler;handler = goog.debug.Logger.rootHandlers_[i++];) { | |
handler(logRecord); | |
} | |
} | |
}; | |
goog.debug.Logger.prototype.callPublish_ = function(logRecord) { | |
if (this.handlers_) { | |
for (var i = 0, handler;handler = this.handlers_[i];i++) { | |
handler(logRecord); | |
} | |
} | |
}; | |
goog.debug.Logger.prototype.setParent_ = function(parent) { | |
this.parent_ = parent; | |
}; | |
goog.debug.Logger.prototype.addChild_ = function(name, logger) { | |
this.getChildren()[name] = logger; | |
}; | |
goog.debug.LogManager = {}; | |
goog.debug.LogManager.loggers_ = {}; | |
goog.debug.LogManager.rootLogger_ = null; | |
goog.debug.LogManager.initialize = function() { | |
if (!goog.debug.LogManager.rootLogger_) { | |
goog.debug.LogManager.rootLogger_ = new goog.debug.Logger(""); | |
goog.debug.LogManager.loggers_[""] = goog.debug.LogManager.rootLogger_; | |
goog.debug.LogManager.rootLogger_.setLevel(goog.debug.Logger.Level.CONFIG); | |
} | |
}; | |
goog.debug.LogManager.getLoggers = function() { | |
return goog.debug.LogManager.loggers_; | |
}; | |
goog.debug.LogManager.getRoot = function() { | |
goog.debug.LogManager.initialize(); | |
return(goog.debug.LogManager.rootLogger_); | |
}; | |
goog.debug.LogManager.getLogger = function(name) { | |
goog.debug.LogManager.initialize(); | |
var ret = goog.debug.LogManager.loggers_[name]; | |
return ret || goog.debug.LogManager.createLogger_(name); | |
}; | |
goog.debug.LogManager.createFunctionForCatchErrors = function(opt_logger) { | |
return function(info) { | |
var logger = opt_logger || goog.debug.LogManager.getRoot(); | |
logger.severe("Error: " + info.message + " (" + info.fileName + " @ Line: " + info.line + ")"); | |
}; | |
}; | |
goog.debug.LogManager.createLogger_ = function(name) { | |
var logger = new goog.debug.Logger(name); | |
if (goog.debug.Logger.ENABLE_HIERARCHY) { | |
var lastDotIndex = name.lastIndexOf("."); | |
var parentName = name.substr(0, lastDotIndex); | |
var leafName = name.substr(lastDotIndex + 1); | |
var parentLogger = goog.debug.LogManager.getLogger(parentName); | |
parentLogger.addChild_(leafName, logger); | |
logger.setParent_(parentLogger); | |
} | |
goog.debug.LogManager.loggers_[name] = logger; | |
return logger; | |
}; | |
goog.provide("goog.log"); | |
goog.provide("goog.log.Level"); | |
goog.provide("goog.log.LogRecord"); | |
goog.provide("goog.log.Logger"); | |
goog.require("goog.debug"); | |
goog.require("goog.debug.LogManager"); | |
goog.require("goog.debug.LogRecord"); | |
goog.require("goog.debug.Logger"); | |
goog.define("goog.log.ENABLED", goog.debug.LOGGING_ENABLED); | |
goog.log.Logger = goog.debug.Logger; | |
goog.log.Level = goog.debug.Logger.Level; | |
goog.log.LogRecord = goog.debug.LogRecord; | |
goog.log.getLogger = function(name, opt_level) { | |
if (goog.log.ENABLED) { | |
var logger = goog.debug.LogManager.getLogger(name); | |
if (opt_level && logger) { | |
logger.setLevel(opt_level); | |
} | |
return logger; | |
} else { | |
return null; | |
} | |
}; | |
goog.log.addHandler = function(logger, handler) { | |
if (goog.log.ENABLED && logger) { | |
logger.addHandler(handler); | |
} | |
}; | |
goog.log.removeHandler = function(logger, handler) { | |
if (goog.log.ENABLED && logger) { | |
return logger.removeHandler(handler); | |
} else { | |
return false; | |
} | |
}; | |
goog.log.log = function(logger, level, msg, opt_exception) { | |
if (goog.log.ENABLED && logger) { | |
logger.log(level, msg, opt_exception); | |
} | |
}; | |
goog.log.error = function(logger, msg, opt_exception) { | |
if (goog.log.ENABLED && logger) { | |
logger.severe(msg, opt_exception); | |
} | |
}; | |
goog.log.warning = function(logger, msg, opt_exception) { | |
if (goog.log.ENABLED && logger) { | |
logger.warning(msg, opt_exception); | |
} | |
}; | |
goog.log.info = function(logger, msg, opt_exception) { | |
if (goog.log.ENABLED && logger) { | |
logger.info(msg, opt_exception); | |
} | |
}; | |
goog.log.fine = function(logger, msg, opt_exception) { | |
if (goog.log.ENABLED && logger) { | |
logger.fine(msg, opt_exception); | |
} | |
}; | |
goog.provide("goog.net.XhrIo"); | |
goog.provide("goog.net.XhrIo.ResponseType"); | |
goog.require("goog.Timer"); | |
goog.require("goog.array"); | |
goog.require("goog.debug.entryPointRegistry"); | |
goog.require("goog.events.EventTarget"); | |
goog.require("goog.json"); | |
goog.require("goog.log"); | |
goog.require("goog.net.ErrorCode"); | |
goog.require("goog.net.EventType"); | |
goog.require("goog.net.HttpStatus"); | |
goog.require("goog.net.XmlHttp"); | |
goog.require("goog.object"); | |
goog.require("goog.string"); | |
goog.require("goog.structs"); | |
goog.require("goog.structs.Map"); | |
goog.require("goog.uri.utils"); | |
goog.require("goog.userAgent"); | |
goog.net.XhrIo = function(opt_xmlHttpFactory) { | |
goog.net.XhrIo.base(this, "constructor"); | |
this.headers = new goog.structs.Map; | |
this.xmlHttpFactory_ = opt_xmlHttpFactory || null; | |
this.active_ = false; | |
this.xhr_ = null; | |
this.xhrOptions_ = null; | |
this.lastUri_ = ""; | |
this.lastMethod_ = ""; | |
this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR; | |
this.lastError_ = ""; | |
this.errorDispatched_ = false; | |
this.inSend_ = false; | |
this.inOpen_ = false; | |
this.inAbort_ = false; | |
this.timeoutInterval_ = 0; | |
this.timeoutId_ = null; | |
this.responseType_ = goog.net.XhrIo.ResponseType.DEFAULT; | |
this.withCredentials_ = false; | |
this.useXhr2Timeout_ = false; | |
}; | |
goog.inherits(goog.net.XhrIo, goog.events.EventTarget); | |
goog.net.XhrIo.ResponseType = {DEFAULT:"", TEXT:"text", DOCUMENT:"document", BLOB:"blob", ARRAY_BUFFER:"arraybuffer"}; | |
goog.net.XhrIo.prototype.logger_ = goog.log.getLogger("goog.net.XhrIo"); | |
goog.net.XhrIo.CONTENT_TYPE_HEADER = "Content-Type"; | |
goog.net.XhrIo.HTTP_SCHEME_PATTERN = /^https?$/i; | |
goog.net.XhrIo.METHODS_WITH_FORM_DATA = ["POST", "PUT"]; | |
goog.net.XhrIo.FORM_CONTENT_TYPE = "application/x-www-form-urlencoded;charset=utf-8"; | |
goog.net.XhrIo.XHR2_TIMEOUT_ = "timeout"; | |
goog.net.XhrIo.XHR2_ON_TIMEOUT_ = "ontimeout"; | |
goog.net.XhrIo.sendInstances_ = []; | |
goog.net.XhrIo.send = function(url, opt_callback, opt_method, opt_content, opt_headers, opt_timeoutInterval, opt_withCredentials) { | |
var x = new goog.net.XhrIo; | |
goog.net.XhrIo.sendInstances_.push(x); | |
if (opt_callback) { | |
x.listen(goog.net.EventType.COMPLETE, opt_callback); | |
} | |
x.listenOnce(goog.net.EventType.READY, x.cleanupSend_); | |
if (opt_timeoutInterval) { | |
x.setTimeoutInterval(opt_timeoutInterval); | |
} | |
if (opt_withCredentials) { | |
x.setWithCredentials(opt_withCredentials); | |
} | |
x.send(url, opt_method, opt_content, opt_headers); | |
}; | |
goog.net.XhrIo.cleanup = function() { | |
var instances = goog.net.XhrIo.sendInstances_; | |
while (instances.length) { | |
instances.pop().dispose(); | |
} | |
}; | |
goog.net.XhrIo.protectEntryPoints = function(errorHandler) { | |
goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = errorHandler.protectEntryPoint(goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_); | |
}; | |
goog.net.XhrIo.prototype.cleanupSend_ = function() { | |
this.dispose(); | |
goog.array.remove(goog.net.XhrIo.sendInstances_, this); | |
}; | |
goog.net.XhrIo.prototype.getTimeoutInterval = function() { | |
return this.timeoutInterval_; | |
}; | |
goog.net.XhrIo.prototype.setTimeoutInterval = function(ms) { | |
this.timeoutInterval_ = Math.max(0, ms); | |
}; | |
goog.net.XhrIo.prototype.setResponseType = function(type) { | |
this.responseType_ = type; | |
}; | |
goog.net.XhrIo.prototype.getResponseType = function() { | |
return this.responseType_; | |
}; | |
goog.net.XhrIo.prototype.setWithCredentials = function(withCredentials) { | |
this.withCredentials_ = withCredentials; | |
}; | |
goog.net.XhrIo.prototype.getWithCredentials = function() { | |
return this.withCredentials_; | |
}; | |
goog.net.XhrIo.prototype.send = function(url, opt_method, opt_content, opt_headers) { | |
if (this.xhr_) { | |
throw Error("[goog.net.XhrIo] Object is active with another request=" + this.lastUri_ + "; newUri=" + url); | |
} | |
var method = opt_method ? opt_method.toUpperCase() : "GET"; | |
this.lastUri_ = url; | |
this.lastError_ = ""; | |
this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR; | |
this.lastMethod_ = method; | |
this.errorDispatched_ = false; | |
this.active_ = true; | |
this.xhr_ = this.createXhr(); | |
this.xhrOptions_ = this.xmlHttpFactory_ ? this.xmlHttpFactory_.getOptions() : goog.net.XmlHttp.getOptions(); | |
this.xhr_.onreadystatechange = goog.bind(this.onReadyStateChange_, this); | |
try { | |
goog.log.fine(this.logger_, this.formatMsg_("Opening Xhr")); | |
this.inOpen_ = true; | |
this.xhr_.open(method, String(url), true); | |
this.inOpen_ = false; | |
} catch (err) { | |
goog.log.fine(this.logger_, this.formatMsg_("Error opening Xhr: " + err.message)); | |
this.error_(goog.net.ErrorCode.EXCEPTION, err); | |
return; | |
} | |
var content = opt_content || ""; | |
var headers = this.headers.clone(); | |
if (opt_headers) { | |
goog.structs.forEach(opt_headers, function(value, key) { | |
headers.set(key, value); | |
}); | |
} | |
var contentTypeKey = goog.array.find(headers.getKeys(), goog.net.XhrIo.isContentTypeHeader_); | |
var contentIsFormData = goog.global["FormData"] && content instanceof goog.global["FormData"]; | |
if (goog.array.contains(goog.net.XhrIo.METHODS_WITH_FORM_DATA, method) && (!contentTypeKey && !contentIsFormData)) { | |
headers.set(goog.net.XhrIo.CONTENT_TYPE_HEADER, goog.net.XhrIo.FORM_CONTENT_TYPE); | |
} | |
goog.structs.forEach(headers, function(value, key) { | |
this.xhr_.setRequestHeader(key, value); | |
}, this); | |
if (this.responseType_) { | |
this.xhr_.responseType = this.responseType_; | |
} | |
if (goog.object.containsKey(this.xhr_, "withCredentials")) { | |
this.xhr_.withCredentials = this.withCredentials_; | |
} | |
try { | |
this.cleanUpTimeoutTimer_(); | |
if (this.timeoutInterval_ > 0) { | |
this.useXhr2Timeout_ = goog.net.XhrIo.shouldUseXhr2Timeout_(this.xhr_); | |
goog.log.fine(this.logger_, this.formatMsg_("Will abort after " + this.timeoutInterval_ + "ms if incomplete, xhr2 " + this.useXhr2Timeout_)); | |
if (this.useXhr2Timeout_) { | |
this.xhr_[goog.net.XhrIo.XHR2_TIMEOUT_] = this.timeoutInterval_; | |
this.xhr_[goog.net.XhrIo.XHR2_ON_TIMEOUT_] = goog.bind(this.timeout_, this); | |
} else { | |
this.timeoutId_ = goog.Timer.callOnce(this.timeout_, this.timeoutInterval_, this); | |
} | |
} | |
goog.log.fine(this.logger_, this.formatMsg_("Sending request")); | |
this.inSend_ = true; | |
this.xhr_.send(content); | |
this.inSend_ = false; | |
} catch (err) { | |
goog.log.fine(this.logger_, this.formatMsg_("Send error: " + err.message)); | |
this.error_(goog.net.ErrorCode.EXCEPTION, err); | |
} | |
}; | |
goog.net.XhrIo.shouldUseXhr2Timeout_ = function(xhr) { | |
return goog.userAgent.IE && (goog.userAgent.isVersionOrHigher(9) && (goog.isNumber(xhr[goog.net.XhrIo.XHR2_TIMEOUT_]) && goog.isDef(xhr[goog.net.XhrIo.XHR2_ON_TIMEOUT_]))); | |
}; | |
goog.net.XhrIo.isContentTypeHeader_ = function(header) { | |
return goog.string.caseInsensitiveEquals(goog.net.XhrIo.CONTENT_TYPE_HEADER, header); | |
}; | |
goog.net.XhrIo.prototype.createXhr = function() { | |
return this.xmlHttpFactory_ ? this.xmlHttpFactory_.createInstance() : goog.net.XmlHttp(); | |
}; | |
goog.net.XhrIo.prototype.timeout_ = function() { | |
if (typeof goog == "undefined") { | |
} else { | |
if (this.xhr_) { | |
this.lastError_ = "Timed out after " + this.timeoutInterval_ + "ms, aborting"; | |
this.lastErrorCode_ = goog.net.ErrorCode.TIMEOUT; | |
goog.log.fine(this.logger_, this.formatMsg_(this.lastError_)); | |
this.dispatchEvent(goog.net.EventType.TIMEOUT); | |
this.abort(goog.net.ErrorCode.TIMEOUT); | |
} | |
} | |
}; | |
goog.net.XhrIo.prototype.error_ = function(errorCode, err) { | |
this.active_ = false; | |
if (this.xhr_) { | |
this.inAbort_ = true; | |
this.xhr_.abort(); | |
this.inAbort_ = false; | |
} | |
this.lastError_ = err; | |
this.lastErrorCode_ = errorCode; | |
this.dispatchErrors_(); | |
this.cleanUpXhr_(); | |
}; | |
goog.net.XhrIo.prototype.dispatchErrors_ = function() { | |
if (!this.errorDispatched_) { | |
this.errorDispatched_ = true; | |
this.dispatchEvent(goog.net.EventType.COMPLETE); | |
this.dispatchEvent(goog.net.EventType.ERROR); | |
} | |
}; | |
goog.net.XhrIo.prototype.abort = function(opt_failureCode) { | |
if (this.xhr_ && this.active_) { | |
goog.log.fine(this.logger_, this.formatMsg_("Aborting")); | |
this.active_ = false; | |
this.inAbort_ = true; | |
this.xhr_.abort(); | |
this.inAbort_ = false; | |
this.lastErrorCode_ = opt_failureCode || goog.net.ErrorCode.ABORT; | |
this.dispatchEvent(goog.net.EventType.COMPLETE); | |
this.dispatchEvent(goog.net.EventType.ABORT); | |
this.cleanUpXhr_(); | |
} | |
}; | |
goog.net.XhrIo.prototype.disposeInternal = function() { | |
if (this.xhr_) { | |
if (this.active_) { | |
this.active_ = false; | |
this.inAbort_ = true; | |
this.xhr_.abort(); | |
this.inAbort_ = false; | |
} | |
this.cleanUpXhr_(true); | |
} | |
goog.net.XhrIo.base(this, "disposeInternal"); | |
}; | |
goog.net.XhrIo.prototype.onReadyStateChange_ = function() { | |
if (this.isDisposed()) { | |
return; | |
} | |
if (!this.inOpen_ && (!this.inSend_ && !this.inAbort_)) { | |
this.onReadyStateChangeEntryPoint_(); | |
} else { | |
this.onReadyStateChangeHelper_(); | |
} | |
}; | |
goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = function() { | |
this.onReadyStateChangeHelper_(); | |
}; | |
goog.net.XhrIo.prototype.onReadyStateChangeHelper_ = function() { | |
if (!this.active_) { | |
return; | |
} | |
if (typeof goog == "undefined") { | |
} else { | |
if (this.xhrOptions_[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR] && (this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE && this.getStatus() == 2)) { | |
goog.log.fine(this.logger_, this.formatMsg_("Local request error detected and ignored")); | |
} else { | |
if (this.inSend_ && this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE) { | |
goog.Timer.callOnce(this.onReadyStateChange_, 0, this); | |
return; | |
} | |
this.dispatchEvent(goog.net.EventType.READY_STATE_CHANGE); | |
if (this.isComplete()) { | |
goog.log.fine(this.logger_, this.formatMsg_("Request complete")); | |
this.active_ = false; | |
try { | |
if (this.isSuccess()) { | |
this.dispatchEvent(goog.net.EventType.COMPLETE); | |
this.dispatchEvent(goog.net.EventType.SUCCESS); | |
} else { | |
this.lastErrorCode_ = goog.net.ErrorCode.HTTP_ERROR; | |
this.lastError_ = this.getStatusText() + " [" + this.getStatus() + "]"; | |
this.dispatchErrors_(); | |
} | |
} finally { | |
this.cleanUpXhr_(); | |
} | |
} | |
} | |
} | |
}; | |
goog.net.XhrIo.prototype.cleanUpXhr_ = function(opt_fromDispose) { | |
if (this.xhr_) { | |
this.cleanUpTimeoutTimer_(); | |
var xhr = this.xhr_; | |
var clearedOnReadyStateChange = this.xhrOptions_[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] ? goog.nullFunction : null; | |
this.xhr_ = null; | |
this.xhrOptions_ = null; | |
if (!opt_fromDispose) { | |
this.dispatchEvent(goog.net.EventType.READY); | |
} | |
try { | |
xhr.onreadystatechange = clearedOnReadyStateChange; | |
} catch (e) { | |
goog.log.error(this.logger_, "Problem encountered resetting onreadystatechange: " + e.message); | |
} | |
} | |
}; | |
goog.net.XhrIo.prototype.cleanUpTimeoutTimer_ = function() { | |
if (this.xhr_ && this.useXhr2Timeout_) { | |
this.xhr_[goog.net.XhrIo.XHR2_ON_TIMEOUT_] = null; | |
} | |
if (goog.isNumber(this.timeoutId_)) { | |
goog.Timer.clear(this.timeoutId_); | |
this.timeoutId_ = null; | |
} | |
}; | |
goog.net.XhrIo.prototype.isActive = function() { | |
return!!this.xhr_; | |
}; | |
goog.net.XhrIo.prototype.isComplete = function() { | |
return this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE; | |
}; | |
goog.net.XhrIo.prototype.isSuccess = function() { | |
var status = this.getStatus(); | |
return goog.net.HttpStatus.isSuccess(status) || status === 0 && !this.isLastUriEffectiveSchemeHttp_(); | |
}; | |
goog.net.XhrIo.prototype.isLastUriEffectiveSchemeHttp_ = function() { | |
var scheme = goog.uri.utils.getEffectiveScheme(String(this.lastUri_)); | |
return goog.net.XhrIo.HTTP_SCHEME_PATTERN.test(scheme); | |
}; | |
goog.net.XhrIo.prototype.getReadyState = function() { | |
return this.xhr_ ? (this.xhr_.readyState) : goog.net.XmlHttp.ReadyState.UNINITIALIZED; | |
}; | |
goog.net.XhrIo.prototype.getStatus = function() { | |
try { | |
return this.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ? this.xhr_.status : -1; | |
} catch (e) { | |
return-1; | |
} | |
}; | |
goog.net.XhrIo.prototype.getStatusText = function() { | |
try { | |
return this.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ? this.xhr_.statusText : ""; | |
} catch (e) { | |
goog.log.fine(this.logger_, "Can not get status: " + e.message); | |
return ""; | |
} | |
}; | |
goog.net.XhrIo.prototype.getLastUri = function() { | |
return String(this.lastUri_); | |
}; | |
goog.net.XhrIo.prototype.getResponseText = function() { | |
try { | |
return this.xhr_ ? this.xhr_.responseText : ""; | |
} catch (e) { | |
goog.log.fine(this.logger_, "Can not get responseText: " + e.message); | |
return ""; | |
} | |
}; | |
goog.net.XhrIo.prototype.getResponseBody = function() { | |
try { | |
if (this.xhr_ && "responseBody" in this.xhr_) { | |
return this.xhr_["responseBody"]; | |
} | |
} catch (e) { | |
goog.log.fine(this.logger_, "Can not get responseBody: " + e.message); | |
} | |
return null; | |
}; | |
goog.net.XhrIo.prototype.getResponseXml = function() { | |
try { | |
return this.xhr_ ? this.xhr_.responseXML : null; | |
} catch (e) { | |
goog.log.fine(this.logger_, "Can not get responseXML: " + e.message); | |
return null; | |
} | |
}; | |
goog.net.XhrIo.prototype.getResponseJson = function(opt_xssiPrefix) { | |
if (!this.xhr_) { | |
return undefined; | |
} | |
var responseText = this.xhr_.responseText; | |
if (opt_xssiPrefix && responseText.indexOf(opt_xssiPrefix) == 0) { | |
responseText = responseText.substring(opt_xssiPrefix.length); | |
} | |
return goog.json.parse(responseText); | |
}; | |
goog.net.XhrIo.prototype.getResponse = function() { | |
try { | |
if (!this.xhr_) { | |
return null; | |
} | |
if ("response" in this.xhr_) { | |
return this.xhr_.response; | |
} | |
switch(this.responseType_) { | |
case goog.net.XhrIo.ResponseType.DEFAULT: | |
; | |
case goog.net.XhrIo.ResponseType.TEXT: | |
return this.xhr_.responseText; | |
case goog.net.XhrIo.ResponseType.ARRAY_BUFFER: | |
if ("mozResponseArrayBuffer" in this.xhr_) { | |
return this.xhr_.mozResponseArrayBuffer; | |
} | |
; | |
} | |
goog.log.error(this.logger_, "Response type " + this.responseType_ + " is not " + "supported on this browser"); | |
return null; | |
} catch (e) { | |
goog.log.fine(this.logger_, "Can not get response: " + e.message); | |
return null; | |
} | |
}; | |
goog.net.XhrIo.prototype.getResponseHeader = function(key) { | |
return this.xhr_ && this.isComplete() ? this.xhr_.getResponseHeader(key) : undefined; | |
}; | |
goog.net.XhrIo.prototype.getAllResponseHeaders = function() { | |
return this.xhr_ && this.isComplete() ? this.xhr_.getAllResponseHeaders() : ""; | |
}; | |
goog.net.XhrIo.prototype.getResponseHeaders = function() { | |
var headersObject = {}; | |
var headersArray = this.getAllResponseHeaders().split("\r\n"); | |
for (var i = 0;i < headersArray.length;i++) { | |
if (goog.string.isEmpty(headersArray[i])) { | |
continue; | |
} | |
var keyValue = goog.string.splitLimit(headersArray[i], ": ", 2); | |
if (headersObject[keyValue[0]]) { | |
headersObject[keyValue[0]] += ", " + keyValue[1]; | |
} else { | |
headersObject[keyValue[0]] = keyValue[1]; | |
} | |
} | |
return headersObject; | |
}; | |
goog.net.XhrIo.prototype.getLastErrorCode = function() { | |
return this.lastErrorCode_; | |
}; | |
goog.net.XhrIo.prototype.getLastError = function() { | |
return goog.isString(this.lastError_) ? this.lastError_ : String(this.lastError_); | |
}; | |
goog.net.XhrIo.prototype.formatMsg_ = function(msg) { | |
return msg + " [" + this.lastMethod_ + " " + this.lastUri_ + " " + this.getStatus() + "]"; | |
}; | |
goog.debug.entryPointRegistry.register(function(transformer) { | |
goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = transformer(goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_); | |
}); | |
goog.provide("fb.simplelogin.transports.XHR"); | |
goog.provide("fb.simplelogin.transports.XHR_"); | |
goog.require("fb.simplelogin.transports.Transport"); | |
goog.require("fb.simplelogin.Vars"); | |
goog.require("fb.simplelogin.util.json"); | |
goog.require("goog.net.XhrIo"); | |
goog.require("goog.events"); | |
goog.require("goog.json"); | |
fb.simplelogin.transports.XHR_ = function() { | |
window[CALLBACK_NAMESPACE] = window[CALLBACK_NAMESPACE] || {}; | |
}; | |
fb.simplelogin.transports.XHR_.prototype.open = function(url, options, onComplete) { | |
var self = this; | |
var request = new goog.net.XhrIo; | |
goog.events.listen(request, "complete", function() { | |
if (request.isSuccess()) { | |
var data = request.getResponseJson(); | |
var error = data["error"] || null; | |
delete data["error"]; | |
onComplete && onComplete(error, data); | |
} else { | |
onComplete && onComplete(self.formatError_({code:"SERVER_ERROR", message:"An unknown server error occurred."})); | |
} | |
}); | |
url += "?"; | |
for (var key in options) { | |
url += "&" + encodeURIComponent(key) + "=" + encodeURIComponent(options[key]); | |
} | |
request.send(url, "GET", null, {"content-type":"application/json"}); | |
}; | |
fb.simplelogin.transports.XHR_.prototype.isAvailable = function() { | |
return window["XMLHttpRequest"] && typeof window["XMLHttpRequest"] === "function"; | |
}; | |
fb.simplelogin.transports.XHR_.prototype.formatError_ = function(error) { | |
var errorObj = new Error(error.message || ""); | |
errorObj.code = error.code || "UNKNOWN_ERROR"; | |
return errorObj; | |
}; | |
fb.simplelogin.transports.XHR = new fb.simplelogin.transports.XHR_; | |
goog.provide("fb.simplelogin.util.validation"); | |
var VALID_EMAIL_REGEX_ = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,6})+$/; | |
fb.simplelogin.util.validation.validateArgCount = function(fnName, minCount, maxCount, argCount) { | |
var argError; | |
if (argCount < minCount) { | |
argError = "at least " + minCount; | |
} else { | |
if (argCount > maxCount) { | |
argError = maxCount === 0 ? "none" : "no more than " + maxCount; | |
} | |
} | |
if (argError) { | |
var error = fnName + " failed: Was called with " + argCount + (argCount === 1 ? " argument." : " arguments.") + " Expects " + argError + "."; | |
throw new Error(error); | |
} | |
}; | |
fb.simplelogin.util.validation.isValidEmail = function(email) { | |
return goog.isString(email) && VALID_EMAIL_REGEX_.test(email); | |
}; | |
fb.simplelogin.util.validation.isValidPassword = function(password) { | |
return goog.isString(password); | |
}; | |
fb.simplelogin.util.validation.isValidNamespace = function(namespace) { | |
return goog.isString(namespace); | |
}; | |
fb.simplelogin.util.validation.errorPrefix_ = function(fnName, argumentNumber, optional) { | |
var argName = ""; | |
switch(argumentNumber) { | |
case 1: | |
argName = optional ? "first" : "First"; | |
break; | |
case 2: | |
argName = optional ? "second" : "Second"; | |
break; | |
case 3: | |
argName = optional ? "third" : "Third"; | |
break; | |
case 4: | |
argName = optional ? "fourth" : "Fourth"; | |
break; | |
default: | |
fb.core.util.validation.assert(false, "errorPrefix_ called with argumentNumber > 4. Need to update it?"); | |
} | |
var error = fnName + " failed: "; | |
error += argName + " argument "; | |
return error; | |
}; | |
fb.simplelogin.util.validation.validateNamespace = function(fnName, argumentNumber, namespace, optional) { | |
if (optional && !goog.isDef(namespace)) { | |
return; | |
} | |
if (!goog.isString(namespace)) { | |
throw new Error(fb.simplelogin.util.validation.errorPrefix_(fnName, argumentNumber, optional) + "must be a valid firebase namespace."); | |
} | |
}; | |
fb.simplelogin.util.validation.validateCallback = function(fnName, argumentNumber, callback, optional) { | |
if (optional && !goog.isDef(callback)) { | |
return; | |
} | |
if (!goog.isFunction(callback)) { | |
throw new Error(fb.simplelogin.util.validation.errorPrefix_(fnName, argumentNumber, optional) + "must be a valid function."); | |
} | |
}; | |
fb.simplelogin.util.validation.validateString = function(fnName, argumentNumber, string, optional) { | |
if (optional && !goog.isDef(string)) { | |
return; | |
} | |
if (!goog.isString(string)) { | |
throw new Error(fb.simplelogin.util.validation.errorPrefix_(fnName, argumentNumber, optional) + "must be a valid string."); | |
} | |
}; | |
fb.simplelogin.util.validation.validateContextObject = function(fnName, argumentNumber, context, optional) { | |
if (optional && !goog.isDef(context)) { | |
return; | |
} | |
if (!goog.isObject(context) || context === null) { | |
throw new Error(fb.simplelogin.util.validation.errorPrefix_(fnName, argumentNumber, optional) + "must be a valid context object."); | |
} | |
}; | |
goog.provide("fb.simplelogin.transports.JSONP"); | |
goog.provide("fb.simplelogin.transports.JSONP_"); | |
goog.require("fb.simplelogin.transports.Transport"); | |
goog.require("fb.simplelogin.Vars"); | |
goog.require("fb.simplelogin.util.json"); | |
var CALLBACK_NAMESPACE = "_FirebaseSimpleLoginJSONP"; | |
fb.simplelogin.transports.JSONP_ = function() { | |
window[CALLBACK_NAMESPACE] = window[CALLBACK_NAMESPACE] || {}; | |
}; | |
fb.simplelogin.transports.JSONP_.prototype.open = function(url, options, onComplete) { | |
url += /\?/.test(url) ? "" : "?"; | |
url += "&transport=jsonp"; | |
for (var param in options) { | |
url += "&" + encodeURIComponent(param) + "=" + encodeURIComponent(options[param]); | |
} | |
var callbackId = this.generateRequestId_(); | |
url += "&callback=" + encodeURIComponent(CALLBACK_NAMESPACE + "." + callbackId); | |
this.registerCallback_(callbackId, onComplete); | |
this.writeScriptTag_(callbackId, url, onComplete); | |
}; | |
fb.simplelogin.transports.JSONP_.prototype.generateRequestId_ = function() { | |
return "_FirebaseJSONP" + (new Date).getTime() + Math.floor(Math.random() * 100); | |
}; | |
fb.simplelogin.transports.JSONP_.prototype.registerCallback_ = function(id, callback) { | |
var self = this; | |
window[CALLBACK_NAMESPACE][id] = function(result) { | |
var error = result["error"] || null; | |
delete result["error"]; | |
callback(error, result); | |
self.removeCallback_(id); | |
}; | |
}; | |
fb.simplelogin.transports.JSONP_.prototype.removeCallback_ = function(id) { | |
setTimeout(function() { | |
delete window[CALLBACK_NAMESPACE][id]; | |
var el = document.getElementById(id); | |
if (el) { | |
el.parentNode.removeChild(el); | |
} | |
}, 0); | |
}; | |
fb.simplelogin.transports.JSONP_.prototype.writeScriptTag_ = function(id, url, cb) { | |
var self = this; | |
setTimeout(function() { | |
try { | |
var js = document.createElement("script"); | |
js.type = "text/javascript"; | |
js.id = id; | |
js.async = true; | |
js.src = url; | |
js.onerror = function() { | |
var el = document.getElementById(id); | |
if (el !== null) { | |
el.parentNode.removeChild(el); | |
} | |
cb && cb(self.formatError_({code:"SERVER_ERROR", message:"An unknown server error occurred."})); | |
}; | |
var ref = document.getElementsByTagName("script")[0]; | |
ref.parentNode.insertBefore(js, ref); | |
} catch (e) { | |
cb && cb(self.formatError_({code:"SERVER_ERROR", message:"An unknown server error occurred."})); | |
} | |
}, 0); | |
}; | |
fb.simplelogin.transports.JSONP_.prototype.formatError_ = function(error) { | |
var errorObj; | |
if (!error) { | |
errorObj = new Error; | |
errorObj.code = "UNKNOWN_ERROR"; | |
} else { | |
errorObj = new Error(error.message); | |
errorObj.code = error.code || "UNKNOWN_ERROR"; | |
} | |
return errorObj; | |
}; | |
fb.simplelogin.transports.JSONP = new fb.simplelogin.transports.JSONP_; | |
goog.provide("fb.simplelogin.providers.Password"); | |
goog.provide("fb.simplelogin.providers.Password_"); | |
goog.require("fb.simplelogin.Vars"); | |
goog.require("fb.simplelogin.util.validation"); | |
goog.require("fb.simplelogin.Errors"); | |
goog.require("fb.simplelogin.transports.JSONP"); | |
goog.require("fb.simplelogin.transports.XHR"); | |
fb.simplelogin.providers.Password_ = function() { | |
}; | |
fb.simplelogin.providers.Password_.prototype.getTransport_ = function() { | |
if (fb.simplelogin.transports.XHR.isAvailable()) { | |
return fb.simplelogin.transports.XHR; | |
} else { | |
return fb.simplelogin.transports.JSONP; | |
} | |
}; | |
fb.simplelogin.providers.Password_.prototype.login = function(data, onComplete) { | |
var url = fb.simplelogin.Vars.getApiHost() + "/auth/firebase"; | |
if (!fb.simplelogin.util.validation.isValidNamespace(data["firebase"])) { | |
return onComplete && onComplete(fb.simplelogin.Errors.get("INVALID_FIREBASE")); | |
} | |
this.getTransport_().open(url, data, onComplete); | |
}; | |
fb.simplelogin.providers.Password_.prototype.createUser = function(data, onComplete) { | |
var url = fb.simplelogin.Vars.getApiHost() + "/auth/firebase/create"; | |
if (!fb.simplelogin.util.validation.isValidNamespace(data["firebase"])) { | |
return onComplete && onComplete(fb.simplelogin.Errors.get("INVALID_FIREBASE")); | |
} | |
if (!fb.simplelogin.util.validation.isValidEmail(data["email"])) { | |
return onComplete && onComplete(fb.simplelogin.Errors.get("INVALID_EMAIL")); | |
} | |
if (!fb.simplelogin.util.validation.isValidPassword(data["password"])) { | |
return onComplete && onComplete(fb.simplelogin.Errors.get("INVALID_PASSWORD")); | |
} | |
this.getTransport_().open(url, data, onComplete); | |
}; | |
fb.simplelogin.providers.Password_.prototype.changePassword = function(data, onComplete) { | |
var url = fb.simplelogin.Vars.getApiHost() + "/auth/firebase/update"; | |
if (!fb.simplelogin.util.validation.isValidNamespace(data["firebase"])) { | |
return onComplete && onComplete(fb.simplelogin.Errors.get("INVALID_FIREBASE")); | |
} | |
if (!fb.simplelogin.util.validation.isValidEmail(data["email"])) { | |
return onComplete && onComplete(fb.simplelogin.Errors.get("INVALID_EMAIL")); | |
} | |
if (!fb.simplelogin.util.validation.isValidPassword(data["newPassword"])) { | |
return onComplete && onComplete(fb.simplelogin.Errors.get("INVALID_PASSWORD")); | |
} | |
this.getTransport_().open(url, data, onComplete); | |
}; | |
fb.simplelogin.providers.Password_.prototype.removeUser = function(data, onComplete) { | |
var url = fb.simplelogin.Vars.getApiHost() + "/auth/firebase/remove"; | |
if (!fb.simplelogin.util.validation.isValidNamespace(data["firebase"])) { | |
return onComplete && onComplete(fb.simplelogin.Errors.get("INVALID_FIREBASE")); | |
} | |
if (!fb.simplelogin.util.validation.isValidEmail(data["email"])) { | |
return onComplete && onComplete(fb.simplelogin.Errors.get("INVALID_EMAIL")); | |
} | |
if (!fb.simplelogin.util.validation.isValidPassword(data["password"])) { | |
return onComplete && onComplete(fb.simplelogin.Errors.get("INVALID_PASSWORD")); | |
} | |
this.getTransport_().open(url, data, onComplete); | |
}; | |
fb.simplelogin.providers.Password_.prototype.sendPasswordResetEmail = function(data, onComplete) { | |
var url = fb.simplelogin.Vars.getApiHost() + "/auth/firebase/reset_password"; | |
if (!fb.simplelogin.util.validation.isValidNamespace(data["firebase"])) { | |
return onComplete && onComplete(fb.simplelogin.Errors.get("INVALID_FIREBASE")); | |
} | |
if (!fb.simplelogin.util.validation.isValidEmail(data["email"])) { | |
return onComplete && onComplete(fb.simplelogin.Errors.get("INVALID_EMAIL")); | |
} | |
this.getTransport_().open(url, data, onComplete); | |
}; | |
fb.simplelogin.providers.Password = new fb.simplelogin.providers.Password_; | |
goog.provide("fb.simplelogin.transports.WindowsMetroAuthBroker"); | |
goog.provide("fb.simplelogin.transports.WindowsMetroAuthBroker_"); | |
goog.require("fb.simplelogin.transports.Popup"); | |
goog.require("fb.simplelogin.Vars"); | |
goog.require("fb.simplelogin.util.json"); | |
goog.require("fb.simplelogin.util.misc"); | |
fb.simplelogin.transports.WindowsMetroAuthBroker_ = function() { | |
}; | |
fb.simplelogin.transports.WindowsMetroAuthBroker_.prototype.open = function(url, options, onComplete) { | |
var Uri, WebAuthenticationOptions, WebAuthenticationBroker, authenticateAsync, callbackInvoked, callbackHandler; | |
try { | |
Uri = window["Windows"]["Foundation"]["Uri"]; | |
WebAuthenticationOptions = window["Windows"]["Security"]["Authentication"]["Web"]["WebAuthenticationOptions"]; | |
WebAuthenticationBroker = window["Windows"]["Security"]["Authentication"]["Web"]["WebAuthenticationBroker"]; | |
authenticateAsync = WebAuthenticationBroker["authenticateAsync"]; | |
} catch (err) { | |
return onComplete({code:"WINDOWS_METRO", message:'"Windows.Security.Authentication.Web.WebAuthenticationBroker" required when using Firebase Simple Login in Windows Metro context'}); | |
} | |
callbackInvoked = false; | |
var callbackHandler = function() { | |
var args = Array.prototype.slice.apply(arguments); | |
if (!callbackInvoked) { | |
callbackInvoked = true; | |
onComplete.apply(null, args); | |
} | |
}; | |
var startUri = new Uri(url + "&transport=internal-redirect-hash"); | |
var endUri = new Uri(fb.simplelogin.Vars.getApiHost() + "/blank/page.html"); | |
authenticateAsync(WebAuthenticationOptions["none"], startUri, endUri).done(function(data) { | |
var result; | |
if (data && data["responseData"]) { | |
try { | |
var urlObj = fb.simplelogin.util.misc.parseUrl(data["responseData"]); | |
var urlHashEncoded = fb.simplelogin.util.misc.parseQuerystring(decodeURIComponent(urlObj["hash"])); | |
var temporaryResult = {}; | |
for (var key in urlHashEncoded) { | |
temporaryResult[key] = fb.simplelogin.util.json.eval(urlHashEncoded[key]); | |
} | |
result = temporaryResult; | |
} catch (e) { | |
} | |
} | |
if (result && (result["token"] && result["user"])) { | |
callbackHandler(null, result); | |
} else { | |
if (result && result["error"]) { | |
callbackHandler(result["error"]); | |
} else { | |
callbackHandler({code:"UNKNOWN_ERROR", message:"An unknown error occurred."}); | |
} | |
} | |
}, function(err) { | |
callbackHandler({code:"UNKNOWN_ERROR", message:"An unknown error occurred."}); | |
}); | |
}; | |
fb.simplelogin.transports.WindowsMetroAuthBroker = new fb.simplelogin.transports.WindowsMetroAuthBroker_; | |
goog.provide("fb.simplelogin.providers.Persona"); | |
goog.provide("fb.simplelogin.providers.Persona_"); | |
goog.require("fb.simplelogin.util.validation"); | |
fb.simplelogin.providers.Persona_ = function() { | |
}; | |
fb.simplelogin.providers.Persona_.prototype.login = function(options, onComplete) { | |
navigator["id"]["watch"]({"onlogin":function(assertion) { | |
onComplete(assertion); | |
}, "onlogout":function() { | |
}}); | |
options = options || {}; | |
options["oncancel"] = function() { | |
onComplete(null); | |
}; | |
navigator["id"]["request"](options); | |
}; | |
fb.simplelogin.providers.Persona = new fb.simplelogin.providers.Persona_; | |
goog.provide("goog.net.Cookies"); | |
goog.provide("goog.net.cookies"); | |
goog.net.Cookies = function(context) { | |
this.document_ = context; | |
}; | |
goog.net.Cookies.MAX_COOKIE_LENGTH = 3950; | |
goog.net.Cookies.SPLIT_RE_ = /\s*;\s*/; | |
goog.net.Cookies.prototype.isEnabled = function() { | |
return navigator.cookieEnabled; | |
}; | |
goog.net.Cookies.prototype.isValidName = function(name) { | |
return!/[;=\s]/.test(name); | |
}; | |
goog.net.Cookies.prototype.isValidValue = function(value) { | |
return!/[;\r\n]/.test(value); | |
}; | |
goog.net.Cookies.prototype.set = function(name, value, opt_maxAge, opt_path, opt_domain, opt_secure) { | |
if (!this.isValidName(name)) { | |
throw Error('Invalid cookie name "' + name + '"'); | |
} | |
if (!this.isValidValue(value)) { | |
throw Error('Invalid cookie value "' + value + '"'); | |
} | |
if (!goog.isDef(opt_maxAge)) { | |
opt_maxAge = -1; | |
} | |
var domainStr = opt_domain ? ";domain=" + opt_domain : ""; | |
var pathStr = opt_path ? ";path=" + opt_path : ""; | |
var secureStr = opt_secure ? ";secure" : ""; | |
var expiresStr; | |
if (opt_maxAge < 0) { | |
expiresStr = ""; | |
} else { | |
if (opt_maxAge == 0) { | |
var pastDate = new Date(1970, 1, 1); | |
expiresStr = ";expires=" + pastDate.toUTCString(); | |
} else { | |
var futureDate = new Date(goog.now() + opt_maxAge * 1E3); | |
expiresStr = ";expires=" + futureDate.toUTCString(); | |
} | |
} | |
this.setCookie_(name + "=" + value + domainStr + pathStr + expiresStr + secureStr); | |
}; | |
goog.net.Cookies.prototype.get = function(name, opt_default) { | |
var nameEq = name + "="; | |
var parts = this.getParts_(); | |
for (var i = 0, part;part = parts[i];i++) { | |
if (part.lastIndexOf(nameEq, 0) == 0) { | |
return part.substr(nameEq.length); | |
} | |
if (part == name) { | |
return ""; | |
} | |
} | |
return opt_default; | |
}; | |
goog.net.Cookies.prototype.remove = function(name, opt_path, opt_domain) { | |
var rv = this.containsKey(name); | |
this.set(name, "", 0, opt_path, opt_domain); | |
return rv; | |
}; | |
goog.net.Cookies.prototype.getKeys = function() { | |
return this.getKeyValues_().keys; | |
}; | |
goog.net.Cookies.prototype.getValues = function() { | |
return this.getKeyValues_().values; | |
}; | |
goog.net.Cookies.prototype.isEmpty = function() { | |
return!this.getCookie_(); | |
}; | |
goog.net.Cookies.prototype.getCount = function() { | |
var cookie = this.getCookie_(); | |
if (!cookie) { | |
return 0; | |
} | |
return this.getParts_().length; | |
}; | |
goog.net.Cookies.prototype.containsKey = function(key) { | |
return goog.isDef(this.get(key)); | |
}; | |
goog.net.Cookies.prototype.containsValue = function(value) { | |
var values = this.getKeyValues_().values; | |
for (var i = 0;i < values.length;i++) { | |
if (values[i] == value) { | |
return true; | |
} | |
} | |
return false; | |
}; | |
goog.net.Cookies.prototype.clear = function() { | |
var keys = this.getKeyValues_().keys; | |
for (var i = keys.length - 1;i >= 0;i--) { | |
this.remove(keys[i]); | |
} | |
}; | |
goog.net.Cookies.prototype.setCookie_ = function(s) { | |
this.document_.cookie = s; | |
}; | |
goog.net.Cookies.prototype.getCookie_ = function() { | |
return this.document_.cookie; | |
}; | |
goog.net.Cookies.prototype.getParts_ = function() { | |
return(this.getCookie_() || "").split(goog.net.Cookies.SPLIT_RE_); | |
}; | |
goog.net.Cookies.prototype.getKeyValues_ = function() { | |
var parts = this.getParts_(); | |
var keys = [], values = [], index, part; | |
for (var i = 0;part = parts[i];i++) { | |
index = part.indexOf("="); | |
if (index == -1) { | |
keys.push(""); | |
values.push(part); | |
} else { | |
keys.push(part.substring(0, index)); | |
values.push(part.substring(index + 1)); | |
} | |
} | |
return{keys:keys, values:values}; | |
}; | |
goog.net.cookies = new goog.net.Cookies(document); | |
goog.net.cookies.MAX_COOKIE_LENGTH = goog.net.Cookies.MAX_COOKIE_LENGTH; | |
goog.provide("fb.simplelogin.SessionStore"); | |
goog.provide("fb.simplelogin.SessionStore_"); | |
goog.require("fb.simplelogin.util.env"); | |
goog.require("goog.net.cookies"); | |
var cookieStoragePath = "/"; | |
var encryptionStorageKey = "firebaseSessionKey"; | |
var sessionPersistentStorageKey = "firebaseSession"; | |
var hasLocalStorage = fb.simplelogin.util.env.hasLocalStorage(); | |
fb.simplelogin.SessionStore_ = function() { | |
}; | |
fb.simplelogin.SessionStore_.prototype.set = function(session, opt_sessionLengthDays) { | |
if (!hasLocalStorage) { | |
return; | |
} | |
try { | |
var sessionEncryptionKey = session["sessionKey"]; | |
var payload = sjcl.encrypt(sessionEncryptionKey, fb.simplelogin.util.json.stringify(session)); | |
localStorage.setItem(sessionPersistentStorageKey, fb.simplelogin.util.json.stringify(payload)); | |
localStorage.setItem(encryptionStorageKey, sessionEncryptionKey); | |
} catch (e) { | |
} | |
}; | |
fb.simplelogin.SessionStore_.prototype.get = function() { | |
if (!hasLocalStorage) { | |
return; | |
} | |
try { | |
var sessionEncryptionKey = localStorage.getItem(encryptionStorageKey); | |
var payload = localStorage.getItem(sessionPersistentStorageKey); | |
if (sessionEncryptionKey && payload) { | |
var session = fb.simplelogin.util.json.eval(sjcl.decrypt(sessionEncryptionKey, fb.simplelogin.util.json.eval(payload))); | |
return session; | |
} | |
} catch (e) { | |
} | |
return null; | |
}; | |
fb.simplelogin.SessionStore_.prototype.clear = function() { | |
if (!hasLocalStorage) { | |
return; | |
} | |
localStorage.removeItem(sessionPersistentStorageKey); | |
localStorage.removeItem(encryptionStorageKey); | |
}; | |
fb.simplelogin.SessionStore = new fb.simplelogin.SessionStore_; | |
goog.provide("fb.simplelogin.client"); | |
goog.require("fb.simplelogin.util.env"); | |
goog.require("fb.simplelogin.util.json"); | |
goog.require("fb.simplelogin.util.validation"); | |
goog.require("fb.simplelogin.util.sjcl"); | |
goog.require("fb.simplelogin.Vars"); | |
goog.require("fb.simplelogin.Errors"); | |
goog.require("fb.simplelogin.SessionStore"); | |
goog.require("fb.simplelogin.providers.Persona"); | |
goog.require("fb.simplelogin.providers.Password"); | |
goog.require("fb.simplelogin.transports.JSONP"); | |
goog.require("fb.simplelogin.transports.CordovaInAppBrowser"); | |
goog.require("fb.simplelogin.transports.TriggerIoTab"); | |
goog.require("fb.simplelogin.transports.WinChan"); | |
goog.require("fb.simplelogin.transports.WindowsMetroAuthBroker"); | |
fb.simplelogin.client = function(ref, callback, context, apiHost) { | |
var self = this, dataURL = ref.toString(), namespace = null; | |
var globalNamespace = "_FirebaseSimpleLogin"; | |
window[globalNamespace] = window[globalNamespace] || {}; | |
window[globalNamespace]["callbacks"] = window[globalNamespace]["callbacks"] || []; | |
window[globalNamespace]["callbacks"].push({"cb":callback, "ctx":context}); | |
if (goog.isString(dataURL)) { | |
var colonInd = dataURL.indexOf("//"); | |
if (colonInd >= 0) { | |
dataURL = dataURL.substring(colonInd + 2); | |
} | |
var dotInd = dataURL.indexOf("."); | |
if (dotInd >= 0) { | |
namespace = dataURL.substring(0, dotInd); | |
} | |
} | |
if (!goog.isString(namespace)) { | |
throw new Error("new FirebaseSimpleLogin(): First argument must be a valid Firebase reference (i.e. new Firebase(<firebaseURL>))."); | |
} | |
if (window.location.protocol === "file:" && (!fb.simplelogin.util.env.isPhantomJS() && (!fb.simplelogin.util.env.isMobileCordovaInAppBrowser() && (console && console.log)))) { | |
var message = "FirebaseSimpleLogin(): Due to browser security restrictions, " + "loading applications via `file://*` URLs will prevent popup-based authentication " + "providers from working properly. When testing locally, you'll need to run a " + "barebones webserver on your machine rather than loading your test files via " + "`file://*`. The easiest way to run a barebones server on your local machine is to " + "`cd` to the root directory of your code and run `python -m SimpleHTTPServer`, " + | |
"which will allow you to access your content via `http://127.0.0.1:8000/*`."; | |
console.log(message); | |
} | |
if (apiHost) { | |
fb.simplelogin.Vars.setApiHost(apiHost); | |
} | |
this.mRef = ref; | |
this.mNamespace = namespace; | |
this.sessionLengthDays = null; | |
this.mLoginStateChange = function() { | |
var callbacks = window[globalNamespace]["callbacks"] || []; | |
var args = Array.prototype.slice.apply(arguments); | |
for (var ix = 0;ix < callbacks.length;ix++) { | |
var cb = callbacks[ix]; | |
var invokeCallback = !!args[0] || typeof cb.user === "undefined"; | |
if (!invokeCallback) { | |
var oldAuthToken, newAuthToken; | |
if (cb.user && cb.user.firebaseAuthToken) { | |
oldAuthToken = cb.user.firebaseAuthToken; | |
} | |
if (args[1] && args[1].firebaseAuthToken) { | |
newAuthToken = args[1].firebaseAuthToken; | |
} | |
invokeCallback = (oldAuthToken || newAuthToken) && oldAuthToken !== newAuthToken; | |
} | |
window[globalNamespace]["callbacks"][ix]["user"] = args[1] || null; | |
if (invokeCallback) { | |
(function(cb, ctx) { | |
if (typeof cb === "function") { | |
setTimeout(function() { | |
cb.apply(ctx, args); | |
}, 0); | |
} | |
})(cb.cb, cb.ctx); | |
} | |
} | |
}; | |
this.resumeSession(); | |
}; | |
fb.simplelogin.client.prototype.setApiHost = function(apiHost) { | |
fb.simplelogin.Vars.setApiHost(apiHost); | |
}; | |
fb.simplelogin.client.prototype.resumeSession = function() { | |
var self = this; | |
var session, requestId, error; | |
try { | |
requestId = sessionStorage.getItem("firebaserequestId"); | |
sessionStorage.removeItem("firebaserequestId"); | |
} catch (e) { | |
} | |
if (requestId) { | |
var transport = fb.simplelogin.transports.JSONP; | |
if (fb.simplelogin.transports.XHR.isAvailable()) { | |
transport = fb.simplelogin.transports.XHR; | |
} | |
transport.open(fb.simplelogin.Vars.getApiHost() + "/auth/session", {"requestId":requestId, "firebase":self.mNamespace}, function(error, response) { | |
if (response && (response.token && response.user)) { | |
self.attemptAuth(response.token, response.user, true); | |
} else { | |
if (error) { | |
fb.simplelogin.SessionStore.clear(); | |
self.mLoginStateChange(error); | |
} else { | |
fb.simplelogin.SessionStore.clear(); | |
self.mLoginStateChange(null, null); | |
} | |
} | |
}); | |
} else { | |
session = fb.simplelogin.SessionStore.get(); | |
if (session && (session.token && session.user)) { | |
self.attemptAuth(session.token, session.user, false); | |
} else { | |
self.mLoginStateChange(null, null); | |
} | |
} | |
}; | |
fb.simplelogin.client.prototype.attemptAuth = function(token, user, saveSession) { | |
var self = this; | |
this.mRef["auth"](token, function(error, dummy) { | |
if (!error) { | |
if (saveSession) { | |
fb.simplelogin.SessionStore.set({token:token, user:user, sessionKey:user["sessionKey"]}, self.sessionLengthDays); | |
} | |
if (typeof dummy == "function") { | |
dummy(); | |
} | |
delete user["sessionKey"]; | |
user["firebaseAuthToken"] = token; | |
self.mLoginStateChange(null, user); | |
} else { | |
fb.simplelogin.SessionStore.clear(); | |
self.mLoginStateChange(null, null); | |
} | |
}, function(error) { | |
fb.simplelogin.SessionStore.clear(); | |
self.mLoginStateChange(null, null); | |
}); | |
}; | |
fb.simplelogin.client.prototype.login = function() { | |
fb.simplelogin.util.validation.validateString(methodId, 1, arguments[0], false); | |
var self = this, options = arguments[1] || {}, provider = arguments[0].toLowerCase(), methodId = "FirebaseSimpleLogin.login(" + provider + ")"; | |
if (provider === "password") { | |
if (!fb.simplelogin.util.validation.isValidEmail(options.email)) { | |
return this.mLoginStateChange(fb.simplelogin.Errors.get("INVALID_EMAIL")); | |
} | |
if (!fb.simplelogin.util.validation.isValidPassword(options.password)) { | |
return this.mLoginStateChange(fb.simplelogin.Errors.get("INVALID_PASSWORD")); | |
} | |
} else { | |
if (provider === "facebook" || (provider === "github" || (provider === "google" || (provider === "persona" || (provider === "twitter" || provider === "anonymous"))))) { | |
fb.simplelogin.util.validation.validateArgCount(methodId, 1, 2, arguments.length); | |
} | |
} | |
this.sessionLengthDays = options.rememberMe ? 30 : null; | |
switch(provider) { | |
case "anonymous": | |
return this.loginAnonymously(options); | |
case "facebook-token": | |
return this.loginWithFacebookToken(options); | |
case "github": | |
return this.loginWithGithub(options); | |
case "google-token": | |
return this.loginWithGoogleToken(options); | |
case "password": | |
return this.loginWithPassword(options); | |
case "persona": | |
return this.loginWithPersona(options); | |
case "twitter-token": | |
return this.loginWithTwitterToken(options); | |
case "facebook": | |
if (options["access_token"]) { | |
return this.loginWithFacebookToken(options); | |
} else { | |
return this.loginWithFacebook(options); | |
} | |
; | |
case "google": | |
if (options["access_token"]) { | |
return this.loginWithGoogleToken(options); | |
} else { | |
return this.loginWithGoogle(options); | |
} | |
; | |
case "twitter": | |
if (options["oauth_token"] && options["oauth_token_secret"]) { | |
return this.loginWithTwitterToken(options); | |
} else { | |
return this.loginWithTwitter(options); | |
} | |
; | |
default: | |
throw new Error("FirebaseSimpleLogin.login() failed: unrecognized authentication provider");; | |
} | |
}; | |
fb.simplelogin.client.prototype.loginAnonymously = function(options) { | |
var self = this; | |
var provider = "anonymous"; | |
options.firebase = this.mNamespace; | |
fb.simplelogin.transports.JSONP.open(fb.simplelogin.Vars.getApiHost() + "/auth/anonymous", options, function(error, response) { | |
if (error || !response["token"]) { | |
self.mLoginStateChange(fb.simplelogin.Errors.format(error), null); | |
} else { | |
var token = response["token"]; | |
var user = response["user"]; | |
self.attemptAuth(token, user, true); | |
} | |
}); | |
}; | |
fb.simplelogin.client.prototype.loginWithPassword = function(options) { | |
var self = this; | |
options.firebase = this.mNamespace; | |
fb.simplelogin.providers.Password.login(options, function(error, response) { | |
if (error || !response["token"]) { | |
self.mLoginStateChange(fb.simplelogin.Errors.format(error)); | |
} else { | |
var token = response["token"]; | |
var user = response["user"]; | |
self.attemptAuth(token, user, true); | |
} | |
}); | |
}; | |
fb.simplelogin.client.prototype.loginWithGithub = function(options) { | |
options["height"] = 850; | |
options["width"] = 950; | |
this.loginViaOAuth("github", options); | |
}; | |
fb.simplelogin.client.prototype.loginWithGoogle = function(options) { | |
options["height"] = 650; | |
options["width"] = 575; | |
this.loginViaOAuth("google", options); | |
}; | |
fb.simplelogin.client.prototype.loginWithFacebook = function(options) { | |
options["height"] = 400; | |
options["width"] = 535; | |
this.loginViaOAuth("facebook", options); | |
}; | |
fb.simplelogin.client.prototype.loginWithTwitter = function(options) { | |
this.loginViaOAuth("twitter", options); | |
}; | |
fb.simplelogin.client.prototype.loginWithFacebookToken = function(options) { | |
this.loginViaToken("facebook", options); | |
}; | |
fb.simplelogin.client.prototype.loginWithGoogleToken = function(options) { | |
this.loginViaToken("google", options); | |
}; | |
fb.simplelogin.client.prototype.loginWithTwitterToken = function(options) { | |
this.loginViaToken("twitter", options); | |
}; | |
fb.simplelogin.client.prototype.loginWithPersona = function(options) { | |
var provider = "persona"; | |
var self = this; | |
if (!navigator["id"]) { | |
throw new Error("FirebaseSimpleLogin.login(persona): Unable to find Persona include.js"); | |
} | |
fb.simplelogin.providers.Persona.login(options, function(assertion) { | |
if (assertion === null) { | |
callback(fb.simplelogin.Errors.get("UNKNOWN_ERROR")); | |
} else { | |
fb.simplelogin.transports.JSONP.open(fb.simplelogin.Vars.getApiHost() + "/auth/persona/token", {"firebase":self.mNamespace, "assertion":assertion}, function(err, res) { | |
if (err || (!res["token"] || !res["user"])) { | |
self.mLoginStateChange(fb.simplelogin.Errors.format(err), null); | |
} else { | |
var token = res["token"]; | |
var user = res["user"]; | |
self.attemptAuth(token, user, true); | |
} | |
}); | |
} | |
}); | |
}; | |
fb.simplelogin.client.prototype.logout = function() { | |
fb.simplelogin.SessionStore.clear(); | |
this.mRef["unauth"](); | |
this.mLoginStateChange(null, null); | |
}; | |
fb.simplelogin.client.prototype.loginViaToken = function(provider, options, cb) { | |
options = options || {}; | |
var self = this, url = fb.simplelogin.Vars.getApiHost() + "/auth/" + provider + "/token?firebase=" + self.mNamespace; | |
fb.simplelogin.transports.JSONP.open(url, options, function(err, res) { | |
if (err || (!res["token"] || !res["user"])) { | |
self.mLoginStateChange(fb.simplelogin.Errors.format(err), null); | |
} else { | |
var token = res["token"]; | |
var user = res["user"]; | |
self.attemptAuth(token, user, true); | |
} | |
}); | |
}; | |
fb.simplelogin.client.prototype.loginViaOAuth = function(provider, options, cb) { | |
options = options || {}; | |
var self = this; | |
var url = fb.simplelogin.Vars.getApiHost() + "/auth/" + provider + "?firebase=" + this.mNamespace; | |
if (options["scope"]) { | |
url += "&scope=" + options["scope"]; | |
} | |
if (options["debug"]) { | |
url += "&debug=" + options["debug"]; | |
} | |
var window_features = {"menubar":0, "location":0, "resizable":0, "scrollbars":1, "status":0, "dialog":1, "width":700, "height":375}; | |
if (options["height"]) { | |
window_features["height"] = options["height"]; | |
delete options["height"]; | |
} | |
if (options["width"]) { | |
window_features["width"] = options["width"]; | |
delete options["width"]; | |
} | |
var environment = function() { | |
if (fb.simplelogin.util.env.isMobileCordovaInAppBrowser()) { | |
return "mobile-phonegap"; | |
} else { | |
if (fb.simplelogin.util.env.isMobileTriggerIoTab()) { | |
return "mobile-triggerio"; | |
} else { | |
if (fb.simplelogin.util.env.isWindowsMetro()) { | |
return "windows-metro"; | |
} else { | |
return "desktop"; | |
} | |
} | |
} | |
}(); | |
var transport; | |
if (environment === "desktop") { | |
transport = "WinChan"; | |
var window_features_arr = []; | |
for (var key in window_features) { | |
window_features_arr.push(key + "=" + window_features[key]); | |
} | |
options.url += "&transport=winchan", options.relay_url = fb.simplelogin.Vars.getApiHost() + "/auth/channel", options.window_features = window_features_arr.join(","); | |
} else { | |
if (environment === "mobile-phonegap") { | |
transport = "CordovaInAppBrowser"; | |
} else { | |
if (environment === "mobile-triggerio") { | |
transport = "TriggerIoTab"; | |
} else { | |
if (environment === "windows-metro") { | |
transport = "WindowsMetroAuthBroker"; | |
} | |
} | |
} | |
} | |
if (options.preferRedirect || (fb.simplelogin.util.env.isChromeiOS() || (fb.simplelogin.util.env.isWindowsPhone() || (fb.simplelogin.util.env.isStandaloneiOS() || (fb.simplelogin.util.env.isTwitteriOS() || fb.simplelogin.util.env.isFacebookiOS()))))) { | |
var requestId = goog.string.getRandomString() + goog.string.getRandomString(); | |
try { | |
sessionStorage.setItem("firebaserequestId", requestId); | |
} catch (e) { | |
} | |
url += "&requestId=" + requestId + "&fb_redirect_uri=" + encodeURIComponent(window.location.href); | |
return window.location = url; | |
} | |
fb.simplelogin.transports[transport].open(url, options, function(error, res) { | |
if (res && (res.token && res.user)) { | |
self.attemptAuth(res.token, res.user, true); | |
} else { | |
var errObj = error || {code:"UNKNOWN_ERROR", message:"An unknown error occurred."}; | |
if (error === "unknown closed window") { | |
errObj = {code:"USER_DENIED", message:"User cancelled the authentication request."}; | |
} else { | |
if (res && res.error) { | |
errObj = res.error; | |
} | |
} | |
self.mLoginStateChange(fb.simplelogin.Errors.format(errObj), null); | |
} | |
}); | |
}; | |
fb.simplelogin.client.prototype.manageFirebaseUsers = function(method, data, cb) { | |
data["firebase"] = this.mNamespace; | |
fb.simplelogin.providers.Password[method](data, function(error, result) { | |
if (error) { | |
return cb && cb(fb.simplelogin.Errors.format(error), null); | |
} else { | |
return cb && cb(null, result); | |
} | |
}); | |
}; | |
fb.simplelogin.client.prototype.createUser = function(email, password, cb) { | |
this.manageFirebaseUsers("createUser", {"email":email, "password":password}, cb); | |
}; | |
fb.simplelogin.client.prototype.changePassword = function(email, oldPassword, newPassword, cb) { | |
this.manageFirebaseUsers("changePassword", {"email":email, "oldPassword":oldPassword, "newPassword":newPassword}, function(error) { | |
return cb && cb(error); | |
}); | |
}; | |
fb.simplelogin.client.prototype.removeUser = function(email, password, cb) { | |
this.manageFirebaseUsers("removeUser", {"email":email, "password":password}, function(error) { | |
return cb && cb(error); | |
}); | |
}; | |
fb.simplelogin.client.prototype.sendPasswordResetEmail = function(email, cb) { | |
this.manageFirebaseUsers("sendPasswordResetEmail", {"email":email}, function(error) { | |
return cb && cb(error); | |
}); | |
}; | |
fb.simplelogin.client.onOpen = function(cb) { | |
fb.simplelogin.transports.WinChan.onOpen(cb); | |
}; | |
goog.provide("FirebaseSimpleLogin"); | |
goog.require("fb.simplelogin.client"); | |
goog.require("fb.simplelogin.util.env"); | |
goog.require("fb.simplelogin.util.json"); | |
goog.require("fb.simplelogin.util.validation"); | |
goog.require("fb.simplelogin.util.sjcl"); | |
goog.require("fb.simplelogin.Vars"); | |
goog.require("fb.simplelogin.Errors"); | |
goog.require("fb.simplelogin.SessionStore"); | |
goog.require("fb.simplelogin.providers.Persona"); | |
goog.require("fb.simplelogin.providers.Password"); | |
goog.require("fb.simplelogin.transports.JSONP"); | |
goog.require("fb.simplelogin.transports.CordovaInAppBrowser"); | |
goog.require("fb.simplelogin.transports.TriggerIoTab"); | |
goog.require("fb.simplelogin.transports.WinChan"); | |
goog.require("fb.simplelogin.transports.WindowsMetroAuthBroker"); | |
FirebaseSimpleLogin = function(ref, cb, context, apiHost) { | |
var method = "new FirebaseSimpleLogin"; | |
fb.simplelogin.util.validation.validateArgCount(method, 1, 4, arguments.length); | |
fb.simplelogin.util.validation.validateCallback(method, 2, cb, false); | |
if (goog.isString(ref)) { | |
throw new Error("new FirebaseSimpleLogin(): Oops, it looks like you passed a string instead of a Firebase reference (i.e. new Firebase(<firebaseURL>))."); | |
} | |
var client_ = new fb.simplelogin.client(ref, cb, context, apiHost); | |
return{setApiHost:function(apiHost) { | |
var method = "FirebaseSimpleLogin.setApiHost"; | |
fb.simplelogin.util.validation.validateArgCount(method, 1, 1, arguments.length); | |
client_.setApiHost(apiHost); | |
}, login:function() { | |
client_.login.apply(client_, arguments); | |
}, logout:function() { | |
var methodId = "FirebaseSimpleLogin.logout"; | |
fb.simplelogin.util.validation.validateArgCount(methodId, 0, 0, arguments.length); | |
client_.logout(); | |
}, createUser:function(email, password, cb) { | |
var method = "FirebaseSimpleLogin.createUser"; | |
fb.simplelogin.util.validation.validateArgCount(method, 3, 3, arguments.length); | |
fb.simplelogin.util.validation.validateCallback(method, 3, cb, false); | |
client_.createUser(email, password, cb); | |
}, changePassword:function(email, oldPassword, newPassword, cb) { | |
var method = "FirebaseSimpleLogin.changePassword"; | |
fb.simplelogin.util.validation.validateArgCount(method, 4, 4, arguments.length); | |
fb.simplelogin.util.validation.validateCallback(method, 4, cb, false); | |
client_.changePassword(email, oldPassword, newPassword, cb); | |
}, removeUser:function(email, password, cb) { | |
var method = "FirebaseSimpleLogin.removeUser"; | |
fb.simplelogin.util.validation.validateArgCount(method, 3, 3, arguments.length); | |
fb.simplelogin.util.validation.validateCallback(method, 3, cb, false); | |
client_.removeUser(email, password, cb); | |
}, sendPasswordResetEmail:function(email, cb) { | |
var method = "FirebaseSimpleLogin.sendPasswordResetEmail"; | |
fb.simplelogin.util.validation.validateArgCount(method, 2, 2, arguments.length); | |
fb.simplelogin.util.validation.validateCallback(method, 2, cb, false); | |
client_.sendPasswordResetEmail(email, cb); | |
}}; | |
}; | |
FirebaseSimpleLogin.onOpen = function(cb) { | |
fb.simplelogin.client.onOpen(cb); | |
}; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment