// On document Ready... jQuery(function ($) { if (typeof (Accumulus) === 'undefined') window.Accumulus = {}; var A = {}; A.global = {}; A.global.language = null; A.global.defaultLanguage = 'en-US'; A.global.localize = true; A.global.currencyCode = null; A.global.currencyFormat = 'en-US'; A.global.defaultCountryCode = 'USA'; A.global.vatOnEServicesCountries = { 'AUT': 'VOE', 'BEL': 'VOE', 'BGR': 'VOE', 'CYP': 'VOE', 'CZE': 'VOE', 'DEU': 'VOE', 'DNK': 'VOE', 'ESP': 'VOE', 'EST': 'VOE', 'FIN': 'VOE', 'FRA': 'VOE', 'GBP': 'VOE', 'GRC': 'VOE', 'HRV': 'VOE', 'HUN': 'VOE', 'IRL': 'VOE', 'ITA': 'VOE', 'LTU': 'VOE', 'LUX': 'VOE', 'LVA': 'VOE', 'MLT': 'VOE', 'NLD': 'VOE', 'POL': 'VOE', 'PRT': 'VOE', 'ROU': 'VOE', 'SVK': 'VOE', 'SVN': 'VOE', 'SWE': 'VOE' }; A.serviceUrl = 'https://testajax.accumulus.com/webapi'; A.resourcesUrl = ''; A.log = { info: true, info2: false, error: true }; A.formatAsYouWrite = false; A.showLoadingOverlay = true; if (Accumulus.resourcesUrl) { A.resourcesUrl = Accumulus.resourcesUrl; } if (Accumulus.showLoadingOverlay) { A.showLoadingOverlay = Accumulus.showLoadingOverlay; } A.languageFilesUrl = A.resourcesUrl + 'js/lang/'; A.images = { AMEX: A.resourcesUrl + 'images/card_amex.png', CART: A.resourcesUrl + 'images/card_carte_blanche.png', DINE: A.resourcesUrl + 'images/card_diners.png', DISC: A.resourcesUrl + 'images/card_discover.png', JCB: A.resourcesUrl + 'images/card_jcb.png', MC: A.resourcesUrl + 'images/card_mastercard.png', VISA: A.resourcesUrl + 'images/card_visa.png', CVV: A.resourcesUrl + 'images/csc.png', BA: A.resourcesUrl + 'images/check_tmb.png', PP: A.resourcesUrl + 'images/paypal-logo.svg', DEFAULT: null }; A.currencySymbols = { 'AFN': '؋', 'ALL': 'Lek', 'ANG': 'ƒ', 'ARS': '$', 'AUD': 'A$', 'AWG': 'ƒ', 'AZN': 'ман', 'BAM': 'KM', 'BBD': '$', 'BGN': 'лв', 'BMD': '$', 'BND': '$', 'BOB': '$b', 'BRL': 'R$', 'BSD': '$', 'BWP': 'P', 'BYR': 'p.', 'BZD': 'BZ$', 'CAD': 'C$', 'CHF': 'CHF', 'CLP': '$', 'CNY': '¥', 'COP': '$', 'CRC': '₡', 'CUP': '₱', 'CZK': 'Kč', 'DKK': 'kr', 'DOP': 'RD$', 'EGP': '£', 'EUR': '€', 'FJD': '$', 'FKP': '£', 'GBP': '£', 'GGP': '£', 'GHS': '¢', 'GIP': '£', 'GTQ': 'Q', 'GYD': '$', 'HKD': '$', 'HNL': 'L', 'HRK': 'kn', 'HUF': 'Ft', 'IDR': 'Rp', 'ILS': '₪', 'IMP': '£', 'INR': 'INR', 'IRR': '﷼', 'ISK': 'kr', 'JEP': '£', 'JMD': 'J$', 'JPY': '¥', 'KGS': 'лв', 'KHR': '៛', 'KPW': '₩', 'KRW': '₩', 'KYD': '$', 'KZT': 'лв', 'LAK': '₭', 'LBP': '£', 'LKR': '₨', 'LRD': '$', 'MKD': 'ден', 'MNT': '₮', 'MUR': '₨', 'MXN': '$', 'MYR': 'RM', 'MZN': 'MT', 'NAD': '$', 'NGN': '₦', 'NIO': 'C$', 'NOK': 'kr', 'NPR': '₨', 'NZD': '$', 'OMR': '﷼', 'PAB': 'B/.', 'PEN': 'S/.', 'PHP': '₱', 'PKR': '₨', 'PLN': 'zł', 'PYG': 'Gs', 'QAR': '﷼', 'RON': 'lei', 'RSD': 'Дин.', 'RUB': 'руб', 'SAR': '﷼', 'SBD': '$', 'SCR': '₨', 'SEK': 'kr', 'SGD': '$', 'SHP': '£', 'SOS': 'S', 'SRD': '$', 'SVC': '$', 'SYP': '£', 'THB': '฿', 'TRY': 'TRY', 'TTD': 'TT$', 'TVD': '$', 'TWD': 'NT$', 'UAH': '₴', 'USD': '$', 'UYU': '$U', 'UZS': 'лв', 'VEF': 'Bs', 'VND': '₫', 'XCD': '$', 'YER': '﷼', 'ZAR': 'R', 'ZWD': 'Z$' }; $.extend(A, { plugins: { balance: { markup: { name: 'balance', selector: '.acc-balance', options: [] } }, profile: { markup: { name: 'profile', selector: '.acc-profile', options: [ new AccMarkupOption('lockEmail', 'lockEmail', AccBoolean), new AccMarkupOption('onCustomerEdit', 'customerEdit', AccHandler), new AccMarkupOption('onPasswordChange', 'passwordChange', AccHandler), new AccMarkupOption('showChangePassword', 'showChangePassword', AccBoolean), new AccMarkupOption('taxInformationCountries', 'taxInformationCountries', AccAttribute), new AccMarkupOption('vatOnEServices', 'vatOnEServices', AccBoolean) ] } }, paymentMethods: { markup: { name: 'paymentMethods', selector: '.acc-payment-methods', options: [ new AccMarkupOption('showBillingAddress', 'showBillingAddress', AccBoolean), new AccMarkupOption('showCreditCards', 'showCreditCards', AccBoolean), new AccMarkupOption('showBankAccounts', 'showBankAccounts', AccBoolean), new AccMarkupOption('showBillingAgreements', 'showBillingAgreements', AccBoolean), new AccMarkupOption('confirmUrl', 'confirmUrl', AccAttribute), new AccMarkupOption('cancelUrl', 'cancelUrl', AccAttribute) ] } }, subscriptionList: { markup: { name: 'subscriptionList', selector: '.acc-subscription-list', options: [ new AccMarkupOption('cancelSubscription', 'cancelSubscription', AccBoolean), new AccMarkupOption('itemFieldsHandler', 'itemFieldsHandler', AccHandler) ] } }, statementHistory: { markup: { name: 'statementHistory', selector: '.acc-statement-history', options: [] } }, usageBalances: { markup: { name: 'usageBalances', selector: '.acc-usage-balances', options: [new AccMarkupOption('formatQuantityHandler', 'formatQuantityHandler', AccHandler)] } }, usageHistory: { markup: { name: 'usageHistory', selector: '.acc-usage-history', options: [ new AccMarkupOption('skip', 'skip', AccAttribute), new AccMarkupOption('take', 'take', AccAttribute), new AccMarkupOption('fromDateTime', 'fromDateTime', AccAttribute) ] } }, makePayment: { markup: { name: 'makePayment', selector: '.acc-make-payment', options: [new AccMarkupOption('onPaymentMade', 'paymentMade', AccHandler)] } }, signup: { markup: { name: 'signup', selector: '.acc-signup', options: [ new AccMarkupOption('creditCardTypes', 'creditCardTypes', AccAttribute), new AccMarkupOption('lockEmail', 'lockEmail', AccBoolean), new AccMarkupOption('allowEmptyBankAccountInfo', 'allowEmptyBankAccountInfo', AccBoolean), new AccMarkupOption('showHeader', 'showHeader', AccBoolean), new AccMarkupOption('offerCode', 'offerCode', AccAttribute), new AccMarkupOption('currencyCode', 'currencyCode', AccAttribute), new AccMarkupOption('customer', 'customer', AccJson), new AccMarkupOption('subscription', 'subscription', AccJson), new AccMarkupOption('showPrice', 'showPrice', AccBoolean), new AccMarkupOption('showPromotion', 'showPromotion', AccBoolean), new AccMarkupOption('showCreditCard', 'showCreditCard', AccBoolean), new AccMarkupOption('showBankAccount', 'showBankAccount', AccBoolean), new AccMarkupOption('showBillingAgreement', 'showBillingAgreement', AccBoolean), new AccMarkupOption('defaultPaymentMethod', 'defaultPaymentMethod', AccAttribute), new AccMarkupOption('confirmUrl', 'confirmUrl', AccAttribute), new AccMarkupOption('cancelUrl', 'cancelUrl', AccAttribute), new AccMarkupOption('collectCustomer', 'collectCustomer', AccBoolean), new AccMarkupOption('showCustomerAddress', 'showCustomerAddress', AccBoolean), new AccMarkupOption('showCustomerPhone', 'showCustomerPhone', AccBoolean), new AccMarkupOption('requireCustomerPhone', 'requireCustomerPhone', AccBoolean), new AccMarkupOption('collectPassword', 'collectPassword', AccBoolean), new AccMarkupOption('showSSLBanner', 'showSSLBanner', AccBoolean), new AccMarkupOption('showAccountBanner', 'showAccountBanner', AccBoolean), new AccMarkupOption('showTCCheckbox', 'showTCCheckbox', AccBoolean), new AccMarkupOption('showBillingAddress', 'showBillingAddress', AccBoolean), new AccMarkupOption('vestaTokenService', 'vestaTokenService', AccJson), new AccMarkupOption('descriptionHTML', 'descriptionHTML', AccAttribute), new AccMarkupOption('completionHTML', 'completionHTML', AccAttribute), new AccMarkupOption('termsAndConditionsHTML', 'termsAndConditionsHTML', AccAttribute), new AccMarkupOption('onSignup', 'signup', AccHandler), new AccMarkupOption('onCalculateSignupFees', 'calculateSignupFees', AccHandler), new AccMarkupOption('onValidatePromotion', 'validatePromotion', AccHandler), new AccMarkupOption('vatOnEServices', 'vatOnEServices', AccBoolean), new AccMarkupOption('taxInformationCountries', 'taxInformationCountries', AccAttribute) ] } }, portal: { markup: { name: 'portal', selector: '.acc-portal', options: [ new AccMarkupOption('customerID', 'customerID', AccAttribute), new AccMarkupOption('showHeader', 'showHeader', AccBoolean), new AccMarkupOption('headerText', 'headerText', AccAttribute), new AccMarkupOption('loginScreen', 'loginScreen', AccBoolean), new AccMarkupOption('showWidgetHeaders', 'showWidgetHeaders', AccBoolean), new AccMarkupOption('emptyWidgetAreaUrl', 'emptyWidgetAreaUrl', AccAttribute), new AccMarkupOption('companyLogoUrl', 'companyLogoUrl', AccAttribute), new AccMarkupOption('showProfile', 'showProfile', AccBoolean), new AccMarkupOption('showSubscriptionList', 'showSubscriptionList', AccBoolean), new AccMarkupOption('showStatementHistory', 'showStatementHistory', AccBoolean), new AccMarkupOption('showBalance', 'showBalance', AccBoolean), new AccMarkupOption('showUsageHistory', 'showUsageHistory', AccBoolean), new AccMarkupOption('showUsageBalances', 'showUsageBalances', AccBoolean), new AccMarkupOption('showPaymentMethods', 'showPaymentMethods', AccBoolean), new AccMarkupOption('showMakePayment', 'showMakePayment', AccBoolean), new AccMarkupOption('forcePasswordChange', 'forcePasswordChange', AccBoolean), new AccMarkupOption('profile_onCustomerEdit', 'profile_onCustomerEdit', AccHandler), new AccMarkupOption('profile_onPasswordChange', 'profile_onPasswordChange', AccHandler), new AccMarkupOption('profile_showChangePassword', 'profile_showChangePassword', AccBoolean), new AccMarkupOption('profile_taxInformationCountries', 'profile_taxInformationCountries', AccAttribute), new AccMarkupOption('profile_vatOnEServices', 'profile_vatOnEServices', AccBoolean), new AccMarkupOption('subscriptionList_cancelSubscription', 'subscriptionList_cancelSubscription', AccBoolean), new AccMarkupOption('subscriptionList_itemFieldsHandler', 'subscriptionList_itemFieldsHandler', AccHandler), new AccMarkupOption('usageHistory_skip', 'usageHistory_skip', AccAttribute), new AccMarkupOption('usageHistory_take', 'usageHistory_take', AccAttribute), new AccMarkupOption('usageHistory_fromDateTime', 'usageHistory_fromDateTime', AccAttribute), new AccMarkupOption('usageBalances_formatQuantityHandler', 'usageBalances_formatQuantityHandler', AccHandler), new AccMarkupOption('paymentMethods_showCreditCards', 'paymentMethods_showCreditCards', AccBoolean), new AccMarkupOption('paymentMethods_showBankAccounts', 'paymentMethods_showBankAccounts', AccBoolean), new AccMarkupOption('paymentMethods_showBillingAgreements', 'paymentMethods_showBillingAgreements', AccBoolean), new AccMarkupOption('paymentMethods_showBillingAddress', 'paymentMethods_showBillingAddress', AccBoolean), new AccMarkupOption('paymentMethods_confirmUrl', 'paymentMethods_confirmUrl', AccAttribute), new AccMarkupOption('paymentMethods_cancelUrl', 'paymentMethods_cancelUrl', AccAttribute), new AccMarkupOption('makePayment_onPaymentMade', 'makePayment_onPaymentMade', AccHandler) ] } } }, labels: { balance: {}, profile: {}, paymentMethods: {}, subscriptionList: { productFieldCode: {} }, statementHistory: {}, usageBalances: { usageTypeCodes: {} }, usageHistory: { typeCodes: {} }, makePayment: {}, portal: {}, signup: {}, general: {}, error: { 'serverError': 'Server Error' } } }); var accWidgetOptions = [ new AccMarkupOption('tenantId', 'tenantID', AccAttribute), new AccMarkupOption('token', 'token', AccAttribute), new AccMarkupOption('requestID', 'requestID', AccAttribute), new AccMarkupOption('timestamp', 'timestamp', AccAttribute), new AccMarkupOption('messages', 'messages', AccJson), new AccMarkupOption('onServerError', 'serverErrorCallback', AccHandler) ]; var portalPluginOptions = [ new AccMarkupOption('showHeader', 'showHeader', AccBoolean), new AccMarkupOption('customerID', 'customerID', AccAttribute) ]; A.plugins.balance.markup.options = A.plugins.balance.markup.options.concat(accWidgetOptions, portalPluginOptions); A.plugins.profile.markup.options = A.plugins.profile.markup.options.concat(accWidgetOptions, portalPluginOptions); A.plugins.paymentMethods.markup.options = A.plugins.paymentMethods.markup.options.concat(accWidgetOptions, portalPluginOptions); A.plugins.subscriptionList.markup.options = A.plugins.subscriptionList.markup.options.concat(accWidgetOptions, portalPluginOptions); A.plugins.statementHistory.markup.options = A.plugins.statementHistory.markup.options.concat(accWidgetOptions, portalPluginOptions); A.plugins.usageBalances.markup.options = A.plugins.usageBalances.markup.options.concat(accWidgetOptions, portalPluginOptions); A.plugins.usageHistory.markup.options = A.plugins.usageHistory.markup.options.concat(accWidgetOptions, portalPluginOptions); A.plugins.makePayment.markup.options = A.plugins.makePayment.markup.options.concat(accWidgetOptions, portalPluginOptions); A.plugins.portal.markup.options = A.plugins.portal.markup.options.concat(accWidgetOptions); A.plugins.signup.markup.options = A.plugins.signup.markup.options.concat(accWidgetOptions); A.isReady = false; A.constants = { UI: 'ui', MOBILE: 'mobile', CREDIT_CARD: "creditCard", BANK_ACCOUNT: "bankAccount", BILLING_AGREEMENT: "billingAgreement" }; A.info = function (s) { if (Accumulus.log.info) { console.info(s); } }; A.info2 = function (s) { if (Accumulus.log.info2) { console.info(s); } }; A.error = function (s) { if (Accumulus.log.error) { console.error(s); } }; /** * Replaces `${key}` by [args[key]] if [args] contains [key]. * Example: * // s = '1 ${b} 3' * var s = format('${a} ${b} ${c}', { 'a': 1, 'c': 3 }); */ A.format = function (s, args) { return s.replace(/\$\{([^}]+)\}/g, function (m, p) { return (p in args) ? args[p] : m; }); } /** * Formats the value or text content of [input] as a currency value using * the current currency format and code. */ A.formatCurrency = function (input) { $(input).formatCurrency({ region: Accumulus.global.currencyFormat, symbol: Accumulus.currencySymbols[Accumulus.global.currencyCode] }); }; A.initAccumulus = function () { var browserLang = navigator.language || navigator.userLanguage; _loadLangFile(browserLang, function (success) { if (success) { Accumulus.isReady = true; $(Accumulus).trigger('ready'); _initAccumulusComponents(); } else { _langFileError(); } }); }; A.getErrorMsg = function (data) { try { var error = Accumulus.labels.error[data.Code]; if (data.Code == '90000' && Accumulus.global.language.indexOf('en') == 0) { error = data.Message; } return error || Accumulus.labels.error['serverError']; } catch (e) { A.error(e); return data.Code; } }; var _initAccumulusComponents = function () { Accumulus.info('Initiating accumulus markup components....'); $.each(A.plugins, function (index, value) { var config = value.markup; var selector = config.selector; $.each($(selector), function (index, value) { var container = this; var properties = {}; var options = config.options; $.each(options, function (index, o) { var val = new o.type(container, o.markupPropertyName).getValue(); if (val !== null) properties[o.widgetPropertyName] = val; }); $(container)[config.name](properties); }); }); }; var _langFileError = function () { alert(Accumulus.getErrorMsg({ Code: 'serverError' })); }; var _loadLangFile = function (lang, callback) { var defaultLang = Accumulus.global.defaultLanguage; if (Accumulus.global.localize && (lang != defaultLang)) { Accumulus.info('Attempting to load ' + lang + ' lang file...'); _fetchLangFile(lang, function (success, data) { if (success) { Accumulus.info('Language ' + lang + ' loaded, filling language object....'); $.extend(Accumulus.labels, data); Accumulus.global.language = lang; Accumulus.info('Language object filled.'); callback(true); } else { Accumulus.info('Could not load ' + lang + ' language file, loading default language...'); _loadLangFile(defaultLang, callback); } }); } else { Accumulus.info('Attempting to load ' + defaultLang + ' default lang file...'); _fetchLangFile(defaultLang, function (success, data) { if (success) { Accumulus.info('Language ' + defaultLang + ' loaded, filling language object....'); $.extend(Accumulus.labels, data); Accumulus.global.language = defaultLang; Accumulus.info('Language object filled.'); callback(true); } else { Accumulus.error('Could not load ' + defaultLang + ' language file...'); callback(false); } }); } }; var _fetchLangFile = function (lang, callback) { var langUrl = Accumulus.languageFilesUrl + lang + ".json"; $.ajax({ type: 'GET', url: langUrl, dataType: 'json', success: function (data) { callback(true, data); }, error: function (e) { callback(false, e); } }); }; /** * Translates labels to the language on the user's browser. * @param container on which the labels are going to be translated. * @param json formatted labels list to be used. You can select them from @see A.labels. */ A.localize = function ($container, labels) { $container.find('[localize],[placeholder]').each( function (index) { var $this = $(this); var localize = $this.attr('localize') || $this.attr('placeholder'); try { var localized = labels[localize] || localize; if (localized) { if ($this.attr('placeholder')) { $this.attr("placeholder", localized); } else if ($this.is("input")) { $this.val(localized); } else { $this.text(localized); } } } catch (e) { Accumulus.error(e.message); } } ); }; /** * [defaultState] can be a state/province code (for US and Canada) or a * state/province name (for other countries). * * Depending on the selected country code, [$state] can be a select element * (for US and Canada) or a text input (for other countries) and show * tax information section if the country is in the tax information country list */ A.hookUpStateAndCountry = function (widget, $stateSelect, defaultState, $countrySelect, defaultCountryCode) { function countrySelectChange() { var countryCode = this.value; if (widget.options.taxInformationCountries && countryCode in widget.options.taxInformationCountries) { widget.element.find('.acc-tax-information').show(); } else { widget.element.find('.acc-tax-information').hide(); } A.API.fetchStates(countryCode, function (success, response) { $stateSelect.empty(); $stateSelect.append(new Option(Accumulus.labels.profile.selectState)); if (success) { var states = response.StatesAndProvinces; for (var i in states) { $stateSelect.append( new Option(states[i].Name, states[i].StateProvinceCode)); } if (countryCode == defaultCountryCode) { $stateSelect.val(defaultState); } } else { widget._serverError(response); } }); } $countrySelect.append(A.getAllCountries()); $countrySelect.on("change", countrySelectChange); $countrySelect.val(defaultCountryCode || A.global.defaultCountryCode).trigger('change'); }; //**************************************************************************** //************** General Accumulus API Functionality Object ****************** //**************************************************************************** A.API = {}; A.API.jsonpCall = function (url, jsonData, callback) { //Accumulus.startLoading(); //TODO: review $.ajax({ type: "POST", url: url, data: jsonData, dataType: "json", success: function (data) { //Accumulus.stopLoading(); //TODO: review callback(data.Code == 0, data); }, error: function (data) { //Accumulus.stopLoading(); //TODO: review callback(false, data); } }); } A.API.applyCurrencyFormat = function (input) { $(input).blur(function () { Accumulus.formatCurrency(this); }); if (Accumulus.formatAsYouWrite) { $(input).keyup(function (e) { var e = window.event || e; var keyUnicode = e.charCode || e.keyCode; switch (keyUnicode) { case 16: break; case 17: break; case 18: break; case 27: break; case 35: break; case 36: break; case 37: break; case 38: break; case 39: break; case 40: break; case 78: break; case 110: break; case 190: break; default: $(this).formatCurrency({ region: Accumulus.global.currencyFormat, roundToDecimalPlace: -1, symbol: Accumulus.currencySymbols[Accumulus.global.currencyCode] }); } }); } }; A.API.fetchStates = function (countryCode, callback) { var url = A.serviceUrl + '/GetStatesAndProvinces'; var data = { country: countryCode }; A.API.jsonpCall(url, data, callback); }; A.API.yesNoPrompt = function (title, text, yesLabel, noLabel, callback) { }; A.API.helper = { formatDate: function (date, includeTime) { if (date == null) { return ''; } if (date != '') { date = new Date(parseInt(date.substr(6))); if (includeTime) { date = date.toLocaleDateString() + ' ' + date.toLocaleTimeString(); } else { date = date.toLocaleDateString(); } return date; } }, setOrHide: function (input, value, includeLabel, includeParent) { if (value && value != '') { input.text(value); } else { if (includeLabel) { if (includeParent) { $('[for="' + input.attr('id') + '"]').parent().hide(); input.parent().hide(); } else { $('[for="' + input.attr('id') + '"]').hide(); input.hide(); } } else { if (includeParent) { input.parent().hide(); } else { input.hide(); } } } }, encodeValue: function (value) { return (value != null) ? encodeURIComponent(value) : ''; }, createObj: function (o) { return jQuery.extend({}, o); } }; //**************************************************************************** //************** General Accumulus Entities Objects ************************** //**************************************************************************** A.CustomFieldType = { string: 1, date: 2, number: 3, list: 4 }; // @constructor A.Customer = function (customer) { if (customer) { $.extend(this, customer); } }; A.Customer.prototype = { getFullName: function () { var c = this; if (c.Name && (c.Name != "")) { return c.Name; } var prefix = (c.NamePrefix) ? c.NamePrefix + " " : ""; var firstName = (c.FirstName) ? c.FirstName + " " : ""; var middleName = (c.MiddleName) ? c.MiddleName + " " : ""; var lastName = (c.LastName) ? c.LastName + " " : ""; var suffix = (c.NameSuffix) ? c.NameSuffix : ""; return (prefix + firstName + middleName + lastName + suffix).trim(); }, toJson: function () { var encodeValue = A.API.helper.encodeValue; return { name: encodeValue(this.Name), company: encodeValue(this.Company), addr1: encodeValue(this.AddressLine1), addr2: encodeValue(this.AddressLine2), city: encodeValue(this.City), state: encodeValue(this.StateProvinceCode), postal: encodeValue(this.PostalCode), country: encodeValue(this.CountryCode), email: encodeValue(this.EmailAddress), pwd: encodeValue(this.Password), home: encodeValue(this.HomeNumber), mobile: encodeValue(this.MobileNumber), title: encodeValue(this.Title), url: encodeValue(this.WebPageURL), work: encodeValue(this.WorkNumber), eid: encodeValue(this.ExternalCustomerID), lc: encodeValue(this.LanguageCode), currency: encodeValue(this.CurrencyCode), taxNumber: encodeValue(this.TaxNumber), taxCode: encodeValue(this.TaxCode) }; }, // @deprecated. toJSON: function () { console.warn('"toJSON" is deprecated. Please use "toJson" instead.'); return this.toJson(); } }; // @deprecated A.Customer.create = function (customer) { console.warn('"Accumulus.Customer.create" is deprecated. Please use "new Accumulus.Customer(customer)" instead.'); return new A.Customer(customer); }; // @constructor A.Signup = function (tenantID, token, requestID, timestamp, customer, subscription) { this.tenantID = tenantID; this.token = token; this.customer = customer; this.subscription = subscription; this.requestID = requestID; this.timestamp = timestamp; }; A.Signup.prototype = { toJson: function () { return { tid: this.tenantID, tk: this.token, rid: A.API.helper.encodeValue(this.requestID), ts: A.API.helper.encodeValue(this.timestamp), cu: this.customer != null ? this.customer.toJson() : "", su: this.subscription != null ? this.subscription.toJson() : "", cc: this.creditCard != null ? this.creditCard.toJson() : "", ba: this.bankAccount != null ? this.bankAccount.toJson() : "", pp: this.billingAgreement != null ? this.billingAgreement.toJson() : "", grecaptcha: (typeof grecaptcha === 'undefined') ? "" : grecaptcha.getResponse() }; }, // @deprecated toJSON: function () { console.warn('"toJSON" is deprecated. Please use "toJson" instead.'); return this.toJson(); } }; // @constructor A.Subscription = function (offerCode, subscription) { this.items = []; this.offerCode = offerCode; this.startDate = new Date(); if (subscription) { $.extend(this, subscription); } }; A.Subscription.prototype = { createItem: function () { var item = new A.SubscriptionItem(); this.items.push(item); return item; }, toJson: function () { var jsonItems = []; for (var i in this.items) { jsonItems.push(this.items[i].toJson()); } var d = this.startDate; var s = A.format('${0}-${1}-${2}', [d.getFullYear(), d.getMonth() + 1, d.getDate()]); return { itm: jsonItems, offer: this.offerCode, promotion: this.promotionCode, reseller: this.resellerID, startDate: s }; }, // @deprecated toJSON: function () { console.warn('"toJSON" is deprecated. Please use "toJson" instead.'); return this.toJson(); } }; // @deprecated A.Subscription.create = function (offerCode, subscription) { console.warn('"Accumulus.Subscription.create" is deprecated. Please use "new Accumulus.Subscription(offerCode, subscription)" instead.'); return new A.Subscription(offerCode, subscription); }; // @constructor A.SubscriptionItem = function (item) { this.fields = []; if (item) { $.extend(this, item); } }; A.SubscriptionItem.prototype = { createField: function () { var field = new A.SubscriptionItemField(); this.fields.push(field); return field; }, toJson: function () { var jsonFields = []; for (var i in this.fields) { jsonFields.push(this.fields[i].toJson()); } return { code: this.productCode, id: this.subscriptionItemID, fld: jsonFields }; }, // @deprecated toJSON: function () { console.warn('"toJSON" is deprecated. Please use "toJson" instead.'); return this.toJson(); } }; // @deprecated A.SubscriptionItem.create = function (item) { console.warn('"Accumulus.SubscriptionItem.create" is deprecated. Please use "new Accumulus.SubscriptionItem(item)" instead.'); return new A.SubscriptionItem(item); }; // @constructor A.SubscriptionItemField = function () { }; A.SubscriptionItemField.prototype = { toJson: function () { return { code: this.code, val: this.value }; }, // @deprecated toJSON: function () { console.warn('"toJSON" is deprecated. Please use "toJson" instead.'); return this.toJson(); } }; // @deprecated A.SubscriptionItemField.create = function () { console.warn('"Accumulus.SubscriptionItemField.create" is deprecated. Please use "new Accumulus.SubscriptionItemField()" instead.'); return new A.SubscriptionItemField(); }; // @constructor A.CreditCard = function (creditCard) { if (creditCard) { $.extend(this, creditCard); } }; A.CreditCard.prototype = { toJson: function () { var encodeValue = A.API.helper.encodeValue; return { number: encodeValue(this.cardNumber), name: encodeValue(this.name), cvv: encodeValue(this.cvv), exp: encodeValue(this.expirationDate), company: encodeValue(this.company), addr1: encodeValue(this.addr1), addr2: encodeValue(this.addr2), city: encodeValue(this.city), state: encodeValue(this.stateProvinceCode), postal: encodeValue(this.postalCode), country: encodeValue(this.countryCode) }; }, // @deprecated toJSON: function () { console.warn('"toJSON" is deprecated. Please use "toJson" instead.'); return this.toJson(); } }; // @deprecated A.CreditCard.create = function (creditCard) { console.warn('"Accumulus.CreditCard.create" is deprecated. Please use "new Accumulus.CreditCard(creditCard)" instead.'); return new A.CreditCard(creditCard); }; // @constructor A.BankAccount = function (bankAccount) { if (bankAccount) { $.extend(this, bankAccount); } }; A.BankAccount.prototype = { toJson: function () { var encodeValue = A.API.helper.encodeValue; return { number: encodeValue(this.number), type: encodeValue(this.type), route: encodeValue(this.route), bank: encodeValue(this.bank), name: encodeValue(this.name), company: encodeValue(this.company), addr1: encodeValue(this.addr1), addr2: encodeValue(this.addr2), city: encodeValue(this.city), state: encodeValue(this.stateProvinceCode), postal: encodeValue(this.postalCode), country: encodeValue(this.countryCode) }; }, // @deprecated toJSON: function () { console.warn('"toJSON" is deprecated. Please use "toJson" instead.'); return this.toJson(); } }; // @deprecated A.BankAccount.create = function (bankAccount) { console.warn('"Accumulus.BankAccount.create" is deprecated. Please use "new Accumulus.BankAccount(bankAccount)" instead.'); return new A.BankAccount(bankAccount); }; // @constructor A.BillingAgreement = function (billingAgreement) { if (billingAgreement) { $.extend(this, billingAgreement); } }; A.BillingAgreement.prototype = { toJson: function () { var encodeValue = A.API.helper.encodeValue; //TODO:Remove email and name when they get removed from the backend. return { name: encodeValue(this.name), email: encodeValue(this.email), confirmUrl: encodeValue(this.confirmUrl), cancelUrl: encodeValue(this.cancelUrl) }; }, // @deprecated toJSON: function () { console.warn('"toJSON" is deprecated. Please use "toJson" instead.'); return this.toJson(); } }; // @deprecated A.BillingAgreement.create = function (billingAgreement) { console.warn('"Accumulus.BillingAgreement.create" is deprecated. Please use "new Accumulus.BillingAgreement(billingAgreement)" instead.'); return new A.BillingAgreement(billingAgreement); }; A.getAllCountries = function () { return "" + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + ''; }; //**************************************************************************** //************** Add validation rules **************************************** //**************************************************************************** $.validator.addMethod("oneDigit", function (value, element) { return /\d/.test(value); }, "Value must contain at least one digit."); $.validator.addMethod("oneSpecialChar", function (value, element) { return /@|%|'|&|!|#|:|{|}|~|-|_|\(|\)|\?|\.|\+|\^|\$|\/|\\/.test(value); }, "Value must contain at least one special char."); Accumulus = $.extend(true, A, Accumulus); }); var Accumulus = { constants: { UI: 'ui', MOBILE: 'mobile', CREDIT_CARD: "creditCard", BANK_ACCOUNT: "bankAccount", BILLING_AGREEMENT: "billingAgreement" } }; // As loading... (function ($) { //Widgets Definition $.widget("accumulus.widget", { options: { tenantID: null, token: null, requestID: null, timestamp: null, customerID: null, messages: {}, serverErrorCallback: null }, _accessInfo: { tid: null, tk: null, rid: null, ts: null, cid: null }, _create: function () { var widget = this; var $container = widget.element; $container.addClass('acc-widget'); widget._setAccessInfo(); if (Accumulus.isReady) { widget._initPlugin(); } else { $(Accumulus).on('ready', function () { widget._initPlugin(); }); } }, _setAccessInfo: function () { var widget = this; var accessInfo = { tid: widget.options.tenantID, tk: widget.options.token, rid: widget.options.requestID, ts: widget.options.timestamp, cid: widget.options.customerID }; $.extend(widget._accessInfo, accessInfo); }, _serverError: function (data, $container) { Accumulus.error(data.Code + " " + data.Message); var widget = this; var serverErrorCallback = widget.options.serverErrorCallback; if (serverErrorCallback) { if (serverErrorCallback(data) !== false) { widget._showError(Accumulus.getErrorMsg(data), $container); } } else { widget._showError(Accumulus.getErrorMsg(data), $container); } }, _showError: function (msg, $container) { if ($container) { $container.text(msg); } else { $container = this.element.find('.acc-server-error'); if ($container.length == 0) { $container = this._createServerErrorWrapper(msg); this.element.html($container); } else { $container.text(msg); } } $container.show(); $("html,body").animate( { scrollTop: $container.offset().top - 100 }, 100); }, _createServerErrorWrapper: function (msg) { }, _openModal: function (modal) { }, _closeModal: function (modal) { }, _setOption: function (key, value) { }, _destroy: function () { this.element.removeClass('acc-widget').empty(); } }); $.widget("accumulus.portalPlugin", $.accumulus.widget, { options: { showHeader: true } }); $.widget("accumulus.balance", $.accumulus.portalPlugin, { options: {}, _balance: null, _balanceView: null, _initPlugin: function () { var widget = this; widget._balanceView = Accumulus.plugins.balance.balanceView; widget._balanceView.getContent(function (content) { widget._loadBalance(); }); }, _loadBalance: function () { var balance = this; balance._fetchBalance(function (success, data) { if (success) { balance._balance = data.Balance; balance._initView(); balance._fillView(); } else { balance._serverError(data); } }); }, _fetchBalance: function (callback) { Accumulus.info("Loading balance info from server..."); var url = Accumulus.serviceUrl + "/GetCustomerBalance"; Accumulus.API.jsonpCall(url, this._accessInfo, callback); }, _initView: function () { var widget = this; var $container = this.element; $container.empty().append(widget._balanceView.content); if (!widget.options.showHeader) { $container.find('.acc-widget-title').hide(); } Accumulus.localize($container, Accumulus.labels.balance); }, _fillView: function () { var $e = this.element.find('.acc-current-balance').text(this._balance); Accumulus.formatCurrency($e); } }); $.widget("accumulus.profile", $.accumulus.portalPlugin, { options: { customerEdit: null, lockEmail: false, passwordChange: null, showChangePassword: true, taxInformationCountries: null, vatOnEServices: false }, _profileView: null, _profileEditView: null, _customer: null, _$viewForm: null, _$passwordForm: null, _$editContainer: null, _create: function () { var widget = this; widget._profileView = Accumulus.plugins.profile.profileView; widget._profileEditView = Accumulus.plugins.profile.profileEditView; widget._super(); }, _initPlugin: function () { var widget = this; widget._profileView.getContent(function (content) { widget._loadCustomer(); }); }, _loadCustomer: function () { var widget = this; widget._fetchCustomer(function (success, data) { if (success) { widget._customer = data.Customer; widget._initViewForm(); widget._fillViewForm(); } else { widget._serverError(data); } }); }, _fetchCustomer: function (callback) { Accumulus.info("Loading customer info from server..."); var url = Accumulus.serviceUrl + "/GetCustomer"; Accumulus.API.jsonpCall(url, this._accessInfo, callback); }, _initViewForm: function () { var widget = this; var $container = this.element; $container.empty().append(widget._profileView.content); var $viewForm = $container.find('.acc-profile-view'); widget._$viewForm = $viewForm; if (!widget.options.showHeader) { $container.find('.acc-widget-title').hide(); } // if tax identifier countries have not been specified and Vat on eServices is true, setup the default VoE configuration if (widget.options.vatOnEServices && !widget.options.taxInformationCountries) { widget.options.taxInformationCountries = Accumulus.global.vatOnEServicesCountries; if (widget._customer && widget._customer.CountryCode in widget.options.taxInformationCountries) { widget.element.find('.acc-tax-information').show(); } else { widget.element.find('.acc-tax-information').hide(); } } Accumulus.localize($viewForm, Accumulus.labels.profile); $viewForm.find(".acc-edit").bind("click", function (event, ui) { widget._edit(); }); }, _edit: function () { var widget = this; widget._$viewForm.hide(); widget._profileEditView.getContent(function (content) { widget._initEditForm(); widget._fillEditForm(); }); }, _initEditForm: function () { var widget = this; var $container = widget.element; $container.append(widget._profileEditView.content); var $editContainer = $container.find('.acc-profile-edit-view'); var $editForm = $editContainer.find('.acc-profile-edit-form'); var $passwordForm = $editContainer.find('.acc-profile-edit-password-form'); widget._$passwordForm = $passwordForm; widget._$editContainer = $editContainer; Accumulus.localize($editContainer, Accumulus.labels.profile); if (widget.options.lockEmail) { $container.find('[name="email"]').prop('disabled', true); } if (!widget.options.showHeader) { $container.find('.acc-widget-title').hide(); } if (!widget.options.showChangePassword) { $container.find('.acc-change-password').hide(); } // if tax identifier countries have not been specified and Vat on eServices is true, setup the default VoE configuration if (widget.options.vatOnEServices && !widget.options.taxInformationCountries) { widget.options.taxInformationCountries = Accumulus.global.vatOnEServicesCountries; } Accumulus.hookUpStateAndCountry( widget, $editForm.find('[name="state"]'), widget._customer.StateProvinceCode, $editForm.find('[name="country"]'), widget._customer.CountryCode); $editForm.find('.acc-cancel').click(function () { widget._cancel(); }); $passwordForm.find('.acc-cancel').click(function () { widget._cancelPassword(); }); var gLabels = Accumulus.labels.general; $editForm.validate({ submitHandler: function (form) { widget._save(); }, rules: { name: { required: true }, country: { required: true }, email: { required: true, email: true } }, messages: { name: gLabels['nameRequired'], country: gLabels['countryRequired'], email: { required: gLabels['emailRequired'], email: gLabels['notEmailFormat'] } }, errorPlacement: widget._validationErrorPlacement }); $passwordForm.validate({ submitHandler: function (form) { widget._changePassword(); }, rules: { "new-password-1": { required: true, minlength: 7, oneDigit: true, oneSpecialChar: true }, "new-password-2": { required: true, equalTo: '[name="new-password-1"]' } }, messages: { "new-password-1": { required: gLabels['newPasswordRequired'], oneDigit: gLabels['oneDigitRequired'], minlength: gLabels['minSevenCharsLength'], oneSpecialChar: gLabels['oneSpecialChar'] }, "new-password-2": { required: gLabels['newPasswordRequired'], equalTo: gLabels['equalBothPasswords'] } }, errorPlacement: widget._validationErrorPlacement }); }, _cancel: function () { this._$editContainer.remove(); $('#acc-popup-password').remove(); this._$viewForm.show(); }, _cancelPassword: function () { }, _save: function () { var widget = this; var customerEditCallback = widget.options.customerEdit; this._populateCustomer(); this._updateCustomer(function (success, data) { if (success) { widget._$editContainer.remove(); $('#acc-popup-password').remove(); widget._$viewForm.remove(); widget._loadCustomer(); } else { widget._serverError(data); } if (typeof customerEditCallback == 'function') customerEditCallback(success, data); }); }, _populateCustomer: function () { var c = this._customer; var $editForm = this._$editContainer; c.Name = $editForm.find('[name="name"]').val(); c.Company = $editForm.find('[name="company"]').val(); c.Title = $editForm.find('[name="title"]').val(); c.EmailAddress = $editForm.find('[name="email"]').val(); c.WorkNumber = $editForm.find('[name="work-number"]').val(); c.HomeNumber = $editForm.find('[name="home-number"]').val(); c.MobileNumber = $editForm.find('[name="mobile"]').val(); c.AddressLine1 = $editForm.find('[name="address1"]').val(); c.AddressLine2 = $editForm.find('[name="address2"]').val(); c.City = $editForm.find('[name="city"]').val(); c.PostalCode = $editForm.find('[name="postal-code"]').val(); c.StateProvinceCode = $editForm.find('[name="state"]').val(); c.CountryCode = $editForm.find('[name="country"]').val(); c.WebPageURL = $editForm.find('[name="url"]').val(); if (this.options.taxInformationCountries && c.CountryCode in this.options.taxInformationCountries) { c.TaxNumber = this.element.find('[name="taxNumber"]').val(); if (c.TaxNumber) { c.TaxCode = this.options.taxInformationCountries[c.CountryCode]; } } }, _updateCustomer: function (callback) { Accumulus.info('Submitting customer for update...'); var url = Accumulus.serviceUrl + '/UpdateCustomer'; var customer = new Accumulus.Customer(this._customer); var json = { cu: customer.toJson() }; $.extend(json, this._accessInfo); Accumulus.API.jsonpCall(url, json, callback); }, _changePassword: function () { var widget = this; var $passwordForm = widget._$passwordForm; var passwordChangeCallback = widget.options.passwordChange; var $errorContainer = $passwordForm.find('.acc-server-error'); var newPassword1 = $passwordForm.find('[name="new-password-1"]').val(); //TODO: Do we want to encrypt this password? widget._updatePassword(newPassword1, function (success, data) { if (success) { widget._closeModal($('#acc-popup-password')); //$('#acc-popup-password').remove(); } else { widget._serverError(data, $errorContainer); } if (typeof passwordChangeCallback == 'function') passwordChangeCallback(success, data); }); }, _updatePassword: function (newPassword, callback) { var url = Accumulus.serviceUrl + '/CustomerChangePassword'; var data = { cu: { existingPassword: '----', newPassword: newPassword } };//TODO: remove existing password? $.extend(data, this._accessInfo); Accumulus.API.jsonpCall(url, data, callback); }, _fillEditForm: function () { var widget = this; var c = widget._customer; var $editForm = widget._$editContainer; $editForm.find('[name="name"]').val(new Accumulus.Customer(c).getFullName()); $editForm.find('[name="company"]').val(c.Company); $editForm.find('[name="title"]').val(c.Title); $editForm.find('[name="email"]').val(c.EmailAddress); $editForm.find('[name="work-number"]').val(c.WorkNumber); $editForm.find('[name="home-number"]').val(c.HomeNumber); $editForm.find('[name="mobile"]').val(c.MobileNumber); $editForm.find('[name="address1"]').val(c.AddressLine1); $editForm.find('[name="address2"]').val(c.AddressLine2); $editForm.find('[name="city"]').val(c.City); $editForm.find('[name="postal-code"]').val(c.PostalCode); $editForm.find('[name="country"]').val(c.CountryCode); $editForm.find('[name="url"]').val(c.WebPageURL); $editForm.find('[name="taxNumber"]').val(c.TaxExemptionNumber); }, _fillViewForm: function () { var c = this._customer; var $viewForm = this._$viewForm; var setOrHide = Accumulus.API.helper.setOrHide; var mobileField = $viewForm.find('.acc-mobile'); var homeField = $viewForm.find('.acc-home-number'); var workField = $viewForm.find('.acc-work-number'); var address1Field = $viewForm.find('.acc-address1'); var address2Field = $viewForm.find('.acc-address2'); var cityField = $viewForm.find('.acc-city'); var stateField = $viewForm.find('.acc-state'); var postalCodeField = $viewForm.find('.acc-postal-code'); var countryField = $viewForm.find('.acc-country'); var taxNumberField = $viewForm.find('.acc-tax-number'); $viewForm.find('.acc-name').text(new Accumulus.Customer(c).getFullName()); $viewForm.find('.acc-email').text(c.EmailAddress); setOrHide(mobileField, c.MobileNumber, false, true); setOrHide(homeField, c.HomeNumber, false, true); setOrHide(workField, c.WorkNumber, false, true); setOrHide(workField, c.WorkNumber, false, true); setOrHide(address1Field, c.AddressLine1); setOrHide(address2Field, c.AddressLine2); setOrHide(cityField, c.City); setOrHide(stateField, c.StateProvince); setOrHide(postalCodeField, c.PostalCode); if (!c.TaxExemptionNumber) { $viewForm.find('.acc-tax-information').hide(); } else { setOrHide(taxNumberField, c.TaxExemptionNumber); } //TODO: Modify this when the Countries form gets refactored to a JSon structure. var countryOptions = Accumulus.getAllCountries(); var html = $.parseHTML(countryOptions); var country = $('
').html(html).find('option[value="' + c.CountryCode + '"]').text(); setOrHide(countryField, country); } }); $.widget("accumulus.subscriptionList", $.accumulus.portalPlugin, { options: { cancelSubscription: true, itemFieldsHandler: null }, _subscriptionsView: null, _editSubscriptionView: null, _subscriptions: null, _$viewForm: null, _$detailsContainer: null, _$editContainer: null, _subscription: null, _initPlugin: function () { var widget = this; widget._subscriptionsView = Accumulus.plugins.subscriptionList.subscriptionsView; widget._subscriptionsView.getContent(function (content) { widget._loadSubscriptions(); }); }, _loadSubscriptions: function () { var widget = this; widget._fetchSubscriptions(function (success, data) { if (success) { widget._subscriptions = data.Subscriptions; widget._initSubscriptionsView(); widget._fillSubscriptionsView(); } else { widget._serverError(data); } }); }, _fetchSubscriptions: function (callback) { Accumulus.info("Loading subscriptions info from server..."); var url = Accumulus.serviceUrl + "/GetSubscriptions"; Accumulus.API.jsonpCall(url, this._accessInfo, callback); }, _initSubscriptionsView: function () { var widget = this; var $container = this.element; $container.empty().append(widget._subscriptionsView.content); var $viewForm = $container.find('.acc-subscriptions-view'); widget._$viewForm = $viewForm; if (!widget.options.showHeader) { $container.find('.acc-widget-title').hide(); } Accumulus.localize($viewForm, Accumulus.labels.subscriptionList); }, _fillSubscriptionsView: function () { var widget = this; var $container = widget.element; var subscriptions = widget._subscriptions; var tableBody = widget._$viewForm.find('.acc-subscription-list tbody'); tableBody.empty(); if (subscriptions.length > 0) { for (var i in subscriptions) { var s = subscriptions[i]; var id = s.SubscriptionID; var offer = s.OfferName; var status = s.Status; var startDate = Accumulus.API.helper.formatDate(s.StartDate); var tr = $(''); $('').append( $('').text(id) .data('s', s) .click( function (event, ui) { widget._subscription = $(this).data('s'); widget._details(); } ).attr("href", "#") ).appendTo(tr); $('').text(offer).appendTo(tr); $('').text(status).appendTo(tr); $('').text(startDate).appendTo(tr); tableBody.append(tr); } } else { $container.find('.acc-subscription-list').hide(); var noSubscriptionsLabel = Accumulus.labels.subscriptionList.noSubscriptions || 'No subscriptions.'; $('
').text(noSubscriptionsLabel) .appendTo($container.find('.acc-subscriptions-view')); } }, _details: function () { var widget = this; widget._$viewForm.hide(); widget._editSubscriptionView = Accumulus.plugins.subscriptionList.editSubscriptionView; widget._editSubscriptionView.getContent(function (content) { widget._initDetailsForm(); widget._fillDetailsForm(); }); }, _initDetailsForm: function () { var widget = this; var $container = this.element; $container.append(widget._editSubscriptionView.content); var $detailsContainer = $container.find('.subscription-edit-view'); widget._$detailsContainer = $detailsContainer; Accumulus.localize($detailsContainer, Accumulus.labels.subscriptionList); $detailsContainer.find('.acc-ok').bind("click", function (event, ui) { widget._cancel(); }); if (widget.options.cancelSubscription) { var cancelSubscriptionBtn = $detailsContainer.find('.acc-cancel-subscription'); cancelSubscriptionBtn.bind("click", function (event, ui) { var slLabels = Accumulus.labels.subscriptionList; var gLabels = Accumulus.labels.general; Accumulus.API.yesNoPrompt( gLabels['areYouSure?'], slLabels.confirmSubscriptionCancel, gLabels.yes, gLabels.no, function (confirm) { if (confirm) { widget._cancelSubscription(); } } ) }); cancelSubscriptionBtn.show(); } }, _cancel: function () { this._$detailsContainer.remove(); this._$viewForm.show(); }, _cancelSubscription: function () { var widget = this; widget._submitSubscriptionCancel(function (success, data) { if (success) { widget._$detailsContainer.remove(); widget._$viewForm.remove(); widget._loadSubscriptions(); } else { widget._serverError(data); } }); }, _submitSubscriptionCancel: function (callback) { Accumulus.info("Submitting subscription cancel to the server..."); var widget = this; var url = Accumulus.serviceUrl + "/UpdateSubscriptionStatus"; var data = $.extend({ sid: widget._subscription.SubscriptionID, status: 'Closed' }, widget._accessInfo); Accumulus.API.jsonpCall(url, data, callback); }, _fillDetailsForm: function () { var widget = this; var s = widget._subscription; var $detailsContainer = this._$detailsContainer; var startDate = Accumulus.API.helper.formatDate(s.StartDate); var freeTrialEndDate = Accumulus.API.helper.formatDate(s.FreeTrialEndDate); var subscriptionID = s.SubscriptionID || ''; var offerName = s.OfferName || ''; var status = s.Status || ''; /*if(status == 'Inactive'){ $detailsContainer.find('.acc-cancel-subscription').addClass('ui-disabled'); }*/ try { var status = Accumulus.labels.subscriptionList[status] || status; //Localize Status } catch (e) { Accumulus.error(e.msg) }; var setOrHide = Accumulus.API.helper.setOrHide; $detailsContainer.find('.acc-id').text(subscriptionID); $detailsContainer.find('.acc-offer').text(offerName); setOrHide($detailsContainer.find('.acc-promotion-name'), s.PromotionName, true, true); $detailsContainer.find('.acc-status').text(status); $detailsContainer.find('.acc-start-date').text(startDate); setOrHide($detailsContainer.find('.acc-free-trial-end'), freeTrialEndDate, true, true); widget._createSubscriptionItems(); }, _createSubscriptionItems: function () { } }); $.widget("accumulus.statementHistory", $.accumulus.portalPlugin, { options: {}, _statementsView: null, _statements: null, _listTableBody: null, _initPlugin: function () { var widget = this; widget._statementsView = Accumulus.plugins.statementHistory.statementsView; widget._statementsView.getContent(function (content) { widget._loadStatements(); }); }, _loadStatements: function () { var widget = this; widget._fetchStatements(function (success, data) { if (success) { widget._statements = data.Invoices; widget._initStatementsView(); widget._fillStatementsList(); } else { widget._serverError(data); } }); }, _fetchStatements: function (callback) { Accumulus.info("Loading statements info from server..."); var url = Accumulus.serviceUrl + "/GetInvoices"; Accumulus.API.jsonpCall(url, this._accessInfo, callback); }, _initStatementsView: function () { var widget = this; var $container = this.element; $container.empty().append(widget._statementsView.content); var $listTable = $container.find('.acc-statement-list'); var $listTableBody = $listTable.find('tbody'); widget._listTableBody = $listTableBody; if (!widget.options.showHeader) { $container.find('.acc-widget-title').hide(); } Accumulus.localize($container, Accumulus.labels.statementHistory); }, _fillStatementsList: function () { var widget = this; var $container = widget.element; var statements = widget._statements; var $tableBody = widget._listTableBody; if (statements.length > 0) { for (var i in statements) { var statement = statements[i]; var date = Accumulus.API.helper.formatDate(statement.InvoiceDate); var tr = $(''); $('').append( $('').text(statement.InvoiceNumber) .attr("href", statement.InvoiceUrl) .attr("target", '_blank') ).appendTo(tr); $('').text(date).appendTo(tr); var $e = $('') .text(statement.PreviousBalance) .appendTo(tr); Accumulus.formatCurrency($e); $e = $('') .text(statement.FeeTotal) .appendTo(tr); Accumulus.formatCurrency($e); $e = $('') .text(statement.PaymentTotal) .appendTo(tr); Accumulus.formatCurrency($e); $e = $('') .text(statement.AdjustmentTotal) .appendTo(tr); Accumulus.formatCurrency($e); $e = $('') .text(statement.CurrentBalance) .appendTo(tr); Accumulus.formatCurrency($e); $tableBody.append(tr); } } else { $container.find('.acc-statement-list').hide(); var noStatementsLabel = 'No statements.'; try { noStatementsLabel = Accumulus.labels.statementHistory.noStatements; } catch (e) { Accumulus.info("There's no label for noStatements defined.") } $('
').text(noStatementsLabel) .appendTo($container.find('.acc-statement-history-view')); } } }); $.widget("accumulus.paymentMethods", $.accumulus.portalPlugin, { options: { showBillingAddress: true, showCreditCards: true, showBankAccounts: false, showBillingAgreements: false, confirmUrl: null, cancelUrl: null }, _paymentMethodsView: null, _defaultPaymentMethodKey: null, _$viewForm: null, _$detailsContainer: null, _bankAccounts: {}, _billingAgreements: {}, _creditCards: {}, _creditCard: null, _bankAccount: null, _billingAgreement: null, _initPlugin: function () { var widget = this; widget._paymentMethodsView = Accumulus.plugins.paymentMethods.paymentMethodsView; widget._paymentMethodsView.getContent(function (content) { widget._loadPaymentMethods(); }); }, _loadPaymentMethods: function () { var widget = this; widget._fetchPaymentMethods(function (success, data) { if (success) { widget._defaultPaymentMethodKey = data.CurrentPaymentMethodKey; widget._bankAccounts = data.BankAccounts; widget._creditCards = data.CreditCards; widget._billingAgreements = data.BillingAgreements; widget._initPaymentMethodsView(); widget._fillPaymentMethodsView(); } else { widget._serverError(data); } }); }, _fetchPaymentMethods: function (callback) { Accumulus.info("Loading payment methods info from server..."); var url = Accumulus.serviceUrl + "/GetPaymentMethods"; Accumulus.API.jsonpCall(url, this._accessInfo, callback); }, _initPaymentMethodsView: function () { var widget = this; var $container = widget.element; $container.empty().append(widget._paymentMethodsView.content); var $viewForm = $container.find('.acc-payment-methods-view'); widget._$viewForm = $viewForm; if (!widget.options.showHeader) { $container.find('.acc-widget-title').hide(); } if (widget.options.showCreditCards) { $viewForm.find('.acc-add-credit-card').bind( "click", function (event, ui) { widget._addCreditCard(); } ); } else { $viewForm.find('.acc-credit-cards').hide(); //$viewForm.find('[name="creditCardsSection"]').hide(); } if (widget.options.showBankAccounts) { $viewForm.find('.acc-add-bank-account').bind( "click", function (event, ui) { widget._addBankAccount(); } ); } else { $viewForm.find('.acc-bank-accounts').hide(); } if (widget.options.showBillingAgreements) { $viewForm.find('.acc-add-billing-agreement').bind( "click", function (event, ui) { widget._addBillingAgreement(); } ); $viewForm.find('.acc-reload-billing-agreements').bind( "click", function (event, ui) { widget._loadPaymentMethods(); } ); } else { $viewForm.find('.acc-billing-agreements').hide(); } Accumulus.localize($viewForm, Accumulus.labels.paymentMethods); }, _addCreditCard: function () { var widget = this; widget._$viewForm.hide(); Accumulus.plugins.paymentMethods.editCreditCardView.getContent(function (content) { widget._initCreditCardForm(); }); }, _addBankAccount: function () { var widget = this; widget._$viewForm.hide(); Accumulus.plugins.paymentMethods.editBankAccountView.getContent(function (content) { widget._initBankAccountForm(); }); }, _addBillingAgreement: function () { var widget = this; widget._createBillingAgreement(function (success, data) { if (success) { window.open(data.RedirectUrl, '_blank'); } else { widget._serverError(data); } }); }, _editCreditCard: function (creditCard) { var widget = this; widget._creditCard = creditCard; widget._$viewForm.hide(); Accumulus.plugins.paymentMethods.editCreditCardView.getContent(function (content) { widget._initCreditCardForm(); widget._$detailsContainer.find('.acc-cvv-field').hide(); widget._fillCreditCardForm(); }); }, _editBankAccount: function (bankAccount) { var widget = this; widget._bankAccount = bankAccount; widget._$viewForm.hide(); Accumulus.plugins.paymentMethods.editBankAccountView.getContent(function (content) { widget._initBankAccountForm(); widget._fillBankAccountForm(); }); }, _initCreditCardForm: function () { var widget = this; var $container = this.element; var currentYear = (new Date()).getFullYear(); var gLabels = Accumulus.labels.general; $container.append(Accumulus.plugins.paymentMethods.editCreditCardView.content); var $detailsContainer = $container.find('.acc-credit-card-edit-view'); var $editForm = $detailsContainer.find('.acc-credit-card-edit-form'); var $yearSelect = $detailsContainer.find('[name="year"]'); widget._$detailsContainer = $detailsContainer; Accumulus.localize($detailsContainer, Accumulus.labels.paymentMethods); var mastercardImg = $detailsContainer.find('.acc-card-mastercard-img'); var visaImg = $detailsContainer.find('.acc-card-visa-img'); var discoverImg = $detailsContainer.find('.acc-card-discover-img'); var amexImg = $detailsContainer.find('.acc-card-amex-img'); mastercardImg.attr('src', Accumulus.images.MC); visaImg.attr('src', Accumulus.images.VISA); discoverImg.attr('src', Accumulus.images.DISC); amexImg.attr('src', Accumulus.images.AMEX); $detailsContainer.find('.acc-cvv-img') .attr('src', Accumulus.images.CVV); $detailsContainer.find('.acc-cancel').bind("click", function (event, ui) { widget._creditCard = null; widget._cancel(); }); for (var year = 2005; year <= 2099; year++) { var twoDigitsYear = year.toString().substring(2); $yearSelect.append(new Option(year, twoDigitsYear)); } $yearSelect.val(currentYear.toString().substring(2)); var creditCard = widget._creditCard; Accumulus.hookUpStateAndCountry( widget, $detailsContainer.find('[name="state"]'), creditCard && (creditCard.StateProvinceCode || creditCard.StateProvince), $detailsContainer.find('[name="country"]'), creditCard && creditCard.CountryCode); $editForm.validate({ submitHandler: function (form) { widget._saveCreditCard(); }, rules: { name: { required: true }, number: { required: true, creditcard: true }, month: { required: true }, year: { required: true }, postalCode: { required: true } }, messages: { name: gLabels['nameRequired'] || 'Name Required', number: { required: gLabels['cardNumberRequired'] || 'Card Number Required', creditcard: gLabels['creditcard'] || 'Incorrect Card Number' }, month: gLabels['expirationDate'] || 'Expiration Date Required', year: gLabels['expirationDate'] || 'Expiration Date Required', postalCode: gLabels['postalCodeRequired'] || 'Postal Code Required' }, errorPlacement: widget._validationErrorPlacement }); if (!widget.options.showBillingAddress) { $detailsContainer.find('.acc-billing-address').hide(); } }, _initBankAccountForm: function () { var widget = this; var $container = this.element; var gLabels = Accumulus.labels.general; $container.append(Accumulus.plugins.paymentMethods.editBankAccountView.content); var $detailsContainer = $container.find('.acc-bank-account-edit-view'); var $editForm = $detailsContainer.find('.acc-bank-account-edit-form'); widget._$detailsContainer = $detailsContainer; Accumulus.localize($detailsContainer, Accumulus.labels.paymentMethods); $detailsContainer.find('.acc-cancel').bind("click", function (event, ui) { widget._bankAccount = null; widget._cancel(); }); var bankAccount = widget._bankAccount; Accumulus.hookUpStateAndCountry( widget, $detailsContainer.find('[name="state"]'), bankAccount && (bankAccount.StateProvinceCode || bankAccount.StateProvince), $detailsContainer.find('[name="country"]'), bankAccount && bankAccount.CountryCode); $editForm.validate({ submitHandler: function (form) { widget._saveBankAccount(); }, rules: { type: { required: true }, bankName: { required: true }, routingNumber: { required: true }, accountNumber: { required: true }, name: { required: true }, country: { required: true } }, messages: { type: gLabels['typeRequired'] || 'Type required', bankName: gLabels['bankNameRequired'] || 'Bank name required', routingNumber: gLabels['routingNumberRequired'] || 'Routing number required', accountNumber: gLabels['accountNumberRequired'] || 'Account number required', name: gLabels['nameRequired'] || 'Name required', country: gLabels['countryRequired'] || 'Country required' }, errorPlacement: widget._validationErrorPlacement }); }, _fillCreditCardForm: function () { var widget = this; var cc = widget._creditCard; var $detailsContainer = this._$detailsContainer; var number = cc.AccountNumber || ''; var name = cc.FirstName + " " + cc.LastName; //var cvv = cc.CVCode || ''; var company = cc.Company || ''; var address1 = cc.AddressLine1 || ''; var address2 = cc.AddressLine2 || ''; var city = cc.City || ''; var state = cc.StateProvinceCode || cc.StateProvince || ''; var postalCode = cc.PostalCode || ''; var country = cc.CountryCode || Accumulus.global.defaultCountryCode; var month = ''; var year = ''; try { var month = (cc.ExpirationDate) ? cc.ExpirationDate.substring(0, 2) : ''; var year = (cc.ExpirationDate) ? cc.ExpirationDate.substring(2) : ''; } catch (e) { Accumulus.error('Credit Card expiration date not correct.'); } $detailsContainer.find('[name="name"]').val(name); $detailsContainer.find('[name="month"]').val(month); $detailsContainer.find('[name="year"]').val(year); $detailsContainer.find('[name="number"]').val(number); $detailsContainer.find('[name="company"]').val(company); $detailsContainer.find('[name="address1"]').val(address1); $detailsContainer.find('[name="address2"]').val(address2); $detailsContainer.find('[name="city"]').val(city); $detailsContainer.find('[name="postalCode"]').val(postalCode); }, _fillBankAccountForm: function () { var widget = this; var ba = widget._bankAccount; var $detailsContainer = this._$detailsContainer; var type = ba.AccountType; var bankName = ba.BankName || ''; var routingNumber = ba.RoutingNumber || ''; var accountNumber = ba.AccountNumber || ''; var name = ba.FirstName + " " + ba.LastName; var company = ba.Company || ''; var address1 = ba.AddressLine1 || ''; var address2 = ba.AddressLine2 || ''; var city = ba.City || ''; var state = ba.StateProvinceCode || ba.StateProvince || ''; var postalCode = ba.PostalCode || ''; var country = ba.CountryCode || Accumulus.global.defaultCountryCode; $detailsContainer.find('[name="type"]').val(type); $detailsContainer.find('[name="bankName"]').val(bankName); $detailsContainer.find('[name="routingNumber"]').val(routingNumber); $detailsContainer.find('[name="accountNumber"]').val(accountNumber); $detailsContainer.find('[name="name"]').val(name); $detailsContainer.find('[name="company"]').val(company); $detailsContainer.find('[name="address1"]').val(address1); $detailsContainer.find('[name="address2"]').val(address2); $detailsContainer.find('[name="city"]').val(city); $detailsContainer.find('[name="postalCode"]').val(postalCode); }, _saveCreditCard: function () { var widget = this; if (widget._creditCard == null) { this._createCreditCard(function (success, data) { if (success) { widget._$detailsContainer.remove(); //widget._reloadCreditCards(); widget._loadPaymentMethods(); widget._$viewForm.show(); } else { widget._serverError(data); } }); } else { this._updateCreditCard(function (success, data) { if (success) { widget._creditCard = null; widget._$detailsContainer.remove(); widget._reloadCreditCards(); widget._$viewForm.show(); } else { widget._serverError(data); } }); } }, _saveBankAccount: function () { var widget = this; if (widget._bankAccount == null) { this._createBankAccount(function (success, data) { if (success) { widget._$detailsContainer.remove(); //widget._reloadBankAccounts(); widget._loadPaymentMethods(); widget._$viewForm.show(); } else { widget._serverError(data); } }); } else { this._updateBankAccount(function (success, data) { if (success) { widget._bankAccount = null; widget._$detailsContainer.remove(); widget._reloadBankAccounts(); widget._$viewForm.show(); } else { widget._serverError(data); } }); } }, _createCreditCard: function (callback) { Accumulus.info('Submitting new credit card info...'); var widget = this; var $detailsContainer = widget._$detailsContainer; var url = Accumulus.serviceUrl + '/CreatePaymentMethod'; var cardNumber = $detailsContainer.find('[name="number"]').val(); var expirationDate = $detailsContainer.find('[name="month"]').val() + $detailsContainer.find('[name="year"]').val(); var json = { cc: { name: $detailsContainer.find('[name="name"]').val(), number: cardNumber, exp: expirationDate, cvv: $detailsContainer.find('[name="cvv"]').val(), company: $detailsContainer.find('[name="company"]').val(), addr1: $detailsContainer.find('[name="address1"]').val(), addr2: $detailsContainer.find('[name="address2"]').val(), postal: $detailsContainer.find('[name="postalCode"]').val(), state: $detailsContainer.find('[name="state"]').val(), city: $detailsContainer.find('[name="city"]').val(), country: $detailsContainer.find('[name="country"]').val() } } $.extend(json, widget._accessInfo); Accumulus.API.jsonpCall(url, json, callback); }, _createBankAccount: function (callback) { Accumulus.info('Submitting new bank account info...'); var widget = this; var $detailsContainer = widget._$detailsContainer; var url = Accumulus.serviceUrl + '/CreatePaymentMethod'; var ba = widget._bankAccount; var json = { ba: { number: $detailsContainer.find('[name="accountNumber"]').val(), type: $detailsContainer.find('[name="type"]').val(), route: $detailsContainer.find('[name="routingNumber"]').val(), bank: $detailsContainer.find('[name="bankName"]').val(), name: $detailsContainer.find('[name="name"]').val(), company: $detailsContainer.find('[name="company"]').val(), addr1: $detailsContainer.find('[name="address1"]').val(), addr2: $detailsContainer.find('[name="address2"]').val(), postal: $detailsContainer.find('[name="postalCode"]').val(), state: $detailsContainer.find('[name="state"]').val(), city: $detailsContainer.find('[name="city"]').val(), country: $detailsContainer.find('[name="country"]').val() } } $.extend(json, widget._accessInfo); Accumulus.API.jsonpCall(url, json, callback); }, _createBillingAgreement: function (callback) { Accumulus.info('Submitting billing agreement info...'); var widget = this; var url = Accumulus.serviceUrl + '/CreatePaymentMethod'; //TODO: Remove name & email when they're added through the backend. var json = { pp: { name: "Customer Name", email: "noreply@accumulus.com", confirmUrl: widget.options.confirmUrl, cancelUrl: widget.options.cancelUrl } }; $.extend(json, widget._accessInfo); Accumulus.API.jsonpCall(url, json, callback); }, _updateCreditCard: function (callback) { Accumulus.info('Submitting credit card info...'); var widget = this; var $detailsContainer = widget._$detailsContainer; var cc = widget._creditCard; var url = Accumulus.serviceUrl + '/UpdatePaymentMethod'; var cardNumber = $detailsContainer.find('[name="number"]').val(); var expirationDate = $detailsContainer.find('[name="month"]').val() + $detailsContainer.find('[name="year"]').val(); var json = { cc: { key: cc.PaymentMethodKey, name: $detailsContainer.find('[name="name"]').val(), number: cardNumber, exp: expirationDate, company: $detailsContainer.find('[name="company"]').val(), addr1: $detailsContainer.find('[name="address1"]').val(), addr2: $detailsContainer.find('[name="address2"]').val(), postal: $detailsContainer.find('[name="postalCode"]').val(), state: $detailsContainer.find('[name="state"]').val(), city: $detailsContainer.find('[name="city"]').val(), country: $detailsContainer.find('[name="country"]').val() } } $.extend(json, widget._accessInfo); Accumulus.API.jsonpCall(url, json, callback); }, _updateBankAccount: function (callback) { Accumulus.info('Submitting bank account info...'); var widget = this; var $detailsContainer = widget._$detailsContainer; var url = Accumulus.serviceUrl + '/UpdatePaymentMethod'; var ba = widget._bankAccount; var json = { ba: { key: ba.PaymentMethodKey, number: $detailsContainer.find('[name="accountNumber"]').val(), type: $detailsContainer.find('[name="type"]').val(), route: $detailsContainer.find('[name="routingNumber"]').val(), bank: $detailsContainer.find('[name="bankName"]').val(), name: $detailsContainer.find('[name="name"]').val(), company: $detailsContainer.find('[name="company"]').val(), addr1: $detailsContainer.find('[name="address1"]').val(), addr2: $detailsContainer.find('[name="address2"]').val(), postal: $detailsContainer.find('[name="postalCode"]').val(), state: $detailsContainer.find('[name="state"]').val(), city: $detailsContainer.find('[name="city"]').val(), country: $detailsContainer.find('[name="country"]').val() } } $.extend(json, widget._accessInfo); Accumulus.API.jsonpCall(url, json, callback); }, _reloadCreditCards: function () { var widget = this; widget._fetchPaymentMethods(function (success, data) { if (success) { widget._defaultPaymentMethodKey = data.CurrentPaymentMethodKey; widget._creditCards = data.CreditCards; widget._fillCreditCards(); } else { widget._serverError(data); } }); }, _reloadBankAccounts: function () { var widget = this; widget._fetchPaymentMethods(function (success, data) { if (success) { widget._defaultPaymentMethodKey = data.CurrentPaymentMethodKey; widget._bankAccounts = data.BankAccounts; widget._fillBankAccounts(); } else { widget._serverError(data); } }); }, _reloadBillingAgreements: function () { var widget = this; widget._fetchPaymentMethods(function (success, data) { if (success) { widget._defaultPaymentMethodKey = data.CurrentPaymentMethodKey; widget._billingAgreements = data.BillingAgreements; widget._fillBillingAgreements(); } else { widget._serverError(data); } }); }, _fillPaymentMethodsView: function () { var widget = this; widget._fillCreditCards(); widget._fillBankAccounts(); widget._fillBillingAgreements(); }, _fillCreditCards: function () { var widget = this; var $viewForm = widget._$viewForm; var $container = $viewForm.find('.acc-credit-cards-list'); $container.empty(); var creditCards = widget._creditCards; if (creditCards && creditCards.length > 0) { for (var i in creditCards) { var cc = creditCards[i]; var $div = $('
'); $container.append($div); $div.data('cc', cc).load( Accumulus.plugins.paymentMethods.creditCardItemView.path, //TODO: review function () { var $this = $(this); var cc = $this.data('cc'); var key = cc.PaymentMethodKey; if (key == widget._defaultPaymentMethodKey) { $this.find('.acc-default-payment-method').addClass('ui-disabled'); $this.find('.acc-default-payment-method-img') .attr('title', Accumulus.labels.paymentMethods.defaultPaymentMethod) .attr('src', Accumulus.resourcesUrl + 'images/check-black.png').show(); } var type = cc.Type || ''; if (Accumulus.images[type]) { $this.find('.acc-card-type-img').attr('src', Accumulus.images[type]); } else { $this.find('.acc-card-type-img').attr('src', Accumulus.resourcesUrl + widget.images.DEFAULT); } var accountNumber = cc.AccountNumber || ''; var firstName = cc.FirstName || ''; var lastName = cc.LastName || ''; var company = cc.Company || ''; var addressLine1 = cc.AddressLine1 || ''; var addressLine2 = cc.AddressLine2 || ''; var city = cc.City || ''; var state = cc.StateProvince || ''; var postalCode = cc.PostalCode || ''; //TODO: Modify this when the Countries form gets refactored to a JSon structure. var countryOptions = Accumulus.getAllCountries(); var html = $.parseHTML(countryOptions); var country = $('
').html(html).find('option[value="' + cc.CountryCode + '"]').text(); var expDate = cc.ExpirationDate || ''; var expDateMonth = ''; var expDateYear = ''; if (accountNumber.length == 16) { accountNumber = accountNumber.substr(12); } if (expDate.length == 4) { expDateMonth = expDate.substr(0, 2); expDateYear = expDate.substr(2); } //$this.find('[name="acc-card-type"]').text(type); $this.find('.acc-card-name').text(firstName + ' ' + lastName); $this.find('.acc-card-number').text(accountNumber); $this.find('.acc-exp-date').text(expDateMonth + '/' + '20' + expDateYear); $this.find('.acc-company').text(company); $this.find('.acc-address1').text(addressLine1); $this.find('.acc-address2').text(addressLine2); $this.find('.acc-city').text(city); $this.find('.acc-state').text(state); $this.find('.acc-postal-code').text(postalCode); $this.find('.acc-country').text(country); $this.find('.acc-edit-credit-card').bind( "click", function (event, ui) { widget._editCreditCard(cc); } ); $this.find('.acc-delete-credit-card').bind( "click", function (event, ui) { Accumulus.API.yesNoPrompt( Accumulus.labels.general['areYouSure?'], Accumulus.labels.paymentMethods.confirmDeleteCC, Accumulus.labels.general.yes, Accumulus.labels.general.no, function (selection) { if (selection) { widget._deletePaymentMethod( 'cc', key, function (success, data) { if (success) { if (key == widget._defaultPaymentMethodKey) { widget._loadPaymentMethods(); } else { widget._reloadCreditCards(); } } else { widget._serverError(data); } } ); } }); } ); $this.find('.acc-default-payment-method').bind( "click", function (event, ui) { widget._setAsDefault(key); } ); if (!widget.options.showBillingAddress) { $this.find('.acc-billing-address').hide(); } Accumulus.localize($this, Accumulus.labels.paymentMethods); widget._enhanceCCItem(this); } ); } } else { $viewForm.find('.acc-expires-title').hide(); //TODO:review that this works correctly $container.addClass('list-item-padding') .text(Accumulus.labels.paymentMethods.noCreditCards); } }, _fillBankAccounts: function () { var widget = this; var $viewForm = widget._$viewForm; var backAccounts = widget._bankAccounts; var $container = $viewForm.find('.acc-bank-accounts-list'); $container.empty(); if (backAccounts && backAccounts.length > 0) { for (var i in backAccounts) { var ba = backAccounts[i]; var $div = $('
'); $container.append($div); $div.data('ba', ba).load( //Accumulus.resourcesUrl + 'forms/' + Accumulus.layout + Accumulus.plugin.paymentMethods.forms.bankAccountItem.path, Accumulus.plugins.paymentMethods.bankAccountItemView.path, //TODO: review function () { var $this = $(this); var ba = $this.data('ba'); $this.find('.acc-bank-account-img') .attr('src', Accumulus.images.BA); var key = ba.PaymentMethodKey; if (key == widget._defaultPaymentMethodKey) { $this.find('.acc-default-payment-method').addClass('ui-disabled'); $this.find('.acc-default-payment-method-img') .attr('title', Accumulus.labels.paymentMethods.defaultPaymentMethod) .attr('src', Accumulus.resourcesUrl + 'images/check-black.png').show(); } var accountNumber = ba.AccountNumber || ''; var type = ba.AccountType || ''; try { type = Accumulus.labels.paymentMethods[type]; } catch (e) { accumulus.info(e.message) } var key = ba.PaymentMethodKey; var firstName = ba.FirstName || ''; var lastName = ba.LastName || ''; var bankName = ba.BankName || ''; var routingNumber = ba.RoutingNumber || ''; var company = ba.Company || ''; var addressLine1 = ba.AddressLine1 || ''; var addressLine2 = ba.AddressLine2 || ''; var city = ba.City || ''; var state = ba.StateProvince || ''; var postalCode = ba.PostalCode || ''; //TODO: Modify this when the Countries form gets refactored to a JSon structure. var countryOptions = Accumulus.getAllCountries(); var html = $.parseHTML(countryOptions); var country = $('
').html(html).find('option[value="' + ba.CountryCode + '"]').text(); $this.find('.acc-bank-name').text(bankName); $this.find('.acc-bank-account-number').text(accountNumber); $this.find('.acc-bank-account-name').text(firstName + " " + lastName); $this.find('.acc-bank-account-type').text(type); $this.find('.acc-bank-routing-number').text(routingNumber); $this.find('.acc-company').text(company); $this.find('.acc-address1').text(addressLine1); $this.find('.acc-address2').text(addressLine2); $this.find('.acc-city').text(city); $this.find('.acc-state').text(state); $this.find('.acc-postal-code').text(postalCode); $this.find('.acc-country').text(country); $this.find('.acc-edit-bank-account').bind( "click", function (event, ui) { widget._editBankAccount(ba); } ); $this.find('.acc-delete-bank-account').bind( "click", function (event, ui) { Accumulus.API.yesNoPrompt( Accumulus.labels.general['areYouSure?'], Accumulus.labels.paymentMethods.confirmDeleteBA, Accumulus.labels.general.yes, Accumulus.labels.general.no, function (selection) { if (selection) { widget._deletePaymentMethod( 'ba', key, function (success, data) { if (success) { if (key == widget._defaultPaymentMethodKey) { widget._loadPaymentMethods(); } else { widget._reloadBankAccounts(); } } else { widget._serverError(data); } } ); } }); } ); $this.find('.acc-default-payment-method').bind( "click", function (event, ui) { widget._setAsDefault(key); } ); Accumulus.localize($this, Accumulus.labels.paymentMethods); widget._enhanceBAItem(this); } ); } } else { $container.addClass('list-item-padding') .text(Accumulus.labels.paymentMethods.noBankAccounts); } }, _fillBillingAgreements: function () { var widget = this; var $viewForm = widget._$viewForm; var billingAgreements = widget._billingAgreements; var $container = $viewForm.find('.acc-billing-agreements-list'); $container.empty(); if (billingAgreements && billingAgreements.length > 0) { for (var i in billingAgreements) { var ba = billingAgreements[i]; var $div = $('
'); $container.append($div); $div.data('ba', ba).load( Accumulus.plugins.paymentMethods.billingAgreementItemView.path, //TODO: review function () { var $this = $(this); var ba = $this.data('ba'); var baTypeImg = Accumulus.images.PP; $this.find('.acc-billing-agreement-img') .attr('src', baTypeImg); var key = ba.PaymentMethodKey; if (key == widget._defaultPaymentMethodKey) { $this.find('.acc-default-payment-method').addClass('ui-disabled'); $this.find('.acc-default-payment-method-img') .attr('title', Accumulus.labels.paymentMethods.defaultPaymentMethod) .attr('src', Accumulus.resourcesUrl + 'images/check-black.png').show(); } var firstName = ba.FirstName || ''; var lastName = ba.LastName || ''; var agreementID = ba.AgreementID || ''; var startingDate = ba.StartingDate || ''; startingDate = Accumulus.API.helper.formatDate(startingDate); var endingDate = ba.EndingDate || ''; endingDate = Accumulus.API.helper.formatDate(endingDate); $this.find('.acc-billing-agreement-id').text(agreementID); $this.find('.acc-billing-agreement-name').text(firstName + " " + lastName); $this.find('.acc-billing-agreement-starting-date').text(startingDate); $this.find('.acc-billing-agreement-ending-date').text(endingDate); $this.find('.acc-billing-agreement-delete').bind( "click", function (event, ui) { Accumulus.API.yesNoPrompt( Accumulus.labels.general['areYouSure?'], Accumulus.labels.paymentMethods['confirmDeletePP'], Accumulus.labels.general.yes, Accumulus.labels.general.no, function (selection) { if (selection) { widget._deletePaymentMethod( 'pp', key, function (success, data) { if (success) { if (key == widget._defaultPaymentMethodKey) { widget._loadPaymentMethods(); } else { widget._reloadBillingAgreements(); } } else { widget._serverError(data); } } ); } }); } ); $this.find('.acc-default-payment-method').bind( "click", function (event, ui) { widget._setAsDefault(key); } ); Accumulus.localize($this, Accumulus.labels.paymentMethods); widget._enhancePPItem(this); } ); } } else { $container.addClass('list-item-padding') .text(Accumulus.labels.paymentMethods.noBillingAgreements); } }, _enhanceCCItem: function (item) { }, _enhanceBAItem: function (item) { }, _enhancePPItem: function (item) { }, _setAsDefault: function (key) { Accumulus.info('Submitting default payment method...'); var widget = this; var url = Accumulus.serviceUrl + '/UpdatePaymentMethodSequence'; var json = widget._accessInfo; var sequence = key; var creditCards = widget._creditCards; var bankAccounts = widget._bankAccounts; var billingAgreements = widget._billingAgreements; for (var i in creditCards) { var ccKey = creditCards[i].PaymentMethodKey; if (ccKey != key) { sequence += ',' + ccKey; } } for (var i in bankAccounts) { var baKey = bankAccounts[i].PaymentMethodKey; if (baKey != key) { sequence += ',' + baKey; } } for (var i in billingAgreements) { var ppKey = billingAgreements[i].PaymentMethodKey; if (ppKey != key) { sequence += ',' + ppKey; } } json.sequence = sequence; Accumulus.API.jsonpCall(url, json, function (success, data) { if (success) { widget._loadPaymentMethods(); } else { widget._serverError(data); } }); }, _deletePaymentMethod: function (type, key, callback) { var widget = this; var url = Accumulus.serviceUrl + "/DeletePaymentMethod"; var data = widget._accessInfo; var json = {}; json[type] = { key: key }; $.extend(json, data); Accumulus.info("Deleting payment method info..."); Accumulus.API.jsonpCall(url, json, callback); }, _cancel: function () { this._creditCard = null; this._bankAccount = null; this._billingAgreement = null; this._$detailsContainer.remove(); this._$viewForm.show(); } }); $.widget("accumulus.usageBalances", $.accumulus.portalPlugin, { options: { formatQuantityHandler: null }, _balancesView: null, _$viewForm: null, _usageBalances: null, _initPlugin: function () { var widget = this; widget._balancesView = Accumulus.plugins.usageBalances.balancesView; widget._balancesView.getContent(function (content) { widget._loadUsageBalances(); }); }, _loadUsageBalances: function () { var widget = this; widget._fetchUsageBalances(function (success, data) { if (success) { widget._usageBalances = data.UsageBalances; widget._initViewForm(); widget._fillViewForm(); } else { widget._serverError(data); } }); }, _fetchUsageBalances: function (callback) { Accumulus.info("Loading usages info from server..."); var url = Accumulus.serviceUrl + "/GetUsageBalances"; Accumulus.API.jsonpCall(url, this._accessInfo, callback); }, _initViewForm: function () { var widget = this; var $container = this.element; $container.empty().append(widget._balancesView.content); var $viewForm = $container.find('.acc-usage-balances-view'); widget._$viewForm = $viewForm; if (!widget.options.showHeader) { $container.find('.acc-widget-title').hide(); } Accumulus.localize($viewForm, Accumulus.labels.usageBalances); }, _fillViewForm: function () { } }); $.widget("accumulus.usageHistory", $.accumulus.portalPlugin, { options: { skip: 0, take: 10, fromDateTime: "" }, _usageHistoryView: null, _usageDetailsView: null, _totalUsages: null, _$viewForm: null, _$detailsContainer: null, _usages: {}, _usage: null, _currentPage: null, _nextBtn: null, _previousBtn: null, _initPlugin: function () { var widget = this; widget._usageHistoryView = Accumulus.plugins.usageHistory.usageHistoryView; widget._usageHistoryView.getContent(function (content) { widget._loadUsages(); }); }, _loadUsages: function () { var widget = this; widget._fetchUsages(function (success, data) { if (success) { widget._currentPage = 1; widget._usages[widget._currentPage] = data.Usages; widget._totalUsages = data.TotalItemCount; widget._initViewForm(); widget._fillViewForm(); } else { widget._serverError(data); } }); }, _fetchUsages: function (callback) { Accumulus.info("Loading usages info from server..."); var widget = this; var url = Accumulus.serviceUrl + "/GetUsages"; var data = widget._accessInfo; var json = { skip: widget.options.skip, take: widget.options.take, fromDateTime: widget.options.fromDateTime }; $.extend(json, data); Accumulus.API.jsonpCall(url, json, callback); }, _initViewForm: function () { var widget = this; var $container = this.element; $container.empty(); var currentPage = widget._currentPage; var itemsByPage = widget.options.take; var totalItems = widget._totalUsages; $container.append(widget._usageHistoryView.content); var $viewForm = $container.find('.acc-usage-history-view'); widget._$viewForm = $viewForm; if (!widget.options.showHeader) { $container.find('.acc-widget-title').hide(); } Accumulus.localize($viewForm, Accumulus.labels.usageHistory); widget._nextBtn = $viewForm.find('.acc-next'); widget._previousBtn = $viewForm.find('.acc-previous'); $(widget._nextBtn).button(); $(widget._previousBtn).button(); $(widget._nextBtn).click( function (event, ui) { widget._next(); } ) $(widget._previousBtn).click( function (event, ui) { widget._previous(); } ) widget._disablePrevious(); if ((currentPage * itemsByPage) >= totalItems) { widget._disableNext(); }; }, _next: function () { var widget = this; var itemsByPage = widget.options.take; widget.options.skip = widget._currentPage * itemsByPage; var currentPage = ++widget._currentPage; var totalItems = widget._totalUsages; if (!widget._usages[currentPage]) { widget._fetchUsages(function (success, data) { if (success) { widget._usages[currentPage] = data.Usages; widget._fillViewForm(); } else { widget._serverError(data); return; } }); } else { widget._fillViewForm(); } if ((currentPage * itemsByPage) >= totalItems) { widget._disableNext(); } widget._enablePrevious(); }, _previous: function () { var widget = this; widget._currentPage--; if (widget._currentPage == 1) { widget._disablePrevious(); } widget._enableNext(); widget._fillViewForm(); }, _disablePrevious: function () { $(this._previousBtn).button('disable'); }, _enablePrevious: function () { $(this._previousBtn).button('enable'); }, _disableNext: function () { $(this._nextBtn).button('disable'); }, _enableNext: function () { $(this._nextBtn).button('enable'); }, _fillViewForm: function () { var widget = this; var $container = widget.element; var usages = widget._usages[widget._currentPage]; var $tableBody = widget._$viewForm.find('.acc-usages-list-table tbody'); $tableBody.empty(); if (usages && usages.length > 0) { for (var i in usages) { var u = usages[i]; var date = u.StartDateTime; var typeCode = u.UsageTypeCode; var labelType = null; try { labelType = Accumulus.labels.usageHistory.typeCodes[typeCode]; } catch (e) { Accumulus.info(e.msg) }; var type = labelType || u.UsageTypeName || ''; var quantity = u.Quantity; var date = Accumulus.API.helper.formatDate(date, true); var $tr = $(''); $('').append( $('').text(date) .data('usage', u) .click( function (event, ui) { widget._usage = $(this).data('usage'); widget._details(); //widget._details( $(this).data('usage') ); } ).attr("href", "#") ).appendTo($tr); $('').text(type) .appendTo($tr); $('').text(quantity).appendTo($tr); $tableBody.append($tr); } } else { $container.find('.acc-usages-list-table').hide(); $container.find('.acc-controls').hide(); var noUsagesLabel = 'No usages'; try { noUsagesLabel = Accumulus.labels.usageHistory.noUsages; } catch (e) { Accumulus.info("There's no label for noUsages defined") } $('
').text(noUsagesLabel) .appendTo($container.find('.usage-history-view-content')); } }, _details: function () { var widget = this; widget._$viewForm.hide(); widget._usageDetailsView = Accumulus.plugins.usageHistory.usageDetailsView; widget._usageDetailsView.getContent(function (content) { widget._initDetailsForm(); widget._fillDetailsForm(); }); }, _initDetailsForm: function () { var widget = this; var $container = this.element; $container.append(widget._usageDetailsView.content); var $detailsContainer = $container.find('.acc-usage-details-view'); widget._$detailsContainer = $detailsContainer; Accumulus.localize($detailsContainer, Accumulus.labels.usageHistory); $detailsContainer.find('.acc-ok').bind("click", function (event, ui) { widget._cancel(); }); }, _fillDetailsForm: function () { var u = this._usage; var $detailsContainer = this._$detailsContainer; var startDate = Accumulus.API.helper.formatDate(u.StartDateTime, true); var quantity = u.Quantity || ''; var typeCode = u.UsageTypeCode; var usageType = null; try { usageType = Accumulus.labels.usageHistory.typeCodes[typeCode]; } catch (e) { Accumulus.info(e.msg); } usageType = usageType || u.UsageTypeName || ''; var subscriptionID = u.SubscriptionID || ''; var subscriptionItemID = u.SubscriptionItemID || ''; $detailsContainer.find('.acc-start-date').text(startDate); $detailsContainer.find('.acc-quantity').text(quantity); $detailsContainer.find('.acc-usage-type').text(usageType); $detailsContainer.find('.acc-subscription-id').text(subscriptionID); $detailsContainer.find('.acc-subscription-item-id').text(subscriptionItemID); }, _cancel: function () { this._$detailsContainer.remove(); this._$viewForm.show(); } }); $.widget("accumulus.makePayment", $.accumulus.portalPlugin, { options: { paymentMade: null }, _paymentMethods: null, _SEPARATOR: ' - ', _makePaymentView: null, _initPlugin: function () { var widget = this; widget._makePaymentView = Accumulus.plugins.makePayment.makePaymentView; widget._makePaymentView.getContent(function (content) { widget._loadPaymentMethods(); }); }, _loadPaymentMethods: function () { var widget = this; widget._fetchPaymentMethods(function (success, data) { if (success) { widget._paymentMethods = data; widget._initMakePaymentView(); } else { widget._serverError(data); } }); }, _fetchPaymentMethods: function (callback) { Accumulus.info("Loading payment methods info from server..."); var url = Accumulus.serviceUrl + "/GetPaymentMethods"; Accumulus.API.jsonpCall(url, this._accessInfo, callback); }, _initMakePaymentView: function () { var widget = this; var A = Accumulus; var $container = widget.element; $container.empty().append(widget._makePaymentView.content); if (!widget.options.showHeader) { $container.find('.acc-widget-title').hide(); } var pmSelect = $container.find('.acc-payment-method'); var paymentMethods = widget._paymentMethods; var creditCards = paymentMethods.CreditCards; var bankAccounts = paymentMethods.BankAccounts; var billingAgreements = paymentMethods.BillingAgreements; for (var i in creditCards) { var o = widget._createCCOption(creditCards[i]); pmSelect.append(o); } for (var i in bankAccounts) { var o = widget._createBAOption(bankAccounts[i]); pmSelect.append(o); } for (var i in billingAgreements) { var o = widget._createPPOption(billingAgreements[i]); pmSelect.append(o); } var makePaymentBtn = $container.find('.acc-submit-payment'); $container.find('.acc-make-payment-form').validate({ submitHandler: function (form) { makePaymentBtn.attr('disabled', 'disabled'); widget._makePayment(function (success, data) { if (success) { if (widget._trigger('paymentMade', null, data) !== false) { widget._paymentApplied(); } } else { widget._serverError(data); } makePaymentBtn.removeAttr('disabled'); }); }, rules: { amount: { required: true } }, messages: { amount: A.labels.makePayment['amountRequired'] }, errorPlacement: widget._validationErrorPlacement }); A.localize($container, A.labels.makePayment); widget._enhanceView(); A.API.applyCurrencyFormat($container.find('.acc-payment-amount')); }, _createCCOption: function (cc) { var widget = this; var number = cc.AccountNumber || ''; var expDate = ''; var key = cc.PaymentMethodKey || ''; var type = cc.Type || ''; if (type) type += ' '; if (number.length == 16) { number = number.substr(12); var endingInLabel = Accumulus.labels.makePayment['endingIn']; if (endingInLabel) { number = endingInLabel + ' ' + number; } } if (cc.ExpirationDate) { var expMonth = cc.ExpirationDate.substring(0, 2); var expYear = cc.ExpirationDate.substring(2); expDate = expMonth + '/' + expYear; } var o = $(''); return o.val(key).append(type).append(number).append(widget._SEPARATOR).append(expDate); }, _createBAOption: function (ba) { var widget = this; var bankName = ba.BankName || ''; var number = ba.AccountNumber || ''; var key = ba.PaymentMethodKey || ''; var o = $(''); return o.append(bankName).append(widget._SEPARATOR).append(number).val(key); }, _createPPOption: function (pp) { var widget = this; var key = pp.PaymentMethodKey || ''; var issuer = pp.Issuer || ''; var id = pp.AgreementID || ''; var o = $(''); return o.append(issuer).append(widget._SEPARATOR).append(id).val(key); }, _makePayment: function (callback) { var widget = this; var $container = this.element; var amount = $container.find('[name="amount"]') .asNumber({ region: Accumulus.global.currencyFormat }); var pmKey = $container.find('[name="paymentMethod"]').val(); var url = Accumulus.serviceUrl + '/AuthorizeAndCapture'; var json = { amount: amount, pmk: pmKey }; $.extend(json, widget._accessInfo); Accumulus.API.jsonpCall(url, json, callback); }, _paymentApplied: function () { var widget = this; var $container = widget.element; var paymentAppliedView = Accumulus.plugins.makePayment.paymentAppliedView; paymentAppliedView.getContent(function (content) { $container.html(content); Accumulus.localize($container, Accumulus.labels.makePayment); }); }, _enhanceView: function () { } }); $.widget("accumulus.portal", $.accumulus.widget, { options: { showHeader: true, headerText: '', loginScreen: false, showWidgetHeaders: false, emptyWidgetAreaUrl: null, companyLogoUrl: null, forcePasswordChange: true, showProfile: true, showSubscriptionList: true, showStatementHistory: true, showBalance: true, showUsageHistory: true, showUsageBalances: true, showPaymentMethods: true, showMakePayment: true, profile_onCustomerEdit: null, profile_onPasswordChange: null, profile_showChangePassword: true, profile_taxInformationCountries: null, profile_vatOnEServices: false, subscriptionList_cancelSubscription: true, subscriptionList_itemFieldsHandler: null, usageHistory_skip: 0, usageHistory_take: 10, usageHistory_fromDateTime: '', usageBalances_formatQuantityHandler: null, paymentMethods_showCreditCards: true, paymentMethods_showBankAccounts: false, paymentMethods_showBillingAgreements: false, paymentMethods_confirmUrl: null, paymentMethods_cancelUrl: null, makePayment_onPaymentMade: null, vatOnEServices: false, taxInformationCountries: null }, _selectPluginView: null, _loginView: null, _captchaToken: null, _resetSteps: { GET_CAPTCHA: "getCaptcha", RESET_PASSWORD: "resetPassword" }, _resetNextStep: null, _initPlugin: function () { var widget = this; widget._selectPluginView = Accumulus.plugins.portal.selectWidgetView; widget._selectPluginView.getContent(function (content) { widget._initView(); }); }, _initView: function () { var widget = this; var $container = widget.element; $container.append(widget._selectPluginView.content); Accumulus.localize($container, Accumulus.labels.portal); widget._enhanceView(); var header = $container.find('.acc-portal-header'); if (widget.options.showHeader) { var headerText = widget.options.headerText; header.find('.acc-header-logo').attr('src', widget.options.companyLogoUrl); header.find('.acc-header-text').text(headerText); } else { header.remove(); } if (widget.options.loginScreen) { $container.find('.acc-widget-list').hide(); $container.find('.acc-login-form').show(); $container.find('.acc-forgot-password').bind('click', function () { widget._showResetForm(); }); $container.find('.acc-cancel').bind('click', function () { widget._cancel(); }); $container.find('.acc-get-captcha').bind('click', function () { widget._resetNextStep = widget._resetSteps.GET_CAPTCHA; }); $container.find('.acc-reset-password').bind('click', function () { widget._resetNextStep = widget._resetSteps.RESET_PASSWORD; }); } else { $container.find('.acc-login-form').remove(); $container.find('.acc-reset-password-form').remove(); $container.find('.acc-change-password-form').remove(); } var $loginForm = $container.find('.acc-login-form'); var $resetPasswordForm = $container.find('.acc-reset-password-form'); var labels = Accumulus.labels.portal; $loginForm.validate({ submitHandler: function (form) { widget._login(); }, rules: { username: { required: true }, password: { required: true } }, messages: { username: labels['usernameRequired'], password: labels['passwordRequired'] }, errorPlacement: widget._validationErrorPlacement }); var resetSteps = widget._resetSteps; $resetPasswordForm.validate({ submitHandler: function (form) { if (widget._resetNextStep == resetSteps.GET_CAPTCHA) { widget._getCaptcha(); } else if (widget._resetNextStep == resetSteps.RESET_PASSWORD) { widget._reset(); } }, rules: { username: { required: true }, captcha: { required: true } }, messages: { username: labels['usernameRequired'], captcha: labels['captchaRequired'] }, errorPlacement: widget._validationErrorPlacement }); }, _enhanceView: function () { }, _showResetForm: function () { $(this.element).find('.acc-reset-password-form').show(); $(this.element).find('.acc-login-form').hide(); }, _cancel: function () { $(this.element).find('.acc-reset-password-form').hide(); $(this.element).find('.acc-login-form').show(); }, _login: function () { var widget = this; var $container = widget.element; var $loginForm = $container.find('.acc-login-form'); var $resetPasswordForm = $container.find('.acc-reset-password-form'); var $changePasswordForm = $container.find('.acc-change-password-form'); var $errorContainer = $loginForm.find('.acc-server-error'); widget._submitLogin(function (success, data) { if (success) { widget.options.customerID = data.CustomerID; widget.options.token = data.CustomerPortalToken; widget.options.requestID = data.RequestID; widget.options.timestamp = data.Timestamp; widget.options.currencyCode = data.CurrencyCode; widget._setAccessInfo(); Accumulus.global.currencyCode = data.CurrencyCode; Accumulus.global.currencyFormat = data.CultureCode; $errorContainer.hide(); if (data.CustomerName != '' && widget.options.showHeader) { widget._showCustomerName(data.CustomerName); } if (data.PasswordChangeNeeded && widget.options.forcePasswordChange) { Accumulus.info('Password needs to be changed.'); $loginForm.hide(); $changePasswordForm.show(); widget._initChangePasswordForm(); } else { $loginForm.remove(); $resetPasswordForm.remove(); $changePasswordForm.remove(); $container.find('.acc-widget-list').show(); $container.find('.acc-logout').show(); } } else { widget._serverError(data, $errorContainer); } }); }, _initChangePasswordForm: function () {//222 var widget = this; var $container = widget.element; var gLabels = Accumulus.labels.general; var $form = $container.find('.acc-change-password-form'); $form.find('.acc-cancel').bind('click', function () { widget._cancelPasswordChange(); }); $form.validate({ submitHandler: function (form) { widget._changePassword(); }, rules: { "new-password-1": { required: true, minlength: 7, oneDigit: true, oneSpecialChar: true }, "new-password-2": { required: true, equalTo: '[name="new-password-1"]' } }, messages: { "new-password-1": { required: gLabels['newPasswordRequired'], oneDigit: gLabels['oneDigitRequired'], minlength: gLabels['minSevenCharsLength'], oneSpecialChar: gLabels['oneSpecialChar'] }, "new-password-2": { required: gLabels['newPasswordRequired'], equalTo: gLabels['equalBothPasswords'] } }, errorPlacement: widget._validationErrorPlacement }); }, _changePassword: function () { var widget = this; var $container = widget.element; var $passwordForm = $container.find('.acc-change-password-form'); var $errorContainer = $passwordForm.find('.acc-server-error'); var newPassword1 = $passwordForm.find('[name="new-password-1"]').val(); widget._updatePassword( newPassword1, function (success, data) { if (success) { widget._passwordChanged(); } else { widget._serverError(data, $errorContainer); } } ); }, _passwordChanged: function () { var $container = this.element; $container.find('.acc-login-form').remove(); $container.find('.acc-reset-password-form').remove(); $container.find('.acc-change-password-form').remove(); $container.find('.acc-widget-list').show(); $container.find('.acc-logout').show(); }, _updatePassword: function (newPassword, callback) { var url = Accumulus.serviceUrl + '/CustomerChangePassword'; var data = { cu: { existingPassword: '----', newPassword: newPassword } };//TODO: remove existing password? $.extend(data, this._accessInfo); Accumulus.API.jsonpCall(url, data, callback); }, _cancelPasswordChange: function () { var $container = this.element; $container.find('.acc-login-form').show(); $container.find('.acc-change-password-form').hide(); }, _showCustomerName: function () { }, _submitLogin: function (callback) { var widget = this; var $container = widget.element; var $loginForm = $container.find('.acc-login-form'); Accumulus.info('Submitting login...'); var username = $loginForm.find('[name="username"]').val(); var password = $loginForm.find('[name="password"]').val(); var url = Accumulus.serviceUrl + '/Login'; var json = { tid: widget.options.tenantID, uid: username, pwd: password }; Accumulus.API.jsonpCall(url, json, callback); }, _getCaptcha: function () { var widget = this; var $container = widget.element; var $resetPasswordForm = $container.find('.acc-reset-password-form'); var $errorContainer = $resetPasswordForm.find('.acc-server-error'); widget._fetchCaptchaImg(function (success, data) { if (success) { widget._showCaptcha(data.CaptchaUrl); widget._captchaToken = data.Token; } else { widget._serverError(data, $errorContainer); } }); }, _reset: function () { var widget = this; var $container = widget.element; var $resetPasswordForm = $container.find('.acc-reset-password-form'); var $errorContainer = $resetPasswordForm.find('.acc-server-error'); widget._submitPasswordReset(function (success, data) { if (success) { $errorContainer.empty(); $resetPasswordForm.hide(); widget._hideCaptcha(); $container.find('.acc-login-form').show(); } else { widget._serverError(data, $errorContainer); } }); }, _showCaptcha: function (captchaURL) { }, _hideCaptcha: function () { }, _submitPasswordReset: function (callback) { var widget = this; var $container = widget.element; var $resetPasswordForm = $container.find('.acc-reset-password-form'); Accumulus.info('Submitting password reset...'); var username = $resetPasswordForm.find('[name="username"]').val(); var captcha = $resetPasswordForm.find('[name="captcha"]').val(); var url = Accumulus.serviceUrl + '/ResetPassword'; var json = { tid: widget.options.tenantID, uid: username, ctk: widget._captchaToken, captcha: captcha }; Accumulus.API.jsonpCall(url, json, callback); }, _fetchCaptchaImg: function (callback) { var widget = this; var $container = widget.element; Accumulus.info('fetching captcha...'); var $resetPasswordForm = $container.find('.acc-reset-password-form'); var url = Accumulus.serviceUrl + '/GetCaptcha'; var json = { tid: widget.options.tenantID, uid: $resetPasswordForm.find('[name="username"]').val() }; Accumulus.API.jsonpCall(url, json, callback); }, _getWidgetOptions: function () { var widget = this; return { tenantID: widget.options.tenantID, token: widget.options.token, requestID: widget.options.requestID, timestamp: widget.options.timestamp, customerID: widget.options.customerID, showHeader: widget.options.showWidgetHeaders, messages: widget.options.messages, serverError: widget.options.serverError }; } }); $.widget("accumulus.signup", $.accumulus.widget, { options: { creditCardTypes: 'MC,VISA,DISC,AMEX', lockEmail: false, allowEmptyBankAccountInfo: false, showHeader: true, offerCode: null, currencyCode: null, customer: null, subscription: null, showPrice: false, showPromotion: false, showCreditCard: true, showBankAccount: false, showBillingAgreement: false, defaultPaymentMethod: Accumulus.constants.CREDIT_CARD, confirmUrl: null, cancelUrl: null, collectCustomer: false, showCustomerAddress: true, showCustomerPhone: false, requireCustomerPhone: false, collectPassword: false, showSSLBanner: true, showAccountBanner: true, showTCCheckbox: true, showBillingAddress: false, vestaTokenService: null, descriptionHTML: null, termsAndConditionsHTML: null, signup: null, calculateSignupFees: null, validatePromotion: null, taxInformationCountries: null, vatOnEServices: false }, // HTML templates for the subscription item sections and the custom fields. // To be provided in accumulus.ui.js and accumulus.mobile.js. _subscriptionItemSectionTemplate: null, _customInputFieldTemplate: null, _customSelectFieldTemplate: null, _signupView: null, _creditCard: null, _bankAccount: null, _selectedPaymentMethod: null, _create: function () { var widget = this; /* if (!widget.options.showBankAccount && !widget.options.showCreditCard && !widget.options.showBillingAgreement) { Accumulus.error('You must select at least one payment option to be shown.'); } else {*/ this._super(); // } }, _initPlugin: function () { var widget = this; Accumulus.global.currencyCode = widget.options.currencyCode; widget._signupView = Accumulus.plugins.signup.signupView; widget._signupView.getContent(function (content) { widget._initSignupView(); }); }, _initSignupView: function () { var widget = this; var $container = widget.element; $container.html(widget._signupView.content); if (widget.options.lockEmail) { $container.find('[name="email"]').prop('disabled', true) } // if tax identifier countries have not been specified and Vat on eServices is true, setup the default VoE configuration if (widget.options.vatOnEServices && !widget.options.taxInformationCountries) { widget.options.taxInformationCountries = Accumulus.global.vatOnEServicesCountries; } if (widget.options.allowEmptyBankAccountInfo) { var $input = $container.find('#acc-bank-account-allow-empty'); $input.parent().show(); $input.change(function (e) { if (this.checked) { $container.find('[name="type"]').prop('disabled', true); $container.find('[name="bankName"]').prop('disabled', true); $container.find('[name="routingNumber"]').prop('disabled', true); $container.find('[name="accountNumber"]').prop('disabled', true); $container.find('[name="bankAccountName"]').prop('disabled', true); } else { $container.find('[name="type"]').prop('disabled', false); $container.find('[name="bankName"]').prop('disabled', false); $container.find('[name="routingNumber"]').prop('disabled', false); $container.find('[name="accountNumber"]').prop('disabled', false); $container.find('[name="bankAccountName"]').prop('disabled', false); } }); } if (!widget.options.showHeader) { $container.find('.acc-widget-title').hide(); } if (!widget.options.showSSLBanner) { $(".acc-ssl-banner").hide(); } if (!widget.options.showAccountBanner) { $(".acc-account-banner").hide(); } if (widget.options.showTCCheckbox) { $container.find('.acc-tc-checkbox').show(); } else { $container.find('.acc-tc-checkbox').hide(); } //Localize Accumulus.localize($container, Accumulus.labels.signup); var tcHTML = widget.options.termsAndConditionsHTML; if (tcHTML) { $container.find('.acc-tc-msg').html(tcHTML); } //signUpFor var descriptionHTML = widget.options.descriptionHTML; if (descriptionHTML) { var descriptionWrapper = $container.find('.acc-signup-description'); descriptionWrapper.show(); descriptionWrapper.append(descriptionHTML); } widget._enhanceView(); if (widget.options.collectCustomer) { var customer = widget.options.customer; Accumulus.hookUpStateAndCountry( widget, $container.find('[name="state"]'), customer && customer.StateProvince, $container.find('[name="country"]'), customer && customer.CountryCode); if (!widget.options.showCustomerAddress) { $container.find('.acc-customer-address').hide(); } if (!widget.options.showCustomerPhone) { $container.find('.acc-customer-phone').hide(); } else { $container.find('#acc-customer-phone').prop('required',widget.options.requireCustomerPhone); } if (!widget.options.collectPassword) { $container.find('.acc-password-fieldset').hide(); } } else { $container.find('.acc-account-information').hide(); $container.find('.acc-tax-information').hide(); } $container.find('.acc-promotion-form').validate({ submitHandler: function (form) { widget._applyPromotion(); }, rules: { promotion: { required: true } }, messages: { promotion: Accumulus.labels.signup['promoRequired'] }, errorPlacement: widget._validationErrorPlacement }); var $popupTC = $('.acc-tc-reminder'); $popupTC.find('.acc-close').on("click", function () { widget._closeModal($popupTC); }); var $popupPM = $('.acc-must-select-payment-method'); $popupPM.find('.acc-close').on("click", function () { widget._closeModal($popupPM); }); widget._initCreditCardSection(); widget._initBankAccountSection(); widget._initBillingAgreementSection(); widget._fillUpForm(); widget._setOption("showPrice", widget.options.showPrice); widget._setOption("showPromotion", widget.options.showPromotion); widget._getSubscriptionInfoForSignup(); //setCollapsibleHandlers }, _getSubscriptionInfoForSignup: function () { var widget = this; widget._populateCustomer(); widget._populateSubscription(); var signup = new Accumulus.Signup(widget.options.tenantID, widget.options.token, widget.options.requestID, widget.options.timestamp, widget.options.customer, widget.options.subscription, null); var url = Accumulus.serviceUrl + "/GetSubscriptionInfoForSignup"; var data = signup.toJson(); Accumulus.API.jsonpCall(url, data, function (success, response) { if (success) { widget._mapSubscription(response.SubscriptionInfo); widget._onGetSubscriptionInfoForSignup(); widget._applyFormValidation(); } else { widget._serverError(response); } }); }, _onGetSubscriptionInfoForSignup: function () { var subscription = this.options.subscription; var $container = this.element.find('.acc-subscription-information'); for (var i = 0, subscriptionItem; subscriptionItem = subscription.items[i]; i++) { if (subscriptionItem.fields == null || subscriptionItem.fields.length == 0) continue; var numerOfFieldsShown = 0; for (var j = 0, field; field = subscriptionItem.fields[j]; j++) { if (field.hidden) continue; numerOfFieldsShown++; } if (numerOfFieldsShown == 0) continue; var html = Accumulus.format(this._subscriptionItemSectionTemplate, { productName: subscriptionItem.productName, }); $container.append(html); var $fieldContainer = $container.find('.acc-subscription-item-form').last(); for (var j = 0, field; field = subscriptionItem.fields[j]; j++) { if (field.hidden) continue; numerOfFieldsShown++; var $inputOrSelect; if (field.type != Accumulus.CustomFieldType.list) { html = Accumulus.format(this._customInputFieldTemplate, { code: field.code, name: field.name, pattern: field.validationRegEx ? 'pattern="' + field.validationRegEx + '"' : '', required: field.required ? 'required' : '' }); $fieldContainer.append(html); $inputOrSelect = $fieldContainer.find('input').last(); } else { var labels = Accumulus.labels.signup; var options = [new Option(labels['selectValue'] || 'Please select a value', '')]; for (var k = 0, item; item = field.items[k]; k++) { options.push(new Option(item.name, item.code)); } html = Accumulus.format(this._customSelectFieldTemplate, { code: field.code, name: field.name, pattern: field.validationRegEx ? 'pattern="' + field.validationRegEx + '"' : '', required: field.required ? 'required' : '' }); $fieldContainer.append(html); $inputOrSelect = $fieldContainer.find('select').last().append(options); } if (field.type == Accumulus.CustomFieldType.date && $inputOrSelect.datepicker) { $inputOrSelect.datepicker(); } $inputOrSelect.val(field.value || '').on("change", (function (theField) { return function (e) { theField.value = this.value; }; })(field)); } } }, _mapSubscription: function (subscriptionInfo) { var subscription = this.options.subscription; for (var i = 0, subscriptionItemInfo; subscriptionItemInfo = subscriptionInfo.ItemInfos[i]; i++) { var subscriptionItem = null; for (var ii in subscription.items) { if (subscription.items[ii].productCode == subscriptionItemInfo.ProductCode) { subscriptionItem = subscription.items[ii]; break; } } if (subscriptionItem == null) { subscriptionItem = subscription.createItem(); subscriptionItem.productCode = subscriptionItemInfo.ProductCode; } subscriptionItem.productName = subscriptionItemInfo.ProductName; for (var j = 0, fieldInfo; fieldInfo = subscriptionItemInfo.FieldInfos[j]; j++) { var field = null; for (var jj in subscriptionItem.fields) { if (subscriptionItem.fields[jj].code == fieldInfo.ProductFieldCode) { field = subscriptionItem.fields[jj]; break; } } if (field == null) { field = subscriptionItem.createField(); field.code = fieldInfo.ProductFieldCode; } field.hidden = fieldInfo.DoNotShow; field.name = fieldInfo.Name; field.required = fieldInfo.Required; field.type = fieldInfo.Type; field.validationRegEx = fieldInfo.ValidationRegEx; // Value may be provided the client, so make sure we don't // override it. if (field.value == null) field.value = fieldInfo.DefaultValue; if (field.type == Accumulus.CustomFieldType.number && !field.validationRegEx) { field.validationRegEx = '[-+]?[0-9]*\\.?[0-9]+'; } if (fieldInfo.Items) { field.items = []; for (var k = 0, serverItem; serverItem = fieldInfo.Items[k]; k++) { field.items.push({ code: serverItem.ProductFieldItemCode, name: serverItem.Name }); } } } } }, _enhanceView: function () { }, _applyFormValidation: function () { var widget = this; var $container = widget.element; var labels = Accumulus.labels.signup; var $signupForm = $container.find('.acc-signup-form'); $signupForm.on("submit", function (e) { e.preventDefault(); }); $signupForm.validate({ submitHandler: function (form) { var $tcCheckbox = $signupForm.find('.acc-tc-checkbox'); if (widget.options.showTCCheckbox && $tcCheckbox.prop("checked") != true) { widget._openModal($('.acc-tc-reminder')); } else if (widget._selectedPaymentMethod == null) { widget._openModal($('.acc-must-select-payment-method')); } else { widget._signup(); } }, rules: { name: { required: true, minlength: 3 }, password: { required: true, minlength: 7, oneDigit: true, oneSpecialChar: true }, email: { required: true, email: true }, phone: { required: widget.options.requireCustomerPhone, minlength: 4 }, address: { required: true }, postalCode: { required: true }, city: { required: true }, state: { required: true }, country: { required: true }, ccNumber: { required: true, creditcard: true }, month: { required: true }, year: { required: true }, cvv: { required: true, minlength: 3, maxlength: 4 }, ccName: { required: true, minlength: 3 }, type: { required: true }, bankName: { required: true }, routingNumber: { required: true }, accountNumber: { required: true }, bankAccountName: { required: true }, }, messages: { name: { required: labels['nameRequired'] || 'Name Required.', minlength: labels['nameMinLength3'] || 'Must have at least 3 characters.' }, password: { required: labels['passwordRequired'], oneDigit: labels['oneDigitRequired'], minlength: labels['minSevenCharsLength'], oneSpecialChar: labels['oneSpecialChar'] }, email: { required: labels['emailRequired'], email: labels['notEmailFormat'] }, phone: labels['phoneRequired'], address: labels['addressRequired'], postalCode: labels['postalCodeRequired'], city: labels['cityRequired'], state: labels['stateRequired'], country: labels['countryRequired'], ccNumber: { required: labels['cardNumberRequired'] || 'Card Number Required', creditcard: labels['incorrectCardNumber'] || 'Incorrect Card Number' }, month: labels['expirationDateRequired'] || 'Expiration Date Required', year: labels['expirationDateRequired'] || 'Expiration Date Required', cvv: { required: labels['cvvRequired'] || 'CVV Required', minlength: labels['cvvMinLength3'] || 'Must have at least 3 caracters.', maxlength: labels['cvvMaxLength4'] || 'Must have a maximum of 4 characters.' }, ccName: { required: labels['nameRequired'] || 'Name Required', minlength: labels['nameMinLength3'] || 'Must have at least 3 characters.' }, bankName: labels['bankNameRequired'] || 'Bank Name Required', type: labels['typeRequired'] || 'Type Required', routingNumber: labels['routingNumberRequired'] || 'Routing Number Required', accountNumber: labels['accountNumberRequired'] || 'Account Number Required', bankAccountName: labels['nameRequired'] || 'Name Required', }, errorPlacement: widget._validationErrorPlacement }); }, _signup: function () { var widget = this; widget._populateCustomer(); widget._populateSubscription(); var $container = this.element; var $signupBtn = $container.find('.acc-subscribe-submit'); $signupBtn.attr('disabled', 'disabled'); if (widget._selectedPaymentMethod == Accumulus.constants.CREDIT_CARD) { widget._populateCreditCard(); } else if (widget._selectedPaymentMethod == Accumulus.constants.BANK_ACCOUNT) { widget._populateBankAccount(); } else if (widget._selectedPaymentMethod == Accumulus.constants.BILLING_AGREEMENT) { widget._populateBillingAgreement(); } var customer = widget.options.customer; var subscription = widget.options.subscription; var creditCard = widget._creditCard; var signup = new Accumulus.Signup(widget.options.tenantID, widget.options.token, widget.options.requestID, widget.options.timestamp, customer, subscription); if (widget._selectedPaymentMethod == Accumulus.constants.CREDIT_CARD && widget.options.showCreditCard) { signup.creditCard = widget._creditCard; } else if (widget._selectedPaymentMethod == Accumulus.constants.BANK_ACCOUNT) { if ($container.find('#acc-bank-account-allow-empty').prop('checked')) { signup.bankAccount = null; } else { signup.bankAccount = widget._bankAccount; } } else if (widget._selectedPaymentMethod == Accumulus.constants.BILLING_AGREEMENT) { signup.billingAgreement = widget._billingAgreement; } widget._createSignup(signup, function (success, data) { if (widget._trigger('signup', null, data) !== false) { if (typeof grecaptcha !== 'undefined') { grecaptcha.reset(); } $signupBtn.removeAttr('disabled'); if (success) { if (widget._selectedPaymentMethod == Accumulus.constants.BILLING_AGREEMENT) { window.open(data.RedirectUrl, '_self'); } else { var completionText = widget.options.completionHTML || Accumulus.labels.signup['completionText'] || 'Done.'; $container.find('.acc-signup-view').html(completionText); } } else { widget._serverError(data); } } }); }, _populateCustomer: function () { var widget = this; var $container = widget.element; if (!(widget.options.customer instanceof Accumulus.Customer)) { widget.options.customer = new Accumulus.Customer(widget.options.customer); } var c = widget.options.customer; c.CurrencyCode = widget.options.currencyCode; if (this.options.collectCustomer) { c.Name = $container.find('[name="name"]').val(); if (this.options.collectPassword) { c.Password = $container.find('[name="password"]').val(); } c.EmailAddress = $container.find('[name="email"]').val(); if (this.options.showCustomerPhone) { c.HomeNumber = $container.find('[name="phone"]').val(); } if (this.options.showCustomerAddress) { c.Company = $container.find('[name="company"]').val(); c.AddressLine1 = $container.find('[name="address"]').val(); c.City = $container.find('[name="city"]').val(); c.PostalCode = $container.find('[name="postalCode"]').val(); c.StateProvinceCode = $container.find('[name="state"]').val(); c.CountryCode = $container.find('[name="country"]').val(); } else { if (!c.CountryCode) c.CountryCode = Accumulus.global.defaultCountryCode; } if (this.options.taxInformationCountries && c.CountryCode in this.options.taxInformationCountries) { c.TaxNumber = $container.find('[name="taxNumber"]').val(); if (c.TaxNumber) { c.TaxCode = widget.options.taxInformationCountries[c.CountryCode]; } } } }, _populateSubscription: function () { var widget = this; var $container = widget.element; var offerCode = widget.options.offerCode; var subscription = widget.options.subscription; if (!(subscription instanceof Accumulus.Subscription)) { subscription = widget.options.subscription = new Accumulus.Subscription(offerCode, subscription); } else { subscription.offerCode = offerCode; } subscription.promotionCode = $container.find('[name="promotion"]').val(); }, _populateCreditCard: function () { var widget = this; var $container = this.element; if (!(widget._creditCard instanceof Accumulus.CreditCard)) { widget._creditCard = new Accumulus.CreditCard(widget._creditCard); } var creditCard = widget._creditCard; creditCard.name = $container.find('[name="ccName"]').val(); creditCard.cardNumber = $container.find('[name="ccNumber"]').val(); creditCard.cvv = $container.find('[name="cvv"]').val(); creditCard.expirationDate = $container.find('[name="month"]').val() + $container.find('[name="year"]').val(); var customer = widget.options.customer; creditCard.company = customer.Company; creditCard.addr1 = customer.AddressLine1; creditCard.addr2 = customer.AddressLine2; creditCard.city = customer.City; creditCard.stateProvinceCode = customer.StateProvinceCode; creditCard.postalCode = customer.PostalCode; creditCard.countryCode = customer.CountryCode; }, _populateBankAccount: function () { var widget = this; var $container = widget.element; if (!(widget._bankAccount instanceof Accumulus.BankAccount)) { widget._bankAccount = new Accumulus.BankAccount(widget._bankAccount); } var bankAccount = widget._bankAccount; bankAccount.type = $container.find('[name="type"]').val(); bankAccount.bank = $container.find('[name="bankName"]').val(); bankAccount.route = $container.find('[name="routingNumber"]').val(); bankAccount.number = $container.find('[name="accountNumber"]').val(); bankAccount.name = $container.find('[name="bankAccountName"]').val(); var customer = widget.options.customer; bankAccount.company = customer.Company; bankAccount.addr1 = customer.AddressLine1; bankAccount.addr2 = customer.AddressLine2; bankAccount.city = customer.City; bankAccount.stateProvinceCode = customer.StateProvinceCode; bankAccount.postalCode = customer.PostalCode; bankAccount.countryCode = customer.CountryCode; }, _populateBillingAgreement: function () { var widget = this; if (!(widget._billingAgreement instanceof Accumulus.BillingAgreement)) { widget._billingAgreement = new Accumulus.BillingAgreement(widget._billingAgreement); } //TODO:remove email and name when they get removed from the backend. var billingAgreement = widget._billingAgreement; billingAgreement.name = 'Test Customer'; billingAgreement.email = 'buyer_1329365063_per@accumulus.com'; billingAgreement.confirmUrl = widget.options.confirmUrl; billingAgreement.cancelUrl = widget.options.cancelUrl; }, _createSignup: function (signup, callback) { var url = Accumulus.serviceUrl + "/CreateSignup"; var json = signup.toJson(); Accumulus.API.jsonpCall(url, json, callback); }, _applyPromotion: function () { var widget = this; var $container = widget.element; widget._populateSubscription(); signup = new Accumulus.Signup(widget.options.tenantID, widget.options.token, widget.options.requestID, widget.options.timestamp, null, widget.options.subscription, null); widget._validatePromotion(signup, function (success, data) { //var errorField = $container.find('.acc-promotion-form .acc-server-error'); var $msgField = $container.find('.acc-promotion-form .acc-promotion-msg'); $msgField.empty(); widget._trigger('validatePromotion', null, data); if (success) { $container.find('.acc-server-error').hide(); $msgField.show(); $msgField.append(data.Message); widget._calculateSignupFees(); } else { $msgField.hide(); widget._serverError(data); } }); }, _validatePromotion: function (signup, callback) { var widget = this; var url = Accumulus.serviceUrl + "/ValidatePromotion"; var json = signup.toJson(); Accumulus.API.jsonpCall(url, json, callback); }, _calculateSignupFees: function (w) { var widget = this; var $container = widget.element; //var loadingImg = $('').attr('src', Accumulus.resourcesUrl + 'images/ajax-loader.gif'); var loadingImg = ''; var $feesField = $container.find('.acc-signup-fees-value'); var $discountsField = $container.find('.acc-signup-discounts-value'); var $taxesField = $container.find('.acc-signup-taxes-value'); var $totalField = $container.find('.acc-signup-total-value'); $feesField.append(loadingImg); $discountsField.append(loadingImg); $taxesField.append(loadingImg); $totalField.append(loadingImg); widget._populateCustomer(); widget._populateSubscription(); var signup = new Accumulus.Signup(this.options.tenantID, this.options.token, this.options.requestID, this.options.timestamp, this.options.customer, this.options.subscription, null); var url = Accumulus.serviceUrl + '/CalculateSignupFees'; var data = signup.toJson(); Accumulus.API.jsonpCall(url, data, function (success, response) { if (success) { widget._setValueWithCurrency($feesField, response.Fees); if (response.Discounts == 0) { $container.find('.acc-signup-discounts').hide(); } else { $container.find(".acc-signup-discounts").show(); widget._setValueWithCurrency($discountsField, response.Discounts); } if (response.Taxes == 0) { $container.find('.acc-signup-taxes').hide(); } else { $container.find(".acc-signup-taxes").show(); widget._setValueWithCurrency($taxesField, response.Taxes); } widget._setValueWithCurrency($totalField, response.Total); widget._trigger('calculateSignupFees', null, response); } else { widget._serverError(response); } }); }, _setValueWithCurrency: function ($field, value) { $field.html(value.toFixed(2)); Accumulus.formatCurrency($field); }, _initCreditCardSection: function () { var widget = this; var $container = this.element; var cardTypes = widget.options.creditCardTypes.split(','); var cardTypeImgs = Accumulus.images; var $imgContainer = $container.find('.acc-credit-card-imgs'); for (var i = 0, cardType; cardType = cardTypes[i]; i++) { var src = cardTypeImgs[cardType]; if (src) { $imgContainer.append(''); } } widget._selectCurrentYear(); $container.find('.acc-cvv-image') .attr('src', Accumulus.resourcesUrl + 'images/csc.png'); }, _selectCurrentYear: function () { var $container = this.element; var $yearSelect = $container.find('[name="year"]'); var currentYear = (new Date()).getFullYear(); for (var year = 2005; year <= 2099; year++) { var twoDigitsYear = year.toString().substring(2); $yearSelect.append(new Option(year, twoDigitsYear)); } $yearSelect.val(currentYear.toString().substring(2)); }, _initBankAccountSection: function () { var widget = this; var $container = this.element; var $baImg = $container.find('.acc-bank-account-img'); $baImg.attr('src', Accumulus.images.BA); }, _initBillingAgreementSection: function () { var widget = this; var $container = this.element; var $ppImg = $container.find('.acc-paypal-img'); $ppImg.attr('src', Accumulus.images.PP); }, _fillUpForm: function () { var widget = this; var $container = widget.element; var o = widget.options; var c = o.customer; if (o.customer != null) { if (o.collectCustomer) { //Customer Area $container.find('[name="name"]').val(c.Name); $container.find('[name="email"]').val(c.EmailAddress); if (o.showCustomerPhone) { $container.find('[name="phone"]').val(c.HomeNumber); } if (o.showCustomerAddress) { $container.find('[name="company"]').val(c.Company); $container.find('[name="address"]').val(c.AddressLine1); $container.find('[name="postalCode"]').val(c.PostalCode); $container.find('[name="city"]').val(c.City); } } //CC Area $container.find('[name="ccName"]').val(c.Name); //BankAccount Area $container.find('[name="bankAccountName"]').val(c.Name); } }, _setOption: function (key, value) { var widget = this; widget._super(key, value); var $container = widget.element; switch (key) { case "showPromotion": if (value) { $container.find('.acc-signup-description').addClass('ui-block-a'); $container.find('.acc-promotion-form').first().show(); $container.find('.acc-signup-pricing').first().show(); } else { $container.find('.acc-promotion-form').first().hide(); if (!widget.options.showPrice && !widget.options.showPromotion) { $container.find('.acc-signup-pricing').first().hide(); $container.find('.acc-signup-description').removeClass('ui-block-a'); } } break; case "showPrice": if (value) { $container.find('.acc-signup-description').addClass('ui-block-a'); widget._showPrice(); $container.find('.acc-signup-pricing').first().show(); } else { widget._hidePrice(); if (!widget.options.showPrice && !widget.options.showPromotion) { $container.find('.acc-signup-pricing').first().hide(); $container.find('.acc-signup-description').removeClass('ui-block-a'); } } break; } this._super("_setOption", key, value); }, _showPrice: function () { var widget = this; var $container = widget.element; $container.find('.acc-signup-price-details').show(); widget._calculateSignupFees(); if (widget.options.collectCustomer) { var self = this; $container.find('[name="state"]').on("focusout", function () { self._calculateSignupFees() }); $container.find('[name="taxNumber"]').on("focusout", function () { self._calculateSignupFees() }); } }, _hidePrice: function () { var widget = this; var $container = widget.element; $container.find('.acc-signup-price-details').hide(); } }); })(jQuery); //Accumulus Classes function AccView(path) { var $ = jQuery; var o = this; o.path = path; o.content = null; o.getContent = function (callback) { if (o.content) { callback(o.content); } else { $(o).on('contentLoaded', function (event, data) { callback(data); }); if (!isLoading) { loadContent(); } } }; var isLoading = false; var loadContent = function () { isLoading = true; Accumulus.info("Loading view content from server..." + path); $.get(path, function (data) { isLoading = false; o.content = data; $(o).trigger('contentLoaded', data); }); }; } /////////////////////////////////////////////////////////////////////////////////// /////////// Markup Framework ////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////// function AccAttribute(container, attrName) { var $ = jQuery; this.container = container; this.attrName = attrName; this.getRawValue = function () { var rawVal = $(this.container).attr(this.attrName); if (!rawVal) { Accumulus.info2('Value not assigned to ' + this.attrName + ' in ' + $(this.container).attr('name')); } return rawVal; } this.getValue = this.getRawValue; } function AccBoolean(container, attrName) { AccAttribute.call(this, container, attrName); this.getValue = function () { var s = this.getRawValue(); if (s === 'true' || s === true) { return true; } else if (s === 'false' || s === false) { return false; } else { return null; } }; } AccBoolean.prototype = Object.create(AccAttribute.prototype); function AccJson(container, attrName) { AccAttribute.call(this, container, attrName); this.getValue = function () { var val = this.getRawValue(); if (val && val.length > 1 && val.charAt(0) == '{' && val.charAt(val.length - 1) == '}') { val = '(' + val + ')'; } try { return eval(val); } catch (e) { Accumulus.error(e.message); } } } AccJson.prototype = Object.create(AccAttribute.prototype); function AccHandler(container, attrName) { AccAttribute.call(this, container, attrName); this.getValue = function () { var val = this.getRawValue(); if (val) { var method = window[val]; if (method && jQuery.isFunction(method)) { return method; } else { Accumulus.error('Invalid method name ' + val); return null; } } } } AccHandler.prototype = Object.create(AccAttribute.prototype); function AccMarkupOption(markupPropertyName, widgetPropertyName, type) { this.markupPropertyName = markupPropertyName; this.widgetPropertyName = widgetPropertyName; this.type = type; }