/src/core/prelude.js
JavaScript | 206 lines | 71 code | 12 blank | 123 comment | 16 complexity | ca5c6f86df74a3c69fc1db0fd427c64a MD5 | raw file
- /**
- * Copyright Facebook Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- *
- * @provides fb.prelude
- */
- /**
- * Prelude.
- *
- * Namespaces are one honking great idea -- let's do more of those!
- * -- Tim Peters
- *
- * The Prelude is what keeps us from being messy. In order to co-exist with
- * arbitary environments, we need to control our footprint. The one and only
- * rule to follow here is that we need to limit the globals we introduce. The
- * only global we should every have is ``FB``. This is exactly what the prelude
- * enables us to do.
- *
- * The main method to take away from this file is `FB.copy()`_. As the name
- * suggests it copies things. Its powerful -- but to get started you only need
- * to know that this is what you use when you are augmenting the FB object. For
- * example, this is skeleton for how ``FB.Event`` is defined::
- *
- * FB.provide('Event', {
- * subscribe: function() { ... },
- * unsubscribe: function() { ... },
- * fire: function() { ... }
- * });
- *
- * This is similar to saying::
- *
- * FB.Event = {
- * subscribe: function() { ... },
- * unsubscribe: function() { ... },
- * fire: function() { ... }
- * };
- *
- * Except it does some housekeeping, prevents redefinition by default and other
- * goodness.
- *
- * .. _FB.copy(): #method_FB.copy
- *
- * @class FB
- * @static
- * @access private
- */
- if (!window.FB) {
- FB = {
- // use the init method to set these values correctly
- _apiKey : null,
- _session : null,
- _userStatus : 'unknown', // or 'notConnected' or 'connected'
- // logging is enabled by default. this is the logging shown to the
- // developer and not at all noisy.
- _logging: true,
- _inCanvas: (
- (window.location.search.indexOf('fb_sig_in_iframe=1') > -1) ||
- (window.location.search.indexOf('session=') > -1)),
- //
- // DYNAMIC DATA
- //
- // the various domains needed for using Connect
- _domain: {
- api : 'https://api.facebook.com/',
- api_read : 'https://api-read.facebook.com/',
- cdn : (window.location.protocol == 'https:'
- ? 'https://s-static.ak.fbcdn.net/'
- : 'http://static.ak.fbcdn.net/'),
- graph : 'https://graph.facebook.com/',
- staticfb : 'http://static.ak.facebook.com/',
- www : window.location.protocol + '//www.facebook.com/'
- },
- _locale: null,
- _localeIsRtl: false,
- /**
- * Copies things from source into target.
- *
- * @access private
- * @param target {Object} the target object where things will be copied
- * into
- * @param source {Object} the source object where things will be copied
- * from
- * @param overwrite {Boolean} indicate if existing items should be
- * overwritten
- * @param tranform {function} [Optional], transformation function for
- * each item
- */
- copy: function(target, source, overwrite, transform) {
- for (var key in source) {
- if (overwrite || typeof target[key] === 'undefined') {
- target[key] = transform ? transform(source[key]) : source[key];
- }
- }
- return target;
- },
- /**
- * Create a namespaced object.
- *
- * @access private
- * @param name {String} full qualified name ('Util.foo', etc.)
- * @param value {Object} value to set. Default value is {}. [Optional]
- * @return {Object} The created object
- */
- create: function(name, value) {
- var node = window.FB, // We will use 'FB' as root namespace
- nameParts = name ? name.split('.') : [],
- c = nameParts.length;
- for (var i = 0; i < c; i++) {
- var part = nameParts[i];
- var nso = node[part];
- if (!nso) {
- nso = (value && i + 1 == c) ? value : {};
- node[part] = nso;
- }
- node = nso;
- }
- return node;
- },
- /**
- * Copy stuff from one object to the specified namespace that
- * is FB.<target>.
- * If the namespace target doesn't exist, it will be created automatically.
- *
- * @access private
- * @param target {Object|String} the target object to copy into
- * @param source {Object} the source object to copy from
- * @param overwrite {Boolean} indicate if we should overwrite
- * @return {Object} the *same* target object back
- */
- provide: function(target, source, overwrite) {
- // a string means a dot separated object that gets appended to, or created
- return FB.copy(
- typeof target == 'string' ? FB.create(target) : target,
- source,
- overwrite
- );
- },
- /**
- * Generates a weak random ID.
- *
- * @access private
- * @return {String} a random ID
- */
- guid: function() {
- return 'f' + (Math.random() * (1<<30)).toString(16).replace('.', '');
- },
- /**
- * Logs a message for the developer if logging is on.
- *
- * @access private
- * @param args {Object} the thing to log
- */
- log: function(args) {
- if (FB._logging) {
- //TODO what is window.Debug, and should it instead be relying on the
- // event fired below?
- //#JSCOVERAGE_IF 0
- if (window.Debug && window.Debug.writeln) {
- window.Debug.writeln(args);
- } else if (window.console) {
- window.console.log(args);
- }
- //#JSCOVERAGE_ENDIF
- }
- // fire an event if the event system is available
- if (FB.Event) {
- FB.Event.fire('fb.log', args);
- }
- },
- /**
- * Shortcut for document.getElementById
- * @method $
- * @param {string} DOM id
- * @return DOMElement
- * @access private
- */
- $: function(id) {
- return document.getElementById(id);
- }
- };
- }