Turkey version : resolve some bugs(search without checking cases, remove unnecessary...
[apps/native/sample/adventure.git] / src / main_view.c
index 2633222..d4153e0 100644 (file)
 #include <Elementary.h>
+#include <time.h>
+#include <app_control.h>
+#include <notification.h>
+
 #include "main.h"
+#include "main_view.h"
 #include "log.h"
 #include "scroller.h"
 #include "city.h"
-
-const char *const MAIN_VIEW_EDJE = "main_view.edj";
+#include "util.h"
+#include "item.h"
+#include "conf.h"
+#include "group_info.h"
+#include "db.h"
+#include "map.h"
+
+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)
+{
+       Evas_Object *box = NULL;
+
+       ret_if(!searchlist);
+       ret_if(!item);
+
+       box = elm_object_content_get(searchlist);
+       ret_if(!box);
+
+       elm_box_pack_end(box, item);
+}
+
+static void _remove_item_in_searchlist(Evas_Object *searchlist, Evas_Object *item)
+{
+       Evas_Object *box = NULL;
+
+       ret_if(!searchlist);
+       ret_if(!item);
+
+       box = elm_object_content_get(searchlist);
+       ret_if(!box);
+
+       elm_box_unpack(box, item);
+}
+
+static void _clean_searchlist(Evas_Object *searchlist)
+{
+       Evas_Object *box = NULL;
+       Evas_Object *predict_item = NULL;
+       Eina_List *list = NULL;
+
+       ret_if(!searchlist);
+
+       box = elm_object_content_get(searchlist);
+       ret_if(!box);
+
+       list = elm_box_children_get(box);
+       ret_if(!list);
+
+       EINA_LIST_FREE(list, predict_item) {
+               item_destroy_typing(predict_item);
+       }
+}
+
+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);
+
+       _clean_searchlist(searchlist);
+
+       city_info = city_get();
+       ret_if(!city_info);
+
+       /* 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 && str && _strcasestr(city_info[i].name, str))
+                       matched = 1;
+               else if (city_info[i].nation && str && _strcasestr(city_info[i].nation, str))
+                       matched = 1;
+
+               if (matched) {
+                       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)
 {
@@ -13,304 +140,834 @@ static void _change_entry_cb(void *data, Evas_Object *obj, void *event_info)
        Evas_Object *entry = obj;
        const char *str = NULL;
 
-       ret_if(!moment_info);
+       ret_if(!main_view_info);
 
-       str = elm_entry_entry_get(obj);
-       if (!str)
+       _D("Entry is changed");
+
+       str = elm_entry_entry_get(entry);
+       if (!str
+               || (str && !strlen(str))) {
+               _clean_searchlist(main_view_info->searchlist);
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,searchlist,hide", "");
                return;
+       }
 
-       _update_predict_scroller(main_view_info->predict_scroller, str);
+       _update_searchlist(main_view_info->searchlist, str, main_view_info);
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,searchlist,show", "");
 }
 
 static void _focus_entry_cb(void *data, Evas_Object *obj, void *event_info)
 {
+       main_view_s *main_view_info = data;
+       Evas_Object *entry = obj;
+       const char *str = NULL;
+
+       ret_if(!main_view_info);
+
+       _D("Entry is focused");
+
+       str = elm_entry_entry_get(entry);
+       if (!str)
+               return;
+
+       _update_searchlist(main_view_info->searchlist, str, main_view_info);
 }
 
 static void _unfocus_entry_cb(void *data, Evas_Object *obj, void *event_info)
 {
+       main_view_s *main_view_info = data;
+
+       ret_if(!main_view_info);
+       ret_if(!main_view_info->searchlist);
+
+       _D("Entry is unfocused");
+
+       elm_object_signal_emit(main_view_info->main_view, "hide", "entry_result");
+       //_clean_searchlist(main_view_info->searchlist);
+}
+
+static void _resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+       int x, y, w, h;
+       evas_object_geometry_get(obj, &x, &y, &w, &h);
+       _D("%s (%d:%d:%d:%d)", data, x, y, w, h);
+}
+
+static void _delete_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+       _D("Delete button is down");
+}
+
+static void _delete_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+       Evas_Object *searchbar = obj;
+       Evas_Object *entry_obj = NULL;
+       main_view_s *main_view_info = data;
+
+       ret_if(!searchbar);
+       ret_if(!main_view_info);
+       ret_if(!main_view_info->searchlist);
+
+       _D("Delete button is up");
+
+       entry_obj = elm_object_part_content_get(searchbar, "entry");
+       if (entry_obj)
+               elm_entry_entry_set(entry_obj, "");
+
+       _clean_searchlist(main_view_info->searchlist);
 }
 
-static Evas_Object *_create_search_entry(Evas_Object *parent, moment_info_s *moment_info)
+static Evas_Object *_create_searchbar(Evas_Object *parent, main_view_s *main_view_info)
 {
-       Evas_Object *entry = NULL;
+       Evas_Object *searchbar = NULL;
+       Evas_Object *entry_obj = NULL;
+
+       char *path = NULL;
+       char full_path[PATH_LEN] = {0, };
 
        retv_if(!parent, NULL);
 
-       entry = elm_entry_add(parent);
-       retv_if(!entry, NULL);
+       path = app_get_resource_path();
+       retv_if(!path, NULL);
+
+       snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ENTRY_EDJE);
+       free(path);
+
+       searchbar = elm_layout_add(parent);
+       retv_if(!searchbar, NULL);
+
+       elm_layout_file_set(searchbar, full_path, "main");
+       elm_object_signal_callback_add(searchbar, "delete,down", "entry", _delete_down_cb, main_view_info);
+       elm_object_signal_callback_add(searchbar, "delete,up", "entry", _delete_up_cb, main_view_info);
+
+       evas_object_size_hint_weight_set(searchbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(searchbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       evas_object_show(searchbar);
 
-       elm_entry_single_line_set(entry, EINA_TRUE);
-       elm_entry_scrollable_set(entry, EINA_TRUE);
-       elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
-       elm_object_part_text_set(entry, "elm.guide", "Search");
+       entry_obj = elm_entry_add(parent);
+       retv_if(!entry_obj, NULL);
 
-       evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       elm_entry_single_line_set(entry_obj, EINA_TRUE);
+       /* 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_smart_callback_add(entry, "changed", _change_entry_cb, main_view_info);
-       evas_object_smart_callback_add(entry, "focused", _focus_entry_cb, main_view_info);
-       evas_object_smart_callback_add(entry, "unfocused", _unfocus_entry_cb, main_view_info);
+       evas_object_size_hint_weight_set(entry_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(entry_obj, 0.0, 0.5);
 
-       evas_object_show(entry);
+       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);
+       evas_object_smart_callback_add(entry_obj, "unfocused", _unfocus_entry_cb, main_view_info);
 
-       return entry;
+       evas_object_show(entry_obj);
+       elm_object_part_content_set(searchbar, "entry", entry_obj);
+
+       return searchbar;
 }
 
-static void _destroy_search_entry(Evas_Object *entry)
+static void _destroy_searchbar(Evas_Object *searchbar)
 {
-       ret_if(!entry);
-       evas_object_del(entry);
+       Evas_Object *entry_obj = NULL;
+
+       ret_if(!searchbar);
+
+       entry_obj = elm_object_part_content_unset(searchbar, "entry");
+       if (entry_obj)
+               evas_object_del(entry_obj);
+
+       evas_object_del(searchbar);
 }
 
-static Evas_Object *_create_map(Evas_Object *parent)
+static void _set_time_range(Evas_Object *item, int i, int base_city, int cur_city, double *matched_start, double *matched_end)
 {
-       Evas_Object *map = NULL;
-       Evas *e = NULL;
+       double start1 = 0.0f;
+       double end1 = 0.0f;
+       double start2 = 0.0f;
+       double end2 = 0.0f;
 
-       retv_if(!parent, NULL);
+       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;
+       }
 
-       e = evas_object_evas_get(parent);
-       retv_if(!e, NULL);
+       tmp = start;
+       if (tmp != start) half = 0.5f;
+       else half = 0.0f;
 
-       map = evas_object_rectangle_add(e);
-       retv_if(!map, NULL);
+       tmp %= 24;
 
-       evas_object_color_set(map, 200, 200, 0, 255);
-       evas_object_size_hint_min_set(map, 480, 400);
-       evas_object_show(map);
+       start = ((double) tmp) + half;
+       end = start + BEST_DURING_TIME;
 
-       return map;
+       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");
 }
 
-static void _destroy_map(Evas_Object *map)
+typedef struct part_info
 {
-       ret_if(!map);
+       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;
+       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);
+
+       _D("result button is clicked");
+
+       city_info = city_get();
+       ret_if(!city_info);
 
-       evas_object_del(map);
+       time(&t);
+       global_time = gmtime(&t);
+       local_time = localtime(&t);
+
+       cur_timezone = (int) local_time->tm_gmtoff / 3600l;
+
+       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) {
+               selecting_info_s *selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
+               continue_if(!selecting_info);
+
+               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;
 }
 
-static _click_result_button_cb(void *data, Evas_Object *obj, void *event_info)
+void main_view_go_result(void *data)
 {
-       moment_info_s *moment_info = 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;
 
-       _D("Add button is clicked");
+       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);
+
+       cur_timezone = (int) local_time->tm_gmtoff / 3600l;
+
+       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) {
+               selecting_info_s *selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
+               continue_if(!selecting_info);
+
+               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);
+       }
 
-       ret_if(!moment_info);
+       _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");
 
-       moment_info->result_view = result_view_create(moment_info->ui_manager);
-       ret_if(!moment_info->result_view);
+       cur_page = 4;
 }
 
-static Evas_Object *_create_result_button(Evas_Object *parent, main_view_s *main_view_info)
+static Evas_Object *_create_next_btn(Evas_Object *parent, main_view_s *main_view_info)
 {
-       Evas_Object *result_button = NULL;
+       Evas_Object *next_btn = NULL;
+       Evas_Object *icon = NULL;
+       char *path = NULL;
+       char full_path[PATH_LEN] = {0, };
+
+       retv_if(!parent, NULL);
 
-       result_button = elm_button_add(parent);
-       retv_if(!result_button, NULL);
+       path = app_get_resource_path();
+       retv_if(!path, NULL);
+
+       snprintf(full_path, sizeof(full_path), "%s/images/next_btn.png", path);
+       free(path);
+
+       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", main_view_click_next_btn_cb, main_view_info);
+
+       icon = elm_image_add(next_btn);
+       if (icon) {
+               elm_image_file_set(icon, full_path, NULL);
+               elm_object_content_set(next_btn, icon);
+       }
 
-       elm_object_part_text_set(result_button, "Result");
-       evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
-       evas_object_smart_callback_add(button, "clicked", _click_result_button_cb, moment_info);
+       button_effect(next_btn);
 
-       return result_button;
+       return next_btn;
 }
 
-static void _destroy_result_button(Evas_Object *result_button)
+static void _destroy_next_btn(Evas_Object *next_btn)
 {
-       ret_if(!result_button);
-       evas_object_del(result_button);
+       ret_if(!next_btn);
+       evas_object_del(next_btn);
 }
 
-static Evas_Object *_create_selected_scroller(Evas_Object *parent)
+static void _append_here_to_city_list(Evas_Object *city_list, main_view_s *main_view_info)
 {
-       Evas_Object *selected_scroller = NULL;
+       Evas_Object *item = NULL;
+       struct tm *local_time = NULL;
+       city_s *city_info = NULL;
+       time_t t;
+       int i = 0;
 
-       retv_if(!parent, NULL);
+       city_info = city_get();
+       ret_if(!city_info);
 
-       selected_scroller = scroller_create(parent);
-       retv_if(!selected_scroller, NULL);
+       time(&t);
+       local_time = localtime(&t);
 
-       return selected_scroller;
+       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 void _destroy_selected_scroller(Evas_Object *selected_scroller)
+static Eina_Bool
+_append_here_city_anim_cb(void *data)
 {
-       ret_if(!selected_scroller);
+       main_view_s *main_view_info = data;
 
-       evas_object_del(selected_scroller);
+       _append_here_to_city_list(main_view_info->city_list, main_view_info);
+       return ECORE_CALLBACK_CANCEL;
 }
 
-static _click_plus_button_cb(void *data, Evas_Object *obj, void *event_info)
+static Evas_Object *_create_city_list(Evas_Object *parent, main_view_s *main_view_info)
 {
-       moment_info_s *moment_info = data;
+       Evas_Object *city_list = NULL;
 
-       _D("Add button is clicked");
+       retv_if(!parent, NULL);
+
+       city_list = scroller_create(parent);
+       retv_if(!city_list, NULL);
 
-       ret_if(!moment_info);
+       ecore_timer_add(1, _append_here_city_anim_cb, main_view_info);
 
-       /* Show the entry */
+       return city_list;
 }
 
-static Evas_Object *_create_plus_button(Evas_Object *parent, main_view_s *main_view_info)
+static void _destroy_city_list(Evas_Object *city_list)
 {
-       Evas_Object *plus_button = NULL;
+       Evas_Object *box = NULL;
+       Evas_Object *item = NULL;
+       Eina_List *list = NULL;
 
-       retv_if(!parent, NULL);
+       ret_if(!city_list);
 
-       plus_button = elm_button_add(parent);
-       retv_if(!plus_button, NULL);
+       box = elm_object_content_get(city_list);
+       ret_if(!box);
 
-       elm_object_part_text_set(plus_button, "+Add");
-       evas_object_size_hint_weight_set(plus_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       evas_object_size_hint_align_set(plus_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
-       evas_object_smart_callback_add(plus_button, "clicked", _click_plus_button_cb, main_view_info);
+       list = elm_box_children_get(box);
+       ret_if(!list);
+
+       EINA_LIST_FREE(list, item) {
+               evas_object_del(item);
+       }
 
-       return plus_button;
+       evas_object_del(box);
+       evas_object_del(city_list);
 }
 
-static void _destroy_plus_button(Evas_Object *plus_button)
+void main_view_click_add_btn_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       ret_if(!plus_button);
-       evas_object_del(plus_button);
+       main_view_s *main_view_info = data;
+
+       _D("Add button is clicked");
+
+       ret_if(!main_view_info);
+       ret_if(!main_view_info->main_view);
+
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,page1", "");
 }
 
-static Evas_Object *_create_predict_item(Evas_Object *parent, const char *city, const char *nation)
+static void _page1_done_cb(void *data, Evas_Object *obj, const char *signal, const char *source)
 {
-       Evas_Object *predict_item = NULL;
+       elm_object_focus_set(data, EINA_TRUE);
+}
 
+static Evas_Object *_create_add_btn(Evas_Object *parent, main_view_s *main_view_info)
+{
+       Evas_Object *add_btn = NULL;
+       Evas_Object *icon = NULL;
        char *path = NULL;
        char full_path[PATH_LEN] = {0, };
-       char city_name[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, PREDICT_ITEM_EDJE);
+       snprintf(full_path, sizeof(full_path), "%s/images/add_btn.png", path);
        free(path);
 
-       predict_item = elm_layout_add(parent);
-       retv_if(!predict_item, NULL);
+       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", main_view_click_add_btn_cb, main_view_info);
+
+       icon = elm_image_add(add_btn);
+       if (icon) {
+               elm_image_file_set(icon, full_path, NULL);
+               elm_object_content_set(add_btn, icon);
+       }
+
+       button_effect(add_btn);
+
+       return add_btn;
+}
+
+static void _destroy_add_btn(Evas_Object *add_btn)
+{
+       ret_if(!add_btn);
+       evas_object_del(add_btn);
+}
+
+static void _click_save_button_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       main_view_s *main_view_info = data;
+       moment_info_s *moment_info = main_view_info->moment_info;
+       Evas_Object *box = NULL;
+       Evas_Object *item = NULL;
+       Eina_List *list = NULL;
+       group_info_s *group_info = NULL;
+       //int city[MAXIMUM_SELECTED_CITY] = {0, };
+       int city[5] = {0, }; /* FIXME : for compatibility */
+       int i = 0;
+       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);
+
+       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) {
+               selecting_info_s *selecting_info = NULL;
+
+               selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
+               break_if(!selecting_info);
 
-       elm_layout_file_set(predict_item, full_path, "main");
-       evas_object_size_hint_weight_set(predict_item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       evas_object_size_hint_align_set(predict_item, EVAS_HINT_FILL, EVAS_HINT_FILL);
-       evas_object_show(predict_item);
+               if (i != 0) 
+                       strcat(group_title, ", ");
 
-       snprintf(city_name, sizeof(city_name), "%s, %s", city, nation);
-       elm_object_part_text_set(predict_item, "city", city_name);
+               city[i] = selecting_info->city;
+       _D("HELLO, city[%d] - %d", i, selecting_info->city);
+               strcat(group_title, city_info[city[i]].name);
+               i++;
+       }
 
-       return predict_item;
+       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(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);
 }
 
-static void _destroy_predict_item(Evas_Object *predict_item)
+#if 0
+static void _click_save_button_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       ret_if(!predict_item);
-       evas_object_del(predict_item);
+       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_predict_scroller(Evas_Object *parent)
+static void _click_cancel_button_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       Evas_Object *predict_scroller = NULL;
+       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);
 
-       predict_scroller = scroller_create(parent);
-       retv_if(!predict_scroller, NULL);
+       path = app_get_resource_path();
+       retv_if(!path, NULL);
+
+       snprintf(full_path, sizeof(full_path), "%s/edje/popup.edj", path);
+       free(path);
 
-       return predict_scroller;
+       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_predict_scroller(Evas_Object *predict_scroller)
+static void _destroy_save_button(Evas_Object *save_button)
 {
-       ret_if(!predict_scroller);
+       ret_if(!save_button);
+       evas_object_del(save_button);
+}
+
+static Evas_Object *_create_searchlist(Evas_Object *parent)
+{
+       Evas_Object *searchlist = NULL;
+
+       retv_if(!parent, NULL);
+
+       searchlist = scroller_create(parent);
+       retv_if(!searchlist, NULL);
 
-       evas_object_del(predict_scroller);
+       return searchlist;
 }
 
-static void _clean_predict_scroller(Evas_Object *predict_scroller)
+static void _destroy_searchlist(Evas_Object *searchlist)
 {
        Evas_Object *box = NULL;
-       Evas_Object *predict_item = NULL;
+       Evas_Object *item = NULL;
        Eina_List *list = NULL;
 
-       ret_if(!predict_scroller);
+       ret_if(!searchlist);
 
-       box = elm_object_content_get(predict_scroller);
+       box = elm_object_content_get(searchlist);
        ret_if(!box);
 
        list = elm_box_children_get(box);
        ret_if(!list);
 
-       EINA_LIST_FREE(list, predict_item) {
-               _destroy_predict_item(predict_item);
+       EINA_LIST_FREE(list, item) {
+               evas_object_del(item);
        }
+
+       evas_object_del(box);
+       evas_object_del(searchlist);
+}
+
+static Evas_Object *_create_result_list(Evas_Object *parent)
+{
+       Evas_Object *result_list = NULL;
+
+       retv_if(!parent, NULL);
+
+       result_list = scroller_create(parent);
+       retv_if(!result_list, NULL);
+
+       return result_list;
 }
 
-static void _append_item_to_predict_scroller(Evas_Object *predict_scroller, Evas_Object *item)
+static void _destroy_result_list(Evas_Object *result_list)
 {
        Evas_Object *box = NULL;
+       Evas_Object *item = NULL;
+       Eina_List *list = NULL;
 
-       ret_if(!predict_scroller);
-       ret_if(!item);
+       ret_if(!result_list);
 
-       box = elm_object_content_get(predict_scroller);
+       box = elm_object_content_get(result_list);
        ret_if(!box);
 
-       elm_box_pack_end(box, item);
+       list = elm_box_children_get(box);
+       ret_if(!list);
+
+       EINA_LIST_FREE(list, item) {
+               evas_object_del(item);
+       }
+
+       evas_object_del(box);
+       evas_object_del(result_list);
+}
+
+static Evas_Object *_create_group_scroller(Evas_Object *parent, Eina_List *list, main_view_s *main_view_info)
+{
+       Evas_Object *group_scroller = NULL;
+       group_info_s *group_info = NULL;
+       const Eina_List *l = NULL;
+
+       retv_if(!parent, NULL);
+
+       group_scroller = scroller_create(parent);
+       retv_if(!group_scroller, NULL);
+
+       EINA_LIST_FOREACH(list, l, group_info) {
+               Evas_Object *item_group = item_create_group(group_scroller
+                               , 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;
 }
 
-static void _remove_item_in_predict_scroller(Evas_Object *predict_scroller, Evas_Object *item)
+static void _destroy_group_scroller(Evas_Object *group_scroller)
 {
        Evas_Object *box = NULL;
        Evas_Object *item = NULL;
+       Eina_List *list = NULL;
 
-       ret_if(!predict_scroller);
-       ret_if(!item);
+       ret_if(!group_scroller);
 
-       box = elm_object_content_get(predict_scroller);
+       box = elm_object_content_get(group_scroller);
        ret_if(!box);
 
-       elm_box_unpack(box, item);
+       list = elm_box_children_get(box);
+       ret_if(!list);
+
+       EINA_LIST_FREE(list, item) {
+               evas_object_del(item);
+       }
+
+       evas_object_del(box);
+       evas_object_del(group_scroller);
 }
 
-static void _update_predict_scroller(Evas_Object *predict_scroller, const char *str)
+static void _main_view_back_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       city_s *city_info = NULL;
-       register int i = 0;
+       main_view_s *main_view_info = data;
+       static time_t prev_t;
+       time_t cur_t;
 
-       ret_if(!predict_scroller);
+       time(&cur_t);
 
-       if (!str)
-               _clean_predict_scroller(predict_scroller);
-
-       city_info = city_get();
-       ret_if(!city_info);
+       if (prev_t + 2 > cur_t) {
+               _D("wait a sec to process the back key event");
+               return;
+       }
 
-       for (; i < CITY_MAX; i++) {
-               int matched = 0;
-               if (city_info[i]->name && strstr(city_info[i]->name, str))
-                       matched = 1;
-               else if (city_info[i]->nation && strstr(city_info[i]->nation, str))
-                       matched = 1;
+       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;
 
-               if (matched) {
-                       Evas_Object *predict_item = NULL;
-                       predict_item = _create_predict_item(predict_scroller, city_info[i]->name, city_info[i]->nation);
-                       if (predict_item)
-                               _append_item_to_predict_scroller(predict_scroller);
+       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)
 {
-       Evas_Object *button = NULL;
        main_view_s *main_view_info = NULL;
        char *path = NULL;
-       char full_path[] = {0, };
+       char full_path[PATH_LEN] = {0, };
 
        retv_if(!parent, NULL);
 
@@ -320,49 +977,63 @@ Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
        snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, MAIN_VIEW_EDJE);
        free(path);
 
+       _D("main_view is created with %s", full_path);
+
        main_view_info = calloc(1, sizeof(main_view_s));
        retv_if(!main_view_info, NULL);
+       main_view_info->moment_info = moment_info;
 
-       main_view_info->main_view = elm_layout_add(parent);
+       main_view_info->main_view = create_momentic_layout(parent, full_path);
        if (!main_view_info->main_view) {
                free(main_view_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);
-       evas_object_show(main_view);
+       evas_object_show(main_view_info->main_view);
        evas_object_data_set(main_view_info->main_view, DATA_KEY_INFO, main_view_info);
+       evas_object_event_callback_add(main_view_info->main_view, EVAS_CALLBACK_RESIZE, _resize_cb, "main_view");
 
        elm_object_part_text_set(main_view_info->main_view, "title", "No cities");
        elm_object_part_text_set(main_view_info->main_view, "description", "After you add cities, they will be shown here.");
 
-       main_view_info->entry = _create_search_entry(main_view_info->main_view, moment_info);
-       if (main_view_info->entry)
-               elm_object_part_content_set(main_view_info->main_view, "entry", main_view_info->entry);
+       main_view_info->searchbar = _create_searchbar(main_view_info->main_view, main_view_info);
+       if (main_view_info->searchbar)
+               elm_object_part_content_set(main_view_info->main_view, "searchbar", main_view_info->searchbar);
+
+       main_view_info->next_btn = _create_next_btn(main_view_info->main_view, main_view_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->map = _create_map(main_view_info->main_view);
-       if (main_view_info->map)
-               elm_object_part_content_set(main_view_info->main_view, "map", main_view_info->map);
+       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);
 
-       main_view_info->result_button = _create_result_button(main_view_info->main_view, main_view_info);
-       if (main_view_info->result_button)
-               elm_object_part_content_set(main_view_info->main_view, "result_button", main_view_info->result_button);
+       main_view_info->add_btn = _create_add_btn(main_view_info->main_view, main_view_info);
+       if (main_view_info->add_btn)
+               elm_object_part_content_set(main_view_info->main_view, "add_btn", main_view_info->add_btn);
 
-       main_view_info->selected_scroller = _create_selected_scroller(main_view_info->main_view);
-       if (main_view_info->selected_scroller)
-               elm_object_part_content_set(main_view_info->main_view, "selected_scroller", main_view_info->selected_scroller);
+       main_view_info->searchlist = _create_searchlist(main_view_info->main_view);
+       if (main_view_info->searchlist)
+               elm_object_part_content_set(main_view_info->main_view, "searchlist", main_view_info->searchlist);
 
-       main_view_info->plus_button = _create_plus_button(main_view_info->main_view, main_view_info);
-       if (main_view_info->plus_button)
-               elm_object_part_content_set(main_view_info->main_view, "plus_button", main_view_info->plus_button);
+       db_list_group(moment_info->db, &moment_info->group_list);
 
-       main_view_info->predict_scroller = _create_predict_scroller(main_view_info->main_view);
-       if (main_view_info->predict_scroller)
-               elm_object_part_content_set(main_view_info->main_view, "predict_scroller", main_view_info->predict_scroller);
+       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)
+               elm_object_part_content_set(main_view_info->main_view, "drawer_content", main_view_info->group_scroller);
 
-       return main_view;
+       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;
 }
 
 void main_view_destroy(Evas_Object *main_view)
@@ -375,25 +1046,114 @@ 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->predict_scroller)
-               _destroy_predict_scroller(main_view_info->predict_scroller);
+       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->plus_button)
-               _destroy_plus_button(main_view_info->plus_button);
+       if (main_view_info->searchlist)
+               _destroy_searchlist(main_view_info->searchlist);
 
-       if (main_view_info->selected_scroller)
-               _destroy_selected_scroller(main_view_info->selected_scroller);
+       if (main_view_info->add_btn)
+               _destroy_add_btn(main_view_info->add_btn);
 
-       if (main_view_info->result_button)
-               _destroy_result_button(button);
+       if (main_view_info->city_list)
+               _destroy_city_list(main_view_info->city_list);
 
-       if (main_view_info->map)
-               _destroy_map(main_view_info->map);
+       if (main_view_info->next_btn)
+               _destroy_next_btn(button);
 
-       if (main_view_info->entry)
-               _destroy_search_entry(main_view_info->entry);
+       if (main_view_info->searchbar)
+               _destroy_searchbar(main_view_info->searchbar);
 
        free(main_view_info);
 
        evas_object_del(main_view);
 }
+
+static void _get_best_time(double *timezone, int size, double *start, double *end)
+{
+       register int i = 1;
+
+       ret_if(!timezone);
+       ret_if(!start);
+       ret_if(!end);
+
+       *start = timezone[0];
+       *end = timezone[0] + BEST_DURING_TIME;
+
+       for (; i < size; i++) {
+               double tmp = timezone[i];
+
+               if (tmp < *start) {
+                       if (tmp + BEST_DURING_TIME <= *start) {
+                               _D("No matched time");
+                               *start = 0;
+                               *end = 0;
+                               return;
+                       } else {
+                               *end = tmp + BEST_DURING_TIME;
+                       }
+               } else if (tmp > *start) {
+                       if (tmp >= *end) {
+                               _D("No matched time");
+                               *start = 0;
+                               *end = 0;
+                               return;
+                       } else {
+                               *start = tmp;
+                       }
+               } else
+                       continue;
+       }
+}
+
+static void _reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
+{
+       _D("Result callback is called");
+}
+
+static void _launch_calendar_edit(int start, int end)
+{
+       app_control_h app_control = NULL;
+       time_t t;
+       struct tm *local_time = NULL;
+       int ret;
+
+       char start_str[PATH_LEN] = {0, };
+       char end_str[PATH_LEN] = {0, };
+
+       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"
+                       , local_time->tm_year + 1900
+                       , local_time->tm_mon + 1
+                       , local_time->tm_mday
+                       , start
+                       , 0
+                       , 0);
+
+       snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"
+                       , local_time->tm_year + 1900
+                       , local_time->tm_mon + 1
+                       , local_time->tm_mday
+                       , end
+                       , 0
+                       , 0);
+
+       app_control_set_app_id(app_control, "com.samsung.calendar-lite-edit");
+       app_control_set_operation(app_control, "http://tizen.org/appcontrol/operation/edit");
+       app_control_add_extra_data(app_control, "start_time", start_str);
+       app_control_add_extra_data(app_control, "end_time", end_str);
+
+       app_control_send_launch_request(app_control, _reply_cb, NULL);
+       app_control_destroy(app_control);
+}
+
+
+