@Override
 public int getSectionForPosition(int position) {
   int i = 0;
   switch (getItemViewType(position)) {
     case TYPE_ITEM:
       Events e = getItem(position);
       for (Entry<Integer, String> entry : mSeparatorsSet.entrySet()) {
         if (entry.getValue().equals(fullDateFormat.format(e.getEnd()))) {
           return i;
         }
         i++;
       }
       break;
     case TYPE_SEPARATOR:
       for (Entry<Integer, String> entry : mSeparatorsSet.entrySet()) {
         if (entry.getKey().equals(Integer.valueOf(position))) {
           return i;
         }
         i++;
       }
       break;
     default:
       return 0;
   }
   return 0;
 }
  private void setItemsInternal(List<Events> events) {
    String fillDate = fullDateFormat.format(Calendar.getInstance().getTime());
    String actualDate;

    for (Events evt : events) {
      actualDate = fullDateFormat.format(evt.getEnd());

      if (actualDate.equals(fillDate) && mSeparatorsSet.size() > 0) {
        addItem(evt);
      } else {
        addSeparatorItem(actualDate);
        addItem(evt);
      }

      fillDate = actualDate;
    }

    callListener();
  }
 public void setSelection(Events mEvent) {
   if (mEvent != null) {
     this.selection = mEvent.getId();
     if (selListener != null) {
       selListener.onSelected(selection);
     }
   } else {
     this.selection = -1;
   }
   notifyDataSetChanged();
 }
  private void initViews(View v) {
    typeEdit = (EditText) v.findViewById(R.id.text_edit_type);
    lecturerEdit = (EditText) v.findViewById(R.id.text_edit_lecturer);
    roomEdit = (EditText) v.findViewById(R.id.text_edit_room);
    dateEdit = (EditText) v.findViewById(R.id.text_edit_date);
    startEdit = (EditText) v.findViewById(R.id.text_edit_start);
    endEdit = (EditText) v.findViewById(R.id.text_edit_end);

    typeEdit.setText(event.getType());
    lecturerEdit.setText(event.getLecturer());
    roomEdit.setText(event.getRoom());
    dateEdit.setText(dateFormat.format(event.getEnd()));
    startEdit.setText(timeFormat.format(event.getStart()));
    endEdit.setText(timeFormat.format(event.getEnd()));

    dateEdit.setFocusable(false);
    dateEdit.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            DatePickerFragment newFragment =
                (DatePickerFragment) DatePickerFragment.newInstance(event.getEnd().getTime());
            newFragment.setOnDateSetListener(
                new DatePickerDialog.OnDateSetListener() {
                  @Override
                  public void onDateSet(
                      DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                    Calendar c = Calendar.getInstance(Locale.GERMANY);
                    c.set(Calendar.YEAR, year);
                    c.set(Calendar.MONTH, monthOfYear);
                    c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                    dateEdit.setText(dateFormat.format(c.getTime()));
                  }
                });
            newFragment.show(getSherlockActivity().getSupportFragmentManager(), "timePicker");
          }
        });
    startEdit.setFocusable(false);
    startEdit.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            final long dateDiff = event.getEnd().getTime() - event.getStart().getTime();

            TimePickerFragment newFragment =
                (TimePickerFragment) TimePickerFragment.newInstance(event.getStart().getTime());
            newFragment.setOnTimeSetListener(
                new TimePickerDialog.OnTimeSetListener() {
                  @Override
                  public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                    Calendar c = Calendar.getInstance(Locale.GERMANY);
                    c.set(Calendar.HOUR_OF_DAY, hourOfDay);
                    c.set(Calendar.MINUTE, minute);

                    startEdit.setText(timeFormat.format(c.getTime()));
                    endEdit.setText(timeFormat.format(new Date(c.getTimeInMillis() + dateDiff)));
                  }
                });
            newFragment.show(getSherlockActivity().getSupportFragmentManager(), "startPicker");
          }
        });
    endEdit.setFocusable(false);
    endEdit.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            TimePickerFragment newFragment =
                (TimePickerFragment) TimePickerFragment.newInstance(event.getEnd().getTime());
            newFragment.setOnTimeSetListener(
                new TimePickerDialog.OnTimeSetListener() {
                  @Override
                  public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                    Calendar c = Calendar.getInstance(Locale.GERMANY);
                    c.set(Calendar.HOUR_OF_DAY, hourOfDay);
                    c.set(Calendar.MINUTE, minute);

                    Date start;
                    Date end;
                    try {
                      end = c.getTime();
                      start = timeFormat.parse(startEdit.getText().toString());
                      if (start.after(end)) {
                        end = start;
                      }
                      endEdit.setText(timeFormat.format(end));
                    } catch (ParseException e) {
                    }
                  }
                });
            newFragment.show(getSherlockActivity().getSupportFragmentManager(), "endPicker");
          }
        });
  }
  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    View layout =
        LayoutInflater.from(getActivity()).inflate(R.layout.fragment_dialog_edit, null, false);
    if (event != null) {
      initViews(layout);
    }
    builder
        .setTitle(
            event == null
                ? getString(R.string.dialog_event_change_title)
                : event.getSubjects().getTitle())
        .setCancelable(false)
        .setView(layout)
        .setPositiveButton(
            R.string.dialog_event_change_save,
            new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {
                event.setType(typeEdit.getText().toString());
                event.setLecturer(lecturerEdit.getText().toString());
                event.setRoom(roomEdit.getText().toString());
                try {
                  Calendar date = Calendar.getInstance();
                  date.setTime(dateFormat.parse(dateEdit.getText().toString()));

                  int month = date.get(Calendar.MONTH);
                  int day = date.get(Calendar.DAY_OF_MONTH);
                  int year = date.get(Calendar.YEAR);

                  Calendar start = Calendar.getInstance();
                  start.setTime(timeFormat.parse(startEdit.getText().toString()));
                  start.set(year, month, day);
                  Calendar end = Calendar.getInstance();
                  end.setTime(timeFormat.parse(endEdit.getText().toString()));
                  end.set(year, month, day);

                  event.setStart(start.getTime());
                  event.setEnd(end.getTime());
                } catch (Exception e) {
                  Log.e(getClass().getSimpleName(), e.toString());
                } finally {
                  ((TimetableApplication) getActivity().getApplication()).updateEvent(event);
                  if (getActivity() instanceof TimetableActivity) {
                    ((TimetableActivity) getActivity()).updateList();
                  }
                  dialog.dismiss();
                }
              }
            })
        .setNegativeButton(
            R.string.dialog_event_change_discard,
            new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
              }
            });
    AlertDialog alertDialog = builder.create();
    return alertDialog;
  }
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    int type = getItemViewType(position);
    if (convertView == null) {
      holder = new ViewHolder();
      switch (type) {
        case TYPE_ITEM:
          convertView = mInflater.inflate(R.layout.fragment_subject_item, null);
          holder.titleView = (TextView) convertView.findViewById(R.id.text_subject_item_title);
          holder.dateView = (TextView) convertView.findViewById(R.id.text_subject_item_time);
          holder.roomView = (TextView) convertView.findViewById(R.id.text_subject_item_room);

          if (position % 2 == 0) {
            convertView.setBackgroundColor(
                context.getResources().getColor(R.color.abs__background_holo_dark));
          } else {
            convertView.setBackgroundColor(
                context.getResources().getColor(R.color.abs__background_holo_light));
          }

          break;
        case TYPE_SEPARATOR:
          convertView = mInflater.inflate(R.layout.fragment_subject_separator, null);
          holder.separatorView = (TextView) convertView.findViewById(R.id.text_subject_separator);
          break;
      }
      convertView.setTag(holder);
    } else {
      holder = (ViewHolder) convertView.getTag();
    }

    if (type == TYPE_ITEM) {
      final Events item = mData.get(position);

      if (item != null) {
        if (selection == item.getId()) {
          convertView.setBackgroundResource(R.drawable.abs__list_activated_holo);
          int padding = context.getResources().getDimensionPixelSize(R.dimen.default_list_padding);
          convertView.setPadding(padding, padding, padding, padding);
        } else {
          convertView.setBackgroundResource(android.R.color.transparent);
        }

        try {
          holder.titleView.setText(item.getSubjects().getTitle());
        } catch (Exception e) {
          Log.e(TAG, item.getSubjectId() + " " + item.getSubjects());
          HashMap<String, String> extraData = new HashMap<String, String>();
          extraData.put("subjectsid", String.valueOf(item.getSubjectId()));
          extraData.put("subjects", String.valueOf(item.getSubjects()));

          BugSenseHandler.sendExceptionMap(extraData, e);
        }

        holder.roomView.setText(item.getRoom());
        holder.dateView.setText(df.format(item.getStart()) + " - " + df.format(item.getEnd()));
      }

    } else {
      try {
        Calendar nextSeperatorDate = Calendar.getInstance();
        nextSeperatorDate.setTime(fullDateFormat.parse(getSeperatorItem(position)));

        long dateDiff = daysDiff(Calendar.getInstance(), nextSeperatorDate);

        if (dateDiff == 0) {
          holder.separatorView.setText(context.getString(R.string.text_today));
        } else if (dateDiff == 1) {
          holder.separatorView.setText(context.getString(R.string.text_tomorrow));
        } else if (dateDiff == -1) {
          holder.separatorView.setText(context.getString(R.string.text_yesterday));
        } else if (dateDiff == -2) {
          holder.separatorView.setText(context.getString(R.string.text_twoago));
        } else {
          holder.separatorView.setText(getSeperatorItem(position));
        }
      } catch (Exception e) {
        holder.separatorView.setText(getSeperatorItem(position));
        BugSenseHandler.sendException(e);
      }
    }
    return convertView;
  }