@Override
  public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
      LayoutInflater inflater =
          (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      convertView = inflater.inflate(R.layout.lessons_list, null);
    }

    if (mSelectedPos == position) {
      convertView.setBackgroundColor(
          mActivity.getResources().getColor(android.R.color.holo_blue_dark));
    } else {
      convertView.setBackgroundColor(
          mActivity.getResources().getColor(android.R.color.transparent));
    }

    TextView itemNameView = (TextView) convertView.findViewById(R.id.itemName);
    TextView itemDetailView = (TextView) convertView.findViewById(R.id.itemDetail);

    Lesson l = (Lesson) getItem(position);

    if (l != null) {
      itemNameView.setText(Html.fromHtml("" + l.getNumber() + ". " + l.getFormText()));
      itemDetailView.setText(Html.fromHtml(mFormat.format(l.getStart()) + l.getTeacher()));
    }

    return convertView;
  }
  @Override
  public Object getItem(int position) {

    if (mCursor == null || mCursor.isClosed()) return null;

    mCursor.moveToPosition(position);

    if (!mCursor.isAfterLast()) return Lesson.getFromCursor(mCursor);

    return null;
  }
  public static void getLessonsDetails(Document doc, Schedule s) throws ParseException {

    final SimpleDateFormat fmt = new SimpleDateFormat("dd.MM.yyyy", Locale.ENGLISH);
    fmt.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));

    Elements tableCells = doc.getElementsByAttributeValue("class", "table diary");
    for (Element tableCell : tableCells) {

      int tdCount = 0;
      Date date = null;
      Lesson l, lPrev = null; // lPrev to handle duplicate lesson
      int sameLesson = 0; // Also to handle duplicate lesson

      Elements trs = tableCell.getElementsByTag("tr");
      for (Element tr : trs) {

        if (tr.hasAttr("class") && tr.attr("class").equals("table-header")) continue;

        l = null;
        sameLesson = 0; // assume no bug here
        Elements tds = tr.getElementsByTag("td");

        for (Element td : tds) {

          if (td.hasAttr("class") && td.attr("class").equals("date")) {

            date = fmt.parse(td.getElementsByTag("div").first().text());
            tdCount = 1;

          } else if (td.hasAttr("class") && td.attr("class").equals("diary-mark")) {

            String marks = fetchLongCellStringNoWhitespaces(td);
            if (l != null && marks != null) {

              if (sameLesson > 0 && lPrev != null) {

                l.setMarks(fixDuplicateString(marks, lPrev.getMarks(), sameLesson));
              } else l.setMarks(marks);
            }
            tdCount++;

          } else if (td.hasAttr("class") && td.attr("class").equals("diary-comment")) {

            String comment = fetchLongCellStringNoWhitespaces(td);
            if (l != null && comment != null) {

              if (sameLesson > 0 && lPrev != null) {

                l.setComment(fixDuplicateString(comment, lPrev.getComment(), sameLesson));
              } else l.setComment(comment);
            }

            tdCount++;

          } else if (tdCount == 2) {

            String theme = fetchLongCellStringNoWhitespaces(td);
            if (l != null && theme != null) {

              if (sameLesson > 0 && lPrev != null) {

                l.setTheme(fixDuplicateString(theme, lPrev.getTheme(), sameLesson));
              } else l.setTheme(theme);
            }
            tdCount++;

          } else if (tdCount == 3) {

            String homework = fetchLongCellStringNoWhitespaces(td);
            if (l != null && homework != null) {

              if (sameLesson > 0 && lPrev != null) {

                l.setHomework(fixDuplicateString(homework, lPrev.getHomework(), sameLesson));
              } else l.setHomework(homework);
            }
            tdCount++;

          } else if (SUBJECT_NAME.matcher(td.text()).find()) {

            tdCount = 2;
            int number = Integer.parseInt(td.text().substring(0, 1));
            l = s.getLessonByNumber(date, number);

            if (lPrev != null
                && l != null
                && l.getStart().equals(lPrev.getStart())
                && l.getNumber() == lPrev.getNumber()) {

              // We hit the same lesson bug
              sameLesson++;
            }

          } else {
            tdCount++;
          }
        }

        if (l != null) {
          lPrev = l;
          l.update();
        }
      }
    }
  }
  public static void getLessons(Document doc, Schedule s) throws ParseException {

    final SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.ENGLISH);
    format.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));

    Elements lessonCells = doc.getElementsByAttribute("number");

    for (Element lessonCell : lessonCells) {

      Lesson l, lPrev = null; // lPrev to handle duplicate lesson
      int sameLesson = 0; // Also to handle duplicate lesson

      int number = Integer.parseInt(lessonCell.attr("number"));
      String time = "";

      Elements timeDetails = lessonCell.getElementsByClass("cell-header2");
      for (Element timeDetail : timeDetails) {
        if (timeDetail.hasAttr("style")) time = timeDetail.text();
      }

      Elements lessonCellDetails = lessonCell.getElementsByAttribute("jsdate");
      for (Element lessonCellDetail : lessonCellDetails) {

        String date = lessonCellDetail.attr("jsdate");
        int index = 0;
        sameLesson = 0;

        for (Element subject :
            lessonCellDetail.getElementsByAttributeValue("class", "lesson-subject")) {

          if (subject == null || subject.text() == null || subject.text().length() <= 0) {
            // No lesson scheduled
            continue;
          }

          Date start = format.parse(date + " " + time.substring(0, time.indexOf("-") - 1));
          if ((l = s.getLessonByNumber(start, number)) == null) {

            if (BuildConfig.DEBUG)
              Log.d("GshisHTMLParser", TS.get() + " getLessons() not found in db, will insert");

            l = new Lesson();
            sameLesson = 0;

            l.setStart(start);
            l.setStop(
                format.parse(date + " " + time.substring(time.indexOf("-") + 2, time.length())));
            l.setFormId(subject.attr("id"));
            l.setFormText(subject.text());
            l.setTeacher(
                lessonCellDetail
                    .getElementsByAttributeValue("class", "lesson-teacher")
                    .get(sameLesson)
                    .text());
            l.setNumber(number);

            s.addLesson(l);

          } else {

            if (BuildConfig.DEBUG)
              Log.d("GshisHTMLParser", TS.get() + " getLessons() found in db, will update");

            l.setFormId(subject.attr("id"));

            if (lPrev != null && lPrev.getStart().equals(start) && lPrev.getNumber() == number) {

              if (BuildConfig.DEBUG)
                Log.d(
                    "GshisHTMLParser",
                    TS.get()
                        + " getLessons() dup = "
                        + subject.text()
                        + " index = "
                        + index
                        + " sameLesson = "
                        + sameLesson);

              sameLesson++;

              if (!lPrev.getFormText().equals(subject.text()))
                l.setFormText(fixDuplicateString(subject.text(), lPrev.getFormText(), sameLesson));

              String teacher =
                  lessonCellDetail
                      .getElementsByAttributeValue("class", "lesson-teacher")
                      .get(index)
                      .text();

              if (!lPrev.getTeacher().equals(teacher))
                l.setTeacher(fixDuplicateString(teacher, lPrev.getTeacher(), sameLesson));

            } else {

              l.setNumber(number);
              l.setFormText(subject.text());
              l.setTeacher(
                  lessonCellDetail
                      .getElementsByAttributeValue("class", "lesson-teacher")
                      .get(index)
                      .text());
            }

            l.update();
          }

          lPrev = l;
          index++;
        }
      }
    }
  }