2.0 alpha
[apps/core/preloaded/calendar.git] / src / view-detail.c
index 9f68f61..ee0fac6 100755 (executable)
@@ -16,9 +16,6 @@
   */
 
 
-
-
-
 #include <aul.h>
 #include <appsvc.h>
 
 #include "edit-repeat.h"
 #include "edit-alarm.h"
 #include "detail.h"
-#include "alm-mgr.h"
-#include "external-ug.h"
 
 
-static const char *_name = "view/detail";
+#include "external-ug.h"
 
-#define CAL_REPEAT_EVERY_2_WEEK (CAL_REPEAT_EVERY_YEAR+1)
+static const char *_name = "view/detail";
+#define CAL_REPEAT_EVERY_2_WEEK (CALS_FREQ_SECONDLY+1)
 #define CAL_REPEAT_EVERY_3_DAY (CAL_REPEAT_EVERY_2_WEEK+1)
 
 #define ARRAY_SIZE(array) \
        ((int)(sizeof(array) / sizeof(array[0])))
 
+#define APP_CALL "org.tizen.call"
+#define APP_VTCALL "org.tizen.vtmain"
+#define APP_CONTACT_S "org.tizen.contacts-shortcut"
+
+static char messagebody[2048] = {0};
+
 static int is_hour24;
 
+static void __cal_detail_autolink_send_email_selected_callback(void *data, Evas_Object *obj, void *event_info);
+static void __cal_detail_autolink_add_to_contact_selected_callback(void *data, Evas_Object *obj, void *event_info);
+static void __cal_detail_voice_call_selected_callback(void *data, Evas_Object *obj, void *event_info);
+static void __cal_detail_autolink_send_message_selected_callback(void *data, Evas_Object *obj, void *event_info);
+static void __cal_detail_autolink_video_call_selected_callback(void *data, Evas_Object *obj, void *event_info);
+static void __cal_detail_autolink_phone_add_to_contact_selected_callback(void *data, Evas_Object *obj, void *event_info);
 static void __cal_detail_update_view(void *data);
 static void __cal_detail_edit_button_callback(void *data, Evas_Object *obj, void *ei);
+static void __cal_detail_update_view_todo(void *data);
+
+struct anchor_popup_item_t {
+       char *label;
+       void (*response) (void *data, Evas_Object *obj, void *event_info);
+};
+
+static struct anchor_popup_item_t g_email_list[] = {
+       {"Send email", __cal_detail_autolink_send_email_selected_callback},
+       {"Add to contact", __cal_detail_autolink_add_to_contact_selected_callback},
+};
+
+static struct anchor_popup_item_t g_phone_list[] = {
+       {"Voice call", __cal_detail_voice_call_selected_callback},
+       {"Send message", __cal_detail_autolink_send_message_selected_callback},
+       {"Video call", __cal_detail_autolink_video_call_selected_callback},
+       {"Add to contact", __cal_detail_autolink_phone_add_to_contact_selected_callback},
+};
 
 enum genlist_item_type{
        _GTYPE_TITLE_LOC = 1,
-       _GTYPE_START,
-       _GTYPE_END,
-       _GTYPE_ALARM,
-       _GTYPE_REPEAT,
+       _GTYPE_START_AND_END_TIME,
+       _GTYPE_DUE,
+       _GTYPE_REMINDER_AND_REPEAT,
        _GTYPE_NOTE,
+
        _GTYPE_LINKED_CAL,
+       _GTYPE_PRIORITY,
        _GTYPE_MAX
 };
 
+enum anchor_t {
+       NOT_ANCHOR = 0,
+       ANCHOR_PHONE,
+       ANCHOR_EMAIL,
+       ANCHOR_URL,
+       ANCHOR_EMAIL_LINK
+};
+
+struct autolink_data_t {
+       Evas_Object *popup;
+       Elm_Genlist_Item_Class itc;
+
+       enum anchor_t type;
+       char *info;
+};
+
 typedef struct {
        const char *name;
        struct appdata *ad;
@@ -66,13 +109,20 @@ typedef struct {
        Evas_Object *bt_one;
        Evas_Object *bt_all;
        Evas_Object *popup;
+       Evas_Object *ctx;
 
+       Ecore_Event_Handler *evt; // button down event
+       Evas_Coord x;
+       Evas_Coord y;
        cal_struct *cs;
 
        int cid;
 
        Eina_Bool is_deleted; //When event is deleted, updating view is not needed.
        GList   *alarm_list;
+
+       Eina_Bool is_todo_mode;
+       int priority;
 }cal_detail_data;
 
 typedef struct {
@@ -82,7 +132,94 @@ typedef struct {
        int alarm_value;
 }cal_detail_genlist_item_data;
 
-static Elm_Genlist_Item_Class itc_seperator, itc_title_loc, itc_4_text, itc_mutilline, itc_parts, itc_linked_cal;
+static Elm_Genlist_Item_Class itc_seperator, itc_2text, itc_4text, itc_mutilline, itc_parts, itc_linked_cal;
+
+static void __cal_detail_autolink_send_email_selected_callback(void *data, Evas_Object *obj, void *event_info)
+{
+       struct autolink_data_t *ald = (struct autolink_data_t *)data;
+
+       cal_launch_ug_with_var(EMAIL_COMPOSER_UG, NULL, "RUN_TYPE", "5", "TO", ald->info, NULL);
+
+       evas_object_del(ald->popup);
+       ald->popup = NULL;
+}
+
+static void __cal_detail_autolink_add_to_contact_selected_callback(void *data, Evas_Object *obj,
+               void *event_info)
+{
+       struct autolink_data_t *ald = (struct autolink_data_t *)data;
+
+       char buf[10];
+       snprintf(buf, sizeof(buf), "%d", 22);
+
+       cal_launch_ug_with_var(CONTACT_UG, NULL, "type", buf, "ct_email", ald->info, NULL);
+
+       evas_object_del(ald->popup);
+       ald->popup = NULL;
+}
+
+static void __cal_detail_autolink_send_message_selected_callback(void *data, Evas_Object *obj, void *event_info)
+{
+       struct autolink_data_t *ald = (struct autolink_data_t *)data;
+
+       cal_launch_ug_with_var(MESSAGE_COMPOSER_UG, NULL, "TO", ald->info, NULL);
+
+       evas_object_del(ald->popup);
+       ald->popup = NULL;
+}
+
+static void __cal_detail_voice_call_selected_callback(void *data, Evas_Object *obj, void *event_info)
+{
+       struct autolink_data_t *ald = (struct autolink_data_t *)data;
+
+       bundle *b = NULL;
+       char telnum[255]={0,};
+       b = bundle_create();
+       appsvc_set_operation(b, APPSVC_OPERATION_CALL);
+       snprintf(telnum, sizeof(telnum), "tel:%s", ald->info);
+       appsvc_set_uri(b, telnum);
+       appsvc_add_data(b, "ctindex", "-1");
+       appsvc_run_service(b, 0, NULL, NULL);
+
+       bundle_free(b);
+
+       evas_object_del(ald->popup);
+       ald->popup = NULL;
+}
+
+static void __cal_detail_autolink_video_call_selected_callback(void *data, Evas_Object *obj, void *event_info)
+{
+       struct autolink_data_t *ald = (struct autolink_data_t *)data;
+
+       bundle *bd = bundle_create();
+       bundle_add(bd, "KEY_CALL_TYPE", "mo");
+       bundle_add(bd, "KEY_CALL_HANDLE", "1");
+       bundle_add(bd, "KEY_CALLING_PARTY_NUMBER", ald->info);
+       bundle_add(bd, "KEY_CLI_CAUSE", "-1");
+       bundle_add(bd, "KEY_FORWARDED", "-1");
+
+       aul_launch_app("org.tizen.vtmain", bd);
+
+       bundle_free(bd);
+
+       evas_object_del(ald->popup);
+       ald->popup = NULL;
+}
+
+static void __cal_detail_autolink_phone_add_to_contact_selected_callback(void *data, Evas_Object *obj, void *event_info)
+{
+       c_retm_if(!data, "data is null");
+
+       struct autolink_data_t *ald = data;
+
+       char buf[10] = {0};
+       snprintf(buf, sizeof(buf), "%d", 21);
+
+       cal_launch_ug_with_var(CONTACT_UG, NULL, "type", buf, "ct_num", ald->info, NULL);
+
+       evas_object_del(ald->popup);
+       ald->popup = NULL;
+}
 
 static void __cal_detail_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
 {
@@ -92,87 +229,67 @@ static void __cal_detail_delete_layout(void *data, Evas *e, Evas_Object *obj, vo
 
        cal_detail_data *p = data;
 
-       if (p->cs)
-               CALENDAR_SVC_STRUCT_FREE(&(p->cs));
+       if (p->evt)
+               ecore_event_handler_del(p->evt);
 
-       free(p);
+       if (p->cs && NULL == p->ad->ical)
+               CALENDAR_SVC_STRUCT_FREE(&(p->cs));
 
-       CALENDAR_SVC_DEL_EVENT_CHANGED_CALLBACK(__cal_detail_update_view);
+       if (!p->is_todo_mode)
+               CALENDAR_SVC_DEL_EVENT_CHANGED_CALLBACK(__cal_detail_update_view);
+       else
+               CALENDAR_SVC_DEL_EVENT_CHANGED_CALLBACK(__cal_detail_update_view_todo);
 
+       free(p);
 }
 
-static cal_struct* __cal_detail_get_event(int idx)
+static cal_struct* __cal_detail_get_event(cal_detail_data *p, int idx)
 {
+       c_retvm_if(!p, NULL, "p parameter is null");
+       c_retvm_if(idx < 0, NULL, "idx is invalied(%d)", idx);
+
        int r;
        cal_struct *cs = NULL;
-       r = CALENDAR_SVC_GET(CAL_STRUCT_SCHEDULE, idx, NULL, &cs);
-       if (r != CAL_SUCCESS || CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_DELETED) ==1)
-       {
-               if(cs)
-                       CALENDAR_SVC_STRUCT_FREE(&cs);
-               ERR("CALENDAR_SVC_GET is failed");
-               return NULL;
-       }
+
+       if (!p->is_todo_mode)
+               r = CALENDAR_SVC_GET(CAL_STRUCT_SCHEDULE, idx, NULL, &cs);
+       else
+               r = CALENDAR_SVC_GET(CAL_STRUCT_TODO, idx, NULL, &cs);
+
+       c_retvm_if(r != CAL_SUCCESS, NULL, "CALENDAR_SVC_GET(%d) is failed(%d)", idx, r);
 
        return cs;
 }
 
-static void __cal_detail_get_time_text(time_t t, int allday, char *buf, int sz)
+static void __cal_detail_get_time_text(struct tm *tm, Eina_Bool is_allday, char *buf, int sz)
 {
-       struct tm tm;
        const char* time;
 
-       localtime_r(&t, &tm);
-
        if (is_hour24)
                time = CAL_UTIL_TIME_FORMAT_6;
        else
                time = CAL_UTIL_TIME_FORMAT_1;
 
-       if (allday)
-               cal_util_get_time_text(buf, sz, CAL_UTIL_DATE_FORMAT_1, NULL, &tm);
+       if (is_allday)
+               cal_util_get_time_text(buf, sz, CAL_UTIL_DATE_FORMAT_1, NULL, tm);
        else
-               cal_util_get_time_text(buf, sz, CAL_UTIL_DATE_FORMAT_1, time, &tm);
+               cal_util_get_time_text(buf, sz, CAL_UTIL_DATE_FORMAT_1, time, tm);
 }
 
 static void __cal_detail_get_start_time(cal_struct *cs, char *buf, int sz, cal_detail_data* p)
 {
-       CAL_ASSERT(p);
-       CAL_ASSERT(p->ad);
-
-       int allday;
-       time_t t;
-       int repeat;
-
-       allday = CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_ALL_DAY_EVENT);
-       repeat = CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_REPEAT_TERM);
+       c_ret_if(!cs);
+       c_ret_if(!p);
 
-       if (repeat && !p->ad->is_aul)
-               t = p->ad->tm->st;
-       else
-               t = mktime(CALENDAR_SVC_STRUCT_GET_TM(cs, CAL_VALUE_GMT_START_DATE_TIME, CAL_TZ_FLAG_LOCAL));
-
-       __cal_detail_get_time_text(t, allday, buf, sz);
+       __cal_detail_get_time_text(&p->ad->tm_start, CALENDAR_SVC_IS_ALLDAY_EVENT(cs), buf, sz);
 }
 
 static void __cal_detail_get_end_time(cal_struct *cs, char *buf, int sz, cal_detail_data* p)
 {
-       CAL_ASSERT(p);
-       CAL_ASSERT(p->ad);
-
-       int allday;
-       time_t t;
-       int repeat;
-
-       allday = CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_ALL_DAY_EVENT);
-       repeat = CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_REPEAT_TERM);
+       c_ret_if(!cs);
+       c_ret_if(!p);
 
-       if (repeat && !p->ad->is_aul)
-               t = p->ad->tm->et;
-       else
-               t = mktime(CALENDAR_SVC_STRUCT_GET_TM(cs, CAL_VALUE_GMT_END_DATE_TIME,  CAL_TZ_FLAG_LOCAL));
-
-       __cal_detail_get_time_text(t, allday, buf, sz);
+       __cal_detail_get_time_text(&p->ad->tm_end, CALENDAR_SVC_IS_ALLDAY_EVENT(cs), buf, sz);
 }
 
 static void __cal_detail_get_alarm(cal_detail_data * p,cal_struct *cs)
@@ -204,29 +321,40 @@ static void __cal_detail_get_alarm(cal_detail_data * p,cal_struct *cs)
        p->alarm_list = g_list_first(p->alarm_list);
 }
 
-static void __cal_detail_get_repeat(cal_struct *cs, char *buf, int sz)
+static void __cal_detail_get_repeat(cal_struct *cs, char *buf, int size)
 {
-       c_retm_if(!cs, "cs is null");
+       c_ret_if(!cs);
 
-       int term;
-       int flag;
+       cal_struct *original_cs = NULL;
 
-       flag = 0;
-       term = CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_REPEAT_TERM);
+       int original_event_id = CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_ORIGINAL_EVENT_ID);
+       if (0 < original_event_id) {
+               int r = CALENDAR_SVC_GET(CAL_STRUCT_SCHEDULE, original_event_id, NULL, &original_cs);
+               c_retm_if(r != CAL_SUCCESS, "CALENDAR_SVC_GET(%d) is failed(%d)", original_event_id, r);
+       }
+
+       if (!original_cs)
+               original_cs = cs;
+
+       int freq = CALENDAR_SVC_STRUCT_GET_INT(original_cs, CALS_VALUE_INT_RRULE_FREQ);
+
+       if (freq == CALS_FREQ_WEEKLY) {
 
-       if (term == CAL_REPEAT_EVERY_WEEK) {
-               int interval = CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_REPEAT_INTERVAL);
+               int interval = CALENDAR_SVC_STRUCT_GET_INT(original_cs, CALS_VALUE_INT_RRULE_INTERVAL);
                if (2 == interval)
-                       term = CAL_REPEAT_EVERY_2_WEEK;
-       }
+                       freq = CAL_REPEAT_EVERY_2_WEEK;
+
+       } else if (freq == CALS_FREQ_DAILY) {
 
-       if (term == CAL_REPEAT_EVERY_DAY) {
-               int interval = CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_REPEAT_INTERVAL);
+               int interval = CALENDAR_SVC_STRUCT_GET_INT(original_cs, CALS_VALUE_INT_RRULE_INTERVAL);
                if (3 == interval)
-                       term = CAL_REPEAT_EVERY_3_DAY;
+                       freq = CAL_REPEAT_EVERY_3_DAY;
        }
 
-       cal_edit_repeat_get_repeat_str(term, flag, buf, sz);
+       _cal_edit_repeat_get_freq_str(freq, buf, size);
+
+       if (original_cs != cs)
+               CALENDAR_SVC_STRUCT_FREE(&original_cs);
 }
 
 static void __cal_detail_get_save_to_str(int calid, char *buf, int sz)
@@ -273,6 +401,18 @@ static void __cal_detail_get_save_to(cal_struct *cs, char *buf, int sz)
        __cal_detail_get_save_to_str(idx, buf, sz);
 }
 
+static void __cal_detail_popup_hide_callback(void *data, Evas_Object *obj, void *ei)
+{
+       c_retm_if(!data, "data is null");
+
+       cal_detail_data* p = data;
+
+       p->ctx = NULL;
+
+       evas_object_del(obj);
+
+}
+
 static inline const char* __cal_detail_get_note(cal_struct *cs)
 {
        c_retvm_if(!cs, NULL, "cs is null");
@@ -280,6 +420,97 @@ static inline const char* __cal_detail_get_note(cal_struct *cs)
        return CALENDAR_SVC_STRUCT_GET_STR(cs, CAL_VALUE_TXT_DESCRIPTION);
 }
 
+static void __cal_detail_via_message_callback(void *data, Evas_Object *obj, void *ei)
+{
+       c_retm_if(!data, "data is null");
+       c_retm_if(!obj, "obj is null");
+
+       cal_detail_data *p = data;
+       c_retm_if(!p->cs, "p->cs is null");
+
+       int r = cal_util_create_vcs_file_from_cs(p->cs, MESSAGE_VCS);
+       if (CAL_SUCCESS != r) {
+               ERR("send via message failed: save vcs %d", r);
+               return;
+       }
+
+       cal_launch_ug_with_var(MESSAGE_COMPOSER_UG, NULL, "ATTACHFILE", MESSAGE_VCS, NULL);
+
+       evas_object_del(obj);
+       p->ctx = NULL;
+}
+
+static void __cal_detail_via_email_callback(void *data, Evas_Object *obj, void *ei)
+{
+       c_retm_if(!data, "data is null");
+       c_retm_if(!obj, "obj is null");
+
+       cal_detail_data *p = data;
+       c_retm_if(!p->cs, "p->cs is null");
+
+       int r = cal_util_create_vcs_file_from_cs(p->cs, EMAIL_VCS);
+       if (CAL_SUCCESS != r) {
+               ERR("send via email failed: save vcs %d", r);
+               return;
+       }
+
+       cal_launch_ug_with_var(EMAIL_COMPOSER_UG, NULL, "RUN_TYPE", "5", "ATTACHMENT", EMAIL_VCS, NULL);
+
+       evas_object_del(obj);
+       p->ctx = NULL;
+}
+
+static void __cal_detail_via_bluetooth_callback(void *data, Evas_Object *obj, void *ei)
+{
+       c_retm_if(!data, "data is null");
+       c_retm_if(!obj, "obj is null");
+
+       cal_detail_data *p = data;
+       c_retm_if(!p->cs, "p->cs is null");
+
+       int r = cal_util_create_vcs_file_from_cs(p->cs, BLUETOOTH_VCS);
+       if (CAL_SUCCESS != r) {
+               ERR("send via bluetooth failed: save cvs %d", r);
+               return;
+       }
+
+       cal_launch_ug_with_var(BLUETOOTH_UG, NULL, "launch-type", "send", "filecount", "1", "files", BLUETOOTH_VCS, NULL);
+
+       evas_object_del(obj);
+       p->ctx = NULL;
+}
+
+static void __cal_detail_send_button_callback(void *data, Evas_Object *obj, void *ei)
+{
+       c_retm_if(!data, "data is null");
+       c_retm_if(!obj, "obj is null");
+
+       Evas_Object *ly = data;
+
+       cal_detail_data *p = CAL_UTIL_GET_PRIV_DATA(ly);
+       c_retm_if(!p, "CAL_UTIL_GET_PRIV_DATA(ly) is failed");
+
+       Evas_Object *ctx = p->ctx;
+
+       if (ctx)
+               evas_object_del(ctx);
+
+       p->ctx = elm_ctxpopup_add(p->ad->nv);
+       c_retm_if(!p->ctx, "elm_ctxpopup_add(p->ad->nv) returned null");
+
+       ctx = p->ctx;
+
+       evas_object_smart_callback_add(ctx, "dismissed", __cal_detail_popup_hide_callback, p);
+       elm_ctxpopup_item_append(ctx, S_("IDS_COM_BODY_MESSAGE"), NULL, __cal_detail_via_message_callback, p);
+       elm_ctxpopup_item_append(ctx, S_("IDS_COM_BODY_EMAIL"), NULL, __cal_detail_via_email_callback, p);
+       elm_ctxpopup_item_append(ctx, S_("IDS_COM_BODY_BLUETOOTH"), NULL, __cal_detail_via_bluetooth_callback, p);
+
+       int x, y, w, h;
+       evas_object_geometry_get(p->ad->cbar, &x, &y, &w, &h);
+       evas_object_move(ctx, w / 2, y + h / 5);
+       evas_object_show(ctx);
+}
+
 static void __cal_detail_back_button_callback(void *data, Evas_Object *obj, void *ei)
 {
        CAL_FN_START;
@@ -315,11 +546,15 @@ static void __cal_detail_back_button_callback(void *data, Evas_Object *obj, void
        ad->current_view = CV_UNKNOWN;
 }
 
-static void __cal_viewer_back_button_callback(void *data, Evas_Object *obj, void *ei)
+static void __cal_detail_viewer_back_button_callback(void *data, Evas_Object *obj, void *ei)
 {
        CAL_FN_START;
 
-       elm_exit();
+       struct appdata *ad = data;
+       c_retm_if(!ad, "ad is NULL");
+       c_retm_if(!ad->nv, "ad->nv is NULL");
+
+       elm_naviframe_item_pop(ad->nv);
 }
 
 static void __cal_detail_error_popup_response_event_callback(void *data, Evas_Object *obj, void *ei)
@@ -348,33 +583,27 @@ static void __cal_detail_delete_event(cal_detail_data* p, Eina_Bool is_delete_al
 
        c_retm_if(!p, "p is null");
 
-       GList* list = NULL;
-       cal_value* value = NULL;
-       time_t t = 0;
        int r = 0;
 
        if (!is_delete_all) {
-               cal_struct *cs = __cal_detail_get_event(p->cid);
-               c_retm_if(!cs, "cs is null");
 
-               t = p->ad->tm->st;
-               value = CALENDAR_SVC_VALUE_NEW(CAL_VALUE_LST_EXCEPTION_DATE);
-               CALENDAR_SVC_VALUE_SET_TIME(value,CAL_VALUE_GMT_EXCEPTION_DATE_TIME,CAL_TZ_FLAG_GMT,t);
-               CALENDAR_SVC_STRUCT_GET_LIST(cs,CAL_VALUE_LST_EXCEPTION_DATE,&list);
-               list = g_list_append(list,value);
+               long long int lli_time;
+               cal_util_convert_tm_to_lli(NULL, &p->ad->tm_start, &lli_time);
 
-               CALENDAR_SVC_STRUCT_SET_LIST(cs,CAL_VALUE_LST_EXCEPTION_DATE,list);
-               r = CALENDAR_SVC_UPDATE(cs);
+               r = calendar_svc_event_delete_normal_instance(p->cid, lli_time);
                if (r != CAL_SUCCESS)
-                       ERR("CALENDAR_SVC_UPDATE is failed %d", r);
+                       ERR("calendar_svc_event_delete_normal_instance() is failed(%d)", r);
                else
                        p->is_deleted = EINA_TRUE;
 
-               CALENDAR_SVC_STRUCT_FREE(&cs);
-       }
-       else    {
-               r = CALENDAR_SVC_DELETE(CAL_STRUCT_SCHEDULE, p->cid);
-               c_retm_if(r!=CAL_SUCCESS, "CALENDAR_SVC_DELETE(CAL_STRUCT_SCHEDULE, %d) is failed(%d)", p->cid, r);
+       } else {
+
+               if (!p->is_todo_mode)
+                       r = CALENDAR_SVC_DELETE(CAL_STRUCT_SCHEDULE, p->cid);
+               else
+                       r = CALENDAR_SVC_DELETE(CAL_STRUCT_TODO, p->cid);
+
+               c_retm_if(r != CAL_SUCCESS, "CALENDAR_SVC_DELETE(CAL_STRUCT_SCHEDULE, %d) is failed(%d)", p->cid, r);
 
                p->is_deleted = EINA_TRUE;
        }
@@ -384,6 +613,7 @@ static void __cal_detail_delete_event(cal_detail_data* p, Eina_Bool is_delete_al
        if ((p->ad->ug) && (UG_DETAIL == p->ad->u_type))
                ug_destroy_me(p->ad->ug);
        else {
+
                if (elm_naviframe_top_item_get(p->ad->nv) == elm_naviframe_bottom_item_get(p->ad->nv))
                        elm_exit();
                else
@@ -417,7 +647,7 @@ static void __cal_detail_delete_popup_response_event_callback(void *data, Evas_O
        p->popup = NULL;
 }
 
-static void __cal_detail_edit_popup_response_event_callback(void *data, Evas_Object *obj, void *event_info)
+static void __cal_detail_event_edit_popup_response_callback(void *data, Evas_Object *obj, void *event_info)
 {
        c_retm_if(!data, "data is null");
        c_retm_if(!obj, "obj is null");
@@ -433,7 +663,8 @@ static void __cal_detail_edit_popup_response_event_callback(void *data, Evas_Obj
 
        if (!strcmp(elm_object_text_get(button), C_("IDS_CLD_BODY_ONLY_THIS_EVENT")))
                ad->edit_special_one = EINA_TRUE;
-       else    if (!strcmp(elm_object_text_get(button), C_("IDS_CLD_POP_ALL_REPETITIVE_EVENTS")))
+       else    if (!strcmp(elm_object_text_get(button), C_("IDS_CLD_POP_ALL_REPETITIVE_EVENTS"))
+               || !strcmp(elm_object_text_get(button), S_("IDS_COM_SK_OK")))
                ad->edit_special_one = EINA_FALSE;
        else {
                evas_object_del(popup);
@@ -447,73 +678,128 @@ static void __cal_detail_edit_popup_response_event_callback(void *data, Evas_Obj
        p->popup = NULL;
 }
 
-static void __cal_detail_show_popup(cal_detail_data *p, const char *tit, Eina_Bool is_edit)
+static inline void __cal_detail_show_event_edit_popup(cal_detail_data *p, cal_struct *cs)
 {
-       void (*callback_func)(void *data, Evas_Object *obj, void *ei) = NULL;
+       CAL_FN_START;
 
-       if (is_edit)
-                       callback_func = __cal_detail_edit_popup_response_event_callback;
-               else
-                       callback_func = __cal_detail_delete_popup_response_event_callback;
+       if (CALENDAR_SVC_STRUCT_GET_INT(cs, CALS_VALUE_INT_RRULE_ID)) {
+               p->popup = cal_util_add_popup(p->ad->win, "verticalbuttonstyle", NULL, C_("IDS_CLD_HEADER_EDIT_EVENT"), __cal_detail_event_edit_popup_response_callback, p,
+                       C_("IDS_CLD_BODY_ONLY_THIS_EVENT"), C_("IDS_CLD_POP_ALL_REPETITIVE_EVENTS"),
+                       S_("IDS_COM_SK_CANCEL"), NULL);
+       }
+       else {
+               p->popup = cal_util_add_popup(p->ad->win, NULL, NULL, C_("IDS_CLD_HEADER_EDIT_EVENT"), __cal_detail_event_edit_popup_response_callback, p,
+                       S_("IDS_COM_SK_OK"),S_("IDS_COM_SK_CANCEL"), NULL);
+       }
+}
 
-       cal_struct *cs = __cal_detail_get_event(p->cid);
-       c_retm_if(!cs, "__cal_detail_get_event(%d) is failed", p->cid);
+static inline void __cal_detail_show_event_delete_popup(cal_detail_data *p, cal_struct *cs)
+{
+       CAL_FN_START;
 
-       if (CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_REPEAT_TERM)) {
-               p->popup = cal_util_add_popup(p->ad->win, "verticalbuttonstyle", NULL, tit, callback_func, p,
+       if (CALENDAR_SVC_STRUCT_GET_INT(cs, CALS_VALUE_INT_RRULE_ID)) {
+               p->popup = cal_util_add_popup(p->ad->win, "verticalbuttonstyle", NULL, C_("IDS_CLD_OPT_DELETE_EVENT"), __cal_detail_delete_popup_response_event_callback, p,
                        C_("IDS_CLD_BODY_ONLY_THIS_EVENT"), C_("IDS_CLD_POP_ALL_REPETITIVE_EVENTS"),
                        S_("IDS_COM_SK_CANCEL"), NULL);
        }
        else {
-               p->popup = cal_util_add_popup(p->ad->win, NULL, NULL, tit, callback_func, p,
+               p->popup = cal_util_add_popup(p->ad->win, NULL, NULL, C_("IDS_CLD_OPT_DELETE_EVENT"), __cal_detail_delete_popup_response_event_callback, p,
                        S_("IDS_COM_SK_OK"),S_("IDS_COM_SK_CANCEL"), NULL);
        }
+}
+
+static void __cal_detail_task_edit_popup_response_callback(void *data, Evas_Object *obj, void *event_info)
+{
+       c_retm_if(!data, "data is null");
+       c_retm_if(!obj, "obj is null");
+
+       Evas_Object *popup = data;
+       Evas_Object *button = obj;
+
+       cal_detail_data* p = evas_object_data_get(popup, "data");
+       c_retm_if(!p, "p is null");
+
+       struct appdata* ad = p->ad;
+       c_retm_if(!ad, "ad is null");
+
+       if (!strcmp(elm_object_text_get(button), S_("IDS_COM_SK_OK")))
+               cal_edit_create_view_todo(ad, p->ly);
+
+       evas_object_del(popup);
+       p->popup = NULL;
+}
+
+static inline void __cal_detail_show_task_edit_popup(cal_detail_data *p, cal_struct *cs)
+{
+       CAL_FN_START;
 
-       c_retm_if(!p->popup, "elm_popup_add(p->ad->win) returned null");
+       p->popup = cal_util_add_popup(p->ad->win, NULL, NULL, C_("IDS_TASK_HEADER_EDIT_TASK"), __cal_detail_task_edit_popup_response_callback, p,
+                               S_("IDS_COM_SK_OK"),S_("IDS_COM_SK_CANCEL"), NULL);
+}
+
+static inline void __cal_detail_show_task_delete_popup(cal_detail_data *p, cal_struct *cs)
+{
+       CAL_FN_START;
+
+       p->popup = cal_util_add_popup(p->ad->win, NULL, NULL, C_("IDS_CLD_OPT_DELETE_TASK"), __cal_detail_delete_popup_response_event_callback, p,
+                               S_("IDS_COM_SK_OK"),S_("IDS_COM_SK_CANCEL"), NULL);
 }
 
 static void __cal_detail_delete_button_callback(void *data, Evas_Object *obj, void *ei)
 {
        CAL_FN_START;
 
+       c_ret_if(!data);
+
        Evas_Object *ly = data;
+
        cal_detail_data *p = CAL_UTIL_GET_PRIV_DATA(ly);
-       cal_struct *cs = NULL;
+       c_ret_if(!p);
 
-       // TODO: add
+       cal_struct *cs = __cal_detail_get_event(p, p->cid);
+       c_ret_if(!cs);
 
+       /*CAL_STRUCT_TYPE_TODO == 2*/
+       if (CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_TYPE) == 2)
+               __cal_detail_show_task_delete_popup(p, cs);
+       else
+               __cal_detail_show_event_delete_popup(p, cs);
 
-       if (p->cid) {
-               cs = __cal_detail_get_event(p->cid);
+       CALENDAR_SVC_STRUCT_FREE(&cs);
+}
 
-               __cal_detail_show_popup(p, C_("IDS_CLD_OPT_DELETE_EVENT"), EINA_FALSE);
-       }
+static Eina_Bool __cal_detail_mouse_button_down_callback(void *data, int type, void *event)
+{
+       Ecore_Event_Mouse_Button *ev = event;
+       cal_detail_data *p = data;
+
+       p->x = ev->x;
+       p->y = ev->y;
 
-       if(cs)
-               CALENDAR_SVC_STRUCT_FREE(&cs);
+       return ECORE_CALLBACK_RENEW;
 }
 
 static void __cal_detail_edit_button_callback(void *data, Evas_Object *obj, void *ei)
 {
        CAL_FN_START;
 
+       c_ret_if(!data);
+
        Evas_Object *ly = data;
-       cal_detail_data *p = CAL_UTIL_GET_PRIV_DATA(ly);
-       cal_struct *cs = NULL;
 
-       p = CAL_UTIL_GET_PRIV_DATA(ly);
-       CAL_ASSERT(p);
+       cal_detail_data *p = CAL_UTIL_GET_PRIV_DATA(ly);
+       c_ret_if(!p);
 
-       cs = __cal_detail_get_event(p->cid);
+       cal_struct *cs = __cal_detail_get_event(p, p->cid);
+       c_ret_if(!cs);
 
-       if (0 != CALENDAR_SVC_STRUCT_GET_INT(cs,CAL_VALUE_INT_REPEAT_TERM))
-               __cal_detail_show_popup(p, C_("IDS_CLD_HEADER_EDIT_EVENT"), EINA_TRUE);
+       /*CAL_STRUCT_TYPE_TODO == 2*/
+       if (CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_TYPE) == 2)
+               __cal_detail_show_task_edit_popup(p, cs);
        else
-               cal_edit_create_view(p->ad, ly);
-
-       if (cs)
-               CALENDAR_SVC_STRUCT_FREE(&cs);
+               __cal_detail_show_event_edit_popup(p, cs);
 
+       CALENDAR_SVC_STRUCT_FREE(&cs);
 }
 
 static char* __cal_detail_get_title_location_text(Evas_Object *obj, const char *part, cal_detail_genlist_item_data *item_data)
@@ -531,15 +817,19 @@ static char* __cal_detail_get_title_location_text(Evas_Object *obj, const char *
        if (!CAL_STRCMP(part, "elm.text.1"))
        {
                title = CALENDAR_SVC_STRUCT_GET_STR(cs, CAL_VALUE_TXT_SUMMARY);
-               if (title)
+               if (title && title[0] != '\0')
                        return strdup(title);
+               else
+                       return strdup(C_("IDS_CLD_BODY_NO_TITLE"));
        }
 
        if (!CAL_STRCMP(part, "elm.text.2"))
        {
                loc = CALENDAR_SVC_STRUCT_GET_STR(cs, CAL_VALUE_TXT_LOCATION);
-               if (loc)
+               if (loc && loc[0] != '\0')
                        return strdup(loc);
+               else
+                       return strdup(C_("IDS_CLD_BODY_NO_LOCATION_SELECTED"));
        }
 
        return NULL;
@@ -570,50 +860,75 @@ static  char* __cal_detail_get_save_to_text(Evas_Object *obj, const char *part,
        return NULL;
 }
 
-static char* __cal_detail_get_start_time_text(Evas_Object *obj, const char *part, cal_detail_genlist_item_data *item_data)
+static char* __cal_detail_get_start_time_and_end_time_text(Evas_Object *obj, const char *part, cal_detail_genlist_item_data *item_data)
 {
-       cal_struct *cs;
-       char buf[1024];
+       c_retv_if(!item_data, NULL);
+
        cal_detail_data *p = item_data->p;
-       cs = p->cs;
-       if(NULL == cs)
-       {
-               return NULL;
+       c_retv_if(!p, NULL);
+
+       cal_struct *cs = p->cs;
+       c_retv_if(!cs, NULL);
+
+       if (CAL_STRCMP(part, "elm.text.1") == 0) {
+
+               if (p->is_todo_mode)
+                       return strdup(C_("IDS_CLD_BODY_DUE_DATE"));
+               else
+                       return strdup(S_("IDS_COM_BODY_START"));
        }
 
-       if (!CAL_STRCMP(part, "elm.text.1"))
-       {
-               return strdup(S_("IDS_COM_BODY_START"));
+       if (CAL_STRCMP(part, "elm.text.3") == 0) {
+
+               if (p->is_todo_mode)
+                       return strdup(C_("IDS_CLD_BODY_DUE_DATE"));
+               else
+                       return strdup(S_("IDS_COM_BODY_END"));
        }
 
-       if(!CAL_STRCMP(part, "elm.text.2"))
-       {
+       char buf[1024];
+
+       if (CAL_STRCMP(part, "elm.text.2") == 0) {
+
                __cal_detail_get_start_time(cs, buf, sizeof(buf), p);
+
+               return strdup(buf);
+       }
+
+       if (CAL_STRCMP(part, "elm.text.4") == 0) {
+
+               __cal_detail_get_end_time(cs, buf, sizeof(buf), p);
+
                return strdup(buf);
        }
 
        return NULL;
 }
 
-static char* __cal_detail_get_end_time_text(Evas_Object *obj, const char *part, cal_detail_genlist_item_data *item_data)
+static char* __cal_detail_get_due_text(Evas_Object *obj, const char *part, cal_detail_genlist_item_data *item_data)
 {
-       cal_struct *cs;
-       char buf[1024];
+       c_retv_if(!item_data, NULL);
+
        cal_detail_data *p = item_data->p;
-       cs = p->cs;
-       if(NULL == cs)
-       {
-               return NULL;
-       }
+       c_retv_if(!p, NULL);
 
-       if (!CAL_STRCMP(part, "elm.text.1"))
-       {
-               return strdup(S_("IDS_COM_BODY_END"));
+       cal_struct *cs = p->cs;
+       c_retv_if(!cs, NULL);
+
+       if (!CAL_STRCMP(part, "elm.text.1")) {
+
+               if (p->is_todo_mode)
+                       return strdup(C_("IDS_CLD_BODY_DUE_DATE"));
+               else
+                       return strdup(S_("IDS_COM_BODY_END"));
        }
 
-       if(!CAL_STRCMP(part, "elm.text.2"))
-       {
+       char buf[1024];
+
+       if (!CAL_STRCMP(part, "elm.text.2")) {
+
                __cal_detail_get_end_time(cs, buf, sizeof(buf), p);
+
                return strdup(buf);
        }
 
@@ -626,7 +941,7 @@ static void __cal_detail_get_alarm_text(cal_detail_genlist_item_data *data, char
        cal_edit_alarm_get_alarm_str(data->alarm_value, buf, buf_size);
 }
 
-static char* __cal_detail_add_alarm_text(Evas_Object *obj, const char *part, cal_detail_genlist_item_data *item_data)
+static char* __cal_detail_add_reminder_and_repeat_text(Evas_Object *obj, const char *part, cal_detail_genlist_item_data *item_data)
 {
        cal_struct *cs;
        char buf[1024] = {0};
@@ -639,7 +954,7 @@ static char* __cal_detail_add_alarm_text(Evas_Object *obj, const char *part, cal
 
        if (!CAL_STRCMP(part, "elm.text.1"))
        {
-               return strdup(S_("IDS_COM_BODY_ALARM"));
+               return strdup(C_("IDS_CLD_BODY_REMINDER"));
        }
 
        if(!CAL_STRCMP(part, "elm.text.2"))
@@ -648,48 +963,458 @@ static char* __cal_detail_add_alarm_text(Evas_Object *obj, const char *part, cal
                return strdup(buf);
        }
 
-       return NULL;
-}
+       if (!CAL_STRCMP(part, "elm.text.3"))
+       {
+               return strdup(C_("IDS_CLD_BODY_REPEAT"));
+       }
+
+       if(!CAL_STRCMP(part, "elm.text.4"))
+       {
+               __cal_detail_get_repeat(cs, buf, sizeof(buf));
+
+               return strdup(buf);
+       }
+
+       return NULL;
+}
+
+static Eina_Bool __cal_detail_check_autolink_delimiter(char ch)
+{
+       if (isdigit(ch) || isalpha(ch))
+       {
+               return false;
+       }
+
+       char undeli[] = "@-_.+";        /* The char in the string is not a delimiter */
+
+       int i = 0;
+       for (i = 0; i < sizeof(undeli) / sizeof(undeli[0]); ++i)
+       {
+               if (ch == undeli[i])
+               {
+                       return false;
+               }
+       }
+       return true;
+}
+
+static int __cal_detail_check_autolink_phone_number(const char *word)
+{
+       const int min_phone_num_len = 3;
+       const int max_phone_num_len = 15;
+       int i = 0;
+       int num_counter = 0;
+
+       if (word[0] == '+')
+       {
+               i++;
+       }
+
+       while (isdigit(word[i]) || word[i] == '-')
+       {
+               if (isdigit(word[i]))
+               {
+                       num_counter++;
+                       if (num_counter > max_phone_num_len)
+                       {
+                               break;
+                       }
+               }
+               else if (i == 0 || word[i - 1] == '-')
+               {
+                       /* The first char is '-' or two consecutive '-' */
+                       break;
+               }
+               i++;
+       }
+
+       /* Make sure that the last char is digit */
+       while (!isdigit(word[i]))
+       {
+               i--;
+       }
+
+       if (num_counter < min_phone_num_len)
+       {
+               return 0;
+       }
+       else
+       {
+               return i + 1;
+       }
+}
+
+static enum anchor_t __cal_detail_get_autolink_anchor_type(const char *word)
+{
+       CAL_ASSERT(word);
+       int i = 0;
+
+       if (NULL != strstr(word, EMAIL_LINK_FLAG))
+       {
+               return ANCHOR_EMAIL_LINK;
+       }
+
+       /* Email */
+       if (strchr(word, '@') != NULL)
+       {
+               return ANCHOR_EMAIL;
+       }
+
+       /* Url */
+       char *url_prefix[] = { "http://", "HTTP://", "www.", "WWW." };
+       for (i = 0; i < sizeof(url_prefix) / sizeof(url_prefix[0]); ++i)
+       {
+               if (g_str_has_prefix(word, url_prefix[i]))
+               {
+                       return ANCHOR_URL;
+               }
+       }
+
+       /* Phone number */
+       if (__cal_detail_check_autolink_phone_number(word))
+       {
+               return ANCHOR_PHONE;
+       }
+
+       return NOT_ANCHOR;
+}
+
+static void __cal_detail_process_autolink_anchor_word(GString *anchor)
+{
+       CAL_ASSERT(anchor);
+
+       int len = 0;
+       GString *word = g_string_new(anchor->str);
+       g_string_assign(anchor, "");    /* clear */
+       char *snote_display = NULL;
+       char *email_link = NULL;
+
+       switch (__cal_detail_get_autolink_anchor_type(word->str))
+       {
+       case ANCHOR_EMAIL:
+               g_string_append(anchor, "<color=#72b1f2FF>");
+               g_string_append_printf(anchor,
+                               "<a href=email|%s underline=on underline_color=#72b1f2FF>",
+                               word->str);
+               g_string_append(anchor, word->str);
+               g_string_append(anchor, "</a></color>");
+               break;
+
+       case ANCHOR_URL:
+               g_string_append(anchor, "<color=#72b1f2FF>");
+               g_string_append_printf(anchor,
+                               "<a href=url|%s underline=on underline_color=#72b1f2FF>",
+                               word->str);
+               g_string_append(anchor, word->str);
+               g_string_append(anchor, "</a></color>");
+               break;
+
+       case ANCHOR_PHONE:
+               len = __cal_detail_check_autolink_phone_number(word->str);
+               char num[32] = { 0 };
+               snprintf(num, len + 1, "%s", word->str);
+
+               g_string_append(anchor, "<color=#72b1f2FF>");
+               g_string_append_printf(anchor,
+                               "<a href=phone_num|%s underline=on underline_color=#72b1f2FF>",
+                               num);
+               g_string_append(anchor, num);
+               g_string_append(anchor, "</a></color>");
+               g_string_append(anchor, word->str + len);
+               break;
+       case ANCHOR_EMAIL_LINK:
+
+               email_link = strstr(word->str, EMAIL_LINK_FLAG);
+               int nsize = email_link - word->str + 1;
+               CAL_CALLOC(snote_display, nsize, char);
+               if(NULL != snote_display)
+               {
+                       strncpy(snote_display, word->str, nsize-1);
+               }
+               g_string_append(anchor, "<color=#72b1f2FF>");
+               g_string_append_printf(anchor,
+                               "<a href=email_link|%s underline=on underline_color=#72b1f2FF>",
+                               email_link+strlen(EMAIL_LINK_FLAG));
+
+               g_string_append(anchor, snote_display);
+               g_string_append(anchor, "</a></color>");
+               free(snote_display);
+               break;
+       default:
+               g_string_append(anchor, word->str);
+               break;
+       }
+}
+
+static GString *__cal_detail_add_autolink_anchor(const char *content)
+{
+       c_retvm_if(!content, NULL, "Input parameter is null");
+
+       const char *p = content;
+       char *gt = NULL;
+       GString *text = g_string_new("");
+       GString *buf = g_string_new("");
+
+       while (*p != '\0') {
+               g_string_assign(buf, "");       /* reset buffer */
+
+               if(NULL != strstr(p, EMAIL_LINK_FLAG))
+               {
+
+                       g_string_append_len(buf, p, CAL_STRLEN(content));
+                       __cal_detail_process_autolink_anchor_word(buf);
+                       g_string_append(text, buf->str);
+                       break;;
+               }
+               else if (__cal_detail_check_autolink_delimiter(p[0]))
+               {
+                       g_string_append_c(text, p[0]);
+                       p++;
+               }
+               else if (p[0] == '<')
+               {       /* tag begin */
+                       gt = strchr(p, '>');    /* search tag end */
+                       CAL_ASSERT(gt); /* assert '<' and '>' are matched */
+                       g_string_append_len(text, p, gt - p + 1);
+                       p = gt + 1;
+               }
+               else
+               {
+                       int i = 0;
+                       while (p[i] != '\0')
+                       {
+                               if (__cal_detail_check_autolink_delimiter(p[i]) || p[i] == '<')
+                               {
+                                       break;
+                               }
+                               i++;
+                       }
+
+                       g_string_append_len(buf, p, i);
+                       p = p + i;
+
+                       __cal_detail_process_autolink_anchor_word(buf);
+                       g_string_append(text, buf->str);
+               }
+       }
+
+       g_string_free(buf, TRUE);
+
+       return text;
+}
+
+static char* __cal_detail_get_note_text(Evas_Object *obj, const char *part, cal_detail_genlist_item_data *item_data)
+{
+       cal_struct *cs;
+
+       cal_detail_data *p = item_data->p;
+       cs = p->cs;
+       if (NULL == cs)
+       {
+               return NULL;
+       }
+
+       return NULL;
+}
+
+static void __cal_detail_autolink_popup_response_callback(void *data, Evas_Object *obj, void *event_info)
+{
+       c_retm_if(!data, "data is null");
+       c_retm_if(!obj, "obj is null");
+
+       struct autolink_data_t *ald = data;
+
+       free(ald->info);
+       free(ald);
+
+       evas_object_del(obj);
+}
+
+void __cal_detail_show_autolink_popup(struct autolink_data_t *ald, cal_detail_data* p)
+{
+       c_retm_if(!ald, "ald is null");
+       c_retm_if(!p, "p is null");
+
+       struct anchor_popup_item_t *list = NULL;
+       int count = 0;
+       int i = 0;
+       Evas_Object *ctx;
+       Elm_Object_Item *item = NULL;
+
+       switch (ald->type)
+       {
+       case ANCHOR_EMAIL:
+               list = g_email_list;
+               count = ARRAY_SIZE(g_email_list);
+               break;
+       case ANCHOR_PHONE:
+               list = g_phone_list;
+               count = ARRAY_SIZE(g_phone_list);
+               break;
+       default:
+               break;
+       }
+
+       ctx = elm_ctxpopup_add(p->ly);
+       c_retm_if(!ctx, "elm_ctxpopup_add is failed");
+
+       evas_object_smart_callback_add(ctx, "dismissed", __cal_detail_autolink_popup_response_callback, ald);
+
+       for (i = 0; i < count; ++i)
+       {
+               item = elm_ctxpopup_item_append(ctx, list[i].label, NULL, list[i].response, ald);
+               if (!item)
+               {
+                       ERR("elm_ctxpopup_item_append returned null");
+                       evas_object_del(ctx);
+               }
+       }
+
+       evas_object_move(ctx, p->x, p->y);
+       evas_object_show(ctx);
+}
+
+static char *__cal_detail_get_autolink_anchor_type_str(enum anchor_t type)
+{
+       switch (type) {
+       case ANCHOR_EMAIL:
+               return "email";
+       case ANCHOR_PHONE:
+               return "phone_num";
+       case ANCHOR_URL:
+               return "url";
+       case ANCHOR_EMAIL_LINK:
+               return "email_link";
+       default:
+               return "";
+       }
+}
+
+static enum anchor_t __cal_detail_parse_autolink_anchor_type(char *s)
+{
+       int i = 0;
+       for (i = NOT_ANCHOR + 1; i < NOT_ANCHOR + 5; ++i)
+       {
+               if (CAL_STRCMP(s, __cal_detail_get_autolink_anchor_type_str(i)) == 0)
+               {
+                       return (enum anchor_t)i;
+               }
+       }
+       return NOT_ANCHOR;
+}
+
+
+static void __cal_detail_autolink_email_link_clicked(char *info)
+{
+       c_retm_if(!info, "Input parameter is null");
+       bundle *req = NULL;
+       char *account_id= NULL;
+       char *email_id= NULL;
+       char *src_box= NULL;
+       char *temp= NULL;
+       int ret = 0;
+
+       req = bundle_create();
+       c_retm_if(!req, "bundle_create is failed");
+
+       char livemagazine[30] = { 0, };
+       snprintf(livemagazine, sizeof(livemagazine), "%d", 0);
+       char internal[30] = { 0, };
+       snprintf(internal, sizeof(internal), "%d", 1);
+       account_id = info;
+       temp = strchr(info, '_');
+       if (NULL != temp)
+       {
+               *temp = '\0';
+               bundle_add(req, "ACCOUNT_ID", account_id);
+       }
+
+       if (NULL != temp)
+       {
+               email_id = temp+1;
+               temp = NULL;
+               temp = strchr(email_id, '_');
+               if(NULL != temp)
+               {
+                       *temp = '\0';
+                       bundle_add(req, "MAIL_ID", email_id);
+               }
+       }
+
+       if (NULL != temp)
+       {
+               src_box= temp+1;
+               bundle_add(req, "MAILBOX", src_box);
+       }
+
+
+       bundle_add(req, "RUN_TYPE", "7");
+       ret = aul_launch_app("org.tizen.email", req);
+       c_warn_if(!ret, "aul_launch_app(org.tizen.email) is failed(%d)", ret);
 
+       bundle_free(req);
+}
 
-static char* __cal_detail_get_repeat_text(Evas_Object *obj, const char *part, cal_detail_genlist_item_data *item_data)
+static void __cal_detail_autolink_anchor_clicked_callback(void *data, Evas_Object *obj, void *event_info)
 {
-       cal_struct *cs;
-       char buf[1024] = {0};
-       cal_detail_data *p = item_data->p;
-       cs = p->cs;
-       if(NULL == cs)
+       c_retm_if(!data, "data is null");
+
+       struct autolink_data_t *s_ald = NULL;
+       cal_detail_data* p = data;
+       char buf[128] = { 0 };
+
+       Elm_Entry_Anchor_Info *ei = (Elm_Entry_Anchor_Info *)event_info;
+
+       char *temp = strchr(ei->name, ' ');
+       if (!temp)
        {
-               return NULL;
+               ERR("strchr(ei->name, ' ') is failed");
+               return;
        }
 
-       if (!CAL_STRCMP(part, "elm.text.1"))
+       CAL_STRNCPY(buf, ei->name, temp - ei->name);
+
+       temp = strchr(buf, '|');
+       if (!temp)
        {
-               return strdup(C_("IDS_CLD_BODY_REPEAT"));
+               ERR("strchr(buf '|') is failed");
+               return;
        }
 
-       if(!CAL_STRCMP(part, "elm.text.2"))
-       {
-               __cal_detail_get_repeat(cs, buf, sizeof(buf));
+       s_ald = calloc(1, sizeof(struct autolink_data_t));
+       c_retm_if(!s_ald, "calloc(1, struct autolink_data_t) is failed");
 
-               return strdup(buf);
+       s_ald->info = calloc(128, sizeof(char));
+       if (!s_ald->info)
+       {
+               ERR("calloc(128, char) is failed");
+               free(s_ald);
+               return;
        }
 
-       return NULL;
-}
+       *temp = '\0';
+       CAL_STRNCPY(s_ald->info, temp + 1, 128);
 
-static char* __cal_detail_get_note_text(Evas_Object *obj, const char *part, cal_detail_genlist_item_data *item_data)
-{
-       cal_struct *cs;
+       s_ald->type = __cal_detail_parse_autolink_anchor_type(buf);
 
-       cal_detail_data *p = item_data->p;
-       cs = p->cs;
-       if (NULL == cs)
+       switch (s_ald->type)
        {
-               return NULL;
+       case ANCHOR_EMAIL:
+       case ANCHOR_PHONE:
+               __cal_detail_show_autolink_popup(s_ald, p);
+               return;
+       case ANCHOR_URL:
+               aul_open_content(s_ald->info);  /* launch browser */
+               break;
+       case ANCHOR_EMAIL_LINK:
+               __cal_detail_autolink_email_link_clicked(s_ald->info);
+               break;
+       default:
+               break;
        }
 
-       return NULL;
+       free(s_ald->info);
+       free(s_ald);
 }
 
 static Evas_Object* __cal_detail_add_note_object(cal_detail_data *p, Evas_Object *parent, const char *text)
@@ -699,7 +1424,7 @@ static Evas_Object* __cal_detail_add_note_object(cal_detail_data *p, Evas_Object
        c_retvm_if(!text, NULL, "text is null");
        c_retvm_if(!strlen(text), NULL, "strlen(text) is zero");
 
-       Evas_Object *layout = cal_util_add_edit_field(parent, C_("IDS_COM_BODY_NOTE"), NULL, EINA_FALSE, EINA_FALSE);
+       Evas_Object *layout = cal_util_add_edit_field(parent, S_("IDS_COM_BODY_NOTE"), NULL, EINA_FALSE, EINA_FALSE);
        c_retvm_if(!layout, NULL, "layout is null");
 
        Evas_Object *entry = elm_object_part_content_get(layout, "elm.swallow.content");
@@ -708,12 +1433,11 @@ static Evas_Object* __cal_detail_add_note_object(cal_detail_data *p, Evas_Object
        p->entry = entry;
        p->text = text;
 
-       elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
+       evas_object_smart_callback_add(entry, "anchor,clicked", __cal_detail_autolink_anchor_clicked_callback, p);
        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_EXPAND);
        elm_entry_input_panel_enabled_set(entry, EINA_FALSE);
        elm_entry_autocapital_type_set(entry, EINA_TRUE);
-       elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
 
        elm_entry_entry_set(entry, text);
 
@@ -729,7 +1453,7 @@ static Evas_Object* __cal_detail_add_note_icon(Evas_Object *obj, const char *par
        cal_detail_data *p = item_data->p;
        Evas_Object *edit_field = NULL;
        const char *note = NULL;
-
+       GString *text = NULL;
        cal_struct *cs = p->cs;
        c_retvm_if(!cs, NULL, "cs is null");
 
@@ -739,7 +1463,9 @@ static Evas_Object* __cal_detail_add_note_icon(Evas_Object *obj, const char *par
                if (!CAL_STRLEN(note))
                        return NULL;
 
-               edit_field = __cal_detail_add_note_object(p, obj, elm_entry_utf8_to_markup(note));
+               text = __cal_detail_add_autolink_anchor(elm_entry_utf8_to_markup(note));
+               g_string_prepend(text, "<font_size=35>");
+               edit_field = __cal_detail_add_note_object(p, obj, text->str);
        }
 
        return edit_field;
@@ -756,6 +1482,7 @@ static Evas_Object *__cal_detail_get_genlist_item_icon(void *data, Evas_Object *
 
        switch ( type )
        {
+
        case _GTYPE_NOTE:
                e_obj = __cal_detail_add_note_icon(obj, part, item_data);
                break;
@@ -766,6 +1493,31 @@ static Evas_Object *__cal_detail_get_genlist_item_icon(void *data, Evas_Object *
        return e_obj;
 }
 
+static  char* __cal_detail_get_priority_text(Evas_Object *obj, const char *part, cal_detail_genlist_item_data *item_data)
+{
+       cal_detail_data *p = item_data->p;
+       cal_struct *cs;
+       cs = p->cs;
+       c_retvm_if(!cs, NULL, "cs is null");
+
+       if (!CAL_STRCMP(part, "elm.text.1"))
+               return strdup(C_("IDS_CLD_BODY_PRIORITY"));
+
+       if (!CAL_STRCMP(part, "elm.text.2")) {
+               switch (p->priority) {
+                       case EVENT_PRIORITY_LOW:
+                               return strdup(S_("IDS_COM_BODY_LOW"));
+                       case EVENT_PRIORITY_NORMAL:
+                               return strdup(C_("IDS_IDLE_BODY_NORMAL"));
+                       case EVENT_PRIORITY_HIGH:
+                               return strdup(S_("IDS_COM_OPT_HIGH_M_QUALITY"));
+                       default:
+                               return NULL;
+               }
+       }
+
+       return NULL;
+}
 
 static char *__cal_detail_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
 {
@@ -778,30 +1530,22 @@ static char *__cal_detail_get_genlist_item_label(void *data, Evas_Object *obj, c
        {
        case _GTYPE_TITLE_LOC:
                return __cal_detail_get_title_location_text(obj, part, item_data);
-               break;
-       case _GTYPE_START:
-               return __cal_detail_get_start_time_text(obj, part, item_data);
-               break;
-       case _GTYPE_END:
-               return __cal_detail_get_end_time_text(obj, part, item_data);
-               break;
-       case _GTYPE_ALARM:
-               return __cal_detail_add_alarm_text(obj, part, item_data);
-               break;
-       case _GTYPE_REPEAT:
-               return __cal_detail_get_repeat_text(obj, part, item_data);
-               break;
+       case _GTYPE_START_AND_END_TIME:
+               return __cal_detail_get_start_time_and_end_time_text(obj, part, item_data);
+       case _GTYPE_DUE:
+               return __cal_detail_get_due_text(obj, part, item_data);
+       case _GTYPE_REMINDER_AND_REPEAT:
+               return __cal_detail_add_reminder_and_repeat_text(obj, part, item_data);
        case _GTYPE_NOTE:
                return __cal_detail_get_note_text(obj, part, item_data);
-               break;
+
        case _GTYPE_LINKED_CAL:
                return __cal_detail_get_save_to_text(obj, part, item_data);
-               break;
+       case _GTYPE_PRIORITY:
+               return __cal_detail_get_priority_text(obj, part, item_data);
        default:
-               break;
+               return NULL;
        }
-
-       return NULL;
 }
 
 static void __cal_detail_genlist_item_delete_callback(void *data, Evas_Object *obj)
@@ -849,10 +1593,13 @@ static Elm_Object_Item* __cal_detail_add_separator(Evas_Object *genlist, cal_det
        c_retvm_if(!p, NULL, "p is null");
        c_retvm_if(!genlist, NULL, "genlist is null");
 
+       if (p->is_todo_mode)
+               return NULL;
+
        Elm_Object_Item *git = __cal_detail_add_genlist_item(genlist, &itc_seperator, 0, p);
        c_retvm_if(!git, NULL, "__cal_detail_add_genlist_item returned null");
 
-       elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_NONE);
+       elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
 
        return git;
 }
@@ -861,16 +1608,22 @@ static Elm_Object_Item* __cal_detail_add_separator(Evas_Object *genlist, cal_det
 static Elm_Object_Item* __cal_detail_add_title_location(Evas_Object *genlist, cal_detail_data *p)
 {
        __cal_detail_add_separator(genlist, p);
-       return __cal_detail_add_genlist_item(genlist, &itc_title_loc, _GTYPE_TITLE_LOC, p);
+       return __cal_detail_add_genlist_item(genlist, &itc_2text, _GTYPE_TITLE_LOC, p);
 }
 
-static Elm_Object_Item* __cal_detail_add_start_time(Evas_Object *genlist, cal_detail_data *p)
+static Elm_Object_Item* __cal_detail_add_start_and_end_time(Evas_Object *genlist, cal_detail_data *p)
 {
-       __cal_detail_add_separator(genlist, p);
-       return __cal_detail_add_genlist_item(genlist, &itc_4_text, _GTYPE_START, p);
+//     __cal_detail_add_separator(genlist, p);
+       return __cal_detail_add_genlist_item(genlist, &itc_4text, _GTYPE_START_AND_END_TIME, p);
 }
 
-static void __cal_detail_add_alarm_item(Evas_Object *genlist, Elm_Genlist_Item_Class *itc, int type, cal_detail_data *p, int alarm)
+static Elm_Object_Item* __cal_detail_add_due(Evas_Object *genlist, cal_detail_data *p)
+{
+//     __cal_detail_add_separator(genlist, p);
+       return __cal_detail_add_genlist_item(genlist, &itc_2text, _GTYPE_DUE, p);
+}
+
+static void __cal_detail_add_reminder_and_repeat_item(Evas_Object *genlist, Elm_Genlist_Item_Class *itc, int type, cal_detail_data *p, int alarm)
 {
        c_retm_if(!genlist, "genlist is null");
        c_retm_if(!itc, "itc is null");
@@ -893,44 +1646,30 @@ static void __cal_detail_add_alarm_item(Evas_Object *genlist, Elm_Genlist_Item_C
        }
 }
 
-static void __cal_detail_add_alarm(Evas_Object *genlist, cal_detail_data *p)
+static void __cal_detail_add_reminder_and_repeat(Evas_Object *genlist, cal_detail_data *p)
 {
        c_retm_if(!genlist, "genlist is null");
        c_retm_if(!p, "p is null");
        c_retm_if(!p->cs, "p->cs is null");
 
-       __cal_detail_add_separator(genlist, p);
+//     __cal_detail_add_separator(genlist, p);
        __cal_detail_get_alarm(p, p->cs);
 
        if (!p->alarm_list) {
-               __cal_detail_add_alarm_item(genlist, &itc_4_text, _GTYPE_ALARM, p, -1);
+               __cal_detail_add_reminder_and_repeat_item(genlist, &itc_4text, _GTYPE_REMINDER_AND_REPEAT, p, -1);
        } else {
                GList *alarm = p->alarm_list;
                int alarm_min;
 
                while (alarm) {
                        alarm_min = (int)alarm->data;
-                       __cal_detail_add_alarm_item(genlist, &itc_4_text, _GTYPE_ALARM, p, alarm_min);
+                       __cal_detail_add_reminder_and_repeat_item(genlist, &itc_4text, _GTYPE_REMINDER_AND_REPEAT, p, alarm_min);
                        alarm = g_list_next(alarm);
                }
        }
        return;
 }
 
-static Elm_Object_Item* __cal_detail_add_end_time(Evas_Object *genlist, cal_detail_data *p)
-{
-       __cal_detail_add_separator(genlist, p);
-       return __cal_detail_add_genlist_item(genlist, &itc_4_text, _GTYPE_END, p);
-}
-
-
-static Elm_Object_Item* __cal_detail_add_repeat(Evas_Object *genlist, cal_detail_data *p)
-{
-       __cal_detail_add_separator(genlist, p);
-       return __cal_detail_add_genlist_item(genlist, &itc_4_text, _GTYPE_REPEAT, p);
-}
-
-
 static Elm_Object_Item* __cal_detail_add_note(Evas_Object *genlist, cal_detail_data *p)
 {
        c_retvm_if(!p, NULL, "p is null");
@@ -943,14 +1682,14 @@ static Elm_Object_Item* __cal_detail_add_note(Evas_Object *genlist, cal_detail_d
        if (!CAL_STRLEN(note))
                return NULL;
 
-       __cal_detail_add_separator(genlist, p);
+//     __cal_detail_add_separator(genlist, p);
 
        return __cal_detail_add_genlist_item(genlist, &itc_mutilline, _GTYPE_NOTE, p);
 }
 
 static Elm_Object_Item* __cal_detail_add_save_to(Evas_Object *genlist, cal_detail_data *p)
 {
-       __cal_detail_add_separator(genlist, p);
+//     __cal_detail_add_separator(genlist, p);
 
        return __cal_detail_add_genlist_item(genlist, &itc_linked_cal, _GTYPE_LINKED_CAL, p);
 }
@@ -978,10 +1717,16 @@ static Evas_Object *__cal_detail_create_genlist(cal_detail_data *p)
 
        Evas_Object *genlist;
 
-       if(p->ad->is_aul && p->ad->ical)
+       if (p->ad->ical)
                p->cs = p->ad->ical;
-       else
-               p->cs = __cal_detail_get_event(p->ad->cid);
+       else {
+               if (p->cs)
+                       CALENDAR_SVC_STRUCT_FREE(&p->cs);
+
+               p->cs = __cal_detail_get_event(p, p->ad->cid);
+       }
+
+       cal_main_set_cs(p->ad, p->cs);
 
        if (!p->cs) {
                __cal_detail_show_error_popup(p);
@@ -998,21 +1743,20 @@ static Evas_Object *__cal_detail_create_genlist(cal_detail_data *p)
        itc_seperator.func.state_get = __cal_detail_get_genlist_item_state;
        itc_seperator.func.del = __cal_detail_genlist_item_delete_callback;
 
+       itc_2text.item_style = "dialogue/2text";
+       itc_2text.func.text_get = __cal_detail_get_genlist_item_label;
+       itc_2text.func.del = __cal_detail_genlist_item_delete_callback;
 
-       itc_title_loc.item_style = "dialogue/2text";
-       itc_title_loc.func.text_get = __cal_detail_get_genlist_item_label;
-       itc_title_loc.func.del = __cal_detail_genlist_item_delete_callback;
-
-       itc_4_text.item_style = "dialogue/2text";
-       itc_4_text.func.text_get = __cal_detail_get_genlist_item_label;
-       itc_4_text.func.del = __cal_detail_genlist_item_delete_callback;
+       itc_4text.item_style = "dialogue/4text";
+       itc_4text.func.text_get = __cal_detail_get_genlist_item_label;
+       itc_4text.func.del = __cal_detail_genlist_item_delete_callback;
 
        itc_mutilline.item_style = "dialogue/1icon";
        itc_mutilline.func.text_get = __cal_detail_get_genlist_item_label;
        itc_mutilline.func.del = __cal_detail_genlist_item_delete_callback;
        itc_mutilline.func.content_get = __cal_detail_get_genlist_item_icon;
 
-       itc_parts.item_style = "dialogue/1icon";
+       itc_parts.item_style = "dialogue/1icon.fill";
        itc_parts.func.text_get = __cal_detail_get_genlist_item_label;
        itc_parts.func.del = __cal_detail_genlist_item_delete_callback;
        itc_parts.func.content_get = __cal_detail_get_genlist_item_icon;
@@ -1022,11 +1766,10 @@ static Evas_Object *__cal_detail_create_genlist(cal_detail_data *p)
        itc_linked_cal.func.del = __cal_detail_genlist_item_delete_callback;
 
        __cal_detail_add_title_location(genlist, p);
-       __cal_detail_add_start_time(genlist, p);
-       __cal_detail_add_end_time(genlist, p);
-       __cal_detail_add_alarm(genlist, p);
-       __cal_detail_add_repeat(genlist, p);
+       __cal_detail_add_start_and_end_time(genlist, p);
+       __cal_detail_add_reminder_and_repeat(genlist, p);
        __cal_detail_add_note(genlist, p);
+
        __cal_detail_add_save_to(genlist, p);
 
        return genlist;
@@ -1080,11 +1823,10 @@ static Evas_Object *__cal_detail_create_layout(struct appdata *ad, Evas_Object *
        p->ly = ly;
        p->cid = ad->cid;
        p->alarm_list  = NULL;
+       p->is_todo_mode  = EINA_FALSE;
 
        is_hour24 = ad->is_hour24;
 
-       elm_layout_theme_set(CAL_UTIL_GET_EDJ_DATA(ly),"layout", "application", "controlbar");
-
        genlist = __cal_detail_create_genlist(p);
        if (!genlist)
        {
@@ -1096,6 +1838,8 @@ static Evas_Object *__cal_detail_create_layout(struct appdata *ad, Evas_Object *
        elm_object_part_content_set(p->ly, "sw", genlist);
        p->genlist = genlist;
 
+       p->evt = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, __cal_detail_mouse_button_down_callback, p);
+
        evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_detail_delete_layout, p);
 
        CALENDAR_SVC_ADD_EVENT_CHANGED_CALLBACK(__cal_detail_update_view, p);
@@ -1107,15 +1851,13 @@ static void __cal_detail_save_to_calendar_button_callback(void *data, Evas_Objec
 {
        CAL_FN_START;
 
-       c_retm_if(!data, "data is null");
-
-       Evas_Object *ly = data;
-       cal_detail_data *p;
+       struct appdata *ad = data;
+       c_retm_if(!ad || !ad->nv, "ad or ad->nv is null");
 
-       p = CAL_UTIL_GET_PRIV_DATA(ly);
-       c_retm_if(!p, "CAL_UTIL_GET_PRIV_DATA(ly) returned null");
+       int r = CALENDAR_SVC_INSERT(ad->ical);
+       if (CAL_SUCCESS != r)
+               ERR("Calendar service delete failed: %d", r);
 
-       cal_edit_create_view(p->ad, p->parent);
 }
 
 void cal_detail_create_view(struct appdata *ad, Evas_Object *parent)
@@ -1135,7 +1877,7 @@ void cal_detail_create_view(struct appdata *ad, Evas_Object *parent)
        ly = __cal_detail_create_layout(ad, parent);
        c_retm_if(!ly, "__cal_detail_create_layout(ad, parent) is failed");
 
-       navi_item = elm_naviframe_item_push(ad->nv, C_("IDS_COM_BODY_DETAILS"), NULL, NULL, ly, NULL);
+       navi_item = elm_naviframe_item_push(ad->nv, C_("IDS_CLD_BODY_EVENT_DETAILS"), NULL, NULL, ly, NULL);
        if (!navi_item)
        {
                ERR("elm_naviframe_item_push is failed");
@@ -1151,8 +1893,12 @@ void cal_detail_create_view(struct appdata *ad, Evas_Object *parent)
                return;
        }
 
-       elm_toolbar_item_append(controlbar, NULL, S_("IDS_COM_SK_EDIT"), __cal_detail_edit_button_callback, ly);
-       elm_toolbar_item_append(controlbar, NULL, S_("IDS_COM_BODY_DELETE"), __cal_detail_delete_button_callback, ly);
+       elm_toolbar_item_append(controlbar, CAL_CBAR_ICON_EDIT, NULL, __cal_detail_edit_button_callback, ly);
+
+       if (ad->item_type == ITEM_TYPE_UNKNOWN) {
+               elm_toolbar_item_append(controlbar, CAL_CBAR_ICON_SHARE, NULL, __cal_detail_send_button_callback, ly);
+               elm_toolbar_item_append(controlbar, CAL_CBAR_ICON_DELETE, NULL, __cal_detail_delete_button_callback, ly);
+       }
 
        elm_object_item_part_content_set( navi_item, "controlbar", controlbar);
 
@@ -1176,25 +1922,182 @@ void cal_detail_create_view(struct appdata *ad, Evas_Object *parent)
        CAL_FN_END;
 }
 
-void cal_viewer_create_view(struct appdata *ad, Evas_Object *parent, char* raw_data)
+void cal_detail_create_viewer(struct appdata *ad, Evas_Object *parent, cal_struct *cs)
 {
        CAL_FN_START;
 
-       c_retm_if(!ad || !parent || !raw_data, "Input parameter is null");
+       c_retm_if(!ad || !parent || !cs, "Input parameter is null");
 
        Evas_Object *ly;
        Evas_Object *back_button;
-       Evas_Object *controlbar;
        Elm_Object_Item* navi_item;
 
-       int r = CALENDAR_SVC_UTIL_CONVERT_VCS_TO_EVENT(raw_data, VCALENDAR_DATA_LEN, &ad->ical);
-       if (r != CAL_SUCCESS)
-               ERR("CALENDAR_SVC_UTIL_CONVERT_VCS_TO_EVENT fail. : %d", r);
-
+       ad->ical = cs;
        ly = __cal_detail_create_layout(ad, parent);
        c_retm_if(!ly, "__cal_detail_create_layout(ad, parent) is failed");
 
        navi_item = elm_naviframe_item_push(ad->nv, _("VCS Viewer"), NULL, NULL, ly, NULL);
+       if (!navi_item) {
+               ERR("elm_naviframe_item_push is failed");
+               evas_object_del(ly);
+               return;
+       }
+
+       Evas_Object *controlbar = cal_util_add_controlbar(ad->nv);
+       if (!controlbar) {
+               ERR("cal_util_add_controlbar(ad->nv) is failed");
+               elm_naviframe_item_pop(ad->nv);
+               return;
+       }
+
+       elm_toolbar_item_append(controlbar, NULL, S_("IDS_COM_OPT_SAVE"), __cal_detail_save_to_calendar_button_callback, ad);
+       elm_object_item_part_content_set(navi_item, "controlbar", controlbar);
+
+       back_button = elm_button_add(ad->nv);
+       c_retm_if(!back_button, "elm_button_add is failed.");
+
+       elm_object_style_set(back_button, "naviframe/back_btn/default");
+       elm_object_item_part_content_set(navi_item, "prev_btn", back_button);
+
+       evas_object_smart_callback_add(back_button, "clicked",  __cal_detail_viewer_back_button_callback, ad);
+}
+
+static int __cal_detail_get_priority(cal_struct *cs)
+{
+       c_retvm_if(!cs, 0, "cs is null");
+
+       return CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_PRIORITY);
+}
+
+static void __cal_detail_add_priority(Evas_Object *genlist, cal_detail_data *p)
+{
+       c_retm_if(!genlist, "genlist is null");
+       c_retm_if(!p, "p is null");
+       c_retm_if(!p->cs, "p->cs is null");
+
+       p->priority = __cal_detail_get_priority(p->cs);
+
+       __cal_detail_add_genlist_item(genlist, &itc_4text, _GTYPE_PRIORITY, p);
+
+       return;
+}
+
+static Evas_Object *__cal_detail_create_genlist_todo(cal_detail_data *p)
+{
+       c_retvm_if(!p, NULL, "p is null");
+       c_retvm_if(!p->ad, NULL, "p->ad is null");
+
+       Evas_Object *genlist;
+
+       if(p->ad->is_aul && p->ad->ical)
+               p->cs = p->ad->ical;
+       else
+               p->cs = __cal_detail_get_event(p, p->ad->cid);
+
+       if(!p->cs)
+               __cal_detail_show_error_popup(p);
+
+       genlist = elm_genlist_add(p->ly);
+       c_retvm_if(!genlist, NULL, "elm_genlist_add(p->ly) returned null");
+
+       if (NULL != p->ad->theme)
+       {
+               elm_object_theme_set(genlist, p->ad->theme);
+       }
+
+       elm_genlist_select_mode_set(genlist, ELM_OBJECT_SELECT_MODE_NONE);
+
+       itc_seperator.item_style = "dialogue/seperator";
+       itc_seperator.func.text_get = NULL;
+       itc_seperator.func.state_get = __cal_detail_get_genlist_item_state;
+       itc_seperator.func.del = __cal_detail_genlist_item_delete_callback;
+
+       itc_2text.item_style = "dialogue/2text";
+       itc_2text.func.text_get = __cal_detail_get_genlist_item_label;
+       itc_2text.func.del = __cal_detail_genlist_item_delete_callback;
+
+       itc_4text.item_style = "dialogue/2text";
+       itc_4text.func.text_get = __cal_detail_get_genlist_item_label;
+       itc_4text.func.del = __cal_detail_genlist_item_delete_callback;
+
+       itc_mutilline.item_style = "dialogue/1icon";
+       itc_mutilline.func.text_get = __cal_detail_get_genlist_item_label;
+       itc_mutilline.func.del = __cal_detail_genlist_item_delete_callback;
+       itc_mutilline.func.content_get = __cal_detail_get_genlist_item_icon;
+
+       Elm_Object_Item *git = __cal_detail_add_genlist_item(genlist, &itc_seperator, 0, p);
+       c_retvm_if(!git, NULL, "__cal_detail_add_genlist_item returned null");
+       elm_genlist_item_select_mode_set(git, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+       __cal_detail_add_title_location(genlist, p);
+       __cal_detail_add_due(genlist, p);
+       __cal_detail_add_priority(genlist, p);
+       __cal_detail_add_reminder_and_repeat(genlist, p);
+       __cal_detail_add_note(genlist, p);
+
+       return genlist;
+}
+
+static Evas_Object *__cal_detail_create_layout_todo(struct appdata *ad, Evas_Object *parent)
+{
+       Evas_Object *ly;
+       cal_detail_data *p;
+       Evas_Object *genlist;
+       p = calloc(1, sizeof(cal_detail_data));
+
+       p->name = _name;
+       p->parent = parent;
+
+       ly = cal_util_add_layout(parent, "edit");
+       if (!ly)
+       {
+               free(p);
+               return NULL;
+       }
+       evas_object_data_set(ly, "priv", p);
+       p->ad = ad;
+       p->ly = ly;
+       p->cid = ad->cid;
+       p->alarm_list  = NULL;
+       p->is_todo_mode  = EINA_TRUE;
+
+       is_hour24 = ad->is_hour24;
+
+       genlist = __cal_detail_create_genlist_todo(p);
+       if (!genlist)
+       {
+               evas_object_del(ly);
+               free(p);
+               return NULL;
+       }
+
+       elm_object_part_content_set(p->ly, "sw", genlist);
+       p->genlist = genlist;
+
+       p->evt = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, __cal_detail_mouse_button_down_callback, p);
+
+       evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_detail_delete_layout, p);
+
+       CALENDAR_SVC_ADD_EVENT_CHANGED_CALLBACK(__cal_detail_update_view_todo, p);
+
+       return ly;
+}
+
+void cal_detail_create_view_todo(struct appdata *ad, Evas_Object *parent)
+{
+       CAL_FN_START;
+
+       c_retm_if(!ad || !parent, "Input parameter is null");
+
+       Evas_Object *ly;
+       Evas_Object *back_button;
+       Evas_Object *controlbar;
+       Elm_Object_Item* navi_item;
+
+       ly = __cal_detail_create_layout_todo(ad, parent);
+       c_retm_if(!ly, "__cal_detail_create_layout(ad, parent) is failed");
+
+       navi_item = elm_naviframe_item_push(ad->nv, C_("IDS_CLD_BODY_TASK_DETAILS"), NULL, NULL, ly, NULL);
        if (!navi_item)
        {
                ERR("elm_naviframe_item_push is failed");
@@ -1210,9 +2113,11 @@ void cal_viewer_create_view(struct appdata *ad, Evas_Object *parent, char* raw_d
                return;
        }
 
-       elm_toolbar_item_append(controlbar, NULL, _("Save to Calendar"), __cal_detail_save_to_calendar_button_callback, ly);
+       elm_toolbar_item_append(controlbar, CAL_CBAR_ICON_EDIT, NULL, __cal_detail_edit_button_callback, ly);
+       elm_toolbar_item_append(controlbar, CAL_CBAR_ICON_SHARE, NULL, __cal_detail_send_button_callback, ly);
+       elm_toolbar_item_append(controlbar, CAL_CBAR_ICON_DELETE, NULL, __cal_detail_delete_button_callback, ly);
 
-       elm_object_item_part_content_set(navi_item, "controlbar", controlbar);
+       elm_object_item_part_content_set( navi_item, "controlbar", controlbar);
 
        back_button = elm_object_item_part_content_get(navi_item, "prev_btn");
        if (!back_button)
@@ -1227,5 +2132,33 @@ void cal_viewer_create_view(struct appdata *ad, Evas_Object *parent, char* raw_d
                elm_object_item_part_content_set(navi_item, "prev_btn", back_button);
        }
        elm_object_style_set(back_button, "naviframe/back_btn/default");
-       evas_object_smart_callback_add(back_button, "clicked",  __cal_viewer_back_button_callback, CAL_UTIL_GET_PRIV_DATA(ly));
+       evas_object_smart_callback_add(back_button, "clicked",  __cal_detail_back_button_callback, CAL_UTIL_GET_PRIV_DATA(ly));
+}
+
+static void __cal_detail_update_view_todo(void *data)
+{
+       CAL_FN_START;
+
+       c_retm_if(!data, "data is null");
+
+       cal_detail_data *p = data;
+
+       if (p->is_deleted)
+               return;
+
+       Evas_Object *genlist;
+       struct appdata* ad = p->ad;
+       c_retm_if(!ad, "ad is null");
+
+       is_hour24 = ad->is_hour24;
+
+       cal_util_delete_evas_object(&p->genlist);
+       genlist = __cal_detail_create_genlist_todo(p);
+       if (genlist)
+       {
+               elm_object_part_content_set(p->ly, "sw", genlist);
+               p->genlist = genlist;
+       }
 }
+
+