package ca.cumulonimbus.barometernetwork;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.NotificationManager;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.location.Location;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.preference.PreferenceManager;
import android.provider.Settings.Secure;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import ca.cumulonimbus.barometernetwork.PressureNetApplication.TrackerName;
import ca.cumulonimbus.pressurenetsdk.CbConfiguration;
import ca.cumulonimbus.pressurenetsdk.CbCurrentCondition;
import ca.cumulonimbus.pressurenetsdk.CbService;

import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
import com.luckycatlabs.sunrisesunset.SunriseSunsetCalculator;
import com.luckycatlabs.sunrisesunset.dto.SunLocation;
import com.mixpanel.android.mpmetrics.MixpanelAPI;

public class CurrentConditionsActivity extends Activity {

	private ImageButton buttonSunny;
	private ImageButton buttonFoggy;
	private ImageButton buttonCloudy;
	private ImageButton buttonPrecipitation;
	private ImageButton buttonThunderstorm;
	private Button buttonSendCondition;
	private Button buttonCancelCondition;
	private ImageButton buttonIsWindy1;
	private ImageButton buttonIsWindy2;
	private ImageButton buttonIsWindy3;
	private ImageButton buttonIsCalm;
	private ImageButton buttonRain;
	private ImageButton buttonSnow;
	private ImageButton buttonHail;
	private ImageButton buttonInfrequentLightning;
	private ImageButton buttonFrequentLightning;
	private ImageButton buttonHeavyLightning;
	private ImageButton buttonLowPrecip;
	private ImageButton buttonModeratePrecip;
	private ImageButton buttonHeavyPrecip;
	private ImageButton buttonPartlyCloudy;
	private ImageButton buttonMostlyCloudy;
	private ImageButton buttonVeryCloudy;
	private ImageButton buttonLightFog;
	private ImageButton buttonModerateFog;
	private ImageButton buttonHeavyFog;
	private ImageButton buttonTwitter;

	private ImageButton buttonExtreme;
	private ImageButton buttonFlooding;
	private ImageButton buttonFire;
	private ImageButton buttonTornado;
	private ImageButton buttonTropicalStorm;
	private ImageButton buttonDuststorm;

	private TextView textGeneralDescription;
	private TextView textWindyDescription;
	private TextView textPrecipitationDescription;
	private TextView textPrecipitationAmountDescription;
	private TextView textLightningDescription;
	private TextView textCloudyDescription;
	private TextView textFoggyDescription;
	private TextView textExtremeDescription;

	private ImageView imageHrGeneral;
	private ImageView imageHrPrecipitation;
	private ImageView imageHrFoggy;
	private ImageView imageHrCloudy;
	private ImageView imageHrPrecipitationAmount;
	private ImageView imageHrLightning;
	private ImageView imageHrWindy;

	private HorizontalScrollView scrollGeneral;
	private ScrollView scrollWind;
	private ScrollView scrollPrecipitation;
	private ScrollView scrollPrecipitationAmount;
	private ScrollView scrollLightning;
	private ScrollView scrollClouds;
	private ScrollView scrollFoggy;
	private LinearLayout layoutExtreme;

	private ImageView hrExtreme;

	// private CheckBox addPhoto;

	private Location bestLocation;
	private double mLatitude = 0.0;
	private double mLongitude = 0.0;
	private CbCurrentCondition condition;

	private String serverURL = CbConfiguration.SERVER_URL_PRESSURENET;

	public final String PREFS_NAME = "ca.cumulonimbus.barometernetwork_preferences";

	public String mAppDir = "";

	boolean mBound;
	Messenger mService = null;

	private long lastConditionsSubmit = 0;

	private boolean sending = false;

	static final int REQUEST_IMAGE_CAPTURE = 1;

	private boolean shareToTwitter = false;

	private boolean precipStateSelected = false;
	private boolean extremeStateSelected = false;
	private boolean lightningStateSelected = false;
	
	MixpanelAPI mixpanel;

	private boolean sharingEnabled() {
		SharedPreferences sharedPreferences = PreferenceManager
				.getDefaultSharedPreferences(getApplicationContext());
		return sharedPreferences.getBoolean("enable_social", true);
	}

	private boolean socialAssumed() {
		SharedPreferences sharedPreferences = PreferenceManager
				.getDefaultSharedPreferences(getApplicationContext());
		return sharedPreferences.getBoolean("assume_social", false);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {

	}

	@Override
	protected void onStart() {
		// Get tracker.
		Tracker t = ((PressureNetApplication) getApplication())
				.getTracker(TrackerName.APP_TRACKER);
		// Set screen name.
		t.setScreenName("Current Conditions");

		// Send a screen view.
		t.send(new HitBuilders.ScreenViewBuilder().build());
		super.onStart();
	}

	@Override
	protected void onStop() {
		mixpanel.flush();
		super.onStop();
	}

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		log("currentconditions onconfig changed");
		super.onConfigurationChanged(newConfig);
	}

	public void unBindCbService() {
		if (mBound) {
			unbindService(mConnection);
			mBound = false;
		}
	}

	public void bindCbService() {
		bindService(new Intent(getApplicationContext(), CbService.class),
				mConnection, Context.BIND_AUTO_CREATE);
	}

	private ServiceConnection mConnection = new ServiceConnection() {
		public void onServiceConnected(ComponentName className, IBinder service) {
			mService = new Messenger(service);
			mBound = true;
			Message msg = Message.obtain(null, CbService.MSG_OKAY);
		}

		public void onServiceDisconnected(ComponentName className) {
			mBound = false;
		}
	};

	// Get the phone ID and hash it
	public String getID() {
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");

			String actual_id = Secure.getString(getApplicationContext()
					.getContentResolver(), Secure.ANDROID_ID);
			byte[] bytes = actual_id.getBytes();
			byte[] digest = md.digest(bytes);
			StringBuffer hexString = new StringBuffer();
			for (int i = 0; i < digest.length; i++) {
				hexString.append(Integer.toHexString(0xFF & digest[i]));
			}
			return hexString.toString();
		} catch (Exception e) {
			return "--";
		}
	}

	// Preparation for sending a condition through the network.
	// Take the object and NVP it.
	public List<NameValuePair> currentConditionToNVP(CbCurrentCondition cc) {
		List<NameValuePair> nvp = new ArrayList<NameValuePair>();
		nvp.add(new BasicNameValuePair("latitude", cc.getLocation()
				.getLatitude() + ""));
		nvp.add(new BasicNameValuePair("longitude", cc.getLocation()
				.getLongitude() + ""));
		nvp.add(new BasicNameValuePair("general_condition", cc
				.getGeneral_condition() + ""));
		nvp.add(new BasicNameValuePair("user_id", cc.getUser_id() + ""));
		nvp.add(new BasicNameValuePair("time", cc.getTime() + ""));
		nvp.add(new BasicNameValuePair("tzoffset", cc.getTzoffset() + ""));
		nvp.add(new BasicNameValuePair("windy", cc.getWindy() + ""));
		nvp.add(new BasicNameValuePair("precipitation_type", cc
				.getPrecipitation_type() + ""));
		nvp.add(new BasicNameValuePair("precipitation_amount", cc
				.getPrecipitation_amount() + ""));
		nvp.add(new BasicNameValuePair("thunderstorm_intensity", cc
				.getThunderstorm_intensity() + ""));
		nvp.add(new BasicNameValuePair("cloud_type", cc.getCloud_type() + ""));
		nvp.add(new BasicNameValuePair("foggy", cc.getFog_thickness() + ""));
		return nvp;
	}

	/**
	 * Moon phase info
	 */
	private int getMoonPhaseIndex() {
		MoonPhase mp = new MoonPhase(Calendar.getInstance());
		return mp.getPhaseIndex();
	}

	public void pickAndSetMoonIcon(boolean on) {

		int moonNumber = getMoonPhaseIndex() + 1;

		switch (moonNumber) {
		case 1:
			if (on) {
				buttonSunny.setImageResource(R.drawable.ic_wea_on_moon1);
			} else {
				buttonSunny.setImageResource(R.drawable.ic_wea_moon1);
			}
			break;
		case 2:
			if (on) {
				buttonSunny.setImageResource(R.drawable.ic_wea_on_moon2);
			} else {
				buttonSunny.setImageResource(R.drawable.ic_wea_moon2);
			}
			break;
		case 3:
			if (on) {
				buttonSunny.setImageResource(R.drawable.ic_wea_on_moon3);
			} else {
				buttonSunny.setImageResource(R.drawable.ic_wea_moon3);
			}
			break;
		case 4:
			if (on) {
				buttonSunny.setImageResource(R.drawable.ic_wea_on_moon4);
			} else {
				buttonSunny.setImageResource(R.drawable.ic_wea_moon4);
			}
			break;
		case 5:
			if (on) {
				buttonSunny.setImageResource(R.drawable.ic_wea_on_moon5);
			} else {
				buttonSunny.setImageResource(R.drawable.ic_wea_moon5);
			}
			break;
		case 6:
			if (on) {
				buttonSunny.setImageResource(R.drawable.ic_wea_on_moon6);
			} else {
				buttonSunny.setImageResource(R.drawable.ic_wea_moon6);
			}
			break;
		case 7:
			if (on) {
				buttonSunny.setImageResource(R.drawable.ic_wea_on_moon7);
			} else {
				buttonSunny.setImageResource(R.drawable.ic_wea_moon7);
			}
			break;
		case 8:
			if (on) {
				buttonSunny.setImageResource(R.drawable.ic_wea_on_moon8);
			} else {
				buttonSunny.setImageResource(R.drawable.ic_wea_moon8);
			}
			break;
		default:
			if (on) {
				buttonSunny.setImageResource(R.drawable.ic_wea_on_moon2);
			} else {
				buttonSunny.setImageResource(R.drawable.ic_wea_moon2);
			}
			break;
		}
	}

	/**
	 * Choose icon between sun and moon depending on daytimes and on/off status.
	 */
	public void setCorrectClearIcon(boolean on) {
		if (isDaytime(
				mLatitude,
				mLongitude,
				System.currentTimeMillis(),
				Calendar.getInstance().getTimeZone()
						.getOffset(System.currentTimeMillis()))) {
			// set to Sun icon
			if (on) {
				buttonSunny.setImageResource(R.drawable.ic_wea_on_sun);
			} else {
				buttonSunny.setImageResource(R.drawable.ic_wea_sun);
			}
		} else {
			// set to Moon icon
			pickAndSetMoonIcon(on);
		}

	}

	/**
	 * Change the buttons on the UI. General Conditions.
	 * 
	 * @param condition
	 */
	private void switchActiveGeneral(String condition) {
		// Turn everything off
		setCorrectClearIcon(false);
		buttonFoggy.setImageResource(R.drawable.ic_wea_fog3);
		buttonCloudy.setImageResource(R.drawable.ic_wea_cloud);
		buttonPrecipitation.setImageResource(R.drawable.ic_wea_precip);
		buttonThunderstorm.setImageResource(R.drawable.ic_wea_r_l0);
		buttonExtreme.setImageResource(R.drawable.ic_wea_severe);

		// Turn the new one on
		if (condition.equals(getString(R.string.sunny))) {
			setCorrectClearIcon(true);
			scrollPrecipitation.setVisibility(View.GONE);
			textPrecipitationDescription.setVisibility(View.GONE);
			imageHrPrecipitation.setVisibility(View.GONE);

			scrollPrecipitationAmount.setVisibility(View.GONE);
			textPrecipitationAmountDescription.setVisibility(View.GONE);
			imageHrPrecipitationAmount.setVisibility(View.GONE);
			textCloudyDescription.setVisibility(View.GONE);
			scrollClouds.setVisibility(View.GONE);
			scrollFoggy.setVisibility(View.GONE);
			textFoggyDescription.setVisibility(View.GONE);
			imageHrFoggy.setVisibility(View.GONE);
			imageHrCloudy.setVisibility(View.GONE);


			scrollLightning.setVisibility(View.GONE);
			textLightningDescription.setVisibility(View.GONE);
			imageHrLightning.setVisibility(View.GONE);

			hrExtreme.setVisibility(View.GONE);
			layoutExtreme.setVisibility(View.GONE);
			textExtremeDescription.setVisibility(View.GONE);
			// And enable the submit button
			buttonSendCondition.setEnabled(true);

			this.condition.setGeneral_condition(getString(R.string.sunny));
		} else if (condition.equals(getString(R.string.foggy))) {
			buttonFoggy.setImageResource(R.drawable.ic_wea_on_fog3);
			scrollPrecipitation.setVisibility(View.GONE);
			textPrecipitationDescription.setVisibility(View.GONE);
			imageHrPrecipitation.setVisibility(View.GONE);


			scrollLightning.setVisibility(View.GONE);
			textLightningDescription.setVisibility(View.GONE);
			imageHrLightning.setVisibility(View.GONE);

			scrollPrecipitationAmount.setVisibility(View.GONE);
			textPrecipitationAmountDescription.setVisibility(View.GONE);
			imageHrPrecipitationAmount.setVisibility(View.GONE);
			textCloudyDescription.setVisibility(View.GONE);
			scrollClouds.setVisibility(View.GONE);
			scrollFoggy.setVisibility(View.VISIBLE);
			textFoggyDescription.setVisibility(View.VISIBLE);
			imageHrFoggy.setVisibility(View.VISIBLE);
			imageHrCloudy.setVisibility(View.GONE);

			hrExtreme.setVisibility(View.GONE);
			layoutExtreme.setVisibility(View.GONE);
			textExtremeDescription.setVisibility(View.GONE);
			// And enable the submit button
			buttonSendCondition.setEnabled(true);

			this.condition.setGeneral_condition(getString(R.string.foggy));
			this.condition.setFog_thickness(getString(R.string.light_fog));
		} else if (condition.equals(getString(R.string.cloudy))) {
			buttonCloudy.setImageResource(R.drawable.ic_wea_on_cloud);
			scrollPrecipitation.setVisibility(View.GONE);
			textPrecipitationDescription.setVisibility(View.GONE);
			imageHrPrecipitation.setVisibility(View.GONE);
			imageHrPrecipitationAmount.setVisibility(View.GONE);
			scrollPrecipitationAmount.setVisibility(View.GONE);
			textPrecipitationAmountDescription.setVisibility(View.GONE);
			if (!lightningStateSelected) {
				scrollLightning.setVisibility(View.GONE);
				textLightningDescription.setVisibility(View.GONE);
				imageHrLightning.setVisibility(View.GONE);
			}
			imageHrLightning.setVisibility(View.GONE);
			textCloudyDescription.setVisibility(View.VISIBLE);
			imageHrCloudy.setVisibility(View.VISIBLE);
			scrollClouds.setVisibility(View.VISIBLE);
			scrollFoggy.setVisibility(View.GONE);
			textFoggyDescription.setVisibility(View.GONE);
			imageHrFoggy.setVisibility(View.GONE);

			hrExtreme.setVisibility(View.GONE);
			layoutExtreme.setVisibility(View.GONE);
			textExtremeDescription.setVisibility(View.GONE);

			// And enable the submit button
			buttonSendCondition.setEnabled(true);

			this.condition.setGeneral_condition(getString(R.string.cloudy));
			this.condition.setCloud_type(getString(R.string.mostly_cloudy));
		} else if (condition.equals(getString(R.string.precipitation))) {
			// Visibility of other rows
			scrollPrecipitation.setVisibility(View.VISIBLE);
			textPrecipitationDescription.setVisibility(View.VISIBLE);
			imageHrPrecipitation.setVisibility(View.VISIBLE);
			textCloudyDescription.setVisibility(View.GONE);
			imageHrCloudy.setVisibility(View.GONE);
			scrollClouds.setVisibility(View.GONE);
			buttonPrecipitation.setImageResource(R.drawable.ic_wea_on_precip);
			if (!lightningStateSelected) {
				scrollLightning.setVisibility(View.GONE);
				textLightningDescription.setVisibility(View.GONE);
				imageHrLightning.setVisibility(View.GONE);
			}
			imageHrFoggy.setVisibility(View.GONE);
			// Precipitation initialization
			// buttonRain.setImageResource(R.drawable.ic_on_rain3);
			// textPrecipitationDescription.setText(getString(R.string.rain));
			scrollFoggy.setVisibility(View.GONE);
			textFoggyDescription.setVisibility(View.GONE);

			// And disable the submit button
			if (!precipStateSelected) {
				buttonSendCondition.setEnabled(false);
			}

			// hrExtreme.setVisibility(View.GONE);
			// layoutExtreme.setVisibility(View.GONE);
			// textExtremeDescription.setVisibility(View.GONE);

			this.condition
					.setGeneral_condition(getString(R.string.precipitation));
			this.condition.setPrecipitation_type(getString(R.string.rain));
			this.condition.setPrecipitation_amount(0);
		} else if (condition.equals(getString(R.string.thunderstorm))) {
			scrollLightning.setVisibility(View.VISIBLE);
			textLightningDescription.setVisibility(View.VISIBLE);
			imageHrLightning.setVisibility(View.VISIBLE);
			buttonThunderstorm.setImageResource(R.drawable.ic_wea_on_r_l0);
			textCloudyDescription.setVisibility(View.GONE);
			imageHrCloudy.setVisibility(View.GONE);
			scrollClouds.setVisibility(View.GONE);
			scrollFoggy.setVisibility(View.GONE);
			textFoggyDescription.setVisibility(View.GONE);
			imageHrFoggy.setVisibility(View.GONE);
			layoutExtreme.setVisibility(View.GONE);

			hrExtreme.setVisibility(View.GONE);
			layoutExtreme.setVisibility(View.GONE);
			textExtremeDescription.setVisibility(View.GONE);

			// And enable the submit button
			buttonSendCondition.setEnabled(true);

			this.condition
					.setGeneral_condition(getString(R.string.thunderstorm));
			this.condition
					.setThunderstorm_intensity(getString(R.string.infrequentLightning));
		} else if (condition.equals(getString(R.string.extreme))) {
			if (!lightningStateSelected) {
				scrollLightning.setVisibility(View.GONE);
				textLightningDescription.setVisibility(View.GONE);
				imageHrLightning.setVisibility(View.GONE);
			}
			buttonExtreme.setImageResource(R.drawable.ic_wea_on_severe);
			textCloudyDescription.setVisibility(View.GONE);
			imageHrCloudy.setVisibility(View.GONE);
			scrollClouds.setVisibility(View.GONE);
			scrollFoggy.setVisibility(View.GONE);
			textFoggyDescription.setVisibility(View.GONE);
			imageHrFoggy.setVisibility(View.GONE);

			layoutExtreme.setVisibility(View.VISIBLE);
			textExtremeDescription.setVisibility(View.VISIBLE);
			hrExtreme.setVisibility(View.VISIBLE);

			if (!extremeStateSelected) {
				// And disable the submit button
				buttonSendCondition.setEnabled(false);
			}

			this.condition.setGeneral_condition(getString(R.string.extreme));
		}

		// Whichever one is chosen, show windy
		// scrollWind.setVisibility(View.VISIBLE);
		textWindyDescription.setVisibility(View.VISIBLE);
	}

	/**
	 * Change the buttons on the UI. Foggy
	 * 
	 * @param condition
	 */
	private void switchActiveFoggy(String foggy) {
		// Turn everything off
		buttonLightFog.setImageResource(R.drawable.ic_wea_fog1);
		buttonModerateFog.setImageResource(R.drawable.ic_wea_fog2);
		buttonHeavyFog.setImageResource(R.drawable.ic_wea_fog3);

		// Turn the new one on

		if (foggy.equals(getString(R.string.light_fog))) {
			buttonLightFog.setImageResource(R.drawable.ic_wea_on_fog1);
		} else if (foggy.equals(getString(R.string.moderate_fog))) {
			buttonModerateFog.setImageResource(R.drawable.ic_wea_on_fog2);
		} else if (foggy.equals(getString(R.string.heavy_fog))) {
			buttonHeavyFog.setImageResource(R.drawable.ic_wea_on_fog3);
		}
	}

	/**
	 * Change the buttons on the UI. Extreme
	 * 
	 * @param condition
	 */
	private void switchActiveExtreme(String condition) {
		// Turn everything off
		buttonTornado.setImageResource(R.drawable.ic_wea_tornado);
		buttonTropicalStorm.setImageResource(R.drawable.ic_wea_tropical_storm);
		buttonFire.setImageResource(R.drawable.ic_wea_fire);
		buttonFlooding.setImageResource(R.drawable.ic_wea_flooding);
		buttonDuststorm.setImageResource(R.drawable.ic_wea_dust);

		// And enable the submit button
		buttonSendCondition.setEnabled(true);
		extremeStateSelected = true;

		// Turn the new one on
		if (condition.equals(getString(R.string.flooding))) {
			buttonFlooding.setImageResource(R.drawable.ic_wea_on_flooding);
		} else if (condition.equals(getString(R.string.wildfire))) {
			buttonFire.setImageResource(R.drawable.ic_wea_on_fire);
		} else if (condition.equals(getString(R.string.tornado))) {
			buttonTornado.setImageResource(R.drawable.ic_wea_on_tornado);
		} else if (condition.equals(getString(R.string.duststorm))) {
			buttonDuststorm.setImageResource(R.drawable.ic_wea_on_dust);
		} else if (condition.equals(getString(R.string.tropicalstorm))) {
			buttonTropicalStorm
					.setImageResource(R.drawable.ic_wea_on_tropical_storm);
		}
	}

	/**
	 * Change the buttons on the UI. Windy
	 * 
	 * @param condition
	 */
	private void switchActiveWindy(String condition) {
		// Turn everything off
		buttonIsCalm.setImageResource(R.drawable.ic_wea_wind0);
		buttonIsWindy1.setImageResource(R.drawable.ic_wea_wind1);
		buttonIsWindy2.setImageResource(R.drawable.ic_wea_wind2);
		buttonIsWindy3.setImageResource(R.drawable.ic_wea_wind3);

		// Turn the new one on
		if (condition.equals(getString(R.string.calm))) {
			buttonIsCalm.setImageResource(R.drawable.ic_wea_on_wind0);
		} else if (condition.equals(getString(R.string.windyOne))) {
			buttonIsWindy1.setImageResource(R.drawable.ic_wea_on_wind1);
		} else if (condition.equals(getString(R.string.windyTwo))) {
			buttonIsWindy2.setImageResource(R.drawable.ic_wea_on_wind2);
		} else if (condition.equals(getString(R.string.windyThree))) {
			buttonIsWindy3.setImageResource(R.drawable.ic_wea_on_wind3);
		}
	}

	/**
	 * When the type changes, we show the new type icon for the heaviness of the
	 * precipitation type
	 * 
	 * @param condition
	 */
	private void switchVisiblePrecipitations(String precipCondition) {
		if (precipCondition.equals(getString(R.string.rain))) {
			buttonLowPrecip.setImageResource(R.drawable.ic_wea_on_rain1);
			buttonModeratePrecip.setImageResource(R.drawable.ic_wea_rain2);
			buttonHeavyPrecip.setImageResource(R.drawable.ic_wea_rain3);
		} else if (precipCondition.equals(getString(R.string.snow))) {
			buttonLowPrecip.setImageResource(R.drawable.ic_wea_on_snow1);
			buttonModeratePrecip.setImageResource(R.drawable.ic_wea_snow2);
			buttonHeavyPrecip.setImageResource(R.drawable.ic_wea_snow3);
		} else if (precipCondition.equals(getString(R.string.hail))) {
			buttonLowPrecip.setImageResource(R.drawable.ic_wea_on_hail1);
			buttonModeratePrecip.setImageResource(R.drawable.ic_wea_hail2);
			buttonHeavyPrecip.setImageResource(R.drawable.ic_wea_hail3);
		}

		precipStateSelected = true;

		double value = 0.0;
		String printValue = getString(R.string.minimal) + " "
				+ condition.getPrecipitation_type();
		switchActivePrecipitationAmount("low");
		condition.setPrecipitation_amount(value);
		textPrecipitationAmountDescription.setText(printValue);
	}

	/**
	 * Change the buttons on the UI. Cloudy
	 * 
	 * @param condition
	 */
	private void switchActiveCloudy(String cloudyCondition) {
		// Turn everything off
		buttonPartlyCloudy.setImageResource(R.drawable.ic_wea_cloud1);
		buttonMostlyCloudy.setImageResource(R.drawable.ic_wea_cloud2);
		buttonVeryCloudy.setImageResource(R.drawable.ic_wea_cloud);

		// Turn the new one on
		if (cloudyCondition.equals(getString(R.string.partly_cloudy))) {
			switchVisiblePrecipitations(getString(R.string.partly_cloudy));
			buttonPartlyCloudy.setImageResource(R.drawable.ic_wea_on_cloud1);
		} else if (cloudyCondition.equals(getString(R.string.mostly_cloudy))) {
			switchVisiblePrecipitations(getString(R.string.mostly_cloudy));
			buttonMostlyCloudy.setImageResource(R.drawable.ic_wea_on_cloud2);
		} else if (cloudyCondition.equals(getString(R.string.very_cloudy))) {
			switchVisiblePrecipitations(getString(R.string.very_cloudy));
			buttonVeryCloudy.setImageResource(R.drawable.ic_wea_on_cloud);
		}

	}

	/**
	 * Change the buttons on the UI. Precipitation
	 * 
	 * @param condition
	 */
	private void switchActivePrecipitation(String precipCondition) {
		// Turn everything off
		buttonRain.setImageResource(R.drawable.ic_wea_rain3);
		buttonSnow.setImageResource(R.drawable.ic_wea_snow3);
		buttonHail.setImageResource(R.drawable.ic_wea_hail3);

		// And enable the submit button
		buttonSendCondition.setEnabled(true);

		// Turn the new one on
		if (precipCondition.equals(getString(R.string.rain))) {
			switchVisiblePrecipitations(getString(R.string.rain));
			buttonRain.setImageResource(R.drawable.ic_wea_on_rain3);
		} else if (precipCondition.equals(getString(R.string.snow))) {
			switchVisiblePrecipitations(getString(R.string.snow));
			buttonSnow.setImageResource(R.drawable.ic_wea_on_snow3);
		} else if (precipCondition.equals(getString(R.string.hail))) {
			switchVisiblePrecipitations(getString(R.string.hail));
			buttonHail.setImageResource(R.drawable.ic_wea_on_hail3);
		}

		scrollPrecipitationAmount.setVisibility(View.VISIBLE);
		textPrecipitationAmountDescription.setVisibility(View.VISIBLE);
		imageHrPrecipitationAmount.setVisibility(View.VISIBLE);
	}

	/**
	 * Change the buttons on the UI. Precipitation Amounts
	 * 
	 * @param condition
	 */
	private void switchActivePrecipitationAmount(String amount) {

		// Off and on, all in one go
		try {
			if (condition.getPrecipitation_type().equals(
					getString(R.string.rain))) {
				if (amount.equals("low")) {
					buttonLowPrecip
							.setImageResource(R.drawable.ic_wea_on_rain1);
					buttonModeratePrecip
							.setImageResource(R.drawable.ic_wea_rain2);
					buttonHeavyPrecip.setImageResource(R.drawable.ic_wea_rain3);
				} else if (amount.equals("moderate")) {
					buttonLowPrecip.setImageResource(R.drawable.ic_wea_rain1);
					buttonModeratePrecip
							.setImageResource(R.drawable.ic_wea_on_rain2);
					buttonHeavyPrecip.setImageResource(R.drawable.ic_wea_rain3);
				} else if (amount.equals("heavy")) {
					buttonLowPrecip.setImageResource(R.drawable.ic_wea_rain1);
					buttonModeratePrecip
							.setImageResource(R.drawable.ic_wea_rain2);
					buttonHeavyPrecip
							.setImageResource(R.drawable.ic_wea_on_rain3);
				}
			} else if (condition.getPrecipitation_type().equals(
					getString(R.string.snow))) {
				if (amount.equals("low")) {
					buttonLowPrecip
							.setImageResource(R.drawable.ic_wea_on_snow1);
					buttonModeratePrecip
							.setImageResource(R.drawable.ic_wea_snow2);
					buttonHeavyPrecip.setImageResource(R.drawable.ic_wea_snow3);
				} else if (amount.equals("moderate")) {
					buttonLowPrecip.setImageResource(R.drawable.ic_wea_snow1);
					buttonModeratePrecip
							.setImageResource(R.drawable.ic_wea_on_snow2);
					buttonHeavyPrecip.setImageResource(R.drawable.ic_wea_snow3);
				} else if (amount.equals("heavy")) {
					buttonLowPrecip.setImageResource(R.drawable.ic_wea_snow1);
					buttonModeratePrecip
							.setImageResource(R.drawable.ic_wea_snow2);
					buttonHeavyPrecip
							.setImageResource(R.drawable.ic_wea_on_snow3);
				}
			} else if (condition.getPrecipitation_type().equals(
					getString(R.string.hail))) {
				if (amount.equals("low")) {
					buttonLowPrecip
							.setImageResource(R.drawable.ic_wea_on_hail1);
					buttonModeratePrecip
							.setImageResource(R.drawable.ic_wea_hail2);
					buttonHeavyPrecip.setImageResource(R.drawable.ic_wea_hail3);
				} else if (amount.equals("moderate")) {
					buttonLowPrecip.setImageResource(R.drawable.ic_wea_hail1);
					buttonModeratePrecip
							.setImageResource(R.drawable.ic_wea_on_hail2);
					buttonHeavyPrecip.setImageResource(R.drawable.ic_wea_hail3);
				} else if (amount.equals("heavy")) {
					buttonLowPrecip.setImageResource(R.drawable.ic_wea_hail1);
					buttonModeratePrecip
							.setImageResource(R.drawable.ic_wea_hail2);
					buttonHeavyPrecip
							.setImageResource(R.drawable.ic_wea_on_hail3);
				}
			}
		} catch (NullPointerException npe) {
			// must have a precipitation type set.
		}
	}

	private void switchActiveLightning(String value) {
		// Turn everything off
		buttonInfrequentLightning
				.setImageResource(R.drawable.ic_wea_lightning1);
		buttonFrequentLightning.setImageResource(R.drawable.ic_wea_lightning2);
		buttonHeavyLightning.setImageResource(R.drawable.ic_wea_lightning3);

		lightningStateSelected = true;

		// Turn the new one on
		if (value.equals(getString(R.string.infrequentLightning))) {
			buttonInfrequentLightning
					.setImageResource(R.drawable.ic_wea_on_lightning1);
		} else if (value.equals(getString(R.string.frequentLightning))) {
			buttonFrequentLightning
					.setImageResource(R.drawable.ic_wea_on_lightning2);
		} else if (value.equals(getString(R.string.heavyLightning))) {
			;
			buttonHeavyLightning
					.setImageResource(R.drawable.ic_wea_on_lightning3);
		}
	}

	private void sendCondition() {
		if (mBound) {
			log("sending current condition");
			Message msg = Message.obtain(null,
					CbService.MSG_SEND_CURRENT_CONDITION, condition);
			try {
				mService.send(msg);
			} catch (RemoteException e) {
				// e.printStackTrace();
			}
		} else {
			log("error: not bound");
		}
	}

	private void saveCondition() {
		if (mBound) {
			log("saving current condition");
			Message msg = Message.obtain(null,
					CbService.MSG_ADD_CURRENT_CONDITION, condition);
			try {
				mService.send(msg);
			} catch (RemoteException e) {
				// e.printStackTrace();
			}
		} else {
			log("error: not bound");
		}
	}

	
	
	@Override
	public void onBackPressed() {
		super.onBackPressed();
		//overridePendingTransition(0, R.anim.close_current_conditions);
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.current_conditions);
		log("currentconditions oncreate");

		setAppBestLocation();

		bindCbService();
		try {
			String ns = Context.NOTIFICATION_SERVICE;
			NotificationManager nMgr = (NotificationManager) getSystemService(ns);
			nMgr.cancel(NotificationSender.CONDITION_NOTIFICATION_ID);
		} catch (Exception e) {

		}

		mixpanel = MixpanelAPI.getInstance(getApplicationContext(), PressureNETConfiguration.MIXPANEL_TOKEN);
		
		condition = new CbCurrentCondition();

		buttonSunny = (ImageButton) findViewById(R.id.buttonSunny);
		buttonFoggy = (ImageButton) findViewById(R.id.buttonFoggy);
		buttonCloudy = (ImageButton) findViewById(R.id.buttonCloudy);
		buttonPrecipitation = (ImageButton) findViewById(R.id.buttonPrecipitation);
		buttonThunderstorm = (ImageButton) findViewById(R.id.buttonThunderstorm);
		buttonSendCondition = (Button) findViewById(R.id.buttonSendCondition);
		buttonCancelCondition = (Button) findViewById(R.id.buttonCancelCondition);
		buttonIsWindy1 = (ImageButton) findViewById(R.id.buttonIsWindy1);
		buttonIsWindy2 = (ImageButton) findViewById(R.id.buttonIsWindy2);
		buttonIsWindy3 = (ImageButton) findViewById(R.id.buttonIsWindy3);
		buttonIsCalm = (ImageButton) findViewById(R.id.buttonIsCalm);
		buttonRain = (ImageButton) findViewById(R.id.buttonRain);
		buttonSnow = (ImageButton) findViewById(R.id.buttonSnow);
		buttonHail = (ImageButton) findViewById(R.id.buttonHail);
		buttonInfrequentLightning = (ImageButton) findViewById(R.id.buttonInfrequentLightning);
		buttonFrequentLightning = (ImageButton) findViewById(R.id.buttonFrequentLightning);
		buttonHeavyLightning = (ImageButton) findViewById(R.id.buttonHeavyLightning);
		buttonLowPrecip = (ImageButton) findViewById(R.id.buttonLowPrecip);
		buttonModeratePrecip = (ImageButton) findViewById(R.id.buttonModeratePrecip);
		buttonHeavyPrecip = (ImageButton) findViewById(R.id.buttonHeavyPrecip);
		buttonPartlyCloudy = (ImageButton) findViewById(R.id.buttonCloudy1);
		buttonMostlyCloudy = (ImageButton) findViewById(R.id.buttonCloudy2);
		buttonVeryCloudy = (ImageButton) findViewById(R.id.buttonCloudy3);
		buttonLightFog = (ImageButton) findViewById(R.id.buttonFoggy1);
		buttonModerateFog = (ImageButton) findViewById(R.id.buttonFoggy2);
		buttonHeavyFog = (ImageButton) findViewById(R.id.buttonFoggy3);
		buttonTwitter = (ImageButton) findViewById(R.id.buttonTwitter);

		buttonExtreme = (ImageButton) findViewById(R.id.buttonExtreme);
		buttonTornado = (ImageButton) findViewById(R.id.buttonTornado);
		buttonTropicalStorm = (ImageButton) findViewById(R.id.buttonTropicalStorm);
		buttonFire = (ImageButton) findViewById(R.id.buttonWildfire);
		buttonFlooding = (ImageButton) findViewById(R.id.buttonFlooding);
		buttonDuststorm = (ImageButton) findViewById(R.id.buttonDuststorm);

		layoutExtreme = (LinearLayout) findViewById(R.id.layoutExtreme);

		imageHrGeneral = (ImageView) findViewById(R.id.hrGeneral);
		imageHrPrecipitation = (ImageView) findViewById(R.id.hrPrecipitation);
		imageHrFoggy = (ImageView) findViewById(R.id.hrFoggy);
		imageHrCloudy = (ImageView) findViewById(R.id.hrCloudy);
		imageHrPrecipitationAmount = (ImageView) findViewById(R.id.hrPreciptitationAmount);
		imageHrLightning = (ImageView) findViewById(R.id.hrLightning);
		imageHrWindy = (ImageView) findViewById(R.id.hrWindy);

		textGeneralDescription = (TextView) findViewById(R.id.generalDescription);
		textWindyDescription = (TextView) findViewById(R.id.windyDescription);
		textLightningDescription = (TextView) findViewById(R.id.lightningDescription);
		textPrecipitationDescription = (TextView) findViewById(R.id.precipitationDescription);
		textPrecipitationAmountDescription = (TextView) findViewById(R.id.precipitationAmountDescription);
		textCloudyDescription = (TextView) findViewById(R.id.cloudyDescription);
		textFoggyDescription = (TextView) findViewById(R.id.foggyDescription);
		textExtremeDescription = (TextView) findViewById(R.id.extremeDescription);

		scrollGeneral = (HorizontalScrollView) findViewById(R.id.scrollGeneralCondition);
		// scrollWind = (ScrollView) findViewById(R.id.scrollWindy);
		scrollPrecipitation = (ScrollView) findViewById(R.id.scrollPrecip);
		scrollPrecipitationAmount = (ScrollView) findViewById(R.id.scrollPrecipAmount);
		scrollLightning = (ScrollView) findViewById(R.id.scrollLightning);
		scrollClouds = (ScrollView) findViewById(R.id.scrollClouds);
		scrollFoggy = (ScrollView) findViewById(R.id.scrollFog);

		hrExtreme = (ImageView) findViewById(R.id.hrExtreme);

		// addPhoto = (CheckBox) findViewById(R.id.checkAddPhoto);

		buttonDuststorm.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.duststorm);
				switchActiveExtreme(value);
				condition.setUser_comment(value);
				textExtremeDescription.setText(value);
			}
		});

		buttonFlooding.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.flooding);
				switchActiveExtreme(value);
				condition.setUser_comment(value);
				textExtremeDescription.setText(value);
			}
		});

		buttonFire.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.wildfire);
				switchActiveExtreme(value);
				condition.setUser_comment(value);
				textExtremeDescription.setText(value);
			}
		});

		buttonTropicalStorm.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.tropicalstorm);
				switchActiveExtreme(value);
				condition.setUser_comment(value);
				textExtremeDescription.setText(value);
			}
		});

		buttonTornado.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.tornado);
				switchActiveExtreme(value);
				condition.setUser_comment(value);
				textExtremeDescription.setText(value);
			}
		});

		buttonSendCondition.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				sending = true;
				saveCondition();
				sendCondition();

				updateWidget();

				// save the time
				lastConditionsSubmit = System.currentTimeMillis();

				SharedPreferences sharedPreferences = PreferenceManager
						.getDefaultSharedPreferences(getApplicationContext());

				SharedPreferences.Editor editor = sharedPreferences.edit();
				editor.putLong("lastConditionsSubmit", lastConditionsSubmit);
				editor.commit();

				PnDb pn = new PnDb(getApplicationContext());
				pn.open();
				pn.addDelivery(condition.getGeneral_condition(), condition
						.getLocation().getLatitude(), condition.getLocation()
						.getLongitude(), condition.getTime());
				pn.close();

				// Get tracker.
				Tracker t = ((PressureNetApplication) getApplication()).getTracker(
				    TrackerName.APP_TRACKER);
				// Build and send an Event.
				t.send(new HitBuilders.EventBuilder()
				    .setCategory(BarometerNetworkActivity.GA_CATEGORY_MAIN_APP)
				    .setAction("conditions_send_button")
				    .setLabel(condition.getGeneral_condition())
				    .build());

				JSONObject props = new JSONObject();
				try {
					props.put("Condition Type", condition.getGeneral_condition());
					mixpanel.track("Sent Condition", props);
				} catch (JSONException e) {
					log("setupmixpanel json exception " + e.getMessage());
					e.printStackTrace();
				}
				
				
				// take photo?
				/*
				 * if(addPhoto.isChecked()) { dispatchTakePictureIntent(); }
				 */

				// send to twitter?
				if (shareToTwitter) {
					sendTwitterIntent();

				} else {
					log("current conditions not sharing to twitter");
				}

				Intent intent = getIntent();
				if(intent.hasExtra("backToApp")) {
					if(intent.getBooleanExtra("backToApp", false) == true) {
						Intent i = new Intent(getApplicationContext(), BarometerNetworkActivity.class);
						startActivity(i);
					}
				}

				finish();

			}
		});

		buttonCancelCondition.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				sending = false;
				condition.setGeneral_condition("");
				updateWidget();

				// Get tracker.
				Tracker t = ((PressureNetApplication) getApplication()).getTracker(
				    TrackerName.APP_TRACKER);
				// Build and send an Event.
				t.send(new HitBuilders.EventBuilder()
				    .setCategory(BarometerNetworkActivity.GA_CATEGORY_MAIN_APP)
				    .setAction("conditions_cancel_button")
				    .setLabel("Cancel")
				    .build());
				mixpanel.track("Cancel Condition", null);
				finish();
				//overridePendingTransition(0, R.anim.close_current_conditions);
			}
		});

		/*
		 * General Conditions
		 */

		buttonSunny.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String value = getString(R.string.sunny);
				switchActiveGeneral(value);
				condition.setGeneral_condition(value);
				textGeneralDescription.setText(value);
			}
		});

		buttonFoggy.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String value = getString(R.string.foggy);
				switchActiveGeneral(value);
				condition.setGeneral_condition(value);
				textGeneralDescription.setText(value);
			}
		});

		buttonCloudy.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String value = getString(R.string.cloudy);
				switchActiveGeneral(value);
				condition.setGeneral_condition(value);
				textGeneralDescription.setText(value);
			}
		});

		buttonPrecipitation.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String value = getString(R.string.precipitation);
				switchActiveGeneral(value);
				condition.setGeneral_condition(value);
				textGeneralDescription.setText(value);
			}
		});

		buttonThunderstorm.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				String value = getString(R.string.thunderstorm);
				switchActiveGeneral(value);
				condition.setGeneral_condition(value);
				textGeneralDescription.setText(value);
			}
		});

		buttonExtreme.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.extreme);
				switchActiveGeneral(value);
				condition.setGeneral_condition(value);
				textGeneralDescription.setText(value);
			}
		});

		/*
		 * Windy conditions
		 */

		buttonIsWindy1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.windyOne);
				switchActiveWindy(value);
				condition.setWindy(1 + "");
				textWindyDescription.setText(value);
			}
		});

		buttonIsWindy2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.windyTwo);
				switchActiveWindy(value);
				condition.setWindy(2 + "");
				textWindyDescription.setText(value);
			}
		});

		buttonIsWindy3.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.windyThree);
				switchActiveWindy(value);
				condition.setWindy(3 + "");
				textWindyDescription.setText(value);
			}
		});

		buttonIsCalm.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.calm);
				switchActiveWindy(value);
				condition.setWindy(0 + "");
				textWindyDescription.setText(value);
			}
		});

		/*
		 * Precipitation Conditions
		 */

		buttonRain.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.rain);

				condition.setPrecipitation_type(value);
				textPrecipitationDescription.setText(value);
				switchActivePrecipitation(value);
			}
		});

		buttonSnow.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.snow);

				condition.setPrecipitation_type(value);
				textPrecipitationDescription.setText(value);
				switchActivePrecipitation(value);
			}
		});

		buttonHail.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.hail);

				condition.setPrecipitation_type(value);
				textPrecipitationDescription.setText(value);
				switchActivePrecipitation(value);
			}
		});

		/*
		 * Cloudy Conditions
		 */

		buttonPartlyCloudy.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.partly_cloudy);

				condition.setCloud_type(value);
				textCloudyDescription.setText(value);
				switchActiveCloudy(value);
			}
		});

		buttonMostlyCloudy.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.mostly_cloudy);

				condition.setCloud_type(value);
				textCloudyDescription.setText(value);
				switchActiveCloudy(value);
			}
		});

		buttonVeryCloudy.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.very_cloudy);

				condition.setCloud_type(value);
				textCloudyDescription.setText(value);
				switchActiveCloudy(value);
			}
		});

		/*
		 * Foggy Conditions
		 */

		buttonLightFog.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.light_fog);

				condition.setFog_thickness(value);
				textFoggyDescription.setText(value);
				switchActiveFoggy(value);
			}
		});

		buttonModerateFog.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.moderate_fog);

				condition.setFog_thickness(value);
				textFoggyDescription.setText(value);
				switchActiveFoggy(value);
			}
		});

		buttonHeavyFog.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.heavy_fog);

				condition.setCloud_type(value);
				textFoggyDescription.setText(value);
				switchActiveFoggy(value);
			}
		});

		/*
		 * Precipitation amount
		 */

		buttonLowPrecip.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				double value = 0.0;
				String printValue = getString(R.string.minimal)  + " "
						+ condition.getPrecipitation_type();
				condition.setPrecipitation_amount(value);
				switchActivePrecipitationAmount("low");
				textPrecipitationAmountDescription.setText(printValue);

			}
		});

		buttonModeratePrecip.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				double value = 1.0;
				String printValue = getString(R.string.moderate)  + " "
						+ condition.getPrecipitation_type();
				switchActivePrecipitationAmount("moderate");
				condition.setPrecipitation_amount(value);
				textPrecipitationAmountDescription.setText(printValue);

			}
		});

		buttonHeavyPrecip.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				double value = 2.0;
				String printValue = getString(R.string.heavy)  + " "
						+ condition.getPrecipitation_type();
				condition.setPrecipitation_amount(value);
				switchActivePrecipitationAmount("heavy");
				textPrecipitationAmountDescription.setText(printValue);
			}
		});

		/*
		 * Lightning
		 */

		buttonInfrequentLightning.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.infrequentLightning);
				switchActiveLightning(value);
				condition.setThunderstorm_intensity(value);
				textLightningDescription.setText(value);
			}
		});

		buttonFrequentLightning.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.frequentLightning);
				switchActiveLightning(value);
				condition.setThunderstorm_intensity(value);
				textLightningDescription.setText(value);
			}
		});

		buttonHeavyLightning.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String value = getString(R.string.heavyLightning);
				switchActiveLightning(value);
				condition.setThunderstorm_intensity(value);
				textLightningDescription.setText(value);
			}
		});

		buttonTwitter.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				shareToTwitter = !shareToTwitter;
				if (shareToTwitter) {
					turnSocialOn();
				} else {
					turnSocialOff();
				}

			}
		});

		// Start adding the data for our current condition
		Intent intent = getIntent();

		try {
			// mAppDir = bundle.getString("appdir");
			mLatitude = intent.getDoubleExtra("latitude", 0.0);
			mLongitude = intent.getDoubleExtra("longitude", -1.0);
			if(mLatitude == 0.0) {
				setAppBestLocation();
			}

			Location location = new Location("network");
			location.setLatitude(mLatitude);
			location.setLongitude(mLongitude);
			condition.setLocation(location);
			condition.setUser_id(getID());
			condition.setTime(Calendar.getInstance().getTimeInMillis());
			condition.setTzoffset(Calendar.getInstance().getTimeZone()
					.getOffset((long) condition.getTime()));

			if (mLatitude == 0.0) {
				Toast.makeText(getApplicationContext(),
						getString(R.string.noLocationAvailable),
						Toast.LENGTH_LONG).show();
				finish();

			}

			// cancel any notifications?
			if (intent.hasExtra("cancelNotification")) {
				if (intent.getBooleanExtra("cancelNotification", false)) {
					cancelNotification(BarometerNetworkActivity.NOTIFICATION_ID);
					cancelNotification(NotificationSender.ALERT_NOTIFICATION_ID);
				}
			}
		} catch (Exception e) {
			log("conditions missing data, cannot submit");
		}

		// Check sunrise and sunset times to choose Sun vs. Moon
		if (isDaytime(
				mLatitude,
				mLongitude,
				System.currentTimeMillis(),
				Calendar.getInstance().getTimeZone()
						.getOffset(System.currentTimeMillis()))) {
			// set to Sun icon
			buttonSunny.setImageResource(R.drawable.ic_wea_sun);
		} else {
			// set to Moon icon
			pickAndSetMoonIcon(false);
		}

		if (getIntent().hasExtra("initial")) {
			String state = getIntent().getStringExtra("initial");
			if (state.equals("clear")) {
				buttonSunny.performClick();
			} else if (state.equals("fog")) {
				buttonFoggy.performClick();
			} else if (state.equals("cloud")) {
				buttonCloudy.performClick();
			} else if (state.equals("precip")) {
				buttonPrecipitation.performClick();
			} else if (state.equals("thunderstorm")) {
				buttonThunderstorm.performClick();
			} else if (state.equals("severe")) {
				buttonExtreme.performClick();
			}
			updateWidget();
			if (getIntent().hasExtra("from_widget")) {
				boolean fromWidget = getIntent().getBooleanExtra("from_widget",
						false);
				if (fromWidget) {

					// Get tracker.
					Tracker t = ((PressureNetApplication) getApplication()).getTracker(
					    TrackerName.APP_TRACKER);
					// Build and send an Event.
					t.send(new HitBuilders.EventBuilder()
					    .setCategory(BarometerNetworkActivity.GA_CATEGORY_MAIN_APP)
					    .setAction(BarometerNetworkActivity.GA_ACTION_BUTTON)
					    .setLabel("conditions_widget_opened_conditions_activity")
					    .build());
				}
			}
		}

		// Show or hide social icons
		if (sharingEnabled()) {
			showSocialIcons();
		} else {
			hideSocialIcons();
		}

		// Set the initial state: Sunny, no wind
		// Or guess from pressure data
		// condition.setGeneral_condition(getString(R.string.sunny));
		// buttonSunny.setImageResource(R.drawable.ic_on_sun);
		// textGeneralDescription.setText(getString(R.string.sunny));

		// buttonIsCalm.setImageResource(R.drawable.ic_on_wind0);
		// textWindyDescription.setText(getString(R.string.calm));
		// condition.setWindy(0 + "");
	}

	private Location setAppBestLocation() {
		log("app setting best location");
		LocationManager lm = (LocationManager) getApplicationContext()
				.getSystemService(Context.LOCATION_SERVICE);

		Location networkLocation = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
		Location gpsLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

		if(networkLocation != null) {
			bestLocation = networkLocation;
			log("best location is network since its available");
		} else {
			if (gpsLocation != null) {
				bestLocation = gpsLocation;
				log("best location is gps since its available and network is not");
			} else {

				// we have no location at all
				//Toast.makeText(getApplicationContext(), "Location services unavailable", Toast.LENGTH_SHORT).show();
				//log("best location will be set to null since neither gps nor network is available");
				//bestLocation = null;
			}
		}

		return bestLocation;

	}

	private void sendTwitterIntent() {
		log("current conditions sharing to twitter");

		String twitterCondition = "";
		String tweet = "";
		if (condition.getGeneral_condition().equals(
				getString(R.string.precipitation))) {
			if (condition.getPrecipitation_type().equals(
					getString(R.string.rain))) {
				twitterCondition = "raining";
			} else if (condition.getPrecipitation_type().equals(
					getString(R.string.snow))) {
				twitterCondition = "snowing";
			} else if (condition.getPrecipitation_type().equals(
					getString(R.string.hail))) {
				twitterCondition = "hailing";
			}
		} else if (condition.getGeneral_condition().equals(
				getString(R.string.cloudy))) {
			twitterCondition = "cloudy";
		} else if (condition.getGeneral_condition().equals(
				getString(R.string.foggy))) {
			twitterCondition = "foggy";
		} else if (condition.getGeneral_condition().equals(
				getString(R.string.thunderstorm))) {
			twitterCondition = "thunderstorming";
		} else if (condition.getGeneral_condition().equals(
				getString(R.string.sunny))) {
			twitterCondition = "clear";
		} else {
			twitterCondition = condition.getGeneral_condition();
		}

		if (condition.getGeneral_condition()
				.equals(getString(R.string.extreme))) {
			tweet = "#" + condition.getUser_comment() + " "
					+ getString(R.string.currentConditionsTweet);
		} else {
			tweet = "It's #" + twitterCondition + " "
					+ getString(R.string.currentConditionsTweet);
		}

		String tweetUrl = String
				.format("https://twitter.com/intent/tweet?text=%s&url=%s",
						URLEncoder.encode(tweet),
						URLEncoder
								.encode("http://bit.ly/1IvRM8w"));
		Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(tweetUrl));

		// Narrow down to official Twitter app, if available:
		List<ResolveInfo> matches = getPackageManager().queryIntentActivities(
				intent, 0);
		for (ResolveInfo info : matches) {
			if (info.activityInfo.packageName.toLowerCase().startsWith(
					"com.twitter")) {
				intent.setPackage(info.activityInfo.packageName);
			}
		}

		startActivity(intent);
	}

	private void showSocialIcons() {
		buttonTwitter.setVisibility(View.VISIBLE);

		if (socialAssumed()) {
			turnSocialOn();
		} else {
			turnSocialOff();
		}
	}

	private void hideSocialIcons() {
		buttonTwitter.setVisibility(View.GONE);
	}

	private void turnSocialOn() {
		shareToTwitter = true;
		buttonTwitter.setImageResource(R.drawable.ic_wea_on_twitter);
	}

	private void turnSocialOff() {
		shareToTwitter = false;
		buttonTwitter.setImageResource(R.drawable.ic_wea_twitter);
	}

	@Override
	protected void onDestroy() {
		unBindCbService();
		super.onDestroy();
	}

	private void cancelNotification(int notifyId) {
		String ns = Context.NOTIFICATION_SERVICE;
		NotificationManager nMgr = (NotificationManager) getSystemService(ns);
		nMgr.cancel(notifyId);
	}

	public static boolean isDaytime(double latitude, double longitude,
			long time, long timeZoneOffset) {
		SunLocation sunLocation = new SunLocation(latitude, longitude);
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(time);
		long tzHoursOffset = timeZoneOffset / (1000 * 60 * 60);
		String gmtString = "GMT";
		if (tzHoursOffset > 0) {
			gmtString += "+" + tzHoursOffset;
		} else if (tzHoursOffset < 0) {
			gmtString += tzHoursOffset;
		}
		SunriseSunsetCalculator sunCalculator = new SunriseSunsetCalculator(
				sunLocation, gmtString);
		calendar.setTimeZone(TimeZone.getTimeZone(gmtString));
		Calendar officialSunrise = sunCalculator
				.getOfficialSunriseCalendarForDate(calendar);
		Calendar officialSunset = sunCalculator
				.getOfficialSunsetCalendarForDate(calendar);

		// Make a reasonable guess about sunset/sunrise in case
		// the actual data isn't available for some reason
		int sunriseHour = 7;
		int sunsetHour = 20;
		try {
			sunriseHour = officialSunrise.get(Calendar.HOUR_OF_DAY);
			sunsetHour = officialSunset.get(Calendar.HOUR_OF_DAY);
		} catch (NullPointerException npe) {
			// TODO: investigate how this could be null
		}
		int nowHour = calendar.get(Calendar.HOUR_OF_DAY);

		return (nowHour >= sunriseHour) && (nowHour <= sunsetHour);
	}

	private void updateWidget() {
		Intent intent = new Intent(getApplicationContext(),
				ConditionsWidgetProvider.class);
		intent.setAction(ConditionsWidgetProvider.ACTION_UPDATEUI); // "android.appwidget.action.APPWIDGET_UPDATE"
		intent.putExtra("general_condition", condition.getGeneral_condition());
		int ids[] = AppWidgetManager.getInstance(getApplication())
				.getAppWidgetIds(
						new ComponentName(getApplication(),
								ConditionsWidgetProvider.class));
		intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
		sendBroadcast(intent);
	}

	/**
	 * Log data to SD card for debug purposes. To enable logging, ensure the
	 * Manifest allows writing to SD card.
	 * 
	 * @param text
	 */
	public void logToFile(String text) {
		try {
			OutputStream output = new FileOutputStream(mAppDir + "/log.txt",
					true);
			String logString = (new Date()).toString() + ": " + text + "\n";
			output.write(logString.getBytes());
			output.close();
		} catch (FileNotFoundException e) {

		} catch (IOException ioe) {

		}
	}

	public void log(String text) {
		if (PressureNETConfiguration.DEBUG_MODE) {
			// logToFile(text);
			System.out.println(text);
		}
	}

	@Override
	protected void onPause() {
		if (!sending) {
			// condition.setGeneral_condition("");
		}
		updateWidget();
		unBindCbService();
		super.onPause();
	}
}