var wp_optimize = window.wp_optimize || {};/** * Send an action via admin-ajax.php. * * @param {string} action The action to send * @param {[type]} data Data to send * @param {Function} callback Will be called with the results * @param {boolean} json_parse JSON parse the results * @param {object} options Optional extra options; current properties supported are 'timeout' (in milliseconds) * * @return {JSON} */ wp_optimize.send_command = function (action, data, callback, json_parse, options) {json_parse = ('undefined' === typeof json_parse) ? true : json_parse;if (!data) data = {}; // If the command doesn't have the property, default to true if (!data.hasOwnProperty('include_ui_elements')) { data.include_ui_elements = true; }var ajax_data = { action: 'wp_optimize_ajax', subaction: action, nonce: wp_optimize_send_command_data.nonce, data: data };var args = { type: 'post', data: ajax_data, success: function (response) { if (json_parse) { try { var resp = wpo_parse_json(response); } catch (e) { console.log(e); console.log(response); alert(wpoptimize.error_unexpected_response); return; } // If result == false and and error code is provided, show the error and return. if (!resp.result && resp.hasOwnProperty('error_code') && resp.error_code) { wp_optimize.notices.show_notice(resp.error_code, resp.error_message); return; } if ('function' === typeof callback) callback(resp); } else { if (!response.result && response.hasOwnProperty('error_code') && response.error_code) { wp_optimize.notices.show_notice(response.error_code, response.error_message); return; } if ('function' === typeof callback) callback(response); } } };// Eventually merge options if ('object' === typeof options) { if (options.hasOwnProperty('timeout')) { args.timeout = options.timeout; } if (options.hasOwnProperty('error') && 'function' === typeof options.error) { args.error = options.error; } }return jQuery.ajax(ajaxurl, args); };/** * JS notices */ wp_optimize.notices = { errors: [], show_notice: function(error_code, error_message) { // WPO main page if (jQuery('#wp-optimize-wrap').length) { if (!this.notice) this.add_notice(); this.notice.show(); if (!this.errors[error_code]) { this.errors[error_code] = jQuery('

').html(error_message).appendTo(this.notice).data('error_code', error_code); } // Post edit page } else if (window.wp && wp.hasOwnProperty('data')) { wp.data.dispatch('core/notices').createNotice( 'error', 'WP-Optimize: ' + error_message, { isDismissible: true } ); // Other locations } else { alert('WP-Optimize: ' + error_message); } }, add_notice: function() { this.notice_container = jQuery('

').prependTo('#wp-optimize-wrap'); this.notice = jQuery('
'); this.notice.appendTo(this.notice_container); this.notice.on('click', '.notice-dismiss', function(e) { this.notice.hide().find('p').remove(); this.errors = []; }.bind(this)); } };/** * Parse JSON string, including automatically detecting unwanted extra input and skipping it * * @param {string|object} json_mix_str - JSON string which need to parse and convert to object * * @throws SyntaxError|String (including passing on what JSON.parse may throw) if a parsing error occurs. * * @return mixed parsed JSON object. Will only return if parsing is successful (otherwise, will throw) */ function wpo_parse_json(json_mix_str) { // When using wp_send_json to return the value, the format is already parsed. if ('object' === typeof json_mix_str) return json_mix_str;// Just try it - i.e. the 'default' case where things work (which can include extra whitespace/line-feeds, and simple strings, etc.). try { var result = JSON.parse(json_mix_str); return result; } catch (e) { console.log("WPO: Exception when trying to parse JSON (1) - will attempt to fix/re-parse"); console.log(json_mix_str); }var json_start_pos = json_mix_str.indexOf('{'); var json_last_pos = json_mix_str.lastIndexOf('}');// Case where some php notice may be added after or before json string if (json_start_pos > -1 && json_last_pos > -1) { var json_str = json_mix_str.slice(json_start_pos, json_last_pos + 1); try { var parsed = JSON.parse(json_str); return parsed; } catch (e) { console.log("WPO: Exception when trying to parse JSON (2) - will attempt to fix/re-parse based upon bracket counting");var cursor = json_start_pos; var open_count = 0; var last_character = ''; var inside_string = false;// Don't mistake this for a real JSON parser. Its aim is to improve the odds in real-world cases seen, not to arrive at universal perfection. while ((open_count > 0 || cursor == json_start_pos) && cursor <= json_last_pos) {var current_character = json_mix_str.charAt(cursor);if (!inside_string && '{' == current_character) { open_count++; } else if (!inside_string && '}' == current_character) { open_count--; } else if ('"' == current_character && '\\' != last_character) { inside_string = inside_string ? false : true; }last_character = current_character; cursor++; }console.log("Started at cursor="+json_start_pos+", ended at cursor="+cursor+" with result following:"); console.log(json_mix_str.substring(json_start_pos, cursor));try { var parsed = JSON.parse(json_mix_str.substring(json_start_pos, cursor)); // console.log('WPO: JSON re-parse successful'); return parsed; } catch (e) { // Throw it again, so that our function works just like JSON.parse() in its behaviour. throw e; }} }throw "WPO: could not parse the JSON";} Virtual CFO - Bottom Line

We work side-by-side with you to help streamline your financial activities and accelerate growth

With our virtual CFO services, you can call in the financial reinforcements when you need them, or outsource and automate monthly tasks to take them off your to-do list.
Book a Callback

Benefits of using a Virtual CFO

Add value without compromising financial expertise
Gain a firm grasp on your business's financial levers
Have Access to a wider industry knowledge

PROBLEM

Most business owners are familiar with the challenges of managing their company's finances. As your company's revenue grows, so does the demand for your time. To sell your company in three to five years, you will need to improve your financial management. You may struggle to keep up with business trends. or assessing major trends and planning for the future. Furthermore, as a business owner, you will have to decide when to delegate your responsibilities to others.

SOLUTION

We believe that we can assist you in resolving all of your concerns. Our business acumen and expertise have been honed through our work with cloud-based accounting software. We always collaborate with key decision-makers to achieve the best results for your business. As a result, we place a premium on adaptability and flexibility in all of our work.

VIRTUAL CFO Services

 Strategic
 Planning
Budgeting
KPI
Development
Stakeholder Management
Fundraising
Acquisition/ Exit
or M&A
Health Check/
Clean-up of books
Cashflow
Management
Custom
Reporting
Systems &
Processes

© 2021 Copyright www.wordpress-1152305-4011116.cloudwaysapps.com All rights reserved
Website Designed by Wow Ventures. Brand Design by Pass the Salt.

arrow-up