HEX
Server: Apache
System: Linux d5123.usc1.stableserver.net 5.14.0-570.17.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Sat May 24 12:53:17 EDT 2025 x86_64
User: d5123 (1001)
PHP: 8.4.21
Disabled: NONE
Upload Files
File: /home/d5123/myboofola_com/wp-content/plugins/codistoconnect/connect.php
<?php

/**

 * Plugin Name: Codisto Channel Cloud

 * Plugin URI: http://wordpress.org/plugins/codistoconnect/

 * Description: Sell multichannel on Google, Amazon, eBay & Walmart direct from WooCommerce. Create listings & sync products, inventory & orders directly from WooCommerce

 * Author: Codisto

 * Author URI: https://codisto.com/

 * Version: 1.3.65

 * Text Domain: codisto-linq

 * Woo: 3545890:ba4772797f6c2c68c5b8e0b1c7f0c4e2

 * WC requires at least: 2.0.0

 * WC tested up to: 6.3.1

 * License: GPLv2

 * License URI: http://www.gnu.org/licenses/gpl-2.0.html

 *

 * @package Codisto LINQ by Codisto

 * @version 1.3.65

 */



if ( ! defined( 'ABSPATH' ) ) {

	exit; // Exit if accessed directly.

}



define( 'CODISTOCONNECT_VERSION', '1.3.65' );

define( 'CODISTOCONNECT_RESELLERKEY', '' );



if ( ! class_exists( 'CodistoConnect' ) ) :



final class CodistoConnect {



	private $ping = null;



	protected static $_instance = null;



	/**

	* method callback for query_vars filter

	*

	* @param array $vars array appended to with query variables to match

	* @return array passed in $vars argument

	*/

	public function query_vars( $vars ) {



		$vars[] = 'codisto';

		$vars[] = 'codisto-proxy-route';

		$vars[] = 'codisto-sync-route';

		return $vars;

	}



	/**

	* method callback for nocache_headers filter

	*

	* @param array $headers array with current no-cache headers

	* @return array resultant no-cache headers

	*/

	public function nocache_headers( $headers ) {



		if ( isset( $_GET['page'] ) &&

			substr( $_GET['page'], 0, 7 ) === 'codisto' &&

			$_GET['page'] !== 'codisto-templates' ) {

			$headers = array(

				'Cache-Control' => 'private, max-age=0',

				'Expires' => gmdate( 'D, d M Y H:i:s', time() - 300 ) . ' GMT'

			);

		}



		return $headers;

	}



	/**

	* checks incoming request to see if satisfies shared key auth

	*

	* @return bool true for valid request, false for invalid request

	*/

	private function check_hash() {



		if ( ! isset( $_SERVER['HTTP_X_CODISTONONCE'] ) ||

			! isset( $_SERVER['HTTP_X_CODISTOKEY'] ) ) {

			$this->sendHttpHeaders(

				'400 Security Error',

				array(

					'Content-Type' => 'application/json',

					'Cache-Control' => 'no-cache, no-store',

					'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

					'Pragma' => 'no-cache'

				)

			);



			echo $this->json_encode( array( 'ack' => 'error', 'message' => 'Security Error - Missing Headers' ) );

			return false;

		}



		$r = get_option( 'codisto_key' ) . $_SERVER['HTTP_X_CODISTONONCE'];

		$base = hash( 'sha256', $r, true );

		$checkHash = base64_encode( $base );

		if ( ! hash_equals( $_SERVER['HTTP_X_CODISTOKEY'], $checkHash ) ) {

			$this->sendHttpHeaders(

				'400 Security Error',

				array(

					'Content-Type' => 'application/json',

					'Cache-Control' => 'no-cache, no-store',

					'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

					'Pragma' => 'no-cache'

				)

			);



			echo $this->json_encode( array( 'ack' => 'error', 'message' => 'Security Error' ) );

			return false;

		}



		return true;

	}



	/**

	* filter for woocommerce woocommerce_new_order_data

	*

	* @param array $order_data data for new order as presented to filter

	* @return array $order_data as passed in

	*/

	public function order_set_date( $order_data ) {



		// force order date



		return $order_data;

	}



	/**

	* filter for woocommerce order emails

	*

	* @param bool $enabled flag for enabled status

	* @param object $object wc_email object

	* @return bool $enabled as false

	*/



	public function inhibit_order_emails( $enabled, $order ) {



		if($enabled && $order) {



			$orderId = $order->get_id();



			if( get_post_meta( $orderId, '_codisto_orderid' ) ) {



				return false;



			}



		}



		return $enabled;



	}



	/**

	* common http status and header output function

	*

	* @param integer $status the http status to send

	* @param array $headers an array of headers to send

	*/

	private function sendHttpHeaders( $status, $headers ) {



		if ( defined( 'ADVANCEDCACHEPROBLEM' ) &&

			false == strpos( $_SERVER['REQUEST_URI'], 'wp-admin') ) {

			$_SERVER['REQUEST_URI'] = '/wp-admin'.$_SERVER['REQUEST_URI'];

		}



		$statusheader = preg_split('/ /', $status, 2);

		status_header( intval($statusheader[0]), isset($statusheader[1]) ? $statusheader[1] : '' );

		foreach ( $headers as $header => $value ) {

			header( $header.': '.$value );

		}

	}



	/**

	* provides a forward / backward compatible json_encode

	*

	* @param any $arg value to encode

	* @return string json encdoed arg

	*/

	private function json_encode( $arg ) {

		if ( function_exists( 'wp_json_encode') ) {

			return wp_json_encode( $arg );

		} elseif ( function_exists( 'json_encode' ) ) {

			return json_encode( $arg );

		} else {

			throw new Exception( __( 'PHP missing json library - please upgrade php or wordpress', 'codisto-linq' ) );

		}

	}



	/**

	* helper function for retrieving a product from an id that caters to different versions of woocommerce

	*

	* @param integer $id product id to retrieve

	* @return object woocommerce product object

	*/

	private function get_product( $id ) {

		if ( function_exists( 'wc_get_product') ) {

			return wc_get_product( $id );

		} elseif ( function_exists( 'get_product') ) {

			return get_product( $id );

		} else {

			throw new Exception( __( 'WooCommerce wc_get_product function is missing - please reinstall or activate WooCommerce', 'codisto-linq' ) );

		}

	}



	/**

	* recursively scan a directory returning an array of all files contained within

	*

	* @param string $dir path to scan

	* @param string Optional. $prefix is used to prepend a path to each path in the output array

	* @return array array of files within directory passed as input

	*/

	private function files_in_dir( $dir, $prefix = '' ) {

		$dir = rtrim( $dir, '\\/' );

		$result = array();



		try {

			if ( is_dir( $dir ) ) {

				$scan = @scandir( $dir );



				if ( $scan !== false ) {

					foreach ( $scan as $f ) {

						if ( $f !== '.' and $f !== '..' ) {

							if ( is_dir( "$dir/$f" ) ) {

								$result = array_merge( $result, $this->files_in_dir( "$dir/$f", "$f/" ) );

							} else {

								$result[] = $prefix.$f;

							}

						}

					}

				}

			}



		} catch( Exception $e ) {



		}



		return $result;

	}



	/**

	* sync handler

	*

	* the end point that allows synchronisation of catalog, ebay template and order data

	* this function deliberately calls exit after emitting output to avoid the commnucations to the client

	* being fouled by other code that assumes it can harmlessly inject, for example html comments

	*/

	public function sync() {



		global $wp;

		global $wpdb;

		$wpdbsiteprefix = $wpdb->get_blog_prefix(get_current_blog_id());



		error_reporting( E_ERROR | E_PARSE );

		set_time_limit( 0 );



		@ini_set( 'display_errors', '1' );



		@ini_set( 'zlib.output_compression', 'Off' );

		@ini_set( 'output_buffering', 'Off' );

		@ini_set( 'output_handler', '' );



		while( ob_get_level() > 1 ) {

			@ob_end_clean();

		}

		if ( ob_get_level() > 0 ) {

			@ob_clean();

		}



		require_once( ABSPATH . 'wp-admin/includes/plugin.php' );



		if ( ! is_plugin_active( 'woocommerce/woocommerce.php' ) ) {

			$this->sendHttpHeaders(

				'500 Config Error',

				array(

					'Content-Type' => 'application/json',

					'Cache-Control' => 'no-cache, no-store',

					'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

					'Pragma' => 'no-cache'

				)

			);



			echo $this->json_encode( array( 'ack' => 'failed', 'message' => 'WooCommerce Deactivated' ) );

			exit();

		}



		// simulate admin context for sync of prices so appropriate filters run

		require_once( ABSPATH . 'wp-admin/includes/admin.php' );

		set_current_screen( 'dashboard' );



		$type = $wp->query_vars['codisto-sync-route'];

		if ( strtolower( $_SERVER['REQUEST_METHOD'] ) == 'get' ) {

			if ( $type == 'test' ||

				( $type == 'sync' && preg_match( '/\/sync\/testHash\?/', $_SERVER['REQUEST_URI'] ) )

			) {

				if ( ! $this->check_hash() ) {

					exit();

				}



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);



				echo $this->json_encode( array( 'ack' => 'ok' ) );

			} elseif ( $type === 'settings' ) {



				if ( ! $this->check_hash() ) {

					exit();

				}



				$logo_url = get_header_image();



				if ( function_exists( 'site_logo' ) ) {

					$logo = site_logo()->logo;

					$logo_id = get_theme_mod( 'custom_logo' );

					$logo_id = $logo_id ? $logo_id : $logo['id'];



					if ( $logo_id ) {

						$logo_url = wp_get_attachment_image_src( $logo_id, 'full' );

						$logo_url = $logo_url[0];

					}

				}



				$currency = get_option( 'woocommerce_currency' );



				$dimension_unit = get_option( 'woocommerce_dimension_unit' );



				$weight_unit = get_option( 'woocommerce_weight_unit' );



				$default_location = explode( ':', get_option( 'woocommerce_default_country' ) );



				$country_code = isset( $default_location[0] ) ? $default_location[0] : '';

				$state_code = isset( $default_location[1] ) ? $default_location[1] : '';



				$shipping_tax_class = get_option( 'woocommerce_shipping_tax_class' );



				$blogdescription = preg_replace( '/[\x0C\x0D]/', ' ', preg_replace( '/[\x00-\x1F\x7F]/', '', get_option( 'blogdescription' ) ) );



				$response = array(

					'ack' => 'ok',

					'store_name' => $blogdescription,

					'logo' => $logo_url,

					'currency' => $currency,

					'dimension_unit' => $dimension_unit,

					'weight_unit' => $weight_unit,

					'country_code' => $country_code,

					'state_code' => $state_code,

					'shipping_tax_class' => $shipping_tax_class,

					'version' => CODISTOCONNECT_VERSION

				);



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);



				echo $this->json_encode( $response );

				exit();



			} elseif ( $type === 'tax' ) {



				if ( ! $this->check_hash() ) {

					exit();

				}



				$tax_enabled = true;

				if ( function_exists( 'wc_tax_enabled' ) ) {

					$tax_enabled = wc_tax_enabled();

				} else {

					$tax_enabled = get_option( 'woocommerce_calc_taxes' ) === 'yes';

				}



				if ( $tax_enabled ) {

					$rates = $wpdb->get_results( "SELECT tax_rate_country AS country, tax_rate_state AS state, tax_rate AS rate, tax_rate_name AS name, tax_rate_class AS class, tax_rate_order AS sequence, tax_rate_priority AS priority FROM `{$wpdbsiteprefix}woocommerce_tax_rates` ORDER BY tax_rate_order" );

				} else {

					$rates = array();

				}



				$response = array( 'ack' => 'ok', 'tax_rates' => $rates );



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);



				echo $this->json_encode( $response );

				exit();



			} elseif ( $type === 'products' ) {



				if ( ! $this->check_hash() ) {

					exit();

				}



				$page = isset( $_GET['page'] ) ? (int)$_GET['page'] : 0;

				$count = isset( $_GET['count'] ) ? (int)$_GET['count'] : 0;



				$product_ids = isset( $_GET['product_ids'] ) ? json_decode( wp_unslash( $_GET['product_ids'] ) ) : null;



				if ( ! is_null( $product_ids ) ) {

					if ( ! is_array( $product_ids ) ) {

						$product_ids = array( $product_ids );

					}



					$product_ids = array_filter( $product_ids, "is_numeric");



					if ( ! isset( $_GET['count'] ) ) {

						$count = count( $product_ids );

					}

				}



				$products = $wpdb->get_results(

					$wpdb->prepare(

						"SELECT id AS id ".

						"FROM `{$wpdbsiteprefix}posts` AS P ".

						"WHERE post_type = 'product' ".

						"		AND post_status IN ('publish', 'future', 'pending', 'private') ".

						"	".( is_array( $product_ids ) ? 'AND id IN ('.implode( ',', $product_ids ).')' : '' )."".

						"ORDER BY ID LIMIT %d, %d",

					$page * $count,

					$count

					)

				);



				if ( ! is_array( $product_ids )

					&& $page === 0

				) {

					$total_count = $wpdb->get_var( "SELECT COUNT(*) FROM `{$wpdbsiteprefix}posts` WHERE post_type = 'product' AND post_status IN ('publish', 'future', 'pending', 'private')" );

				}



				$acf_installed = function_exists( 'acf' );



				foreach ( $products as $product ) {



					$wc_product = $this->get_product( $product->id );



					if(!is_object($wc_product)) {

						continue;

					}



					$categoryproduct = $wc_product->get_categories();



					$product->sku = $wc_product->get_sku();

					$product->name = html_entity_decode( apply_filters( 'woocommerce_product_title', $wc_product->post->post_title, $wc_product ), ENT_COMPAT | ENT_HTML401, 'UTF-8' );

					$product->enabled = $wc_product->is_purchasable() && ( $wc_product->managing_stock() || $wc_product->is_in_stock() );

					$product->price = $wc_product->get_price_excluding_tax();

					$product->listprice = floatval( $wc_product->get_regular_price() );

					$product->is_taxable = $wc_product->is_taxable();

					$product->tax_class = $wc_product->get_tax_class();

					$product->stock_control = $wc_product->managing_stock();

					$product->stock_level = $wc_product->get_stock_quantity();

					if ( method_exists( $wc_product, 'get_type' ) ) {

						$product->type = $wc_product->get_type();

					} else {

						$product->type = $wc_product->product_type;

					}

					$product->description = apply_filters( 'the_content', $wc_product->post->post_content );

					$product->short_description = apply_filters( 'the_content', $wc_product->post->post_excerpt );



					if ( method_exists( $wc_product, 'get_width' ) ) {

						$product->width = $wc_product->get_width();

						if ( ! is_numeric( $product->width ) ) {

							unset( $product->width );

						}

						$product->height = $wc_product->get_height();

						if ( ! is_numeric( $product->height ) ) {

							unset( $product->height );

						}

						$product->length = $wc_product->get_length();

						if ( ! is_numeric( $product->length ) ) {

							unset( $product->length );

						}

					} else {

						$product->length = $wc_product->length;

						$product->width = $wc_product->width;

						$product->height = $wc_product->height;

					}



					$product->weight = $wc_product->get_weight();

					if ( ! is_numeric( $product->weight ) ) {

						unset( $product->weight );

					}



					if (

						$product->is_taxable

						&& 'yes' === get_option( 'woocommerce_prices_include_tax' )

					) {

						$tax_rates = WC_Tax::get_shop_base_rate( $product->tax_class );

						$taxes = WC_Tax::calc_tax( $product->listprice , $tax_rates, true );

						$product->listprice = $product->listprice - array_sum( $taxes );

					}



					if ( $product->type == 'variable' ) {

						$product->skus = array();



						foreach ( $wc_product->get_children() as $child_id ) {



							$child_product = $wc_product->get_child( $child_id );



							if(!is_object($child_product)) {

								continue;

							}



							$img = wp_get_attachment_image_src( $child_product->get_image_id(), 'full' );

							$img = $img[0];



							$child_product_data = array(

												'id' => $child_id,

												'sku' => $child_product->get_sku(),

												'enabled' => $wc_product->is_purchasable() && ( $wc_product->managing_stock() || $wc_product->is_in_stock() ),

												'price' => $child_product->get_price_excluding_tax(),

												'listprice' => $child_product->get_regular_price(),

												'is_taxable' => $child_product->is_taxable(),

												'tax_class' => $child_product->get_tax_class(),

												'stock_control' => $child_product->managing_stock(),

												'stock_level' => $child_product->get_stock_quantity(),

												'images' => array( array( 'source' => $img, 'sequence' => 0 ) ),

												'weight' => $child_product->get_weight()

											);



							$attributes = array();



							$termsmap = array();

							$names = array();



							foreach ( $child_product->get_variation_attributes() as $name => $value ) {



								$name = preg_replace( '/(pa_)?attribute_/', '', $name );



								if ( ! isset( $names[$name] ) ) {

									$names[$name] = true;

									$terms = get_terms( array( 'taxonomy' => $name ) );

									if ( $terms ) {

										foreach ( $terms as $term ) {

											$termsmap[$term->slug] = $term->name;

										}

									}

								}



								if ( $value && ( gettype( $value ) == 'string' || gettype( $value ) == 'integer' ) ) {

									if ( array_key_exists( $value, $termsmap ) ) {

										$newvalue = $termsmap[$value];

									} else {

										$newvalue = $value;

									}

								} else {

									$newvalue = '';

								}



								$name = wc_attribute_label( $name, $child_product );



								$attributes[] = array( 'name' => $name, 'value' => $newvalue, 'slug' => $value );



							}



							foreach ( get_post_custom_keys( $child_product->variation_id) as $attribute ) {



								if ( ! ( in_array(

										$attribute,

										array(

											'_sku',

											'_weight', '_length', '_width', '_height', '_thumbnail_id', '_virtual', '_downloadable', '_regular_price',

											'_sale_price', '_sale_price_dates_from', '_sale_price_dates_to', '_price',

											'_download_limit', '_download_expiry', '_file_paths', '_manage_stock', '_stock_status',

											'_downloadable_files', '_variation_description', '_tax_class', '_tax_status',

											'_stock', '_default_attributes', '_product_attributes', '_file_path', '_backorders'

										)

									)

									|| substr( $attribute, 0, 4 ) === '_wp_'

									|| substr( $attribute, 0, 13 ) === 'attribute_pa_' )

								) {



									$value = get_post_meta( $child_product->variation_id, $attribute, false );

									if ( is_array( $value ) ) {

										if ( count( $value ) === 1 ) {

											$value = $value[0];

										} else {

											$value = implode( ',', $value );

										}

									}



									$attributes[] = array( 'name' => $attribute, 'value' => $value, 'custom' => true );

								}

							}



							$child_product_data['attributes'] = $attributes;



							$product->skus[] = $child_product_data;

						}



						$productvariant = array();

						$variationattrs = get_post_meta( $product->id, '_product_attributes', true );

						$attribute_keys  = array_keys( $variationattrs );

						$attribute_total = sizeof( $attribute_keys );



						for ( $i = 0; $i < $attribute_total; $i ++ ) {

							$attribute = $variationattrs[ $attribute_keys[ $i ] ];



							$name = wc_attribute_label( $attribute['name'] );

							if ( $attribute['is_taxonomy'] ) {

								$valmap = array();

								$terms = get_terms( array( 'taxonomy' => $attribute['name'] ) );

								foreach ( $terms as $term ) {

									$valmap[] = $term->name;

								}

								$value = implode( '|', $valmap );



							} else {



								$value = $attribute['value'];

							}

							$sequence = $attribute['position'];



							$productvariant[] = array( 'name' => $name, 'values' => $value, 'sequence' => $sequence );

						}



						$product->variantvalues = $productvariant;



						$attrs = array();



						foreach ( $wc_product->get_variation_attributes() as $name => $value ) {



							$name = preg_replace( '/(pa_)?attribute_/', '', $name );



							if ( ! isset( $names[$name] ) ) {

								$names[$name] = true;

								$terms = get_terms( array( 'taxonomy' => $name ) );

								if ( $terms ) {

									foreach ( $terms as $term ) {

										$termsmap[$term->slug] = $term->name;

									}

								}

							}



							if ( $value && ( gettype( $value ) == 'string' || gettype( $value ) == 'integer' ) ) {

								if ( array_key_exists( $value, $termsmap ) ) {

									$newvalue = $termsmap[$value];

								} else {

									$newvalue = $value;

								}

							} else {

								$newvalue = '';

							}



							$name = wc_attribute_label( $name, $child_product );



							$attrs[] = array( 'name' => $name, 'value' => $newvalue, 'slug' => $value );

						}



						$product->options = $attrs;



					} elseif ( $product->type == 'grouped' ) {

						$product->skus = array();



						foreach ( $wc_product->get_children() as $child_id ) {



							$child_product = $wc_product->get_child( $child_id );



							if(!is_object($child_product)) {

								continue;

							}



							$child_product_data = array(

												'id' => $child_id,

												'price' => $child_product->get_price_excluding_tax(),

												'sku' => $child_product->get_sku(),

												'name' => $child_product->get_title()

											);



							$product->skus[] = $child_product_data;

						}

					}



					$product->categories = array();

					$product_categories = get_the_terms( $product->id, 'product_cat' );



					if ( is_array( $product_categories ) ) {

						$sequence = 0;

						foreach ( $product_categories as $category ) {



							$product->categories[] = array( 'category_id' => $category->term_id, 'sequence' => $sequence );



							$sequence++;

						}

					}



					$product->tags = array();

					$product_tags = get_the_terms( $product->id, 'product_tag' );



					if ( is_array( $product_tags ) ) {

						$sequence = 0;

						foreach ( $product_tags as $tag ) {

							$product->tags[] = array( 'tag' => $tag->name, 'sequence' => $sequence );

							$sequence++;

						}

					}



					$image_sequence = 1;

					$product->images = array();



					$imagesUsed = array();



					$primaryimage_path = wp_get_attachment_image_src( $wc_product->get_image_id(), 'full' );

					$primaryimage_path = $primaryimage_path[0];



					if ( $primaryimage_path ) {

						$product->images[] = array( 'source' => $primaryimage_path, 'sequence' => 0 );



						$imagesUsed[$primaryimage_path] = true;



						foreach ( $wc_product->get_gallery_attachment_ids() as $image_id ) {



							$image_path = wp_get_attachment_image_src( $image_id, 'full' );

							$image_path = $image_path[0];



							if ( ! array_key_exists( $image_path, $imagesUsed ) ) {



								$product->images[] = array( 'source' => $image_path, 'sequence' => $image_sequence );



								$imagesUsed[$image_path] = true;



								$image_sequence++;

							}

						}

					}



					$product->attributes = array();



					$attributesUsed = array();



					foreach ( $wc_product->get_attributes() as $attribute ) {



						if ( $product->type == 'simple' || ! $attribute['is_variation'] ) {

							if ( ! array_key_exists( $attribute['name'], $attributesUsed ) ) {

								$attributesUsed[$attribute['name']] = true;



								$attributeName = wc_attribute_label( $attribute['name'] );



								if ( ! $attribute['is_taxonomy'] ) {

									$product->attributes[] = array( 'name' => $attributeName, 'value' => $attribute['value'] );

								} else {

									$attributeValue = implode( ', ', wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) ) );



									$product->attributes[] = array( 'name' => $attributeName, 'value' => $attributeValue );

								}

							}

						}

					}



					foreach ( get_post_custom_keys( $product->id ) as $attribute ) {



						if ( ! ( substr( $attribute, 0, 1 ) === '_' ||

							substr( $attribute, 0, 3 ) === 'pa_' ) ) {



							if ( ! array_key_exists( $attribute, $attributesUsed ) ) {

								$attributesUsed[$attribute] = true;



								$value = get_post_meta( $product->id, $attribute, false );

								if ( is_array( $value ) ) {



									if ( count( $value ) === 1 ) {

										$value = $value[0];

									} else {

										$value = implode( ',', $value );

									}

								}

								$product->attributes[] = array( 'name' => $attribute, 'value' => $value );

							}

						} elseif ( $attribute === '_woocommerce_gpf_data' &&

							is_array($value) &&

							isset($value['gtin']) ) {

							$product->attributes[] = array( 'name' => '_woocommerce_gpf_data.gtin', 'value' => $value['gtin'] );

					 	}



					}



					// acf



					if ( $acf_installed ) {



						if ( function_exists( 'get_field_objects' ) ) {



							$fields = get_field_objects( $product->id );

							if ( is_array( $fields ) ) {



								foreach ( $fields as $field ) {



									if ( $field['type'] == 'image' ) {



										$image_path = $field['value']['url'];



										if ( !array_key_exists( $image_path, $imagesUsed ) ) {



											$product->images[] = array( 'source' => $image_path, 'sequence' => $image_sequence );



											$imagesUsed[$image_path] = true;



											$image_sequence++;

										}



									} elseif ( $field['type'] == 'gallery' ) {

										$gallery = $field['value'];



										if ( is_array( $gallery ) ) {



											foreach ( $gallery as $image ) {



												$image_path = $image['url'];



												if ( !array_key_exists( $image_path, $imagesUsed ) ) {



													$product->images[] = array( 'source' => $image_path, 'sequence' => $image_sequence );



													$imagesUsed[$image_path] = true;



													$image_sequence++;

												}

											}

										}

									}



									elseif ( in_array(

											$field['type'],

											array(

												'textarea',

												'wysiwyg',

												'text',

												'number',

												'select',

												'radio',

												'checkbox',

												'true_false'

											)

										)

									) {



										if ( !array_key_exists( $field['label'], $attributesUsed ) ) {



											$attributesUsed[$field['label']] = true;



											$value = $field['value'];

											if ( is_array( $value ) ) {



												if ( count( $value ) === 1) {

													$value = $value[0];

												} else {

													$value = implode( ',', $value );

												}

											}



											$product->attributes[] = array( 'name' => $field['name'], 'value' => $value );

										}

									}



									if ( !$product->description ) {



										if ( in_array( $field['type'], array( 'textarea', 'wysiwyg' ) ) &&

												$field['name'] == 'description' ) {

											$product->description = $field['value'];

										}

									}



								}

							}

						}

					}

				}



				$response = array( 'ack' => 'ok', 'products' => $products );

				if ( isset( $total_count ) ) {

					$response['total_count'] = $total_count;

				}



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);



				echo $this->json_encode( $response );

				exit();



			} elseif ( $type === 'categories' ) {



				if ( ! $this->check_hash() ) {



					exit();

				}



				$categories = get_categories( array( 'taxonomy' => 'product_cat', 'orderby' => 'term_order', 'hide_empty' => 0 ) );



				$result = array();



				foreach ( $categories as $category ) {



					$result[] = array(

								'category_id' => $category->term_id,

								'name' => $category->name,

								'parent_id' => $category->parent

							);

				}



				$response = array( 'ack' => 'ok', 'categories' => $result, 'total_count' => count( $categories ) );



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);



				echo $this->json_encode( $response );

				exit();



			} elseif ( $type === 'orders' ) {



				if ( ! $this->check_hash() ) {

					exit();

				}



				$page = isset( $_GET['page'] ) ? (int)$_GET['page'] : 0;

				$count = isset( $_GET['count'] ) ? (int)$_GET['count'] : 0;

				$merchantid = isset( $_GET['merchantid'] ) ? (int)$_GET['merchantid'] : 0;



				$orders = $wpdb->get_results(

					$wpdb->prepare(

						"SELECT (".

							"SELECT meta_value FROM `{$wpdbsiteprefix}postmeta` WHERE post_id = P.id AND meta_key = '_codisto_orderid' AND ".

								"(".

									"EXISTS ( SELECT 1 FROM `{$wpdbsiteprefix}postmeta` WHERE meta_key = '_codisto_merchantid' AND meta_value = %d AND post_id = P.id ) ".

									"OR NOT EXISTS ( SELECT 1 FROM `{$wpdbsiteprefix}postmeta` WHERE meta_key = '_codisto_merchantid' AND post_id = P.id ) ".

								")".

							") AS id, ".

						" ID AS post_id, post_status AS status FROM `{$wpdbsiteprefix}posts` AS P".

						" WHERE post_type = 'shop_order'".

						" AND post_date > DATE_SUB( CURRENT_TIMESTAMP(), INTERVAL 90 DAY )".

						" AND ID IN (".

							"SELECT post_id FROM `{$wpdbsiteprefix}postmeta` WHERE meta_key = '_codisto_orderid' AND (".

								"EXISTS ( SELECT 1 FROM `{$wpdbsiteprefix}postmeta` WHERE meta_key = '_codisto_merchantid' AND meta_value = %d AND post_id = P.id ) ".

								"OR NOT EXISTS ( SELECT 1 FROM `{$wpdbsiteprefix}postmeta` WHERE meta_key = '_codisto_merchantid' AND post_id = P.id ) ".

							")".

						") ORDER BY ID LIMIT %d, %d",

						$merchantid,

						$merchantid,

						$page * $count,

						$count

					)

				);



				if ( $page == 0 ) {

					$total_count = $wpdb->get_var(

						$wpdb->prepare(

							"SELECT COUNT(*) FROM `{$wpdbsiteprefix}posts` AS P WHERE post_type = 'shop_order' AND post_date > DATE_SUB( CURRENT_TIMESTAMP(), INTERVAL 90 DAY ) AND ID IN ( SELECT post_id FROM `{$wpdbsiteprefix}postmeta` WHERE meta_key = '_codisto_orderid' AND ( EXISTS ( SELECT 1 FROM `{$wpdbsiteprefix}postmeta` WHERE meta_key = '_codisto_merchantid' AND meta_value = %d AND post_id = P.id ) OR NOT EXISTS (SELECT 1 FROM `{$wpdbsiteprefix}postmeta` WHERE meta_key = '_codisto_merchantid' AND post_id = P.id )))",

							$merchantid

						)

					);

				}



				$order_data = array();



				foreach ( $orders as $order ) {



					$tracking_items = get_post_meta( $order->post_id, '_wc_shipment_tracking_items', true );

					$tracking_item = $tracking_items[0];



					if ( $tracking_items && class_exists( 'WC_Shipment_Tracking_Actions' ) ) {

						$shipmenttracking = WC_Shipment_Tracking_Actions::get_instance();

						$formatted = $shipmenttracking->get_formatted_tracking_item( $order->post_id, $tracking_item );



						if ( $tracking_item['date_shipped'] ) {



							if ( is_numeric( $tracking_item['date_shipped'] ) ) {

								$ship_date = date( 'Y-m-d H:i:s', $tracking_item['date_shipped'] );

							}



							$order->ship_date = $tracking_item['date_shipped'];



						}



						if ( $formatted['formatted_tracking_provider'] ) {



							$order->carrier = $formatted['formatted_tracking_provider'];



						}



						if ( $tracking_item['tracking_number'] ) {



							$order->track_number = $tracking_item['tracking_number'];



						}



					} elseif ($tracking_items && (class_exists('WC_Advanced_Shipment_Tracking_Actions') || class_exists('AST_Pro_Actions'))) {



						if ( $tracking_item['date_shipped'] ) {

							$order->ship_date = date('Y-m-d H:i:s', $tracking_item['date_shipped']);

						}



						if ( $tracking_item['tracking_provider'] ) {

							$order->carrier = $tracking_item['tracking_provider'];

						}



						if ( $tracking_item['tracking_number'] ) {

							$order->track_number = $tracking_item['tracking_number'];

						}



					} else {



						$tracking_object = get_post_meta( $order->post_id, 'wf_wc_shipment_source', true );

						if( $tracking_object

							&& is_array( $tracking_object )

							&& isset( $tracking_object['shipment_id_cs'] ) ) {



							$ship_date = date( 'Y-m-d H:i:s', strtotime( $tracking_object['order_date'] ) );

							if( $ship_date ) {



								$order->ship_date = $ship_date;



							}



							$carrier = $tracking_object['shipping_service'];

							if( $carrier ) {



								$order->carrier = $carrier;



							}



							$tracking_number = $tracking_object['shipment_id_cs'];

							if( $tracking_number ) {



								$order->track_number = $tracking_number;



							}



						}  else {



							$ship_date = get_post_meta( $order->post_id, '_date_shipped', true );

							if ( $ship_date ) {

								if ( is_numeric( $ship_date ) ) {

									$ship_date = date( 'Y-m-d H:i:s', $ship_date );

								}



								$order->ship_date = $ship_date;

							}



							$carrier = get_post_meta( $order->post_id, '_tracking_provider', true);

							if ( $carrier ) {

								if ( $carrier === 'custom' ) {

									$carrier = get_post_meta( $order->post_id, '_custom_tracking_provider', true );

								}



							} else {



								$carrier = get_post_meta( $order->post_id, '_wcst_order_trackname', true);



							}

							if($carrier)

							{

								$order->carrier = $carrier;

							}



							$tracking_number = get_post_meta( $order->post_id, '_tracking_number', true);

							if ( !$tracking_number ) {

								$tracking_number = get_post_meta( $order->post_id, '_wcst_order_trackno', true );

							}

							if($tracking_number)

							{

								$order->track_number = $tracking_number;

							}

						}

					}



					unset( $order->post_id );



					$order_data[] = $order;

				}



				$response = array( 'ack' => 'ok', 'orders' => $order_data );

				if ( isset( $total_count ) ) {

					$response['total_count'] = $total_count;

				}



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);



				echo $this->json_encode( $response );

				exit();



			} elseif ( $type == 'sync' ) {



				if ( $_SERVER['HTTP_X_ACTION'] === 'TEMPLATE' ) {



					if ( ! $this->check_hash() ) {

						exit();

					}



					$ebayDesignDir = WP_CONTENT_DIR . '/ebay/';



					$merchantid = (int)$_GET['merchantid'];

					if ( ! $merchantid ) {

						$merchantid = 0;

					}



					$templatedb = get_temp_dir() . '/ebay-template-'.$merchantid.'.db';



					if ( isset( $_GET['markreceived'] ) ) {



						$this->sendHttpHeaders(

							'200 OK',

							array(

								'Content-Type' => 'application/json',

								'Cache-Control' => 'no-cache, must-revalidate',

								'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

								'Pragma' => 'no-cache'

							)

						);



						echo $this->json_encode( array( 'ack' => 'ok' ) );

						exit();



					} else {



						$filelist = $this->files_in_dir( $ebayDesignDir );



						$filestozip = array();



						foreach ( $filelist as $key => $name ) {

							try {



								$fileName = $ebayDesignDir.$name;



								if ( ! in_array( $name, array( 'README' ) ) ) {



									array_push($filestozip, $fileName);



								}



							} catch( Exception $e ) {



							}

						}



						if ( sizeof( $filestozip ) == 0 ) {



							$this->sendHttpHeaders(

								'204 No Content',

								array(

									'Cache-Control' => 'no-cache, must-revalidate',

									'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

									'Pragma' => 'no-cache'

								)

							);



						} else {



							require_once( ABSPATH . 'wp-admin/includes/class-pclzip.php' );



							$tmpfile = wp_tempnam();

							$zipfile = new PclZip( $tmpfile );

							$zipsuccess = $zipfile->create( $filestozip , PCLZIP_OPT_REMOVE_PATH, $ebayDesignDir );

							if ($zipsuccess) {

								$headers = array(

									'Cache-Control' => 'no-cache, must-revalidate',

									'Pragma' => 'no-cache',

									'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

									'X-Codisto-Content-Type' => 'application/zip',

									'Content-Type' => 'application/zip, application/octet-stream',

									'Content-Disposition' => 'attachment; filename=' . basename( $zipfile ),

									'Content-Length' => filesize( $tmpfile )

								);



								$this->sendHttpHeaders( '200 OK', $headers );



								while( ob_get_level() > 0 ) {

									if ( ! @ob_end_clean() )

										break;

								}



								flush();



								readfile( $tmpfile );

							} else {

								$this->sendHttpHeaders(

									'200 OK',

									array(

										'Content-Type' => 'application/json',

										'Cache-Control' => 'no-cache, no-store',

										'X-Codisto-Content-Type' => 'application/json',

										'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

										'Pragma' => 'no-cache'

									)

								);

								echo $this->json_encode( array('error'=>$zipfile->errorInfo(true)) );

							}



						}



						unlink( $tmpfile );



						exit();



					}

				}



			} elseif ( $type == "sites" ) {



				$response = array( 'ack' => 'ok' );



				if( is_multisite() ) {



					$sites = array();



					$sitelist = get_sites();

					foreach( $sitelist as $site ) {



						$sites[] = get_object_vars( $site );



					}



					$response['sites'] = $sites;



				}



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'X-Codisto-Content-Type' => 'application/json',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);

				echo $this->json_encode( $response );

				exit();



			} elseif ( $type == "siteverification" ) {



				$response = array( 'ack' => 'ok' );



				$siteverification = get_option( 'codisto_site_verification' );



				if( $siteverification ) {



					$response['siteverification'] = $siteverification;



				}



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'X-Codisto-Content-Type' => 'application/json',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);

				echo $this->json_encode( $response );

				exit();



			} elseif ( $type == "paymentmethods" ) {



				$response = array( 'ack' => 'ok' );



				$gateways = WC()->payment_gateways->payment_gateways();



				$paymentmethods = array();



				foreach( $gateways as $paymentmethod ) {



					$paymentmethods[] = get_object_vars( $paymentmethod );



				}



				$response['paymentmethods'] = $paymentmethods;



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'X-Codisto-Content-Type' => 'application/json',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);

				echo $this->json_encode( $response );

				exit();



			} elseif ( $type == "shipping" ) {



				$response = array( 'ack' => 'ok' );



				$shippingmethodlist = WC()->shipping->get_shipping_methods();



				$shippingmethods = array();



				foreach( $shippingmethodlist as $shippingmethod ) {



					$shippingmethods[] = get_object_vars( $shippingmethod );



				}



				$response['shippingmethods'] = $shippingmethods;



				$zoneslist = WC_Shipping_Zones::get_zones();



				$shippingzones = array();



				foreach( $zoneslist as $zone ) {



					$shippingzones[] = get_object_vars( $zone );



				}



				$response['shippingzones'] = $shippingzones;



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'X-Codisto-Content-Type' => 'application/json',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);

				echo $this->json_encode( $response );

				exit();



			} elseif ( $type == "conversiontracking" ) {



				$response = array( 'ack' => 'ok' );



				$conversiontracking = get_option( 'codisto_conversion_tracking' );



				if( $conversiontracking ) {



					$response['conversiontracking'] = $conversiontracking;



				}



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'X-Codisto-Content-Type' => 'application/json',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);

				echo $this->json_encode( $response );

				exit();



			}



		} else {



			if ( $type === 'createorder' ) {



				if ( ! $this->check_hash() ) {

					exit();

				}



				try {



					$xml = simplexml_load_string( file_get_contents( 'php://input' ) );



					$ordercontent = $xml->entry->content->children( 'http://api.codisto.com/schemas/2009/' );



					$wpdb->query( 'SET TRANSACTION ISOLATION LEVEL SERIALIZABLE' );

					$wpdb->query( 'START TRANSACTION' );



					$billing_address = $ordercontent->orderaddresses->orderaddress[0];

					$shipping_address = $ordercontent->orderaddresses->orderaddress[1];



					$billing_first_name = $billing_last_name = '';

					if ( strpos( $billing_address->name, ' ') !== false ) {

						$billing_name = explode( ' ', $billing_address->name, 2 );

						$billing_first_name = $billing_name[0];

						$billing_last_name = $billing_name[1];

					} else {

						$billing_first_name = (string)$billing_address->name;

					}



					$billing_country_code = (string)$billing_address->countrycode;

					$billing_division = (string)$billing_address->division;



					$billing_states = WC()->countries->get_states( $billing_country_code );



					if ( $billing_states ) {

						$billing_division_match = preg_replace( '/\s+/', '', strtolower( $billing_division ) );



						foreach ( $billing_states as $state_code => $state_name ) {

							if ( preg_replace( '/\s+/', '', strtolower( $state_name ) ) == $billing_division_match ) {

								$billing_division = $state_code;

								break;

							}

						}

					}



					$shipping_first_name = $shipping_last_name = '';

					if ( strpos( $shipping_address->name, ' ' ) !== false ) {

						$shipping_name = explode( ' ', $shipping_address->name, 2 );

						$shipping_first_name = $shipping_name[0];

						$shipping_last_name = $shipping_name[1];

					} else {

						$shipping_first_name = (string)$shipping_address->name;

					}



					$shipping_country_code = (string)$shipping_address->countrycode;

					$shipping_division = (string)$shipping_address->division;



					if ( $billing_country_code === $shipping_country_code ) {

						$shipping_states = $billing_states;

					} else {

						$shipping_states = WC()->countries->get_states( $shipping_country_code );

					}



					if ( $shipping_states ) {

						$shipping_division_match = preg_replace( '/\s+/', '', strtolower( $shipping_division ) );



						foreach ( $shipping_states as $state_code => $state_name ) {

							if ( preg_replace( '/\s+/', '', strtolower( $state_name ) ) == $shipping_division_match ) {

								$shipping_division = $state_code;

								break;

							}

						}

					}



					$amazonorderid = (string)$ordercontent->amazonorderid;

					if ( ! $amazonorderid ) {

						$amazonorderid = '';

					}



					$amazonfulfillmentchannel = (string)$ordercontent->amazonfulfillmentchannel;

					if ( ! $amazonfulfillmentchannel ) {

						$amazonfulfillmentchannel = '';

					}



					$ebayusername = (string)$ordercontent->ebayusername;

					if ( ! $ebayusername ) {

						$ebayusername = '';

					}



					$ebaysalesrecordnumber = (string)$ordercontent->ebaysalesrecordnumber;

					if ( ! $ebaysalesrecordnumber ) {

						$ebaysalesrecordnumber = '';

					}



					$ebaytransactionid = (string)$ordercontent->ebaytransactionid;

					if ( ! $ebaytransactionid ) {

						$ebaytransactionid = '';

					}



					$address_data = array(

								'billing_first_name'	=> $billing_first_name,

								'billing_last_name'		=> $billing_last_name,

								'billing_company'		=> (string)$billing_address->companyname,

								'billing_address_1'		=> (string)$billing_address->address1,

								'billing_address_2'		=> (string)$billing_address->address2,

								'billing_city'			=> (string)$billing_address->place,

								'billing_postcode'		=> (string)$billing_address->postalcode,

								'billing_state'			=> $billing_division,

								'billing_country'		=> $billing_country_code,

								'billing_email'			=> (string)$billing_address->email,

								'billing_phone'			=> (string)$billing_address->phone,

								'shipping_first_name'	=> $shipping_first_name,

								'shipping_last_name'	=> $shipping_last_name,

								'shipping_company'		=> (string)$shipping_address->companyname,

								'shipping_address_1'	=> (string)$shipping_address->address1,

								'shipping_address_2'	=> (string)$shipping_address->address2,

								'shipping_city'			=> (string)$shipping_address->place,

								'shipping_postcode'		=> (string)$shipping_address->postalcode,

								'shipping_state'		=> $shipping_division,

								'shipping_country'		=> $shipping_country_code,

								'shipping_email'		=> (string)$shipping_address->email,

								'shipping_phone'		=> (string)$shipping_address->phone,

							);



					$order_id = null;



					if ( isset( $ordercontent->wooneworderpush )

						&& $ordercontent->wooneworderpush != null

						&& (string)$ordercontent->wooneworderpush == 'true' ) {



						if(!empty( $ordercontent->orderid )

							&& !empty( $ordercontent->ordernumber )

							&& intval( $ordercontent->orderid ) !== intval( $ordercontent->ordernumber ) ) {



							$order_id_sql = "SELECT post_id AS ID FROM `{$wpdbsiteprefix}postmeta` " .

							"WHERE post_id = %d AND (meta_key = '_codisto_merchantid' AND meta_value = %d) " .

							"LIMIT 1";



							$order_id = $wpdb->get_var( $wpdb->prepare( $order_id_sql, (int) $ordercontent->ordernumber, (int) $ordercontent->merchantid ) );



						}



						if(!$order_id) {



							$order_id_sql = "SELECT PM.post_id as ID FROM `{$wpdbsiteprefix}postmeta` AS PM " .

							"INNER JOIN `{$wpdbsiteprefix}postmeta` AS PM2 ON " .

							"(PM2.post_id = PM.post_id AND PM2.meta_key = '_codisto_merchantid' AND PM2.meta_value = %d) " .

							"WHERE (PM.meta_key = '_codisto_orderid' AND PM.meta_value = %d) " .

							"LIMIT 1";



							$order_id = $wpdb->get_var( $wpdb->prepare( $order_id_sql, (int) $ordercontent->merchantid, (int) $ordercontent->orderid ) );

						}



					} else {



						$order_id_sql = "SELECT ID FROM `{$wpdbsiteprefix}posts` AS P WHERE EXISTS (SELECT 1 FROM `{$wpdbsiteprefix}postmeta` " .

						" WHERE meta_key = '_codisto_orderid' AND meta_value = %d AND post_id = P.ID ) " .

						" AND (".

							" EXISTS (SELECT 1 FROM `{$wpdbsiteprefix}postmeta` WHERE meta_key = '_codisto_merchantid' AND meta_value = %d AND post_id = P.ID)" .

							" OR NOT EXISTS (SELECT 1 FROM `{$wpdbsiteprefix}postmeta` WHERE meta_key = '_codisto_merchantid' AND post_id = P.ID)"

						.")" .

						" LIMIT 1";



						$order_id = $wpdb->get_var( $wpdb->prepare( $order_id_sql, (int)$ordercontent->orderid, (int)$ordercontent->merchantid ) );



					}



					$email = (string)$billing_address->email;

					if ( ! $email ) {

						$email = (string)$shipping_address->email;

					}



					if ( $email ) {



						$userid = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM `{$wpdbsiteprefix}users` WHERE user_email = %s", $email ) );

						if ( ! $userid &&  ! $order_id && (true === apply_filters( 'woocommerce_create_account_default_checked', false )) ) {

							$username = $ebayusername;

							if ( ! $username ) {

								$username = current( explode( '@', $email ) );

							}



							if ( $username ) {

								$username = sanitize_user( $username );

							}



							if ( username_exists( $username ) ) {

								$counter = 1;

								$newusername = $username.$counter;



								while( username_exists( $newusername ) ) {

									$counter++;

									$newusername = $username.$counter;

								}



								$username = $newusername;

							}



							$password = wp_generate_password();



							$customer_data = apply_filters(

								'woocommerce_new_customer_data',

								array(

									'user_login' => $username,

									'user_pass'  => $password,

									'user_email' => $email,

									'role'	   => 'customer'

								)

							);



							$customer_id = wp_insert_user( $customer_data );



							foreach ( $address_data as $key => $value ) {

								update_user_meta( $customer_id, $key, $value );

							}



							do_action( 'woocommerce_created_customer', $customer_id, $customer_data, true );

						} else {

							$customer_id = $userid;

						}

					} else {

						$customer_id = 0;

					}



					$customer_note = @count( $ordercontent->instructions ) ? strval( $ordercontent->instructions ) : '';

					$merchant_note = @count( $ordercontent->merchantinstructions ) ? strval( $ordercontent->merchantinstructions ) : '';



					$adjustStock = @count( $ordercontent->adjuststock ) ? ( ( $ordercontent->adjuststock == 'false' ) ? false : true ) : true;



					$shipping = 0;

					$shipping_tax = 0;

					$cart_discount = 0;

					$cart_discount_tax = 0;

					$total = (float)$ordercontent->defaultcurrencytotal;

					$tax = 0;



					if ( ! $order_id ) {



						$new_order_data_callback = array( $this, 'order_set_date' );



						add_filter( 'woocommerce_new_order_data', $new_order_data_callback, 1, 1 );



						$createdby = 'eBay';

						if ( $amazonorderid ) {

							$createdby = 'Amazon';

						}



						$order = wc_create_order( array( 'customer_id' => $customer_id, 'customer_note' => $customer_note, 'created_via' => $createdby ) );



						remove_filter( 'woocommerce_new_order_data', $new_order_data_callback );



						$order_id = $order->get_id();



						update_post_meta( $order_id, '_codisto_orderid', (int)$ordercontent->orderid );

						update_post_meta( $order_id, '_codisto_merchantid', (int)$ordercontent->merchantid );



						if ( $amazonorderid ) {

							update_post_meta( $order_id, '_codisto_amazonorderid', $amazonorderid );

						}

						if ( $amazonfulfillmentchannel ) {

							update_post_meta( $order_id, '_codisto_amazonfulfillmentchannel', $amazonfulfillmentchannel );

						}



						if ( $ebayusername ) {

							update_post_meta( $order_id, '_codisto_ebayusername', $ebayusername );

						}



						if ( $ebaysalesrecordnumber ) {

							update_post_meta( $order_id, '_codisto_ebaysalesrecordnumber', $ebaysalesrecordnumber );

						}



						if ( $ebaytransactionid ) {

							update_post_meta( $order_id, '_codisto_ebaytransactionid', $ebaytransactionid );

						}



						$defaultcurrency = @count( $ordercontent->defaultcurrency ) ? (string)$ordercontent->defaultcurrency : (string)$ordercontent->transactcurrency;



						update_post_meta( $order_id, '_order_currency', $defaultcurrency );

						update_post_meta( $order_id, '_customer_ip_address', '-' );

						delete_post_meta( $order_id, '_prices_include_tax' );



						do_action( 'woocommerce_new_order', $order_id, $order );



						foreach ( $ordercontent->orderlines->orderline as $orderline ) {

							if ( $orderline->productcode[0] != 'FREIGHT' ) {

								$productcode = (string)$orderline->productcode;

								if ( $productcode == null ) {

									$productcode = '';

								}

								$productname = (string)$orderline->productname;

								if ( $productname == null ) {

									$productname = '';

								}



								$product_id = $orderline->externalreference[0];

								if ( $product_id != null ) {

									$product_id = intval( $product_id );

								}



								$variation_id = 0;



								if ( get_post_type( $product_id ) === 'product_variation' ) {

									$variation_id = $product_id;

									$product_id = wp_get_post_parent_id( $variation_id );



									if ( ! is_numeric( $product_id ) || $product_id === 0 ) {

										$product_id = 0;

										$variation_id = 0;

									}

								}



								$qty = (int)$orderline->quantity[0];



								$item_id = wc_add_order_item(

									$order_id,

									array(

										'order_item_name' => $productname,

										'order_item_type' => 'line_item'

									)

								);



								wc_add_order_item_meta( $item_id, '_qty', $qty );



								if ( ! is_null( $product_id ) && $product_id !== 0 ) {

									wc_add_order_item_meta( $item_id, '_product_id', $product_id );

									wc_add_order_item_meta( $item_id, '_variation_id', $variation_id );

									wc_add_order_item_meta( $item_id, '_tax_class', '' );

								} else {

									wc_add_order_item_meta( $item_id, '_product_id', 0 );

									wc_add_order_item_meta( $item_id, '_variation_id', 0 );

									wc_add_order_item_meta( $item_id, '_tax_class', '' );

								}



								$line_total = wc_format_decimal( (float)$orderline->defaultcurrencylinetotal );

								$line_total_tax = wc_format_decimal( (float)$orderline->defaultcurrencylinetotalinctax - (float)$orderline->defaultcurrencylinetotal );



								wc_add_order_item_meta( $item_id, '_line_subtotal',	 $line_total );

								wc_add_order_item_meta( $item_id, '_line_total',		$line_total );

								wc_add_order_item_meta( $item_id, '_line_subtotal_tax', $line_total_tax );

								wc_add_order_item_meta( $item_id, '_line_tax',		  $line_total_tax );

								wc_add_order_item_meta( $item_id, '_line_tax_data',		array( 'total' => array( 1 => $line_total_tax ), 'subtotal' => array( 1 => $line_total_tax ) ) );



								$tax += $line_total_tax;



							} else {

								$method_id = (string)$orderline->productcode;

								if ( $method_id == null ) {

									$method_id = '';

								}

								$item_id = wc_add_order_item(

									$order_id,

									array(

										'order_item_name' 		=> (string)$orderline->productname,

										'order_item_type' 		=> 'shipping'

									)

								);



								wc_add_order_item_meta($item_id, 'method_id', $method_id);

								wc_add_order_item_meta( $item_id, 'cost', wc_format_decimal( (float)$orderline->defaultcurrencylinetotal) );

								wc_add_order_item_meta( $item_id, 'total_tax', wc_format_decimal( (float)$orderline->defaultcurrencylinetotalinctax - (float)$orderline->defaultcurrencylinetotal) );



								$shipping_tax_array = array (

									'total' => array (

										1=> (float)$orderline->defaultcurrencylinetotalinctax - (float)$orderline->defaultcurrencylinetotal,

									)

								);



								wc_add_order_item_meta( $item_id, 'taxes', $shipping_tax_array);

								$shipping += (float)$orderline->defaultcurrencylinetotal;

								$shipping_tax += (float)$orderline->defaultcurrencylinetotalinctax - (float)$orderline->defaultcurrencylinetotal;

							}

						}



						if ( $ordercontent->paymentstatus == 'complete' ) {

							$transaction_id = (string)$ordercontent->orderpayments[0]->orderpayment->transactionid;

							$paymentmethod = (string)$ordercontent->orderpayments[0]->orderpayment->paymentmethod;



							if ( $transaction_id  && preg_match('/paypal/i',$paymentmethod)) {

								update_post_meta( $order_id, '_payment_method', 'paypal' );

								update_post_meta( $order_id, '_payment_method_title', __( 'PayPal', 'woocommerce' ) );



								update_post_meta( $order_id, '_transaction_id', $transaction_id );

							} else {

								update_post_meta( $order_id, '_payment_method', 'bacs' );

								update_post_meta( $order_id, '_payment_method_title', __( 'BACS', 'woocommerce' ) );

							}



							// payment_complete

							add_post_meta( $order_id, '_paid_date', current_time( 'mysql' ), true );

							if ( $adjustStock && !get_post_meta( $order_id, '_order_stock_reduced', true ) ) {

								wc_maybe_reduce_stock_levels( $order_id );

							}

						}



						if ( $merchant_note ) {

							$order->add_order_note( $merchant_note, 0 );

						}



					} else {

						$order = wc_get_order( $order_id );



						if( is_object( $order ) ) {



							foreach ( $ordercontent->orderlines->orderline as $orderline ) {

								if ( $orderline->productcode[0] != 'FREIGHT' ) {

									$line_total = wc_format_decimal( (float)$orderline->defaultcurrencylinetotal );

									$line_total_tax = wc_format_decimal( (float)$orderline->defaultcurrencylinetotalinctax - (float)$orderline->defaultcurrencylinetotal );



									$tax += $line_total_tax;

								} else {

									$order->remove_order_items( 'shipping' );



									$item_id = wc_add_order_item(

										$order_id,

										array(

											'order_item_name' 		=> (string)$orderline->productname,

											'order_item_type' 		=> 'shipping'

										)

									);



									wc_add_order_item_meta( $item_id, 'cost', wc_format_decimal( (float)$orderline->defaultcurrencylinetotal) );

									wc_add_order_item_meta( $item_id, 'total_tax', wc_format_decimal( (float)$orderline->defaultcurrencylinetotalinctax - (float)$orderline->defaultcurrencylinetotal) );



									$shipping_tax_array = array (

										'total' => array (

											1=> (float)$orderline->defaultcurrencylinetotalinctax - (float)$orderline->defaultcurrencylinetotal,

										)

									);



									wc_add_order_item_meta( $item_id, 'taxes', $shipping_tax_array);

									$shipping += (float)$orderline->defaultcurrencylinetotal;

									$shipping_tax += (float)$orderline->defaultcurrencylinetotalinctax - (float)$orderline->defaultcurrencylinetotal;

								}

							}



							if ( $ordercontent->paymentstatus == 'complete' ) {

								$transaction_id = (string)$ordercontent->orderpayments[0]->orderpayment->transactionid;

								$paymentmethod = (string)$ordercontent->orderpayments[0]->orderpayment->paymentmethod;



								if ( $transaction_id  && preg_match('/paypal/i',$paymentmethod)) {

									update_post_meta( $order_id, '_payment_method', 'paypal' );

									update_post_meta( $order_id, '_payment_method_title', __( 'PayPal', 'woocommerce' ) );



									update_post_meta( $order_id, '_transaction_id', $transaction_id );

								} else {

									update_post_meta( $order_id, '_payment_method', 'bacs' );

									update_post_meta( $order_id, '_payment_method_title', __( 'BACS', 'woocommerce' ) );

								}



								// payment_complete

								add_post_meta( $order_id, '_paid_date', current_time( 'mysql' ), true );

								if ( $adjustStock && ! get_post_meta( $order_id, '_order_stock_reduced', true ) ) {

									wc_maybe_reduce_stock_levels( $order_id );

								}

							}

						}

					}



					if( is_object( $order ) ) {



						foreach ( $address_data as $key => $value ) {

							update_post_meta( $order_id, '_'.$key, $value );

						}



						$order->remove_order_items( 'tax' );

						$order->add_tax( 1, $tax, $shipping_tax );



						$order->set_total( $shipping, 'shipping' );

						$order->set_total( $shipping_tax, 'shipping_tax' );

						$order->set_total( $cart_discount, 'cart_discount' );

						$order->set_total( $cart_discount_tax, 'cart_discount_tax' );

						$order->set_total( $tax, 'tax' );

						$order->set_total( $total, 'total');



						if ( $ordercontent->orderstate == 'cancelled' ) {

							if ( ! $order->has_status( 'cancelled' ) ) {

								// update_status

								$order->set_status( 'cancelled' );

								$update_post_data  = array(

									'ID'		 	=> $order_id,

									'post_status'	=> 'wc-cancelled',

									'post_date'		=> current_time( 'mysql', 0 ),

									'post_date_gmt' => current_time( 'mysql', 1 )

								);

								wp_update_post( $update_post_data );



								$order->decrease_coupon_usage_counts();



								wc_delete_shop_order_transients( $order_id );

							}

						} elseif ( $ordercontent->orderstate == 'inprogress' || $ordercontent->orderstate == 'processing' ) {



							if ( $ordercontent->paymentstatus == 'complete' ) {

								if ( ! $order->has_status( 'processing' ) && ! $order->has_status( 'completed' )) {



									// update_status

									$order->set_status( 'processing' );

									$update_post_data  = array(

										'ID'		 	=> $order_id,

										'post_status'	=> 'wc-processing',

										'post_date'		=> current_time( 'mysql', 0 ),

										'post_date_gmt' => current_time( 'mysql', 1 )

									);

									wp_update_post( $update_post_data );

								}

							} else {

								if ( ! $order->has_status( 'pending' ) ) {

									// update_status

									$order->set_status( 'pending' );

									$update_post_data  = array(

										'ID'		 	=> $order_id,

										'post_status'	=> 'wc-pending',

										'post_date'		=> current_time( 'mysql', 0 ),

										'post_date_gmt' => current_time( 'mysql', 1 )

									);

									wp_update_post( $update_post_data );

								}

							}



						} elseif ( $ordercontent->orderstate == 'complete' ) {



							if ( ! $order->has_status( 'completed' ) ) {

								// update_status

								$order->set_status( 'completed' );

								$update_post_data  = array(

									'ID'		 	=> $order_id,

									'post_status'	=> 'wc-completed',

									'post_date'		=> current_time( 'mysql', 0 ),

									'post_date_gmt' => current_time( 'mysql', 1 )

								);

								wp_update_post( $update_post_data );



								$order->record_product_sales();



								$order->increase_coupon_usage_counts();



								update_post_meta( $order_id, '_completed_date', current_time( 'mysql' ) );



								wc_delete_shop_order_transients( $order_id );

							}



						}



						$order->save();



					}



					$wpdb->query( 'COMMIT' );



					$response = array( 'ack' => 'ok', 'orderid' => $order_id );



					$this->sendHttpHeaders(

						'200 OK',

						array(

							'Content-Type' => 'application/json',

							'Cache-Control' => 'no-cache, no-store',

							'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

							'Pragma' => 'no-cache'

						)

					);

					echo $this->json_encode( $response );

					exit();



				} catch( Exception $e ) {

					$wpdb->query( 'ROLLBACK' );



					$response = array( 'ack' => 'failed', 'message' => $e->getMessage() .'  '.$e->getFile().' '.$e->getLine()  );



					$this->sendHttpHeaders(

						'200 OK',

						array(

							'Content-Type' => 'application/json',

							'Cache-Control' => 'no-cache, no-store',

							'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

							'Pragma' => 'no-cache'

						)

					);

					echo $this->json_encode( $response );

					exit();

				}



			} elseif ( $type == 'sync' ) {



				if ( $_SERVER['HTTP_X_ACTION'] === 'TEMPLATE' ) {

					if ( ! $this->check_hash() ) {

						exit();

					}



					$ebayDesignDir = WP_CONTENT_DIR . '/ebay/';



					$tmpPath = wp_tempnam();



					@file_put_contents( $tmpPath, file_get_contents( 'php://input' ) );



					$db = new PDO( 'sqlite:' . $tmpPath );

					$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );



					$db->exec( 'PRAGMA synchronous=0' );

					$db->exec( 'PRAGMA temp_store=2' );

					$db->exec( 'PRAGMA page_size=65536' );

					$db->exec( 'PRAGMA encoding=\'UTF-8\'' );

					$db->exec( 'PRAGMA cache_size=15000' );

					$db->exec( 'PRAGMA soft_heap_limit=67108864' );

					$db->exec( 'PRAGMA journal_mode=MEMORY' );



					$files = $db->prepare( 'SELECT Name, Content FROM File' );

					$files->execute();



					$files->bindColumn( 1, $name );

					$files->bindColumn( 2, $content );



					while ( $files->fetch() ) {

						$fileName = $ebayDesignDir.$name;



						if ( strpos( $name, '..' ) === false ) {

							if ( ! file_exists( $fileName ) ) {

								$dir = dirname( $fileName );



								if ( ! is_dir( $dir ) ) {

									mkdir( $dir.'/', 0755, true );

								}



								@file_put_contents( $fileName, $content );

							}

						}

					}



					$db = null;

					unlink( $tmpPath );



					$this->sendHttpHeaders(

						'200 OK',

						array(

							'Content-Type' => 'application/json',

							'Cache-Control' => 'no-cache, no-store',

							'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

							'Pragma' => 'no-cache'

						)

					);

					echo $this->json_encode( array( 'ack' => 'ok' ) );

					exit();

				}



			} elseif ( $type == 'index/calc' ) {



				$product_ids = array();

				$quantities = array();



				for ( $i = 0; ; $i++ ) {

					if ( ! isset( $_POST['PRODUCTCODE('.$i.')'] ) ) {

						break;

					}



					$productid = (int)$_POST['PRODUCTID('.$i.')'];

					if ( ! $productid ) {

						$productcode = $_POST['PRODUCTCODE('.$i.')'];

						$productid = wc_get_product_id_by_sku( $productcode );

					}



					$productqty = $_POST['PRODUCTQUANTITY('.$i.')'];

					if ( ! $productqty && $productqty != 0 ) {

						$productqty = 1;

					}



					WC()->cart->add_to_cart( $productid, $productqty );

				}



				WC()->customer->set_location( $_POST['COUNTRYCODE'], $_POST['DIVISION'], $_POST['POSTALCODE'], $_POST['PLACE'] );

				WC()->customer->set_shipping_location( $_POST['COUNTRYCODE'], $_POST['DIVISION'], $_POST['POSTALCODE'], $_POST['PLACE'] );

				WC()->cart->calculate_totals();

				WC()->cart->calculate_shipping();



				$response = '';



				$idx = 0;

				$methods = WC()->shipping()->get_shipping_methods();

				foreach ( $methods as $method ) {

					if ( file_exists( plugin_dir_path( __FILE__ ).'shipping/'.$method->id ) ) {

						include( plugin_dir_path( __FILE__ ).'shipping/'.$method->id );

					} else {

						foreach ( $method->rates as $method => $rate ) {

							$method_name = $rate->get_label();

							if ( ! $method_name ) {

								$method_name = 'Shipping';

							}



							$method_cost = $rate->cost;

							if ( is_numeric( $method_cost) ) {

								if ( isset( $rate->taxes ) && is_array( $rate->taxes ) ) {

									foreach ( $rate->taxes as $tax ) {

										if ( is_numeric( $tax ) ) {

											$method_cost += $tax;

										}

									}

								}



								$response .= ($idx > 0 ? '&' : '').'FREIGHTNAME('.$idx.')='.rawurlencode( $method_name ).'&FREIGHTCHARGEINCTAX('.$idx.')='.number_format( (float)$method_cost, 2, '.', '' );



								$idx++;

							}

						}

					}

				}



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);

				echo $response;

				exit();



			} elseif ( $type == "siteverification" ) {



				update_option( 'codisto_site_verification' , file_get_contents( 'php://input' ) );



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);

				echo $this->json_encode( array( 'ack' => 'ok' ) );

				exit();



			} elseif ( $type == "conversiontracking" ) {



				$conversiontracking = intval( get_option( 'codisto_conversion_tracking' ) ) + 1;



				update_option( 'codisto_conversion_tracking' , strval( $conversiontracking ) );



				$upload_dir = wp_upload_dir();

				$conversion_tracking_file = '/codisto/conversion-tracking.js';

				$conversion_tracking_path = $upload_dir['basedir'].$conversion_tracking_file;



				wp_mkdir_p( dirname( $conversion_tracking_path ) );



				file_put_contents( $conversion_tracking_path, file_get_contents( 'php://input' ) );



				$this->sendHttpHeaders(

					'200 OK',

					array(

						'Content-Type' => 'application/json',

						'Cache-Control' => 'no-cache, no-store',

						'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

						'Pragma' => 'no-cache'

					)

				);

				echo $this->json_encode( array( 'ack' => 'ok' ) );

				exit();



			}





		}

	}



	/**

	* wc_order_is_editable filter hook handler used to block edit of marketplace sourced orders

	*

	* @param boolean $editable current state of orders editable status

	* @param object $order the order object to test for editability

	* @return boolean status to whether the order can be edited

	*/

	public function order_is_editable( $editable, $order ) {

		$codisto_order_id = get_post_meta( $order->get_id(), '_codisto_orderid', true);

		if ( is_numeric( $codisto_order_id ) && $codisto_order_id !== 0 ) {

			return false;

		}



		return $editable;

	}



	/**

	* woocommerce_admin_order_data_after_order_details filter hook handler used to place

	* marketplace specific buttons onto an order if an order is sourced from a marketplace

	*

	* @param object $order that the buttons are to be rendered for

	*/

	public function order_buttons( $order ) {

		$codisto_order_id = get_post_meta( $order->get_id(), '_codisto_orderid', true );

		if ( is_numeric( $codisto_order_id ) && $codisto_order_id !== 0 ) {

			$ebay_user = get_post_meta( $order->get_id(), '_codisto_ebayusername', true );

			$merchantid = get_post_meta( $order->get_id(), '_codisto_merchantid', true );

			if ( $ebay_user ) {

				?>

				<p class="form-field form-field-wide codisto-order-buttons">

				<a href="<?php echo htmlspecialchars( admin_url( 'codisto/ebaysale?orderid='.$codisto_order_id.'&merchantid='.$merchantid ) ) ?>" target="codisto!sale" class="button"><?php esc_html_e( 'eBay Order', 'codisto-linq' ) ?> &rarr;</a>

				<a href="<?php echo htmlspecialchars( admin_url( 'codisto/ebayuser?orderid='.$codisto_order_id.'&merchantid='.$merchantid) ) ?>" target="codisto!user" class="button"><?php esc_html_e( 'eBay User', 'codisto-linq' ) ?><?php echo $ebay_user ? ' : '.htmlspecialchars( $ebay_user ) : ''; ?> &rarr;</a>

				</p>

				<?php

			}

			$amazon_order = get_post_meta( $order->get_id(), '_codisto_amazonorderid', true );

			if ( $amazon_order ) {

				?>

				<p class="form-field form-field-wide codisto-order-buttons">

				<a href="<?php echo htmlspecialchars( admin_url( 'codisto/amazonsale?orderid='.$codisto_order_id.'&merchantid='.$merchantid ) ) ?>" target="codisto!sale" class="button"><?php esc_html_e( 'Amazon Order', 'codisto-linq' ) ?> &rarr;</a>

				</p>

				<?php

			}

		}

	}



	/**

	* proxy is used to translate local requests to the wordpress instance that represent

	* requests for UI and proxies those requests from the server back to Codisto

	*

	*/

	public function proxy() {

		global $wp;



		error_reporting( E_ERROR | E_PARSE );

		set_time_limit( 0 );



		@ini_set( 'zlib.output_compression', 'Off' );

		@ini_set( 'output_buffering', 'Off' );

		@ini_set( 'output_handler', '' );



		while( ob_get_level() > 1 ) {

			@ob_end_clean();

		}

		if ( ob_get_level() > 0 ) {

			@ob_clean();

		}



		if ( isset( $_GET['productid'] ) ) {

			wp_redirect( admin_url( 'post.php?post='.urlencode( wp_unslash( $_GET['productid'] ) ).'&action=edit#codisto_product_data' ) );

			exit;

		}



		$HostKey = get_option( 'codisto_key' );



		if ( ! function_exists( 'getallheaders' ) ) {

			 function getallheaders() {

				$headers = array();

				foreach ( $_SERVER as $name => $value ) {

					if ( substr( $name, 0, 5 ) == 'HTTP_' ) {

						$headers[str_replace( ' ', '-', ucwords( strtolower( str_replace( '_', ' ', substr( $name, 5 ) ) ) ) )] = $value;

					} elseif ( $name == 'CONTENT_TYPE' ) {

						$headers['Content-Type'] = $value;

					} elseif ( $name == 'CONTENT_LENGTH' ) {

						$headers['Content-Length'] = $value;

					}

				}

				return $headers;

			 }

		}



		$querystring = preg_replace( '/q=[^&]*&/', '', $_SERVER['QUERY_STRING'] );

		$path = $wp->query_vars['codisto-proxy-route'] . ( preg_match( '/\/(?:\\?|$)/', $_SERVER['REQUEST_URI'] ) ? '/' : '' );



		$storeId = '0';

		$merchantid = get_option( 'codisto_merchantid' );



		if ( isset( $_GET['merchantid'] ) ) {

			$merchantid = (int)$_GET['merchantid'];

		} else {

			$storematch = array();



			if ( preg_match( '/^ebaytab\/(\d+)\/(\d+)(?:\/|$)/', $path, $storematch ) ) {

				$storeId = (int)$storematch[1];

				$merchantid = (int)$storematch[2];



				$path = preg_replace( '/(^ebaytab\/)(\d+\/?)(\d+\/?)/', '$1', $path );

			}

			if ( preg_match( '/^ebaytab\/(\d+)(?:\/|$)/', $path, $storematch ) ) {

				if ( isset( $storematch[2] ) ) {

					$merchantid = (int)$storematch[2];

				}



				$path = preg_replace( '/(^ebaytab\/)(\d+\/?)/', '$1', $path );

			}

		}



		if ( ! $merchantid ) {

			$this->sendHttpHeaders(

				'404 Not Found',

				array(

					'Content-Type' => 'text/html',

					'Cache-Control' => 'no-cache, no-store',

					'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

					'Pragma' => 'no-cache'

				)

			);

			?>

			<h1>Resource Not Found</h1>

			<?php

			exit();

		}



		$remoteUrl = 'https://ui.codisto.com/' . $merchantid . '/'. $path . ( $querystring ? '?'.$querystring : '' );



		$adminUrl = admin_url( 'codisto/ebaytab/'.$storeId.'/'.$merchantid.'/' );



		$requestHeaders = array(

							'X-Codisto-Cart' => 'woocommerce',

							'X-Codisto-Version' => CODISTOCONNECT_VERSION,

							'X-HostKey' => $HostKey,

							'X-Admin-Base-Url' => $adminUrl,

							'Accept-Encoding' => ''

						);



		$incomingHeaders = getallheaders();



		$headerfilter = array(

			'host',

			'connection',

			'accept-encoding'

		);

		if ( $_SERVER['X-LSCACHE'] == 'on' ) {

			$headerfilter[] = 'if-none-match';

		}

		foreach ( $incomingHeaders as $name => $value ) {

			if ( ! in_array( trim( strtolower( $name ) ), $headerfilter ) ) {

				$requestHeaders[$name] = $value;

			}

		}



		$httpOptions = array(

						'method' => $_SERVER['REQUEST_METHOD'],

						'headers' => $requestHeaders,

						'timeout' => 60,

						'httpversion' => '1.0',

						'decompress' => false,

						'redirection' => 0

					);



		$upload_dir = wp_upload_dir();



		if ( is_multisite() ) {

			$certPath = $upload_dir['basedir'].'/sites/'.get_current_blog_id().'/codisto.crt';

		} else {

			$certPath = $upload_dir['basedir'].'/codisto.crt';

		}



		if ( file_exists( $certPath ) ) {

			$httpOptions['sslcertificates'] = $certPath;

		}



		if ( strtolower( $httpOptions['method'] ) == 'post' ) {

			$httpOptions['body'] = file_get_contents( 'php://input' );

		}



		for ( $retry = 0; ; $retry++ ) {



			$response = wp_remote_request( $remoteUrl, $httpOptions );



			if ( is_wp_error( $response ) ) {

				if ( $retry >= 3 ) {

					$this->sendHttpHeaders(

						'500 Server Error',

						array(

							'Content-Type' => 'text/html',

							'Cache-Control' => 'no-cache, no-store',

							'Expires' => 'Thu, 01 Jan 1970 00:00:00 GMT',

							'Pragma' => 'no-cache'

						)

					);

					echo '<h1>Error processing request</h1> <p>'.htmlspecialchars( $response->get_error_message() ).'</p>';

					exit();

				}



				if ( $httpOptions['sslcertificates']

				 	&& strpos( $response->get_error_message(), 'cURL error 77' ) !== false ) {



					@file_put_contents( $certPath, '' );

					unset( $httpOptions['sslcertificates'] );

					continue;



				}



				if ( $response->get_error_code() == 'http_request_failed' ) {

					$certResponse = wp_remote_get( 'http://ui.codisto.com/codisto.crt' );



					if ( ! is_wp_error( $certResponse ) ) {

						@file_put_contents( $certPath, $certResponse['body'] );

						$httpOptions['sslcertificates'] = $certPath;

						continue;

					}

				}



				sleep(2);

				continue;

			}



			break;

		}



		if ( defined( 'ADVANCEDCACHEPROBLEM' ) &&

			false == strpos( $_SERVER['REQUEST_URI'], 'wp-admin') ) {

			$_SERVER['REQUEST_URI'] = '/wp-admin'.$_SERVER['REQUEST_URI'];

		}



		status_header( wp_remote_retrieve_response_code( $response ) );



		$filterHeaders = array( 'server', 'content-length', 'transfer-encoding', 'date', 'connection', 'x-storeviewmap', 'content-encoding' );



		if ( function_exists( 'header_remove' ) ) {

			@header_remove( 'Last-Modified' );

			@header_remove( 'Pragma' );

			@header_remove( 'Cache-Control' );

			@header_remove( 'Expires' );

			@header_remove( 'Content-Encoding' );

		}



		foreach ( wp_remote_retrieve_headers( $response ) as $header => $value ) {



			if ( ! in_array( strtolower( $header ), $filterHeaders, true ) ) {

				if ( is_array( $value ) ) {

					header( $header.': '.$value[0], true );



					for ( $i = 1; $i < count( $value ); $i++ ) {

						header( $header.': '.$value[$i], false );

					}

				} else {

					header( $header.': '.$value, true );

				}

			}

		}



		file_put_contents( 'php://output', wp_remote_retrieve_body( $response ) );

		exit();

	}



	/**

	* parse_request hook handler routes requests to proxy or sync via captured

	* query vars

	*

	*/

	public function parse() {



		global $wp;



		if ( ! empty( $wp->query_vars['codisto'] ) &&

			in_array( $wp->query_vars['codisto'], array( 'proxy','sync' ), true ) ) {

			$codistoMode = $wp->query_vars['codisto'];



			if ( $codistoMode == 'sync' ) {

				$this->sync();

			} elseif ( $codistoMode == 'proxy' ) {

				if ( current_user_can( 'manage_woocommerce' ) ) {

					$this->proxy();

				} else {

					auth_redirect();

				}

			}



			exit;

		}

	}



	/**

	* used for affiliate marketing when the plugin is distributed by an affiliate partner

	*

	* @return string reseller key, the entity that has distributed the extension

	*/

	private function reseller_key() {

		return CODISTOCONNECT_RESELLERKEY;

	}



	/**

	* POST handler for create account on codisto servers for this woocommerce instance

	*

	*/

	public function create_account() {



		$blogversion = preg_replace( '/[\x0C\x0D]/', ' ', preg_replace( '/[\x00-\x1F\x7F]/', '', get_bloginfo( 'version' ) ) );

		$blogurl = preg_replace( '/[\x0C\x0D]/', ' ', preg_replace( '/[\x00-\x1F\x7F]/', '', get_site_url() ) );

		$blogdescription = preg_replace( '/[\x0C\x0D]/', ' ', preg_replace( '/[\x00-\x1F\x7F]/', '', get_option( 'blogdescription' ) ) );



		if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) {



			check_admin_referer( 'codisto-create' );



			if ( $_POST['method'] == 'email' ) {



				$signupemail = wp_unslash( $_POST['email'] );

				$signupcountry = wp_unslash( $_POST['countrycode'] );

				$signupphone = wp_unslash( $_POST['phone'] );



				$httpOptions = array(

								'method' => 'POST',

								'headers' => array( 'Content-Type' => 'application/json' ),

								'timeout' => 60,

								'httpversion' => '1.0',

								'redirection' => 0,

								'body' => $this->json_encode(

									array (

										'type' => 'woocommerce',

										'version' => $blogversion,

										'url' => $blogurl,

										'email' => $signupemail,

										'phone' => $signupphone,

										'country' => $signupcountry,

										'storename' => $blogdescription ,

										'resellerkey' => $this->reseller_key(),

										'codistoversion' => CODISTOCONNECT_VERSION

									)

								)

							);



				$response = wp_remote_request( 'https://ui.codisto.com/create', $httpOptions );



				if ( $response ) {



					$result = json_decode( wp_remote_retrieve_body( $response ), true );



				} else {



					$postdata = array (

						'type' => 'woocommerce',

						'version' => $blogversion,

						'url' => $blogurl,

						'email' => $signupemail,

						'phone' => $signupphone,

						'country' => $signupcountry,

						'storename' => $blogdescription,

						'resellerkey' => $this->reseller_key(),

						'codistoversion' => CODISTOCONNECT_VERSION

					);

					$str = $this->json_encode( $postdata );



					$curl = curl_init();

					curl_setopt_array(

						$curl,

						array(

							CURLOPT_RETURNTRANSFER => 1,

							CURLOPT_URL => 'https://ui.codisto.com/create',

							CURLOPT_POST => 1,

							CURLOPT_POSTFIELDS => $str,

							CURLOPT_HTTPHEADER => array(

								'Content-Type: application/json',

								'Content-Length: ' . strlen( $str )

							)

						)

					);

					$response = curl_exec( $curl );

					curl_close( $curl );



					$result = json_decode( $response, true );



				}



				update_option( 'codisto_merchantid' , 	$result['merchantid'] );

				update_option( 'codisto_key',			$result['hostkey'] );



				wp_cache_flush();



				wp_redirect( 'admin.php?page=codisto' );



			} else {



				$blogdescription = preg_replace( '/[\x0C\x0D]/', ' ', preg_replace( '/[\x00-\x1F\x7F]/', '', get_option( 'blogdescription' ) ) );



				wp_redirect(

					'https://ui.codisto.com/register?finalurl='.

					urlencode( admin_url( 'admin-post.php?action=codisto_create&_wpnonce='.urlencode( wp_create_nonce( 'codisto-create' ) ) ) ).

					'&type=woocommerce'.

					'&version='.urlencode( $blogversion ).

					'&url='.urlencode( $blogurl ).

					'&storename='.urlencode( $blogdescription ).

					'&storecurrency='.urlencode( get_option( 'woocommerce_currency' ) ).

					'&resellerkey='.urlencode( $this->reseller_key() ).

					'&codistoversion='.urlencode( CODISTOCONNECT_VERSION )

				);

			}



		} else {



			if ( ! wp_verify_nonce( $_GET['_wpnonce'], 'codisto-create') ) {

				wp_die( '<p>'.esc_html__( 'URL Security Check has failed, please start the process again.', 'codisto-linq' ).'</p>' );

			}



			$regtoken = '';

			if ( isset($_GET['regtoken'] ) ) {

				$regtoken = wp_unslash( $_GET['regtoken'] );

			} else {

				$query = array();

				parse_str( $_SERVER['QUERY_STRING'], $query );



				if ( isset( $query['regtoken'] ) ) {

					$regtoken = $query['regtoken'];

				}

			}



			$httpOptions = array(

				'method' => 'POST',

				'headers' => array( 'Content-Type' => 'application/json' ),

				'timeout' => 60,

				'httpversion' => '1.0',

				'redirection' => 0,

				'body' => $this->json_encode(

					array (

						'regtoken' => $regtoken

					)

				)

			);



			$response = wp_remote_request( 'https://ui.codisto.com/create', $httpOptions );



			if ( $response ) {



				$result = json_decode( wp_remote_retrieve_body( $response ), true );



			} else {



				$postdata =  array (

					'regtoken' => $regtoken

				);



				$str = $this->json_encode( $postdata );



				$curl = curl_init();

				curl_setopt_array(

					$curl,

					array(

						CURLOPT_RETURNTRANSFER => 1,

						CURLOPT_URL => 'https://ui.codisto.com/create',

						CURLOPT_POST => 1,

						CURLOPT_POSTFIELDS => $str,

						CURLOPT_HTTPHEADER => array(

							'Content-Type: application/json',

							'Content-Length: ' . strlen( $str )

						)

					)

				);



				$response = curl_exec( $curl );

				curl_close( $curl );



				$result = json_decode( $response, true );



			}



			update_option( 'codisto_merchantid' , 	$result['merchantid'] );

			update_option( 'codisto_key',			$result['hostkey'] );



			wp_cache_flush();



			wp_redirect( 'admin.php?page=codisto' );

		}

		exit();

	}



	/**

	* POST handler for saving edits to templates

	*

	*/

	public function update_template() {



		if ( !current_user_can( 'edit_themes' ) ) {

			wp_die( '<p>'.esc_html__( 'You do not have sufficient permissions to edit templates for this site.', 'codisto-linq' ).'</p>' );

		}



		check_admin_referer( 'edit-ebay-template' );



		$filename = wp_unslash( $_POST['file'] );

		$filename = preg_replace('/[^ -~]+|[\\/:"*?<>|]+/', '', $filename);



		$content = wp_unslash( $_POST['newcontent'] );



		$file = WP_CONTENT_DIR . '/ebay/' . $filename;



		@mkdir( basename( $file ), 0755, true );



		$updated = false;



		$f = fopen( $file, 'w' );

		if ( $f !== false) {

			fwrite( $f, $content );

			fclose( $f );



			$updated = true;

		}



		wp_redirect( admin_url( 'admin.php?page=codisto-templates&file='.urlencode( $filename ).( $updated ? '&updated=true' : '' ) ) );

		exit();

	}



	/**

	* common function used to render a proxied codisto page that checks

	* for a valid registered Codisto account

	*

	* @param string $url used to render an iframe to hold the locally proxied content

	* @param string $tabclass used to apply a css class to the iframe for specialised frame styling

	*/

	private function admin_tab( $url, $tabclass ) {



		$merchantid = get_option( 'codisto_merchantid' );



		if ( ! is_numeric( $merchantid ) ) {



			$email = get_option( 'admin_email' );



			$paypal_settings = get_option( 'woocommerce_paypal_settings' );

			if ( is_array( $paypal_settings ) ) {

				$email = $paypal_settings['email'];

			}



			?>

			<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:500,900,700,400">

			<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">



			<iframe id="dummy-data" frameborder="0" src="https://codisto.com/xpressgriddemo/ebayedit/"></iframe>

			<div id="dummy-data-overlay"></div>

			<div id="create-account-modal">

				<img style="float:right; margin-top:26px; margin-right:15px;" height="30" src="https://codisto.com/images/codistodarkgrey.png">

				<h1>Create your Account</h1>

				<div class="body">

					<form id="codisto-form" action="<?php echo htmlspecialchars( admin_url( 'admin-post.php' ) ); ?>" method="post">

						<p>To get started, enter your email address.</p>

						<p>Your email address and phone number will be used to communicate important account information and to

							provide a better support experience for any enquiries with your Codisto account.</p>



						<?php wp_nonce_field( 'codisto-create' ); ?>

						<input type="hidden" name="action" value="codisto_create"/>

						<input type="hidden" name="method" value="email"/>



						<div>

							<label for="email"><i class="material-icons">email</i></label> <input type="email" id="email" name="email" required placeholder="Enter Your Email Address" size="40">

							<div class="help-text email-help-text" data-defaultmessage="Email is required" data-invalidmessage="Please enter a valid email"></div>

						</div>

						<div>

							<label for="emailconfirm"><i class="material-icons">email</i></label> <input type="email" id="emailconfirm" name="emailconfirm" required placeholder="Confirm Your Email Address" size="40">

							<div class="help-text emailconfirm-help-text" data-defaultmessage="Confirm Email is required" data-invalidmessage="Please enter a valid confirm email"></div>

						</div>



						<div>

							<label for="phone"><i class="material-icons">phone_in_talk</i></label> <input type="tel" id="phone" name="phone" required placeholder="Enter your Phone Number (incl. country code)" size="40">

							<div class="help-text phone-help-text" data-defaultmessage="Phone is required" data-invalidmessage="Please enter a valid phone number"></div>

						</div>



						<div class="selection">

							<label for="countrycode"><i class="material-icons">language</i></label> <div class="select-html-wrapper"></div>

							<br/>

							This is important for creating your initial store defaults.

							<br/>

							<br/>

						</div>



						<div class="next">

							<button type="submit" class="button btn-lg">Continue <i class="material-icons">keyboard_arrow_right</i></button>

						</div>

						<div class="error-message">

							<strong>Your email addresses do not match.</strong>

						</div>



					</form>

				</div>

				<div class="footer">

					Once you create an account we will begin synchronizing your catalog data.<br>

					Sit tight, this may take several minutes depending on the size of your catalog.<br>

					When completed, you'll have the world's best eBay & Amazon integration at your fingertips.<br>

				</div>



			</div>



			<?php



		} else {



			?>

			<div id="codisto-container">

				<iframe class="<?php echo $tabclass ?>" src="<?php echo htmlspecialchars( $url )?>" frameborder="0"></iframe>

			</div>

			<?php



		}

	}



	/**

	* renders the 'home' tab

	*

	*/

	public function ebay_tab() {

		$adminUrl = admin_url( 'codisto/ebaytab/0/'.get_option( 'codisto_merchantid' ).'/' );



		$this->admin_tab( $adminUrl, 'codisto-bulk-editor' );

	}



	/**

	* renders the 'listings' tab

	*

	*/

	public function listings() {

		$adminUrl = admin_url( 'codisto/ebaytab/0/'.get_option( 'codisto_merchantid' ).'/listings/' );



		$this->admin_tab( $adminUrl, 'codisto-bulk-editor' );

	}



	/**

	* renders the 'analytics' tab

	*

	*/

	public function analytics() {

		$adminUrl = admin_url( 'codisto/ebaytab/0/'.get_option( 'codisto_merchantid' ).'/analytics/' );



		$this->admin_tab( $adminUrl, 'codisto-bulk-editor' );

	}



	/**

	* renders the 'orders' tab

	*

	*/

	public function orders() {

		$adminUrl = admin_url( 'codisto/ebaytab/0/'.get_option( 'codisto_merchantid' ).'/orders/' );



		$this->admin_tab( $adminUrl, 'codisto-bulk-editor' );

	}



	/**

	* renders the 'account' tab

	*

	*/

	public function account() {

		$adminUrl = admin_url( 'codisto/ebaytab/0/'.get_option( 'codisto_merchantid' ).'/account/' );



		$this->admin_tab( $adminUrl, 'codisto-account' );

	}



	/**

	* renders the 'settings' tab

	*

	*/

	public function settings() {



		$adminUrl = admin_url( 'codisto/settings/' );



		$this->admin_tab( $adminUrl, 'codisto-settings' );

	}





	/**

	* implements the templates link

	*

	*/

	public function templates() {

		include 'templates.php';

	}



	/**

	* renders support message for multisite instances

	*

	*/

	public function multisite() {

		include 'multisite.php';

	}



	/**

	* admin_menu hook handler used to add the codisto menu entries to the

	* wordpress admin menu

	*

	*/

	public function admin_menu() {



		if ( current_user_can( 'manage_woocommerce' ) ) {



			$mainpage = 'codisto';

			$type = 'ebay_tab';



			add_menu_page( __( 'Channel Cloud', 'codisto-linq' ), __( 'Channel Cloud', 'codisto-linq' ), 'edit_posts', $mainpage, array( $this, $type ), 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE4cHgiIGhlaWdodD0iMThweCIgdmlld0JveD0iMCAwIDE3MjUuMDAwMDAwIDE3MjUuMDAwMDAwIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0Ij4gPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsMTcyNS4wMDAwMDApIHNjYWxlKDAuMTAwMDAwLC0wLjEwMDAwMCkiIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0ibm9uZSI+PHBhdGggZD0iTTgzNDAgMTcyNDAgYy0yMTk1IC03MCAtNDI1MyAtOTYyIC01ODEwIC0yNTIwIC0xNDYzIC0xNDYyIC0yMzM3IC0zMzU5IC0yNTAwIC01NDI1IC0yOSAtMzYyIC0yOSAtOTcwIDAgLTEzMzUgMTM4IC0xNzc0IDgwNyAtMzQzOCAxOTMxIC00ODA1IDM1MyAtNDMxIDc4NCAtODYwIDEyMTQgLTEyMTEgMTM2MiAtMTExMiAzMDIzIC0xNzc3IDQ3ODAgLTE5MTQgMzczIC0yOSA5NjAgLTI5IDEzMzUgMCAxNzU3IDEzNSAzNDIyIDgwMSA0Nzg1IDE5MTQgNDU0IDM3MCA5MDYgODI3IDEyNzcgMTI4OCAxNDcgMTgyIDMzNiA0NDEgNDcxIDY0NSAxMTUgMTc0IDMxNyA1MDcgMzE3IDUyMyAwIDYgMyAxMCA4IDEwIDQgMCAxMiAxMCAxOCAyMyAxOCAzOSA4OSAxNzIgOTQgMTc3IDUgNSA3NiAxNDggMTY5IDMzOSAyMyA0NiA0MSA5MCA0MSA5OCAwIDcgNSAxMyAxMCAxMyA2IDAgMTAgNyAxMCAxNSAwIDggNCAyMyAxMCAzMyA1IDkgMjEgNDQgMzUgNzcgMTUgMzMgMzAgNjggMzYgNzcgNSAxMCA5IDIyIDkgMjggMCA1IDEyIDM1IDI2IDY3IDQ3IDEwNSA1NCAxMjQgNTQgMTM4IDAgOCAzIDE1IDggMTUgNCAwIDE1IDI4IDI2IDYzIDEwIDM0IDI0IDcxIDMxIDgyIDcgMTEgMTYgMzYgMjAgNTUgNCAxOSAxMSA0MCAxNSA0NSA0IDYgMTEgMjYgMTUgNDUgNCAxOSAxMSAzNyAxNCA0MCA3IDUgMjEgNTAgNTcgMTgwIDkgMzAgMTkgNjAgMjQgNjUgNCA2IDE1IDQ0IDI0IDg1IDEwIDQxIDIxIDc5IDI2IDg1IDExIDEzIDEzMSA1MzEgMTY5IDcyNSAxNjMgODQ5IDE5OCAxNzY0IDEwMCAyNjMwIC0yNjMgMjMyOSAtMTQ2OCA0NDQ2IC0zMzQ5IDU4ODIgLTczMyA1NTkgLTE1ODcgMTAxMiAtMjQ2NSAxMzA2IC03NjQgMjU3IC0xNjAwIDQxMSAtMjM2NSA0MzcgLTMyMSAxMSAtNDQyIDEyIC02NzAgNXogbS0yOTI1IC0yNjYwIGM2NzEgLTQxIDEyMTQgLTIzMCAxNjk0IC01OTAgNDg1IC0zNjQgODI1IC03NjYgMTY1NiAtMTk2NSAyNzggLTQwMSA5NjggLTE0NDggMTEyMCAtMTcwMCAyMTcgLTM1OCA0MjcgLTg0NCA1MTEgLTExNzUgMTE0IC00NTUgMTEyIC03OTYgLTEwIC0xNDEwIC0zOSAtMTk5IC0xNTAgLTU0MCAtMjQzIC03NDYgLTEyNCAtMjc2IC0yOTQgLTU0NSAtNDkyIC03NzcgLTQyIC00OSAtODggLTEwMiAtMTAyIC0xMTkgbC0yNSAtMzAgLTQxMyA2MjIgLTQxMiA2MjIgMzQgODIgYzU1IDEzMCAxMTggMzY3IDE1MyA1ODEgMjUgMTU1IDE1IDU0MCAtMjAgNzMxIC05MyA1MDkgLTI5NiA5MDcgLTEwMDcgMTk3NCAtNTU3IDgzNiAtMTAyMCAxNDU4IC0xMzUxIDE4MTMgLTQ0NyA0ODAgLTk2NSA3MDUgLTE1MzYgNjY3IC03NzEgLTUxIC0xNDM2IC00ODcgLTE3ODYgLTExNzAgLTk3IC0xODggLTE2MiAtMzg1IC0xODUgLTU2MyAtMjcgLTE5NCAtOSAtNTA2IDQwIC03MDIgMTA5IC00MzcgMzk0IC05NjIgMTA3NSAtMTk3MiA4MjQgLTEyMjQgMTI1MyAtMTc2NiAxNjcyIC0yMTExIDE5MSAtMTU4IDQwMSAtMjYwIDY4NyAtMzM1IGw5MCAtMjMgMTM4IC0yMDUgYzc3IC0xMTIgMjg1IC00MjEgNDYzIC02ODYgbDMyNCAtNDgxIC02MyAtMTEgYy00NjcgLTgxIC05MDggLTc3IC0xMzUzIDE0IC03NDMgMTUzIC0xMzQ5IDUzNSAtMTkxNCAxMjA5IC0yODggMzQ0IC04MzkgMTExMiAtMTQ0MSAyMDExIC01MDEgNzQ3IC03MzQgMTEzOSAtOTEyIDE1MzUgLTE1NiAzNDUgLTIzNCA2MDQgLTI4MyA5NDUgLTIxIDE0MyAtMjQgNTA1IC02IDY2MCAxMzQgMTEyNiA2ODcgMjAxNyAxNjUyIDI2NjAgNjQ4IDQzMiAxMjU0IDYyNyAyMDIwIDY1MyAzMCAxIDEzMiAtMyAyMjUgLTh6IG00ODYwIC0yNjMwIGM2NzEgLTQxIDEyMTQgLTIzMCAxNjk0IC01OTAgMzUzIC0yNjQgNjM0IC01NjAgMTAxMyAtMTA2NSAzMjEgLTQyOSAxMjE3IC0xNzIxIDEyMTAgLTE3NDYgLTEgLTUgNzggLTEyNSAxNzYgLTI2NyAyNTggLTM3MyAzMzggLTQ5OSA1MTUgLTgxMyAxMTEgLTE5NyAyMzggLTQ3NSAyODcgLTYyOSA0NSAtMTQwIDcxIC0yMjkgNzYgLTI1NCAzIC0xNyAxNCAtNjYgMjUgLTEwOCA1NiAtMjIyIDg0IC01MTQgNzQgLTc2MyAtNCAtODggLTkgLTE2MiAtMTAgLTE2NSAtMyAtNSAtMTUgLTkwIC0zMSAtMjE1IC0zIC0yNyAtMTAgLTcwIC0xNSAtOTUgLTUgLTI1IC0xNCAtNzAgLTE5IC0xMDAgLTMzIC0xNjkgLTE3MSAtNjIwIC0xOTAgLTYyMCAtNSAwIC0xMSAtMTQgLTE1IC0zMCAtNCAtMTcgLTExIC0zMCAtMTYgLTMwIC02IDAgLTggLTMgLTYgLTcgMyAtNSAtMyAtMjQgLTEzIC00MyAtMTEgLTE5IC0yNCAtNDYgLTMwIC02MCAtMTkgLTQ0IC04NSAtMTc1IC05MCAtMTgwIC0zIC0zIC0xMyAtMjEgLTIzIC00MCAtMzQgLTYzIC01MiAtOTUgLTU4IC0xMDAgLTMgLTMgLTE0IC0yMSAtMjUgLTQwIC0xMCAtMTkgLTIxIC0zNyAtMjQgLTQwIC0zIC0zIC0zMSAtNDMgLTYyIC05MCAtNjIgLTk0IC0yNDQgLTMxMiAtMzYxIC00MzQgLTQzIC00NCAtNzcgLTgzIC03NyAtODcgMCAtNCAtNDggLTUwIC0xMDcgLTEwMyAtNTIwIC00NjIgLTExMjUgLTc4OCAtMTcyOCAtOTMxIC02NTggLTE1NiAtMTM2NSAtMTEzIC0yMDA0IDEyMyAtNTAxIDE4NCAtOTg3IDU0OSAtMTQyMSAxMDY2IC0zMTQgMzc0IC03NTYgOTk1IC0xNDQxIDIwMjMgLTQ4NCA3MjcgLTU5MyA4OTkgLTc0NyAxMTg4IC0yNTYgNDgwIC0zODUgODQ5IC00NDggMTI4MCAtMjEgMTQzIC0yNCA1MDUgLTYgNjYwIDg1IDcxMyAzNDAgMTMzNiA3NTggMTg1MiAxMjQgMTUzIDIwMSAyNDAgMjA3IDIzMyAyIC0zIDE4MSAtMjc2IDM5NyAtNjA4IGwzOTMgLTYwNCAtMjIgLTM2IGMtOTIgLTE1NiAtMTY4IC0zMzMgLTIxMCAtNDk0IC00MSAtMTU0IC01MSAtMjQxIC01MSAtNDM1IDAgLTQ2MSAxMjYgLTgyMCA1MjAgLTE0ODQgMzQgLTU3IDY1IC0xMDYgNjkgLTEwOSAzIC0zIDEyIC0xNyAxOCAtMzEgMjcgLTYzIDQ1OCAtNzI0IDcwNiAtMTA4NCA3MjggLTEwNTkgMTA5NiAtMTUxMyAxNDg1IC0xODMzIDE1OSAtMTMxIDMyNSAtMjIwIDU0MSAtMjkxIDIyOSAtNzYgMjkzIC04NSA1NzEgLTg2IDIxMiAwIDI2MSAzIDM2MSAyMyAzMTEgNTkgNTg4IDE3MCA4MzEgMzMzIDE0NiA5OSAzMjUgMjU3IDQ0MCAzOTAgODcgMTAwIDE2OCAyMDQgMTY4IDIxNSAwIDMgMTAgMjAgMjMgMzcgODggMTI0IDIxMSA0MDggMjUyIDU4NCA5IDM3IDIwIDg0IDI1IDEwNCAzNSAxMzEgNDEgNDgxIDEwIDYzNyAtMjYgMTMxIC0xMDIgMzQ3IC0xODggNTMyIC0xNiAzNiAtNDggMTA0IC03MCAxNTEgLTc2IDE2NCAtMzYxIDYzOCAtNDE5IDY5NiAtMTIgMTMgLTgxIDExNiAtMTU0IDIzMCAtNDYxIDcyNiAtMTEwMiAxNjI2IC0xNDc5IDIwNzggLTQxNSA0OTggLTc3NSA3NDYgLTEyMjkgODQ5IC02MiAxMyAtMTE0IDI2IC0xMTYgMjggLTIzIDI4IC04NTUgMTM1MSAtODUyIDEzNTUgMTggMTcgMzIyIDYxIDQ5NyA3MiAxOTcgMTIgMjI4IDEyIDQxNSAxeiIvPiA8L2c+IDwvc3ZnPg==', '55.501' );



			$pages = array();



			$pages[] = add_submenu_page( 'codisto', __( 'Home', 'codisto-linq' ), __( 'Home', 'codisto-linq' ), 'edit_posts', 'codisto', array( $this, 'ebay_tab' ) );

			$pages[] = add_submenu_page( 'codisto', __( 'Listings', 'codisto-linq' ), __( 'Listings', 'codisto-linq' ), 'edit_posts', 'codisto-listings', array( $this, 'listings' ) );

			$pages[] = add_submenu_page( 'codisto', __( 'Orders', 'codisto-linq' ), __( 'Orders', 'codisto-linq' ), 'edit_posts', 'codisto-orders', array( $this, 'orders' ) );

			$pages[] = add_submenu_page( 'codisto', __( 'Analytics', 'codisto-linq' ), __( 'Analytics', 'codisto-linq' ), 'edit_posts', 'codisto-analytics', array( $this, 'analytics' ) );

			$pages[] = add_submenu_page( 'codisto', __( 'Settings', 'codisto-linq' ), __( 'Settings', 'codisto-linq' ), 'edit_posts', 'codisto-settings', array( $this, 'settings' ) );

			$pages[] = add_submenu_page( 'codisto', __( 'Account', 'codisto-linq' ), __( 'Account', 'codisto-linq' ), 'edit_posts', 'codisto-account', array( $this, 'account' ) );

			$pages[] = add_submenu_page( 'codisto', __( 'eBay Templates', 'codisto-linq' ), __( 'eBay Templates', 'codisto-linq' ), 'edit_posts', 'codisto-templates', array( $this, 'templates' ) );



		}

	}



	/**

	* admin_body_class hook handler used to add a class to the page body

	* to perform specific styling - mostly of the embedded iframe for proxied

	* content

	*

	* @param array $classes the set of classes to be applied to the body

	* @return array the classes array mutated in the function passed as input

	*/

	public function admin_body_class( $classes ) {

		if ( isset($_GET['page'] ) ) {

			$page = wp_unslash( $_GET['page'] );



			if ( substr( $page, 0, 7 ) === 'codisto' ) {

				if ( $page === 'codisto' ) {

					return "$classes codisto";

				} elseif ( $page === 'codisto-templates' ) {

					return "$classes $page";

				} elseif ( $page === 'codisto-multisite' ) {

					return "$classes $page";

				}



				return "$classes codisto $page";

			}

		}



		return $classes;

	}



	/**

	* admin_scripts hook used to apply the codisto admin css+js

	*

	* @param string $hook the top level plugin page

	*/

	public function admin_scripts( $hook ) {



		if ( preg_match ( '/codisto(?:-orders|-categories|-attributes|-import|-templates|-settings|-account|-listings|-analytics|)$/', $hook ) ) {



			wp_enqueue_style( 'codisto-style' );

			wp_enqueue_script( 'codisto-script' );



		}



	}



	/**

	* woocommerce_product_bulk_edit_save hook handler

	* used to notify bulk changes to products to codisto

	*

	* @param object $product object being bulk saved

	*/

	public function bulk_edit_save( $product ) {



		if ( ! $this->ping ) {

			$this->ping = array();

		}



		if ( ! isset($this->ping['products'] ) ) {

			$this->ping['products'] = array();

		}



		$pingProducts = $this->ping['products'];



		if ( ! in_array( $product->id, $pingProducts ) ) {

			$pingProducts[] = $product->id;

		}



		$this->ping['products'] = $pingProducts;

	}



	/**

	* woocommerce_admin_settings_sanitize_option_woocommerce_currency hook handler

	* used to notify changes to currency setting to codisto

	*

	* @param string $value currency value that is being set

	* @return string the value input unchanged

	*/

	public function option_save( $value ) {



		if ( ! $this->ping ) {

			$this->ping = array();

		}



		return $value;

	}



	/**

	* save_post hook handler used to notify changes to products to codisto

	*

	* @param integer $id of the product

	* @param object $post object that represents the post (which is checked to be a product)

	*/

	public function product_save( $id, $post ) {



		if ( $post->post_type == 'product' ) {

			if ( ! $this->ping ) {

				$this->ping = array();

			}



			if ( ! isset($this->ping['products'] ) ) {

				$this->ping['products'] = array();

			}



			$pingProducts = $this->ping['products'];



			if ( ! in_array( $id, $pingProducts ) ) {

				$pingProducts[] = $id;

			}



			$this->ping['products'] = $pingProducts;

		}

	}



	/**

	* woocommerce_reduce_order_stock hook handler used to notify stock changes

	* to codisto

	*

	* @param object $order object that is having it's contained orders stock reduced

	*/

	public function order_reduce_stock( $order ) {



		$product_ids = array();



		foreach ( $order->get_items() as $item ) {

			if ( $item['product_id'] > 0 ) {

				if ( is_string( get_post_status( $item['product_id'] ) ) ) {

					$product_ids[] = $item['product_id'];

				}

			}

		}



		if ( count( $product_ids ) > 0) {

			if ( ! $this->ping ) {

				$this->ping = array();

			}



			if ( ! isset( $this->ping['products'] ) ) {

				$this->ping['products'] = array();

			}



			$pingProducts = $this->ping['products'];



			foreach ( $product_ids as $id ) {

				if ( ! in_array( $id, $pingProducts ) ) {

					$pingProducts[] = $id;

				}

			}



			$this->ping['products'] = $pingProducts;

		}

	}



	/**

	* takes collected set of signals during post handling and transmits to codisto

	*

	* this runs within the shutdown hook to avoid standard stalling admin processing

	*/

	public function signal_edits() {



		if ( is_array( $this->ping ) &&

			isset( $this->ping['products'] ) ) {



			$response = wp_remote_post(

				'https://api.codisto.com/'.get_option( 'codisto_merchantid' ),

				array(

					'method'		=> 'POST',

					'timeout'		=> 5,

					'redirection' => 0,

					'httpversion' => '1.0',

					'blocking'	=> true,

					'headers'		=> array( 'X-HostKey' => get_option( 'codisto_key' ) , 'Content-Type' => 'application/x-www-form-urlencoded' ),

					'body'		=> 'action=sync&productid=['.implode( ',', $this->ping['products'] ).']'

				)

			);



		} elseif (is_array( $this->ping ) ) {



			$response = wp_remote_post(

				'https://api.codisto.com/'.get_option( 'codisto_merchantid' ),

				array(

					'method'		=> 'POST',

					'timeout'		=> 5,

					'redirection' => 0,

					'httpversion' => '1.0',

					'blocking'	=> true,

					'headers'		=> array( 'X-HostKey' => get_option( 'codisto_key' ) , 'Content-Type' => 'application/x-www-form-urlencoded' ),

					'body'		=> 'action=sync'

				)

			);



		}

	}



	/**

	* emits site verification tags

	*

	*/

	public function site_verification() {



		$site_verification = get_option('codisto_site_verification');

		if( $site_verification ) {

			echo $site_verification;

		}



	}



	/**

	* enqueues conversion tracking script for 'offsite' advertising campaigns

	*

	*/

	public function conversion_tracking() {



		$upload_dir = wp_upload_dir();

		$conversion_tracking_file = '/codisto/conversion-tracking.js';

		$conversion_tracking_path = $upload_dir['basedir'].$conversion_tracking_file;



		$conversion_tracking = get_option('codisto_conversion_tracking');



		if( $conversion_tracking

			&& file_exists($conversion_tracking_path) ) {



			$conversion_tracking_url = $upload_dir['baseurl'].$conversion_tracking_file;



			wp_enqueue_script( 'codisto-conversion-tracking' , $conversion_tracking_url, array() , $conversion_tracking );

		}



	}



	/***

	* emits conversion information into the checkout completion page

	*

	*/

	public function conversion_emit( $order_id ) {



		$order = new WC_Order( $order_id );



		$conversiondata = 'window.CodistoConversion = { transaction_id : '.$order_id.', value : '.($order->get_total() ? $order->get_total() : 0).', currency : "'.get_woocommerce_currency().'"};';



		wp_add_inline_script( 'codisto-conversion-tracking', $conversiondata );



	}





	/**

	* woocommerce_product_data_tabs hook handler used to render marketplace product tab

	*

	* @param array $tabs current set of tabs for the product page

	* @return array mutated tabs array to render the contained tabs on the woo product page

	*/

	public function add_ebay_product_tab( $tabs ) {



		$tabs['codisto'] = array(

								'label'	=> __( 'Channel Cloud', 'codisto-linq' ),

								'target' => 'codisto_product_data',

								'class'	=> '',

							);



		return $tabs;

	}



	/**

	* woocommerce_product_data_panels hook handler used to render marketplace product info

	*

	*/

	public function ebay_product_tab_content() {



		global $post;



		?>

			<div id="codisto_product_data" class="panel woocommerce_options_panel" style="padding: 8px;">

			<iframe id="codisto-control-panel" style="width: 100%;" src="<?php echo htmlspecialchars( admin_url( '/codisto/ebaytab/product/'. $post->ID ).'/' ); ?>" frameborder="0"></iframe>

			</div>

		<?php

	}



	/**

	* plugin_action_links hook handler to render helpful links in plugin page

	*

	* @param array $links for plugin

	* @return array passed through $links array

	*/

	public function plugin_links( $links ) {



		$action_links = array(

			'listings' => '<a href="' . admin_url( 'admin.php?page=codisto' ) . '" title="'.esc_html__( 'Manage Google, Amazon, eBay & Walmart Listings', 'codisto-linq' ).'">'.esc_html__( 'Manage Google, Amazon, eBay & Walmart Listings', 'codisto-linq' ).'</a>',

			'settings' => '<a href="' . admin_url( 'admin.php?page=codisto-settings' ) . '" title="'.esc_html__( 'Codisto Settings', 'codisto-linq' ).'">'.esc_html__( 'Settings', 'codisto-linq' ).'</a>'

		);



		return array_merge( $action_links, $links );

	}



	/**

	* admin_notices hook handler to render post installation transient notice

	*

	*/

	function admin_notice_info() {



		if ( get_transient( 'codisto-admin-notice' ) ){

			$class = 'notice notice-info is-dismissible';

			printf( '<div class="%1$s"><p>'.esc_html__( 'Codisto LINQ Successfully Activated!', 'codisto-linq' ).' '.

			wp_kses(

				__('<a class="button action" href="admin.php?page=codisto">Click here</a> to get started.' ),

				array(

					'a' => array(

						'class' => array(),

						'href' => array()

					)

				)

			).'</p></div>', esc_attr( $class ) );

		}

	}



	/**

	* plugin initialisation

	*

	*/

	public function init_plugin() {



		$homeUrl = preg_replace( '/^https?:\/\//', '', trim( home_url() ) );

		$siteUrl = preg_replace( '/^https?:\/\//', '', trim( site_url() ) );

		$adminUrl = preg_replace( '/^https?:\/\//', '', trim( admin_url() ) );



		$syncUrl = str_replace( $homeUrl, '', $siteUrl );

		$syncUrl .= ( substr( $syncUrl, -1 ) == '/' ? '' : '/' );



		// synchronisation end point

		add_rewrite_rule(

			'^'.preg_quote( ltrim( $syncUrl, '/' ), '/' ).'codisto-sync\/(.*)?',

			'index.php?codisto=sync&codisto-sync-route=$matches[1]',

			'top' );



		$adminUrl = str_replace( $homeUrl, '', $adminUrl );

		$adminUrl .= ( substr( $adminUrl, -1 ) == '/' ? '' : '/' );



		// proxy end point

		add_rewrite_rule(

			'^'.preg_quote( ltrim( $adminUrl, '/'), '/').'codisto\/(.*)?',

			'index.php?codisto=proxy&codisto-proxy-route=$matches[1]',

			'top'

		);



		wp_register_style( 'codisto-style', plugins_url( 'styles.css', __FILE__ ) );

		wp_register_script( 'codisto-script', plugins_url( 'admin.js', __FILE__ ) );



		add_filter( 'query_vars', 							array( $this, 'query_vars' ) );

		add_filter( 'nocache_headers',						array( $this, 'nocache_headers' ) );

		add_action( 'parse_request',						array( $this, 'parse' ), 0 );

		add_action( 'admin_post_codisto_create',			array( $this, 'create_account' ) );

		add_action( 'admin_post_codisto_update_template',	array( $this, 'update_template' ) );

		add_action( 'admin_enqueue_scripts', 				array( $this, 'admin_scripts' ) );

		add_action( 'admin_menu',							array( $this, 'admin_menu' ) );

		add_action( 'admin_notices', 						array( $this, 'admin_notice_info' ) );

		add_filter( 'admin_body_class', 					array( $this, 'admin_body_class' ) );

		add_action(	'woocommerce_product_bulk_edit_save', 	array( $this, 'bulk_edit_save' ) );

		add_action(	'woocommerce_before_product_object_save', 	array( $this, 'product_save' ), 10, 2 );

		add_action( 'save_post',							array( $this, 'product_save' ), 10, 2 );

		add_filter( 'woocommerce_product_data_tabs',		array( $this, 'add_ebay_product_tab' ) );

		add_action( 'woocommerce_product_data_panels',		array( $this, 'ebay_product_tab_content' ) );

		add_filter( 'wc_order_is_editable',					array( $this, 'order_is_editable' ), 10, 2 );

		add_action( 'woocommerce_reduce_order_stock',		array( $this, 'order_reduce_stock' ) );

		add_filter( 'woocommerce_email_enabled_new_order',	array( $this, 'inhibit_order_emails' ), 10, 2 );

		add_filter( 'woocommerce_email_enabled_cancelled_order',	array( $this, 'inhibit_order_emails' ), 10, 2 );

		add_filter( 'woocommerce_email_enabled_customer_completed_order',	array( $this, 'inhibit_order_emails' ), 10, 2 );

		add_filter( 'woocommerce_email_enabled_customer_invoice',	array( $this, 'inhibit_order_emails' ), 10, 2 );

		add_filter( 'woocommerce_email_enabled_customer_note',	array( $this, 'inhibit_order_emails' ), 10, 2 );

		add_filter( 'woocommerce_email_enabled_customer_on_hold_order',	array( $this, 'inhibit_order_emails' ), 10, 2 );

		add_filter( 'woocommerce_email_enabled_customer_processing_order',	array( $this, 'inhibit_order_emails' ), 10, 2 );

		add_filter( 'woocommerce_email_enabled_customer_refunded_order',	array( $this, 'inhibit_order_emails' ), 10, 2 );

		add_filter( 'woocommerce_email_enabled_failed_order',	array( $this, 'inhibit_order_emails' ), 10, 2 );

		add_action(

			'woocommerce_admin_order_data_after_order_details',

			array( $this, 'order_buttons' )

		);

		add_action(

			'woocommerce_admin_settings_sanitize_option_woocommerce_currency',

			array( $this, 'option_save')

		);

		add_filter(

			'plugin_action_links_'.plugin_basename( __FILE__ ),

			array( $this, 'plugin_links' )

		);

		add_action( 'shutdown',								array( $this, 'signal_edits' ) );

		add_action( 'wp_head',								array( $this, 'site_verification' ) );

		add_action( 'wp_enqueue_scripts',					array( $this, 'conversion_tracking' ) );

		add_action( 'woocommerce_thankyou',					array( $this, 'conversion_emit' ) );



	}



	/**

	* static init method for the plugin, registers the activation hook

	* setups up the init_plugin action

	*

	* handles extra kludges to make the sync end point work for various

	* third party extensions

	*

	*/

	public static function init() {



		if ( is_null( self::$_instance ) ) {

			self::$_instance = new self();



			register_activation_hook( __FILE__, array( 'CodistoConnect', 'activate' ) );

			add_action( 'init', array( self::$_instance, 'init_plugin' ) );



			if ( preg_match( '/\/codisto-sync\//', $_SERVER['REQUEST_URI'] ) ) {



				// force aelia currency switcher to

				$_POST['aelia_cs_currency'] = get_option('woocommerce_currency');



			}

		}



		return self::$_instance;

	}



	/**

	* acivation hook handler - used to setup the admin notice as a transient

	* and install rewrite rules for the sync and proxy end points

	*

	*/

	public static function activate() {



		$homeUrl = preg_replace( '/^https?:\/\//', '', trim( home_url() ) );

		$siteUrl = preg_replace( '/^https?:\/\//', '', trim( site_url() ) );

		$adminUrl = preg_replace( '/^https?:\/\//', '', trim( admin_url() ) );



		$syncUrl = str_replace( $homeUrl, '', $siteUrl );

		$syncUrl .= ( substr( $syncUrl, -1 ) == '/' ? '' : '/' );



		// synchronisation end point

		add_rewrite_rule(

			'^'.preg_quote( ltrim( $syncUrl, '/' ), '/' ).'codisto-sync\/(.*)?',

			'index.php?codisto=sync&codisto-sync-route=$matches[1]',

			'top'

		);



		$adminUrl = str_replace( $homeUrl, '', $adminUrl );

		$adminUrl .= ( substr( $adminUrl, -1 ) == '/' ? '' : '/' );



		// proxy end point

		add_rewrite_rule(

			'^'.preg_quote( ltrim( $adminUrl, '/' ), '/' ).'codisto\/(.*)?',

			'index.php?codisto=proxy&codisto-proxy-route=$matches[1]',

			'top'

		);



		set_transient( 'codisto-admin-notice', true, 20 );



		flush_rewrite_rules();



	}

}



endif;



CodistoConnect::init();