// we want a self defined behavior for the back button
  @Override
  public void onBackPressed() {
    // exit fullscreen mode if it is enabled and action bar is disabled or the back stack is empty
    if (mIitcWebView.isInFullscreen() && mBackStack.isEmpty()) {
      mIitcWebView.toggleFullscreen();
      return;
    }

    // close drawer if opened
    if (mNavigationHelper.isDrawerOpened()) {
      mNavigationHelper.closeDrawers();
      return;
    }

    // kill all open iitc dialogs
    if (!mDialogStack.isEmpty()) {
      final String id = mDialogStack.pop();
      mIitcWebView.loadUrl(
          "javascript: "
              + "var selector = $(window.DIALOGS['"
              + id
              + "']); "
              + "selector.dialog('close'); "
              + "selector.remove();");
      return;
    }

    // Pop last item from backstack and pretend the relevant menu item was clicked
    if (!mBackStack.isEmpty()) {
      backStackPop();
      mBackButtonPressed = true;
      return;
    }

    if (mBackButtonPressed || !mSharedPrefs.getBoolean("pref_press_twice_to_exit", false)) {
      super.onBackPressed();
    } else {
      mBackButtonPressed = true;
      Toast.makeText(this, "Press twice to exit", Toast.LENGTH_SHORT).show();
      // reset back button after 2 seconds
      new Handler()
          .postDelayed(
              new Runnable() {
                @Override
                public void run() {
                  mBackButtonPressed = false;
                }
              },
              2000);
    }
  }
  @Override
  public void onSharedPreferenceChanged(
      final SharedPreferences sharedPreferences, final String key) {
    if (key.equals("pref_force_desktop")) {
      mDesktopMode = sharedPreferences.getBoolean("pref_force_desktop", false);
      mNavigationHelper.onPrefChanged();
    } else if (key.equals("pref_user_location_mode")) {
      final int mode = Integer.parseInt(mSharedPrefs.getString("pref_user_location_mode", "0"));
      if (mUserLocation.setLocationMode(mode)) mReloadNeeded = true;
      return;
    } else if (key.equals("pref_persistent_zoom")) {
      mPersistentZoom = mSharedPrefs.getBoolean("pref_persistent_zoom", false);
      return;
    } else if (key.equals("pref_fullscreen")) {
      mIitcWebView.updateFullscreenStatus();
      mNavigationHelper.onPrefChanged();
      return;
    } else if (key.equals("pref_android_menu")) {
      final String[] menuDefaults =
          getResources().getStringArray(R.array.pref_android_menu_default);
      mAdvancedMenu =
          mSharedPrefs.getStringSet(
              "pref_android_menu", new HashSet<String>(Arrays.asList(menuDefaults)));
      mNavigationHelper.setDebugMode(mAdvancedMenu.contains(R.string.menu_debug));
      invalidateOptionsMenu();
      // no reload needed
      return;
    } else if (key.equals("pref_fake_user_agent")) {
      mIitcWebView.setUserAgent();
    } else if (key.equals("pref_last_plugin_update")) {
      final Long forceUpdate = sharedPreferences.getLong("pref_last_plugin_update", 0);
      if (forceUpdate == 0) mFileManager.updatePlugins(true);
      return;
    } else if (key.equals("pref_update_plugins_interval")) {
      final int interval =
          Integer.parseInt(mSharedPrefs.getString("pref_update_plugins_interval", "7"));
      mFileManager.setUpdateInterval(interval);
      return;
    } else if (key.equals("pref_press_twice_to_exit")
        || key.equals("pref_share_selected_tab")
        || key.equals("pref_messages")
        || key.equals("pref_secure_updates")
        || key.equals("pref_external_storage")) {
      // no reload needed
      return;
    }

    mReloadNeeded = true;
  }
 public void reset() {
   mNavigationHelper.reset();
   mMapSettings.reset();
   mUserLocation.reset();
   mIitcWebView.getWebViewClient().reset();
   mBackStack.clear();
   mCurrentPane = Pane.MAP;
 }
  @Override
  public void onConfigurationChanged(final Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    mNavigationHelper.onConfigurationChanged(newConfig);

    Log.d("configuration changed...restoring...reset idleTimer");
    mIitcWebView.loadUrl("javascript: window.idleTime = 0");
    mIitcWebView.loadUrl("javascript: window.renderUpdateStatus()");
  }
  public void setCurrentPane(final Pane pane) {
    // ensure no double adds
    if (pane == mCurrentPane) return;

    // map pane is top-lvl. clear stack.
    if (pane == Pane.MAP) {
      mBackStack.clear();
    }
    // don't push current pane to backstack if this method was called via back button
    else if (!mBackButtonPressed) mBackStack.push(mCurrentPane);

    mBackButtonPressed = false;
    mCurrentPane = pane;
    mNavigationHelper.switchTo(pane);
  }
  public void setLoadingState(final boolean isLoading) {
    mIsLoading = isLoading;
    mNavigationHelper.onLoadingStateChanged();
    invalidateOptionsMenu();
    updateViews();
    if (!isLoading) mFileManager.updatePlugins(false);

    if (mSearchTerm != null && !isLoading) {
      new Handler()
          .postDelayed(
              new Runnable() {
                @Override
                public void run() {
                  // switchToPane(Pane.MAP);
                  mIitcWebView.loadUrl("javascript:search('" + mSearchTerm + "');");
                  mSearchTerm = null;
                }
              },
              5000);
    }
  }
  @Override
  public boolean onPrepareOptionsMenu(final Menu menu) {
    boolean visible = false;
    if (mNavigationHelper != null) visible = !mNavigationHelper.isDrawerOpened();
    if (mIsLoading) visible = false;

    for (int i = 0; i < menu.size(); i++) {
      final MenuItem item = menu.getItem(i);
      final boolean enabled = mAdvancedMenu.contains(item.getTitle());

      switch (item.getItemId()) {
        case R.id.action_settings:
          item.setVisible(true);
          break;

        case R.id.locate:
          item.setVisible(enabled && visible);
          item.setEnabled(!mIsLoading);
          item.setIcon(
              mUserLocation.isFollowing()
                  ? R.drawable.ic_action_location_follow
                  : R.drawable.ic_action_location_found);
          break;

        case R.id.menu_debug:
          item.setVisible(enabled);
          item.setChecked(mDebugging);
          break;

        default:
          item.setVisible(enabled && visible);
      }
    }

    return super.onPrepareOptionsMenu(menu);
  }
  @Override
  public boolean onOptionsItemSelected(final MenuItem item) {
    if (mNavigationHelper.onOptionsItemSelected(item)) return true;

    // Handle item selection
    final int itemId = item.getItemId();

    switch (itemId) {
      case android.R.id.home:
        switchToPane(Pane.MAP);
        return true;
      case R.id.reload_button:
        reloadIITC();
        return true;
      case R.id.toggle_fullscreen:
        mIitcWebView.toggleFullscreen();
        return true;
      case R.id.layer_chooser:
        mNavigationHelper.openRightDrawer();
        return true;
      case R.id.locate: // get the users current location and focus it on map
        switchToPane(Pane.MAP);

        if (mUserLocation.hasCurrentLocation()) {
          // if gps location is displayed we can use a better location without any costs
          mUserLocation.locate(mPersistentZoom);
        } else {
          // get location from network by default
          mIitcWebView.loadUrl(
              "javascript: window.map.locate({setView : true"
                  + (mPersistentZoom ? ", maxZoom : map.getZoom()" : "")
                  + "});");
        }
        return true;
      case R.id.action_settings: // start settings activity
        final Intent intent = new Intent(this, PreferenceActivity.class);
        try {
          intent.putExtra("iitc_version", mFileManager.getIITCVersion());
        } catch (final IOException e) {
          Log.w(e);
          return true;
        }
        startActivity(intent);
        return true;
      case R.id.menu_clear_cookies:
        final CookieManager cm = CookieManager.getInstance();
        cm.removeAllCookie();
        return true;
      case R.id.menu_send_screenshot:
        sendScreenshot();
        return true;
      case R.id.menu_debug:
        mDebugging = !mDebugging;
        updateViews();
        invalidateOptionsMenu();

        // TODO remove debugging stuff from JS?
        return true;
      default:
        return false;
    }
  }
 @Override
 protected void onPostCreate(final Bundle savedInstanceState) {
   super.onPostCreate(savedInstanceState);
   mNavigationHelper.onPostCreate(savedInstanceState);
 }