芝麻web文件管理V1.00
编辑当前文件:/home/pulsehostuk9/www/portal.pulsehost.co.uk/templates/orderforms/standard_cart/js/scripts.js
/*! * iCheck v1.0.3, http://git.io/arlzeA * =================================== * Powerful jQuery and Zepto plugin for checkboxes and radio buttons customization * * (c) 2013 Damir Sultanov, http://fronteed.com * MIT Licensed */ (function($) { // Cached vars var _iCheck = 'iCheck', _iCheckHelper = _iCheck + '-helper', _checkbox = 'checkbox', _radio = 'radio', _checked = 'checked', _unchecked = 'un' + _checked, _disabled = 'disabled', _determinate = 'determinate', _indeterminate = 'in' + _determinate, _update = 'update', _type = 'type', _click = 'click', _touch = 'touchbegin.i touchend.i', _add = 'addClass', _remove = 'removeClass', _callback = 'trigger', _label = 'label', _cursor = 'cursor', _mobile = /ip(hone|od|ad)|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1); // Plugin init $.fn[_iCheck] = function(options, fire) { // Walker var handle = 'input[type="' + _checkbox + '"], input[type="' + _radio + '"]', stack = $(), walker = function(object) { object.each(function() { var self = $(this); if (self.is(handle)) { stack = stack.add(self); } else { stack = stack.add(self.find(handle)); } }); }; // Check if we should operate with some method if (/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(options)) { // Normalize method's name options = options.toLowerCase(); // Find checkboxes and radio buttons walker(this); return stack.each(function() { var self = $(this); if (options == 'destroy') { tidy(self, 'ifDestroyed'); } else { operate(self, true, options); } // Fire method's callback if ($.isFunction(fire)) { fire(); } }); // Customization } else if (typeof options == 'object' || !options) { // Check if any options were passed var settings = $.extend({ checkedClass: _checked, disabledClass: _disabled, indeterminateClass: _indeterminate, labelHover: true }, options), selector = settings.handle, hoverClass = settings.hoverClass || 'hover', focusClass = settings.focusClass || 'focus', activeClass = settings.activeClass || 'active', labelHover = !!settings.labelHover, labelHoverClass = settings.labelHoverClass || 'hover', // Setup clickable area area = ('' + settings.increaseArea).replace('%', '') | 0; // Selector limit if (selector == _checkbox || selector == _radio) { handle = 'input[type="' + selector + '"]'; } // Clickable area limit if (area < -50) { area = -50; } // Walk around the selector walker(this); return stack.each(function() { var self = $(this); // If already customized tidy(self); var node = this, id = node.id, // Layer styles offset = -area + '%', size = 100 + (area * 2) + '%', layer = { position: 'absolute', top: offset, left: offset, display: 'block', width: size, height: size, margin: 0, padding: 0, background: '#fff', border: 0, opacity: 0 }, // Choose how to hide input hide = _mobile ? { position: 'absolute', visibility: 'hidden' } : area ? layer : { position: 'absolute', opacity: 0 }, // Get proper class className = node[_type] == _checkbox ? settings.checkboxClass || 'i' + _checkbox : settings.radioClass || 'i' + _radio, // Find assigned labels label = $(_label + '[for="' + id + '"]').add(self.closest(_label)), // Check ARIA option aria = !!settings.aria, // Set ARIA placeholder ariaID = _iCheck + '-' + Math.random().toString(36).substr(2,6), // Parent & helper parent = '
')[_callback]('ifCreated').parent().append(settings.insert); // Layer addition helper = $('
').css(layer).appendTo(parent); // Finalize customization self.data(_iCheck, {o: settings, s: self.attr('style')}).css(hide); !!settings.inheritClass && parent[_add](node.className || ''); !!settings.inheritID && id && parent.attr('id', _iCheck + '-' + id); parent.css('position') == 'static' && parent.css('position', 'relative'); operate(self, true, _update); // Label events if (label.length) { label.on(_click + '.i mouseover.i mouseout.i ' + _touch, function(event) { var type = event[_type], item = $(this); // Do nothing if input is disabled if (!node[_disabled]) { // Click if (type == _click) { if ($(event.target).is('a')) { return; } operate(self, false, true); // Hover state } else if (labelHover) { // mouseout|touchend if (/ut|nd/.test(type)) { parent[_remove](hoverClass); item[_remove](labelHoverClass); } else { parent[_add](hoverClass); item[_add](labelHoverClass); } } if (_mobile) { event.stopPropagation(); } else { return false; } } }); } // Input events self.on(_click + '.i focus.i blur.i keyup.i keydown.i keypress.i', function(event) { var type = event[_type], key = event.keyCode; // Click if (type == _click) { return false; // Keydown } else if (type == 'keydown' && key == 32) { if (!(node[_type] == _radio && node[_checked])) { if (node[_checked]) { off(self, _checked); } else { on(self, _checked); } } return false; // Keyup } else if (type == 'keyup' && node[_type] == _radio) { !node[_checked] && on(self, _checked); // Focus/blur } else if (/us|ur/.test(type)) { parent[type == 'blur' ? _remove : _add](focusClass); } }); // Helper events helper.on(_click + ' mousedown mouseup mouseover mouseout ' + _touch, function(event) { var type = event[_type], // mousedown|mouseup toggle = /wn|up/.test(type) ? activeClass : hoverClass; // Do nothing if input is disabled if (!node[_disabled]) { // Click if (type == _click) { operate(self, false, true); // Active and hover states } else { // State is on if (/wn|er|in/.test(type)) { // mousedown|mouseover|touchbegin parent[_add](toggle); // State is off } else { parent[_remove](toggle + ' ' + activeClass); } // Label hover if (label.length && labelHover && toggle == hoverClass) { // mouseout|touchend label[/ut|nd/.test(type) ? _remove : _add](labelHoverClass); } } if (_mobile) { event.stopPropagation(); } else { return false; } } }); }); } else { return this; } }; // Do something with inputs function operate(input, direct, method) { var node = input[0], state = /er/.test(method) ? _indeterminate : /bl/.test(method) ? _disabled : _checked, active = method == _update ? { checked: node[_checked], disabled: node[_disabled], indeterminate: input.attr(_indeterminate) == 'true' || input.attr(_determinate) == 'false' } : node[state]; // Check, disable or indeterminate if (/^(ch|di|in)/.test(method) && !active) { on(input, state); // Uncheck, enable or determinate } else if (/^(un|en|de)/.test(method) && active) { off(input, state); // Update } else if (method == _update) { // Handle states for (var each in active) { if (active[each]) { on(input, each, true); } else { off(input, each, true); } } } else if (!direct || method == 'toggle') { // Helper or label was clicked if (!direct) { input[_callback]('ifClicked'); } // Toggle checked state if (active) { if (node[_type] !== _radio) { off(input, state); } } else { on(input, state); } } } // Add checked, disabled or indeterminate state function on(input, state, keep) { var node = input[0], parent = input.parent(), checked = state == _checked, indeterminate = state == _indeterminate, disabled = state == _disabled, callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled', regular = option(input, callback + capitalize(node[_type])), specific = option(input, state + capitalize(node[_type])); // Prevent unnecessary actions if (node[state] !== true) { // Toggle assigned radio buttons if (!keep && state == _checked && node[_type] == _radio && node.name) { var form = input.closest('form'), inputs = 'input[name="' + node.name + '"]'; inputs = form.length ? form.find(inputs) : $(inputs); inputs.each(function() { if (this !== node && $(this).data(_iCheck)) { off($(this), state); } }); } // Indeterminate state if (indeterminate) { // Add indeterminate state node[state] = true; // Remove checked state if (node[_checked]) { off(input, _checked, 'force'); } // Checked or disabled state } else { // Add checked or disabled state if (!keep) { node[state] = true; } // Remove indeterminate state if (checked && node[_indeterminate]) { off(input, _indeterminate, false); } } // Trigger callbacks callbacks(input, checked, state, keep); } // Add proper cursor if (node[_disabled] && !!option(input, _cursor, true)) { parent.find('.' + _iCheckHelper).css(_cursor, 'default'); } // Add state class parent[_add](specific || option(input, state) || ''); // Set ARIA attribute if (!!parent.attr('role') && !indeterminate) { parent.attr('aria-' + (disabled ? _disabled : _checked), 'true'); } // Remove regular state class parent[_remove](regular || option(input, callback) || ''); } // Remove checked, disabled or indeterminate state function off(input, state, keep) { var node = input[0], parent = input.parent(), checked = state == _checked, indeterminate = state == _indeterminate, disabled = state == _disabled, callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled', regular = option(input, callback + capitalize(node[_type])), specific = option(input, state + capitalize(node[_type])); // Prevent unnecessary actions if (node[state] !== false) { // Toggle state if (indeterminate || !keep || keep == 'force') { node[state] = false; } // Trigger callbacks callbacks(input, checked, callback, keep); } // Add proper cursor if (!node[_disabled] && !!option(input, _cursor, true)) { parent.find('.' + _iCheckHelper).css(_cursor, 'pointer'); } // Remove state class parent[_remove](specific || option(input, state) || ''); // Set ARIA attribute if (!!parent.attr('role') && !indeterminate) { parent.attr('aria-' + (disabled ? _disabled : _checked), 'false'); } // Add regular state class parent[_add](regular || option(input, callback) || ''); } // Remove all traces function tidy(input, callback) { if (input.data(_iCheck)) { // Remove everything except input input.parent().html(input.attr('style', input.data(_iCheck).s || '')); // Callback if (callback) { input[_callback](callback); } // Unbind events input.off('.i').unwrap(); $(_label + '[for="' + input[0].id + '"]').add(input.closest(_label)).off('.i'); } } // Get some option function option(input, state, regular) { if (input.data(_iCheck)) { return input.data(_iCheck).o[state + (regular ? '' : 'Class')]; } } // Capitalize some string function capitalize(string) { return string.charAt(0).toUpperCase() + string.slice(1); } // Executable handlers function callbacks(input, checked, callback, keep) { if (!keep) { if (checked) { input[_callback]('ifToggled'); } input[_callback]('change')[_callback]('ifChanged')[_callback]('if' + capitalize(callback)); } } })(window.jQuery || window.Zepto); /** * WHMCS core JS library reference * * @copyright Copyright (c) WHMCS Limited 2005-2017 * @license http://www.whmcs.com/license/ WHMCS Eula */ (function (window, factory) { if (typeof window.WHMCS !== 'object') { window.WHMCS = factory; } }( window, { hasModule: function (name) { return (typeof WHMCS[name] !== 'undefined' && Object.getOwnPropertyNames(WHMCS[name]).length > 0); }, loadModule: function (name, module) { if (this.hasModule(name)) { return; } WHMCS[name] = {}; if (typeof module === 'function') { (module).apply(WHMCS[name]); } else { for (var key in module) { if (module.hasOwnProperty(key)) { WHMCS[name][key] = {}; (module[key]).apply(WHMCS[name][key]); } } } } } )); jQuery(document).ready(function() { jQuery(document).on('click', '.disable-on-click', function () { jQuery(this).addClass('disabled'); if (jQuery(this).hasClass('spinner-on-click')) { var icon = $(this).find('i.fas,i.far,i.fal,i.fab'); jQuery(icon) .removeAttr('class') .addClass('fas fa-spinner fa-spin'); } }) .on('click', '#openTicketSubmit.disabled', function () { return false; }); }); function scrollToGatewayInputError() { var displayError = jQuery('.gateway-errors,.assisted-cc-input-feedback').first(), frm = displayError.closest('form'); if (!frm) { frm = jQuery('form').first(); } frm.find('button[type="submit"],input[type="submit"]') .prop('disabled', false) .removeClass('disabled') .find('i.fas,i.far,i.fal,i.fab') .removeAttr('class') .addClass('fas fa-arrow-circle-right') .find('span').toggle(); if (displayError.length) { if (elementOutOfViewPort(displayError[0])) { jQuery('html, body').animate( { scrollTop: displayError.offset().top - 50 }, 500 ); } } } function elementOutOfViewPort(element) { // Get element's bounding var bounding = element.getBoundingClientRect(); // Check if it's out of the viewport on each side var out = {}; out.top = bounding.top < 0; out.left = bounding.left < 0; out.bottom = bounding.bottom > (window.innerHeight || document.documentElement.clientHeight); out.right = bounding.right > (window.innerWidth || document.documentElement.clientWidth); out.any = out.top || out.left || out.bottom || out.right; return out.any; }; /** * WHMCS authentication module * * @copyright Copyright (c) WHMCS Limited 2005-2017 * @license http://www.whmcs.com/license/ WHMCS Eula */ (function(module) { if (!WHMCS.hasModule('authn')) { WHMCS.loadModule('authn', module); } })({ provider: function () { var callbackFired = false; /** * @return {jQuery} */ this.feedbackContainer = function () { return jQuery(".providerLinkingFeedback"); }; /** * @returns {jQuery} */ this.btnContainer = function () { return jQuery(".providerPreLinking"); }; this.feedbackMessage = function (context) { if (typeof context === 'undefined') { context = 'complete_sign_in'; } var msgContainer = jQuery('p.providerLinkingMsg-preLink-' + context); if (msgContainer.length) { return msgContainer.first().html(); } return ''; }; this.showProgressMessage = function(callback) { this.feedbackContainer().fadeIn('fast', function () { if (typeof callback === 'function' && !callbackFired) { callbackFired = true; callback(); } }); }; this.preLinkInit = function (callback) { var icon = '
'; this.feedbackContainer() .removeClass('alert-danger alert-success') .addClass('alert alert-info') .html(icon + this.feedbackMessage()) .hide(); var btnContainer = this.btnContainer(); if (btnContainer.length) { if (btnContainer.data('hideOnPrelink')) { var self = this; btnContainer.fadeOut('false', function () { self.showProgressMessage(callback) }); } else if (btnContainer.data('disableOnPrelink')) { btnContainer.find('.btn').addClass('disabled'); this.showProgressMessage(callback); } else { this.showProgressMessage(callback); } } else { this.showProgressMessage(callback); } }; this.displayError = function (provider, errorCondition, providerErrorText){ jQuery('#providerLinkingMessages .provider-name').html(provider); var feedbackMsg = this.feedbackMessage('connect_error'); if (errorCondition) { var errorMsg = this.feedbackMessage(errorCondition); if (errorMsg) { feedbackMsg = errorMsg } } if (providerErrorText && $('.btn-logged-in-admin').length > 0) { feedbackMsg += ' Error: ' + providerErrorText; } this.feedbackContainer().removeClass('alert-info alert-success') .addClass('alert alert-danger') .html(feedbackMsg).slideDown(); }; this.displaySuccess = function (data, context, provider) { var icon = provider.icon; var htmlTarget = context.htmlTarget; var targetLogin = context.targetLogin; var targetRegister = context.targetRegister; var displayName = provider.name; var feedbackMsg = ''; switch (data.result) { case "logged_in": case "2fa_needed": feedbackMsg = this.feedbackMessage('2fa_needed'); this.feedbackContainer().removeClass('alert-danger alert-warning alert-success') .addClass('alert alert-info') .html(feedbackMsg); window.location = data.redirect_url ? decodeURIComponent(data.redirect_url) : decodeURIComponent(context.redirectUrl); break; case "linking_complete": var accountInfo = ''; if (data.remote_account.email) { accountInfo = data.remote_account.email; } else { accountInfo = data.remote_account.firstname + " " + data.remote_account.lastname; } accountInfo = accountInfo.trim(); feedbackMsg = this.feedbackMessage('linking_complete').trim().replace(':displayName', displayName); if (accountInfo) { feedbackMsg = feedbackMsg.replace(/\.$/, ' (' + accountInfo + ').'); } this.feedbackContainer().removeClass('alert-danger alert-warning alert-info') .addClass('alert alert-success') .html(icon + feedbackMsg); break; case "login_to_link": if (htmlTarget === targetLogin) { feedbackMsg = this.feedbackMessage('login_to_link-signin-required'); this.feedbackContainer().removeClass('alert-danger alert-success alert-info') .addClass('alert alert-warning') .html(icon + feedbackMsg); } else { var emailField = jQuery("input[name=email]"); var firstNameField = jQuery("input[name=firstname]"); var lastNameField = jQuery("input[name=lastname]"); if (emailField.val() === "") { emailField.val(data.remote_account.email); } if (firstNameField.val() === "") { firstNameField.val(data.remote_account.firstname); } if (lastNameField.val() === "") { lastNameField.val(data.remote_account.lastname); } if (htmlTarget === targetRegister) { if (typeof WHMCS.client.registration === 'object') { WHMCS.client.registration.prefillPassword(); } feedbackMsg = this.feedbackMessage('login_to_link-registration-required'); this.feedbackContainer().fadeOut('slow', function () { $(this).removeClass('alert-danger alert-success alert-info') .addClass('alert alert-warning') .html(icon + feedbackMsg).fadeIn('fast'); }); } else { // this is checkout if (typeof WHMCS.client.registration === 'object') { WHMCS.client.registration.prefillPassword(); } var self = this; this.feedbackContainer().each(function (i, el) { var container = $(el); var linkContext = container.siblings('div .providerPreLinking').data('linkContext'); container.fadeOut('slow', function () { if (linkContext === 'checkout-new') { feedbackMsg = self.feedbackMessage('checkout-new'); } else { feedbackMsg = self.feedbackMessage('login_to_link-signin-required'); } container.removeClass('alert-danger alert-success alert-info') .addClass('alert alert-warning') .html(icon + feedbackMsg).fadeIn('fast'); }); }); } } break; case "other_user_exists": feedbackMsg = this.feedbackMessage('other_user_exists'); this.feedbackContainer().removeClass('alert-info alert-success') .addClass('alert alert-danger') .html(icon + feedbackMsg).slideDown(); break; case "already_linked": feedbackMsg = this.feedbackMessage('already_linked'); this.feedbackContainer().removeClass('alert-info alert-success') .addClass('alert alert-danger') .html(icon + feedbackMsg).slideDown(); break; default: feedbackMsg = this.feedbackMessage('default'); this.feedbackContainer().removeClass('alert-info alert-success') .addClass('alert alert-danger') .html(icon + feedbackMsg).slideDown(); break; } }; this.signIn = function (config, context, provider, providerDone, providerError) { jQuery.ajax(config).done(function(data) { providerDone(); WHMCS.authn.provider.displaySuccess(data, context, provider); var table = jQuery('#tableLinkedAccounts'); if (table.length) { WHMCS.ui.dataTable.getTableById('tableLinkedAccounts').ajax.reload(); } }).error(function() { providerError(); WHMCS.authn.provider.displayError(); }); }; return this; }}); /** * WHMCS client module * * @copyright Copyright (c) WHMCS Limited 2005-2017 * @license http://www.whmcs.com/license/ WHMCS Eula */ (function(module) { if (!WHMCS.hasModule('client')) { WHMCS.loadModule('client', module); } })({ registration: function () { this.prefillPassword = function (params) { params = params || {}; if (typeof params.hideContainer === 'undefined') { var id = (jQuery('#inputSecurityQId').attr('id')) ? '#containerPassword' : '#containerNewUserSecurity'; params.hideContainer = jQuery(id); params.hideInputs = true; } else if (typeof params.hideContainer === 'string' && params.hideContainer.length) { params.hideContainer = jQuery(params.hideContainer); } if (typeof params.form === 'undefined') { params.form = { password: [ {id: 'inputNewPassword1'}, {id: 'inputNewPassword2'} ] }; } var prefillFunc = function () { var $randomPasswd = WHMCS.utils.simpleRNG(); for (var i = 0, len = params.form.password.length; i < len; i++) { jQuery('#' + params.form.password[i].id) .val($randomPasswd).trigger('keyup'); } }; if (params.hideInputs) { params.hideContainer.slideUp('fast', prefillFunc); } else { prefillFunc(); } }; return this; }}); /** * WHMCS HTTP module * * @copyright Copyright (c) WHMCS Limited 2005-2018 * @license http://www.whmcs.com/license/ WHMCS Eula */ (function(module) { if (!WHMCS.hasModule('http')) { WHMCS.loadModule('http', module); } })({ jqClient: function () { _getSettings = function (url, data, success, dataType) { if (typeof url === 'object') { /* Settings may be the only argument */ return url; } if (typeof data === 'function') { /* If 'data' is omitted, 'success' will come in its place */ success = data; data = null; } return { url: url, data: data, success: success, dataType: dataType }; }; /** * @param url * @param data * @param success * @param dataType * @returns {*} */ this.get = function (url, data, success, dataType) { return WHMCS.http.client.request( jQuery.extend( _getSettings(url, data, success, dataType), { type: 'GET' } ) ); }; /** * @param url * @param data * @param success * @param dataType * @returns {*} */ this.post = function (url, data, success, dataType) { return WHMCS.http.client.request( jQuery.extend( _getSettings(url, data, success, dataType), { type: 'POST' } ) ); }; /** * @param options * @returns {*} */ this.jsonGet = function (options) { options = options || {}; this.get(options.url, options.data, function(response) { if (response.warning) { console.log('[WHMCS] Warning: ' + response.warning); if (typeof options.warning === 'function') { options.warning(response.warning); } } else if (response.error) { console.log('[WHMCS] Error: ' + response.error); if (typeof options.error === 'function') { options.error(response.error); } } else { if (typeof options.success === 'function') { options.success(response); } } }, 'json').error(function(xhr, errorMsg){ console.log('[WHMCS] Error: ' + errorMsg); if (typeof options.fail === 'function') { options.fail(errorMsg); } }).always(function() { if (typeof options.always === 'function') { options.always(); } }); }; /** * @param options * @returns {*} */ this.jsonPost = function (options) { options = options || {}; this.post(options.url, options.data, function(response) { if (response.warning) { console.log('[WHMCS] Warning: ' + response.warning); if (typeof options.warning === 'function') { options.warning(response.warning); } } else if (response.error) { console.log('[WHMCS] Error: ' + response.error); if (typeof options.error === 'function') { options.error(response.error); } } else { if (typeof options.success === 'function') { options.success(response); } } }, 'json').fail(function(xhr, errorMsg){ console.log('[WHMCS] Fail: ' + errorMsg); if (typeof options.fail === 'function') { options.fail(errorMsg, xhr); } }).always(function() { if (typeof options.always === 'function') { options.always(); } }); }; return this; }, client: function () { var methods = ['get', 'post', 'put', 'delete']; var client = this; _beforeRequest = function (settings) { /* Enforcing dataType was found to break many invocations expecting HTML back. If/when those are refactored, this may be uncommented to enforce a safer data transit. */ /*if (typeof settings.dataType === 'undefined') { settings.dataType = 'json'; }*/ if (typeof settings.type === 'undefined') { // default request type is GET settings.type = 'GET'; } /* Add other preprocessing here if required */ return settings; }; this.request = function (settings) { settings = _beforeRequest(settings || {}); return jQuery.ajax(settings); }; /* Create shortcut methods for methods[] array above */ jQuery.each(methods, function(index, method) { client[method] = (function(method, client) { return function (settings) { settings = settings || {}; settings.type = method.toUpperCase(); return client.request(settings); } })(method, client); }); return this; } }); /** * WHMCS UI module * * @copyright Copyright (c) WHMCS Limited 2005-2017 * @license http://www.whmcs.com/license/ WHMCS Eula */ (function(module) { if (!WHMCS.hasModule('ui')) { WHMCS.loadModule('ui', module); } })({ /** * Confirmation PopUp */ confirmation: function () { /** * @type {Array} Registered confirmation root selectors */ var toggles = []; /** * Register/Re-Register all confirmation elements with jQuery * By default all elements of data toggle "confirmation" will be registered * * @param {(string|undefined)} rootSelector * @return {Array} array of registered toggles */ this.register = function (rootSelector) { if (typeof rootSelector === 'undefined') { rootSelector = '[data-toggle=confirmation]'; } if (toggles.indexOf(rootSelector) < 0) { toggles.push(rootSelector); } jQuery(rootSelector).confirmation({ rootSelector: rootSelector }); return toggles; }; return this; }, /** * Data Driven Table */ dataTable: function () { /** * @type {{}} */ this.tables = {}; /** * Register all tables on page with the class "data-driven" */ this.register = function () { var self = this; jQuery('table.data-driven').each(function (i, table) { self.getTableById(table.id, undefined); }); }; /** * Get a table by id; create table object on fly as necessary * * @param {string} id * @param {({}|undefined)} options * @returns {DataTable} */ this.getTableById = function (id, options) { var self = this; var el = jQuery('#' + id); if (typeof self.tables[id] === 'undefined') { if (typeof options === 'undefined') { options = { dom: '<"listtable"ift>pl', paging: false, lengthChange: false, searching: false, ordering: true, info: false, autoWidth: true, columns: [], lengthMenu: [10, 25, 50, 100, 500, 1000], language: { emptyTable: (el.data('langEmptyTable')) ? el.data('langEmptyTable') : "No records found" } }; } jQuery.each(el.data(), function (key, value) { if (typeof value === 'undefined') { return; } if (key === 'ajaxUrl') { options.ajax = { url: value }; return; } if (key === 'lengthChange') { options.lengthChange = value; return; } if (key === 'pageLength') { options.pageLength = value; return; } if (key === 'langEmptyTable') { if (typeof options.language === "undefined") { options.language = {}; } options.language.emptyTable = value; return } if (key === 'langZeroRecords') { if (typeof options.language === "undefined") { options.language = {}; } options.language.zeroRecords = value; return } options.key = value; }); jQuery.each(el.find('th'), function() { if (typeof options.columns === "undefined") { options.columns = []; } options.columns.push({data:jQuery(this).data('name')}); }); self.tables[id] = self.initTable(el, options); } else if (typeof options !== 'undefined') { var oldTable = self.tables[id]; var initOpts = oldTable.init(); var newOpts = jQuery.extend( initOpts, options); oldTable.destroy(); self.tables[id] = self.initTable(el, newOpts); } return self.tables[id]; }; this.initTable = function (el, options) { var table = el.DataTable(options); var self = this; if (el.data('on-draw')) { table.on('draw.dt', function (e, settings) { var namedCallback = el.data('on-draw'); if (typeof window[namedCallback] === 'function') { window[namedCallback](e, settings); } }); } else if (el.data('on-draw-rebind-confirmation')) { table.on('draw.dt', function (e) { self.rebindConfirmation(e); }); } return table; }; this.rebindConfirmation = function (e) { var self = this; var tableId = e.target.id; var toggles = WHMCS.ui.confirmation.register(); for(var i = 0, len = toggles.length; i < len; i++ ) { jQuery(toggles[i]).on( 'confirmed.bs.confirmation', function (e) { e.preventDefault(); WHMCS.http.jqClient.post( jQuery(e.target).data('target-url'), { 'token': csrfToken } ).done(function (data) { if (data.status === 'success' || data.status === 'okay') { self.getTableById(tableId, undefined).ajax.reload(); } }); } ); } }; return this; }, clipboard: function() { this.copy = function(e) { e.preventDefault(); var trigger = $(e.currentTarget); var contentElement = $(trigger).data('clipboard-target'); var container = $(contentElement).parent(); try { var tempElement = $('
') .css('position', 'fixed') .css('opacity', '0') .css('width', '1px') .css('height', '1px') .val($(contentElement).val()); container.append(tempElement); tempElement.focus().select(); document.execCommand('copy'); } finally { tempElement.remove(); } trigger.tooltip({ trigger: 'click', placement: 'bottom' }); WHMCS.ui.toolTip.setTip(trigger, 'Copied!'); WHMCS.ui.toolTip.hideTip(trigger); }; return this; }, /** * ToolTip and Clipboard behaviors */ toolTip: function () { this.setTip = function (btn, message) { var tip = btn.data('bs.tooltip'); if (tip.hoverState !== 'in') { tip.hoverState = 'in'; } btn.attr('data-original-title', message); tip.show(); return tip; }; this.hideTip = function (btn, timeout) { if (!timeout) { timeout = 2000; } return setTimeout(function() { btn.data('bs.tooltip').hide() }, timeout); } }, jsonForm: function() { this.managedElements = 'input,textarea,select'; this.initFields = function (form) { var self = this; $(form).find(self.managedElements).each(function () { var field = this; $(field).on('keypress change', function () { if (self.fieldHasError(field)) { self.clearFieldError(field); } }); }); }; this.init = function (form) { var self = this; self.initFields(form); $(form).on('submit', function(e) { e.preventDefault(); e.stopPropagation(); self.clearErrors(form); var formModal = $(form).parents('.modal[role="dialog"]').first(); if ($(formModal).length) { $(formModal).on('show.bs.modal hidden.bs.modal', function() { self.clearErrors(form); }); /* * Make this optional if the form is used for editing */ $(formModal).on('show.bs.modal', function() { $(form)[0].reset(); }); } WHMCS.http.client.post({ url: $(form).attr('action'), data: $(form).serializeArray(), }) .done(function (response) { self.onSuccess(form, response); }) .fail(function (jqXHR) { self.onError(form, jqXHR); }) .always(function (data) { self.onRequestComplete(form, data); }); }); }; this.initAll = function () { var self = this; $('form[data-role="json-form"]').each(function() { var formElement = this; self.init(formElement); }); }; this.markFieldErrors = function (form, fields) { var self = this; var errorMessage = null; var field, fieldLookup; for (var fieldName in fields) { if (fields.hasOwnProperty(fieldName)) { errorMessage = fields[fieldName]; } fieldLookup = self.managedElements.split(',').map(function(element) { return element + '[name="' + fieldName + '"]'; }).join(','); field = $(form).find(fieldLookup); if (errorMessage) { $(field).parents('.form-group').addClass('has-error'); $(field).attr('title', errorMessage); $(field).tooltip(); } } $(form).find('.form-group.has-error input[title]').first().tooltip('show'); }; this.fieldHasError = function (field) { return $(field).parents('.form-group').hasClass('has-error'); }; this.clearFieldError = function (field) { /** * Try dispose first for BS 4, which will raise error * on BS 3 or older, then we use destroy instead */ try { $(field).tooltip('dispose'); } catch (err) { $(field).tooltip('destroy'); } $(field).parents('.form-group').removeClass('has-error'); }; this.onSuccess = function (form, response) { var formOnSuccess = $(form).data('on-success'); if (typeof formOnSuccess === 'function') { formOnSuccess(response.data); } }; this.onError = function (form, jqXHR) { if (jqXHR.responseJSON && jqXHR.responseJSON.fields && typeof jqXHR.responseJSON.fields === 'object') { this.markFieldErrors(form, jqXHR.responseJSON.fields); } else { // TODO: replace with client-accessible generic error messaging console.log('Unknown error - please try again later.'); } var formOnError = $(form).data('on-error'); if (typeof formOnError === 'function') { formOnError(jqXHR); } }; this.clearErrors = function (form) { var self = this; $(form).find(self.managedElements).each(function () { self.clearFieldError(this); }) }; this.onRequestComplete = function (form, data) { // implement as needed }; return this; }, effects: function () { this.errorShake = function (element) { /** * Shake effect without jQuery UI inspired by Hiren Patel | ninty9notout: * @see https://github.com/ninty9notout/jquery-shake/blob/51f3dcf625970c78505bcac831fd9e28fc85d374/jquery.ui.shake.js */ options = options || {}; var options = $.extend({ direction: "left", distance: 8, times: 3, speed: 90 }, options); return element.each(function () { var el = $(this), props = { position: el.css("position"), top: el.css("top"), bottom: el.css("bottom"), left: el.css("left"), right: el.css("right") }; el.css("position", "relative"); var ref = (options.direction === "up" || options.direction === "down") ? "top" : "left"; var motion = (options.direction === "up" || options.direction === "left") ? "pos" : "neg"; var animation = {}, animation1 = {}, animation2 = {}; animation[ref] = (motion === "pos" ? "-=" : "+=") + options.distance; animation1[ref] = (motion === "pos" ? "+=" : "-=") + options.distance * 2; animation2[ref] = (motion === "pos" ? "-=" : "+=") + options.distance * 2; el.animate(animation, options.speed); for (var i = 1; i < options.times; i++) { el.animate(animation1, options.speed).animate(animation2, options.speed); } el.animate(animation1, options.speed).animate(animation, options.speed / 2, function () { el.css(props); }); }); }; } }); /** * Form module * * @copyright Copyright (c) WHMCS Limited 2005-2017 * @license http://www.whmcs.com/license/ WHMCS Eula */ (function(module) { if (!WHMCS.hasModule('form')) { WHMCS.loadModule('form', module); } })( function () { this.checkAllBound = false; this.register = function () { if (!this.checkAllBound) { this.bindCheckAll(); this.checkAllBound = true; } }; this.bindCheckAll = function () { var huntSelector = '.btn-check-all'; jQuery('body').on('click', huntSelector, function (e) { var btn = jQuery(e.target); var targetInputs = jQuery( '#' + btn.data('checkbox-container') + ' input[type="checkbox"]' ); if (btn.data('btn-check-toggle')) { // one control that changes var textDeselect = 'Deselect All'; var textSelect = 'Select All'; if (btn.data('label-text-deselect')) { textDeselect = btn.data('label-text-deselect'); } if (btn.data('label-text-select')) { textSelect = btn.data('label-text-select'); } if (btn.hasClass('toggle-active')) { targetInputs.prop('checked',false); btn.text(textSelect); btn.removeClass('toggle-active'); } else { targetInputs.prop('checked',true); btn.text(textDeselect); btn.addClass('toggle-active'); } } else { // two controls that are static if (btn.data('btn-toggle-on')) { targetInputs.prop('checked',true); } else { targetInputs.prop('checked',false); } } }); }; this.reloadCaptcha = function (element) { if (typeof grecaptcha !== 'undefined') { grecaptcha.reset(); } else { if (!element) { element = jQuery('#inputCaptchaImage'); } var src = jQuery(element).data('src'); jQuery(element).attr('src', src + '?nocache=' + (new Date()).getTime()); var userInput = jQuery('#inputCaptcha'); if (userInput.length) { userInput.val(''); } } }; return this; }); /** * reCaptcha module - used for captcha apis compatible with the google recaptcha api * * @copyright Copyright (c) WHMCS Limited 2005-2020 * @license http://www.whmcs.com/license/ WHMCS Eula */ var recaptchaLoadComplete = false, recaptchaCount = 0, recaptchaType = 'recaptcha', recaptchaValidationComplete = false; (function(module) { if (!WHMCS.hasModule('recaptcha')) { WHMCS.loadModule('recaptcha', module); } })( function () { this.register = function () { if (recaptchaLoadComplete) { return; } var postLoad = [], recaptchaForms = jQuery(".btn-recaptcha").parents('form'), isInvisible = false; recaptchaForms.each(function (i, el){ if (typeof recaptcha.siteKey === 'undefined') { console.error('Recaptcha site key not defined'); return; } if (typeof recaptcha.libUrl === 'undefined') { console.error('Recaptcha client js url not defined'); return; } if (typeof recaptcha.apiObject === 'undefined') { console.error('Recaptcha client js api object name not defined'); return; } recaptchaCount += 1; var frm = jQuery(el), btnRecaptcha = frm.find(".btn-recaptcha"), required = (typeof recaptcha.requiredText !== 'undefined') ? recaptcha.requiredText : 'Required', recaptchaId = 'divDynamicRecaptcha' + recaptchaCount; isInvisible = btnRecaptcha.hasClass('btn-recaptcha-invisible') // if no recaptcha element, make one var recaptchaContent = frm.find('#' + recaptchaId + ' .g-recaptcha'), recaptchaElement = frm.find('.recaptcha-container'), appendElement = frm; if (recaptchaElement.length) { recaptchaElement.attr('id', recaptchaElement.attr('id') + recaptchaCount); appendElement = recaptchaElement; } if (!recaptchaContent.length) { appendElement.append('
'); recaptchaContent = appendElement.find('#' + recaptchaId); } // propagate invisible recaptcha if necessary if (!isInvisible) { recaptchaContent.data('toggle', 'tooltip') .data('placement', 'bottom') .data('trigger', 'manual') .attr('title', required) .hide(); } // make callback for grecaptcha to invoke after // injecting token & make it known via data-callback var funcName = recaptchaId + 'Callback'; window[funcName] = function () { if (isInvisible) { frm.submit(); } }; // setup an on form submit event to ensure that we // are allowing required field validation to occur before // we do the invisible recaptcha checking if (isInvisible) { recaptchaType = 'invisible'; frm.on('submit.recaptcha', function (event) { var recaptchaId = frm.find('.g-recaptcha').data('recaptcha-id'); if (!window[recaptcha.apiObject].getResponse(recaptchaId).trim()) { event.preventDefault(); window[recaptcha.apiObject].execute(recaptchaId); recaptchaValidationComplete = false; } else { recaptchaValidationComplete = true; } }); } else { postLoad.push(function () { recaptchaContent.slideDown('fast', function() { // just in case there's a delay in DOM; rare recaptchaContent.find(':first').addClass('center-block'); }); }); postLoad.push(function() { recaptchaContent.find(':first').addClass('center-block'); }); } }); window.recaptchaLoadCallback = function() { jQuery('.g-recaptcha').each(function(i, el) { var element = jQuery(el), frm = element.closest('form'), btn = frm.find('.btn-recaptcha'), idToUse = element.attr('id').substring(1); var recaptchaId = grecaptcha.render( el, { sitekey: recaptcha.siteKey, size: (btn.hasClass('btn-recaptcha-invisible')) ? 'invisible' : 'normal', callback: idToUse + 'Callback' } ); element.data('recaptcha-id', recaptchaId); }); } // fetch/invoke the remote library if (recaptchaForms.length) { jQuery.getScript(recaptcha.libUrl, function () { for(var i = postLoad.length - 1; i >= 0 ; i--){ postLoad[i](); } }); } // captcha overlay badge let captchaOverlayBadge = jQuery('.captcha-overlay-badge'), captchaOverlayPopup = jQuery('.captcha-overlay-popup'); if (recaptchaForms.length && captchaOverlayBadge.length) { captchaOverlayBadge.show(); if (captchaOverlayPopup.length) { let captchaOverlayTimer; function captchaPopupHide() { captchaOverlayPopup.hide(); } function debounce(func, delay) { return function() { const context = this; const args = arguments; clearTimeout(captchaOverlayTimer); captchaOverlayTimer = setTimeout(function() { func.apply(context, args); }, delay); }; } const debouncedCaptchaPopupHide = debounce(captchaPopupHide, 3000); captchaOverlayBadge.bind('mouseenter', function() { captchaOverlayPopup.show(); clearTimeout(captchaOverlayTimer); }); captchaOverlayBadge.bind('mouseleave', debouncedCaptchaPopupHide); captchaOverlayBadge.bind('touchstart', function() { captchaOverlayPopup.show(); clearTimeout(captchaOverlayTimer); captchaOverlayTimer = setTimeout(captchaPopupHide, 3000); }); } } recaptchaLoadComplete = true; }; return this; }); /** * General utilities module * * @copyright Copyright (c) WHMCS Limited 2005-2017 * @license http://www.whmcs.com/license/ WHMCS Eula */ (function(module) { if (!WHMCS.hasModule('utils')) { WHMCS.loadModule('utils', module); } })( function () { /** * Not crypto strong; server-side must discard for * something with more entropy; the value is sufficient * for strong client-side validation check */ this.simpleRNG = function () { var chars = './$_-#!,^*()|'; var r = 0; for (var i = 0; r < 3; i++) { r += Math.floor((Math.random() * 10) / 2); } r = Math.floor(r); var s = ''; for (var x = 0; x < r; x++) { v = (Math.random() + 1).toString(24).split('.')[1]; if ((Math.random()) > 0.5) { s += btoa(v).substr(0,4) } else { s += v } if ((Math.random()) > 0.5) { s += chars.substr( Math.floor(Math.random() * 13), 1 ); } } return s; }; this.getRouteUrl = function (path) { return whmcsBaseUrl + "/index.php?rp=" + path; }; this.validateBaseUrl = function() { if (typeof window.whmcsBaseUrl === 'undefined') { console.log('Warning: The WHMCS Base URL definition is missing ' + 'from your active template. Please refer to ' + 'https://go.whmcs.com/1961/base-url ' + 'for more information and details of how to resolve this ' + 'warning.'); window.whmcsBaseUrl = this.autoDetermineBaseUrl(); window.whmcsBaseUrlAutoSet = true; } else if (window.whmcsBaseUrl === '' && typeof window.whmcsBaseUrlAutoSet !== 'undefined' && window.whmcsBaseUrlAutoSet === true ) { window.whmcsBaseUrl = this.autoDetermineBaseUrl(); } }; this.autoDetermineBaseUrl = function() { var windowLocation = window.location.href; var phpExtensionLocation = -1; if (typeof windowLocation !== 'undefined') { phpExtensionLocation = windowLocation.indexOf('.php'); } if (phpExtensionLocation === -1) { windowLocation = jQuery('#Primary_Navbar-Home a').attr('href'); if (typeof windowLocation !== 'undefined') { phpExtensionLocation = windowLocation.indexOf('.php'); } } if (phpExtensionLocation !== -1) { windowLocation = windowLocation.substring(0, phpExtensionLocation); var lastTrailingSlash = windowLocation.lastIndexOf('/'); if (lastTrailingSlash !== false) { return windowLocation.substring(0, lastTrailingSlash); } } return ''; }; this.normaliseStringValue = function(status) { return status ? status.toLowerCase().replace(/\s/g, '-') : ''; }; this.generatePassword = function(len) { var charset = this.getPasswordCharacterSet(); var result = ""; for (var i = 0; len > i; i++) result += charset[this.randomInt(charset.length)]; return result; }; this.getPasswordCharacterSet = function() { var rawCharset = '0123456789' + 'abcdefghijklmnopqrstuvwxyz' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + '!#$%()*+,-.:;=@_|{ldelim}{rdelim}~'; // Parse UTF-16, remove duplicates, convert to array of strings var charset = []; for (var i = 0; rawCharset.length > i; i++) { var c = rawCharset.charCodeAt(i); if (0xD800 > c || c >= 0xE000) { // Regular UTF-16 character var s = rawCharset.charAt(i); if (charset.indexOf(s) == -1) charset.push(s); continue; } if (0xDC00 > c ? rawCharset.length > i + 1 : false) { // High surrogate var d = rawCharset.charCodeAt(i + 1); if (d >= 0xDC00 ? 0xE000 > d : false) { // Low surrogate var s = rawCharset.substring(i, i + 2); i++; if (charset.indexOf(s) == -1) charset.push(s); continue; } } throw "Invalid UTF-16"; } return charset; }; this.randomInt = function(n) { var x = this.randomIntMathRandom(n); x = (x + this.randomIntBrowserCrypto(n)) % n; return x; }; this.randomIntMathRandom = function(n) { var x = Math.floor(Math.random() * n); if (0 > x || x >= n) throw "Arithmetic exception"; return x; }; this.randomIntBrowserCrypto = function(n) { var cryptoObject = null; if ("crypto" in window) cryptoObject = crypto; else if ("msCrypto" in window) cryptoObject = msCrypto; else return 0; if (!("getRandomValues" in cryptoObject) || !("Uint32Array" in window) || typeof Uint32Array != "function") cryptoObject = null; if (cryptoObject == null) return 0; // Generate an unbiased sample var x = new Uint32Array(1); do cryptoObject.getRandomValues(x); while (x[0] - x[0] % n > 4294967296 - n); return x[0] % n; }; return this; }); WHMCS.utils.validateBaseUrl(); jQuery(document).ready(function() { jQuery('#main-body').on('click', '.product-recommendations .product-recommendation .header', function(e) { if (jQuery(e.target).is('.btn, .btn span, .btn .fa')) { return; } e.preventDefault(); if (jQuery('.fa-square', this).length > 0) { return; } jQuery(this).parent().find('.rotate').toggleClass('down'); jQuery(this).parent().find('.body').slideToggle('fast'); }).on('click', '.product-recommendations .product-recommendation .btn-add', function() { jQuery(this).attr('disabled', 'disabled') .find('span.arrow i') .removeClass('fa-chevron-right') .addClass('fa-spinner fa-spin'); }).on('click', '.order-button, .order-btn, .btn-order-now', function(e) { if (jQuery(this).data('hasRecommendations') == 1) { e.preventDefault(); var href = jQuery(this).attr('href'); jQuery('i', this).removeClass().addClass('fas fa-spinner fa-spin'); displayRecommendations( href, 'addproductajax=1', true ).done(function() { window.location = href; }); } }); setRecommendationColors(); if (document.URL.includes('cart.php?a=checkout') || document.URL.includes('cart.php?a=view')) { if (jQuery('#recommendationsModal .product-recommendation:not(.clonable)').length > 0) { jQuery('#recommendationsModal').modal('toggle'); } } }); function getRecommendationColors(hex, percentage) { var primary = tinycolor(hex), secondary, text = tinycolor('fff'), brightness = Math.round(Math.min(primary.getBrightness()/255) * 100), baseBrightnessPercent = 25; if (brightness < baseBrightnessPercent) { primary.lighten(baseBrightnessPercent - brightness); } else if (brightness > (100 - baseBrightnessPercent)) { primary.darken(brightness - (100 - baseBrightnessPercent)); } secondary = primary.clone().darken(percentage); if (secondary.isLight()) { text = tinycolor('000'); } return [primary.toHexString(), secondary.toHexString(), text.toHexString()]; }; function setRecommendationColors() { var colors, defaultColor = '#9abb3a'; jQuery('.product-recommendations .product-recommendation').each(function() { var element = jQuery(this), primaryColor = element.data('color'); if (!(primaryColor.length > 0) || (primaryColor.match(/^#[0-9A-Fa-f]{3,6}$/gi) == undefined)) { primaryColor = defaultColor; } colors = getRecommendationColors(primaryColor, 15); element.css('border-color', colors[0]); jQuery('.btn-add', element).css('background-color', colors[0]); jQuery('.expander', element).css('color', colors[0]); jQuery('.price', element).css('color', colors[1]); jQuery('.text', element).css({'color': colors[2]}); jQuery('.arrow', element).css({'background-color': colors[1], 'color': colors[2]}); }); } function displayRecommendations(postUrl, postData, postForce) { var deferredObject = jQuery.Deferred(), hasRecommendations = jQuery('#divProductHasRecommendations').data('value'), modal = jQuery('#recommendationsModal'), shoppingCartBtn = jQuery('.cart-btn .badge'); if (postForce || hasRecommendations) { jQuery('.cart-body button[type="submit"] i') .removeClass('fa-arrow-circle-right') .addClass('fa-spinner fa-spin'); WHMCS.http.jqClient.jsonPost({ url: postUrl, data: postData, success: function(data) { if (data.success && data.href) { modal.on('hide.bs.modal', function() { window.location = data.href; return false; }); jQuery('#btnContinueRecommendationsModal', modal) .attr('href', data.href) .click(function () { jQuery('span', this).removeClass('w-hidden hidden'); }); jQuery('.modal-body', modal).html('').html(data.html); setRecommendationColors(); modal.modal('show'); jQuery('i.fa-spinner.fa-spin:visible').removeClass('fa-spinner fa-spin').addClass('fa-check-circle'); shoppingCartBtn.text(data.count); } else if (!data.success && data.href) { window.location = data.href; } else { deferredObject.resolve(false); } }, error: function() { deferredObject.resolve(false); } }); } else { deferredObject.resolve(false); } return deferredObject.promise(); } if (typeof localTrans === 'undefined') { localTrans = function (phraseId, fallback) { if (typeof _localLang !== 'undefined') { if (typeof _localLang[phraseId] !== 'undefined') { if (_localLang[phraseId].length > 0) { return _localLang[phraseId]; } } } return fallback; } } var domainLookupCallCount, checkoutForm, furtherSuggestions, hideCvcOnCheckoutForExistingCard = 0; jQuery(document).ready(function(){ jQuery('#order-standard_cart').find('input').not('.no-icheck').iCheck({ inheritID: true, checkboxClass: 'icheckbox_square-blue', radioClass: 'iradio_square-blue', increaseArea: '20%' }); jQuery('.mc-promo .header').click(function(e) { e.preventDefault(); if (jQuery(e.target).is('.btn, .btn span,.btn .fa')) { return; } jQuery(this).parent().find('.rotate').toggleClass('down'); jQuery(this).parent().find('.body').slideToggle('fast'); }); jQuery('.mc-promos.viewcart .mc-promo:first-child .header').click(); var cardNumber = jQuery('#inputCardNumber'), existingCvv = jQuery('#inputCardCVV2'); if (cardNumber.length) { cardNumber.payment('formatCardNumber'); jQuery('#inputCardCVV').payment('formatCardCVC'); jQuery('#inputCardStart').payment('formatCardExpiry'); jQuery('#inputCardExpiry').payment('formatCardExpiry'); } if (existingCvv.length) { existingCvv.payment('formatCardCVC'); } var $orderSummaryEl = jQuery("#orderSummary"); if ($orderSummaryEl.length) { var offset = jQuery("#scrollingPanelContainer").parent('.row').offset(); var maxTopOffset = jQuery("#scrollingPanelContainer").parent('.row').outerHeight() - 35; var topPadding = 15; jQuery(window).resize(function() { offset = jQuery("#scrollingPanelContainer").parent('.row').offset(); maxTopOffset = jQuery("#scrollingPanelContainer").parent('.row').outerHeight() - 35; repositionScrollingSidebar(); }); jQuery(window).scroll(function() { repositionScrollingSidebar(); }); repositionScrollingSidebar(); } function repositionScrollingSidebar() { if (jQuery('#scrollingPanelContainer').css('float') === 'none') { $orderSummaryEl.stop().css('margin-top', '0'); return false; } var heightOfOrderSummary = $orderSummaryEl.outerHeight(); var offsetTop = 0; var productListing = jQuery("#scrollingPanelContainer").prev('div.secondary-cart-body'); if (typeof offset !== "undefined") { offsetTop = offset.top; } var newTopOffset = jQuery(window).scrollTop() - offsetTop + topPadding; if (heightOfOrderSummary < jQuery(window).height()) { productListing.stop().animate({ marginTop: 0 }); if (newTopOffset > maxTopOffset - heightOfOrderSummary) { newTopOffset = maxTopOffset - heightOfOrderSummary; } if (jQuery(window).scrollTop() > offsetTop) { $orderSummaryEl.stop().animate({ marginTop: newTopOffset }); } else { $orderSummaryEl.stop().animate({ marginTop: 0 }); } } else { $orderSummaryEl.stop().animate({ marginTop: 0 }); if (newTopOffset + productListing.height() > $orderSummaryEl.height()) { return false; } if (jQuery(window).scrollTop() > offsetTop) { productListing.stop().animate({ marginTop: newTopOffset }); } else { productListing.stop().animate({ marginTop: 0 }); } } } jQuery("#frmConfigureProduct").submit(function(e) { e.preventDefault(); var button = jQuery('#btnCompleteProductConfig'), btnOriginalText = jQuery(button).html(), postUrl = whmcsBaseUrl + '/cart.php', postData = 'a=confproduct&' + jQuery("#frmConfigureProduct").serialize(); jQuery(button).find('i').removeClass('fa-arrow-circle-right').addClass('fa-spinner fa-spin'); displayRecommendations( postUrl, 'addproductajax=1&' + postData, false ).done(function() { WHMCS.http.jqClient.post( postUrl, 'ajax=1&' + postData, function(data) { if (data) { jQuery("#btnCompleteProductConfig").html(btnOriginalText); jQuery("#containerProductValidationErrorsList").html(data); jQuery("#containerProductValidationErrors").show(); // scroll to error container if below it if (jQuery(window).scrollTop() > jQuery("#containerProductValidationErrors").offset().top) { jQuery('html, body').scrollTop(jQuery("#containerProductValidationErrors").offset().top - 15); } } else { window.location = whmcsBaseUrl + '/cart.php?a=confdomains'; } } ); }); }); jQuery("#productConfigurableOptions").on('ifChecked', 'input', function() { recalctotals(); }); jQuery("#productConfigurableOptions").on('ifUnchecked', 'input', function() { recalctotals(); }); jQuery("#productConfigurableOptions").on('change', 'select', function() { recalctotals(); }); jQuery(".addon-products").on('click', '.panel-addon', function(e) { e.preventDefault(); var $activeAddon = jQuery(this); if ($activeAddon.hasClass('panel-addon-selected')) { $activeAddon.find('input[type="checkbox"]').iCheck('uncheck'); } else { $activeAddon.find('input[type="checkbox"]').iCheck('check'); } }); jQuery(".addon-products").on('ifChecked', '.panel-addon input', function(event) { var $activeAddon = jQuery(this).parents('.panel-addon'); $activeAddon.addClass('panel-addon-selected'); $activeAddon.find('input[type="checkbox"]').iCheck('check'); $activeAddon.find('.panel-add').html('
'+localTrans('addedToCartRemove', 'Added to Cart (Remove)')); recalctotals(); }); jQuery(".addon-products").on('ifUnchecked', '.panel-addon input', function(event) { var $activeAddon = jQuery(this).parents('.panel-addon'); $activeAddon.removeClass('panel-addon-selected'); $activeAddon.find('input[type="checkbox"]').iCheck('uncheck'); $activeAddon.find('.panel-add').html('
'+localTrans('addToCart', 'Add to Cart')); recalctotals(); }); jQuery("#frmConfigureProduct").on('ifChecked', '.addon-selector', function(event) { recalctotals(); }); if (jQuery(".domain-selection-options input:checked").length == 0) { var firstInput = jQuery(".domain-selection-options input:first"); jQuery(firstInput).iCheck('check'); jQuery(firstInput).parents('.option').addClass('option-selected'); } jQuery("#domain" + jQuery(".domain-selection-options input:checked").val()).show(); jQuery(".domain-selection-options input").on('ifChecked', function(event){ jQuery(".domain-selection-options .option").removeClass('option-selected'); jQuery(this).parents('.option').addClass('option-selected'); jQuery(".domain-input-group").hide(); jQuery("#domain" + jQuery(this).val()).show(); }); jQuery('#frmProductDomain').submit(function (e) { e.preventDefault(); var btnSearchObj = jQuery(this).find('button[type="submit"]'), domainSearchResults = jQuery("#DomainSearchResults"), spotlightTlds = jQuery('#spotlightTlds'), suggestions = jQuery('#domainSuggestions'), btnDomainContinue = jQuery('#btnDomainContinue'), domainoption = jQuery(".domain-selection-options input:checked").val(), sldInput = jQuery("#" + domainoption + "sld"), sld = sldInput.val(), tld = '', pid = jQuery('#frmProductDomainPid').val(), tldInput = '', idnLanguage = jQuery('#idnLanguageSelector'); jQuery('.field-error-msg').hide(); if (idnLanguage.is(':visible')) { idnLanguage.slideUp(); idnLanguage.find('select').val(''); } if (domainoption == 'incart') { sldInput = jQuery("#" + domainoption + "sld option:selected"); sld = sldInput.text(); } else if (domainoption == 'subdomain') { tldInput = jQuery("#" + domainoption + "tld option:selected"); tld = tldInput.text(); } else { tldInput = jQuery("#" + domainoption + "tld"); tld = tldInput.val(); if (sld && !tld) { tldInput.tooltip('show'); tldInput.focus(); return false; } if (tld.substr(0, 1) != '.') { tld = '.' + tld; } } if (!sld) { sldInput.tooltip('show'); sldInput.focus(); return false; } sldInput.tooltip('hide'); if (tldInput.length) { tldInput.tooltip('hide'); } jQuery('input[name="domainoption"]').iCheck('disable'); domainLookupCallCount = 0; btnSearchObj.attr('disabled', 'disabled').addClass('disabled'); jQuery('.domain-lookup-result').hide(); jQuery('#primaryLookupResult div').filter(function() { return $(this).closest('#idnLanguageSelector').length === 0; }).hide(); jQuery('#primaryLookupResult').find('.register-price-label').show().end() .find('.transfer-price-label').hide(); jQuery('.domain-lookup-register-loader').hide(); jQuery('.domain-lookup-transfer-loader').hide(); jQuery('.domain-lookup-other-loader').hide(); if (domainoption == 'register') { jQuery('.domain-lookup-register-loader').show(); } else if (domainoption == 'transfer') { jQuery('.domain-lookup-transfer-loader').show(); } else { jQuery('.domain-lookup-other-loader').show(); } jQuery('.domain-lookup-loader').show(); suggestions.find('div:not(.actions)').hide().end() .find('.clone').remove(); jQuery('div.panel-footer.more-suggestions').hide() .find('a').show().end() .find('span.no-more').hide(); jQuery('.btn-add-to-cart').removeAttr('disabled') .find('span').hide().end() .find('span.to-add').show(); btnDomainContinue.hide().attr('disabled', 'disabled'); if (domainoption != 'register') { spotlightTlds.hide(); jQuery('.suggested-domains').hide(); } if (!domainSearchResults.is(":visible")) { domainSearchResults.fadeIn(); } if (domainoption == 'register') { spotlightTlds.fadeIn('fast'); jQuery('#resultDomainOption').val(domainoption); var lookup = WHMCS.http.jqClient.post( WHMCS.utils.getRouteUrl('/domain/check'), { token: csrfToken, type: 'domain', domain: sld + tld, sld: sld, tld: tld, source: 'cartAddDomain' }, 'json' ), spotlight = WHMCS.http.jqClient.post( WHMCS.utils.getRouteUrl('/domain/check'), { token: csrfToken, type: 'spotlight', domain: sld + tld, sld: sld, tld: tld, source: 'cartAddDomain' }, 'json' ), suggestion = WHMCS.http.jqClient.post( WHMCS.utils.getRouteUrl('/domain/check'), { token: csrfToken, type: 'suggestions', domain: sld + tld, sld: sld, tld: tld, source: 'cartAddDomain' }, 'json' ); // primary lookup handler lookup.done(function (data) { jQuery.each(data.result, function(index, domain) { var pricing = null, result = jQuery('#primaryLookupResult'), available = result.find('.domain-available'), availablePrice = result.find('.domain-price'), unavailable = result.find('.domain-unavailable'), invalid= result.find('.domain-invalid'), contactSupport = result.find('.domain-contact-support'), resultDomain = jQuery('#resultDomain'), resultDomainPricing = jQuery('#resultDomainPricingTerm'), error = result.find('.domain-error'); result.show(); jQuery('.domain-lookup-primary-loader').hide(); if (typeof domain !== 'string' && !domain.error && domain.isValidDomain) { error.hide(); pricing = domain.pricing; if (domain.isAvailable && typeof pricing !== 'string') { if (domain.domainName !== domain.idnDomainName && idnLanguage.not(':visible')) { idnLanguage.slideDown(); } if (domain.preferredTLDNotAvailable) { unavailableTld.show().find('strong').html(domain.originalUnavailableTld); } contactSupport.hide(); available.show().find('strong').html(domain.domainName); availablePrice.show().find('span.price').html(pricing[Object.keys(pricing)[0]].register).end() .find('button').attr('data-domain', domain.domainName); resultDomain.val(domain.domainName); resultDomainPricing.val(Object.keys(pricing)[0]).attr('name', 'domainsregperiod[' + domain.domainName +']'); btnDomainContinue.removeAttr('disabled'); } else { var displayDomain = domain.originalUnavailableDomain ? domain.originalUnavailableDomain : domain.domainName; unavailable.show().find('strong').html(displayDomain); contactSupport.hide(); if (typeof pricing === 'string' && pricing == 'ContactUs') { contactSupport.show(); } } } else { var done = false, reg = /
/, errors = []; if (!domain.isValidDomain && domain.domainErrorMessage) { invalid.text(domain.domainErrorMessage); } else if (domain.error || index === 'error') { if (typeof domain === 'string') { error.text(domain); } else if (!domain.error.match(reg)) { error.text(domain.error); } else { error.text(''); errors = domain.error.split(reg); for(var i=0; i < errors.length; i++) { var errorMsg = errors[i]; if (errorMsg.length) { if (error.text()) { // only add line break if there is // multiple lines of text error.append('
'); } error.append(jQuery('
').text(errorMsg)); } } } error.show(); done = true; } if (!done) { invalid.show(); } } }); }).always(function() { hasProductDomainLookupEnded(3, btnSearchObj); }); // spotlight lookup handler spotlight.done(function(data) { if (typeof data != 'object' || data.result.length == 0 || data.result.error) { jQuery('.domain-lookup-spotlight-loader').hide(); return; } jQuery.each(data.result, function(index, domain) { var tld = domain.tldNoDots, pricing = domain.pricing, result = jQuery('#spotlight' + tld + ' .domain-lookup-result'); jQuery('.domain-lookup-spotlight-loader').hide(); result.find('button').hide(); if (domain.isValidDomain) { if (domain.isAvailable && typeof pricing !== 'string') { if (domain.domainName !== domain.idnDomainName && idnLanguage.not(':visible')) { idnLanguage.slideDown(); } result .find('span.available').html(pricing[Object.keys(pricing)[0]].register).show().end() .find('button.btn-add-to-cart') .attr('data-domain', domain.domainName) .show(); result.find('button.domain-contact-support').hide(); } else { if (typeof pricing === 'string') { if (pricing == '') { result.find('button.unavailable').show(); } else { result.find('button.domain-contact-support').show(); } result.find('span.available').hide(); } else { result.find('button.unavailable').show(); result.find('span.available').hide(); } } } else { result.find('button.invalid:hidden').show().end() .find('span.available').hide().end() .find('button').not('button.invalid').hide(); } result.show(); }); }).always(function() { hasProductDomainLookupEnded(3, btnSearchObj); }); // suggestions lookup handler suggestion.done(function (data) { if (typeof data != 'object' || data.result.length == 0 || data.result.error) { jQuery('.suggested-domains').fadeOut('fast', function() { jQuery(this).hide(); }); return; } else { jQuery('.suggested-domains').show(); } var suggestionCount = 1; jQuery.each(data.result, function(index, domain) { var tld = domain.tld, pricing = domain.pricing; suggestions.find('div:first').clone(true, true).appendTo(suggestions); var newSuggestion = suggestions.find('div.domain-suggestion').last(); newSuggestion.addClass('clone') .find('span.domain').html(domain.sld).end() .find('span.extension').html('.' + tld); if (domain.domainName !== domain.idnDomainName && idnLanguage.not(':visible')) { idnLanguage.slideDown(); } if (typeof pricing === 'string') { newSuggestion.find('button.btn-add-to-cart').remove(); if (pricing != '') { newSuggestion.find('button.domain-contact-support').show().end() .find('span.price').hide(); } else { newSuggestion.remove(); } } else { newSuggestion.find('button.btn-add-to-cart').attr('data-domain', domain.domainName).end() .find('span.price').html(pricing[Object.keys(pricing)[0]].register); } if (suggestionCount <= 10) { newSuggestion.show(); } suggestionCount++; if (domain.group) { newSuggestion.find('span.promo') .addClass(domain.group) .html(domain.group.toUpperCase()) .show(); } furtherSuggestions = suggestions.find('div.domain-suggestion.clone').not(':visible').length; if (furtherSuggestions > 0) { jQuery('div.more-suggestions').show(); } }); jQuery('.domain-lookup-suggestions-loader').hide(); jQuery('#domainSuggestions').show(); }).always(function() { hasProductDomainLookupEnded(3, btnSearchObj); }); } else if (domainoption == 'transfer') { jQuery('#resultDomainOption').val(domainoption); var transfer = WHMCS.http.jqClient.post( WHMCS.utils.getRouteUrl('/domain/check'), { token: csrfToken, type: 'transfer', domain: sld + tld, sld: sld, tld: tld, source: 'cartAddDomain' }, 'json' ); transfer.done(function (data) { if (typeof data != 'object' || data.result.length == 0) { jQuery('.domain-lookup-primary-loader').hide(); return; } var result = jQuery('#primaryLookupResult'), transfereligible = result.find('.transfer-eligible'), transferPrice = result.find('.domain-price'), transfernoteligible = result.find('.transfer-not-eligible'), resultDomain = jQuery('#resultDomain'), resultDomainPricing = jQuery('#resultDomainPricingTerm'); if (Object.keys(data.result).length === 0) { jQuery('.domain-lookup-primary-loader').hide(); result.show(); transfernoteligible.show(); } jQuery.each(data.result, function(index, domain) { var pricing = domain.pricing; jQuery('.domain-lookup-primary-loader').hide(); result.show(); if (domain.isRegistered) { transfereligible.show(); transferPrice.show().find('.register-price-label').hide().end() .find('.transfer-price-label').show().end() .find('span.price').html(pricing[Object.keys(pricing)[0]].transfer).end() .find('button').attr('data-domain', domain.domainName); resultDomain.val(domain.domainName); resultDomainPricing.val(Object.keys(pricing)[0]).attr('name', 'domainsregperiod[' + domain.domainName +']'); btnDomainContinue.removeAttr('disabled'); } else { transfernoteligible.show(); } }); }).always(function() { hasProductDomainLookupEnded(1, btnSearchObj); }); } else if (domainoption == 'owndomain' || domainoption == 'subdomain' || domainoption == 'incart') { var otherDomain = WHMCS.http.jqClient.post( WHMCS.utils.getRouteUrl('/domain/check'), { token: csrfToken, type: domainoption, pid: pid, domain: sld + tld, sld: sld, tld: tld, source: 'cartAddDomain' }, 'json' ); otherDomain.done(function(data) { if (typeof data != 'object' || data.result.length == 0) { jQuery('.domain-lookup-subdomain-loader').hide(); return; } jQuery.each(data.result, function(index, result) { if (result.status === true) { displayRecommendations( whmcsBaseUrl + '/cart.php', 'addproductajax=1&a=confproduct&i=' + result.num, false ).done(function() { window.location = whmcsBaseUrl + '/cart.php?a=confproduct&i=' + result.num; }); } else { jQuery('.domain-lookup-primary-loader').hide(); if (typeof result === 'string') { jQuery('#primaryLookupResult').show().find('.domain-error') .text(result) .show(); } else { jQuery('#primaryLookupResult').show().find('.domain-invalid').show(); } } }); }).always(function(){ hasProductDomainLookupEnded(1, btnSearchObj); }); } btnDomainContinue.show(); }); jQuery('#frmProductDomainSelections').on('submit', function(e) { var idnLanguage = jQuery('#idnLanguageSelector'), idnLanguageInput = idnLanguage.find('select'), form = jQuery(this); if (idnLanguage.is(':visible') && !idnLanguageInput.val()) { e.preventDefault(); idnLanguageInput.showInputError(); return false; } e.preventDefault(); displayRecommendations( form.attr('action'), 'addproductajax=1&' + form.serialize(), false ).done(function() { form.unbind().submit(); form.submit(); }); }); jQuery("#btnAlreadyRegistered").click(function() { jQuery("#containerNewUserSignup").slideUp('', function() { jQuery("#containerExistingUserSignin").slideDown('', function() { jQuery("#inputCustType").val('existing'); jQuery("#btnAlreadyRegistered").fadeOut('', function() { jQuery("#btnNewUserSignup").fadeIn(); }); }); }); jQuery("#containerNewUserSecurity").hide(); if (jQuery("#stateselect").attr('required')) { jQuery("#stateselect").removeAttr('required').addClass('requiredAttributeRemoved'); } jQuery('.marketing-email-optin').slideUp(); }); jQuery("#btnNewUserSignup").click(function() { jQuery("#containerExistingUserSignin").slideUp('', function() { jQuery("#containerNewUserSignup").slideDown('', function() { jQuery("#inputCustType").val('new'); if (jQuery("#passwdFeedback").html().length == 0) { jQuery("#containerNewUserSecurity").show(); } jQuery("#btnNewUserSignup").fadeOut('', function() { jQuery("#btnAlreadyRegistered").fadeIn(); }); }); jQuery('.marketing-email-optin').slideDown(); }); if (jQuery("#stateselect").hasClass('requiredAttributeRemoved')) { jQuery("#stateselect").attr('required', 'required').removeClass('requiredAttributeRemoved'); } }); jQuery("#btnExistingLogin").click(function() { var inputLoginEmail = jQuery('#inputLoginEmail').val(), inputLoginPassword = jQuery('#inputLoginPassword').val(), existingLoginMessage = jQuery('#existingLoginMessage'), btnExistingLogin = jQuery('#btnExistingLogin'); btnExistingLogin.prop('disabled', true) .addClass('disabled') .find('span').toggle(); WHMCS.http.jqClient.jsonPost({ url: WHMCS.utils.getRouteUrl('/login/cart'), data: { username: inputLoginEmail, password: inputLoginPassword, token: csrfToken }, success: function (data) { if (!data.redirectUrl) { location.reload(true); } else { window.location.href = data.redirectUrl; } }, error: function (error) { if (error) { existingLoginMessage.slideUp('fast') .toggle() .html(error) .slideDown('fast'); btnExistingLogin.prop('disabled', false) .removeClass('disabled') .find('span').toggle(); } } }); }); jQuery('.account-select').on('ifChecked', function(event) { var userSignupContainer = jQuery('#containerNewUserSignup'), stateSelect = jQuery("#stateselect"), thisValue = jQuery(this).val(), btnCompleteOrder = jQuery('#btnCompleteOrder'), existingPayMethods = jQuery('#existingCardsContainer'), existingUserEmail = jQuery('#inputEmail'); if (existingPayMethods.length) { existingPayMethods.html(''); } if (existingUserEmail.length) { existingUserEmail.attr('value', ''); } jQuery('#containerExistingAccountSelect') .find('div.account.active') .removeClass('active'); jQuery(this).closest('div.account').addClass('active'); if (thisValue === 'new') { if (userSignupContainer.not(':visible')) { userSignupContainer.slideDown('', function () { jQuery("#inputCustType").val('add'); jQuery('.marketing-email-optin').slideDown(); }); if (stateSelect.hasClass('requiredAttributeRemoved')) { stateSelect.attr('required', 'required') .removeClass('requiredAttributeRemoved'); } } } else { btnCompleteOrder.addClass('disabled'); if (btnCompleteOrder.hasClass('spinner-on-click')) { var icon = btnCompleteOrder.find('i.fas,i.far,i.fal,i.fab'); jQuery(icon) .data('original-class', icon.attr('class')) .removeAttr('class') .addClass('fas fa-spinner fa-spin'); } jQuery("#inputCustType").val('account'); if (userSignupContainer.is(':visible')) { userSignupContainer.slideUp(); if (stateSelect.attr('required')) { stateSelect.removeAttr('required') .addClass('requiredAttributeRemoved'); } jQuery('.marketing-email-optin').slideUp(); } } WHMCS.http.jqClient.jsonPost({ url: WHMCS.utils.getRouteUrl('/cart/account/select'), data: { account_id: thisValue, token: csrfToken }, success: function(data) { var creditDiv = jQuery('#applyCreditContainer'); jQuery('#totalCartPrice').text(data.total); creditDiv.find('p').first().text(data.availableCreditBalance); if (!data.canUseCreditOnCheckout && creditDiv.is(':visible')) { var skipCreditOnCheckout = jQuery('#skipCreditOnCheckout'); creditDiv.hide(); skipCreditOnCheckout.prop('checked', true); } else if (data.canUseCreditOnCheckout) { var useCreditOnCheckout = jQuery('#useCreditOnCheckout'), spanFullCredit = jQuery('#spanFullCredit'), spanUseCredit = jQuery('#spanUseCredit'); if (data.full) { hideCvcOnCheckoutForExistingCard = '1'; spanFullCredit.show().find('span').text(data.total); if (spanUseCredit.is(':visible')) { spanUseCredit.slideUp(); } } else { hideCvcOnCheckoutForExistingCard = '0'; spanUseCredit.show().find('span').text(data.creditBalance); if (spanFullCredit.is(':visible')) { spanFullCredit.slideUp(); } } useCreditOnCheckout.iCheck('check'); if (creditDiv.not(':visible')) { creditDiv.slideDown(); } } if (existingPayMethods.length) { existingPayMethods.html(data.existingCards); existingPayMethods.find('input[type="radio"]').iCheck({ inheritID: true, checkboxClass: 'icheckbox_square-blue', radioClass: 'iradio_square-blue', increaseArea: '20%' }); jQuery(".payment-methods:checked").trigger('ifChecked'); selectPreferredCard(); } }, always: function() { btnCompleteOrder.removeClass('disabled'); if (btnCompleteOrder.hasClass('spinner-on-click')) { var icon = btnCompleteOrder.find('i.fas,i.far,i.fal,i.fab'); if (jQuery(icon).hasClass('fa-spinner')) { jQuery(icon) .removeAttr('class') .addClass(icon.data('original-class')); } } } }); }); var cvvFieldContainer = jQuery('#cvv-field-container'), existingCardContainer = jQuery('#existingCardsContainer'), newCardInfo = jQuery('#newCardInfo'), newCardSaveSettings = jQuery('#newCardSaveSettings'), inputNoStoreContainer = jQuery('#inputNoStoreContainer'), existingCardInfo = jQuery('#existingCardInfo'), newCardOption = jQuery('#new'), creditCardInputFields = jQuery('#creditCardInputFields'); jQuery(document).on('ifChecked', '.existing-card', function(event) { newCardSaveSettings.slideUp().find('input').attr('disabled', 'disabled'); if (jQuery('.payment-methods:checked').data('remote-inputs') === 1) { return; } newCardInfo.slideUp().find('input').attr('disabled', 'disabled'); if (hideCvcOnCheckoutForExistingCard !== '1') { existingCardInfo.slideDown().find('input').removeAttr('disabled'); } else { existingCardInfo.slideUp().find('input').attr('disabled', 'disabled'); } }); newCardOption.on('ifChecked', function(event) { newCardSaveSettings.slideDown().find('input').removeAttr('disabled'); if (jQuery('.payment-methods:checked').data('remote-inputs') === 1) { return; } newCardInfo.slideDown().find('input').removeAttr('disabled'); existingCardInfo.slideUp().find('input').attr('disabled', 'disabled'); }); var whmcsPaymentModuleMetadata = { _source: 'checkout', }; jQuery(".payment-methods").each(function () { var element = jQuery(this); WHMCS.payment.event.gatewayInit(whmcsPaymentModuleMetadata, element.val()); WHMCS.payment.event.gatewayOptionInit(whmcsPaymentModuleMetadata, element.val(), element); }) .on('ifChecked', function(event) { WHMCS.payment.event.gatewayUnselected(whmcsPaymentModuleMetadata); WHMCS.payment.display.errorClear(); var element = jQuery(this); var afterDefaultOnSelectOptions = { complete: function () { WHMCS.payment.event.gatewaySelected(whmcsPaymentModuleMetadata, element.val(), element); } }; var existingCards = jQuery(document).find('.existing-card'); if (!existingCards.length) { existingCardInfo.slideUp() .find('input') .attr('disabled', 'disabled'); } if (jQuery(this).hasClass('is-credit-card')) { var gatewayPaymentType = jQuery(this).data('payment-type'), gatewayModule = jQuery(this).val(), showLocal = jQuery(this).data('show-local'), relevantMethods = []; if (gatewayPaymentType === 'RemoteCreditCard') { inputNoStoreContainer.hide().find('input').prop('disabled', 'disabled'); } else { if (inputNoStoreContainer.not(':visible')) { inputNoStoreContainer.slideDown().find('input').removeProp('disabled'); } } existingCards.each(function(index) { var paymentType = jQuery(this).data('payment-type'), paymentModule = jQuery(this).data('payment-gateway'), payMethodId = jQuery(this).val(); var paymentTypeMatch = (paymentType === gatewayPaymentType); var paymentModuleMatch = false; if (gatewayPaymentType === 'RemoteCreditCard') { // only show remote credit cards that belong to the selected gateway paymentModuleMatch = (paymentModule === gatewayModule); } else if (gatewayPaymentType === 'CreditCard') { // any local credit card can be used with any credit card gateway paymentModuleMatch = true; } if (showLocal && paymentType === 'CreditCard') { paymentTypeMatch = true; paymentModuleMatch = true; } var payMethodElements = jQuery('[data-paymethod-id="' + payMethodId + '"]'); if (paymentTypeMatch && paymentModuleMatch) { jQuery(payMethodElements).show(); relevantMethods.push(this); } else { jQuery(payMethodElements).hide(); } }); var enabledRelevantMethods = relevantMethods.filter(function (item) { return ! jQuery(item).attr('disabled'); }); if (enabledRelevantMethods.length > 0) { var defaultId = null; jQuery.each(enabledRelevantMethods, function(index, value) { var jQueryElement = jQuery(value), order = parseInt(jQueryElement.data('order-preference'), 10); if ((defaultId === null) || (order < defaultId)) { defaultId = jQueryElement.val(); if (order === 0) { return false; } } }); if (defaultId === null) { defaultId = 'new'; } jQuery.each(enabledRelevantMethods, function(index, value) { var jQueryElement = jQuery(value); if (jQueryElement.val() === defaultId) { jQueryElement.iCheck('check'); return false; } }); existingCardContainer.show(); if (hideCvcOnCheckoutForExistingCard !== '1') { existingCardInfo.show().find('input').removeAttr('disabled'); } else { existingCardInfo.hide().find('input').attr('disabled', 'disabled'); } } else { jQuery(newCardOption).iCheck('check'); existingCardContainer.hide(); existingCardInfo.hide().find('input').attr('disabled', 'disabled'); } if (!creditCardInputFields.is(":visible")) { creditCardInputFields.slideDown(afterDefaultOnSelectOptions); } else { afterDefaultOnSelectOptions.complete(); } } else { creditCardInputFields.slideUp(afterDefaultOnSelectOptions); } }); jQuery('.cc-input-container .paymethod-info').click(function() { var payMethodId = $(this).data('paymethod-id'); var input = jQuery('input[name="ccinfo"][value=' + payMethodId + ']:not(:disabled)'); if (input.length > 0) { input.iCheck('check'); } }); jQuery("#inputDomainContact").on('change', function() { var thisInput = jQuery(this); if (this.value === "addingnew") { thisInput.closest('div').addClass('pb-2'); jQuery("#domainRegistrantInputFields").parent('div').slideDown(); } else { jQuery("#domainRegistrantInputFields").parent('div').slideUp(function () { thisInput.closest('div').removeClass('pb-2'); }); } }); if (typeof registerFormPasswordStrengthFeedback == 'function') { jQuery("#inputNewPassword1").keyup(registerFormPasswordStrengthFeedback); } else { jQuery("#inputNewPassword1").keyup(function () { passwordStrength = getPasswordStrength(jQuery(this).val()); if (passwordStrength >= 75) { textLabel = langPasswordStrong; cssClass = 'success'; } else if (passwordStrength >= 30) { textLabel = langPasswordModerate; cssClass = 'warning'; } else { textLabel = langPasswordWeak; cssClass = 'danger'; } jQuery("#passwordStrengthTextLabel").html(langPasswordStrength + ': ' + passwordStrength + '% ' + textLabel); jQuery("#passwordStrengthMeterBar").css( 'width', passwordStrength + '%' ).attr('aria-valuenow', passwordStrength); jQuery("#passwordStrengthMeterBar").removeClass( 'progress-bar-success progress-bar-warning progress-bar-danger').addClass( 'progress-bar-' + cssClass); }); } jQuery('#inputDomain').on('shown.bs.tooltip', function () { setTimeout(function(input) { input.tooltip('hide'); }, 5000, jQuery(this) ); }); jQuery('#frmDomainChecker').submit(function (e) { e.preventDefault(); if ( typeof recaptchaValidationComplete !== 'undefined' && typeof recaptchaType !== 'undefined' && recaptchaType === 'invisible' && recaptchaValidationComplete === false ) { return; } var frmDomain = jQuery('#frmDomainChecker'), inputDomain = jQuery('#inputDomain'), suggestions = jQuery('#domainSuggestions'), reCaptchaContainer = jQuery('#divDynamicRecaptcha'), captcha = jQuery('#inputCaptcha'), idnLanguage = jQuery('#idnLanguageSelector'); jQuery('.field-error-msg').hide(); if (idnLanguage.is(':visible')) { idnLanguage.slideUp(); idnLanguage.find('select').val(''); } domainLookupCallCount = 0; // check a domain has been entered if (!inputDomain.val()) { inputDomain.tooltip('show'); inputDomain.focus(); return; } inputDomain.tooltip('hide'); if (jQuery('#captchaContainer').length) { validate_captcha(frmDomain); return; } reCaptchaContainer.tooltip('hide'); captcha.tooltip('hide'); // disable repeat submit and show loader jQuery('#btnCheckAvailability').attr('disabled', 'disabled').addClass('disabled'); jQuery('.domain-lookup-result').hide(); jQuery('.domain-lookup-loader').show(); // reset elements suggestions.find('div:not(.actions)').hide(); suggestions.find('.clone').remove(); jQuery('div.panel-footer.more-suggestions').hide() .find('a').show().end() .find('span.no-more').hide(); jQuery('.btn-add-to-cart').removeAttr('disabled') .find('span').hide().end() .find('span.to-add').show(); // fade in results if (jQuery('#DomainSearchResults').not(":visible")) { jQuery('.domain-pricing').fadeOut('fast', function() { jQuery('#DomainSearchResults').fadeIn(); }); } var lookup = WHMCS.http.jqClient.post( WHMCS.utils.getRouteUrl('/domain/check'), frmDomain.serialize() + '&type=domain', 'json' ), spotlight = WHMCS.http.jqClient.post( WHMCS.utils.getRouteUrl('/domain/check'), frmDomain.serialize() + '&type=spotlight', 'json' ), suggestion = WHMCS.http.jqClient.post( WHMCS.utils.getRouteUrl('/domain/check'), frmDomain.serialize() + '&type=suggestions', 'json' ); // primary lookup handler lookup.done(function (data) { if (typeof data != 'object' || data.result.length == 0) { jQuery('.domain-lookup-primary-loader').hide(); return; } jQuery.each(data.result, function(index, domain) { var pricing = null, result = jQuery('#primaryLookupResult'), available = result.find('.domain-available'), availablePrice = result.find('.domain-price'), contactSupport = result.find('.domain-contact-support'), unavailable = result.find('.domain-unavailable'), unavailableTld = result.find('.domain-tld-unavailable'), invalid = result.find('.domain-invalid'), error = result.find('.domain-error'); jQuery('.domain-lookup-primary-loader').hide(); result.find('.btn-add-to-cart').removeClass('checkout'); result.show(); if (typeof domain !== 'string' && !domain.error && domain.isValidDomain) { pricing = domain.pricing; unavailable.hide(); contactSupport.hide(); unavailableTld.hide(); invalid.hide(); error.hide(); if (domain.isAvailable && typeof pricing !== 'string') { if (domain.domainName !== domain.idnDomainName && idnLanguage.not(':visible')) { idnLanguage.slideDown(); } if (domain.preferredTLDNotAvailable) { unavailableTld.show().find('strong').html(domain.originalUnavailableTld); } available.show().find('strong').html(domain.domainName); availablePrice.show().find('span.price').html(pricing[Object.keys(pricing)[0]].register).end() .find('button').attr('data-domain', domain.domainName); } else { available.hide(); availablePrice.hide(); contactSupport.hide(); if (domain.preferredTLDNotAvailable) { unavailableTld.show().find('strong').html(domain.originalUnavailableTld); } else { unavailable.show().find('strong').html(domain.domainName); } if (typeof pricing === 'string' && pricing == 'ContactUs') { contactSupport.show(); } } } else { available.hide(); availablePrice.hide(); unavailable.hide(); unavailableTld.hide(); contactSupport.hide(); invalid.hide(); error.hide(); var done = false, reg = /
/, errors = []; if (!domain.isValidDomain && domain.domainErrorMessage) { invalid.text(domain.domainErrorMessage); } else if (domain.error || index === 'error') { if (typeof domain === 'string') { error.text(domain); } else if (!domain.error.match(reg)) { error.text(domain.error); } else { error.text(''); errors = domain.error.split(reg); for(var i=0; i < errors.length; i++) { var errorMsg = errors[i]; if (errorMsg.length) { if (error.text()) { // only add line break if there is // multiple lines of text error.append('
'); } error.append(jQuery('
').text(errorMsg)); } } } error.show(); done = true; } if (!done) { invalid.show(); } } }); }).always(function() { hasDomainLookupEnded(); }); // spotlight lookup handler spotlight.done(function(data) { if (typeof data != 'object' || data.result.length == 0 || data.result.error) { jQuery('.domain-lookup-spotlight-loader').hide(); return; } jQuery.each(data.result, function(index, domain) { var tld = domain.tldNoDots, pricing = domain.pricing, result = jQuery('#spotlight' + tld + ' .domain-lookup-result'); jQuery('.domain-lookup-spotlight-loader').hide(); result.find('button').removeClass('checkout').hide(); if (domain.isValidDomain) { if (domain.isAvailable && typeof pricing !== 'string') { if (domain.domainName !== domain.idnDomainName && idnLanguage.not(':visible')) { idnLanguage.slideDown(); } result.find('button.unavailable').hide().end() .find('button.invalid').hide().end() .find('span.available').html(pricing[Object.keys(pricing)[0]].register).show().end() .find('button').not('button.unavailable').not('button.invalid') .attr('data-domain', domain.domainName) .show(); result.find('button.domain-contact-support').hide(); } else { if (typeof pricing === 'string') { if (pricing == '') { result.find('button.unavailable').show(); } else { result.find('button.domain-contact-support').show(); } result.find('button.invalid').hide(); result.find('span.available').hide(); } else { result.find('button.invalid').hide().end() .find('button.unavailable').show().end() .find('span.available').hide(); } } } else { result.find('button.invalid:hidden').show().end() .find('span.available').hide().end() .find('button').not('button.invalid').hide(); } result.show(); }); }).always(function() { hasDomainLookupEnded(); }); // suggestions lookup handler suggestion.done(function (data) { if (typeof data != 'object' || data.result.length == 0 || data.result.error) { jQuery('.suggested-domains').fadeOut('fast', function() { jQuery(this).hide(); }); return; } else { jQuery('.suggested-domains').show(); } var suggestionCount = 1; jQuery.each(data.result, function(index, domain) { var tld = domain.tld, pricing = domain.pricing; suggestions.find('div:first').clone(true, true).appendTo(suggestions); var newSuggestion = suggestions.find('div.domain-suggestion').last(); newSuggestion.addClass('clone') .find('span.domain').html(domain.sld).end() .find('span.extension').html('.' + tld); if (typeof pricing === 'string') { newSuggestion.find('button.btn-add-to-cart').remove(); if (pricing != '') { newSuggestion.find('button.domain-contact-support').show().end() .find('span.price').hide(); } else { newSuggestion.remove(); } } else { if (domain.domainName !== domain.idnDomainName && idnLanguage.not(':visible')) { idnLanguage.slideDown(); } newSuggestion.find('button.btn-add-to-cart').attr('data-domain', domain.domainName).end() .find('span.price').html(pricing[Object.keys(pricing)[0]].register); } if (suggestionCount <= 10) { newSuggestion.show(); } suggestionCount++; if (domain.group) { newSuggestion.find('span.promo') .addClass(domain.group) .show(); newSuggestion.find('span.sales-group-' + domain.group) .show(); } furtherSuggestions = suggestions.find('div.domain-suggestion.clone:hidden').length; if (furtherSuggestions > 0) { jQuery('div.more-suggestions').show(); } }); jQuery('.domain-lookup-suggestions-loader').hide(); jQuery('#domainSuggestions').show(); }).always(function() { hasDomainLookupEnded(); }); }); jQuery('.btn-add-to-cart').on('click', function() { if (jQuery(this).hasClass('checkout')) { window.location = whmcsBaseUrl + '/cart.php?a=confdomains'; return; } var domain = jQuery(this).attr('data-domain'), buttons = jQuery('button[data-domain="' + domain + '"]'), whois = jQuery(this).attr('data-whois'), isProductDomain = jQuery(this).hasClass('product-domain'), btnDomainContinue = jQuery('#btnDomainContinue'), resultDomain = jQuery('#resultDomain'), resultDomainPricing = jQuery('#resultDomainPricingTerm'), idnLanguage = jQuery('#idnLanguageSelector'), idnLanguageInput = idnLanguage.find('select'); if (idnLanguage.is(':visible') && !idnLanguageInput.val()) { idnLanguageInput.showInputError(); return; } buttons.find('span.to-add').hide(); buttons.find('span.loading').show(); var sideOrder = ((jQuery(this).parents('.spotlight-tlds').length > 0) || (jQuery(this).parents('.suggested-domains').length > 0)) ? 1 : 0; var addToCart = WHMCS.http.jqClient.post( whmcsBaseUrl + '/cart.php', { a: 'addToCart', domain: domain, token: csrfToken, whois: whois, sideorder: sideOrder, idnlanguage: idnLanguageInput.val() }, 'json' ).done(function (data) { buttons.find('span.loading').hide(); if (data.result === 'added') { buttons.find('span.added').show(); if (!isProductDomain) { buttons.removeAttr('disabled').addClass('checkout'); } if (resultDomain.length && !resultDomain.val()) { resultDomain.val(domain); resultDomainPricing.val(data.period).attr('name', 'domainsregperiod[' + domain +']'); if (btnDomainContinue.length > 0 && btnDomainContinue.is(':disabled')) { btnDomainContinue.removeAttr('disabled'); } } jQuery('#cartItemCount').html(data.cartCount); } else { buttons.find('span.available.price').hide(); buttons.find('span.unavailable').show(); buttons.attr('disabled', 'disabled'); } }); }); jQuery('#frmDomainTransfer').submit(function (e) { e.preventDefault(); if ( typeof recaptchaValidationComplete !== 'undefined' && typeof recaptchaType !== 'undefined' && recaptchaType === 'invisible' && recaptchaValidationComplete === false ) { return; } var frmDomain = jQuery('#frmDomainTransfer'), transferButton = jQuery('#btnTransferDomain'), inputDomain = jQuery('#inputTransferDomain'), authField = jQuery('#inputAuthCode'), domain = inputDomain.val(), authCode = authField.val(), redirect = false, reCaptchaContainer = jQuery('#divDynamicRecaptcha'), captcha = jQuery('#inputCaptcha'); if (!domain) { inputDomain.tooltip('show'); inputDomain.focus(); return false; } inputDomain.tooltip('hide'); if (jQuery('#captchaContainer').length) { validate_captcha(frmDomain); return; } reCaptchaContainer.tooltip('hide'); captcha.tooltip('hide'); transferButton.attr('disabled', 'disabled').addClass('disabled') .find('span').show().end() .find('.loader').show(); WHMCS.http.jqClient.post( frmDomain.attr('action'), frmDomain.serialize(), null, 'json' ).done(function (data) { if (typeof data != 'object') { transferButton.find('span').hide().end() .find('#addToCart').show().end() .removeAttr('disabled').removeClass('disabled'); return false; } var result = data.result; if (result == 'added') { window.location = whmcsBaseUrl + '/cart.php?a=confdomains'; redirect = true; } else { if (result.isRegistered == true) { if (result.epp == true && !authCode) { authField.tooltip('show'); authField.focus(); } } else { jQuery('#transferUnavailable').html(result.unavailable) .fadeIn('fast', function() { setTimeout(function(input) { input.fadeOut('fast'); }, 3000, jQuery(this) ); } ); } } }).always(function () { if (redirect == false) { transferButton.find('span').hide().end() .find('#addToCart').show().end() .removeAttr('disabled').removeClass('disabled'); } }); }); jQuery("#btnEmptyCart").click(function() { jQuery('#modalEmptyCart').modal('show'); }); jQuery("#cardType li a").click(function (e) { e.preventDefault(); jQuery("#selectedCardType").html(jQuery(this).html()); jQuery("#cctype").val(jQuery('span.type', this).html().trim()); }); jQuery(document).on('click', '.domain-contact-support', function(e) { e.preventDefault(); var child = window.open(); child.opener = null; child.location = 'submitticket.php'; }); jQuery('#frmConfigureProduct input:visible, #frmConfigureProduct select:visible').first().focus(); jQuery('#frmProductDomain input[type=text]:visible').first().focus(); jQuery('#frmDomainChecker input[type=text]:visible').first().focus(); jQuery('#frmDomainTransfer input[type=text]:visible').first().focus(); jQuery('.checkout .mc-promo .btn-add').click(function(e) { var self = jQuery(this), productKey = self.data('product-key'), upSellBox = jQuery('#promo_' + productKey); self.attr('disabled', 'disabled') .find('span.arrow i').removeClass('fa-chevron-right').addClass('fa-spinner fa-spin'); WHMCS.http.jqClient.post( window.location.pathname, { 'a': 'addUpSell', 'product_key': productKey, 'checkoutModal': true, 'token': csrfToken }, function (data) { if (typeof data.modal !== 'undefined') { openModal( data.modal, '', data.modalTitle, '', '', data.modalSubmit, data.modelSubmitId ); return; } if (data.done) { jQuery('#totalCartPrice').text(data.newTotal); upSellBox.fadeOut(); } }, 'json' ); }); jQuery('.viewcart .mc-promo .btn-add').click(function(e) { var self = jQuery(this); self.attr('disabled', 'disabled') .find('span.arrow i').removeClass('fa-chevron-right').addClass('fa-spinner fa-spin'); WHMCS.http.jqClient.post( window.location.pathname, { 'a': 'addUpSell', 'product_key': self.data('product-key'), 'token': csrfToken }, function (data) { if (typeof data.modal !== 'undefined') { openModal( data.modal, '', data.modalTitle, '', '', data.modalSubmit, data.modelSubmitId ); return; } window.location.reload(true); }, 'json' ); }); jQuery(document).on('click', '#btnAddUpSellCheckout', function(e) { var upsellModalForm = jQuery('#upsellModalForm'); WHMCS.http.jqClient.post( whmcsBaseUrl + '/cart.php', upsellModalForm.serialize(), function (data) { if (data.done){ jQuery('#totalCartPrice').text(data.newTotal); } }, 'json' ); return false; }); var useCreditOnCheckout = jQuery('#iCheck-useCreditOnCheckout'), skipCreditOnCheckout = jQuery('#iCheck-skipCreditOnCheckout'); useCreditOnCheckout.on('ifChecked', function() { var radio = jQuery('#useCreditOnCheckout'), selectedPaymentMethod = jQuery('input[name="paymentmethod"]:checked'), selectedCC = jQuery('input[name="ccinfo"]:checked'), isCcSelected = selectedPaymentMethod.hasClass('is-credit-card'), firstNonCcGateway = jQuery('input[name="paymentmethod"]') .not(jQuery('input.is-credit-card[name="paymentmethod"]')) .first(), container = jQuery('#paymentGatewaysContainer'), existingCardInfo = jQuery('#existingCardInfo'), ccInputFields = jQuery('#creditCardInputFields'), spanFullCredit = jQuery('#spanFullCredit'), shouldHideContainer = true; if (radio.prop('checked')) { if (spanFullCredit.is(':hidden')) { shouldHideContainer = false; } if (isCcSelected && firstNonCcGateway.length !== 0) { firstNonCcGateway.iCheck('check'); ccInputFields.slideUp(); if (shouldHideContainer) { container.slideUp(); } } else if (!isCcSelected && container.is(':visible')) { if (shouldHideContainer) { container.slideUp(); } } else if ((!shouldHideContainer || isCcSelected) && !container.is(":visible")) { ccInputFields.slideDown(); container.slideDown(); } if (isCcSelected && selectedCC.val() !== 'new') { if (spanFullCredit.is(':visible')) { hideCvcOnCheckoutForExistingCard = '1'; existingCardInfo.hide().find('input').attr('disabled', 'disabled'); } else { existingCardInfo.show().find('input').removeAttr('disabled'); } } } }); skipCreditOnCheckout.on('ifChecked', function() { var selectedPaymentMethod = jQuery('input[name="paymentmethod"]:checked'), selectedCC = jQuery('input[name="ccinfo"]:checked'), isCcSelected = selectedPaymentMethod.hasClass('is-credit-card'), existingCardInfo = jQuery('#existingCardInfo'), container = jQuery('#paymentGatewaysContainer'); if (!container.is(":visible")) { container.slideDown(); } if (isCcSelected) { hideCvcOnCheckoutForExistingCard = '0'; if (selectedCC.val() !== 'new') { existingCardInfo.show().find('input').removeAttr('disabled'); } jQuery('#creditCardInputFields').slideDown(); } }); var applyCreditContainer = jQuery('#applyCreditContainer'); if ( applyCreditContainer.is(':visible') && applyCreditContainer.data('apply-credit') === 1 && useCreditOnCheckout.length ) { skipCreditOnCheckout.iCheck('check'); useCreditOnCheckout.iCheck('check'); } jQuery('#domainRenewals, #serviceRenewals').find('span.added').hide().end().find('span.to-add').find('i').hide(); jQuery('.btn-add-renewal-to-cart').on('click', function() { var self = jQuery(this); var selfOuterWidth = self.outerWidth(); var postUrl; var postData; if (jQuery('#serviceRenewals').length >= 1) { var serviceId = self.data('service-id'); if (serviceId.toString().startsWith('a-')) { postUrl = WHMCS.utils.getRouteUrl('/cart/service/' + serviceId.substr(2) + '/addon/renew'); } else { postUrl = WHMCS.utils.getRouteUrl('/cart/service/' + serviceId + '/product/renew'); } postData = { token: csrfToken }; } else { var domainId = self.data('domain-id'); postUrl = WHMCS.utils.getRouteUrl('/cart/domain/renew/add'); postData = { domainId: domainId, period: jQuery('#renewalPricing' + domainId).val(), token: csrfToken }; } if (self.hasClass('checkout')) { window.location = whmcsBaseUrl + '/cart.php?a=view'; return; } self.attr('disabled', 'disabled').each(function() { self.find('i').fadeIn('fast').end(); }); WHMCS.http.jqClient.post( postUrl, postData, null, 'json' ).done(function (data) { self.find('span.to-add').hide(); if (data.result === 'added') { self.find('span.added').show().end().find('i').fadeOut('fast') self.css('width', selfOuterWidth); } recalculateRenewalTotals(); }); }); jQuery(document).on('submit', '#removeRenewalForm', function(e) { e.preventDefault(); var buttonId = '#renewDomain'; if (jQuery('#serviceRenewals').length >= 1) { buttonId = '#renewService'; } WHMCS.http.jqClient.post( whmcsBaseUrl + '/cart.php', jQuery(this).serialize() + '&ajax=1' ).done(function(data) { var domainId = data.i; var button = jQuery(buttonId + domainId); button.attr('disabled', 'disabled').each(function() { jQuery(this).find('span.added').hide().end() .removeClass('checkout').find('span.to-add').show().end().removeAttr('disabled'); jQuery(this).css('width', ''); }); }).always(function () { jQuery('#modalRemoveItem').modal('hide'); recalculateRenewalTotals(); }); }); jQuery('.select-renewal-pricing').on('change', function() { var self = jQuery(this), domainId = self.data('domain-id'), button = jQuery('#renewDomain' + domainId); button.attr('disabled', 'disabled').each(function() { jQuery(this).css('width', jQuery(this).outerWidth()); jQuery(this).find('span.added').hide().end() .removeClass('checkout').find('span.to-add').show().end().removeAttr('disabled'); }); }); jQuery('#domainRenewalFilter').on('input', function() { var inputText = jQuery(this).val().toLowerCase(); jQuery('#domainRenewals').find('div.domain-renewal').filter(function() { jQuery(this).toggle(jQuery(this).data('domain').toLowerCase().indexOf(inputText) > -1); }); }); jQuery('#serviceRenewalFilter').on('input', function() { var inputText = jQuery(this).val().toLowerCase(); var hasMatchingInputs = function matchInputs(element, input) { var isInputMatched = false; if (inputText.length > 0) { jQuery('#hideShowServiceRenewalButton').find('span.to-show').hide().end() .find('span.to-hide').show().end().removeAttr('disabled'); } jQuery.each(element.data(), function(key, value) { if (String(value).toLowerCase().indexOf(input) > -1) { isInputMatched = true; return false; } }); element.toggle(isInputMatched); return isInputMatched; } jQuery('#serviceRenewals').find('.service-renewal').filter(function() { var serviceRenewals = jQuery(this); var addonRenewals = serviceRenewals.find('.addon-renewals'); var hasMatchingAddonItem = false; if (addonRenewals.length > 0) { addonRenewals.find('.service-renewal').filter(function() { hasMatchingAddonItem = hasMatchingInputs(jQuery(this), inputText); }); } if (hasMatchingAddonItem) { serviceRenewals.toggle(true); } else { hasMatchingInputs(serviceRenewals, inputText); } addonRenewals.toggle(hasMatchingAddonItem); }); }); // Hide/show Non-Renewable Services and Service Addons jQuery(this).find('span.to-hide').hide().end() .find('span.to-show').show().end().removeAttr('disabled'); hideNoneRenewableServices(); jQuery('#hideShowServiceRenewalButton').on('click', function() { if (jQuery(this).find('span.to-show').is(":hidden")) { jQuery(this).find('span.to-hide').hide().end() .find('span.to-show').show().end().removeAttr('disabled'); hideNoneRenewableServices(); } else { jQuery(this).find('span.to-show').hide().end() .find('span.to-hide').show().end().removeAttr('disabled'); showNoneRenewableServices(); } }); checkoutForm = jQuery('#frmCheckout'); if (checkoutForm.length) { checkoutForm.on('submit', validateCheckoutCreditCardInput); checkoutForm.on('submit.paymentjs', function (event) { WHMCS.payment.event.checkoutFormSubmit( {...whmcsPaymentModuleMetadata, ...{event: event}}, WHMCS.payment.event.previouslySelected.module, jQuery(this) ); }); } jQuery(".payment-methods:checked").trigger('ifChecked'); if (existingCardContainer.is(':visible') && existingCardContainer.find('input.existing-card').length > 0) { newCardInfo.slideUp(); } }); //checkoutForm function validateCheckoutCreditCardInput(e) { var newOrExisting = jQuery('input[name="ccinfo"]:checked').val(), submitButton = checkoutForm.find('*[type="submit"]'), cardType = null, submit = true, selectedPaymentMethod = checkoutForm.find('input[name="paymentmethod"]:checked'), isCreditCardGateway = selectedPaymentMethod.hasClass('is-credit-card'), isRemoteCard = selectedPaymentMethod.data('payment-type') === 'RemoteCreditCard', cardNumber = jQuery('#inputCardNumber'); checkoutForm.find('.form-group').removeClass('has-error'); checkoutForm.find('.field-error-msg').hide(); if (isCreditCardGateway && !isRemoteCard) { var cvvField = checkoutForm.find('#inputCardCVV2'); if (newOrExisting === 'new') { cvvField = checkoutForm.find('#inputCardCVV'); cardType = jQuery.payment.cardType(checkoutForm.find('#inputCardNumber').val()); if (!jQuery.payment.validateCardNumber(checkoutForm.find('#inputCardNumber').val()) || cardNumber.hasClass('unsupported')) { var error = cardNumber.data('message-invalid'); if (cardNumber.hasClass('unsupported')) { error = cardNumber.data('message-unsupported'); } checkoutForm.find('#inputCardNumber').setInputError(error).showInputError(); submit = false; } if ( !jQuery.payment.validateCardExpiry( checkoutForm.find('#inputCardExpiry').payment('cardExpiryVal') ) ) { checkoutForm.find('#inputCardExpiry').showInputError(); submit = false; } } if (cvvField.is(':visible') && !jQuery.payment.validateCardCVC(cvvField.val(), cardType)) { cvvField.showInputError(); submit = false; } if (!submit) { submitButton.prop('disabled', false) .removeClass('disabled') .find('i') .removeAttr('class') .addClass('fas fa-arrow-circle-right'); e.preventDefault(); } } } function hasDomainLookupEnded() { domainLookupCallCount++; if (domainLookupCallCount == 3) { jQuery('#btnCheckAvailability').removeAttr('disabled').removeClass('disabled'); } } function hasProductDomainLookupEnded(total, button) { domainLookupCallCount++; if (domainLookupCallCount == total) { button.removeAttr('disabled').removeClass('disabled'); jQuery('input[name="domainoption"]').iCheck('enable'); } } function domainGotoNextStep() { jQuery("#domainLoadingSpinner").show(); jQuery("#frmProductDomainSelections").submit(); } function removeItem(type, num, renewalType = null) { if (renewalType !== null) { jQuery('#inputRemoveItemRenewalType').val(renewalType); } jQuery('#inputRemoveItemType').val(type); jQuery('#inputRemoveItemRef').val(num); jQuery('#modalRemoveItem').modal('show'); } function updateConfigurableOptions(i, billingCycle) { WHMCS.http.jqClient.post(whmcsBaseUrl + '/cart.php', 'a=cyclechange&ajax=1&i='+i+'&billingcycle='+billingCycle, function(data) { var co = jQuery('#productConfigurableOptions'), add = jQuery('#productAddonsContainer'); if (co.length) { co.html(jQuery(data).find('#productConfigurableOptions').html()); } if (add.length) { add.html(jQuery(data).find('#productAddonsContainer').html()); } jQuery('input').iCheck({ inheritID: true, checkboxClass: 'icheckbox_square-blue', radioClass: 'iradio_square-blue', increaseArea: '20%' }); } ); recalctotals(); } function recalctotals() { if (!jQuery("#orderSummaryLoader").is(":visible")) { jQuery("#orderSummaryLoader").fadeIn('fast'); } var thisRequestId = Math.floor((Math.random() * 1000000) + 1); window.lastSliderUpdateRequestId = thisRequestId; var post = WHMCS.http.jqClient.post(whmcsBaseUrl + '/cart.php', 'ajax=1&a=confproduct&calctotal=true&'+jQuery("#frmConfigureProduct").serialize()); post.done( function(data) { if (thisRequestId == window.lastSliderUpdateRequestId) { jQuery("#producttotal").html(data); } } ); post.always( function() { jQuery("#orderSummaryLoader").delay(500).fadeOut('slow'); } ); } function recalculateRenewalTotals() { var routePath = '/cart/domain/renew/calculate'; if (jQuery('#serviceRenewals').length >= 1) { routePath = '/cart/service/renew/calculate'; } if (!jQuery("#orderSummaryLoader").is(":visible")) { jQuery("#orderSummaryLoader").fadeIn('fast'); } var thisRequestId = Math.floor((Math.random() * 1000000) + 1); window.lastSliderUpdateRequestId = thisRequestId; WHMCS.http.jqClient.get( WHMCS.utils.getRouteUrl(routePath) ).done(function(data) { if (thisRequestId === window.lastSliderUpdateRequestId) { jQuery("#producttotal").html(data.body); } }).always( function() { jQuery("#orderSummaryLoader").delay(500).fadeOut('slow'); } ); } function selectDomainPricing(domainName, price, period, yearsString, suggestionNumber) { jQuery("#domainSuggestion" + suggestionNumber).iCheck('check'); jQuery("[name='domainsregperiod[" + domainName + "]']").val(period); jQuery("[name='" + domainName + "-selected-price']").html('
' + ' ' + period + ' ' + yearsString + ' @ ' + price); } function selectDomainPeriodInCart(domainName, price, period, yearsString) { var loader = jQuery("#orderSummaryLoader"); if (loader.not(':visible')) { loader.fadeIn('fast'); } jQuery("[name='" + domainName + "Pricing']").html(period + ' ' + yearsString + '
'); jQuery("[name='" + domainName + "Price']").html(price); var update = WHMCS.http.jqClient.post( window.location.pathname, { domain: domainName, period: period, a: 'updateDomainPeriod', token: csrfToken } ); update.done( function(data) { if (data.forceReload) { window.location.reload(); return; } data.domains.forEach(function(domain) { jQuery("[name='" + domain.domain + "Price']").parent('div').find('.renewal-price').html( domain.prefixedRenewPrice + domain.shortRenewalYearsLanguage ); }); jQuery('#subtotal').html(data.subtotal); if (data.promotype) { jQuery('#discount').html(data.discount); } if (data.taxrate) { jQuery('#taxTotal1').html(data.taxtotal); } if (data.taxrate2) { jQuery('#taxTotal2').html(data.taxtotal2); } var recurringSpan = jQuery('#recurring'); recurringSpan.find('span:visible').not('span.cost').fadeOut('fast'); if (data.totalrecurringannually) { jQuery('#recurringAnnually').fadeIn('fast').find('.cost').html(data.totalrecurringannually); } if (data.totalrecurringbiennially) { jQuery('#recurringBiennially').fadeIn('fast').find('.cost').html(data.totalrecurringbiennially); } if (data.totalrecurringmonthly) { jQuery('#recurringMonthly').fadeIn('fast').find('.cost').html(data.totalrecurringmonthly); } if (data.totalrecurringquarterly) { jQuery('#recurringQuarterly').fadeIn('fast').find('.cost').html(data.totalrecurringquarterly); } if (data.totalrecurringsemiannually) { jQuery('#recurringSemiAnnually').fadeIn('fast').find('.cost').html(data.totalrecurringsemiannually); } if (data.totalrecurringtriennially) { jQuery('#recurringTriennially').fadeIn('fast').find('.cost').html(data.totalrecurringtriennially); } jQuery('#totalDueToday').html(data.total); } ); update.always( function() { loader.delay(500).fadeOut('slow'); } ); } function loadMoreSuggestions() { var suggestions = jQuery('#domainSuggestions'), suggestionCount; for (suggestionCount = 1; suggestionCount <= 10; suggestionCount++) { if (furtherSuggestions > 0) { suggestions.find('div.domain-suggestion.clone:hidden:first').slideDown(); furtherSuggestions = suggestions.find('div.domain-suggestion.clone:hidden').length; } else { jQuery('div.more-suggestions').find('a').addClass('hidden').end().find('span.no-more').removeClass('hidden'); return; } } } function validate_captcha(form) { let reCaptcha = jQuery('#g-recaptcha-response'), reCaptchaContainer = jQuery('#divDynamicRecaptcha'), captcha = jQuery('#inputCaptcha'); if (reCaptcha.length && !reCaptcha.val()) { reCaptchaContainer.tooltip('show'); return false; } if (captcha.length && !captcha.val()) { captcha.tooltip('show'); return false; } var validate = WHMCS.http.jqClient.post( form.attr('action'), form.serialize() + '&a=validateCaptcha', null, 'json' ); validate.done(function(data) { if (data.error) { jQuery('#inputCaptcha, .recaptcha-container').attr('data-original-title', data.error).tooltip('show'); if (captcha.length) { jQuery('#inputCaptchaImage').replaceWith( '
' ); } } else { jQuery('#captchaContainer').remove(); form.trigger('submit'); } }); } function selectPreferredCard() { var methods = jQuery('input[name="ccinfo"]:visible'), select = methods.first(), preferred = methods.filter('[data-order-preference=0]'); if (preferred.length) { select = preferred; } select.iCheck('check'); } function showNoneRenewableServices() { jQuery('.service-renewal, .addon-renewals').each(function () { if (jQuery(this).attr('data-is-renewable') === 'false') { jQuery(this).show(); } }); } function hideNoneRenewableServices() { jQuery('.service-renewal, .addon-renewals').each(function (i, element) { var isRenewable = jQuery(this).attr('data-is-renewable'); if (isRenewable === 'false') { if (hasRenewableServiceAddon(element)) { jQuery(this).show(); } else { jQuery(this).hide(); } } else if (isRenewable === 'true' ) { jQuery(this).show(); } }); } function hasRenewableServiceAddon(data) { var hasService = false; jQuery(data).find('div.service-renewal').each(function (i, element) { if (jQuery(element).attr('data-is-renewable') === 'true') { return hasService = true; } }); return hasService; }