<?php
if(!class_exists('AffiliateAddEdit')){
	class AffiliateAddEdit{
		private $is_public = true;
		private $user_id = '';
		private $type = 'create';//create or edit
		private $action = '';// form action (url)
		private $user_data = array();
		private $tos = false;
		private $captcha = false;
		private $register_metas = array();
		private $errors = array();
		private $register_fields = '';
		private $disabled_submit_form = '';
		private $register_template = 'uap-register-1';
		private $display_type = 'display_admin';
		private $required_fields = array();
		private $current_rank = 0;
		private $global_css = '';
		private $global_js = '';
		private $exception_fields = array();
		private static $print_errors = array();
		private static $uap_error_register;
		private $set_username_automaticly = FALSE;
		private $set_password_automaticly = FALSE;
		private $send_password_via_mail = FALSE;
		private $shortcodes_attr = array();
		private $fields 				= [];

		public function __construct($args=array()){
			/*
			 * @param array - optional
			 * @return none
			 */
			global $indeed_db;
			$this->register_metas = array_merge($indeed_db->return_settings_from_wp_option('register', FALSE, FALSE), $indeed_db->return_settings_from_wp_option('register-msg', FALSE, FALSE), $indeed_db->return_settings_from_wp_option('register-custom-fields', FALSE, FALSE));


			/// INPUT VARIABLES
			if (!empty($args)){
				foreach($args as $k=>$v){
					//if (!empty($v)){
						$this->$k = $v;
					//}
				}
			}
			//8.6
			$this->register_template = (empty($args['register_template'])) ? $this->register_metas['uap_register_template'] : $args['register_template'];

			if ($this->is_public){
				if ($this->type=='create'){
					$this->display_type = 'display_public_reg';
				} else {
					$this->display_type = 'display_public_ap';
				}
			} else {
				$this->display_type = 'display_admin';
			}

			/// SET REGISTER FIELDS
			$this->register_fields = $indeed_db->register_get_custom_fields();//register fields
			ksort($this->register_fields);
			if ($this->type=='edit'){
				$key = uap_array_value_exists($this->register_fields, 'user_login', 'name');
				if ($key!==FALSE && isset($this->register_fields[$key])){
					unset($this->register_fields[$key]);
				}
			}

			// >= 8.6
			if ( $this->type === 'create' && !empty( $this->user_id) ){
					$key = uap_array_value_exists($this->register_fields, 'pass1', 'name');
					if ($key!==FALSE && isset($this->register_fields[$key])){
						unset($this->register_fields[$key]);
					}
					$key = uap_array_value_exists($this->register_fields, 'pass2', 'name');
					if ($key!==FALSE && isset($this->register_fields[$key])){
						unset($this->register_fields[$key]);
					}
					foreach ( $this->register_fields as $fieldId => $registerFieldArray ){
							if ( $registerFieldArray['native_wp'] ){
									$this->register_fields[$fieldId]['disabled'] = 1;
							}
					}
			}
			// end of >= 8.6

			/// SET CURRENT RANK
			$this->current_rank = get_option('uap_register_new_user_rank');
			if ($this->user_id && $indeed_db->get_affiliate_id_by_wpuid( $this->user_id ) ){
				// affiliate already has a rank
				$this->current_rank = $indeed_db->get_affiliate_rank(0, $this->user_id);
			}
		}

		/////////
		public function form(){
			/*
			 * @param none
			 * @return string
			 */

			/*extra fields that must be transalted:*/
			   esc_html__("Confirm Password", 'uap');
			   esc_html__("Last Name", 'uap');
			   esc_html__("First Name", 'uap');
			 /**/

			$this->userdata();

			$i = 0;

			$template_with_cols= array('uap-register-6', 'uap-register-11', 'uap-register-12', 'uap-register-13');
			if (in_array($this->register_template, $template_with_cols)){
				$return_data['count_register_fields'] = $this->count_register_fields();
			}

			$this->global_js = '';

			foreach ($this->register_fields as $v){
				$str = '';
				if ($v[$this->display_type]>0){
					$i++;
					switch ($v['name']){
						case 'tos':
							if ($this->tos){
								$disp_tos = $this->print_tos($v);
								if ($disp_tos != ''){
							 		$str .= $disp_tos;
							 		$this->required_fields[] = array('name' => 'tos', 'type' => 'checkbox');
							 		if (!empty(self::$print_errors['tos'])){
							 			$str .= '<div class="uap-register-notice">' . self::$print_errors['tos'] . '</div>';
							 		}
								}
							}
							break;
						case 'recaptcha':
							if ($this->captcha){
								$disp_captcha = $this->print_captcha($v);
								if ($disp_captcha != ''){
							 		$str .= $disp_captcha;
									if (!empty(self::$print_errors['captcha'])){
										$str .= '<div class="uap-register-notice">' . self::$print_errors['captcha'] . '</div>';
									}
								}
							}
							break;
						default:
							if ($this->is_public) {

								//========== PUBLIC
								$str .= $this->print_fields($v);
							} else {
								//========== ADMIN

								$notAvailableForAdminSection = [ 'uap_social_media', 'payment_select', 'confirm_email', 'pass2' ];
								if( in_array( $v['name'], $notAvailableForAdminSection ) ){
										break;//continue;
								}

								$disabled = '';
								if ( $this->type=='edit' && $v['name']=='user_login'){
									$disabled = 'disabled';
								}

								//FORM FIELD
								$parent_id = 'uap_reg_' . $v['type'] . '_' . rand(1,10000);
								$temp_type_class = 'uap-form-' . $v['type'];
								$str .= '<div class="uap-form-line-register ' . $temp_type_class . '" id="' . $parent_id . '">';
								$str .= '<label class="uap-labels-register">';

								if (isset($v['native_wp']) && $v['native_wp']){
									$str .= esc_html__($v['label'], 'uap');
								} else {
									$str .= uap_correct_text($v['label']);
								}
								if ($v['req']){
									$str .= '<span class="uap-color-red">*</span>';
								}
								$str .= '</label>';

								$val = '';
								if (isset($this->user_data[$v['name']])){
									$val = $this->user_data[$v['name']];
								}
								if (empty($val) && $v['type']=='plain_text'){ //maybe it's plain text
									$val = $v['plain_text_value'];
								}

								$multiple_values = FALSE;
								if (isset($v['values']) && $v['values']){
									//is checkbox, select or radio input field, so we have to include multiple+_values into indeed_create_form_elelemt
									$multiple_values = uap_from_simple_array_to_k_v($v['values']);
								}

								if (empty($v['sublabel'])){
									$v['sublabel'] = '';
								}

								if (empty($v['class'])){
									$v['class'] = '';
								}

								$str .= uap_create_form_element(array( 'type' => $v['type'], 'name' => $v['name'], 'value' => $val,
										'disabled' => $disabled, 'multiple_values' => $multiple_values,
										'user_id' => $this->user_id, 'sublabel' => $v['sublabel'], 'class' => $v['class'] ));
								$str .= '</div>';
							}
							break;
					}//end of switch
				}
				$return_data['form_fields'][] = $str;
			}

			$return_data['hiddens'][] = $this->printNonce();

			if ($this->is_public){
				/*******************************PUBLIC****************************/

				//ACTIONS
				if ($this->type=='edit'){
					$return_data['hiddens'][] = uap_create_form_element(array('type'=>'hidden', 'name'=>'uapaction', 'value' => 'update' ));
				} else {
					$return_data['hiddens'][] = uap_create_form_element(array('type'=>'hidden', 'name'=>'uapaction', 'value' => 'register' ));
				}
			} else {
				/******************************** ADMIN ****************************/

				//Add Extra options for Affiliate edit page
				global $indeed_db;
				$return_data['form_fields'][] = $this->print_section_title();//select wp role
				$return_data['form_fields'][] = $this->print_wp_role();//select wp role
				$return_data['form_fields'][] = $this->select_rank();//select ranks
				$return_data['form_fields'][] = $this->print_overview_post_select();

				if ($indeed_db->is_magic_feat_enable('custom_affiliate_slug')){
					$return_data['form_fields'][] = $this->the_slug();// edit the slug
				}

				if ($this->user_id && $this->type=='edit'){//hide user id into the form for edit, only in admin
					$return_data['hiddens'][] = uap_create_form_element(array('type'=>'hidden', 'name'=>'user_id', 'value' => $this->user_id ));
				}
			}

			if ($this->type=='create'){
				$return_data['submit_button']= uap_create_form_element(array('type'=>'submit', 'name'=>'Submit', 'value' => esc_html__('Register', 'uap'),
						'class' => '', 'id'=>'uap_submit_bttn', 'disabled'=>$this->disabled_submit_form )); /// class button button-primary button-large
			} else {
				$return_data['submit_button']= uap_create_form_element(array('type'=>'submit', 'name'=>'Update', 'value' => esc_html__('Save Changes', 'uap'),
						 'class' => '', 'id'=>'uap_submit_bttn', 'disabled'=>$this->disabled_submit_form ));
			}

			if (count($this->exception_fields)>0){
				$return_data['hiddens'][] = '<input type="hidden" name="uap_exceptionsfields" id="uap_exceptionsfields" value="' . implode(',', $this->exception_fields) . '" />';
			}

			global $indeed_db;
			//Allow to change MLM Parent
			//&& ($this->type=='create' || !$indeed_db->mlm_get_parent($indeed_db->get_affiliate_id_by_wpuid($this->user_id)) )
			if (!$this->is_public && $indeed_db->is_magic_feat_enable('mlm') ){ //  && ($this->type=='create' || !$indeed_db->mlm_get_parent($indeed_db->get_affiliate_id_by_wpuid($this->user_id)) )
				$mlmParent = $indeed_db->mlm_get_parent($indeed_db->get_affiliate_id_by_wpuid($this->user_id));
				$return_data['form_fields'][] = uap_create_form_element(
																			array(
																				'type'						=>'uap_affiliate_autocomplete_field',
																				'label' 					=> esc_html__('Select a Parent for this Affiliate', 'uap'),
																				'field_style' 		=> '',
																				'title' 					=> esc_html__('Multi-Level Marketing (MLM) Setup', 'uap'),
																				'hidden_name' 		=> 'uap_affiliate_mlm_parent',
																				'exclude_user_id' => $this->user_id,
																				'value'						=> $mlmParent,
																				'text_name'				=> 'uap_affiliate_mlm_parent_slug'
																			)
				);
			}

			//wrapp it all in a form
			if ($this->type=='edit'){
				$return_data['form_name'] = "uap_edituser";
				$return_data['form_id'] = "uap_edituser";
			} else {
				$return_data['form_name'] = "uap_createuser";
				$return_data['form_id'] = "uap_createuser";
			}

			$return_data['css'] = $this->global_css;

			//AJAX CHECK FIELDS VALUES (ONLY FOR PUBLIC REGISTER)
			$return_data['js'] = '';
			if ($this->is_public && $this->type=='create'){
				$return_data['js'] .= 'var req_fields_arr = [];';
				$return_data['js'] .= 'jQuery(window).on( "load",function(){';
				foreach ($this->required_fields as $req_field){
					if (in_array($req_field['type'], array('text', 'textarea', 'number', 'password', 'date', 'conditional_text'))){
						$return_data['js'] .= 'jQuery(".uap-form-create-edit [name='.$req_field['name'].']").on("blur", function(){
							uapRegisterCheckViaAjax("'.$req_field['name'].'");
						});';
					}

					$return_data['js'] .= 'req_fields_arr.push("' . $req_field['name'] . '");
					';
				}
				$return_data['js'] .= 'jQuery(".uap-form-create-edit").on("submit", function() { /// live
							if (window.must_submit==1){
								return true;
							} else {
								uapRegisterCheckViaAjaxRec(req_fields_arr);
								return false;
							}
						});';
				$return_data['js'] .= '});';
			}
			$return_data['js'] .= $this->global_js;

			//return $str;
			return $return_data;
		}

		/**
		 * @param none
		 * @return string
		 */
		protected function printNonce()
		{
				if ( $this->is_public ){
						$nonce = wp_create_nonce( 'uap_user_add_edit_nonce' );
				} else {
						$nonce = wp_create_nonce( 'uap_admin_user_add_edit_nonce' );
				}
				return "<input type='hidden' name='uap_user_add_edit_nonce' value='$nonce' />";
		}


		/////////
		public function userdata(){
			/*
			 * @param none
			 * @return none
			 */
			$user_fields = $this->register_fields;
			if ($this->user_id){
				//getting user meta for id
				$data = get_userdata($this->user_id);
				if ($data){
					foreach ($user_fields as $user_field){
						$name = $user_field['name'];
						if ($user_field['native_wp']==1){
							//native wp field, get value from get_userdata ( $data object )
							if (isset($data->$name) && $data->$name){
								$this->user_data[ $name ] = $data->$name;
							}
						} else {
							//custom field, get value from get_user_meta()
							$this->user_data[ $name ] = get_user_meta($this->user_id, $name, true);
						}
					}
				}
				//user wp role
				if (isset($data->roles[0])){
					$this->user_data['role'] = $data->roles[0];
				}
			} else {
				//empty arr
					foreach ($user_fields as $user_field){
						$name = $user_field['name'];
						$this->user_data[$name] = '';

						if ($this->is_public && isset($_REQUEST[$name])){
							$this->user_data[$name] = uap_sanitize_array($_REQUEST[$name]);
						}
					}
				$this->user_data['role'] = '';
			}
		}
		private function print_section_title(){
			$str = '';
			$str .= '<div class="uap-additional-section-title">';
			$str .= '<h2>'.esc_html__('Additional Settings', 'uap').'</h2>';
			$str .= '<p>'.esc_html__('Extra settings available for Administration purpose', 'uap').'</p>';
			$str .= '</div>';
			return $str;
		}
		private function print_wp_role(){
			/*
			 * @param none
			 * @return string
			 */
			$str = '';
			$str .= '<div class="uap-form-line-register uap-form-select-role">';
			$str .= '<h4>'.esc_html__('WordPress Role', 'uap').'</h4>';
			$str .= '<p>'.esc_html__('If required, select a specific WordPress Role for the current Affiliate user', 'uap').'</p>';
			$str .= uap_create_form_element(
													array(  'type' => 'select',
															'name' => 'role',
															'value' => isset($this->user_data['role']) ? $this->user_data['role'] : '',
															'multiple_values' => uap_get_wp_roles_list(),
															'class' => '' )
													);
			$str .= '</div>';
			return $str;
		}

		////////
		private function select_rank(){
			/*
			 * RUN THIS ONLY ON ADMIN
			 * @param none
			 * @return string
			 */
			$output = '';
			if (!$this->is_public){
				global $indeed_db;
				$ranks = $indeed_db->get_rank_list();
				$ranks = array( 0 => esc_html__('None...', 'uap')) + $ranks;
				$output .= '<div class="uap-form-line-register uap-form-select-ranks">';
				$output .= '<h4>'.esc_html__("Affiliate's Rank", 'uap').'</h4>';
				$output .= '<p>'.esc_html__("Manually assign a particular Rank based on the affiliate's evolution or accomplishments", 'uap').'</p>';
				$output .= uap_create_form_element(
														array(  'type' => 'select',
																'name' => 'rank_id',
																'value' => $this->current_rank,
																'multiple_values' => $ranks,
																'class' => '' )
														);
				$output .= '</div>';
			}
			return $output;
		}

		private function the_slug(){
			/*
			 * @param none
			 * @return string
			 */
			$output = '';
			if (!$this->is_public){
				global $indeed_db;
				$value = $indeed_db->get_custom_slug_for_uid($this->user_id);
				$output .= '<div class="uap-form-line-register uap-form-select-slug">';
				$output .= '<h4>' . esc_html__('Affiliate Custom Slug', 'uap') . '</h4>';
				$output .= '<p>' . esc_html__('Create or change the custom slug available for current affiliate user', 'uap') . '</p>';
				$fieldSettings = 														array(  'type' => 'text',
																				'name' => 'uap_affiliate_custom_slug',
																				'value' => $value,
																				'class' => ''
																			);
				if ( $this->user_id === false || $this->user_id === '' || $this->user_id === 0 ){
						$fieldSettings['disabled'] = 'disabled';
				}
				$output .= uap_create_form_element( $fieldSettings );
				$output .= '</div>';
			}
			return $output;
		}

		private function edit_ap_check_conditional_logic($field_data=array()){
			$value = get_user_meta($this->user_id, $field_data['conditional_logic_corresp_field'], TRUE);

			if ($field_data['conditional_logic_cond_type']=='has'){
				//has value
				if ($field_data['conditional_logic_corresp_field_value']==$value){
					return 1;
				}
			} else {
				//contain value
				if (strpos($value, $field_data['conditional_logic_corresp_field_value'])!==FALSE){
					return 1;
				}
			}

			return 0;
		}

		private function check_for_conditional_logic($field_arr, $field_id){
			/*
			 * @param string, string
			 * @return none
			 */
			if (!$this->is_public){
				return;
			}
			if (!empty($field_arr['conditional_logic_corresp_field']) && $field_arr['conditional_logic_corresp_field']!=-1){
				//so this field is correlated with another

				////Js ACTION
				$key = uap_array_value_exists($this->register_fields, $field_arr['conditional_logic_corresp_field'], 'name');
				if ($key!==FALSE && !empty($this->register_fields[$key]['type'])){
					$show = (strcmp($field_arr['conditional_logic_show'], 'yes')) ? 0 : 1;

					if ($this->type=='edit'){
						if ($show){
							/// 'yes'
							$no_on_edit = $this->edit_ap_check_conditional_logic($field_arr);
						} else {
							/// 'no'
							$no_on_edit = !$this->edit_ap_check_conditional_logic($field_arr);
						}

					}

					switch ($this->register_fields[$key]['type']){
						case 'text':
						case 'textarea':
						case 'number':
						case 'password':
						case 'date':
						case 'conditional_text':
							$js_function = 'uapAjaxCheckFieldConditionOnblurOnclick("' . $field_arr['conditional_logic_corresp_field'] . '", "#' . $field_id . '", "' . $field_arr['name'] . '", ' . $show . ');';
							$this->global_js .= '
								jQuery(".uap-form-create-edit [name='.$field_arr['conditional_logic_corresp_field'].']").on("blur", function(){
									' . $js_function . '
								});
							';
							break;
						case 'checkbox':
							$js_function = 'uapAjaxCheckOnClickFieldCondition("' . $field_arr['conditional_logic_corresp_field'] . '", "#' . $field_id . '", "' . $field_arr['name'] . '", "checkbox", ' . $show . ');';
							$this->global_js .= '
								jQuery(".uap-form-create-edit [name=\''.$field_arr['conditional_logic_corresp_field'].'[]\'], .uap-form-create-edit [name='.$field_arr['conditional_logic_corresp_field'].']").on("click", function(){
									' . $js_function . '
								});
							';
							break;
						case 'radio':
							$js_function = 'uapAjaxCheckOnClickFieldCondition("' . $field_arr['conditional_logic_corresp_field'] . '", "#' . $field_id . '", "' . $field_arr['name'] . '", "radio", ' . $show . ');';
							$this->global_js .= '
								jQuery(".uap-form-create-edit [name='.$field_arr['conditional_logic_corresp_field'].']").on("click", function(){
									' . $js_function . '
								});
							';
							break;
						case 'select':
							$js_function = 'uapAjaxCheckFieldConditionOnblurOnclick("' . $field_arr['conditional_logic_corresp_field'] . '", "#' . $field_id . '", "' . $field_arr['name'] . '", ' . $show . ');';
							$this->global_js .= '
								jQuery(".uap-form-create-edit [name='.$field_arr['conditional_logic_corresp_field'].']").on("change", function(){
									' . $js_function . '
								});
							';
							break;
						case 'multi_select':
							$js_function = 'uapAjaxCheckCnChangeMultiselectFieldCondition("' . $field_arr['conditional_logic_corresp_field'] . '", "#' . $field_id . '", "' . $field_arr['name'] . '", ' . $show . ');';
							$this->global_js .= '
								jQuery(".uap-form-create-edit [name=\''.$field_arr['conditional_logic_corresp_field'].'[]\']").on("change", function(){
									' . $js_function . '
								});
							';
							break;
					}
					if (!empty($js_function)){
						$this->global_js .= 'window.addEventListener( "load", function(){' . $js_function . '});';
					}
				}


				//conditional logic & required => add new exception
				if ($field_arr['req']){
					$this->exception_fields[] = $field_arr['name'];
				}

				if (empty($show) || !empty($no_on_edit)){
					//we must hide this field and show only when correlated field it's completed with desired value
					$this->global_css .= "#$field_id{display: none;}";
				}
			}
		}

		private function print_fields($v=array()){
			/*
			 * @param array
			 * @return string
			 */

			$str = '';
			$disabled = '';
			$placeholder = '';
			 if ( $this->type=='edit' && $v['name']=='user_login'){
			 	$disabled = 'disabled';
			 } else if ( isset( $v['disabled'] ) && $v['disabled'] ){
					 $disabled = 'disabled';
			 }
			 $parent_id = 'uap_reg_' . $v['type'] . '_' . rand(1,10000);

			 $this->check_for_conditional_logic($v, $parent_id);

			 if (!empty($v['req']) || $v['type']=='conditional_text'){
			 	$this->required_fields[] = array('name' => $v['name'], 'type'=>$v['type']);
			 }

			 switch ($this->register_template){
			 	 case 'uap-register-8':
				 case 'uap-register-9':
				 case 'uap-register-3':
				  //////// FORM FIELD
				  	 $temp_type_class = 'uap-form-' . $v['type'];
					 $str .= '<div class="uap-form-line-register ' . $temp_type_class . '" id="' . $parent_id . '">';
					 if ($v['type'] == 'text' || $v['type'] == 'password'){

						if (isset($v['native_wp']) && $v['native_wp']){
							$placeholder .= esc_html__($v['label'], 'uap');
						 } else {
							$placeholder .= uap_correct_text($v['label']);
						 }
						 if ($v['req']){
 							 $placeholder .= '*';
 						 }
					 } else {
						 $str .= '<label class="uap-labels-register">';

						 if (isset($v['native_wp']) && $v['native_wp']){
							$str .= esc_html__($v['label'], 'uap');
						 } else {
						 	$str .= uap_correct_text($v['label']);
						 }
						 if ($v['req']){
							 $str .= '<span class="uap-color-red">*</span>';
						 }
						 $str .= '</label>';
					 }
					 $val = '';
					 if (isset($this->user_data[$v['name']])){
					 	$val = $this->user_data[$v['name']];
					 }
			 		 if (empty($val) && $v['type']=='plain_text'){ //maybe it's plain text
					 	$val = $v['plain_text_value'];
					 }

					 $multiple_values = FALSE;
					 if (isset($v['values']) && $v['values']){
					 	//is checkbox, select or radio input field, so we have to include multiple+_values into indeed_create_form_elelemt
					 	$multiple_values = uap_from_simple_array_to_k_v($v['values']);
					 }

					 if (empty($v['sublabel'])){
					 	$v['sublabel'] = '';
					 }
					 if (empty($v['class'])){
					 	$v['class'] = '';
					 }

					 $str .= uap_create_form_element(array(	'type'=>$v['type'], 'name'=>$v['name'], 'value' => $val,
					 											'disabled' => $disabled, 'placeholder' => $placeholder, 'multiple_values'=>$multiple_values,
					 											'user_id'=>$this->user_id, 'sublabel' => $v['sublabel'], 'class' => $v['class'] ));
			 		 if (!empty(self::$print_errors[$v['name']])){
					 	$str .= '<div class="uap-register-notice">' . self::$print_errors[$v['name']] . '</div>';
					 }
					 $str .= '</div>';
				 break;
				 case 'uap-register-4':
				  //////// FORM FIELD
				  $add_class = '';
					if ($v['type'] == 'select' || $v['type'] == 'multi_select' || $v['type'] == 'file' || $v['type'] == 'upload_image' || $v['type'] == 'date'){
						$add_class ='uap-no-backs';
					}
					$temp_type_class = 'uap-form-' . $v['type'];
					 $str .= '<div class="uap-form-line-register '.$add_class.' ' . $temp_type_class . '" id="' . $parent_id . '">';
					 if ($v['type'] == 'text' || $v['type'] == 'password'){

						if (isset($v['native_wp']) && $v['native_wp']){
							$placeholder .= esc_html__($v['label'], 'uap');
						 } else {
							$placeholder .= uap_correct_text($v['label']);
						 }
						 if ($v['req']){
								$placeholder .= '*';
							}
					 } else {
							 $str .= '<label class="uap-labels-register">';

							 if (isset($v['native_wp']) && $v['native_wp']){
								$str .= esc_html__($v['label'], 'uap');
							 } else {
								$str .= uap_correct_text($v['label']);
							 }
							 if ($v['req']){
								$str .= '<span class="uap-color-red">*</span>';
							}
							 $str .= '</label>';
					 }
					 $val = '';
					 if (isset($this->user_data[$v['name']])){
					 	$val = $this->user_data[$v['name']];
					 }
			 		 if (empty($val) && $v['type']=='plain_text'){ //maybe it's plain text
					 	$val = $v['plain_text_value'];
					 }

			 		 $multiple_values = FALSE;
					 if (isset($v['values']) && $v['values']){
					 	//is checkbox, select or radio input field, so we have to include multiple+_values into indeed_create_form_elelemt
					 	$multiple_values = uap_from_simple_array_to_k_v($v['values']);
					 }

					 if (empty($v['sublabel'])){
					 	$v['sublabel'] = '';
					 }
					 if (empty($v['class'])){
					 	$v['class'] = '';
					 }

					 $str .= uap_create_form_element(array( 'type'=>$v['type'], 'name'=>$v['name'], 'value' => $val,
					 										   'disabled' => $disabled, 'placeholder' => $placeholder, 'multiple_values'=>$multiple_values,
					 											'user_id'=>$this->user_id, 'sublabel' => $v['sublabel'], 'class' => $v['class'] ));
			 		 if (!empty(self::$print_errors[$v['name']])){
					 	$str .= '<div class="uap-register-notice">' . self::$print_errors[$v['name']] . '</div>';
					 }
					 $str .= '</div>';
				 break;

				  case 'uap-register-6':
				  	 //////// FORM FIELD
				  	 $temp_type_class = 'uap-form-' . $v['type'];
					 $str .= '<div class="uap-form-line-register ' . $temp_type_class . '" id="' . $parent_id . '">';
					 $str .= '<label class="uap-labels-register">';

					 if (isset($v['native_wp']) && $v['native_wp']){
						$str .= esc_html__($v['label'], 'uap');
					 } else {
						$str .= uap_correct_text($v['label']);
					 }
					 if ($v['req']){
						 $str .= '<span class="uap-color-red">*</span>';
					 }
					 $str .= '</label>';

					 $val = '';
					 if (isset($this->user_data[$v['name']])){
					 	$val = $this->user_data[$v['name']];
					 }
			 		 if (empty($val) && $v['type']=='plain_text'){ //maybe it's plain text
					 	$val = $v['plain_text_value'];
					 }

					 $multiple_values = FALSE;
					 if (isset($v['values']) && $v['values']){
					 	//is checkbox, select or radio input field, so we have to include multiple+_values into indeed_create_form_elelemt
					 	$multiple_values = uap_from_simple_array_to_k_v($v['values']);
					 }

					 if (empty($v['sublabel'])){
					 	$v['sublabel'] = '';
					 }

					 if (empty($v['class'])){
					 	$v['class'] = '';
					 }

					 $str .= uap_create_form_element(array( 'type'=>$v['type'], 'name'=>$v['name'], 'value' => $val,
					 										   'disabled' => $disabled, 'multiple_values'=>$multiple_values,
					 											'user_id'=>$this->user_id, 'sublabel' => $v['sublabel'], 'class' => $v['class'] ));
					 if (!empty(self::$print_errors[$v['name']])){
					 	$str .= '<div class="uap-register-notice">' . self::$print_errors[$v['name']] . '</div>';
					 }
					 $str .= '</div>';
				 break;
				 default:
					 //////// FORM FIELD
					 $temp_type_class = 'uap-form-' . $v['type'];
					 $str .= '<div class="uap-form-line-register ' . $temp_type_class . '" id="' . $parent_id . '">';
					 $str .= '<label class="uap-labels-register">';

					 if (isset($v['native_wp']) && $v['native_wp']){
						$str .= esc_html__($v['label'], 'uap');
					 } else {
					 	$str .= uap_correct_text($v['label']);
					 }
					 if ($v['req']){
						 $str .= '<span class="uap-color-red">*</span>';
					 }
					 $str .= '</label>';

					 $val = '';
					 if (isset($this->user_data[$v['name']])){
					 	$val = $this->user_data[$v['name']];
					 }
					 if (empty($val) && $v['type']=='plain_text'){ //maybe it's plain text
					 	$val = $v['plain_text_value'];
					 }

					 $multiple_values = FALSE;
					 if (isset($v['values']) && $v['values']){
					 	//is checkbox, select or radio input field, so we have to include multiple+_values into indeed_create_form_elelemt
					 	$multiple_values = uap_from_simple_array_to_k_v($v['values']);
					 }

					 if (empty($v['sublabel'])){
					 	$v['sublabel'] = '';
					 }

					 if (empty($v['class'])){
					 	$v['class'] = '';
					 }

					 $str .= uap_create_form_element(array( 'type'=>$v['type'], 'name'=>$v['name'], 'value' => $val,
					 										   'disabled' => $disabled, 'multiple_values'=>$multiple_values,
					 										   'user_id'=>$this->user_id, 'sublabel' => $v['sublabel'], 'class' => $v['class'] ));
					 if (!empty(self::$print_errors[$v['name']])){
					 	$str .= '<div class="uap-register-notice">' . self::$print_errors[$v['name']] . '</div>';
					 }
					 $str .= '</div>';
				 break;
			 }
			return $str;
		}
		///////
		private function print_tos($v=array()){
			/*
			 * @param array
			 * @return string
			 */
			$str = '';
			$tos_msg = get_option('uap_register_terms_c');//getting tos message
			$tos_page_id = get_option('uap_general_tos_page');
			$tos_link = get_permalink($tos_page_id);

			if ($tos_msg && $tos_page_id){
				$class = (empty($v['class'])) ? '' : $v['class'];
				$id = 'uap_tos_field_parent_' . rand(1,1000);
				$str .= '<div class="uap-tos-wrap" id="' . $id . '">';
				$str .= '<input type="checkbox" value="1" name="tos" class="' . $class . '" />';
				$str .= '<a href="'.$tos_link.'" target="_blank">' . $tos_msg . '</a>';
				$str .= '</div>';
			}
			return $str;
		}



		//////
		private function print_captcha($v=array())
		{
				$type = get_option( 'uap_recaptcha_version' );
				if ( $type !== false && $type == 'v3' ){
						$key = get_option('uap_recaptcha_public_v3');
				} else {
						$key = get_option('uap_recaptcha_public');
				}

				if ( !$key ){
						return '';
				}

				$view = new \Indeed\Uap\IndeedView();
				$data = array(
						'class' 		=> (empty($v['class'])) ? '' : $v['class'],
						'key'				=> $key,
						'langCode'	=> indeed_get_current_language_code(),
						'type'			=> $type,
				);
				/*
				if ( $type !== false && $type == 'v3' ){
					wp_enqueue_script( 'uap-recaptcha-v3', 'https://www.google.com/recaptcha/api.js?render='.$key );
			    wp_enqueue_script( 'uap-register-captcha', UAP_URL . 'assets/js/register-captcha.js', ['jquery'], 8.3 );
				}else{
					wp_enqueue_script( 'uap-recaptcha-v2', 'https://www.google.com/recaptcha/api.js?hl='.indeed_get_current_language_code() );
				}
				*/
				return $view->setTemplate( UAP_PATH . 'public/views/register-captcha.php' )->setContentData( $data, true )->getOutput();
		}


		private function print_overview_post_select(){
			/*
			 * dropdown with all post
			 * @param none
			 * @return string
			 */
			$str = '';
			global $indeed_db;
			$default_pages_arr = $indeed_db->return_settings_from_wp_option('general-redirects');
			$default_pages_arr = array_diff_key($default_pages_arr, array(	'uap_general_logout_redirect'=>'',
																			'uap_general_register_redirect'=>'',
																			'uap_general_login_redirect'=>'' ));//let's exclude the redirect pages
			$args = array(
					'posts_per_page'   => 100,/// 1000
					'offset'           => 0,
					'orderby'          => 'date',
					'order'            => 'DESC',
					'post_type'        => array( 'post', 'page' ),
					'post_status'      => 'publish',
					'post__not_in'	   => $default_pages_arr,
			);

			$posts_array = get_posts( $args );
			$arr['-1'] = '...';
			foreach ($posts_array as $k=>$v){
				$arr[$v->ID] = $v->post_title;
			}
			$str .= '<div class="uap-form-line-register uap-form-select-overview-post">';
			$str .= '<h4>' . esc_html__('Custom Dashboard message', 'uap') . ' </h4>';
			$str .= '<p>' . esc_html__('The Dashboard section from the Account Page can display general content or specific content for each member. You may choose a specific post content for this member or leave the default setup', 'uap') . ' </p>';
			$args['type'] = 'select';
			$args['multiple_values'] = $arr;
			$value = get_user_meta($this->user_id, 'uap_overview_post', true);
			$args['value'] = ($value!==FALSE) ? $value : '';
			$args['name'] = 'uap_overview_post';
			$str .= uap_create_form_element($args);
			$str .= '</div>';
			return $str;
		}

		///////
		public function save_update_user(){
			/*
			 * @param none
			 * @return none
			 */

			 if ( !$this->checkNonce() ){
					 return false;
			 }

			$this->userdata();//set the user data, in case of new user the array will contain only keys
			if ( (empty( $this->user_id ) && $this->type === 'create') || $this->type === 'edit' ){
					$this->check_username();
					$this->check_password();
					$this->check_email();
			}

			$this->check_tos();
			$this->check_captcha();
			$this->set_roles();
			$this->set_the_slug();
			$this->set_automatically_fields();

			//ADD exceptions
			if (!empty($_REQUEST['uap_exceptionsfields'])){
				$this->exception_fields = explode(',', uap_sanitize_textarea_array( $_REQUEST['uap_exceptionsfields'] ) );
			}

			$custom_meta_user = array();
			if (!$this->is_public){
				///////// UPDATE THIS
				$custom_meta_user['uap_overview_post'] = uap_sanitize_array($_REQUEST['uap_overview_post']);
			}
			foreach ($this->register_fields as $fieldId => $value){
				$name = $value['name'];
				if (isset($_REQUEST[$name])){
					if ( $this->register_fields[$fieldId]['type'] == 'date' ){
							$_REQUEST[$name] = preg_replace( "([^0-9-])", '', uap_sanitize_textarea_array($_REQUEST[$name]) );
					}
					if ($this->is_public && !empty($value['req']) && $_REQUEST[$name]=='' && !in_array($name, $this->exception_fields)){
						$this->errors[$name] = $this->register_metas['uap_register_err_req_fields'];//add the error message
					}
					if (!empty($value['native_wp']) ||  $name=='user_login'){
						 //wp standard info
						 $this->fields[$name] = uap_sanitize_textarea_array($_REQUEST[$name]);//filter_var( uap_sanitize_textarea_array($_REQUEST[$name]), FILTER_SANITIZE_STRING );
					} else {
						 //custom field
						 if ( is_array( $_REQUEST[$name] ) ){
							 	$custom_meta_user[$name] = indeedFilterVarArrayElements( uap_sanitize_textarea_array($_REQUEST[$name]) );
						 } else {
							 	$custom_meta_user[$name] = uap_sanitize_textarea_array($_REQUEST[$name]);//filter_var( uap_sanitize_textarea_array($_REQUEST[$name]), FILTER_SANITIZE_STRING );
						 }
						 $this->uap_is_req_conditional_field($value);//conditional required field
					}
				}
			}

			$this->errors = apply_filters( 'uap_register_process_filter_errors', $this->errors );

			if ($this->errors){
				 //print the error and exit
				 $this->return_errors();
				 return FALSE;
			}

			//=========================== SAVE / UPDATE
			//wp native user
			if ($this->type=='create' ){
				//add new user
				$this->fields = apply_filters('uap_before_register_new_user', $this->fields);
				define('UAP_USER_REGISTER_PROCESS', TRUE); /// USED IN all_new_users_become_affiliates() to skip wp filter

				// 8.6
				if( empty( $this->user_id ) ){ // || !isset($this->user_id)
						$this->user_id = wp_insert_user($this->fields);
				} else {
						// user its already registered but wants to become and affiliate
						$this->fields['ID'] = $this->user_id;
						if ( isset( $this->fields['user_pass'] ) && $this->fields['user_pass'] === '' ){
								unset( $this->fields['user_pass'] );
						}
						wp_update_user($this->fields);
				}
				// end of 8.6

				global $indeed_db;
				if ( $this->is_public ){
							$saveAsAffiliate = apply_filters( 'uap_save_as_affiliate_filter', true );
				}else{
						  $saveAsAffiliate = true;
				}
				if ( $saveAsAffiliate ){
						$indeed_db->save_affiliate($this->user_id);
				} else {
						if ( $indeed_db->is_magic_feat_enable('mlm') && $indeed_db->is_magic_feat_enable('pay_to_become_affiliate') ){
								/// save mlm parent into a user option if 'mlm' and 'apy to become affiliate' is activated
								$this->saveMlmParentForUser();
						}
				}
				do_action('uap_on_register_action', $this->user_id);
			} else {
				//update user
				$this->fields['ID'] = $this->user_id;
				wp_update_user($this->fields);
				do_action('uap_on_update_action', $this->user_id);
			}

			$this->do_opt_in();
			$this->double_email_verification();

			//custom user meta
			if ($custom_meta_user){
				foreach ($custom_meta_user as $k=>$v){
						do_action( 'uap_before_user_save_custom_field', $this->user_id, $k, $v );
						update_user_meta($this->user_id, $k, $v);
				}
			}

			//auto login
			if ($this->is_public && $this->type=='create' &&
					!empty($this->register_metas['uap_register_auto_login']) && !empty($this->register_metas['uap_register_new_user_role'])
					&& $this->register_metas['uap_register_new_user_role']!='pending_user'){
				wp_set_auth_cookie($this->user_id);
			}

			$this->set_rank();//USER RANKS
			$this->set_mlm_parent();

			if ($this->is_public){
				/// NOTIFICATIONS
				if ($this->type=='create'){
					if ($this->send_password_via_mail){
						/// send generated password to user
						uap_send_user_notifications($this->user_id, 'register_lite_send_pass_to_user', FALSE, array('{NEW_PASSWORD}' => $this->fields['user_pass']));
					}
					uap_send_user_notifications($this->user_id, 'register', $this->current_rank);//notify the affiliate
					uap_send_user_notifications($this->user_id, 'admin_user_register', $this->current_rank);//notify the admin
				} else {
					uap_send_user_notifications($this->user_id, 'user_update', $this->current_rank);//notify the affiliate
					uap_send_user_notifications($this->user_id, 'admin_affiliate_update_profile');/// USER HAS UPDATE PROFILE, SEND EMAIL TO ADMIN ABOUT THAT
				}
				$this->succes_message();//this will redirect
			}

		}

		/**
		 * @param none
		 * @return bool
		 */
		public function checkNonce()
		{
			if ( $this->is_public ){
				if ( empty( $_POST['uap_user_add_edit_nonce'] ) || !wp_verify_nonce( sanitize_text_field($_POST['uap_user_add_edit_nonce']), 'uap_user_add_edit_nonce' ) ){
					return false;
				}
			} else {
				if ( empty( $_POST['uap_user_add_edit_nonce'] ) || !wp_verify_nonce( sanitize_text_field($_POST['uap_user_add_edit_nonce']), 'uap_admin_user_add_edit_nonce' ) ){
					return false;
				}
			}
			return true;
		}

		private function saveMlmParentForUser()
		{
				$parentAffiliateId = empty( $_POST['uap_affiliate_mlm_parent'] ) ? 0 : sanitize_text_field($_POST['uap_affiliate_mlm_parent']);
				if ( isset( $_COOKIE ) && !empty( $_COOKIE['uap_referral'] ) && empty( $parentAffiliateId ) ){
						$cookieData = json_decode( stripslashes( $_COOKIE['uap_referral'] ), true );//since version 9.1
						$parentAffiliateId = empty( $cookieData['affiliate_id'] ) ? 0 : $cookieData['affiliate_id'];
				}
				if ( empty( $parentAffiliateId ) ){
						global $indeed_db;
						return;
				}
				update_user_meta( $this->user_id, 'uap_mlm_parrent_id_pending', $parentAffiliateId );
		}


		///handle password
		private function check_password(){
			if(($this->type=='edit' && !empty($_REQUEST['pass1'])) || $this->type=='create' ){
				///// only for create new user or in case that current user has selected a new password (edit)

				if ($this->type=='create'){
					$key = uap_array_value_exists($this->register_fields, 'pass1', 'name');
					if (isset($this->register_fields[$key])){
						if ($this->is_public){
							$check = 'display_public_reg';
						} else {
							$check = 'display_admin';
						}
						if (empty($this->register_fields[$key][$check])){
							$this->set_password_automaticly = TRUE;
							return;
						}
					}
				}

				//check the strength
				if ($this->register_metas['uap_register_pass_options']==2){
					//characters and digits
					if (!preg_match('/[a-z]/', sanitize_text_field( $_REQUEST['pass1'] ) ) ){
						$this->errors['pass1'] = $this->register_metas['uap_register_pass_letter_digits_msg'];
					}
					if ( !preg_match('/[0-9]/', sanitize_text_field($_REQUEST['pass1']) ) ){
						$this->errors['pass1'] = $this->register_metas['uap_register_pass_letter_digits_msg'];
					}
				} elseif ($this->register_metas['uap_register_pass_options']==3){
					//characters, digits and one Uppercase letter
					if ( !preg_match('/[a-z]/', sanitize_text_field($_REQUEST['pass1']) ) ){
						$this->errors['pass1'] = $this->register_metas['uap_register_pass_let_dig_up_let_msg'];
					}
					if ( !preg_match('/[0-9]/', sanitize_text_field($_REQUEST['pass1']) ) ){
						$this->errors['pass1'] = $this->register_metas['uap_register_pass_let_dig_up_let_msg'];
					}
					if ( !preg_match('/[A-Z]/', sanitize_text_field($_REQUEST['pass1']) ) ){
						$this->errors['pass1'] = $this->register_metas['uap_register_pass_let_dig_up_let_msg'];
					}
				}

				//check the length of password
				if($this->register_metas['uap_register_pass_min_length']!=0){
					if( strlen( sanitize_text_field($_REQUEST['pass1']) )<$this->register_metas['uap_register_pass_min_length']){
						$this->errors['pass1'] = str_replace( '{X}', $this->register_metas['uap_register_pass_min_length'], $this->register_metas['uap_register_pass_min_char_msg'] );
					}
				}
				if(isset($_REQUEST['pass2'])){
					if ( sanitize_text_field($_REQUEST['pass1']) != sanitize_text_field($_REQUEST['pass2']) ){
						$this->errors['pass2'] = $this->register_metas['uap_register_pass_not_match_msg'];
					}
				}
				//PASSWORD
				$this->fields['user_pass'] = sanitize_text_field($_REQUEST['pass1']);
			}
			$pass1 = uap_array_value_exists($this->register_fields, 'pass1', 'name');
			if ($pass1!==FALSE && isset($this->register_fields[$pass1])){
				unset($this->register_fields[$pass1]);
			}
			$pass2 = uap_array_value_exists($this->register_fields, 'pass2', 'name');
			if ($pass2!==FALSE && isset($this->register_fields[$pass2])){
				unset($this->register_fields[$pass2]);
			}
		}

		///check email
		private function check_email(){
			if ( !is_email( sanitize_text_field( $_REQUEST['user_email'] ) ) ) {
				$this->errors['user_email'] = $this->register_metas['uap_register_invalid_email_msg'];
			}
			if (isset($_REQUEST['confirm_email']) && $this->is_public ){
				if ( sanitize_text_field($_REQUEST['confirm_email']) != sanitize_text_field($_REQUEST['user_email']) ){
					$this->errors['user_email'] = $this->register_metas['uap_register_emails_not_match_msg'];
				}
			}
			if ( email_exists( sanitize_text_field($_REQUEST['user_email']) ) ){
				if ($this->type=='create' || ($this->type=='edit' && email_exists( sanitize_text_field($_REQUEST['user_email']) )!=$this->user_id  ) ){

					$this->errors['user_email'] = $this->register_metas['uap_register_email_is_taken_msg'];
				}
			}
		}

		//check username
		private function check_username(){
			//only for create

			if ($this->type=='create'){

				///NO USERNAME FIELd
				$key = uap_array_value_exists($this->register_fields, 'user_login', 'name');
				if (isset($this->register_fields[$key])){
					if ($this->is_public){
						$check = 'display_public_reg';
					} else {
						$check = 'display_admin';
					}
					if (empty($this->register_fields[$key][$check])){
						$this->set_username_automaticly = TRUE;
						return;
					}
				}

				if ( isset($_REQUEST['user_login']) && !validate_username( sanitize_text_field($_REQUEST['user_login']) ) ) {
					$this->errors['user_login'] = $this->register_metas['uap_register_error_username_msg'];
				}
				if ( isset($_REQUEST['user_login']) && username_exists( sanitize_text_field($_REQUEST['user_login']) ) ) {
					$this->errors['user_login'] = $this->register_metas['uap_register_username_taken_msg'];
				}
			}

		}

		///////// TERMS AND CONDITIONS CHECKBOX CHECK
		private function check_tos(){
			//check if tos was printed
			$tos_page_id = get_option('uap_general_tos_page');
			$tos_msg = get_option('uap_register_terms_c');//getting tos message
			if (!$tos_page_id || !$tos_msg){
				$tos = uap_array_value_exists($this->register_fields, 'tos', 'name');
				if ($tos!==FALSE && isset($this->register_fields[$tos])){
					unset($this->register_fields[$tos]);
				}
				return;
			}

			if ($this->tos && $this->type=='create'){
				$tos = uap_array_value_exists($this->register_fields, 'tos', 'name');
				if ($tos!==FALSE && $this->register_fields[$tos][$this->display_type]){
					unset($this->register_fields[$tos]);
					if (!isset($_REQUEST['tos']) || sanitize_text_field($_REQUEST['tos'])!=1){
						$this->errors['tos'] = get_option('uap_register_err_tos');
					}
				}
			} else {
				$tos = uap_array_value_exists($this->register_fields, 'tos', 'name');
				if ($tos!==FALSE && isset($this->register_fields[$tos])){
					unset($this->register_fields[$tos]);
				}
			}
		}

		//////////// CAPTCHA
		private function check_captcha(){
			if ($this->type=='create' && $this->captcha){
				//check if capcha key is set

				$captchaType = get_option( 'uap_recaptcha_version' );
				if ( $captchaType !== false && $captchaType == 'v3'){
						$captcha_key = get_option('uap_recaptcha_private_v3');
				} else {
						$captcha_key = get_option('uap_recaptcha_private');
				}

				if (!$captcha_key){
					$captcha = uap_array_value_exists($this->register_fields, 'recaptcha', 'name');
					if ($captcha!==FALSE){
						unset($this->register_fields[$captcha]);
					}
					return;
				}

				$captcha = uap_array_value_exists($this->register_fields, 'recaptcha', 'name');
				if ($captcha!==FALSE && $this->register_fields[$captcha][$this->display_type]){
					$captha_err = get_option('uap_register_err_recaptcha');
					unset($this->register_fields[$captcha]);
					if (isset($_REQUEST['g-recaptcha-response'])){
						//$secret = get_option('uap_recaptcha_private');
						if ($captcha_key){
							require_once UAP_PATH . 'classes/services/recaptcha/autoload.php';
							$recaptcha = new \ReCaptcha\ReCaptcha( $captcha_key, new \ReCaptcha\RequestMethod\CurlPost() );
							$resp = $recaptcha->verify( $_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);
							if (!$resp->isSuccess()){
								$this->errors['captcha'] = $captha_err;
							}
						} else {
							$this->errors['captcha'] = $captha_err;
						}
					} else {
						$this->errors['captcha'] = $captha_err;
					}
				}
			}

		}

		private function uap_is_req_conditional_field($field_meta=array()){
			/*
			 * @param array
			 * @return none
			 */
			if (!empty($field_meta['type']) && $field_meta['type']=='conditional_text' && $this->is_public){
				$field_name = $field_meta['name'];
				if ($field_meta['conditional_text']!=sanitize_text_field($_REQUEST[$field_name])){
					if (!empty($field_meta['error_message'])){
						$this->errors[$field_name] = uap_correct_text($field_meta['error_message']);
					} else {
						$this->errors[$field_name] = esc_html__("Error");
					}
				}
			}
		}

		////WP ROLE
		private function set_roles(){
			//role
			if ($this->is_public && $this->type=='create'){
				if (isset($this->register_metas['uap_register_new_user_role'])){
					$this->fields['role'] = $this->register_metas['uap_register_new_user_role'];
				} else {
					$this->fields['role'] = get_option('default_role');
					if (empty($this->fields['role'])){
							$this->fields['role'] = 'subscriber';
					}
				}
			} else if (!$this->is_public){
				if (isset($_REQUEST['role'])){
					$this->fields['role'] = uap_sanitize_array($_REQUEST['role']);
				}
			}
		}

		private function set_the_slug(){
			/*
			 * @param none
			 * @return none
			 */
			 if (!$this->is_public){
			 	/// only admin
			 	if (isset($_POST['uap_affiliate_custom_slug']) && sanitize_text_field($_POST['uap_affiliate_custom_slug'])!=''){
			 		global $indeed_db;
					$saved = $indeed_db->save_custom_slug_for_uid($this->user_id, sanitize_text_field($_POST['uap_affiliate_custom_slug']), TRUE);
					if (empty($saved)){
						$this->errors['Custom Slug'] = esc_html__('Error on trying to save the Affiliate Custom Slug', 'uap');
					}
					unset($_POST['uap_affiliate_custom_slug']);
			 	}
			 }
		}

		private function set_automatically_fields(){
			/*
			 * @param none
			 * @return none
			 */
			 if (!empty($this->set_username_automaticly)){
			 	$this->fields['user_login'] = isset($_POST['user_email']) ? sanitize_email($_POST['user_email']) : '';
			 }
			 if (!empty($this->set_password_automaticly)){
				$this->fields['user_pass'] = wp_generate_password(10);
				$this->send_password_via_mail = TRUE;
			 }
		}

		///RANKS
		private function set_rank(){
			/*
			 * set RANK on public create, admin create, admin update.
			 * @param none
			 * @return none
			 */
			global $indeed_db;
			if ($this->type=='create' && $this->is_public){
				/// PUBLIC CREATE
				$indeed_db->update_affiliate_rank_by_uid($this->user_id, $this->current_rank);
			} else if (!$this->is_public) {
				/// ADMIN
				$rank = (isset($_REQUEST['rank_id'])) ? sanitize_text_field($_REQUEST['rank_id']) : $this->current_rank;
				$indeed_db->update_affiliate_rank_by_uid($this->user_id, $rank);
			}

		}

		private function set_mlm_parent(){
			/*
			 * @param none
			 * @return none
			 */
			global $indeed_db;
			$affiliate_id = $indeed_db->affiliate_get_id_by_uid($this->user_id);
			if ($this->type=='create' && $this->is_public && $indeed_db->is_magic_feat_enable('mlm') ){
				/// SET MLM PARENT IN PUBLIC SECTION

				// IF FAIR CHECKOUT REWARD MODULE IS ENABLED
				if($indeed_db->is_magic_feat_enable('checkout_select_referral')){
					if(!empty($_REQUEST['uap_affiliate_username'])){
						$parentAffiliateId = sanitize_text_field($_REQUEST['uap_affiliate_username']);
					}else if (!empty($_REQUEST['uap_affiliate_username_text'])){
						$sanitized_username = sanitize_text_field( $_REQUEST['uap_affiliate_username_text'] );
				 		$temp = $indeed_db->get_affiliate_id_by_username($sanitized_username);
						if ($temp){
							$parentAffiliateId = $temp;
						}
					}
				}

				if(isset($parentAffiliateId)){
						$indeed_db->set_mlm_relation_on_new_affiliate($affiliate_id, $parentAffiliateId);
				}else{
						$indeed_db->set_mlm_relation_on_new_affiliate($affiliate_id);
				}
				//Allow to change MLM Parent
			} else if (!$this->is_public && $indeed_db->is_magic_feat_enable('mlm') ){
				// Edit
				if ( ( isset( $_POST['uap_affiliate_mlm_parent'] ) && sanitize_text_field( $_POST['uap_affiliate_mlm_parent']) === '0' )
					|| ( isset( $_POST['uap_affiliate_mlm_parent_slug'] ) && sanitize_text_field( $_POST['uap_affiliate_mlm_parent_slug'] ) === '' ) ){
						$indeed_db->delete_mlm_relation( $affiliate_id );
						unset($_POST['uap_affiliate_mlm_parent']);
						unset($_POST['uap_affiliate_mlm_parent_slug']);
				} else if ( !empty($_POST['uap_affiliate_mlm_parent']) ){
						/// SET MLM PARENT IN ADMIN SECTION
						$indeed_db->set_mlm_relation_on_new_affiliate($affiliate_id, sanitize_text_field($_POST['uap_affiliate_mlm_parent']) );
						unset($_POST['uap_affiliate_mlm_parent']);
				}
			}
		}

		///// RETURN ERROR
		private function return_errors(){
			/*
			 * set the global variable with the error string
			 */
			if (!empty($this->errors)){
				global $uap_error_register;
				$uap_error_register = $this->errors;
				self::$uap_error_register = $this->errors;
			}
		}

		private function count_register_fields(){
			$count = 0;
			foreach ($this->register_fields as $v){
				if ($v[$this->display_type] > 0){
					$count++;
				}
			}
			return $count;
		}

		private function succes_message(){
			/*
			 * REDIRECT...
			 * @param none
			 * @return none
			 */

			if ($this->type=='create'){
				$q_arg = 'create_message';
			} else {
				$q_arg = 'update_message';
			}

			$redirect = get_option('uap_general_register_redirect');
			if ($redirect && $redirect!=-1 && $this->type=='create'){
				$url = get_permalink($redirect);
			}
			if (empty($url)){
				$url = UAP_PROTOCOL . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
			}

			$url = add_query_arg(array('uap_register'=>$q_arg), $url);

			wp_redirect($url);
			exit();
		}


		private function do_opt_in(){
				/*
				 * @param none
				 * @return none
				 */
				$double_email_verification = get_option('uap_register_double_email_verification');
				if ($this->type=='create' && empty($double_email_verification)){

						$optinAccept = uap_array_value_exists( $this->register_fields, 'uap_optin_accept', 'name' );
						if ( $optinAccept && !empty($this->register_fields[$optinAccept]['display_public_reg']) && ( !isset( $_POST['uap_optin_accept']) || sanitize_text_field($_POST['uap_optin_accept']) != 1 ) ){
								return;
						}
						if ( isset( $_POST['user_email'] ) ){
								uap_do_opt_in( sanitize_email($_POST['user_email']) );
						}
				}
		}

		private function double_email_verification(){
			/*
			 * @param none
			 * @return none
			 */
			$double_email_verification = get_option('uap_register_double_email_verification');
			if ($this->is_public && $this->type=='create' && !empty($double_email_verification) ){
				$hash = uap_random_string(10);
				update_user_meta($this->user_id, 'uap_activation_code', $hash);//put the hash into user option
				update_user_meta($this->user_id, 'uap_verification_status', -1);//set uap_verification_status @ -1

				$activation_url_w_hash = site_url();
				$activation_url_w_hash = trailingslashit($activation_url_w_hash);
				$activation_url_w_hash = add_query_arg('uap_act', 'email_verification', $activation_url_w_hash);
				$activation_url_w_hash = add_query_arg('uid', $this->user_id, $activation_url_w_hash);
				$activation_url_w_hash = add_query_arg('do_uap_code', $hash, $activation_url_w_hash);
				//send a nice notification
				uap_send_user_notifications($this->user_id, 'email_check', 0, array('{verify_email_address_link}'=>$activation_url_w_hash));
			}
		}


	}//end of class AffiliateAddEdit
}
