From e0e0a808c7d628306e08a2f04011d2ce6f6c97e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?De=27Yonte=CC=81=1C=20Wilkinson?= Date: Thu, 23 Feb 2017 12:47:58 -0500 Subject: [PATCH 1/5] Convert library to AMD and CommonJS module. Updated the LuminateExtend library to respond to ajax errors. Updated version number text to 1.8.1. Added package.json and bower.json file for publishing When making a request to the Luminate API and an HTTP error occurs (e.g. cross-site domain requests), neither the success callback nor the error callback are called. This causes confusion since you would have no idea why your Ajax request failed since your handler would not be called. Updated README with NPM installation method --- README.md | 7 ++++ bower.json | 27 +++++++++++++ luminateExtend.js | 92 ++++++++++++++++++++++++++++++++++--------- luminateExtend.min.js | 4 +- package.json | 32 +++++++++++++++ src/luminateExtend.js | 92 ++++++++++++++++++++++++++++++++++--------- 6 files changed, 216 insertions(+), 38 deletions(-) create mode 100644 bower.json create mode 100644 package.json diff --git a/README.md b/README.md index 91a6aa8..1fe7caf 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,7 @@ Before using luminateExtend.js, there are a few basic steps you must follow: Including the library --------------------- +### Quick start Once you've uploaded [luminateExtend.min.js](https://github.com/noahcooper/luminateExtend/blob/master/luminateExtend.min.js) to your website, including the library on a page is easy — simply pull in the library somewhere below where @@ -97,6 +98,12 @@ As of v1.6, luminateExtend.js can be used with [Zepto](http://zeptojs.com) in li ``` +### Install with NPM +```js +var jQuery = require('jquery'); +var luminateExtend = require('luminateExtend'); +``` + The luminateExtend object ------------------------- diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..c4155f7 --- /dev/null +++ b/bower.json @@ -0,0 +1,27 @@ +{ + "name": "luminateExtend", + "description": "A JavaScript library for use with Blackbaud's Luminate Online product suite", + "version": "1.8.1", + "main": "luminateExtend.js", + "authors": [ + "noahcooper" + ], + "license": "MIT", + "keywords": [ + "luminate", + "blackbaud", + "teamraiser", + "team", + "raiser", + "convio" + ], + "homepage": "https://github.com/noahcooper/luminateExtend", + "moduleType": [], + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ] +} diff --git a/luminateExtend.js b/luminateExtend.js index eef0f75..1e56ca4 100644 --- a/luminateExtend.js +++ b/luminateExtend.js @@ -1,12 +1,31 @@ /* * luminateExtend.js - * Version: 1.8.1 (18-OCT-2016) + * Version: 1.8.1 (23-FEB-2017) * Requires: jQuery v1.5.1+ or Zepto v1.1+ * Includes: SimpleDateFormatJS v1.3 (https://github.com/noahcooper/SimpleDateFormatJS) */ -(function($) { - /* private helper functions */ + +(function (factory) { + // If there is a variable named module and it has an exports property, + // then we're working in a Node-like environment. Use require to load + // the jQuery object that the module system is using and pass it in. + if (typeof define === 'function' && define.amd) { + define(['jquery'], function(jquery){ + return factory(jquery, window, document); + }); + } else if(typeof module === "object" && typeof module.exports === "object") { + module.exports = factory(require('jQuery'), window, document); + } + // Otherwise, we're working in a browser, so just pass in the global + // jQuery or Zepto object. + else { + factory(typeof jQuery === 'undefined' && typeof Zepto === 'function' ? Zepto : jQuery, window, document); + } +}(function($, window, document, undefined) { + // This code will receive whatever jQuery object was passed in from + // the function above and will attach the tipso plugin to it. + // var validateLocale = function(locale) { /* if a locale is provided that is not supported, default to "en_US" */ if(locale && $.inArray(locale, ['es_US', 'en_CA', 'fr_CA', 'en_GB', 'en_AU']) < 0) { @@ -33,10 +52,32 @@ (data ? ('&' + data) : ''); }, - apiCallbackHandler = function(requestSettings, responseData) { - if(requestSettings.responseFilter && + apiCallbackHandler = function(requestSettings, responseData, jqXHR_textStatus) { + // test if response data is a jqXHR object. This means, we have had a AJAX error for some reason + if (typeof responseData.getResponseHeader === 'function') { + // if the XML HTTP status is 0, it could be due to a Cross-site scripting issue related to CORS header. + // Normally we would use the error directly from the ajax request but a status of 0 has an empty response text + if (responseData.status == 0) { + var port = window.location.port; + var addendum = '. You need to whitelist the domain and port API requests are originating from'; + + if (port !== '') { + port = ':' + port; + } else { + addendum = ''; + } + + var message = 'Check your Luminate API settings to make sure ' + window.location.hostname + port + ' is whitelisted' + addendum; + + responseData = new luminateExtend.api.error(message); + } else { + responseData = new luminateExtend.api.error(jqXHR_textStatus); + } + + } else if(requestSettings.responseFilter && requestSettings.responseFilter.array && requestSettings.responseFilter.filter) { + if(luminateExtend.utils.stringToObj(requestSettings.responseFilter.array, responseData)) { var filterKey = requestSettings.responseFilter.filter.split('==')[0].split('!=')[0].replace(/^\s+|\s+$/g, ''), filterOperator, @@ -104,7 +145,7 @@ if(typeof requestSettings.callback === 'function') { callbackFn = requestSettings.callback; } - else if(requestSettings.callback.error && responseData.errorResponse) { + else if((requestSettings.callback.error && responseData.errorResponse) || responseData instanceof Error) { callbackFn = requestSettings.callback.error; } else if(requestSettings.callback.success && !responseData.errorResponse) { @@ -114,22 +155,21 @@ var isLoginRequest = requestSettings.data.indexOf('&method=login') !== -1 && requestSettings.data.indexOf('&method=loginTest') === -1, isLogoutRequest = requestSettings.data.indexOf('&method=logout') !== -1; - - if(!isLoginRequest && !isLogoutRequest) { + + if((!isLoginRequest && !isLogoutRequest) || responseData instanceof Error) { callbackFn(responseData); } - /* get a new auth token after login or logout */ else { var newAuthCallback = function() { callbackFn(responseData); - }, + }, getAuthOptions = { callback: newAuthCallback, useCache: false, useHTTPS: requestSettings.useHTTPS }; - + if(isLoginRequest && responseData.loginResponse && responseData.loginResponse.nonce) { getAuthOptions.nonce = 'NONCE_TOKEN=' + responseData.loginResponse.nonce; } @@ -146,7 +186,7 @@ /* library info */ luminateExtend.library = { - version: '1.7.1' + version: '1.8.1' }; /* global settings */ @@ -350,6 +390,7 @@ luminateExtend.api.getAuthLoad = true; var sendRequest = function(options) { + var settings = $.extend({ contentType: 'application/x-www-form-urlencoded', data: '', @@ -449,6 +490,7 @@ } var doRequest; + if(useAjax) { doRequest = function() { if(luminateExtend.global.routingId && luminateExtend.global.routingId !== '') { @@ -471,10 +513,9 @@ contentType: settings.contentType, /* set dataType explicitly as API sends Content-Type: text/plain rather than application/json (E-62659) */ dataType: 'json', - type: 'POST', - success: function(data) { - apiCallbackHandler(settings, data); - } + type: 'POST', + }).always(function(xhr_or_data, status, xhr_error) { + apiCallbackHandler(settings, xhr_or_data, status); }); }; } @@ -568,7 +609,7 @@ if(!$.isArray(requests)) { sendRequest(requests); } - + else { requests.reverse(); @@ -619,6 +660,21 @@ }); } }; + + luminateExtend.api.error = function(message) { + function LuminateError(message) { + this.name = 'LuminateError'; + this.default_message = 'Error communicating with the Luminate API. Check your Luminate API settings'; + + this.message = message || this.default_message; + this.stack = (new Error()).stack; + } + + LuminateError.prototype = Object.create(Error.prototype); + LuminateError.prototype.constructor = LuminateError; + + return new LuminateError(message); + }; /* session variables */ luminateExtend.sessionVars = { @@ -1014,4 +1070,4 @@ return formattedDate; } }; -})(typeof jQuery === 'undefined' && typeof Zepto === 'function' ? Zepto : jQuery); \ No newline at end of file +})); \ No newline at end of file diff --git a/luminateExtend.min.js b/luminateExtend.min.js index 39cc399..26d5b92 100644 --- a/luminateExtend.min.js +++ b/luminateExtend.min.js @@ -1,2 +1,2 @@ -/* luminateExtend.js | Version: 1.8.1 (18-OCT-2016) */ -!function(a){var b=function(b){return b&&a.inArray(b,["es_US","en_CA","fr_CA","en_GB","en_AU"])<0&&(b="en_US"),b},c=function(a){return a&&(a=b(a),luminateExtend.sessionVars.set("locale",a)),a},d=function(a,b){return(a?luminateExtend.global.path.secure+"S":luminateExtend.global.path.nonsecure)+"PageServer"+(luminateExtend.global.routingId&&""!==luminateExtend.global.routingId?";"+luminateExtend.global.routingId:"")+"?pagename=luminateExtend_server&pgwrap=n"+(b?"&"+b:"")},e=function(b,c){if(b.responseFilter&&b.responseFilter.array&&b.responseFilter.filter&&luminateExtend.utils.stringToObj(b.responseFilter.array,c)){var e,f,d=b.responseFilter.filter.split("==")[0].split("!=")[0].replace(/^\s+|\s+$/g,"");if(b.responseFilter.filter.indexOf("!=")!==-1?(e="nequal",f=b.responseFilter.filter.split("!=")[1]):b.responseFilter.filter.indexOf("==")!==-1&&(e="equal",f=b.responseFilter.filter.split("==")[1]),e&&f){f=f.replace(/^\s+|\s+$/g,"");var g=[],h=!1;if(a.each(luminateExtend.utils.ensureArray(luminateExtend.utils.stringToObj(b.responseFilter.array,c)),function(){"nequal"===e&&this[d]===f||"equal"===e&&this[d]!==f?h=!0:g.push(this)}),h){var i=b.responseFilter.array.split(".");a.each(c,function(b,d){b===i[0]&&a.each(d,function(d,e){d===i[1]&&(2===i.length?c[b][d]=g:a.each(e,function(e,f){e===i[2]&&(3===i.length?c[b][d][e]=g:a.each(f,function(a,f){a===i[3]&&4===i.length&&(c[b][d][e][a]=g)}))}))})})}}}var j=a.noop;b.callback&&("function"==typeof b.callback?j=b.callback:b.callback.error&&c.errorResponse?j=b.callback.error:b.callback.success&&!c.errorResponse&&(j=b.callback.success));var k=b.data.indexOf("&method=login")!==-1&&b.data.indexOf("&method=loginTest")===-1,l=b.data.indexOf("&method=logout")!==-1;if(k||l){var m=function(){j(c)},n={callback:m,useCache:!1,useHTTPS:b.useHTTPS};k&&c.loginResponse&&c.loginResponse.nonce&&(n.nonce="NONCE_TOKEN="+c.loginResponse.nonce),luminateExtend.api.getAuth(n)}else j(c)};window.luminateExtend=function(a){luminateExtend.init(a||{})},luminateExtend.library={version:"1.7.1"},luminateExtend.global={update:function(b,d){b&&(b.length?d&&("locale"===b&&(d=c(d)),luminateExtend.global[b]=d):(b.locale&&(b.locale=c(b.locale)),luminateExtend.global=a.extend(luminateExtend.global,b)))}},luminateExtend.init=function(c){var d=a.extend({apiCommon:{},auth:{type:"auth"},path:{}},c||{});if(d.locale&&(d.locale=b(d.locale)),d.supportsCORS=!1,window.XMLHttpRequest){var e=new XMLHttpRequest;"withCredentials"in e&&(d.supportsCORS=!0)}return luminateExtend.global=a.extend(luminateExtend.global,d),luminateExtend},luminateExtend.api=function(a){luminateExtend.api.request(a||{})},luminateExtend.api.bind=function(b){return b=b||"form.luminateApi",a(b).length>0&&a(b).each(function(){"form"===this.nodeName.toLowerCase()&&a(this).bind("submit",function(b){b.cancelBubble=!0,b.returnValue=!1,b.stopPropagation&&(b.stopPropagation(),b.preventDefault()),a(this).attr("id")||a(this).attr("id","luminateApi-"+(new Date).getTime());var g,c=a(this).attr("action"),d=c.split("?"),e=a(this).data("luminateapi"),f=d[0].indexOf("/site/")!==-1?d[0].split("/site/")[1]:d[0],h=a(this).attr("enctype"),i=d.length>1?d[1]:"",j="#"+a(this).attr("id"),k=!1,l=!1;e&&(e.callback&&(g=luminateExtend.utils.stringToObj(e.callback)),e.requiresAuth&&"true"===e.requiresAuth&&(k=!0),(0===c.indexOf("https:")||"https:"===window.location.protocol&&c.indexOf("http")===-1)&&(l=!0)),luminateExtend.api.request({api:f,callback:g,contentType:h,data:i,form:j,requiresAuth:k,useHTTPS:l})})}),luminateExtend},luminateExtend.api.getAuth=function(b){var c=a.extend({useCache:!0,useHTTPS:!1},b||{});if(luminateExtend.api.getAuthLoad)if(luminateExtend.api.getAuthLoad=!1,c.useCache&&luminateExtend.global.auth.type&&luminateExtend.global.auth.token)luminateExtend.api.getAuthLoad=!0,c.callback&&c.callback();else{var e=function(a){luminateExtend.global.update(a),luminateExtend.api.getAuthLoad=!0,c.callback&&c.callback()};luminateExtend.global.supportsCORS?a.ajax({url:(c.useHTTPS?luminateExtend.global.path.secure:luminateExtend.global.path.nonsecure)+"CRConsAPI",data:"luminateExtend="+luminateExtend.library.version+(c.nonce&&""!==c.nonce?"&"+c.nonce:"")+"&api_key="+luminateExtend.global.apiKey+"&method=getLoginUrl&response_format=json&v=1.0",xhrFields:{withCredentials:!0},dataType:"json",success:function(a){var b=a.getLoginUrlResponse,c=b.url,d=b.routing_id,f=b.JSESSIONID;d||c.indexOf("CRConsAPI;jsessionid=")===-1||(d=c.split("CRConsAPI;jsessionid=")[1].split("?")[0]),e({auth:{type:"auth",token:b.token},routingId:d?"jsessionid="+d:"",sessionCookie:f?"JSESSIONID="+f:""})}}):a.ajax({url:d(c.useHTTPS,"action=getAuth&callback=?"),dataType:"jsonp",success:e})}else{var f=function(){luminateExtend.api.getAuth(c)};setTimeout(f,1e3)}},luminateExtend.api.getAuthLoad=!0;var f=function(b){var c=a.extend({contentType:"application/x-www-form-urlencoded",data:"",requiresAuth:!1,useHTTPS:null},b||{}),f=["addressbook","advocacy","connect","cons","content","datasync","donation","email","group","orgevent","recurring","survey","teamraiser"];if(a.inArray(c.api.toLowerCase(),f)>=0&&(c.api="CR"+c.api.charAt(0).toUpperCase()+c.api.slice(1).toLowerCase()+"API",c.api=c.api.replace("Addressbook","AddressBook").replace("Datasync","DataSync").replace("Orgevent","OrgEvent")),luminateExtend.global.path.nonsecure&&luminateExtend.global.path.secure&&luminateExtend.global.apiKey&&c.api){"multipart/form-data"===c.contentType.split(";")[0]?c.contentType="multipart/form-data":c.contentType="application/x-www-form-urlencoded",c.contentType+="; charset=UTF-8",c.data="luminateExtend="+luminateExtend.library.version+(""===c.data?"":"&"+c.data),c.form&&a(c.form).length>0&&(c.data+="&"+a(c.form).eq(0).serialize()),c.data.indexOf("&api_key=")===-1&&(c.data+="&api_key="+luminateExtend.global.apiKey),luminateExtend.global.apiCommon.centerId&&c.data.indexOf("¢er_id=")===-1&&(c.data+="¢er_id="+luminateExtend.global.apiCommon.centerId),luminateExtend.global.apiCommon.categoryId&&c.data.indexOf("&list_category_id=")===-1&&(c.data+="&list_category_id="+luminateExtend.global.apiCommon.categoryId),c.data.indexOf("&response_format=xml")!==-1?c.data=c.data.replace(/&response_format=xml/g,"&response_format=json"):c.data.indexOf("&response_format=")===-1&&(c.data+="&response_format=json"),luminateExtend.global.apiCommon.source&&c.data.indexOf("&source=")===-1&&(c.data+="&source="+luminateExtend.global.apiCommon.source),luminateExtend.global.apiCommon.subSource&&c.data.indexOf("&sub_source=")===-1&&(c.data+="&sub_source="+luminateExtend.global.apiCommon.subSource),c.data.indexOf("&suppress_response_codes=")===-1&&(c.data+="&suppress_response_codes=true"),luminateExtend.global.locale&&c.data.indexOf("&s_locale=")===-1&&(c.data+="&s_locale="+luminateExtend.global.locale),c.data.indexOf("&v=")===-1&&(c.data+="&v=1.0");var g="http://",h=luminateExtend.global.path.nonsecure.split("http://")[1];"CRDonationAPI"===c.api||"CRTeamraiserAPI"===c.api||"CRConnectAPI"!==c.api&&("https:"===window.location.protocol&&null==c.useHTTPS||1==c.useHTTPS)?c.useHTTPS=!0:c.useHTTPS=!1,c.useHTTPS&&(g="https://",h=luminateExtend.global.path.secure.split("https://")[1]),g+=h+c.api;var i=!1,j=!1,k=!1;window.location.protocol===g.split("//")[0]&&document.domain===h.split("/")[0]?(i=!0,j=!0):luminateExtend.global.supportsCORS?j=!0:"postMessage"in window&&(k=!0);var l;j?l=function(){luminateExtend.global.routingId&&""!==luminateExtend.global.routingId&&(g+=";"+luminateExtend.global.routingId),c.requiresAuth&&c.data.indexOf("&"+luminateExtend.global.auth.type+"=")===-1&&(c.data+="&"+luminateExtend.global.auth.type+"="+luminateExtend.global.auth.token),luminateExtend.global.sessionCookie&&""!==luminateExtend.global.sessionCookie&&(c.data+="&"+luminateExtend.global.sessionCookie),c.data+="&ts="+(new Date).getTime(),a.ajax({url:g,data:c.data,xhrFields:{withCredentials:!0},contentType:c.contentType,dataType:"json",type:"POST",success:function(a){e(c,a)}})}:k&&(l=function(){var b=(new Date).getTime(),f="luminateApiPostMessage"+b,h=d(c.useHTTPS,"action=postMessage");luminateExtend.global.routingId&&""!==luminateExtend.global.routingId&&(g+=";"+luminateExtend.global.routingId),c.requiresAuth&&c.data.indexOf("&"+luminateExtend.global.auth.type+"=")===-1&&(c.data+="&"+luminateExtend.global.auth.type+"="+luminateExtend.global.auth.token),luminateExtend.global.sessionCookie&&""!==luminateExtend.global.sessionCookie&&(c.data+="&"+luminateExtend.global.sessionCookie),c.data+="&ts="+b,luminateExtend.api.request.postMessageEventHandler||(luminateExtend.api.request.postMessageEventHandler={},luminateExtend.api.request.postMessageEventHandler.handler=function(b){if(luminateExtend.global.path.nonsecure.indexOf(b.origin)!==-1||luminateExtend.global.path.secure.indexOf(b.origin)!==-1){var c=a.parseJSON(b.data),d=c.postMessageFrameId,e=a.parseJSON(decodeURIComponent(c.response));luminateExtend.api.request.postMessageEventHandler[d]&&luminateExtend.api.request.postMessageEventHandler[d](d,e)}},"undefined"!=typeof window.addEventListener?window.addEventListener("message",luminateExtend.api.request.postMessageEventHandler.handler,!1):"undefined"!=typeof window.attachEvent&&window.attachEvent("onmessage",luminateExtend.api.request.postMessageEventHandler.handler)),luminateExtend.api.request.postMessageEventHandler[f]=function(b,d){e(c,d),a("#"+b).remove(),delete luminateExtend.api.request.postMessageEventHandler[b]},a("body").append(''),a("#"+f).bind("load",function(){var b='{"postMessageFrameId": "'+a(this).attr("id")+'", "requestUrl": "'+g+'", "requestContentType": "'+c.contentType+'", "requestData": "'+c.data+'"}',d=g.split("/site/")[0].split("/admin/")[0];document.getElementById(a(this).attr("id")).contentWindow.postMessage(b,d)}),a("#"+f).attr("src",h)}),c.requiresAuth||!j&&!i&&!luminateExtend.global.sessionCookie?luminateExtend.api.getAuth({callback:l,useHTTPS:c.useHTTPS}):l()}};luminateExtend.api.request=function(b){if(a.isArray(b)){b.reverse();var c=[];a.each(b,function(d){var e=a.extend({async:!0},this);if(e.async||d===b.length-1)c.push(e);else{var g=b[d+1];if(g.callback&&"function"!=typeof g.callback){var h=g.callback.success||a.noop;g.callback.success=function(a){h(a),f(e)}}else{var g=b[d+1],i=g.callback||a.noop;g.callback={success:function(a){i(a),f(e)},error:function(a){i(a)}}}}}),c.reverse(),a.each(c,function(){f(this)})}else f(b)},luminateExtend.sessionVars={set:function(a,b,c){var d={};c&&(d.callback=c),a&&(d.data="s_"+a+"="+(b||""),luminateExtend.utils.ping(d))}},luminateExtend.tags=function(a,b){luminateExtend.tags.parse(a,b)},luminateExtend.tags.parse=function(b,c){luminateExtend.widgets?luminateExtend.widgets(b,c):(b=b&&"all"!==b?luminateExtend.utils.ensureArray(b):["cons"],c=c||"body",a.each(b,function(b,d){if("cons"===d){var e=a(c).find(document.getElementsByTagName("luminate:cons"));if(e.length>0){var f=function(b){e.each(function(){b.getConsResponse?a(this).replaceWith(luminateExtend.utils.stringToObj(a(this).attr("field"),b.getConsResponse)):a(this).remove()})};luminateExtend.api.request({api:"cons",callback:f,data:"method=getUser",requiresAuth:!0})}}}))},luminateExtend.utils={ensureArray:function(b){return a.isArray(b)?b:b?[b]:[]},stringToObj:function(a,b){var c=b||window;if(a)for(var d=a.split("."),e=0;e'),a("#"+d).bind("load",function(){a(this).remove(),c.callback&&c.callback()}),a("#"+d).attr("src",("https:"===window.location.protocol?luminateExtend.global.path.secure:luminateExtend.global.path.nonsecure)+"EstablishSession"+(luminateExtend.global.routingId&&""!==luminateExtend.global.routingId?";"+luminateExtend.global.routingId:"")+"?"+(null==c.data?"":c.data+"&")+"NEXTURL="+encodeURIComponent(("https:"===window.location.protocol?luminateExtend.global.path.secure:luminateExtend.global.path.nonsecure)+"PixelServer"))},simpleDateFormat:function(c,d,e){if(e=e||luminateExtend.global.locale,e=b(e),d=d||(a.inArray(e,["en_CA","fr_CA","en_GB","en_AU"])>=0?"d/M/yy":"M/d/yy"),c=c||new Date,!(c instanceof Date)){var f=c.split("T")[0].split("-"),g=c.split("T").length>1?c.split("T")[1].split(".")[0].split("Z")[0].split("-")[0].split(":"):["00","00","00"];c=new Date(f[0],f[1]-1,f[2],g[0],g[1],g[2])}var h=function(a){return a=""+a,0===a.indexOf("0")&&"0"!==a?a.substring(1):a},i=function(a){return a=Number(a),isNaN(a)?"00":(a<10?"0":"")+a},j={month:i(c.getMonth()+1),date:i(c.getDate()),year:i(c.getFullYear()),day:c.getDay(),hour24:c.getHours(),hour12:c.getHours(),minutes:i(c.getMinutes()),ampm:"AM"};j.hour24>11&&(j.ampm="PM"),j.hour24=i(j.hour24),0===j.hour12&&(j.hour12=12),j.hour12>12&&(j.hour12=j.hour12-12),j.hour12=i(j.hour12);var k,l=function(a){var b=a.replace(/yy+(?=y)/g,"yy").replace(/MMM+(?=M)/g,"MMM").replace(/d+(?=d)/g,"d").replace(/EEE+(?=E)/g,"EEE").replace(/a+(?=a)/g,"").replace(/k+(?=k)/g,"k").replace(/h+(?=h)/g,"h").replace(/m+(?=m)/g,"m"),c=b.replace(/yyy/g,j.year).replace(/yy/g,j.year.substring(2)).replace(/y/g,j.year).replace(/dd/g,j.date).replace(/d/g,h(j.date)),d=function(a,b,c){for(var d=1;d23&&(e=23);var f="+"===c?e:0-e;"kk"===b||"k"===b?(f=Number(j.hour24)+f,f>24?f-=24:f<0&&(f+=24)):(f=Number(j.hour12)+f,f>24?f-=24:f<0&&(f+=24),f>12&&(f-=12)),f=""+f,"kk"!==b&&"hh"!==b||(f=i(f)),("h"===b&&0===f||"hh"===b&&"00"===f)&&(f="12"),a[d]=f+a[d]}return a.join("")};c.indexOf("k+")!==-1&&(c=d(c.split("kk+"),"kk","+"),c=d(c.split("k+"),"k","+")),c.indexOf("k-")!==-1&&(c=d(c.split("kk-"),"kk","-"),c=d(c.split("k-"),"k","-")),c=c.replace(/kk/g,j.hour24).replace(/k/g,h(j.hour24)),c.indexOf("h+")!==-1&&(c=d(c.split("hh+"),"hh","+"),c=d(c.split("h+"),"h","+")),c.indexOf("h-")!==-1&&(c=d(c.split("hh-"),"hh","-"),c=d(c.split("h-"),"h","-")),c=c.replace(/hh/g,j.hour12<12&&j.hour12.indexOf&&0!==j.hour12.indexOf("0")?"0"+j.hour12:j.hour12).replace(/h/g,h(j.hour12)),c=c.replace(/mm/g,j.minutes).replace(/m/g,h(j.minutes)),c=c.replace(/a/g,"A");var f=["January","February","march","april","may","June","July","august","September","October","November","December"];"es_US"===e&&(f=["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]),"fr_CA"===e&&(f=["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]),c=c.replace(/MMMM/g,f[Number(j.month)-1]).replace(/MMM/g,f[Number(j.month)-1].substring(0,3)).replace(/MM/g,j.month).replace(/M/g,h(j.month)).replace(/march/g,"March").replace(/may/g,"May").replace(/Mayo/g,"mayo");var g=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];return"es_US"===e&&(g=["domingo","lunes","martes","miércoles","jueves","viernes","sábado"]),"fr_CA"===e&&(g=["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"]),c=c.replace(/EEEE/g,g[j.day]).replace(/EEE/g,g[j.day].substring(0,3)).replace(/EE/g,g[j.day].substring(0,3)).replace(/E/g,g[j.day].substring(0,3)),c=c.replace(/A/g,j.ampm).replace(/april/g,"April").replace(/august/g,"August")};if(d.indexOf("'")!==-1){var m=d.replace(/\'+(?=\')/g,"''").split("''");if(1===m.length){m=d.split("'");for(var n=0;n0&&a(c).each(function(){"form"===this.nodeName.toLowerCase()&&a(this).bind("submit",function(c){c.cancelBubble=!0,c.returnValue=!1,c.stopPropagation&&(c.stopPropagation(),c.preventDefault()),a(this).attr("id")||a(this).attr("id","luminateApi-"+(new Date).getTime());var h,d=a(this).attr("action"),e=d.split("?"),f=a(this).data("luminateapi"),g=e[0].indexOf("/site/")!==-1?e[0].split("/site/")[1]:e[0],i=a(this).attr("enctype"),j=e.length>1?e[1]:"",k="#"+a(this).attr("id"),l=!1,m=!1;f&&(f.callback&&(h=luminateExtend.utils.stringToObj(f.callback)),f.requiresAuth&&"true"===f.requiresAuth&&(l=!0),(0===d.indexOf("https:")||"https:"===b.location.protocol&&d.indexOf("http")===-1)&&(m=!0)),luminateExtend.api.request({api:g,callback:h,contentType:i,data:j,form:k,requiresAuth:l,useHTTPS:m})})}),luminateExtend},luminateExtend.api.getAuth=function(b){var c=a.extend({useCache:!0,useHTTPS:!1},b||{});if(luminateExtend.api.getAuthLoad)if(luminateExtend.api.getAuthLoad=!1,c.useCache&&luminateExtend.global.auth.type&&luminateExtend.global.auth.token)luminateExtend.api.getAuthLoad=!0,c.callback&&c.callback();else{var d=function(a){luminateExtend.global.update(a),luminateExtend.api.getAuthLoad=!0,c.callback&&c.callback()};luminateExtend.global.supportsCORS?a.ajax({url:(c.useHTTPS?luminateExtend.global.path.secure:luminateExtend.global.path.nonsecure)+"CRConsAPI",data:"luminateExtend="+luminateExtend.library.version+(c.nonce&&""!==c.nonce?"&"+c.nonce:"")+"&api_key="+luminateExtend.global.apiKey+"&method=getLoginUrl&response_format=json&v=1.0",xhrFields:{withCredentials:!0},dataType:"json",success:function(a){var b=a.getLoginUrlResponse,c=b.url,e=b.routing_id,f=b.JSESSIONID;e||c.indexOf("CRConsAPI;jsessionid=")===-1||(e=c.split("CRConsAPI;jsessionid=")[1].split("?")[0]),d({auth:{type:"auth",token:b.token},routingId:e?"jsessionid="+e:"",sessionCookie:f?"JSESSIONID="+f:""})}}):a.ajax({url:g(c.useHTTPS,"action=getAuth&callback=?"),dataType:"jsonp",success:d})}else{var e=function(){luminateExtend.api.getAuth(c)};setTimeout(e,1e3)}},luminateExtend.api.getAuthLoad=!0;var i=function(d){var e=a.extend({contentType:"application/x-www-form-urlencoded",data:"",requiresAuth:!1,useHTTPS:null},d||{}),f=["addressbook","advocacy","connect","cons","content","datasync","donation","email","group","orgevent","recurring","survey","teamraiser"];if(a.inArray(e.api.toLowerCase(),f)>=0&&(e.api="CR"+e.api.charAt(0).toUpperCase()+e.api.slice(1).toLowerCase()+"API",e.api=e.api.replace("Addressbook","AddressBook").replace("Datasync","DataSync").replace("Orgevent","OrgEvent")),luminateExtend.global.path.nonsecure&&luminateExtend.global.path.secure&&luminateExtend.global.apiKey&&e.api){"multipart/form-data"===e.contentType.split(";")[0]?e.contentType="multipart/form-data":e.contentType="application/x-www-form-urlencoded",e.contentType+="; charset=UTF-8",e.data="luminateExtend="+luminateExtend.library.version+(""===e.data?"":"&"+e.data),e.form&&a(e.form).length>0&&(e.data+="&"+a(e.form).eq(0).serialize()),e.data.indexOf("&api_key=")===-1&&(e.data+="&api_key="+luminateExtend.global.apiKey),luminateExtend.global.apiCommon.centerId&&e.data.indexOf("¢er_id=")===-1&&(e.data+="¢er_id="+luminateExtend.global.apiCommon.centerId),luminateExtend.global.apiCommon.categoryId&&e.data.indexOf("&list_category_id=")===-1&&(e.data+="&list_category_id="+luminateExtend.global.apiCommon.categoryId),e.data.indexOf("&response_format=xml")!==-1?e.data=e.data.replace(/&response_format=xml/g,"&response_format=json"):e.data.indexOf("&response_format=")===-1&&(e.data+="&response_format=json"),luminateExtend.global.apiCommon.source&&e.data.indexOf("&source=")===-1&&(e.data+="&source="+luminateExtend.global.apiCommon.source),luminateExtend.global.apiCommon.subSource&&e.data.indexOf("&sub_source=")===-1&&(e.data+="&sub_source="+luminateExtend.global.apiCommon.subSource),e.data.indexOf("&suppress_response_codes=")===-1&&(e.data+="&suppress_response_codes=true"),luminateExtend.global.locale&&e.data.indexOf("&s_locale=")===-1&&(e.data+="&s_locale="+luminateExtend.global.locale),e.data.indexOf("&v=")===-1&&(e.data+="&v=1.0");var i="http://",j=luminateExtend.global.path.nonsecure.split("http://")[1];"CRDonationAPI"===e.api||"CRTeamraiserAPI"===e.api||"CRConnectAPI"!==e.api&&("https:"===b.location.protocol&&null==e.useHTTPS||1==e.useHTTPS)?e.useHTTPS=!0:e.useHTTPS=!1,e.useHTTPS&&(i="https://",j=luminateExtend.global.path.secure.split("https://")[1]),i+=j+e.api;var k=!1,l=!1,m=!1;b.location.protocol===i.split("//")[0]&&c.domain===j.split("/")[0]?(k=!0,l=!0):luminateExtend.global.supportsCORS?l=!0:"postMessage"in b&&(m=!0);var n;l?n=function(){luminateExtend.global.routingId&&""!==luminateExtend.global.routingId&&(i+=";"+luminateExtend.global.routingId),e.requiresAuth&&e.data.indexOf("&"+luminateExtend.global.auth.type+"=")===-1&&(e.data+="&"+luminateExtend.global.auth.type+"="+luminateExtend.global.auth.token),luminateExtend.global.sessionCookie&&""!==luminateExtend.global.sessionCookie&&(e.data+="&"+luminateExtend.global.sessionCookie),e.data+="&ts="+(new Date).getTime(),a.ajax({url:i,data:e.data,xhrFields:{withCredentials:!0},contentType:e.contentType,dataType:"json",type:"POST"}).always(function(a,b,c){h(e,a,b)})}:m&&(n=function(){var d=(new Date).getTime(),f="luminateApiPostMessage"+d,j=g(e.useHTTPS,"action=postMessage");luminateExtend.global.routingId&&""!==luminateExtend.global.routingId&&(i+=";"+luminateExtend.global.routingId),e.requiresAuth&&e.data.indexOf("&"+luminateExtend.global.auth.type+"=")===-1&&(e.data+="&"+luminateExtend.global.auth.type+"="+luminateExtend.global.auth.token),luminateExtend.global.sessionCookie&&""!==luminateExtend.global.sessionCookie&&(e.data+="&"+luminateExtend.global.sessionCookie),e.data+="&ts="+d,luminateExtend.api.request.postMessageEventHandler||(luminateExtend.api.request.postMessageEventHandler={},luminateExtend.api.request.postMessageEventHandler.handler=function(b){if(luminateExtend.global.path.nonsecure.indexOf(b.origin)!==-1||luminateExtend.global.path.secure.indexOf(b.origin)!==-1){var c=a.parseJSON(b.data),d=c.postMessageFrameId,e=a.parseJSON(decodeURIComponent(c.response));luminateExtend.api.request.postMessageEventHandler[d]&&luminateExtend.api.request.postMessageEventHandler[d](d,e)}},"undefined"!=typeof b.addEventListener?b.addEventListener("message",luminateExtend.api.request.postMessageEventHandler.handler,!1):"undefined"!=typeof b.attachEvent&&b.attachEvent("onmessage",luminateExtend.api.request.postMessageEventHandler.handler)),luminateExtend.api.request.postMessageEventHandler[f]=function(b,c){h(e,c),a("#"+b).remove(),delete luminateExtend.api.request.postMessageEventHandler[b]},a("body").append(''),a("#"+f).bind("load",function(){var b='{"postMessageFrameId": "'+a(this).attr("id")+'", "requestUrl": "'+i+'", "requestContentType": "'+e.contentType+'", "requestData": "'+e.data+'"}',d=i.split("/site/")[0].split("/admin/")[0];c.getElementById(a(this).attr("id")).contentWindow.postMessage(b,d)}),a("#"+f).attr("src",j)}),e.requiresAuth||!l&&!k&&!luminateExtend.global.sessionCookie?luminateExtend.api.getAuth({callback:n,useHTTPS:e.useHTTPS}):n()}};luminateExtend.api.request=function(b){if(a.isArray(b)){b.reverse();var c=[];a.each(b,function(d){var e=a.extend({async:!0},this);if(e.async||d===b.length-1)c.push(e);else{var f=b[d+1];if(f.callback&&"function"!=typeof f.callback){var g=f.callback.success||a.noop;f.callback.success=function(a){g(a),i(e)}}else{var f=b[d+1],h=f.callback||a.noop;f.callback={success:function(a){h(a),i(e)},error:function(a){h(a)}}}}}),c.reverse(),a.each(c,function(){i(this)})}else i(b)},luminateExtend.api.error=function(a){function b(a){this.name="LuminateError",this.default_message="Error communicating with the Luminate API. Check your Luminate API settings",this.message=a||this.default_message,this.stack=(new Error).stack}return b.prototype=Object.create(Error.prototype),b.prototype.constructor=b,new b(a)},luminateExtend.sessionVars={set:function(a,b,c){var d={};c&&(d.callback=c),a&&(d.data="s_"+a+"="+(b||""),luminateExtend.utils.ping(d))}},luminateExtend.tags=function(a,b){luminateExtend.tags.parse(a,b)},luminateExtend.tags.parse=function(b,d){luminateExtend.widgets?luminateExtend.widgets(b,d):(b=b&&"all"!==b?luminateExtend.utils.ensureArray(b):["cons"],d=d||"body",a.each(b,function(b,e){if("cons"===e){var f=a(d).find(c.getElementsByTagName("luminate:cons"));if(f.length>0){var g=function(b){f.each(function(){b.getConsResponse?a(this).replaceWith(luminateExtend.utils.stringToObj(a(this).attr("field"),b.getConsResponse)):a(this).remove()})};luminateExtend.api.request({api:"cons",callback:g,data:"method=getUser",requiresAuth:!0})}}}))},luminateExtend.utils={ensureArray:function(b){return a.isArray(b)?b:b?[b]:[]},stringToObj:function(a,c){var d=c||b;if(a)for(var e=a.split("."),f=0;f'),a("#"+e).bind("load",function(){a(this).remove(),d.callback&&d.callback()}),a("#"+e).attr("src",("https:"===b.location.protocol?luminateExtend.global.path.secure:luminateExtend.global.path.nonsecure)+"EstablishSession"+(luminateExtend.global.routingId&&""!==luminateExtend.global.routingId?";"+luminateExtend.global.routingId:"")+"?"+(null==d.data?"":d.data+"&")+"NEXTURL="+encodeURIComponent(("https:"===b.location.protocol?luminateExtend.global.path.secure:luminateExtend.global.path.nonsecure)+"PixelServer"))},simpleDateFormat:function(b,c,d){if(d=d||luminateExtend.global.locale,d=e(d),c=c||(a.inArray(d,["en_CA","fr_CA","en_GB","en_AU"])>=0?"d/M/yy":"M/d/yy"),b=b||new Date,!(b instanceof Date)){var f=b.split("T")[0].split("-"),g=b.split("T").length>1?b.split("T")[1].split(".")[0].split("Z")[0].split("-")[0].split(":"):["00","00","00"];b=new Date(f[0],f[1]-1,f[2],g[0],g[1],g[2])}var h=function(a){return a=""+a,0===a.indexOf("0")&&"0"!==a?a.substring(1):a},i=function(a){return a=Number(a),isNaN(a)?"00":(a<10?"0":"")+a},j={month:i(b.getMonth()+1),date:i(b.getDate()),year:i(b.getFullYear()),day:b.getDay(),hour24:b.getHours(),hour12:b.getHours(),minutes:i(b.getMinutes()),ampm:"AM"};j.hour24>11&&(j.ampm="PM"),j.hour24=i(j.hour24),0===j.hour12&&(j.hour12=12),j.hour12>12&&(j.hour12=j.hour12-12),j.hour12=i(j.hour12);var k,l=function(a){var b=a.replace(/yy+(?=y)/g,"yy").replace(/MMM+(?=M)/g,"MMM").replace(/d+(?=d)/g,"d").replace(/EEE+(?=E)/g,"EEE").replace(/a+(?=a)/g,"").replace(/k+(?=k)/g,"k").replace(/h+(?=h)/g,"h").replace(/m+(?=m)/g,"m"),c=b.replace(/yyy/g,j.year).replace(/yy/g,j.year.substring(2)).replace(/y/g,j.year).replace(/dd/g,j.date).replace(/d/g,h(j.date)),e=function(a,b,c){for(var d=1;d23&&(e=23);var f="+"===c?e:0-e;"kk"===b||"k"===b?(f=Number(j.hour24)+f,f>24?f-=24:f<0&&(f+=24)):(f=Number(j.hour12)+f,f>24?f-=24:f<0&&(f+=24),f>12&&(f-=12)),f=""+f,"kk"!==b&&"hh"!==b||(f=i(f)),("h"===b&&0===f||"hh"===b&&"00"===f)&&(f="12"),a[d]=f+a[d]}return a.join("")};c.indexOf("k+")!==-1&&(c=e(c.split("kk+"),"kk","+"),c=e(c.split("k+"),"k","+")),c.indexOf("k-")!==-1&&(c=e(c.split("kk-"),"kk","-"),c=e(c.split("k-"),"k","-")),c=c.replace(/kk/g,j.hour24).replace(/k/g,h(j.hour24)),c.indexOf("h+")!==-1&&(c=e(c.split("hh+"),"hh","+"),c=e(c.split("h+"),"h","+")),c.indexOf("h-")!==-1&&(c=e(c.split("hh-"),"hh","-"),c=e(c.split("h-"),"h","-")),c=c.replace(/hh/g,j.hour12<12&&j.hour12.indexOf&&0!==j.hour12.indexOf("0")?"0"+j.hour12:j.hour12).replace(/h/g,h(j.hour12)),c=c.replace(/mm/g,j.minutes).replace(/m/g,h(j.minutes)),c=c.replace(/a/g,"A");var f=["January","February","march","april","may","June","July","august","September","October","November","December"];"es_US"===d&&(f=["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"]),"fr_CA"===d&&(f=["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"]),c=c.replace(/MMMM/g,f[Number(j.month)-1]).replace(/MMM/g,f[Number(j.month)-1].substring(0,3)).replace(/MM/g,j.month).replace(/M/g,h(j.month)).replace(/march/g,"March").replace(/may/g,"May").replace(/Mayo/g,"mayo");var g=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];return"es_US"===d&&(g=["domingo","lunes","martes","miércoles","jueves","viernes","sábado"]),"fr_CA"===d&&(g=["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"]),c=c.replace(/EEEE/g,g[j.day]).replace(/EEE/g,g[j.day].substring(0,3)).replace(/EE/g,g[j.day].substring(0,3)).replace(/E/g,g[j.day].substring(0,3)),c=c.replace(/A/g,j.ampm).replace(/april/g,"April").replace(/august/g,"August")};if(c.indexOf("'")!==-1){var m=c.replace(/\'+(?=\')/g,"''").split("''");if(1===m.length){m=c.split("'");for(var n=0;n=1.5.1" + }, + "bugs": { + "web": "https://github.com/noahcooper/luminateExtend/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/noahcooper/luminateExtend.git" + }, + "keywords": [ + "luminate", + "blackbaud", + "teamraiser", + "team raiser", + "convio" + ], + "main": "luminateExtend.js", + "homepage": "https://github.com/noahcooper/luminateExtend" +} \ No newline at end of file diff --git a/src/luminateExtend.js b/src/luminateExtend.js index eef0f75..1e56ca4 100644 --- a/src/luminateExtend.js +++ b/src/luminateExtend.js @@ -1,12 +1,31 @@ /* * luminateExtend.js - * Version: 1.8.1 (18-OCT-2016) + * Version: 1.8.1 (23-FEB-2017) * Requires: jQuery v1.5.1+ or Zepto v1.1+ * Includes: SimpleDateFormatJS v1.3 (https://github.com/noahcooper/SimpleDateFormatJS) */ -(function($) { - /* private helper functions */ + +(function (factory) { + // If there is a variable named module and it has an exports property, + // then we're working in a Node-like environment. Use require to load + // the jQuery object that the module system is using and pass it in. + if (typeof define === 'function' && define.amd) { + define(['jquery'], function(jquery){ + return factory(jquery, window, document); + }); + } else if(typeof module === "object" && typeof module.exports === "object") { + module.exports = factory(require('jQuery'), window, document); + } + // Otherwise, we're working in a browser, so just pass in the global + // jQuery or Zepto object. + else { + factory(typeof jQuery === 'undefined' && typeof Zepto === 'function' ? Zepto : jQuery, window, document); + } +}(function($, window, document, undefined) { + // This code will receive whatever jQuery object was passed in from + // the function above and will attach the tipso plugin to it. + // var validateLocale = function(locale) { /* if a locale is provided that is not supported, default to "en_US" */ if(locale && $.inArray(locale, ['es_US', 'en_CA', 'fr_CA', 'en_GB', 'en_AU']) < 0) { @@ -33,10 +52,32 @@ (data ? ('&' + data) : ''); }, - apiCallbackHandler = function(requestSettings, responseData) { - if(requestSettings.responseFilter && + apiCallbackHandler = function(requestSettings, responseData, jqXHR_textStatus) { + // test if response data is a jqXHR object. This means, we have had a AJAX error for some reason + if (typeof responseData.getResponseHeader === 'function') { + // if the XML HTTP status is 0, it could be due to a Cross-site scripting issue related to CORS header. + // Normally we would use the error directly from the ajax request but a status of 0 has an empty response text + if (responseData.status == 0) { + var port = window.location.port; + var addendum = '. You need to whitelist the domain and port API requests are originating from'; + + if (port !== '') { + port = ':' + port; + } else { + addendum = ''; + } + + var message = 'Check your Luminate API settings to make sure ' + window.location.hostname + port + ' is whitelisted' + addendum; + + responseData = new luminateExtend.api.error(message); + } else { + responseData = new luminateExtend.api.error(jqXHR_textStatus); + } + + } else if(requestSettings.responseFilter && requestSettings.responseFilter.array && requestSettings.responseFilter.filter) { + if(luminateExtend.utils.stringToObj(requestSettings.responseFilter.array, responseData)) { var filterKey = requestSettings.responseFilter.filter.split('==')[0].split('!=')[0].replace(/^\s+|\s+$/g, ''), filterOperator, @@ -104,7 +145,7 @@ if(typeof requestSettings.callback === 'function') { callbackFn = requestSettings.callback; } - else if(requestSettings.callback.error && responseData.errorResponse) { + else if((requestSettings.callback.error && responseData.errorResponse) || responseData instanceof Error) { callbackFn = requestSettings.callback.error; } else if(requestSettings.callback.success && !responseData.errorResponse) { @@ -114,22 +155,21 @@ var isLoginRequest = requestSettings.data.indexOf('&method=login') !== -1 && requestSettings.data.indexOf('&method=loginTest') === -1, isLogoutRequest = requestSettings.data.indexOf('&method=logout') !== -1; - - if(!isLoginRequest && !isLogoutRequest) { + + if((!isLoginRequest && !isLogoutRequest) || responseData instanceof Error) { callbackFn(responseData); } - /* get a new auth token after login or logout */ else { var newAuthCallback = function() { callbackFn(responseData); - }, + }, getAuthOptions = { callback: newAuthCallback, useCache: false, useHTTPS: requestSettings.useHTTPS }; - + if(isLoginRequest && responseData.loginResponse && responseData.loginResponse.nonce) { getAuthOptions.nonce = 'NONCE_TOKEN=' + responseData.loginResponse.nonce; } @@ -146,7 +186,7 @@ /* library info */ luminateExtend.library = { - version: '1.7.1' + version: '1.8.1' }; /* global settings */ @@ -350,6 +390,7 @@ luminateExtend.api.getAuthLoad = true; var sendRequest = function(options) { + var settings = $.extend({ contentType: 'application/x-www-form-urlencoded', data: '', @@ -449,6 +490,7 @@ } var doRequest; + if(useAjax) { doRequest = function() { if(luminateExtend.global.routingId && luminateExtend.global.routingId !== '') { @@ -471,10 +513,9 @@ contentType: settings.contentType, /* set dataType explicitly as API sends Content-Type: text/plain rather than application/json (E-62659) */ dataType: 'json', - type: 'POST', - success: function(data) { - apiCallbackHandler(settings, data); - } + type: 'POST', + }).always(function(xhr_or_data, status, xhr_error) { + apiCallbackHandler(settings, xhr_or_data, status); }); }; } @@ -568,7 +609,7 @@ if(!$.isArray(requests)) { sendRequest(requests); } - + else { requests.reverse(); @@ -619,6 +660,21 @@ }); } }; + + luminateExtend.api.error = function(message) { + function LuminateError(message) { + this.name = 'LuminateError'; + this.default_message = 'Error communicating with the Luminate API. Check your Luminate API settings'; + + this.message = message || this.default_message; + this.stack = (new Error()).stack; + } + + LuminateError.prototype = Object.create(Error.prototype); + LuminateError.prototype.constructor = LuminateError; + + return new LuminateError(message); + }; /* session variables */ luminateExtend.sessionVars = { @@ -1014,4 +1070,4 @@ return formattedDate; } }; -})(typeof jQuery === 'undefined' && typeof Zepto === 'function' ? Zepto : jQuery); \ No newline at end of file +})); \ No newline at end of file From d3e8e2fc432ed2d227876b2e6a27c0bac9e1e8f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?De=27Yonte=CC=81=1C=20Wilkinson?= Date: Thu, 23 Feb 2017 13:02:34 -0500 Subject: [PATCH 2/5] Added jQuery dependency to bower.json and bower installation instructions to main README --- README.md | 16 ++++++++++++++++ bower.json | 3 +++ 2 files changed, 19 insertions(+) diff --git a/README.md b/README.md index 1fe7caf..5c6d848 100644 --- a/README.md +++ b/README.md @@ -99,11 +99,27 @@ As of v1.6, luminateExtend.js can be used with [Zepto](http://zeptojs.com) in li ``` ### Install with NPM +``` +npm install luminateExtend --save +``` + +#### Load luminateExtend module ```js var jQuery = require('jquery'); var luminateExtend = require('luminateExtend'); ``` +### Install with Bower +``` +bower install luminateExtend +``` + +```html + + +``` + + The luminateExtend object ------------------------- diff --git a/bower.json b/bower.json index c4155f7..d53c5bd 100644 --- a/bower.json +++ b/bower.json @@ -6,6 +6,9 @@ "authors": [ "noahcooper" ], + "dependencies": { + "jquery": ">=1.5.1" + }, "license": "MIT", "keywords": [ "luminate", From 9ccac61044038aac1bc523da0e48497c5b93053d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?De=27Yonte=CC=81=1C=20Wilkinson?= Date: Fri, 24 Feb 2017 09:28:27 -0500 Subject: [PATCH 3/5] Called the wrong jQuery module. jQuery module is spelled jquery with a lowercase Q --- src/luminateExtend.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/luminateExtend.js b/src/luminateExtend.js index 1e56ca4..5d659fb 100644 --- a/src/luminateExtend.js +++ b/src/luminateExtend.js @@ -15,7 +15,7 @@ return factory(jquery, window, document); }); } else if(typeof module === "object" && typeof module.exports === "object") { - module.exports = factory(require('jQuery'), window, document); + module.exports = factory(require('jquery'), window, document); } // Otherwise, we're working in a browser, so just pass in the global // jQuery or Zepto object. From 9245e0faf65ef9d40b8c1d1ffb42197604272297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?De=27Yonte=CC=81=1C=20Wilkinson?= Date: Tue, 7 Mar 2017 09:51:03 -0500 Subject: [PATCH 4/5] Return the authorization token when using the luminateExtend.api.getAuth() method when no callback is passed If no callback is passed to the luminateExtend.api.getAuth() method, the auth token and auth type should just be returned. This is useful in cases where we're just looking to return the cached authorization token and we don't need to wait on an ajax call to do that --- luminateExtend.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/luminateExtend.js b/luminateExtend.js index 1e56ca4..8f02941 100644 --- a/luminateExtend.js +++ b/luminateExtend.js @@ -325,6 +325,8 @@ if(settings.callback) { settings.callback(); + } else { + return {auth: luminateExtend.global.auth}; } } else { @@ -334,6 +336,8 @@ if(settings.callback) { settings.callback(); + } else { + return {auth: luminateExtend.global.auth}; } }; From ed0c69cfd162abb7c67cb76e9e73695e32fed8e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?De=27Yonte=CC=81=1C=20Wilkinson?= Date: Tue, 7 Mar 2017 10:10:21 -0500 Subject: [PATCH 5/5] No need to create a new auth object, just return the auth object. It returns the authorization type and the token --- luminateExtend.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/luminateExtend.js b/luminateExtend.js index 8f02941..7f6780a 100644 --- a/luminateExtend.js +++ b/luminateExtend.js @@ -326,7 +326,7 @@ if(settings.callback) { settings.callback(); } else { - return {auth: luminateExtend.global.auth}; + return luminateExtend.global.auth; } } else { @@ -337,7 +337,7 @@ if(settings.callback) { settings.callback(); } else { - return {auth: luminateExtend.global.auth}; + return uminateExtend.global.auth; } };