gaf-mobile
Version:
GAF mobile Web site
395 lines • 19.6 kB
JavaScript
/*! angular-easyfb
version: 1.4.1
build date: 2015-09-22
author: Robin Fan
https://github.com/pc035860/angular-easyfb.git */
(function(module) {
module.provider("ezfb", function() {
var APP_EVENTS_EVENT_NAMES = {
COMPLETED_REGISTRATION: "fb_mobile_complete_registration",
VIEWED_CONTENT: "fb_mobile_content_view",
SEARCHED: "fb_mobile_search",
RATED: "fb_mobile_rate",
COMPLETED_TUTORIAL: "fb_mobile_tutorial_completion",
ADDED_TO_CART: "fb_mobile_add_to_cart",
ADDED_TO_WISHLIST: "fb_mobile_add_to_wishlist",
INITIATED_CHECKOUT: "fb_mobile_initiated_checkout",
ADDED_PAYMENT_INFO: "fb_mobile_add_payment_info",
ACHIEVED_LEVEL: "fb_mobile_level_achieved",
UNLOCKED_ACHIEVEMENT: "fb_mobile_achievement_unlocked",
SPENT_CREDITS: "fb_mobile_spent_credits"
}, APP_EVENTS_PARAMETER_NAMES = {
CURRENCY: "fb_currency",
REGISTRATION_METHOD: "fb_registration_method",
CONTENT_TYPE: "fb_content_type",
CONTENT_ID: "fb_content_id",
SEARCH_STRING: "fb_search_string",
SUCCESS: "fb_success",
MAX_RATING_VALUE: "fb_max_rating_value",
PAYMENT_INFO_AVAILABLE: "fb_payment_info_available",
NUM_ITEMS: "fb_num_items",
LEVEL: "fb_level",
DESCRIPTION: "fb_description"
};
var NO_CALLBACK = -1;
var _publishedApis = {
api: [ 1, 2, 3 ],
ui: 1,
getAuthResponse: NO_CALLBACK,
getLoginStatus: 0,
login: 0,
logout: 0,
"Event.subscribe": 1,
"Event.unsubscribe": 1,
"XFBML.parse": 1,
"Canvas.Prefetcher.addStaticResource": NO_CALLBACK,
"Canvas.Prefetcher.setCollectionMode": NO_CALLBACK,
"Canvas.getPageInfo": 0,
"Canvas.hideFlashElement": NO_CALLBACK,
"Canvas.scrollTo": NO_CALLBACK,
"Canvas.setAutoGrow": NO_CALLBACK,
"Canvas.setDoneLoading": 0,
"Canvas.setSize": NO_CALLBACK,
"Canvas.setUrlHandler": 0,
"Canvas.showFlashElement": NO_CALLBACK,
"Canvas.startTimer": NO_CALLBACK,
"Canvas.stopTimer": 0,
"AppEvents.logEvent": NO_CALLBACK,
"AppEvents.logPurchase": NO_CALLBACK,
"AppEvents.activateApp": NO_CALLBACK
};
var _locale = "en_US";
var _initParams = {
status: true,
cookie: true,
xfbml: true,
version: "v2.4"
};
var _defaultLoadSDKFunction = [ "$window", "$document", "ezfbAsyncInit", "ezfbLocale", function($window, $document, ezfbAsyncInit, ezfbLocale) {
(function(d) {
var js, id = "facebook-jssdk", ref = d.getElementsByTagName("script")[0];
if (d.getElementById(id)) {
return;
}
js = d.createElement("script");
js.id = id;
js.async = true;
js.src = "//connect.facebook.net/" + ezfbLocale + "/sdk.js";
ref.parentNode.insertBefore(js, ref);
})($document[0]);
$window.fbAsyncInit = ezfbAsyncInit;
} ], _loadSDKFunction = _defaultLoadSDKFunction;
var _defaultInitFunction = [ "$window", "ezfbInitParams", function($window, ezfbInitParams) {
$window.FB.init(ezfbInitParams);
} ], _initFunction = _defaultInitFunction;
function _config(target, config) {
if (angular.isObject(config)) {
angular.extend(target, config);
} else {
return angular.copy(target);
}
}
function _proxy(func, context, args) {
return function() {
return func.apply(context, args);
};
}
return {
setInitParams: function(params) {
_config(_initParams, params);
},
getInitParams: function() {
return _config(_initParams);
},
setLocale: function(locale) {
_locale = locale;
},
getLocale: function() {
return _locale;
},
setLoadSDKFunction: function(func) {
if (angular.isArray(func) || angular.isFunction(func)) {
_loadSDKFunction = func;
} else {
throw new Error("Init function type error.");
}
},
getLoadSDKFunction: function() {
return _loadSDKFunction;
},
setInitFunction: function(func) {
if (angular.isArray(func) || angular.isFunction(func)) {
_initFunction = func;
} else {
throw new Error("Init function type error.");
}
},
getInitFunction: function() {
return _initFunction;
},
$get: [ "$window", "$q", "$document", "$parse", "$rootScope", "$injector", "$timeout", function($window, $q, $document, $parse, $rootScope, $injector, $timeout) {
var _initReady, _initRenderReady, _ezfb, _savedListeners, _paramsReady, ezfbAsyncInit;
_savedListeners = {};
_paramsReady = $q.defer();
if (_initParams.appId || _initFunction !== _defaultInitFunction) {
_paramsReady.resolve();
}
_initReady = $q.defer();
_initRenderReady = $q.defer();
if (!$document[0].getElementById("fb-root")) {
$document.find("body").append('<div id="fb-root"></div>');
}
ezfbAsyncInit = function() {
_paramsReady.promise.then(function() {
var onRender = function() {
_ezfb.$$rendered = true;
$timeout(function() {
_initRenderReady.resolve();
});
_ezfb.Event.unsubscribe("xfbml.render", onRender);
};
_ezfb.Event.subscribe("xfbml.render", onRender);
$injector.invoke(_initFunction, null, {
ezfbInitParams: _initParams
});
_ezfb.$$ready = true;
_initReady.resolve();
});
};
$injector.invoke(_loadSDKFunction, null, {
ezfbAsyncInit: ezfbAsyncInit,
ezfbLocale: _locale
});
_ezfb = {
$$ready: false,
$$rendered: false,
$ready: function(fn) {
if (angular.isFunction(fn)) {
_initReady.promise.then(fn);
}
return _initReady.promise;
},
$rendered: function(fn) {
if (angular.isFunction(fn)) {
_initRenderReady.promise.then(fn);
}
return _initRenderReady.promise;
},
init: function(params) {
_config(_initParams, params);
_paramsReady.resolve();
},
AppEvents: {
EventNames: APP_EVENTS_EVENT_NAMES,
ParameterNames: APP_EVENTS_PARAMETER_NAMES
}
};
angular.forEach(_publishedApis, function(cbArgIndex, apiPath) {
var getter = $parse(apiPath), setter = getter.assign;
setter(_ezfb, function() {
var apiCall = _proxy(function(args) {
var dfd, replaceCallbackAt;
dfd = $q.defer();
replaceCallbackAt = function(index) {
var func, newFunc;
func = angular.isFunction(args[index]) ? args[index] : angular.noop;
newFunc = function() {
var funcArgs = Array.prototype.slice.call(arguments);
if ($rootScope.$$phase) {
func.apply(null, funcArgs);
dfd.resolve.apply(dfd, funcArgs);
} else {
$rootScope.$apply(function() {
func.apply(null, funcArgs);
dfd.resolve.apply(dfd, funcArgs);
});
}
};
while (args.length <= index) {
args.push(null);
}
var eventName;
if (apiPath === "Event.subscribe") {
eventName = args[0];
if (angular.isUndefined(_savedListeners[eventName])) {
_savedListeners[eventName] = [];
}
_savedListeners[eventName].push({
original: func,
wrapped: newFunc
});
} else if (apiPath === "Event.unsubscribe") {
eventName = args[0];
if (angular.isArray(_savedListeners[eventName])) {
var i, subscribed, l = _savedListeners[eventName].length;
for (i = 0; i < l; i++) {
subscribed = _savedListeners[eventName][i];
if (subscribed.original === func) {
newFunc = subscribed.wrapped;
_savedListeners[eventName].splice(i, 1);
break;
}
}
}
}
args[index] = newFunc;
};
if (cbArgIndex !== NO_CALLBACK) {
if (angular.isNumber(cbArgIndex)) {
replaceCallbackAt(cbArgIndex);
} else if (angular.isArray(cbArgIndex)) {
var i, c;
for (i = 0; i < cbArgIndex.length; i++) {
c = cbArgIndex[i];
if (args.length == c || args.length == c + 1 && angular.isFunction(args[c])) {
replaceCallbackAt(c);
break;
}
}
}
}
var origFBFunc = getter($window.FB);
if (!origFBFunc) {
throw new Error("Facebook API `FB." + apiPath + "` doesn't exist.");
}
origFBFunc.apply($window.FB, args);
return dfd.promise;
}, null, [ Array.prototype.slice.call(arguments) ]);
if (apiPath === "getAuthResponse") {
if (angular.isUndefined($window.FB)) {
throw new Error("`FB` is not ready.");
}
return $window.FB.getAuthResponse();
} else if (cbArgIndex === NO_CALLBACK) {
_initReady.promise.then(apiCall);
} else {
return _initReady.promise.then(apiCall);
}
});
});
return _ezfb;
} ]
};
}).directive("ezfbXfbml", [ "ezfb", "$parse", "$compile", "$timeout", function(ezfb, $parse, $compile, $timeout) {
return {
restrict: "EAC",
controller: function() {},
compile: function(tElm, tAttrs) {
var _savedHtml = tElm.html();
return function postLink(scope, iElm, iAttrs) {
var _rendering = true, onrenderExp = iAttrs.onrender, onrenderHandler = function() {
if (_rendering) {
if (onrenderExp) {
scope.$eval(onrenderExp);
}
_rendering = false;
}
};
ezfb.XFBML.parse(iElm[0], onrenderHandler);
var setter = $parse(iAttrs.ezfbXfbml).assign;
scope.$watch(iAttrs.ezfbXfbml, function(val) {
if (val) {
_rendering = true;
iElm.html(_savedHtml);
$compile(iElm.contents())(scope);
$timeout(function() {
ezfb.XFBML.parse(iElm[0], onrenderHandler);
});
(setter || angular.noop)(scope, false);
}
}, true);
};
}
};
} ]);
var _socialPluginDirectiveConfig = {
fbLike: [ "action", "colorscheme", "href", "kidDirectedSite", "layout", "ref", "share", "showFaces", "width" ],
fbShareButton: [ "href", "layout", "width" ],
fbSend: [ "colorscheme", "href", "kidDirectedSite", "ref" ],
fbPost: [ "href", "width" ],
fbFollow: [ "colorscheme", "href", "kidDirectedSite", "layout", "showFaces", "width" ],
fbComments: [ "colorscheme", "href", "mobile", "numPosts", "orderBy", "width" ],
fbCommentsCount: [ "href" ],
fbActivity: [ "action", "appId", "colorscheme", "filter", "header", "height", "linktarget", "maxAge", "recommendations", "ref", "site", "width" ],
fbRecommendations: [ "action", "appId", "colorscheme", "header", "height", "linktarget", "maxAge", "ref", "site", "width" ],
fbRecommendationsBar: [ "action", "href", "maxAge", "numRecommendations", "readTime", "ref", "side", "site", "trigger" ],
fbLikeBox: [ "colorscheme", "forceWall", "header", "height", "href", "showBorder", "showFaces", "stream", "width" ],
fbFacepile: [ "action", "appId", "colorscheme", "href", "maxRows", "size", "width" ],
fbPage: [ "href", "width", "height", "hideCover", "showFacepile", "showPosts" ],
fbVideo: [ "href", "width", "allowfullscreen" ],
fbAdPreview: [ "adAccountId", "adgroupId", "creative", "creativeId", "adFormat", "pageType", "targeting", "post" ]
};
angular.forEach(_socialPluginDirectiveConfig, creatSocialPluginDirective);
function creatSocialPluginDirective(availableAttrs, dirName) {
var CLASS_WRAP = "ezfb-social-plugin-wrap", STYLE_WRAP_SPAN = "display: inline-block; width: 0; height: 0; overflow: hidden;";
var PLUGINS_WITH_ADAPTIVE_WIDTH = [ "fbPage", "fbComments" ];
var _wrap = function($elm) {
var tmpl = '<span class="' + CLASS_WRAP + '" style="' + STYLE_WRAP_SPAN + '">';
return $elm.wrap(tmpl).parent();
}, _wrapAdaptive = function($elm) {
var tmpl = '<div class="' + CLASS_WRAP + '">';
return $elm.wrap(tmpl).parent();
}, _isWrapped = function($elm) {
return $elm.parent().hasClass(CLASS_WRAP);
}, _unwrap = function($elm) {
var $parent = $elm.parent();
$parent.after($elm).remove();
return $elm;
};
module.directive(dirName, [ "ezfb", "$q", "$document", function(ezfb, $q, $document) {
var _withAdaptiveWidth = PLUGINS_WITH_ADAPTIVE_WIDTH.indexOf(dirName) >= 0;
var _dirClassName = dirName.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
return {
restrict: "EC",
require: "?^ezfbXfbml",
compile: function(tElm, tAttrs) {
tElm.removeClass(_dirClassName);
return function postLink(scope, iElm, iAttrs, xfbmlCtrl) {
if (xfbmlCtrl) {
return;
}
var rendering = false, renderId = 0;
ezfb.$rendered().then(function() {
iElm.addClass(_dirClassName);
scope.$watch(function() {
var watchList = [];
angular.forEach(availableAttrs, function(attrName) {
watchList.push(iAttrs[attrName]);
});
return watchList;
}, function(v) {
var wrapFn;
renderId++;
if (!rendering) {
rendering = true;
wrapFn = _withAdaptiveWidth ? _wrapAdaptive : _wrap;
ezfb.XFBML.parse(wrapFn(iElm)[0], genOnRenderHandler(renderId));
} else {
ezfb.XFBML.parse(iElm.parent()[0], genOnRenderHandler(renderId));
}
}, true);
});
iElm.bind("$destroy", function() {
if (_isWrapped(iElm)) {
_unwrap(iElm);
}
});
function genOnRenderHandler(id) {
return function() {
var onrenderExp;
if (rendering && id === renderId) {
onrenderExp = iAttrs.onrender;
if (onrenderExp) {
scope.$eval(onrenderExp);
}
rendering = false;
_unwrap(iElm);
}
};
}
};
}
};
} ]);
}
})(angular.module("ezfb", []));