function course_unit_details($atts)
 {
     global $post_id, $wp, $coursepress;
     extract(shortcode_atts(apply_filters('shortcode_atts_course_unit_details', array('unit_id' => 0, 'field' => 'post_title', 'format' => 'true', 'additional' => '2', 'style' => 'flat', 'class' => 'course-name-content', 'tooltip_alt' => __('Percent of the unit completion', 'cp'), 'knob_fg_color' => '#24bde6', 'knob_bg_color' => '#e0e6eb', 'knob_data_thickness' => '.35', 'knob_data_width' => '70', 'knob_data_height' => '70', 'unit_title' => '', 'unit_page_title_tag' => 'h3', 'unit_page_title_tag_class' => '', 'last_visited' => 'false', 'parent_course_preceding_content' => __('Course: ', 'cp'), 'student_id' => get_current_user_ID(), 'decimal_places' => '0')), $atts));
     $unit_id = (int) $unit_id;
     $field = sanitize_html_class($field);
     $format = sanitize_text_field($format);
     $format = 'true' == $format ? true : false;
     $additional = sanitize_text_field($additional);
     $style = sanitize_html_class($style);
     $tooltip_alt = sanitize_text_field($tooltip_alt);
     $knob_fg_color = sanitize_text_field($knob_fg_color);
     $knob_bg_color = sanitize_text_field($knob_bg_color);
     $knob_data_thickness = sanitize_text_field($knob_data_thickness);
     $knob_data_width = (int) $knob_data_width;
     $knob_data_height = (int) $knob_data_height;
     $unit_title = sanitize_text_field($unit_title);
     $unit_page_title_tag = sanitize_html_class($unit_page_title_tag);
     $unit_page_title_tag_class = sanitize_html_class($unit_page_title_tag_class);
     $parent_course_preceding_content = sanitize_text_field($parent_course_preceding_content);
     $student_id = (int) $student_id;
     $last_visited = sanitize_text_field($last_visited);
     $last_visited = 'true' == $last_visited ? true : false;
     $class = sanitize_html_class($class);
     $decimal_places = sanitize_text_field($decimal_places);
     if ($unit_id == 0) {
         $unit_id = get_the_ID();
     }
     $unit = new Unit($unit_id);
     if (!isset($unit->details)) {
         $unit->details = new stdClass();
     }
     $student = new Student(get_current_user_id());
     $class = sanitize_html_class($class);
     if ($field == 'is_unit_available') {
         $unit->details->{$field} = Unit::is_unit_available($unit_id);
     }
     if ($field == 'unit_page_title') {
         $paged = isset($wp->query_vars['paged']) ? absint($wp->query_vars['paged']) : 1;
         $page_name = $unit->get_unit_page_name($paged);
         if ($unit_title !== '') {
             $page_title_prepend = $unit_title . ': ';
         } else {
             $page_title_prepend = '';
         }
         $show_title_array = get_post_meta($unit_id, 'show_page_title', true);
         $show_title = false;
         if (isset($show_title_array[$paged - 1]) && 'yes' == $show_title_array[$paged - 1]) {
             $show_title = true;
         }
         if (!empty($page_name) && $show_title) {
             $unit->details->{$field} = '<' . $unit_page_title_tag . '' . ($unit_page_title_tag_class !== '' ? ' class="' . $unit_page_title_tag_class . '"' : '') . '>' . $page_title_prepend . $unit->get_unit_page_name($paged) . '</' . $unit_page_title_tag . '>';
         } else {
             $unit->details->{$field} = '';
         }
     }
     if ($field == 'parent_course') {
         $course = new Course($unit->course_id);
         $unit->details->{$field} = $parent_course_preceding_content . '<a href="' . $course->get_permalink() . '" class="' . $class . '">' . $course->details->post_title . '</a>';
     }
     /* ------------ */
     $front_save_count = 0;
     $modules = Unit_Module::get_modules($unit_id);
     $mandatory_answers = 0;
     $mandatory = 'no';
     foreach ($modules as $mod) {
         $mandatory = get_post_meta($mod->ID, 'mandatory_answer', true);
         if ($mandatory == 'yes') {
             $mandatory_answers++;
         }
         $class_name = $mod->module_type;
         if (class_exists($class_name)) {
             if (constant($class_name . '::FRONT_SAVE')) {
                 $front_save_count++;
             }
         }
     }
     $input_modules_count = $front_save_count;
     /* ------------ */
     //$input_modules_count = do_shortcode( '[course_unit_details field="input_modules_count" unit_id="' . $unit_id . '"]' );
     $responses_count = 0;
     $modules = Unit_Module::get_modules($unit_id);
     foreach ($modules as $module) {
         if (Unit_Module::did_student_respond($module->ID, $student_id)) {
             $responses_count++;
         }
     }
     $student_modules_responses_count = $responses_count;
     //$student_modules_responses_count = do_shortcode( '[course_unit_details field="student_module_responses" unit_id="' . $unit_id . '"]' );
     if ($student_modules_responses_count > 0) {
         $percent_value = $mandatory_answers > 0 ? round(100 / $mandatory_answers * $student_modules_responses_count, 0) : 0;
         $percent_value = $percent_value > 100 ? 100 : $percent_value;
         //in case that student gave answers on all mandatory plus optional questions
     } else {
         $percent_value = 0;
     }
     if ($input_modules_count == 0) {
         $grade = 0;
         $front_save_count = 0;
         $assessable_answers = 0;
         $responses = 0;
         $graded = 0;
         //$input_modules_count = do_shortcode( '[course_unit_details field="input_modules_count" unit_id="' . get_the_ID() . '"]' );
         $modules = Unit_Module::get_modules($unit_id);
         if ($input_modules_count > 0) {
             foreach ($modules as $mod) {
                 $class_name = $mod->module_type;
                 $assessable = get_post_meta($mod->ID, 'gradable_answer', true);
                 if (class_exists($class_name)) {
                     if (constant($class_name . '::FRONT_SAVE')) {
                         if ($assessable == 'yes') {
                             $assessable_answers++;
                         }
                         $front_save_count++;
                         $response = call_user_func($class_name . '::get_response', $student_id, $mod->ID);
                         if (isset($response->ID)) {
                             $grade_data = Unit_Module::get_response_grade($response->ID);
                             $grade = $grade + $grade_data['grade'];
                             if (get_post_meta($response->ID, 'response_grade')) {
                                 $graded++;
                             }
                             $responses++;
                         }
                     } else {
                         //read only module
                     }
                 }
             }
             $percent_value = $format == true ? ($responses == $graded && $responses == $front_save_count ? '<span class="grade-active">' : '<span class="grade-inactive">') . ($grade > 0 ? round($grade / $assessable_answers, 0) : 0) . '</span>' : ($grade > 0 ? round($grade / $assessable_answers, 0) : 0);
         } else {
             $student = new Student($student_id);
             if ($student->is_unit_visited($unit_id, $student_id)) {
                 $grade = 100;
                 $percent_value = $format == true ? '<span class="grade-active">' . $grade . '</span>' : $grade;
             } else {
                 $grade = 0;
                 $percent_value = $format == true ? '<span class="grade-inactive">' . $grade . '</span>' : $grade;
             }
         }
         //$percent_value = do_shortcode( '[course_unit_details field="student_unit_grade" unit_id="' . get_the_ID() . '"]' );
     }
     //redirect to the parent course page if not enrolled
     if (!current_user_can('manage_options')) {
         if (!$coursepress->check_access($unit->course_id, $unit_id)) {
             // if( defined('DOING_AJAX') && DOING_AJAX ) { cp_write_log('doing ajax'); }
             //ob_start();
             wp_redirect(get_permalink($unit->course_id));
             exit;
         }
     }
     if ($field == 'percent') {
         //				$completion		 = new Course_Completion( $unit->course_id );
         //				$completion->init_student_status();
         //				$percent_value	 = $completion->unit_progress( $unit_id );
         $percent_value = number_format_i18n(Student_Completion::calculate_unit_completion($student_id, $unit->course_id, $unit_id), $decimal_places);
         $assessable_input_modules_count = do_shortcode('[course_unit_details field="assessable_input_modules_count"]');
         if ($style == 'flat') {
             $unit->details->{$field} = '<span class="percentage">' . ($format == true ? $percent_value . '%' : $percent_value) . '</span>';
         } elseif ($style == 'none') {
             $unit->details->{$field} = $percent_value;
         } else {
             $unit->details->{$field} = '<a class="tooltip" alt="' . $tooltip_alt . '"><input class="knob" data-fgColor="' . $knob_fg_color . '" data-bgColor="' . $knob_bg_color . '" data-thickness="' . $knob_data_thickness . '" data-width="' . $knob_data_width . '" data-height="' . $knob_data_height . '" data-readOnly=true value="' . $percent_value . '"></a>';
         }
     }
     if ($field == 'permalink') {
         if ($last_visited) {
             $last_visited_page = cp_get_last_visited_unit_page($unit_id);
             $unit->details->{$field} = Unit::get_permalink($unit_id, $unit->course_id) . 'page/' . trailingslashit($last_visited_page);
         } else {
             $unit->details->{$field} = Unit::get_permalink($unit_id, $unit->course_id);
         }
     }
     if ($field == 'input_modules_count') {
         $front_save_count = 0;
         $modules = Unit_Module::get_modules($unit_id);
         foreach ($modules as $mod) {
             $class_name = $mod->module_type;
             if (class_exists($class_name)) {
                 if (constant($class_name . '::FRONT_SAVE')) {
                     $front_save_count++;
                 }
             }
         }
         $unit->details->{$field} = $front_save_count;
     }
     if ($field == 'mandatory_input_modules_count') {
         $front_save_count = 0;
         $mandatory_answers = 0;
         $modules = Unit_Module::get_modules($unit_id);
         foreach ($modules as $mod) {
             $mandatory_answer = get_post_meta($mod->ID, 'mandatory_answer', true);
             $class_name = $mod->module_type;
             if (class_exists($class_name)) {
                 if (constant($class_name . '::FRONT_SAVE')) {
                     if ($mandatory_answer == 'yes') {
                         $mandatory_answers++;
                     }
                     //$front_save_count++;
                 }
             }
         }
         $unit->details->{$field} = $mandatory_answers;
     }
     if ($field == 'assessable_input_modules_count') {
         $front_save_count = 0;
         $assessable_answers = 0;
         $modules = Unit_Module::get_modules($unit_id);
         foreach ($modules as $mod) {
             $assessable = get_post_meta($mod->ID, 'gradable_answer', true);
             $class_name = $mod->module_type;
             if (class_exists($class_name)) {
                 if (constant($class_name . '::FRONT_SAVE')) {
                     if ($assessable == 'yes') {
                         $assessable_answers++;
                     }
                     //$front_save_count++;
                 }
             }
         }
         if (isset($unit->details->{$field})) {
             $unit->details->{$field} = $assessable_answers;
         }
     }
     if ($field == 'student_module_responses') {
         $responses_count = 0;
         $mandatory_answers = 0;
         $modules = Unit_Module::get_modules($unit_id);
         foreach ($modules as $module) {
             $mandatory = get_post_meta($module->ID, 'mandatory_answer', true);
             if ($mandatory == 'yes') {
                 $mandatory_answers++;
             }
             if (Unit_Module::did_student_respond($module->ID, $student_id)) {
                 $responses_count++;
             }
         }
         if ($additional == 'mandatory') {
             if ($responses_count > $mandatory_answers) {
                 $unit->details->{$field} = $mandatory_answers;
             } else {
                 $unit->details->{$field} = $responses_count;
             }
             //so we won't have 7 of 6 mandatory answered but mandatory number as a max number
         } else {
             $unit->details->{$field} = $responses_count;
         }
     }
     if ($field == 'student_unit_grade') {
         $grade = 0;
         $front_save_count = 0;
         $responses = 0;
         $graded = 0;
         $input_modules_count = do_shortcode('[course_unit_details field="input_modules_count" unit_id="' . get_the_ID() . '"]');
         $modules = Unit_Module::get_modules($unit_id);
         $mandatory_answers = 0;
         $assessable_answers = 0;
         if ($input_modules_count > 0) {
             foreach ($modules as $mod) {
                 $class_name = $mod->module_type;
                 if (class_exists($class_name)) {
                     if (constant($class_name . '::FRONT_SAVE')) {
                         $front_save_count++;
                         $response = call_user_func($class_name . '::get_response', $student_id, $mod->ID);
                         $assessable = get_post_meta($mod->ID, 'gradable_answer', true);
                         $mandatory = get_post_meta($mod->ID, 'mandatory_answer', true);
                         if ($assessable == 'yes') {
                             $assessable_answers++;
                         }
                         if (isset($response->ID)) {
                             if ($assessable == 'yes') {
                                 $grade_data = Unit_Module::get_response_grade($response->ID);
                                 $grade = $grade + $grade_data['grade'];
                                 if (get_post_meta($response->ID, 'response_grade')) {
                                     $graded++;
                                 }
                                 $responses++;
                             }
                         }
                     } else {
                         //read only module
                     }
                 }
             }
             $unit->details->{$field} = $format == true ? ($responses == $graded && $responses == $front_save_count ? '<span class="grade-active">' : '<span class="grade-inactive">') . ($grade > 0 ? round($grade / $assessable_answers, 0) : 0) . '%</span>' : ($grade > 0 ? round($grade / $assessable_answers, 0) : 0);
         } else {
             $student = new Student($student_id);
             if ($student->is_unit_visited($unit_id, $student_id)) {
                 $grade = 100;
                 $unit->details->{$field} = $format == true ? '<span class="grade-active">' . $grade . '%</span>' : $grade;
             } else {
                 $grade = 0;
                 $unit->details->{$field} = $format == true ? '<span class="grade-inactive">' . $grade . '%</span>' : $grade;
             }
         }
     }
     if ($field == 'student_unit_modules_graded') {
         $grade = 0;
         $front_save_count = 0;
         $responses = 0;
         $graded = 0;
         $modules = Unit_Module::get_modules($unit_id);
         foreach ($modules as $mod) {
             $class_name = $mod->module_type;
             if (class_exists($class_name)) {
                 if (constant($class_name . '::FRONT_SAVE')) {
                     $front_save_count++;
                     $response = call_user_func($class_name . '::get_response', $student_id, $mod->ID);
                     if (isset($response->ID)) {
                         $grade_data = Unit_Module::get_response_grade($response->ID);
                         $grade = $grade + $grade_data['grade'];
                         if (get_post_meta($response->ID, 'response_grade')) {
                             $graded++;
                         }
                         $responses++;
                     }
                 } else {
                     //read only module
                 }
             }
         }
         $unit->details->{$field} = $graded;
     }
     if (isset($unit->details->{$field})) {
         return $unit->details->{$field};
     }
 }