blob: 8cd1106b94d5b4318ac11c509597df3a486df1bb [file] [log] [blame]
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" backgroundColor="0x000000"
width="100%" height="100%" frameRate="60" applicationComplete="appCompleteHandler(event)" viewSourceURL="srcview/index.html">
<fx:Script>
<![CDATA[
import com.devgirl.runtracker.events.RunListResultEvent;
import com.devgirl.runtracker.service.DBService;
import com.devgirl.runtracker.vo.RunVO;
import mx.charts.HitData;
import mx.charts.chartClasses.IAxis;
import mx.charts.chartClasses.Series;
import mx.controls.Alert;
import mx.events.CalendarLayoutChangeEvent;
import mx.events.DataGridEvent;
import mx.events.FlexEvent;
import mx.events.IndexChangedEvent;
private var dbService:DBService;
private var userPace:String;
private function btnCalc_clickHandler():void
{
if (numMiles.text == null || (hrsVal.value==0 && minsVal.value==0 && secsVal.value==0))
{
Alert.show("Please enter both miles and time for pace calculation.","Required Values Error");
return;
}
var totalSeconds:Number = ((hrsVal.value*3600)+(minsVal.value*60)+secsVal.value)/parseFloat(numMiles.text);
userPace = this.convertTime(totalSeconds);
lblPace.text = userPace + " mins/mile";
grpPace.visible=true;
}
private function convertTime(timeInSecs:int):String
{
var hours:int = timeInSecs / 3600;
var mins:int  = timeInSecs / 60 - (hours * 60);
var secs:int  = timeInSecs - (hours * 3600) - (mins * 60);
trace(hours + ":" + mins + ":" + secs);
var d:Date = new Date(null,null,null,hours,mins,secs,null);
timeFormatter.format(d);
return timeFormatter.format(d);
}
private function appCompleteHandler(event:FlexEvent):void
{
dbService = new DBService();
dbService.addEventListener(RunListResultEvent.RUN_LIST_EVENT,handleRunList);
}
private function handleRunList(event:RunListResultEvent):void
{
runsAC = event.runEntries;
}
private function saveBtn_clickHandler(event:MouseEvent):void
{
var run:RunVO = new RunVO();
run.runDate = dateFormatter.format(this.date.text);
run.miles = parseFloat(numMiles.text);
run.pace = userPace;
run.notes = notes.text;
dbService.addRun(run);
lbl.text = "Run data saved successfully";
resetFields();
}
private function resetFields():void
{
// clear fields for more input
this.date.text = '';
this.numMiles.text = '';
this.hrsVal.value = 0;
this.minsVal.value = 0;
this.secsVal.value = 0;
this.notes.text = '';
this.lblPace.text = '';
}
private function tabChangeHandler(event:IndexChangedEvent):void
{
dbService.getRuns();
if (event.newIndex==1)
{
dg.dispatchEvent(new DataGridEvent(DataGridEvent.HEADER_RELEASE,false,true,0,null,0,null,null,0));
}
}
private function dateFunction(s:String):Date
{
var newDate:Date = DateField.stringToDate(s,"YYYY-MM-DD");
return newDate;
}
private function paceFunction(s:String):Date
{
if (s!=null)
{
var idx:int = s.indexOf(':');
// Create a new date object with just the time values parsed from the String
var newDate:Date = new Date(null,null,null,"00",s.substring(0,idx),s.substring(idx+1,s.length),null);
return newDate;
}
else return null;
}
private function dataTipFunction(hitData:HitData):String
{
var tip:String;
var run:RunVO = hitData.item as RunVO;
tip = run.miles + " miles on " + run.runDate+"\n";
tip += " at " + run.pace;
return tip;
}
private function paceLblFunc(labelValue:Date, previousValue:Object, axis:IAxis):String
{
return timeFormatter.format(labelValue);
}
private function dateLblFunc(labelValue:Date, previousValue:Object, axis:IAxis):String
{
return dateFormatter.format(labelValue.toDateString());
}
private function date_changeHandler(event:CalendarLayoutChangeEvent):void
{
// A new date is being entered, clear saved label
lbl.text = '';
}
]]>
</fx:Script>
<fx:Declarations>
<s:ArrayCollection id="runsAC"/>
<mx:DateFormatter id="timeFormatter" formatString="NN:SS" />
<mx:DateFormatter id="dateFormatter" formatString="YYYY-MM-DD"/>
</fx:Declarations>
<s:layout>
<s:VerticalLayout gap="8" paddingLeft="50" paddingTop="10" paddingRight="20" paddingBottom="20" horizontalAlign="left"
verticalAlign="middle"/>
</s:layout>
<mx:TabNavigator width="100%" height="100%" fontSize="26" backgroundColor="0x000000" color="0x323232" change="tabChangeHandler(event)">
<s:NavigatorContent label="Miles" width="100%" height="100%" backgroundColor="0x000000" color="0xFFFFFF">
<s:layout>
<s:VerticalLayout gap="8" paddingTop="8" paddingLeft="8" paddingRight="8" paddingBottom="8"/>
</s:layout>
<s:HGroup horizontalAlign="center" verticalAlign="middle">
<s:Label text="Date:" fontSize="26"/>
<mx:DateField id="date" color="0x000000" showToday="true" selectedDate="{new Date()}" change="date_changeHandler(event)"/>
</s:HGroup>
<s:HGroup horizontalAlign="center" verticalAlign="middle">
<s:Label text="Miles:" fontSize="26"/>
<s:TextInput id="numMiles" fontSize="26" color="0x000000" widthInChars="3" restrict="0-9." text="0"/>
<mx:Spacer width="25"/>
<mx:Image source="@Embed(source='assets/runner3.jpg')" width="100" height="100"/>
</s:HGroup>
<s:VGroup horizontalAlign="center" verticalAlign="middle" gap="15">
<s:HGroup horizontalAlign="center" verticalAlign="middle" paddingTop="8">
<s:VGroup >
<s:Label text="Hours" fontSize="18"/>
<s:NumericStepper id="hrsVal" maximum="99" maxChars="2" fontSize="26"
skinClass="com.devgirl.runtracker.skins.MyNumericStepperSkin"/>
</s:VGroup>
<s:VGroup>
<s:Label text="Mins" fontSize="18"/>
<s:NumericStepper id="minsVal" maxChars="2" maximum="59" fontSize="26"
skinClass="com.devgirl.runtracker.skins.MyNumericStepperSkin"/>
</s:VGroup>
<s:VGroup>
<s:Label text="Secs" fontSize="18"/>
<s:NumericStepper id="secsVal" maxChars="2" maximum="59" fontSize="26"
skinClass="com.devgirl.runtracker.skins.MyNumericStepperSkin"/>
</s:VGroup>
</s:HGroup>
<s:Button id="btnCalc" label="Calculate Pace" fontSize="24" left="200" height="40" click="btnCalc_clickHandler()"
color="0x000000"/>
</s:VGroup>
<s:HGroup horizontalAlign="center" verticalAlign="middle" visible="false" id="grpPace" >
<s:Label text="Pace:" fontSize="28"/>
<s:Label id="lblPace" color="0x336699" fontSize="26"/>
</s:HGroup>
<s:Label text="Notes:" fontSize="26" color="0xFFFFFF"/>
<s:TextArea id="notes" width="90%" height="100" fontSize="26" color="0x000000"/>
<s:Button id="saveBtn" label="Save Run" click="saveBtn_clickHandler(event)" color="0x000000"/>
<s:Label id="lbl"/>
</s:NavigatorContent>
<s:NavigatorContent label="History" height="100%" width="100%" backgroundColor="0x000000">
<s:layout>
<s:VerticalLayout gap="8" paddingTop="8" paddingLeft="8" paddingRight="8" paddingBottom="8" horizontalAlign="center"
verticalAlign="middle"/>
</s:layout>
<mx:DataGrid id="dg" width="90%" height="90%" dataProvider="{runsAC}" color="0x000000" fontSize="18">
<mx:columns>
<mx:DataGridColumn dataField="runDate" headerText="Date" width="120"/>
<mx:DataGridColumn dataField="miles" headerText="Miles" width="50"/>
<mx:DataGridColumn dataField="pace" headerText="Pace" width="60"/>
<mx:DataGridColumn dataField="notes" headerText="Notes" width="140"/>
</mx:columns>
</mx:DataGrid>
</s:NavigatorContent>
<s:NavigatorContent label="Trends" color="0xFFFFFF" width="100%" height="100%">
<s:VGroup>
<mx:Legend dataProvider="{mychart}"/>
<mx:LineChart id="mychart" height="100%" width="100%"
paddingRight="5" paddingLeft="5"
showDataTips="true" dataTipFunction="dataTipFunction" dataProvider="{runsAC}">
<mx:horizontalAxis>
<mx:DateTimeAxis parseFunction="dateFunction" labelFunction="dateLblFunc" dataUnits="days"/>
</mx:horizontalAxis>
<mx:verticalAxis>
<mx:DateTimeAxis baseAtZero="true" parseFunction="paceFunction" labelFunction="paceLblFunc" dataUnits="seconds" />
</mx:verticalAxis>
<mx:series>
<mx:LineSeries xField="runDate" yField="pace" displayName="Pace Trend" sortOnXField="true"/>
</mx:series>
</mx:LineChart>
</s:VGroup>
</s:NavigatorContent>
</mx:TabNavigator>
</s:Application>