Version 1.0
[apps/native/sample/adventure.git] / src / item.c
index 8a468c2..50412fb 100644 (file)
 #include <Elementary.h>
+#include <system_settings.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <app.h>
+#include <time.h>
 
-#include "util.h"
 #include "log.h"
+#include "conf.h"
+#include "util.h"
+#include "city.h"
 #include "item.h"
-#include "item_info.h"
+#include "main_view.h"
+#include "scroller.h"
+#include "popup.h"
+#include "map.h"
+#include "notification.h"
+#include "group_info.h"
+#include "db.h"
 
+#define _EDJ(o) elm_layout_edje_get(o)
 
+const char *const DATA_KEY_CITY = "city";
+const char *const DATA_KEY_MAIN_VIEW_INFO = "mvi";
 
-#define DEFAULT_ICON "/usr/share/icons/A01-1_icon_Menu.png"
-#define ITEM_ICON_WIDTH 112
-#define ITEM_ICON_HEIGHT 112
+const char *const ITEM_EDJE = "item.edj";
+const char *const BEST_TIME_EDJE = "best_time.edj";
+const char *const ITEM2_EDJE = "item2.edj";
+static int color_index[MAXIMUM_SELECTED_CITY] = { 0, 0, 0 };
 
+void item_reset_color_index(void)
+{
+       register int i = 0;
+       for (; i < MAXIMUM_SELECTED_CITY; i++) {
+               if (EINA_FALSE == remove_city_from_map(i))
+                       _E("cannot remove the city");
 
+               color_index[i] = 0;
+       }
+}
 
-const char *const ITEM_EDJE = "item.edj";
+static double _get_local_timezone(void)
+{
+       struct tm *local_time = NULL;
+       double timezone = 0.0f;
+       time_t t;
+
+       time(&t);
+
+       local_time = localtime(&t);
+       retv_if(!local_time, 0.0f);
+
+       timezone = (double) (local_time->tm_gmtoff / 3600l);
+
+       return timezone;
+}
+
+void _text_set_here_time(Evas_Object *item, const char *part)
+{
+       char *timezone_str = NULL;
+       struct tm *local_time = NULL;
+
+       int ret = SYSTEM_SETTINGS_ERROR_NONE;
+       time_t t = 0;
+       char time_result[PATH_LEN] = {0, };
+
+       ret_if(!item);
+       ret_if(!part);
+
+       local_time = localtime(&t);
+       ret_if(!local_time);
+
+       ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE, &timezone_str);
+       if (ret != SYSTEM_SETTINGS_ERROR_NONE)
+               _E("cannot get the timezone string");
+
+       /* Timezone
+          Asia/Seoul
+        */
+       if (local_time->tm_gmtoff >= 0l)
+               snprintf(time_result, sizeof(time_result), "%s, +%ld", timezone_str, local_time->tm_gmtoff / 3600l);
+       else
+               snprintf(time_result, sizeof(time_result), "%s, %ld", timezone_str, local_time->tm_gmtoff / 3600l);
+
+       free(timezone_str);
+
+       elm_object_part_text_set(item, part, timezone_str);
+}
+
+static void _item_typing_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+       item_destroy_typing(obj);
+}
+
+static void _item_typing_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+       _D("An item is down");
+}
 
+static void _item_typing_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+       Evas_Object *item = obj;
+       Evas_Object *selecting_item = NULL;
+       Evas_Object *entry = NULL;
+       main_view_s *main_view_info = data;
+       struct tm *local_time = NULL;
+       int city = 0;
+       int count = 0;
+       time_t t = 0;
+
+       ret_if(!item);
+       ret_if(!main_view_info);
+       ret_if(!main_view_info->city_list);
+
+       _D("An item is selected");
 
+       time(&t);
+       local_time = localtime(&t);
 
-static Evas_Object *__add_icon(Evas_Object *parent, const char *file)
+       if (scroller_is_scrolling(main_view_info->searchlist))
+               return;
+
+       count = scroller_count_item(main_view_info->city_list);
+       if (count + 1 > MAXIMUM_SELECTED_CITY) {
+               _D("Cities selected are limited.");
+               notification_status_message_post("Maximum number of cities reached");
+               return;
+       }
+
+       city = (int) evas_object_data_get(item, DATA_KEY_CITY);
+       selecting_item = item_create_selecting(main_view_info->city_list, city, local_time, main_view_info);
+       ret_if(!selecting_item);
+       scroller_append_item(main_view_info->city_list, selecting_item);
+       count++;
+
+       if (count > 1) {
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,show", "");
+       } else {
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,hide", "");
+       }
+
+       entry = elm_object_part_content_get(main_view_info->searchbar, "entry");
+       elm_entry_entry_set(entry, "");
+       elm_object_focus_set(main_view_info->next_btn, EINA_TRUE);
+}
+
+Evas_Object *item_create_typing(Evas_Object *parent, int city, main_view_s *main_view_info)
 {
-       Evas_Object *icon = NULL;
+       Evas_Object *item = NULL;
+       city_s *city_info = NULL;
+
+       char *path = NULL;
+       char full_path[PATH_LEN] = {0, };
+       char city_str[PATH_LEN] = {0, };
 
        retv_if(!parent, NULL);
 
-       icon = elm_icon_add(parent);
-       retv_if(!icon, NULL);
+       path = app_get_resource_path();
+       retv_if(!path, NULL);
 
-       if (elm_image_file_set(icon, file, NULL) == EINA_FALSE) {
-               _E("Icon file is not accessible (%s)", file);
-               evas_object_del(icon);
-               return NULL;
+       snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
+       free(path);
+
+       item = elm_layout_add(parent);
+       retv_if(!item, NULL);
+
+       elm_layout_file_set(item, full_path, "item_typing");
+
+       evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       evas_object_data_set(item, DATA_KEY_CITY, (void *) city);
+       evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_typing_del_cb, NULL);
+       elm_object_signal_callback_add(item, "down", "item", _item_typing_down_cb, NULL);
+       elm_object_signal_callback_add(item, "up", "item", _item_typing_up_cb, main_view_info);
+
+       evas_object_show(item);
+
+       if (city < 0) {
+               elm_object_part_text_set(item, "city", "No results");
+               elm_object_signal_emit(item, "disable", "item");
+               return item;
        }
 
-       evas_object_size_hint_min_set(icon, ELM_SCALE_SIZE(ITEM_ICON_WIDTH), ELM_SCALE_SIZE(ITEM_ICON_HEIGHT));
+       city_info = city_get();
+       if (!city_info) {
+               _E("Critical, no city information");
+               evas_object_del(item);
+               return NULL;
+       }
 
-       elm_image_preload_disabled_set(icon, EINA_TRUE);
-       elm_image_smooth_set(icon, EINA_TRUE);
-       elm_image_no_scale_set(icon, EINA_FALSE);
-       evas_object_show(icon);
+       snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
+       elm_object_part_text_set(item, "city", city_str);
 
-       return icon;
+       return item;
 }
 
+void item_destroy_typing(Evas_Object *item)
+{
+       ret_if(!item);
+
+       evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_typing_del_cb);
+       elm_object_signal_callback_del(item, "down", "item", _item_typing_down_cb);
+       elm_object_signal_callback_del(item, "up", "item", _item_typing_up_cb);
 
+       evas_object_data_del(item, DATA_KEY_CITY);
+       evas_object_del(item);
+}
 
-static void __item_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+static void _item_selecting_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
-       item_info_s *item_info = data;
+       item_destroy_selecting(obj);
+}
 
-       ret_if(!item_info);
+static void _delete_selecting_item_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       main_view_s *main_view_info = NULL;
+       Evas_Object *item = data;
+       int count = 0;
+
+       _D("clicked, delete the selected item");
+
+       ret_if(!item);
+
+       main_view_info = evas_object_data_get(item, DATA_KEY_MAIN_VIEW_INFO);
+       ret_if(!main_view_info);
+
+       item_destroy_selecting(item);
+
+       count = scroller_count_item(main_view_info->city_list);
+       if (count > 1) {
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,show", "");
+       } else {
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,hide", "");
+       }
 }
 
+void _text_set_local_time(Evas_Object *item, const char *part, int city, struct tm *local_time)
+{
+       city_s *city_info = NULL;
+       int hour = local_time->tm_hour;
+       int minute = local_time->tm_min;
+
+       char time_result[PATH_LEN] = {0, };
+
+       ret_if(!item);
+       ret_if(!part);
+
+       city_info = city_get();
+       ret_if(!city_info);
+
+       if (((double) ((int) city_info[city].timezone)) < city_info[city].timezone) {
+               minute += 30;
+               if (minute > 60) {
+                       hour++;
+                       minute -= 60;
+               }
+       }
+
+       hour -= local_time->tm_gmtoff / 3600l;
+       hour += (int) city_info[city].timezone;
+       _D("HELLO : local_time:%d, diff:%d, timezone:%f, final_hour:%d", local_time->tm_hour, local_time->tm_gmtoff / 3600l, city_info[city].timezone, hour);
+       if (hour < 0)
+               hour += 24;
 
+       hour %= 24;
 
-Evas_Object *item_create(Evas_Object *parent, item_info_s *item_info)
+       snprintf(time_result, sizeof(time_result), "%2d:%02d", hour, minute);
+       elm_object_part_text_set(item, part, time_result);
+}
+
+Evas_Object *item_create_selecting(Evas_Object *parent, int city, struct tm *local_time, main_view_s *main_view_info)
 {
        Evas_Object *item = NULL;
-       Evas_Object *item_bg = NULL;
-       Evas_Object *icon = NULL;
-       Evas_Object *button = NULL;
-       Evas *e = NULL;
+       Evas_Object *btn = NULL;
+       city_s *city_info = NULL;
+       selecting_info_s *selecting_info = NULL;
 
        char *path = NULL;
-       char *name = NULL;
        char full_path[PATH_LEN] = {0, };
+       char city_str[PATH_LEN] = {0, };
+       char gmt_str[PATH_LEN] = {0, };
 
        retv_if(!parent, NULL);
 
+       city_info = city_get();
+       goto_if(!city_info, error);
+
+       int i = 0;
+       for (i = 0; i < MAXIMUM_SELECTED_CITY; i++) {
+               if (color_index[i]) continue;
+
+               if (EINA_FALSE == add_city_to_map(i, &city_info[city])) {
+                       _E("cannot add a city to the map");
+                       break;
+               }
+               break;
+       }
+
        path = app_get_resource_path();
        retv_if(!path, NULL);
 
-       snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
+       snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM2_EDJE);
        free(path);
 
+       selecting_info = calloc(1, sizeof(selecting_info_s));
+       retv_if(!selecting_info, NULL);
+       selecting_info->city = city;
+       selecting_info->color = i;
+
        item = elm_layout_add(parent);
        retv_if(!item, NULL);
+
        elm_layout_file_set(item, full_path, "item");
 
-       e = evas_object_evas_get(parent);
-       goto_if(!e, ERROR);
-
-       item_bg = evas_object_rectangle_add(e);
-       goto_if(!item_bg, ERROR);
-       evas_object_size_hint_weight_set(item_bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       evas_object_size_hint_min_set(item_bg, ELM_SCALE_SIZE(item_info->width), ELM_SCALE_SIZE(item_info->height));
-       evas_object_color_set(item_bg, 0, 0, 0, 0);
-       evas_object_repeat_events_set(item_bg, EINA_TRUE);
-       evas_object_show(item_bg);
-       elm_object_part_content_set(item, "bg", item_bg);
+       evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       evas_object_data_set(item, DATA_KEY_MAIN_VIEW_INFO, main_view_info);
+       evas_object_data_set(item, DATA_KEY_SELECTING, selecting_info);
+       evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb, NULL);
        evas_object_show(item);
 
-       icon = __add_icon(item, item_info->icon_path);
-       goto_if(!icon, ERROR);
-       elm_object_part_content_set(item, "icon", icon);
+       btn = elm_button_add(item);
+       if (btn) {
+               elm_object_style_set(btn, "transparent");
+               elm_object_part_content_set(item, "delete_event", btn);
+               evas_object_smart_callback_add(btn, "clicked", _delete_selecting_item_cb, item);
+               evas_object_show(btn);
+       }
+
+       snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
+       elm_object_part_text_set(item, "city", city_str);
 
-       name = item_info->name;
-       goto_if(!name, ERROR);
-       elm_object_part_text_set(item, "name", name);
+       if (city_info[city].timezone > 0)
+               snprintf(gmt_str, sizeof(gmt_str), "GMT +%.1f", city_info[city].timezone);
+       else 
+               snprintf(gmt_str, sizeof(gmt_str), "GMT %.1f", city_info[city].timezone);
 
-       button = elm_button_add(item);
-       goto_if(!button, ERROR);
+       elm_object_part_text_set(item, "gmt", gmt_str);
+       _text_set_local_time(item, "time", city, local_time);
 
-       elm_object_style_set(button, "focus");
-       elm_object_part_content_set(item, "button", button);
-       evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       evas_object_show(button);
-       evas_object_smart_callback_add(button, "clicked", __item_clicked_cb, item_info);
+       if (set_marker(item, i) == EINA_FALSE)
+               _E("cannot set the marker");
+
+       color_index[i] = 1;
 
        return item;
 
-ERROR:
-       item_destroy(item);
+error:
+       if (item)
+               evas_object_del(item);
+
+       if (selecting_info)
+               free(selecting_info);
+
        return NULL;
+}
+
+void item_destroy_selecting(Evas_Object *item)
+{
+       selecting_info_s *selecting_info = NULL;
+
+       ret_if(!item);
+
+       evas_object_data_del(item, DATA_KEY_MAIN_VIEW_INFO);
+       selecting_info = evas_object_data_del(item, DATA_KEY_SELECTING);
+       if (selecting_info) {
+       _D("HELLO, REMOVE!!");
+               if (EINA_FALSE == remove_city_from_map(selecting_info->color))
+                       _E("cannot remove the city");
+
+               color_index[selecting_info->color] = 0;
+               free(selecting_info);
+       }
+
+       evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb);
+       evas_object_del(item);
+}
+
+static void _resize_graph_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+       result_info_s *result_info = NULL;
+       int x, y, w, h;
+       int start_x = 0;
+
+       result_info = evas_object_data_get(obj, DATA_KEY_RESULT);
+       ret_if(!result_info);
+
+       edje_object_part_geometry_get(_EDJ(obj), "graph_base", &x, &y, &w, &h);
+
+       if (result_info->start > result_info->end) {
+               evas_object_move(result_info->rect2, x, y);
+               evas_object_resize(result_info->rect2, w / 10.0, h);
+               evas_object_color_set(result_info->rect2, 0, 0, 0, 255);
+               evas_object_show(result_info->rect2);
+       } else {
+               evas_object_hide(result_info->rect2);
+       }
+
+       start_x = (result_info->start / 24.0f) * w + x;
+
+       evas_object_move(result_info->rect1, start_x, y);
+       evas_object_resize(result_info->rect1, x + w - start_x, h);
+       evas_object_color_set(result_info->rect1, 0, 0, 0, 255);
+       evas_object_show(result_info->rect1);
+}
+
+static void _item_group_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+       item_destroy_group(obj);
+}
+
+static void _item_group_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+       _D("An item is down");
+}
 
+static Eina_Bool _item_group_up_timer_cb(void *data)
+{
+       Evas_Object *item = data;
+       Evas_Object *selecting_item = NULL;
+       main_view_s *main_view_info = NULL;
+       group_info_s *group_info = NULL;
+       struct tm *local_time = NULL;
+       time_t t = 0;
+       int i = 0;
+
+       retv_if(!item, ECORE_CALLBACK_CANCEL);
+
+       main_view_info = evas_object_data_get(item, DATA_KEY_MAIN_VIEW_INFO);
+       retv_if(!main_view_info, ECORE_CALLBACK_CANCEL);
+       retv_if(!main_view_info->city_list, ECORE_CALLBACK_CANCEL);
+
+       group_info = evas_object_data_get(item, GROUP_INFO);
+       retv_if(!group_info, ECORE_CALLBACK_CANCEL);
+
+       time(&t);
+       local_time = localtime(&t);
+
+       for (i = 0; i < MAXIMUM_SELECTED_CITY; i++) {
+               if (!group_info->city[i]) {
+                       _D("No city anymore");
+                       break;
+               }
+               selecting_item = item_create_selecting(main_view_info->city_list, group_info->city[i], local_time, main_view_info);
+               break_if(!selecting_item);
+               scroller_append_item(main_view_info->city_list, selecting_item);
+       }
+
+       main_view_go_result(main_view_info);
+
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,hide", "");
+       //elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer_btn,hide", "");
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,result,show", "");
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
+
+
+       return ECORE_CALLBACK_CANCEL;
 }
 
+static void _item_group_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+       main_view_s *main_view_info = data;
+       ret_if(!main_view_info);
+       ret_if(!main_view_info->city_list);
 
+       scroller_clear_item(main_view_info->city_list);
 
-void item_destroy(Evas_Object *item)
+       ecore_timer_add(0.4, _item_group_up_timer_cb, obj);
+}
+
+static void _delete_group_item_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       Evas_Object *bg = NULL;
-       Evas_Object *button = NULL;
-       Evas_Object *icon = NULL;
+       main_view_s *main_view_info = NULL;
+       Evas_Object *item = data;
+       group_info_s *group_info = NULL;
+       int count = 0;
+
+       _D("clicked, delete the group item");
 
        ret_if(!item);
 
-       button = elm_object_part_content_unset(item, "button");
-       if (button) {
-               evas_object_smart_callback_del(button, "clicked", __item_clicked_cb);
+       main_view_info = evas_object_data_get(item, DATA_KEY_MAIN_VIEW_INFO);
+       ret_if(!main_view_info);
+
+       group_info = evas_object_data_get(item, GROUP_INFO);
+       ret_if(!group_info);
+
+       db_delete_group(main_view_info->moment_info->db, group_info->id);
+       main_view_info->moment_info->group_list = eina_list_remove(main_view_info->moment_info->group_list, group_info);
+       group_info_destroy(group_info);
+
+       item_destroy_group(item);
+
+       count = scroller_count_item(main_view_info->group_scroller);
+       if (count < 1) {
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,noresult,show", "");
        }
 
-       icon = elm_object_part_content_unset(item, "icon");
-       if (icon) {
-               evas_object_del(icon);
+       
+}
+
+Evas_Object *item_create_group(Evas_Object *parent, group_info_s *group_info, main_view_s *main_view_info)
+{
+       Evas_Object *item = NULL;
+       Evas_Object *btn = NULL;
+
+       char *path = NULL;
+       char full_path[PATH_LEN] = {0, };
+
+       retv_if(!parent, NULL);
+
+       path = app_get_resource_path();
+       retv_if(!path, NULL);
+
+       snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
+       free(path);
+
+       item = elm_layout_add(parent);
+       retv_if(!item, NULL);
+
+       elm_layout_file_set(item, full_path, "item_group");
+       evas_object_data_set(item, GROUP_INFO, group_info);
+       evas_object_data_set(item, DATA_KEY_MAIN_VIEW_INFO, main_view_info);
+
+       evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_group_del_cb, NULL);
+       elm_object_signal_callback_add(item, "down", "item", _item_group_down_cb, NULL);
+       elm_object_signal_callback_add(item, "up", "item", _item_group_up_cb, main_view_info);
+
+       evas_object_show(item);
+
+       btn = elm_button_add(item);
+       if (btn) {
+               elm_object_style_set(btn, "transparent");
+               elm_object_part_content_set(item, "delete_event", btn);
+               evas_object_smart_callback_add(btn, "clicked", _delete_group_item_cb, item);
+               evas_object_show(btn);
        }
-       bg = elm_object_part_content_unset(item, "bg");
-       if (bg) {
-               evas_object_del(bg);
+
+       elm_object_part_text_set(item, "title", group_info->title);
+
+       return item;
+}
+
+void item_destroy_group(Evas_Object *item)
+{
+       ret_if(!item);
+
+       evas_object_data_del(item, GROUP_INFO);
+       evas_object_data_del(item, DATA_KEY_MAIN_VIEW_INFO);
+       evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_group_del_cb);
+       elm_object_signal_callback_del(item, "down", "item", _item_group_down_cb);
+       elm_object_signal_callback_del(item, "up", "item", _item_group_up_cb);
+
+       evas_object_del(item);
+}
+
+static void _item_padding_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+       item_destroy_padding(obj);
+}
+
+Evas_Object *item_create_padding(Evas_Object *parent)
+{
+       Evas_Object *item = NULL;
+
+       char *path = NULL;
+       char full_path[PATH_LEN] = {0, };
+
+       retv_if(!parent, NULL);
+
+       path = app_get_resource_path();
+       retv_if(!path, NULL);
+
+       snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
+       free(path);
+
+       item = elm_layout_add(parent);
+       retv_if(!item, NULL);
+
+       elm_layout_file_set(item, full_path, "item_padding");
+
+       evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_padding_del_cb, NULL);
+
+       evas_object_show(item);
+
+       return item;
+}
+
+void item_destroy_padding(Evas_Object *item)
+{
+       ret_if(!item);
+       evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_padding_del_cb);
+       evas_object_del(item);
+}
+
+static void _item_best_time_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+       item_destroy_best_time(obj);
+}
+
+Evas_Object *item_create_best_time(Evas_Object *parent, double start, double end)
+{
+       Evas_Object *item = NULL;
+
+       char *path = NULL;
+       char full_path[PATH_LEN] = {0, };
+       char time_str[PATH_LEN] = {0, };
+
+       double half;
+       int tmp = 0;
+
+       retv_if(!parent, NULL);
+
+       path = app_get_resource_path();
+       retv_if(!path, NULL);
+
+       snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, BEST_TIME_EDJE);
+       free(path);
+
+       item = elm_layout_add(parent);
+       retv_if(!item, NULL);
+
+       elm_layout_file_set(item, full_path, "best_time");
+
+       evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_best_time_del_cb, NULL);
+
+       elm_object_part_text_set(item, "city", "Best time");
+
+       evas_object_show(item);
+
+       if (start >= end) {
+               elm_object_part_text_set(item, "time", "No matched time");
+               goto out;
        }
+
+       tmp = start;
+       if (tmp == start) half = 0.0f;
+       else half = 0.5f;
+
+       if (tmp) tmp %= 24;
+       start = ((double) tmp) + half;
+
+       tmp = end;
+       if (tmp == end) half = 0.0f;
+       else half = 0.5f;
+
+       if (tmp) tmp %= 24;
+       end = ((double) tmp) + half;
+
+       _D("HELLO, Best,%f:%f", start, end);
+
+       int start_hour = start;
+       int start_minute = (start_hour == start)? 0 : 30;
+       int end_hour = end;
+       int end_minute = (end_hour == end)? 0 : 30;
+
+       snprintf(time_str, sizeof(time_str), "%d:%02d - %d:%02d", start_hour, start_minute, end_hour, end_minute);
+       elm_object_part_text_set(item, "time",  time_str);
+       if (set_time_range(item, 5, start, end, 0.0f, 0.0f) == EINA_FALSE)
+               _E("cannot set time range");
+
+out:
+       return item;
+}
+
+void item_destroy_best_time(Evas_Object *item)
+{
+       ret_if(!item);
+       evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_best_time_del_cb);
        evas_object_del(item);
 }
+