Turkey version : resolve some bugs(search without checking cases, remove unnecessary...
[apps/native/sample/adventure.git] / src / main_view.c
index a1cde8f..d4153e0 100644 (file)
@@ -1,6 +1,7 @@
 #include <Elementary.h>
 #include <time.h>
 #include <app_control.h>
+#include <notification.h>
 
 #include "main.h"
 #include "main_view.h"
@@ -17,6 +18,7 @@
 const char *const MAIN_VIEW_EDJE = "momentic.edj";
 const char *const ENTRY_EDJE = "entry.edj";
 const char *const PREDICT_ITEM_EDJE = "predict_item.edj";
+static int cur_page = 0;
 
 static void _append_item_to_searchlist(Evas_Object *searchlist, Evas_Object *item)
 {
@@ -63,10 +65,35 @@ static void _clean_searchlist(Evas_Object *searchlist)
        }
 }
 
+static char *_strcasestr(char *str1, char *str2)
+{
+        int len1 = 0, len2 = 0;
+
+        retv_if(!str1, NULL);
+        retv_if(!str2, NULL);
+
+        len1 = strlen(str1);
+        retv_if(!len1, NULL);
+
+        len2 = strlen(str2);
+        retv_if(!len2, NULL);
+
+        while (*str1) {
+                if (!strncasecmp(str1, str2, len2))
+                        return str1;
+                str1++;
+        }
+
+        return NULL;
+}
+
+
 static void _update_searchlist(Evas_Object *searchlist, const char *str, main_view_s *main_view_info)
 {
+       Evas_Object *predict_item = NULL;
        city_s *city_info = NULL;
        register int i = 0;
+       int count = 0;
 
        ret_if(!searchlist);
 
@@ -75,21 +102,36 @@ static void _update_searchlist(Evas_Object *searchlist, const char *str, main_vi
        city_info = city_get();
        ret_if(!city_info);
 
-       for (; i < CITY_MAX; i++) {
+       /* This is the padding before the search list */
+       predict_item = item_create_padding(searchlist);
+       if (predict_item) {
+               _append_item_to_searchlist(searchlist, predict_item);
+       }
+
+       for (; i < CITY_SYDNEY; i++) {
                int matched = 0;
-               if (city_info[i].name && strstr(city_info[i].name, str))
+               if (city_info[i].name && str && _strcasestr(city_info[i].name, str))
                        matched = 1;
-               else if (city_info[i].nation && strstr(city_info[i].nation, str))
+               else if (city_info[i].nation && str && _strcasestr(city_info[i].nation, str))
                        matched = 1;
 
                if (matched) {
-                       Evas_Object *predict_item = NULL;
                        predict_item = item_create_typing(searchlist, i, main_view_info);
                        if (predict_item)
                                _append_item_to_searchlist(searchlist, predict_item);
                }
        }
+
        elm_object_signal_emit(main_view_info->main_view, "show", "entry_result");
+
+       count = scroller_count_item(searchlist);
+       if (count > 1)
+               return;
+
+       predict_item = item_create_typing(searchlist, -1, main_view_info); 
+       if (predict_item) {
+               _append_item_to_searchlist(searchlist, predict_item);
+       }
 }
 
 static void _change_entry_cb(void *data, Evas_Object *obj, void *event_info)
@@ -206,13 +248,14 @@ static Evas_Object *_create_searchbar(Evas_Object *parent, main_view_s *main_vie
        retv_if(!entry_obj, NULL);
 
        elm_entry_single_line_set(entry_obj, EINA_TRUE);
-       elm_entry_scrollable_set(entry_obj, EINA_TRUE);
-       elm_entry_cnp_mode_set(entry_obj, ELM_CNP_MODE_PLAINTEXT);
+       /* This makes the text upper */
+       elm_entry_scrollable_set(entry_obj, EINA_FALSE);
        elm_entry_text_style_user_push(entry_obj, "DEFAULT='font_size=20'");
+       elm_entry_context_menu_disabled_set(entry_obj, EINA_TRUE);
        elm_object_part_text_set(entry_obj, "elm.guide", "<font_size=20>Search</font_size>");
 
        evas_object_size_hint_weight_set(entry_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       evas_object_size_hint_align_set(entry_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       evas_object_size_hint_align_set(entry_obj, 0.0, 0.5);
 
        evas_object_smart_callback_add(entry_obj, "changed", _change_entry_cb, main_view_info);
        evas_object_smart_callback_add(entry_obj, "focused", _focus_entry_cb, main_view_info);
@@ -237,7 +280,78 @@ static void _destroy_searchbar(Evas_Object *searchbar)
        evas_object_del(searchbar);
 }
 
-static void _click_next_btn_cb(void *data, Evas_Object *obj, void *event_info)
+static void _set_time_range(Evas_Object *item, int i, int base_city, int cur_city, double *matched_start, double *matched_end)
+{
+       double start1 = 0.0f;
+       double end1 = 0.0f;
+       double start2 = 0.0f;
+       double end2 = 0.0f;
+
+       city_s *city_info = NULL;
+
+       double start = 0;
+       double end = 0;
+       double half = 0.0f;
+
+       int tmp = 0;
+
+       city_info = city_get();
+       ret_if(!city_info);
+
+       start = city_info[cur_city].timezone - city_info[base_city].timezone + (double) BEST_START_TIME;
+
+       if (start < 0.0f)
+               start += 24.0f;
+
+       if (matched_start && matched_end) {
+               /* This end is only for the matched end */
+               end = start + BEST_DURING_TIME;
+               if (*matched_start < (double) start)
+                       *matched_start = (double) start;
+
+               if (*matched_end > (double) end)
+                       *matched_end = end;
+       }
+
+       tmp = start;
+       if (tmp != start) half = 0.5f;
+       else half = 0.0f;
+
+       tmp %= 24;
+
+       start = ((double) tmp) + half;
+       end = start + BEST_DURING_TIME;
+
+       if (end > 24.0f) {
+               start1 = (double) start;
+               end1 = 24.0f;
+
+               start2 = 0.0f;
+
+               tmp = end;
+               if (tmp != end) half = 0.5f;
+               else half = 0.0f;
+
+               end2 = (double) (tmp % 24) + half;
+       } else {
+               start1 = (double) start;
+               end1 = (double) end;
+       }
+
+       _D("HELLO, %s %f:%f:%f:%f", city_info[cur_city].name, start1, end1, start2, end2);
+
+       if (set_time_range(item, i, start1, end1, start2, end2) == EINA_FALSE)
+               _E("cannot set time range");
+}
+
+typedef struct part_info
+{
+       double p1, p2;
+
+} part_info_s;
+
+
+void main_view_click_next_btn_cb(void *data, Evas_Object *obj, void *event_info)
 {
        main_view_s *main_view_info = data;
        Evas_Object *box = NULL;
@@ -248,15 +362,16 @@ static void _click_next_btn_cb(void *data, Evas_Object *obj, void *event_info)
        time_t t;
        city_s *city_info = NULL;
        int cur_timezone = 0;
+       int base_city = 0;
+
+       double matched_start = 0.0f;
+       double matched_end = 100.0f; /* We have to initialize this variable as 100.0f */
 
        ret_if(!main_view_info);
        ret_if(!main_view_info->city_list);
-       ret_if(!main_view_info->result_list);
 
        _D("result button is clicked");
 
-       scroller_clear_item(main_view_info->result_list);
-
        city_info = city_get();
        ret_if(!city_info);
 
@@ -264,7 +379,7 @@ static void _click_next_btn_cb(void *data, Evas_Object *obj, void *event_info)
        global_time = gmtime(&t);
        local_time = localtime(&t);
 
-       cur_timezone = (int) local_time->tm_gmtoff / 3600;
+       cur_timezone = (int) local_time->tm_gmtoff / 3600l;
 
        box = elm_object_content_get(main_view_info->city_list);
        ret_if(!box);
@@ -273,32 +388,90 @@ static void _click_next_btn_cb(void *data, Evas_Object *obj, void *event_info)
        ret_if(!list);
 
        EINA_LIST_FREE(list, item) {
-               selecting_info_s *selecting_info = NULL;
-               Evas_Object *item_result = NULL;
-               int start = 0, end = 0;
-               int tmp_timezone = 0;
-
-               selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
+               selecting_info_s *selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
                continue_if(!selecting_info);
 
-               tmp_timezone = city_info[selecting_info->city].timezone;
-               if (tmp_timezone < cur_timezone)
-                       tmp_timezone += 24;
+               elm_object_signal_emit(item, "momentic,item,state,result", "");
+               elm_object_part_text_set(item, "time", "");
+
+               if (!base_city) {
+                       base_city = selecting_info->city;
+                       _set_time_range(item, selecting_info->color, base_city, base_city, &matched_start, &matched_end);
+                       continue;
+               } else
+                       _set_time_range(item, selecting_info->color, base_city, selecting_info->city, &matched_start, &matched_end);
+       }
+
+       _D("HELLO, match!! %f, %f", matched_start, matched_end);
+       item = item_create_best_time(main_view_info->city_list, matched_start, matched_end);
+       if (item) {
+               elm_object_signal_emit(item, "momentic,item,state,show", "");
+               scroller_append_item(main_view_info->city_list, item);
+       } else
+               _E("cannot append an item");
+
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,page2", "");
+       cur_page = 2;
+}
+
+void main_view_go_result(void *data)
+{
+       main_view_s *main_view_info = data;
+       Evas_Object *box = NULL;
+       Evas_Object *item = NULL;
+       Eina_List *list = NULL;
+       struct tm *global_time = NULL;
+       struct tm *local_time = NULL;
+       time_t t;
+       city_s *city_info = NULL;
+       int cur_timezone = 0;
+       int base_city = 0;
+
+       double matched_start = 0.0f;
+       double matched_end = 100.0f; /* We have to initialize this variable as 100.0f */
+
+       ret_if(!main_view_info);
+       ret_if(!main_view_info->city_list);
+
+       city_info = city_get();
+       ret_if(!city_info);
+
+       time(&t);
+       global_time = gmtime(&t);
+       local_time = localtime(&t);
 
-               start = tmp_timezone - cur_timezone + BEST_START_TIME;
-               end = (start + (BEST_END_TIME - BEST_START_TIME)) % 24;
+       cur_timezone = (int) local_time->tm_gmtoff / 3600l;
+
+       box = elm_object_content_get(main_view_info->city_list);
+       ret_if(!box);
 
-               item_result = item_create_result(main_view_info->result_list
-                               , selecting_info->city
-                               , selecting_info->color
-                               , start
-                               , end
-                               , global_time);
+       list = elm_box_children_get(box);
+       ret_if(!list);
+
+       EINA_LIST_FREE(list, item) {
+               selecting_info_s *selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
+               continue_if(!selecting_info);
 
-               scroller_append_item(main_view_info->result_list, item_result);
+               elm_object_signal_emit(item, "momentic,item,state,result", "");
+               elm_object_part_text_set(item, "time", "");
+
+               if (!base_city) {
+                       base_city = selecting_info->city;
+                       _set_time_range(item, selecting_info->color, base_city, base_city, &matched_start, &matched_end);
+                       continue;
+               } else
+                       _set_time_range(item, selecting_info->color, base_city, selecting_info->city, &matched_start, &matched_end);
        }
 
-       elm_object_signal_emit(main_view_info->main_view, "momentic,state,page2", "");
+       _D("HELLO, match!! %f, %f", matched_start, matched_end);
+       item = item_create_best_time(main_view_info->city_list, matched_start, matched_end);
+       if (item) {
+               elm_object_signal_emit(item, "momentic,item,state,show", "");
+               scroller_append_item(main_view_info->city_list, item);
+       } else
+               _E("cannot append an item");
+
+       cur_page = 4;
 }
 
 static Evas_Object *_create_next_btn(Evas_Object *parent, main_view_s *main_view_info)
@@ -319,7 +492,7 @@ static Evas_Object *_create_next_btn(Evas_Object *parent, main_view_s *main_view
        next_btn = elm_button_add(parent);
        retv_if(!next_btn, NULL);
        elm_object_style_set(next_btn, "transparent");
-       evas_object_smart_callback_add(next_btn, "clicked", _click_next_btn_cb, main_view_info);
+       evas_object_smart_callback_add(next_btn, "clicked", main_view_click_next_btn_cb, main_view_info);
 
        icon = elm_image_add(next_btn);
        if (icon) {
@@ -327,6 +500,8 @@ static Evas_Object *_create_next_btn(Evas_Object *parent, main_view_s *main_view
                elm_object_content_set(next_btn, icon);
        }
 
+       button_effect(next_btn);
+
        return next_btn;
 }
 
@@ -336,7 +511,40 @@ static void _destroy_next_btn(Evas_Object *next_btn)
        evas_object_del(next_btn);
 }
 
-static Evas_Object *_create_city_list(Evas_Object *parent)
+static void _append_here_to_city_list(Evas_Object *city_list, main_view_s *main_view_info)
+{
+       Evas_Object *item = NULL;
+       struct tm *local_time = NULL;
+       city_s *city_info = NULL;
+       time_t t;
+       int i = 0;
+
+       city_info = city_get();
+       ret_if(!city_info);
+
+       time(&t);
+       local_time = localtime(&t);
+
+       for (i = 0; i < CITY_SYDNEY; i++) {
+               if (city_info[i].timezone == ((double) (local_time->tm_gmtoff / 3600l)))
+                       break;
+       }
+
+       item = item_create_selecting(city_list, i, local_time, main_view_info);
+       if (item)
+               scroller_append_item(city_list, item);
+}
+
+static Eina_Bool
+_append_here_city_anim_cb(void *data)
+{
+       main_view_s *main_view_info = data;
+
+       _append_here_to_city_list(main_view_info->city_list, main_view_info);
+       return ECORE_CALLBACK_CANCEL;
+}
+
+static Evas_Object *_create_city_list(Evas_Object *parent, main_view_s *main_view_info)
 {
        Evas_Object *city_list = NULL;
 
@@ -345,6 +553,8 @@ static Evas_Object *_create_city_list(Evas_Object *parent)
        city_list = scroller_create(parent);
        retv_if(!city_list, NULL);
 
+       ecore_timer_add(1, _append_here_city_anim_cb, main_view_info);
+
        return city_list;
 }
 
@@ -370,7 +580,7 @@ static void _destroy_city_list(Evas_Object *city_list)
        evas_object_del(city_list);
 }
 
-static void _click_add_btn_cb(void *data, Evas_Object *obj, void *event_info)
+void main_view_click_add_btn_cb(void *data, Evas_Object *obj, void *event_info)
 {
        main_view_s *main_view_info = data;
 
@@ -380,7 +590,11 @@ static void _click_add_btn_cb(void *data, Evas_Object *obj, void *event_info)
        ret_if(!main_view_info->main_view);
 
        elm_object_signal_emit(main_view_info->main_view, "momentic,state,page1", "");
+}
 
+static void _page1_done_cb(void *data, Evas_Object *obj, const char *signal, const char *source)
+{
+       elm_object_focus_set(data, EINA_TRUE);
 }
 
 static Evas_Object *_create_add_btn(Evas_Object *parent, main_view_s *main_view_info)
@@ -401,7 +615,7 @@ static Evas_Object *_create_add_btn(Evas_Object *parent, main_view_s *main_view_
        add_btn = elm_button_add(parent);
        retv_if(!add_btn, NULL);
        elm_object_style_set(add_btn, "transparent");
-       evas_object_smart_callback_add(add_btn, "clicked", _click_add_btn_cb, main_view_info);
+       evas_object_smart_callback_add(add_btn, "clicked", main_view_click_add_btn_cb, main_view_info);
 
        icon = elm_image_add(add_btn);
        if (icon) {
@@ -409,6 +623,8 @@ static Evas_Object *_create_add_btn(Evas_Object *parent, main_view_s *main_view_
                elm_object_content_set(add_btn, icon);
        }
 
+       button_effect(add_btn);
+
        return add_btn;
 }
 
@@ -426,63 +642,132 @@ static void _click_save_button_cb(void *data, Evas_Object *obj, void *event_info
        Evas_Object *item = NULL;
        Eina_List *list = NULL;
        group_info_s *group_info = NULL;
-       int city[MAXIMUM_SELECTED_CITY] = {0, };
+       //int city[MAXIMUM_SELECTED_CITY] = {0, };
+       int city[5] = {0, }; /* FIXME : for compatibility */
        int i = 0;
-       long time = 0l;
+       char group_title[PATH_LEN] = {0, };
+       city_s *city_info = NULL;
+       char message[PATH_LEN] = {0, };
+
+       city_info = city_get();
+       ret_if(!city_info);
 
        _D("Save button is clicked");
 
        ret_if(!main_view_info);
-       ret_if(!main_view_info->result_list);
 
-       box = elm_object_content_get(main_view_info->result_list);
+       box = elm_object_content_get(main_view_info->city_list);
        ret_if(!box);
 
        list = elm_box_children_get(box);
        ret_if(!list);
 
        EINA_LIST_FREE(list, item) {
-               result_info_s *result_info = NULL;
+               selecting_info_s *selecting_info = NULL;
 
-               result_info = evas_object_data_get(item, DATA_KEY_RESULT);
-               continue_if(!result_info);
+               selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
+               break_if(!selecting_info);
 
-               city[i] = result_info->city;
+               if (i != 0) 
+                       strcat(group_title, ", ");
+
+               city[i] = selecting_info->city;
+       _D("HELLO, city[%d] - %d", i, selecting_info->city);
+               strcat(group_title, city_info[city[i]].name);
                i++;
        }
 
-       time = db_insert_group(moment_info->db
-                       , "Momentic time"
+       int id = db_insert_group(moment_info->db
+                       , group_title 
                        , city[0] 
                        , city[1]
                        , city[2]
                        , city[3]
                        , city[4]);
-       group_info = group_info_create(time
-                       , "Momentic time"
+       group_info = group_info_create(id
+                       , group_title 
                        , city[0] 
                        , city[1]
                        , city[2]
                        , city[3]
                        , city[4]);
        moment_info->group_list = eina_list_append(moment_info->group_list, group_info);
+
+       Evas_Object *item_group = item_create_group(main_view_info->group_scroller
+                               , group_info
+                               , main_view_info);
+       scroller_append_item(main_view_info->group_scroller, item_group);
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,noresult,hide", "");
+
+       snprintf(message, sizeof(message), "Create a group named <br>'%s'", group_title);
+       notification_status_message_post(message);
+}
+
+#if 0
+static void _click_save_button_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       main_view_s *main_view_info = data;
+       elm_object_signal_emit(main_view_info->save_button, "momentic,state,activate", "");
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,save_group,activate", "");
 }
 
-static Evas_Object *_create_save_button(Evas_Object *parent, moment_info_s *moment_info)
+static void _click_cancel_button_cb(void *data, Evas_Object *obj, void *event_info)
 {
+       main_view_s *main_view_info = data;
+       elm_object_signal_emit(main_view_info->save_button, "momentic,state,deactivate", "");
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,save_group,deactivate", "");
+}
+#endif
+
+
+static Evas_Object *_create_save_button(Evas_Object *parent, main_view_s *main_view_info)
+{
+       Evas_Object *popup_button = NULL;
        Evas_Object *save_button = NULL;
 
+       char *path = NULL;
+       char full_path[PATH_LEN] = {0, };
+
        retv_if(!parent, NULL);
 
-       save_button = elm_button_add(parent);
-       retv_if(!save_button, NULL);
+       path = app_get_resource_path();
+       retv_if(!path, NULL);
 
-       elm_object_text_set(save_button, "Save");
-       evas_object_size_hint_weight_set(save_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       evas_object_size_hint_align_set(save_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
-       evas_object_smart_callback_add(save_button, "clicked", _click_save_button_cb, moment_info);
+       snprintf(full_path, sizeof(full_path), "%s/edje/popup.edj", path);
+       free(path);
 
-       return save_button;
+       popup_button = elm_layout_add(parent);
+       retv_if(!popup_button, NULL);
+
+       elm_layout_file_set(popup_button, full_path, "save_as_group");
+       evas_object_size_hint_weight_set(popup_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(popup_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       evas_object_show(popup_button);
+
+       save_button = elm_button_add(parent);
+       retv_if(!save_button, NULL);
+       elm_object_style_set(save_button, "transparent");
+       elm_object_part_content_set(popup_button, "button", save_button);
+       evas_object_smart_callback_add(save_button, "clicked", _click_save_button_cb, main_view_info);
+
+#if 0
+       Evas_Object *create_button = NULL;
+       Evas_Object *cancel_button = NULL;
+
+       create_button = elm_button_add(parent);
+       retv_if(!create_button, NULL);
+       //elm_object_style_set(create_button, "transparent");
+       elm_object_part_content_set(popup_button, "create_btn", create_button);
+       //evas_object_smart_callback_add(create_button, "clicked", _click_create_button_cb, main_view_info);
+
+       cancel_button = elm_button_add(parent);
+       retv_if(!cancel_button, NULL);
+       //elm_object_style_set(cancel_button, "transparent");
+       elm_object_part_content_set(popup_button, "cancel_btn", cancel_button);
+       evas_object_smart_callback_add(cancel_button, "clicked", _click_cancel_button_cb, main_view_info);
+#endif
+
+       return popup_button;
 }
 
 static void _destroy_save_button(Evas_Object *save_button)
@@ -572,11 +857,17 @@ static Evas_Object *_create_group_scroller(Evas_Object *parent, Eina_List *list,
 
        EINA_LIST_FOREACH(list, l, group_info) {
                Evas_Object *item_group = item_create_group(group_scroller
-                               , group_info->title
+                               , group_info
                                , main_view_info);
                scroller_append_item(group_scroller, item_group);
        }
 
+       int count = scroller_count_item(group_scroller);
+       if (count)
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,noresult,hide", "");
+       else
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,noresult,show", "");
+
        return group_scroller;
 }
 
@@ -602,6 +893,76 @@ static void _destroy_group_scroller(Evas_Object *group_scroller)
        evas_object_del(group_scroller);
 }
 
+static void _main_view_back_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       main_view_s *main_view_info = data;
+       static time_t prev_t;
+       time_t cur_t;
+
+       time(&cur_t);
+
+       if (prev_t + 2 > cur_t) {
+               _D("wait a sec to process the back key event");
+               return;
+       }
+
+       prev_t = cur_t;
+       elm_object_signal_emit(obj, "momentic,state,page,back", "");
+       
+       switch (cur_page) {
+       Eina_List *list = NULL;
+       Evas_Object *item = NULL;
+       Evas_Object *tmp = NULL;
+       Evas_Object *box = NULL;
+
+       case 0:
+               _D("Page 0 [Initial page] -> Out : elm_win_lower()");
+
+               elm_win_lower(main_view_info->moment_info->win);
+               break;
+       case 1:
+               _D("Page 1 [Entry page] -> Page 0 [Initial page] : Initial city list");
+
+               item_reset_color_index();
+               scroller_clear_item(main_view_info->city_list);
+               _append_here_to_city_list(main_view_info->city_list, main_view_info);
+               elm_object_focus_set(main_view_info->searchbar, EINA_FALSE);
+               cur_page = 0;
+               break;
+       case 2:
+               _D("Page 2 [Best time page] -> Page 1 [Entry page] : Remove the best item");
+
+               box = elm_object_content_get(main_view_info->city_list);
+               ret_if(!box);
+
+               list = elm_box_children_get(box);
+               ret_if(!list);
+
+               EINA_LIST_FREE(list, item) {
+                       elm_object_signal_emit(item, "momentic,item,state,default", "");
+                       unset_time_range(item);
+                       tmp = item;
+               }
+
+               scroller_remove_item(main_view_info->city_list, tmp);
+               item_destroy_best_time(tmp);
+               cur_page = 1;
+               break;
+       case 4:
+               _D("Page 3 [Best time page] -> Page 0[Initial page]");
+
+               scroller_clear_item(main_view_info->city_list);
+               _append_here_to_city_list(main_view_info->city_list, main_view_info);
+               elm_object_signal_emit(main_view_info->main_view, "load", "");
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
+               cur_page = 0;
+               break;
+       default:
+               _E("cannot reach here");
+               break;
+       }
+}
+
 Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
 {
        main_view_s *main_view_info = NULL;
@@ -628,6 +989,8 @@ Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
                return NULL;
        }
 
+       eext_object_event_callback_add(main_view_info->main_view, EEXT_CALLBACK_BACK, _main_view_back_cb, main_view_info);
+
        elm_layout_file_set(main_view_info->main_view, full_path, "main");
        evas_object_size_hint_weight_set(main_view_info->main_view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
        evas_object_size_hint_align_set(main_view_info->main_view, EVAS_HINT_FILL, EVAS_HINT_FILL);
@@ -646,7 +1009,7 @@ Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
        if (main_view_info->next_btn)
                elm_object_part_content_set(main_view_info->main_view, "next_btn", main_view_info->next_btn);
 
-       main_view_info->city_list = _create_city_list(main_view_info->main_view);
+       main_view_info->city_list = _create_city_list(main_view_info->main_view, main_view_info);
        if (main_view_info->city_list)
                elm_object_part_content_set(main_view_info->main_view, "city_list", main_view_info->city_list);
 
@@ -658,14 +1021,17 @@ Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
        if (main_view_info->searchlist)
                elm_object_part_content_set(main_view_info->main_view, "searchlist", main_view_info->searchlist);
 
-       main_view_info->result_list = _create_result_list(main_view_info->main_view);
-       if (main_view_info->result_list)
-               elm_object_part_content_set(main_view_info->main_view, "result_list", main_view_info->result_list);
+       db_list_group(moment_info->db, &moment_info->group_list);
 
        main_view_info->group_scroller = _create_group_scroller(main_view_info->main_view, moment_info->group_list, main_view_info);
        if (main_view_info->group_scroller)
-               evas_object_hide(main_view_info->group_scroller);
-               //elm_object_part_content_set(main_view_info->main_view, "group_scroller", main_view_info->group_scroller);
+               elm_object_part_content_set(main_view_info->main_view, "drawer_content", main_view_info->group_scroller);
+
+       main_view_info->save_button = _create_save_button(main_view_info->main_view, main_view_info);
+       if (main_view_info->save_button)
+               elm_object_part_content_set(main_view_info->main_view, "save_group_btn", main_view_info->save_button);
+
+       elm_object_signal_callback_add(main_view_info->main_view, "momentic,page1,done", "", _page1_done_cb, main_view_info->searchbar);
 
        return main_view_info->main_view;
 }
@@ -680,12 +1046,12 @@ void main_view_destroy(Evas_Object *main_view)
        main_view_info = evas_object_data_del(main_view_info->main_view, DATA_KEY_INFO);
        ret_if(!main_view_info);
 
+       if (main_view_info->save_button)
+               _destroy_save_button(main_view_info->save_button);
+
        if (main_view_info->group_scroller)
                _destroy_group_scroller(main_view_info->group_scroller);
 
-       if (main_view_info->result_list)
-               _destroy_result_list(main_view_info->result_list);
-
        if (main_view_info->searchlist)
                _destroy_searchlist(main_view_info->searchlist);
 
@@ -761,6 +1127,7 @@ static void _launch_calendar_edit(int start, int end)
        ret = app_control_create(&app_control);
        ret_if(APP_CONTROL_ERROR_NONE != ret);
 
+       time(&t);
        local_time = localtime(&t);
 
        snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"