changeset 27:ae4d2c3ce5e0

Details. Zoom trailing finger move sorted. Qs rephrased.
author Robert Tubb <rt300@eecs.qmul.ac.uk>
date Wed, 13 Feb 2013 17:03:56 +0000
parents 2e1fdac115af
children e2c62db1e265
files AppCore.mm BottomTabViewController.mm HelpViewController.h HelpViewController.xib IntroViewController.xib Question.h Question.m QuestionnaireViewController.mm QuestionnaireViewController.xib TopButtonViewController.h TopButtonViewController.mm TopButtonViewController.xib eventLogger.h eventLogger.mm grid.mm presetManager.h presetManager.mm testApp.h testApp.mm
diffstat 19 files changed, 358 insertions(+), 338 deletions(-) [+]
line wrap: on
line diff
--- a/AppCore.mm	Fri Feb 01 18:31:43 2013 +0000
+++ b/AppCore.mm	Wed Feb 13 17:03:56 2013 +0000
@@ -80,7 +80,9 @@
 }
 
 //--------------------------------------------------------------
-void AppCore::exit() {}
+void AppCore::exit() {
+    pd.stop();
+}
 
 //--------------------------------------------------------------
 void AppCore::playTone(int pitch) {
--- a/BottomTabViewController.mm	Fri Feb 01 18:31:43 2013 +0000
+++ b/BottomTabViewController.mm	Wed Feb 13 17:03:56 2013 +0000
@@ -27,7 +27,7 @@
 {
     [super viewDidLoad];
     // Do any additional setup after loading the view from its nib.
-    self.interfaceSelector.selectedSegmentIndex = 1;
+    self.interfaceSelector.selectedSegmentIndex = 0;
     
 }
 
--- a/HelpViewController.h	Fri Feb 01 18:31:43 2013 +0000
+++ b/HelpViewController.h	Wed Feb 13 17:03:56 2013 +0000
@@ -9,8 +9,8 @@
 #import <UIKit/UIKit.h>
 
 @interface HelpViewController : UIViewController
-
+@property (nonatomic, assign)       id theOFAppRef;
 -(IBAction)hide:(id)sender;
 -(IBAction)show:(id)sender;
-
+-(void)setAppRef:(id)theOFApp;
 @end
--- a/HelpViewController.xib	Fri Feb 01 18:31:43 2013 +0000
+++ b/HelpViewController.xib	Wed Feb 13 17:03:56 2013 +0000
@@ -39,7 +39,7 @@
 					<object class="IBUITextView" id="992119782">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">274</int>
-						<string key="NSFrameSize">{768, 1024}</string>
+						<string key="NSFrameSize">{768, 933}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView" ref="519426224"/>
@@ -52,175 +52,58 @@
 						<bool key="IBUIMultipleTouchEnabled">YES</bool>
 						<string key="targetRuntimeIdentifier">IBIPadFramework</string>
 						<bool key="IBUIShowsHorizontalScrollIndicator">NO</bool>
-						<bool key="IBUIEditable">NO</bool>
-						<object class="NSMutableString" key="IBUIText">
-							<bytes key="NS.bytes">SW5zdHJ1Y3Rpb25zDQ1QcmVzcyB0aGUgcGxheSBidXR0b24gYXQgdGhlIHRvcCB0byBzdGFydCB0aGUg
+						<bool key="IBUIUsesAttributedText">YES</bool>
+						<object class="NSAttributedString" key="IBUIAttributedText">
+							<string type="base64-UTF8" key="NSString">SU5TVFJVQ1RJT05TDQ1QcmVzcyB0aGUgcGxheSBidXR0b24gYXQgdGhlIHRvcCB0byBzdGFydCB0aGUg
 c2VxdWVuY2VyLiBQcmVzcyBwYXVzZSB0byBzdG9wLg1QbGVhc2UgdXNlIGFsbCB0aHJlZSBtb2Rlczog
-Wk9PTUVSICwgU0xJREVSUyBhbmQgQk9USCBmb3IgYWJvdXQgOCBtaW51dGVzLiBZb3UgY2FuIGFjY2Vz
-cyB0aGVzZSB1c2luZyB0aGUgdGFicyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uIA0NDVpPT01F
-UiBJTlNUUlVDVElPTlM6DVRoZSByZWQgY3Jvc3NoYWlycyBpbiB0aGUgY2VudHJlIG9mIHRoZSBzY3Jl
-ZW4gcmVwcmVzZW50IHRoZSBwb2ludCBvbiB0aGUgc3VyZmFjZSB0aGF0IHlvdSBhcmUgbGlzdGVuaW5n
-IHRvLiBTY3JvbGwgdGhlIHN1cmZhY2UgdW5kZXIgdGhpcyBwb2ludCB0byBtb3ZlIHRvIGEgZGlmZmVy
-ZW50IHNvdW5kLiBJbiBCT1RIIG1vZGUgeW91IHdpbGwgYmUgYWJsZSB0byBzZWUgdGhlIGVmZmVjdCBv
-ZiB0aGlzIG9uIHRoZSBzbGlkZXJzLiBMaWtld2lzZSBpZiB5b3UgbW92ZSBhIHNsaWRlciB5b3Ugd2ls
-bCBob3AgdG8gYSBkaWZmZXJlbnQgcG9pbnQgb24gdGhlIHN1cmZhY2UuDVNhdmUgYW55IHNvdW5kcy9z
-ZXF1ZW5jZXMgdGhhdCB5b3UgbGlrZSB1c2luZyB0aGUg4oCcc2F2ZSBwcmVzZXTigJ0gYnV0dG9uLiBB
-IG1hcmtlciB3aWxsIGFwcGVhciBvbiB0aGUgem9vbSBzdXJmYWNlICwgaWYgeW91IG1vdmUgdG8gdGhl
-IHZpY2luaXR5IG9mIGEgcHJlc2V0IG1hcmtlciwgdGhlIGNyb3NzaGFpcnMgd2lsbCBzbmFwIHRvIHRo
-ZSBwcmVzZXQsIGl0cyBkZXRhaWxzIHdpbGwgYXBwZWFyIGFuZCB0aGUgc291bmQgd2lsbCBwbGF5Lg1V
-c2luZyB0d28gZmluZ2VyIHBpbmNoIG1vdmVtZW50IHpvb21zIHRoZSBzdXJmYWNlIGp1c3QgYXMgaW4g
-YSBtYXBzIGFwcC4gVGhlIGZ1cnRoZXIgeW91IHpvb20gaW4sIHRoZSBsZXNzIHRoZSBzb3VuZCB3aWxs
-IGNoYW5nZSBhcyB5b3Ugc2Nyb2xsIGFyb3VuZC4gDUluc3RydWN0aW9ucw0NUHJlc3MgdGhlIHBsYXkg
-YnV0dG9uIGF0IHRoZSB0b3AgdG8gc3RhcnQgdGhlIHNlcXVlbmNlci4gUHJlc3MgcGF1c2UgdG8gc3Rv
-cC4NUGxlYXNlIHVzZSBhbGwgdGhyZWUgbW9kZXM6IFpPT01FUiAsIFNMSURFUlMgYW5kIEJPVEggZm9y
-IGFib3V0IDggbWludXRlcy4gWW91IGNhbiBhY2Nlc3MgdGhlc2UgdXNpbmcgdGhlIHRhYnMgYXQgdGhl
-IGJvdHRvbSBvZiB0aGUgc2NyZWVuLiANDQ1aT09NRVIgSU5TVFJVQ1RJT05TOg1UaGUgcmVkIGNyb3Nz
-aGFpcnMgaW4gdGhlIGNlbnRyZSBvZiB0aGUgc2NyZWVuIHJlcHJlc2VudCB0aGUgcG9pbnQgb24gdGhl
-IHN1cmZhY2UgdGhhdCB5b3UgYXJlIGxpc3RlbmluZyB0by4gU2Nyb2xsIHRoZSBzdXJmYWNlIHVuZGVy
-IHRoaXMgcG9pbnQgdG8gbW92ZSB0byBhIGRpZmZlcmVudCBzb3VuZC4gSW4gQk9USCBtb2RlIHlvdSB3
-aWxsIGJlIGFibGUgdG8gc2VlIHRoZSBlZmZlY3Qgb2YgdGhpcyBvbiB0aGUgc2xpZGVycy4gTGlrZXdp
-c2UgaWYgeW91IG1vdmUgYSBzbGlkZXIgeW91IHdpbGwgaG9wIHRvIGEgZGlmZmVyZW50IHBvaW50IG9u
-IHRoZSBzdXJmYWNlLg1TYXZlIGFueSBzb3VuZHMvc2VxdWVuY2VzIHRoYXQgeW91IGxpa2UgdXNpbmcg
-dGhlIOKAnHNhdmUgcHJlc2V04oCdIGJ1dHRvbi4gQSBtYXJrZXIgd2lsbCBhcHBlYXIgb24gdGhlIHpv
-b20gc3VyZmFjZSAsIGlmIHlvdSBtb3ZlIHRvIHRoZSB2aWNpbml0eSBvZiBhIHByZXNldCBtYXJrZXIs
-IHRoZSBjcm9zc2hhaXJzIHdpbGwgc25hcCB0byB0aGUgcHJlc2V0LCBpdHMgZGV0YWlscyB3aWxsIGFw
-cGVhciBhbmQgdGhlIHNvdW5kIHdpbGwgcGxheS4NVXNpbmcgdHdvIGZpbmdlciBwaW5jaCBtb3ZlbWVu
-dCB6b29tcyB0aGUgc3VyZmFjZSBqdXN0IGFzIGluIGEgbWFwcyBhcHAuIFRoZSBmdXJ0aGVyIHlvdSB6
-b29tIGluLCB0aGUgbGVzcyB0aGUgc291bmQgd2lsbCBjaGFuZ2UgYXMgeW91IHNjcm9sbCBhcm91bmQu
-IA1JbnN0cnVjdGlvbnMNDVByZXNzIHRoZSBwbGF5IGJ1dHRvbiBhdCB0aGUgdG9wIHRvIHN0YXJ0IHRo
-ZSBzZXF1ZW5jZXIuIFByZXNzIHBhdXNlIHRvIHN0b3AuDVBsZWFzZSB1c2UgYWxsIHRocmVlIG1vZGVz
-OiBaT09NRVIgLCBTTElERVJTIGFuZCBCT1RIIGZvciBhYm91dCA4IG1pbnV0ZXMuIFlvdSBjYW4gYWNj
-ZXNzIHRoZXNlIHVzaW5nIHRoZSB0YWJzIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4gDQ0NWk9P
-TUVSIElOU1RSVUNUSU9OUzoNVGhlIHJlZCBjcm9zc2hhaXJzIGluIHRoZSBjZW50cmUgb2YgdGhlIHNj
-cmVlbiByZXByZXNlbnQgdGhlIHBvaW50IG9uIHRoZSBzdXJmYWNlIHRoYXQgeW91IGFyZSBsaXN0ZW5p
-bmcgdG8uIFNjcm9sbCB0aGUgc3VyZmFjZSB1bmRlciB0aGlzIHBvaW50IHRvIG1vdmUgdG8gYSBkaWZm
-ZXJlbnQgc291bmQuIEluIEJPVEggbW9kZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNlZSB0aGUgZWZmZWN0
-IG9mIHRoaXMgb24gdGhlIHNsaWRlcnMuIExpa2V3aXNlIGlmIHlvdSBtb3ZlIGEgc2xpZGVyIHlvdSB3
-aWxsIGhvcCB0byBhIGRpZmZlcmVudCBwb2ludCBvbiB0aGUgc3VyZmFjZS4NU2F2ZSBhbnkgc291bmRz
-L3NlcXVlbmNlcyB0aGF0IHlvdSBsaWtlIHVzaW5nIHRoZSDigJxzYXZlIHByZXNldOKAnSBidXR0b24u
-IEEgbWFya2VyIHdpbGwgYXBwZWFyIG9uIHRoZSB6b29tIHN1cmZhY2UgLCBpZiB5b3UgbW92ZSB0byB0
-aGUgdmljaW5pdHkgb2YgYSBwcmVzZXQgbWFya2VyLCB0aGUgY3Jvc3NoYWlycyB3aWxsIHNuYXAgdG8g
-dGhlIHByZXNldCwgaXRzIGRldGFpbHMgd2lsbCBhcHBlYXIgYW5kIHRoZSBzb3VuZCB3aWxsIHBsYXku
-DVVzaW5nIHR3byBmaW5nZXIgcGluY2ggbW92ZW1lbnQgem9vbXMgdGhlIHN1cmZhY2UganVzdCBhcyBp
-biBhIG1hcHMgYXBwLiBUaGUgZnVydGhlciB5b3Ugem9vbSBpbiwgdGhlIGxlc3MgdGhlIHNvdW5kIHdp
-bGwgY2hhbmdlIGFzIHlvdSBzY3JvbGwgYXJvdW5kLiANSW5zdHJ1Y3Rpb25zDQ1QcmVzcyB0aGUgcGxh
-eSBidXR0b24gYXQgdGhlIHRvcCB0byBzdGFydCB0aGUgc2VxdWVuY2VyLiBQcmVzcyBwYXVzZSB0byBz
-dG9wLg1QbGVhc2UgdXNlIGFsbCB0aHJlZSBtb2RlczogWk9PTUVSICwgU0xJREVSUyBhbmQgQk9USCBm
-b3IgYWJvdXQgOCBtaW51dGVzLiBZb3UgY2FuIGFjY2VzcyB0aGVzZSB1c2luZyB0aGUgdGFicyBhdCB0
-aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uIA0NDVpPT01FUiBJTlNUUlVDVElPTlM6DVRoZSByZWQgY3Jv
-c3NoYWlycyBpbiB0aGUgY2VudHJlIG9mIHRoZSBzY3JlZW4gcmVwcmVzZW50IHRoZSBwb2ludCBvbiB0
-aGUgc3VyZmFjZSB0aGF0IHlvdSBhcmUgbGlzdGVuaW5nIHRvLiBTY3JvbGwgdGhlIHN1cmZhY2UgdW5k
-ZXIgdGhpcyBwb2ludCB0byBtb3ZlIHRvIGEgZGlmZmVyZW50IHNvdW5kLiBJbiBCT1RIIG1vZGUgeW91
-IHdpbGwgYmUgYWJsZSB0byBzZWUgdGhlIGVmZmVjdCBvZiB0aGlzIG9uIHRoZSBzbGlkZXJzLiBMaWtl
-d2lzZSBpZiB5b3UgbW92ZSBhIHNsaWRlciB5b3Ugd2lsbCBob3AgdG8gYSBkaWZmZXJlbnQgcG9pbnQg
-b24gdGhlIHN1cmZhY2UuDVNhdmUgYW55IHNvdW5kcy9zZXF1ZW5jZXMgdGhhdCB5b3UgbGlrZSB1c2lu
+Zmlyc3QgdGhlIFNMSURFUlMsIHRoZW4gdGhlIFpPT01FUiBhbmQgdGhlbiBCT1RIIGZvciBhYm91dCA4
+IG1pbnV0ZXMgZWFjaC4gWW91IGNhbiBhY2Nlc3MgdGhlc2UgdXNpbmcgdGhlIHRhYnMgYXQgdGhlIGJv
+dHRvbSBvZiB0aGUgc2NyZWVuLiANDU9QRVJBVElORyBUSEUgWk9PTUVS4oCoDVRoZSByZWQgY3Jvc3No
+YWlycyBpbiB0aGUgY2VudHJlIG9mIHRoZSBzY3JlZW4gcmVwcmVzZW50IHRoZSBwb2ludCBvbiB0aGUg
+c3VyZmFjZSB0aGF0IHlvdSBhcmUgbGlzdGVuaW5nIHRvLiBTY3JvbGwgdGhlIHN1cmZhY2UgdW5kZXIg
+dGhpcyBwb2ludCB0byBtb3ZlIHRvIGEgZGlmZmVyZW50IHNvdW5kLiBJbiBCT1RIIG1vZGUgeW91IHdp
+bGwgYmUgYWJsZSB0byBzZWUgdGhlIGVmZmVjdCBvZiB0aGlzIG9uIHRoZSBzbGlkZXJzLiBMaWtld2lz
+ZSBpZiB5b3UgbW92ZSBhIHNsaWRlciB5b3Ugd2lsbCBob3AgdG8gYSBkaWZmZXJlbnQgcG9pbnQgb24g
+dGhlIHN1cmZhY2Uu4oCoDVNhdmUgYW55IHNvdW5kcy9zZXF1ZW5jZXMgdGhhdCB5b3UgbGlrZSB1c2lu
 ZyB0aGUg4oCcc2F2ZSBwcmVzZXTigJ0gYnV0dG9uLiBBIG1hcmtlciB3aWxsIGFwcGVhciBvbiB0aGUg
-em9vbSBzdXJmYWNlICwgaWYgeW91IG1vdmUgdG8gdGhlIHZpY2luaXR5IG9mIGEgcHJlc2V0IG1hcmtl
-ciwgdGhlIGNyb3NzaGFpcnMgd2lsbCBzbmFwIHRvIHRoZSBwcmVzZXQsIGl0cyBkZXRhaWxzIHdpbGwg
-YXBwZWFyIGFuZCB0aGUgc291bmQgd2lsbCBwbGF5Lg1Vc2luZyB0d28gZmluZ2VyIHBpbmNoIG1vdmVt
-ZW50IHpvb21zIHRoZSBzdXJmYWNlIGp1c3QgYXMgaW4gYSBtYXBzIGFwcC4gVGhlIGZ1cnRoZXIgeW91
-IHpvb20gaW4sIHRoZSBsZXNzIHRoZSBzb3VuZCB3aWxsIGNoYW5nZSBhcyB5b3Ugc2Nyb2xsIGFyb3Vu
-ZC4gDUluc3RydWN0aW9ucw0NUHJlc3MgdGhlIHBsYXkgYnV0dG9uIGF0IHRoZSB0b3AgdG8gc3RhcnQg
-dGhlIHNlcXVlbmNlci4gUHJlc3MgcGF1c2UgdG8gc3RvcC4NUGxlYXNlIHVzZSBhbGwgdGhyZWUgbW9k
-ZXM6IFpPT01FUiAsIFNMSURFUlMgYW5kIEJPVEggZm9yIGFib3V0IDggbWludXRlcy4gWW91IGNhbiBh
-Y2Nlc3MgdGhlc2UgdXNpbmcgdGhlIHRhYnMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLiANDQ1a
-T09NRVIgSU5TVFJVQ1RJT05TOg1UaGUgcmVkIGNyb3NzaGFpcnMgaW4gdGhlIGNlbnRyZSBvZiB0aGUg
-c2NyZWVuIHJlcHJlc2VudCB0aGUgcG9pbnQgb24gdGhlIHN1cmZhY2UgdGhhdCB5b3UgYXJlIGxpc3Rl
-bmluZyB0by4gU2Nyb2xsIHRoZSBzdXJmYWNlIHVuZGVyIHRoaXMgcG9pbnQgdG8gbW92ZSB0byBhIGRp
-ZmZlcmVudCBzb3VuZC4gSW4gQk9USCBtb2RlIHlvdSB3aWxsIGJlIGFibGUgdG8gc2VlIHRoZSBlZmZl
-Y3Qgb2YgdGhpcyBvbiB0aGUgc2xpZGVycy4gTGlrZXdpc2UgaWYgeW91IG1vdmUgYSBzbGlkZXIgeW91
-IHdpbGwgaG9wIHRvIGEgZGlmZmVyZW50IHBvaW50IG9uIHRoZSBzdXJmYWNlLg1TYXZlIGFueSBzb3Vu
-ZHMvc2VxdWVuY2VzIHRoYXQgeW91IGxpa2UgdXNpbmcgdGhlIOKAnHNhdmUgcHJlc2V04oCdIGJ1dHRv
-bi4gQSBtYXJrZXIgd2lsbCBhcHBlYXIgb24gdGhlIHpvb20gc3VyZmFjZSAsIGlmIHlvdSBtb3ZlIHRv
-IHRoZSB2aWNpbml0eSBvZiBhIHByZXNldCBtYXJrZXIsIHRoZSBjcm9zc2hhaXJzIHdpbGwgc25hcCB0
-byB0aGUgcHJlc2V0LCBpdHMgZGV0YWlscyB3aWxsIGFwcGVhciBhbmQgdGhlIHNvdW5kIHdpbGwgcGxh
-eS4NVXNpbmcgdHdvIGZpbmdlciBwaW5jaCBtb3ZlbWVudCB6b29tcyB0aGUgc3VyZmFjZSBqdXN0IGFz
-IGluIGEgbWFwcyBhcHAuIFRoZSBmdXJ0aGVyIHlvdSB6b29tIGluLCB0aGUgbGVzcyB0aGUgc291bmQg
-d2lsbCBjaGFuZ2UgYXMgeW91IHNjcm9sbCBhcm91bmQuIA1JbnN0cnVjdGlvbnMNDVByZXNzIHRoZSBw
-bGF5IGJ1dHRvbiBhdCB0aGUgdG9wIHRvIHN0YXJ0IHRoZSBzZXF1ZW5jZXIuIFByZXNzIHBhdXNlIHRv
-IHN0b3AuDVBsZWFzZSB1c2UgYWxsIHRocmVlIG1vZGVzOiBaT09NRVIgLCBTTElERVJTIGFuZCBCT1RI
-IGZvciBhYm91dCA4IG1pbnV0ZXMuIFlvdSBjYW4gYWNjZXNzIHRoZXNlIHVzaW5nIHRoZSB0YWJzIGF0
-IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4gDQ0NWk9PTUVSIElOU1RSVUNUSU9OUzoNVGhlIHJlZCBj
-cm9zc2hhaXJzIGluIHRoZSBjZW50cmUgb2YgdGhlIHNjcmVlbiByZXByZXNlbnQgdGhlIHBvaW50IG9u
-IHRoZSBzdXJmYWNlIHRoYXQgeW91IGFyZSBsaXN0ZW5pbmcgdG8uIFNjcm9sbCB0aGUgc3VyZmFjZSB1
-bmRlciB0aGlzIHBvaW50IHRvIG1vdmUgdG8gYSBkaWZmZXJlbnQgc291bmQuIEluIEJPVEggbW9kZSB5
-b3Ugd2lsbCBiZSBhYmxlIHRvIHNlZSB0aGUgZWZmZWN0IG9mIHRoaXMgb24gdGhlIHNsaWRlcnMuIExp
-a2V3aXNlIGlmIHlvdSBtb3ZlIGEgc2xpZGVyIHlvdSB3aWxsIGhvcCB0byBhIGRpZmZlcmVudCBwb2lu
-dCBvbiB0aGUgc3VyZmFjZS4NU2F2ZSBhbnkgc291bmRzL3NlcXVlbmNlcyB0aGF0IHlvdSBsaWtlIHVz
-aW5nIHRoZSDigJxzYXZlIHByZXNldOKAnSBidXR0b24uIEEgbWFya2VyIHdpbGwgYXBwZWFyIG9uIHRo
-ZSB6b29tIHN1cmZhY2UgLCBpZiB5b3UgbW92ZSB0byB0aGUgdmljaW5pdHkgb2YgYSBwcmVzZXQgbWFy
-a2VyLCB0aGUgY3Jvc3NoYWlycyB3aWxsIHNuYXAgdG8gdGhlIHByZXNldCwgaXRzIGRldGFpbHMgd2ls
-bCBhcHBlYXIgYW5kIHRoZSBzb3VuZCB3aWxsIHBsYXkuDVVzaW5nIHR3byBmaW5nZXIgcGluY2ggbW92
+em9vbSBzdXJmYWNlLiBJZiB5b3UgbW92ZSB0byB0aGUgdmljaW5pdHkgb2YgYSBwcmVzZXQgbWFya2Vy
+LCB0aGUgY3Jvc3NoYWlycyB3aWxsIHNuYXAgdG8gdGhlIHByZXNldCwgaXRzIGRldGFpbHMgd2lsbCBh
+cHBlYXIgYW5kIHRoZSBzb3VuZCB3aWxsIHBsYXkuDeKAqFVzaW5nIHR3byBmaW5nZXIgcGluY2ggbW92
 ZW1lbnQgem9vbXMgdGhlIHN1cmZhY2UganVzdCBhcyBpbiBhIG1hcHMgYXBwLiBUaGUgZnVydGhlciB5
 b3Ugem9vbSBpbiwgdGhlIGxlc3MgdGhlIHNvdW5kIHdpbGwgY2hhbmdlIGFzIHlvdSBzY3JvbGwgYXJv
-dW5kLiANSW5zdHJ1Y3Rpb25zDQ1QcmVzcyB0aGUgcGxheSBidXR0b24gYXQgdGhlIHRvcCB0byBzdGFy
-dCB0aGUgc2VxdWVuY2VyLiBQcmVzcyBwYXVzZSB0byBzdG9wLg1QbGVhc2UgdXNlIGFsbCB0aHJlZSBt
-b2RlczogWk9PTUVSICwgU0xJREVSUyBhbmQgQk9USCBmb3IgYWJvdXQgOCBtaW51dGVzLiBZb3UgY2Fu
-IGFjY2VzcyB0aGVzZSB1c2luZyB0aGUgdGFicyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uIA0N
-DVpPT01FUiBJTlNUUlVDVElPTlM6DVRoZSByZWQgY3Jvc3NoYWlycyBpbiB0aGUgY2VudHJlIG9mIHRo
-ZSBzY3JlZW4gcmVwcmVzZW50IHRoZSBwb2ludCBvbiB0aGUgc3VyZmFjZSB0aGF0IHlvdSBhcmUgbGlz
-dGVuaW5nIHRvLiBTY3JvbGwgdGhlIHN1cmZhY2UgdW5kZXIgdGhpcyBwb2ludCB0byBtb3ZlIHRvIGEg
-ZGlmZmVyZW50IHNvdW5kLiBJbiBCT1RIIG1vZGUgeW91IHdpbGwgYmUgYWJsZSB0byBzZWUgdGhlIGVm
-ZmVjdCBvZiB0aGlzIG9uIHRoZSBzbGlkZXJzLiBMaWtld2lzZSBpZiB5b3UgbW92ZSBhIHNsaWRlciB5
-b3Ugd2lsbCBob3AgdG8gYSBkaWZmZXJlbnQgcG9pbnQgb24gdGhlIHN1cmZhY2UuDVNhdmUgYW55IHNv
-dW5kcy9zZXF1ZW5jZXMgdGhhdCB5b3UgbGlrZSB1c2luZyB0aGUg4oCcc2F2ZSBwcmVzZXTigJ0gYnV0
-dG9uLiBBIG1hcmtlciB3aWxsIGFwcGVhciBvbiB0aGUgem9vbSBzdXJmYWNlICwgaWYgeW91IG1vdmUg
-dG8gdGhlIHZpY2luaXR5IG9mIGEgcHJlc2V0IG1hcmtlciwgdGhlIGNyb3NzaGFpcnMgd2lsbCBzbmFw
-IHRvIHRoZSBwcmVzZXQsIGl0cyBkZXRhaWxzIHdpbGwgYXBwZWFyIGFuZCB0aGUgc291bmQgd2lsbCBw
-bGF5Lg1Vc2luZyB0d28gZmluZ2VyIHBpbmNoIG1vdmVtZW50IHpvb21zIHRoZSBzdXJmYWNlIGp1c3Qg
-YXMgaW4gYSBtYXBzIGFwcC4gVGhlIGZ1cnRoZXIgeW91IHpvb20gaW4sIHRoZSBsZXNzIHRoZSBzb3Vu
-ZCB3aWxsIGNoYW5nZSBhcyB5b3Ugc2Nyb2xsIGFyb3VuZC4gDUluc3RydWN0aW9ucw0NUHJlc3MgdGhl
-IHBsYXkgYnV0dG9uIGF0IHRoZSB0b3AgdG8gc3RhcnQgdGhlIHNlcXVlbmNlci4gUHJlc3MgcGF1c2Ug
-dG8gc3RvcC4NUGxlYXNlIHVzZSBhbGwgdGhyZWUgbW9kZXM6IFpPT01FUiAsIFNMSURFUlMgYW5kIEJP
-VEggZm9yIGFib3V0IDggbWludXRlcy4gWW91IGNhbiBhY2Nlc3MgdGhlc2UgdXNpbmcgdGhlIHRhYnMg
-YXQgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLiANDQ1aT09NRVIgSU5TVFJVQ1RJT05TOg1UaGUgcmVk
-IGNyb3NzaGFpcnMgaW4gdGhlIGNlbnRyZSBvZiB0aGUgc2NyZWVuIHJlcHJlc2VudCB0aGUgcG9pbnQg
-b24gdGhlIHN1cmZhY2UgdGhhdCB5b3UgYXJlIGxpc3RlbmluZyB0by4gU2Nyb2xsIHRoZSBzdXJmYWNl
-IHVuZGVyIHRoaXMgcG9pbnQgdG8gbW92ZSB0byBhIGRpZmZlcmVudCBzb3VuZC4gSW4gQk9USCBtb2Rl
-IHlvdSB3aWxsIGJlIGFibGUgdG8gc2VlIHRoZSBlZmZlY3Qgb2YgdGhpcyBvbiB0aGUgc2xpZGVycy4g
-TGlrZXdpc2UgaWYgeW91IG1vdmUgYSBzbGlkZXIgeW91IHdpbGwgaG9wIHRvIGEgZGlmZmVyZW50IHBv
-aW50IG9uIHRoZSBzdXJmYWNlLg1TYXZlIGFueSBzb3VuZHMvc2VxdWVuY2VzIHRoYXQgeW91IGxpa2Ug
-dXNpbmcgdGhlIOKAnHNhdmUgcHJlc2V04oCdIGJ1dHRvbi4gQSBtYXJrZXIgd2lsbCBhcHBlYXIgb24g
-dGhlIHpvb20gc3VyZmFjZSAsIGlmIHlvdSBtb3ZlIHRvIHRoZSB2aWNpbml0eSBvZiBhIHByZXNldCBt
-YXJrZXIsIHRoZSBjcm9zc2hhaXJzIHdpbGwgc25hcCB0byB0aGUgcHJlc2V0LCBpdHMgZGV0YWlscyB3
-aWxsIGFwcGVhciBhbmQgdGhlIHNvdW5kIHdpbGwgcGxheS4NVXNpbmcgdHdvIGZpbmdlciBwaW5jaCBt
-b3ZlbWVudCB6b29tcyB0aGUgc3VyZmFjZSBqdXN0IGFzIGluIGEgbWFwcyBhcHAuIFRoZSBmdXJ0aGVy
-IHlvdSB6b29tIGluLCB0aGUgbGVzcyB0aGUgc291bmQgd2lsbCBjaGFuZ2UgYXMgeW91IHNjcm9sbCBh
-cm91bmQuIA1JbnN0cnVjdGlvbnMNDVByZXNzIHRoZSBwbGF5IGJ1dHRvbiBhdCB0aGUgdG9wIHRvIHN0
-YXJ0IHRoZSBzZXF1ZW5jZXIuIFByZXNzIHBhdXNlIHRvIHN0b3AuDVBsZWFzZSB1c2UgYWxsIHRocmVl
-IG1vZGVzOiBaT09NRVIgLCBTTElERVJTIGFuZCBCT1RIIGZvciBhYm91dCA4IG1pbnV0ZXMuIFlvdSBj
-YW4gYWNjZXNzIHRoZXNlIHVzaW5nIHRoZSB0YWJzIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4g
-DQ0NWk9PTUVSIElOU1RSVUNUSU9OUzoNVGhlIHJlZCBjcm9zc2hhaXJzIGluIHRoZSBjZW50cmUgb2Yg
-dGhlIHNjcmVlbiByZXByZXNlbnQgdGhlIHBvaW50IG9uIHRoZSBzdXJmYWNlIHRoYXQgeW91IGFyZSBs
-aXN0ZW5pbmcgdG8uIFNjcm9sbCB0aGUgc3VyZmFjZSB1bmRlciB0aGlzIHBvaW50IHRvIG1vdmUgdG8g
-YSBkaWZmZXJlbnQgc291bmQuIEluIEJPVEggbW9kZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNlZSB0aGUg
-ZWZmZWN0IG9mIHRoaXMgb24gdGhlIHNsaWRlcnMuIExpa2V3aXNlIGlmIHlvdSBtb3ZlIGEgc2xpZGVy
-IHlvdSB3aWxsIGhvcCB0byBhIGRpZmZlcmVudCBwb2ludCBvbiB0aGUgc3VyZmFjZS4NU2F2ZSBhbnkg
-c291bmRzL3NlcXVlbmNlcyB0aGF0IHlvdSBsaWtlIHVzaW5nIHRoZSDigJxzYXZlIHByZXNldOKAnSBi
-dXR0b24uIEEgbWFya2VyIHdpbGwgYXBwZWFyIG9uIHRoZSB6b29tIHN1cmZhY2UgLCBpZiB5b3UgbW92
-ZSB0byB0aGUgdmljaW5pdHkgb2YgYSBwcmVzZXQgbWFya2VyLCB0aGUgY3Jvc3NoYWlycyB3aWxsIHNu
-YXAgdG8gdGhlIHByZXNldCwgaXRzIGRldGFpbHMgd2lsbCBhcHBlYXIgYW5kIHRoZSBzb3VuZCB3aWxs
-IHBsYXkuDVVzaW5nIHR3byBmaW5nZXIgcGluY2ggbW92ZW1lbnQgem9vbXMgdGhlIHN1cmZhY2UganVz
-dCBhcyBpbiBhIG1hcHMgYXBwLiBUaGUgZnVydGhlciB5b3Ugem9vbSBpbiwgdGhlIGxlc3MgdGhlIHNv
-dW5kIHdpbGwgY2hhbmdlIGFzIHlvdSBzY3JvbGwgYXJvdW5kLiANA</bytes>
+dW5kLiBGb3IgZXhhbXBsZSB0aGUgeWVsbG93IGxpbmVzIHRoYXQgYXBwZWFyIGF0IHRoZSBsYXJnZXN0
+IHNjYWxlIGNvcnJlc3BvbmQgdG8gdGhlIHNsaWRlcnMganVtcGluZyA2NCB1bml0cy4gVGhlIHdoaXRl
+IGxpbmVzIGF0IHRoZSBzbWFsbGVzdCBzY2FsZSBjb3JyZXNwb25kIHRvIGp1bXBzIG9mIG9uZSB1bml0
+LiBUaGVyZSBhcmUgNyBsZXZlbHM64oCo4oCoWWVsbG93ID0gNjTigKhUZWFsID0gMzLigKhQdXJwbGUg
+PSAxNuKAqEdyZWVuID0gOOKAqERhcmsgQmx1ZSA9IDTigKhSZWQgPSAy4oCoV2hpdGUgPSAx4oCo4oCo
+TE9DS+KAqOKAqElmIHlvdSBmaW5kIGEgc2VxdWVuY2UgeW91IGxpa2UgYnV0IHdhbnQgdG8gY2hhbmdl
+IHRoZSBzeW50aCBzb3VuZCB1c2UgdGhlICJMb2NrIFNlcXVlbmNlIChYKSIgYnV0dG9uLiBUaGlzIHdp
+bGwgcHJldmVudCB5b3UgYWNjaWRlbnRhbGx5IG1vdmluZyBpbiBmcm9tIGxlZnQgdG8gcmlnaHQgYW5k
+IG1lc3NpbmcgdXAgeW91ciBub3RlIHBhdHRlcm4uIFNpbWlsYXJseSBpZiB5b3UgZmluZCBhIHN5bnRo
+IHNvdW5kIHRoYXQgeW91IGxpa2UsIGJ1dCB3YW50IHRvIGNoYW5nZSB0aGUgbm90ZSBzZXF1ZW5jZSwg
+dXNlIHRoZSAiTG9jayBTeW50aCAoWSkiIGJ1dHRvbi4g4oCo4oCoUkFORE9NSVNF4oCo4oCoVXNlIHRo
+ZSByYW5kb21pc2UgdG8ganVtcCB0byBhIHJhbmRvbSBwb2ludCBvbiB0aGUgZ3JpZC4g4oCoVEhFIFFV
+RVNUSU9OTkFJUkXigKjigKgNDQ</string>
+							<dictionary key="NSAttributes">
+								<object class="NSColor" key="NSColor">
+									<int key="NSColorSpace">1</int>
+									<bytes key="NSRGB">MC4zMzgyNjY5OTg0IDAuOTA1MzMyMjM5OSAxAA</bytes>
+								</object>
+								<object class="NSFont" key="NSFont">
+									<string key="NSName">Helvetica</string>
+									<double key="NSSize">15</double>
+									<int key="NSfFlags">16</int>
+								</object>
+								<object class="NSMutableParagraphStyle" key="NSParagraphStyle">
+									<nil key="NSTabStops"/>
+								</object>
+							</dictionary>
 						</object>
-						<object class="NSColor" key="IBUITextColor">
-							<int key="NSColorSpace">1</int>
-							<bytes key="NSRGB">MC4zMzgyNjY5OTg0IDAuOTA1MzMyMjM5OSAxAA</bytes>
-						</object>
+						<bool key="IBUIEditable">NO</bool>
 						<object class="IBUITextInputTraits" key="IBUITextInputTraits">
 							<int key="IBUIAutocapitalizationType">2</int>
 							<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
 						</object>
-						<object class="IBUIFontDescription" key="IBUIFontDescription">
-							<int key="type">1</int>
-							<double key="pointSize">15</double>
-						</object>
-						<object class="NSFont" key="IBUIFont">
-							<string key="NSName">Helvetica</string>
-							<double key="NSSize">15</double>
-							<int key="NSfFlags">16</int>
-						</object>
 					</object>
 					<object class="IBUIButton" id="519426224">
 						<reference key="NSNextResponder" ref="766721923"/>
@@ -328,8 +211,8 @@
 						<int key="objectID">2</int>
 						<reference key="object" ref="766721923"/>
 						<array class="NSMutableArray" key="children">
+							<reference ref="519426224"/>
 							<reference ref="992119782"/>
-							<reference ref="519426224"/>
 						</array>
 						<reference key="parent" ref="0"/>
 					</object>
--- a/IntroViewController.xib	Fri Feb 01 18:31:43 2013 +0000
+++ b/IntroViewController.xib	Wed Feb 13 17:03:56 2013 +0000
@@ -42,6 +42,7 @@
 						<string key="NSFrame">{{326, 881}, {116, 44}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<bool key="IBUIOpaque">NO</bool>
 						<string key="targetRuntimeIdentifier">IBIPadFramework</string>
@@ -94,40 +95,42 @@
 ZmFjdCB0aGVyZSBhcmUganVzdCBvdmVyIGEgYmlsbGlvbiB0cmlsbGlvbiBkaXN0aW5jdCBzZXR0aW5n
 cyEgV2UgYWltIHRvIGxvb2sgYXQgd2hhdCBwYXRocyBwZW9wbGUgdGFrZSBpbiB0aGlzIGh1Z2Ugc3Bh
 Y2UsIHdoYXQgcG9pbnRzIHRoZXkgbGlrZSBhbmQgZGlzbGlrZSwgYW5kIHVzZSB0aGUgZGF0YSB0byBj
-cmVhdGUgc3ludGhzIHRoYXQgYXJlIGVhc2llciB0byBuYXZpZ2F0ZSwgb3IgdGhhdCBlbmNvdXJhZ2Ug
-Y3JlYXRpdml0eS4NDVRoZXJlIGFyZSB0d28gaW50ZXJmYWNlcyBwcmVzZW50ZWQgaGVyZS4gVGhlIGZp
-cnN0IGlzIG9uZSB5b3Ugd2lsbCBwcm9iYWJseSBiZSB1c2VkIHRvIGlmIHlvdSBhcmUgYSBtdXNpY2lh
-bjogMTAgc2xpZGVycyBmb3IgZWFjaCBvZiB0aGUgcGFyYW1ldGVycy4gVGhlIHNlY29uZCBpcyBzb21l
-d2hhdCBuZXc6IGV2ZXJ5IG9uZSBvZiB0aGUgYmlsbGlvbiB0cmlsbGlvbiBwb2ludHMgaGFzIGJlZW4g
-bWFwcGVkIHRvIGEgMkQgc3VyZmFjZSAoaWYgeW91IHJlYWxseSB3YW50IHRvIGtub3cgLSBlYWNoIHNx
-dWFyZSB5b3Ugc2VlIGlzIGEgc3F1YXNoZWQgb3V0IDEwRCBoeXBlcmN1YmUsIGFuZCBhbGwgb2YgdGhl
-IDEwMjQgc3ViLXNxdWFyZXMgYXJlIHRoZSDigJxjb3JuZXJz4oCdIG9mIHRoaXMgMTAtY3ViZSwgd2hp
-Y2ggdGhlbXNlbHZlcyBhcmUgYnVpbHQgZnJvbSBzbWFsbGVyIGh5cGVyY3ViZXMgYW5kIHNvIG9u4oCm
-KS4gQXMgZmFyIGFzIHBvc3NpYmxlLCB0aGUgZnVydGhlciB5b3UgdHJhdmVsIGFsb25nIHRoaXMgMkQg
-c3VyZmFjZSwgdGhlIG1vcmUgZGlmZmVyZW50IHRoZSBzb3VuZCB3aWxsIGJlY29tZS4NDVVwIGRvd24g
-bW92ZW1lbnQgY29udHJvbHMgdGhlIHN5bnRoIHRpbWJyZSwgbGVmdCByaWdodCBjb250cm9scyB0aGUg
-c2VxdWVuY2VyLiBXaGVuIHlvdSBjbGljayDigJxzYXZlIHByZXNldOKAnSB5b3Ugd2lsbCBkcm9wIGEg
-cGluIG9udG8gdGhlIHN1cmZhY2UsIGFuZCB5b3UgY2FuIHJldmlzaXQgdGhpcyBwb2ludCBhdCBhbnl0
-aW1lIGJ5IHNjcm9sbGluZyB0byBpdC4gVGhpbmsgb2YgaXQgbGlrZSBhICJHb29nbGUgTWFwcyIgZm9y
-IHN5bnRoIHNvdW5kcy4uLg0NWW91IGNhbiB1c2UgYSBwaW5jaCBnZXN0dXJlIHRvIHpvb20gaW4gYW5k
-IG91dCBvZiB0aGUgc3VyZmFjZS4gWm9vbWluZyBpbiB3aWxsIGVuYWJsZSB5b3UgdG8gZXhwbG9yZSBz
-bWFsbGVyIGxvY2FsaXRpZXMgb2YgdGhlIHNvdW5kIHNwYWNlLiBab29taW5nIG91dCB3aWxsIGdpdmUg
-eW91IGEgYmlnZ2VyIHBlcnNwZWN0aXZlLCBidXQgb2YgY291cnNlIHRoZSBzb3VuZCB3aWxsIGJlY29t
-ZSBmYXIgbW9yZSByYW5kb20gYW5kIHVuY29udHJvbGxhYmxlIGFzIHlvdSBtb3ZlIGJpZ2dlciBkaXN0
-YW5jZXMuDQ1XaGF0IHdlIGFyZSBhc2tpbmcgeW91LCB0aGUgcGFydGljaXBhbnQsIHRvIGRvIGlzIHVz
-ZSBib3RoIHRoZSB6b29tZXIgYW5kIHRoZSBzbGlkZXJzIGZvciBhYm91dCAxMCBtaW51dGVzIGVhY2gs
-IGFuZCBzYXZlIGFueSBzb3VuZHMgdGhhdCB5b3UgbGlrZS4gQWZ0ZXIgYWJvdXQgMjAgbWludXRlcyBv
-ZiBpbnRlcmFjdGlvbiBhIHByb21wdCB3aWxsIGFwcGVhciBmb3IgYSBzaG9ydCBxdWVzdGlvbm5haXJl
-IHRoYXQgd2lsbCBoZWxwIHVzIGFzc2VzcyB0aGUgaW50ZXJmYWNlIGZ1cnRoZXIuICBBZnRlciB0aGF0
-LCBwbGVhc2UgZmVlbCBmcmVlIHRvIHVzZSBpdCBzb21lIG1vcmU6IHRoZSBtb3JlIGRhdGEgd2UgZ2V0
-IHRoZSBiZXR0ZXIuIE1vcmUgZXhjaXRpbmcgZmVhdHVyZXMgYXJlIHBsYW5uZWQgZm9yIHRoaXMgYXBw
-LCBzbyBwbGVhc2Ugd2F0Y2ggb3V0IGZvciB1cGRhdGVzLg0NTk9URTogWW91ciBhY3Rpb25zIHdpbGwg
-YmUgbG9nZ2VkLCBhbmQgc2VudCB0byBhIHNlY3VyZSBzZXJ2ZXIgaGVyZSBhdCBRdWVlbiBNYXJ5IFVu
-aXZlcnNpdHkuICBIb3dldmVyIG5vIHBlcnNvbmFsIGRhdGEgKG5hbWUsIGVtYWlsIGV0Yy4pIHdpbGwg
-YmUgY29sbGVjdGVkLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRCBvciBzdG9yZWQgaW4gdGhlIGRhdGFi
-YXNlLiBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYXJlIGNvbm5lY3RlZCB0byBXaUZp
-IGludGVybmV0IHdoaWxzdCB1c2luZyB0aGlzIEFwcC4NVG8gY29uc2VudCB0byB0aGlzIHBsZWFzZSBw
-cmVzcyAiQWdyZWUiIGJlbG93LiBUbyBkZWNsaW5lIGp1c3QgZXhpdCB0aGUgYXBwLg0</bytes>
+cmVhdGUgc3ludGhzIHRoYXQgYXJlIGVhc2llciB0byBuYXZpZ2F0ZSwgYW5kIGhvcGVmdWxseSBlbmNv
+dXJhZ2UgY3JlYXRpdml0eS4NDVRoZXJlIGFyZSB0d28gaW50ZXJmYWNlcyBwcmVzZW50ZWQgaGVyZS4g
+VGhlIGZpcnN0IGlzIG9uZSB5b3Ugd2lsbCBwcm9iYWJseSBiZSB1c2VkIHRvIGlmIHlvdSBhcmUgYSBt
+dXNpY2lhbjogMTAgc2xpZGVycyBmb3IgZWFjaCBvZiB0aGUgcGFyYW1ldGVycy4gVGhlIHNlY29uZCBp
+cyBzb21ld2hhdCBuZXc6IGV2ZXJ5IG9uZSBvZiB0aGUgYmlsbGlvbiB0cmlsbGlvbiBwb2ludHMgaGFz
+IGJlZW4gbWFwcGVkIHRvIGEgMkQgc3VyZmFjZSAoaWYgeW91IHJlYWxseSB3YW50IHRvIGtub3cgLSBl
+YWNoIHNxdWFyZSB5b3Ugc2VlIGlzIGEgc3F1YXNoZWQgb3V0IDEwRCBoeXBlcmN1YmUsIGFuZCBhbGwg
+b2YgdGhlIDEwMjQgc3ViLXNxdWFyZXMgYXJlIHRoZSDigJxjb3JuZXJz4oCdIG9mIHRoaXMgMTAtY3Vi
+ZSwgd2hpY2ggdGhlbXNlbHZlcyBhcmUgYnVpbHQgZnJvbSBzbWFsbGVyIGh5cGVyY3ViZXMgYW5kIHNv
+IG9u4oCmKS4gQXMgZmFyIGFzIHBvc3NpYmxlLCB0aGUgZnVydGhlciB5b3UgdHJhdmVsIGFsb25nIHRo
+aXMgMkQgc3VyZmFjZSwgdGhlIG1vcmUgZGlmZmVyZW50IHRoZSBzb3VuZCB3aWxsIGJlY29tZS4NDVVw
+IGRvd24gbW92ZW1lbnQgY29udHJvbHMgdGhlIHN5bnRoIHRpbWJyZSwgbGVmdCByaWdodCBjb250cm9s
+cyB0aGUgc2VxdWVuY2VyLiBXaGVuIHlvdSBjbGljayDigJxzYXZlIHByZXNldOKAnSB5b3Ugd2lsbCBk
+cm9wIGEgcGluIG9udG8gdGhlIHN1cmZhY2UsIGFuZCB5b3UgY2FuIHJldmlzaXQgdGhpcyBwb2ludCBh
+dCBhbnl0aW1lIGJ5IHNjcm9sbGluZyB0byBpdC4gVGhpbmsgb2YgaXQgbGlrZSBhICJHb29nbGUgTWFw
+cyIgZm9yIHN5bnRoIHNvdW5kcy4uLg0NWW91IGNhbiB1c2UgYSBwaW5jaCBnZXN0dXJlIHRvIHpvb20g
+aW4gYW5kIG91dCBvZiB0aGUgc3VyZmFjZS4gWm9vbWluZyBpbiB3aWxsIGVuYWJsZSB5b3UgdG8gZXhw
+bG9yZSBzbWFsbGVyIGxvY2FsaXRpZXMgb2YgdGhlIHNvdW5kIHNwYWNlLiBab29taW5nIG91dCB3aWxs
+IGdpdmUgeW91IGEgYmlnZ2VyIHBlcnNwZWN0aXZlLCBidXQgb2YgY291cnNlIHRoZSBzb3VuZCB3aWxs
+IGJlY29tZSBmYXIgbW9yZSByYW5kb20gYW5kIHVuY29udHJvbGxhYmxlIGFzIHlvdSBtb3ZlIGJpZ2dl
+ciBkaXN0YW5jZXMuDQ1XaGF0IHdlIGFyZSBhc2tpbmcgeW91LCB0aGUgcGFydGljaXBhbnQsIHRvIGRv
+IGlzIHVzZSBib3RoIHRoZSB6b29tZXIgYW5kIHRoZSBzbGlkZXJzIGZvciBhYm91dCAxMCBtaW51dGVz
+IGVhY2gsIGFuZCBzYXZlIGFueSBzb3VuZHMgdGhhdCB5b3UgbGlrZS4gQWxzbyB1c2UgdGhlICJyYW5k
+b21pc2UiIGFuZCAibG9jayIgYnV0dG9ucy4gQWZ0ZXIgYWJvdXQgMjAgbWludXRlcyBvZiBpbnRlcmFj
+dGlvbiBhIHByb21wdCB3aWxsIGFwcGVhciBmb3IgYSBzaG9ydCBxdWVzdGlvbm5haXJlIHRoYXQgd2ls
+bCBoZWxwIHVzIGFzc2VzcyB0aGUgaW50ZXJmYWNlIGZ1cnRoZXIuICBBZnRlciB0aGF0LCBwbGVhc2Ug
+ZmVlbCBmcmVlIHRvIHVzZSBpdCBzb21lIG1vcmU6IHRoZSBtb3JlIGRhdGEgd2UgZ2V0IHRoZSBiZXR0
+ZXIuIE1vcmUgZXhjaXRpbmcgZmVhdHVyZXMgYXJlIHBsYW5uZWQgZm9yIHRoaXMgYXBwLCBzbyBwbGVh
+c2Ugd2F0Y2ggb3V0IGZvciB1cGRhdGVzLg0NTk9URTogWW91ciBhY3Rpb25zIHdpbGwgYmUgbG9nZ2Vk
+LCBhbmQgc2VudCB0byBhIHNlY3VyZSBzZXJ2ZXIgaGVyZSBhdCBRdWVlbiBNYXJ5IFVuaXZlcnNpdHku
+ICBIb3dldmVyIG5vIHBlcnNvbmFsIGRhdGEgKG5hbWUsIGVtYWlsIGV0Yy4pIHdpbGwgYmUgY29sbGVj
+dGVkLCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJRCBvciBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLiBJdCBp
+cyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYXJlIGNvbm5lY3RlZCB0byBXaUZpIGludGVybmV0
+IHdoaWxzdCB1c2luZyB0aGlzIEFwcCwgb3RoZXJ3aXNlIHRoZSBsb2cgZGF0YSB3aWxsIHRha2UgdXAg
+c3BhY2Ugb24geW91ciBkZXZpY2UuDVRvIGNvbnNlbnQgdG8gdGhpcyBwbGVhc2UgcHJlc3MgIkFncmVl
+IiBiZWxvdy4gVG8gZGVjbGluZSBqdXN0IGV4aXQgdGhlIGFwcC4NA</bytes>
 						</object>
 						<object class="NSColor" key="IBUITextColor">
 							<int key="NSColorSpace">1</int>
--- a/Question.h	Fri Feb 01 18:31:43 2013 +0000
+++ b/Question.h	Wed Feb 13 17:03:56 2013 +0000
@@ -5,6 +5,7 @@
 //  Created by Robert Tubb on 21/01/2013.
 //
 // included by Qviewcont
+#define NUM_CHOICES 5
 
 #import <Foundation/Foundation.h>
 typedef enum QuestionType{AGREE_DISAGREE, SLIDERS_ZOOMER} QuestionType;
--- a/Question.m	Fri Feb 01 18:31:43 2013 +0000
+++ b/Question.m	Wed Feb 13 17:03:56 2013 +0000
@@ -42,17 +42,17 @@
 // get the set of answers depending on what type the q was
     // pseudo static variable
     if(type == AGREE_DISAGREE){
-        [Question setCount:6];
+        [Question setCount:NUM_CHOICES];
         return [[NSArray alloc] initWithObjects:
-                    @" ", @"Strongly disagree", @"Disagree", @"Neither",
-                    @"Agree", @"Strongly agree", nil];
+                     @"Strongly agree",@"Agree", @"Neither agree nor disagree",
+                     @"Disagree",@"Strongly disagree", nil];
         
         
     }else if(type == SLIDERS_ZOOMER){
-        [Question setCount:6];
+        [Question setCount:NUM_CHOICES];
         return [[NSArray alloc] initWithObjects:
-                @" ", @"Definitely Sliders", @"Maybe Sliders", @"Neither",
-                @"Maybe Zoomer", @"Definitely Zoomer", nil];
+                 @"definitely the Sliders", @"maybe the Sliders", @"neither",
+                @"maybe the Zoomer", @"definitely the Zoomer", nil];
     }else{
         return nil;
     }
--- a/QuestionnaireViewController.mm	Fri Feb 01 18:31:43 2013 +0000
+++ b/QuestionnaireViewController.mm	Wed Feb 13 17:03:56 2013 +0000
@@ -166,7 +166,7 @@
     
 
     NSLog(@"Prev answer answerInt %d", curQ.answer);
-    [picker selectRow:curQ.answer inComponent:0 animated:YES];
+    [picker selectRow:2 inComponent:0 animated:YES];
 
 }
 //----------------------------------------------------------------
@@ -174,22 +174,23 @@
 
     self.questionArray = [NSArray arrayWithObjects:
                           [[Question alloc] initWithTextAndType:@"I am familiar with music software and sound synthesis.":AGREE_DISAGREE],
-                          [[Question alloc] initWithTextAndType:@"The best way to get a feel for the possibilities of the synth was with:":SLIDERS_ZOOMER],
-                          [[Question alloc] initWithTextAndType:@"Interesting sounds could be discovered more quickly as a result of using:":SLIDERS_ZOOMER],
-                          [[Question alloc] initWithTextAndType:@"A sound could be fine tuned more easily using:":SLIDERS_ZOOMER],
+                          [[Question alloc] initWithTextAndType:@"The best interface to get a feel for the possibilities of the synth was...":SLIDERS_ZOOMER],
+                          [[Question alloc] initWithTextAndType:@"The best interface for discovering interesting sounds quickly was...":SLIDERS_ZOOMER],
+                          [[Question alloc] initWithTextAndType:@"The best interface for fine tuning a sound was...":SLIDERS_ZOOMER],
                           [[Question alloc] initWithTextAndType:@"The correspondence between the sliders and the grid was understandable.":AGREE_DISAGREE],
                           [[Question alloc] initWithTextAndType:@"The interface that felt more familiar was:":SLIDERS_ZOOMER],
-                          [[Question alloc] initWithTextAndType:@"Scrolling a greater distance on the grid seemed to correspond to larger  difference in the sound.":AGREE_DISAGREE],
-                          [[Question alloc] initWithTextAndType:@"The ability to see other presets on the grid was useful.":AGREE_DISAGREE],
-                          [[Question alloc] initWithTextAndType:@"The range of sounds was too limited to be able to judge the eventual usefulness of the interface.":AGREE_DISAGREE],
-                          [[Question alloc] initWithTextAndType:@"The interface better for generating new ideas was":SLIDERS_ZOOMER],
-                          [[Question alloc] initWithTextAndType:@"The interface better for live performance would be:":SLIDERS_ZOOMER],
-                          [[Question alloc] initWithTextAndType:@"A specific type of sound could be found more quickly using:":SLIDERS_ZOOMER],
-                          [[Question alloc] initWithTextAndType:@"I felt more in control when using:":SLIDERS_ZOOMER],
-                          [[Question alloc] initWithTextAndType:@"I felt more creative when using:":SLIDERS_ZOOMER],
+                          [[Question alloc] initWithTextAndType:@"Scrolling a greater distance on the grid seemed to correspond to larger difference in the sound.":AGREE_DISAGREE],
+                          [[Question alloc] initWithTextAndType:@"The interface that I felt more in control using was...":SLIDERS_ZOOMER],
+                          [[Question alloc] initWithTextAndType:@"The ability to see other presets laid on the grid was useful.":AGREE_DISAGREE],  // ????????
+                          [[Question alloc] initWithTextAndType:@"The interface that felt more creative was...":SLIDERS_ZOOMER],
+                          [[Question alloc] initWithTextAndType:@"The range of sounds was too limited/poor quality to be able to judge the eventual usefulness of the interface.":AGREE_DISAGREE],
+                          [[Question alloc] initWithTextAndType:@"The interface better for generating new ideas was...":SLIDERS_ZOOMER], 
+                          [[Question alloc] initWithTextAndType:@"The interface better for performing live would be...":SLIDERS_ZOOMER],
                           [[Question alloc] initWithTextAndType:@"The Zoomer was an improvement on just using a randomiser.":AGREE_DISAGREE],
+                          [[Question alloc] initWithTextAndType:@"The interface better for creating a specific sound I had in mind would be...":SLIDERS_ZOOMER], // not instructed ?????
+                        
                           [[Question alloc] initWithTextAndType:@"The combination of Zoomer and Sliders was better than either individually.":AGREE_DISAGREE],
-                          [[Question alloc] initWithTextAndType:@"Overall, I preferred using:":SLIDERS_ZOOMER],
+                          [[Question alloc] initWithTextAndType:@"Overall, the interface I preferred using was...":SLIDERS_ZOOMER], // ??????
                           nil];
  
 }
@@ -207,7 +208,8 @@
 - (NSInteger)pickerView:(UIPickerView *)pickerView
 numberOfRowsInComponent:(NSInteger)component
 {
-    return 6; // always 6 
+
+    return NUM_CHOICES; // always 6
 }
 //----------------------------------------------------------------
 - (NSString *)pickerView:(UIPickerView *)pickerView
--- a/QuestionnaireViewController.xib	Fri Feb 01 18:31:43 2013 +0000
+++ b/QuestionnaireViewController.xib	Wed Feb 13 17:03:56 2013 +0000
@@ -40,7 +40,7 @@
 					<object class="IBUIButton" id="871929113">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">292</int>
-						<string key="NSFrame">{{315, 645}, {121, 44}}</string>
+						<string key="NSFrame">{{627, 933}, {121, 44}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
@@ -75,10 +75,10 @@
 					<object class="IBUILabel" id="783180915">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">292</int>
-						<string key="NSFrame">{{91, 51}, {212, 53}}</string>
+						<string key="NSFrame">{{212, 226}, {212, 53}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView" ref="791686696"/>
+						<reference key="NSNextKeyView" ref="838658605"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<bool key="IBUIOpaque">NO</bool>
 						<bool key="IBUIClipsSubviews">YES</bool>
@@ -108,10 +108,10 @@
 					<object class="IBUILabel" id="838658605">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">292</int>
-						<string key="NSFrame">{{91, 101}, {334, 125}}</string>
+						<string key="NSFrame">{{212, 276}, {334, 125}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView" ref="356964106"/>
+						<reference key="NSNextKeyView" ref="791686696"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<bool key="IBUIOpaque">NO</bool>
 						<bool key="IBUIClipsSubviews">YES</bool>
@@ -141,7 +141,7 @@
 					<object class="IBUIButton" id="960474577">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">292</int>
-						<string key="NSFrame">{{315, 490}, {121, 44}}</string>
+						<string key="NSFrame">{{436, 706}, {121, 44}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView" ref="871929113"/>
@@ -164,7 +164,7 @@
 					<object class="IBUIButton" id="356964106">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">292</int>
-						<string key="NSFrame">{{97, 490}, {157, 44}}</string>
+						<string key="NSFrame">{{218, 706}, {157, 44}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
 						<reference key="NSNextKeyView" ref="960474577"/>
@@ -188,10 +188,10 @@
 					<object class="IBUIPickerView" id="791686696">
 						<reference key="NSNextResponder" ref="766721923"/>
 						<int key="NSvFlags">290</int>
-						<string key="NSFrame">{{91, 234}, {334, 216}}</string>
+						<string key="NSFrame">{{212, 409}, {334, 216}}</string>
 						<reference key="NSSuperview" ref="766721923"/>
 						<reference key="NSWindow"/>
-						<reference key="NSNextKeyView" ref="838658605"/>
+						<reference key="NSNextKeyView" ref="356964106"/>
 						<string key="NSReuseIdentifierKey">_NS:9</string>
 						<string key="targetRuntimeIdentifier">IBIPadFramework</string>
 						<bool key="IBUIShowsSelectionIndicator">YES</bool>
@@ -352,12 +352,12 @@
 						<int key="objectID">2</int>
 						<reference key="object" ref="766721923"/>
 						<array class="NSMutableArray" key="children">
+							<reference ref="871929113"/>
 							<reference ref="783180915"/>
 							<reference ref="838658605"/>
+							<reference ref="960474577"/>
+							<reference ref="356964106"/>
 							<reference ref="791686696"/>
-							<reference ref="960474577"/>
-							<reference ref="871929113"/>
-							<reference ref="356964106"/>
 						</array>
 						<reference key="parent" ref="0"/>
 					</object>
@@ -413,7 +413,7 @@
 			<nil key="activeLocalization"/>
 			<dictionary class="NSMutableDictionary" key="localizations"/>
 			<nil key="sourceID"/>
-			<int key="maxID">60</int>
+			<int key="maxID">61</int>
 		</object>
 		<object class="IBClassDescriber" key="IBDocument.Classes">
 			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
--- a/TopButtonViewController.h	Fri Feb 01 18:31:43 2013 +0000
+++ b/TopButtonViewController.h	Wed Feb 13 17:03:56 2013 +0000
@@ -12,7 +12,6 @@
 @interface TopButtonViewController : UIViewController
 
 @property (nonatomic, assign)       id theOFAppRef;
-@property (nonatomic, strong)       HelpViewController * helpViewController;
 
 @property (retain, nonatomic) IBOutlet UIBarButtonItem *playButton;
 @property (retain, nonatomic) IBOutlet UIBarButtonItem *pauseButton;
@@ -29,5 +28,6 @@
 - (IBAction)qPressed:(id)sender;
 - (IBAction)randomise:(id)sender;
 - (IBAction)helpPressed:(id)sender;
+- (IBAction)newUser:(id)sender;
 
 @end
--- a/TopButtonViewController.mm	Fri Feb 01 18:31:43 2013 +0000
+++ b/TopButtonViewController.mm	Wed Feb 13 17:03:56 2013 +0000
@@ -104,12 +104,12 @@
 }
 
 - (IBAction)helpPressed:(id)sender {
-    [self.helpViewController.view show:self];
- 
-    self.helpViewController	= [[HelpViewController alloc] initWithNibName:@"HelpViewController" bundle:nil];
-    [self.view addSubview:self.helpViewController.view];
+    ((testApp *)self.theOFAppRef)->showHelp();
 
-    [self.helpViewController show:self];
+}
+
+- (IBAction)newUser:(id)sender {
+    ((testApp *)self.theOFAppRef)->setupNewUser();
 }
 
 - (IBAction)show:(id)sender
@@ -124,10 +124,10 @@
  [helpViewController hide:(id)this];
  */
 - (void)dealloc {
-    [_helpViewController release];
     [_playButton release];
     [_pauseButton release];
     [_qButton release];
+
     [super dealloc];
 }
 - (void)viewDidUnload {
--- a/TopButtonViewController.xib	Fri Feb 01 18:31:43 2013 +0000
+++ b/TopButtonViewController.xib	Wed Feb 13 17:03:56 2013 +0000
@@ -59,8 +59,14 @@
 								<int key="IBUIStyle">1</int>
 								<reference key="IBUIToolbar" ref="358683122"/>
 							</object>
+							<object class="IBUIBarButtonItem" id="319053509">
+								<string key="IBUITitle">New User</string>
+								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
+								<int key="IBUIStyle">1</int>
+								<reference key="IBUIToolbar" ref="358683122"/>
+							</object>
 							<object class="IBUIBarButtonItem" id="702923516">
-								<string key="IBUITitle">Take Questionnaire</string>
+								<string key="IBUITitle">Questionnaire</string>
 								<string key="targetRuntimeIdentifier">IBIPadFramework</string>
 								<int key="IBUIStyle">1</int>
 								<reference key="IBUIToolbar" ref="358683122"/>
@@ -221,6 +227,14 @@
 					</object>
 					<int key="connectionID">34</int>
 				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchEventConnection" key="connection">
+						<string key="label">newUser:</string>
+						<reference key="source" ref="319053509"/>
+						<reference key="destination" ref="841351856"/>
+					</object>
+					<int key="connectionID">38</int>
+				</object>
 			</array>
 			<object class="IBMutableOrderedSet" key="objectRecords">
 				<array key="orderedObjects">
@@ -263,6 +277,7 @@
 							<reference ref="898331149"/>
 							<reference ref="180077124"/>
 							<reference ref="924591997"/>
+							<reference ref="319053509"/>
 						</array>
 						<reference key="parent" ref="766721923"/>
 					</object>
@@ -316,6 +331,11 @@
 						<reference key="object" ref="924591997"/>
 						<reference key="parent" ref="358683122"/>
 					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">35</int>
+						<reference key="object" ref="319053509"/>
+						<reference key="parent" ref="358683122"/>
+					</object>
 				</array>
 			</object>
 			<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -332,6 +352,7 @@
 				<string key="29.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="30.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="33.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="35.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="4.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
 				<string key="9.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
@@ -340,7 +361,7 @@
 			<nil key="activeLocalization"/>
 			<dictionary class="NSMutableDictionary" key="localizations"/>
 			<nil key="sourceID"/>
-			<int key="maxID">34</int>
+			<int key="maxID">38</int>
 		</object>
 		<object class="IBClassDescriber" key="IBDocument.Classes">
 			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -351,6 +372,7 @@
 						<string key="helpPressed:">id</string>
 						<string key="lockSequencePressed:">id</string>
 						<string key="lockSynthPressed:">id</string>
+						<string key="newUser:">id</string>
 						<string key="pausePressed:">id</string>
 						<string key="playPressed:">id</string>
 						<string key="qPressed:">id</string>
@@ -371,6 +393,10 @@
 							<string key="name">lockSynthPressed:</string>
 							<string key="candidateClassName">id</string>
 						</object>
+						<object class="IBActionInfo" key="newUser:">
+							<string key="name">newUser:</string>
+							<string key="candidateClassName">id</string>
+						</object>
 						<object class="IBActionInfo" key="pausePressed:">
 							<string key="name">pausePressed:</string>
 							<string key="candidateClassName">id</string>
--- a/eventLogger.h	Fri Feb 01 18:31:43 2013 +0000
+++ b/eventLogger.h	Wed Feb 13 17:03:56 2013 +0000
@@ -56,7 +56,8 @@
     SEQ_LOCKED,             // 15
     SYNTH_LOCKED,           // 16
     PLAY_PRESSED,           // 17
-    PAUSE_PRESSED};         // 18
+    PAUSE_PRESSED,         // 18
+    HELP_PRESSED};          // 19
 
 //---------------------------------------------------------------------------
 
@@ -132,26 +133,28 @@
 public:
     int nextUploadNumber;
     bool loggingEnabled;
+    bool logUploadInProgress;
     bool serverConnectionOK;
     bool consentGiven;
     unsigned int deviceID; // unique get something from hardware??
     unsigned int totalInteractionTime, savedInteractionTime, sessionTime, sessionStartTime;
     string userName; // not unique
-    
+
     EventLogger();
     void init();
     void exitAndSave();
     void setUsername(const char *u);
+    void newUser();
     void logEvent(const leventType& evtType,const TwoVector& centre = TwoVector(), const double& scale = 1.0, const int& sliderID = -1, const double& sliderVal = 0.0);
     void questionnaireAnswersObtained(vector<int> answers);
-    
+    void urlResponse(ofHttpResponse & response);
 private:
     // what we need...
     /*
      time, type, value
      */
 
-    
+    int currentHTTPRequestID;
     vector<lEvent> theEvents;
     
     
@@ -167,12 +170,13 @@
     bool questionnaireCompleted;
     bool questionnaireUploaded;
 
+    
     void checkLogFile();
-    bool uploadEventLog();
+    bool uploadEventLog(bool async);
     void firstEverAppOpen();
     void readJsonToLog(const string &jsonFile);
-    bool uploadQuestionnaire();
-    bool sendToServer(string functionName, Json::Value jsonData);
+    void uploadQuestionnaire();
+    bool sendToServer(string functionName, Json::Value jsonData, bool async);
     Json::Value logsToJson();
     Json::Value questionnaireToJson();
     void printAll(){
--- a/eventLogger.mm	Fri Feb 01 18:31:43 2013 +0000
+++ b/eventLogger.mm	Wed Feb 13 17:03:56 2013 +0000
@@ -20,12 +20,13 @@
     serverConnectionOK = false;
     questionnaireCompleted = false;
     questionnaireUploaded = false;
-    
-    
+    currentHTTPRequestID = -1;
+    logUploadInProgress = false;
     ofxiPhoneDeviceType iOSdeviceType = ofxiPhoneGetDeviceType();
     cout << "Device: " << iOSdeviceType << '\n';
     
     nextUploadQty = UPLOAD_CHUNK_SIZE; // amount of data uploaded is always more than UPLOAD_CHUNK_SIZE events
+    
 }
 //---------------------------------------------------------------------------
 // draw() - show path of last N scroll events  - can be scrubbed along?
@@ -50,15 +51,15 @@
     
 }
 //---------------------------------------------------------------------------
-bool EventLogger::uploadQuestionnaire(){
+void EventLogger::uploadQuestionnaire(){
     // show indicator
     cout << "^^^^^^^^ UPLOADING QUESTIONNAIRE ^^^^^^^^ \n";
     
-    questionnaireUploaded = sendToServer("questionnaire", questionnaireToJson());
-    return questionnaireUploaded;
+    sendToServer("questionnaire", questionnaireToJson(), true);
+
 }
 //---------------------------------------------------------------------------
-bool EventLogger::sendToServer(string functionName, Json::Value jsonData){
+bool EventLogger::sendToServer(string functionName, Json::Value jsonData, bool async = false){
     bool sent;
     string request;
 
@@ -72,25 +73,63 @@
     Json::FastWriter writer;
     string jsontext = writer.write( jsonData );
     
+    // remove newline
     if (!jsontext.empty() && jsontext[jsontext.length()-1] == '\n') {
         jsontext.erase(jsontext.length()-1);
     }
 
     request.append(jsontext);
+    
+    if(!async){
+        ofURLFileLoader fileLoader;
+        ofHttpResponse resp;
+        resp = fileLoader.get(request);
 
-    ofURLFileLoader fileLoader;
-    ofHttpResponse resp;
-    resp = fileLoader.get(request);
-    //fileLoader.getAsync(request);
-    cout << "HTTP STATUS  " << resp.status << "\n";
-    cout << "HTTP ERROR  " << resp.error << "\n";
-    cout << "HTTP DATA  " << resp.data << "\n"; // ofBuffer
+        cout << "HTTP STATUS  " << resp.status << "\n";
+        cout << "HTTP ERROR  " << resp.error << "\n";
+        cout << "HTTP DATA  " << resp.data << "\n"; // ofBuffer
+        
+        stringstream response;
+        response << resp.data;
+        
+        if (resp.status == 200){
+            if(response.str() == "OK"){
+                
+                sent = true;
+            }else{
+                // not ok
+                // problem serverside
+                sent = false;
+            }
+        }else{
+            
+            sent = false;
+            // SHOW AN ALERT TO USER?
+        }
+        
+        return sent;
+    }else{ // async
+        ofURLFileLoader fileLoader;
+        currentHTTPRequestID = ofLoadURLAsync(request, functionName);
+        ofRegisterURLNotification(this);
+        
+        return true; // ???
+    }
+}
+//-----------------------------
+void EventLogger::urlResponse(ofHttpResponse & response){
+    cout << "gotHTTPRequestStatus\n";
+    cout << "HTTP REQUEST NAME  " << response.request.name << "\n";
+    cout << "HTTP STATUS  " << response.status << "\n";
+    cout << "HTTP ERROR  " << response.error << "\n";
+    cout << "HTTP DATA  " << response.data << "\n"; // ofBuffer
     
-    stringstream response;
-    response << resp.data;
+    bool sent;
+    stringstream respStr;
+    respStr << response.data;
     
-    if (resp.status == 200){
-        if(response.str() == "OK"){
+    if (response.status == 200){
+        if(respStr.str() == "OK"){
             
             sent = true;
         }else{
@@ -103,7 +142,36 @@
         sent = false;
         // SHOW AN ALERT TO USER?
     }
-    return sent;
+
+    // now do request specific stuff
+    if(response.request.name == "eventlog"){
+        if(!sent){
+            // try later
+            nextUploadQty += UPLOAD_CHUNK_SIZE;
+        }else{
+            
+            // if success - clear memory
+            theEvents.clear();
+            cout << "UPLOAD SUCCESS\n";
+            nextUploadNumber++;
+        }
+        logUploadInProgress = false;
+    }else if(response.request.name == "questionnaire"){
+        if(sent){
+            questionnaireUploaded = true;
+        }else{
+            questionnaireUploaded = false; // will try next time... when?
+        }
+    }else if(response.request.name == "testConnection"){
+        
+        if (sent){
+            cout << "^^^^^^^^ server connection OK ^^^^^^^^ \n";
+            serverConnectionOK = true;
+        }else{
+            cout << "server connection ERROR \n";
+        }
+    }
+
 }
 //---------------------------------------------------------------------------
 bool EventLogger::testConnection(){
@@ -111,12 +179,8 @@
     root["test"] = "test";
     
     
-    serverConnectionOK = sendToServer("testConnection", root);
-    if (serverConnectionOK){
-        cout << "^^^^^^^^ server connection OK ^^^^^^^^ \n";
-    }else{
-         cout << "server connection ERROR \n";
-    }
+    sendToServer("testConnection", root, true);
+
 }
 //---------------------------------------------------------------------------
 void EventLogger::readJsonToLog(const string &jsonFile){
@@ -179,9 +243,9 @@
     const Json::Value jlogs = root["events"];
     
     for ( int index = 0; index < jlogs.size(); ++index ) theEvents.push_back(lEvent(jlogs[index]));
-    if(theEvents.size() > nextUploadQty){
+    if(theEvents.size() > nextUploadQty && ! logUploadInProgress){
         //try to upload
-        uploadEventLog();
+        uploadEventLog(true);
     }
     // TODO if the total interaction time is greater than a certain amount && no questions answered - questionnaire time!
     cout << "Total interaction time: " << savedInteractionTime << '\n';
@@ -192,26 +256,31 @@
 
 //---------------------------------------------------------------------------
 
-bool EventLogger::uploadEventLog(){
+bool EventLogger::uploadEventLog(bool async){
     // show indicator
-    
+    logUploadInProgress = true;
     cout << "^^^^^^^^  ATTEMPTING TO UPLOAD " << theEvents.size() << " EVENTS ^^^^^^^^ .\n";
-    
-    bool logUploaded = sendToServer("eventlog", logsToJson());
-    if(!logUploaded){
-        // try later
-        nextUploadQty += UPLOAD_CHUNK_SIZE;
+    if(!async){
+        bool success = sendToServer("eventlog", logsToJson(), async);
+        if(!success){
+            // try later
+            nextUploadQty += UPLOAD_CHUNK_SIZE;
+        }else{
+            
+            // if success - clear memory
+            theEvents.clear();
+            cout << "UPLOAD SUCCESS\n";
+            nextUploadNumber++;
+        }
+        logUploadInProgress = false;
+        return success;
     }else{
-        
-        // if success - clear memory
-        theEvents.clear();
-        cout << "UPLOAD SUCCESS\n";
-        nextUploadNumber++;
+        sendToServer("eventlog", logsToJson(), async);
     }
-    return logUploaded;
-    
 }
 //----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
 //void EventLogger::deleteLogFile(){
 
 //---------------------------------------------------------------------------
@@ -228,6 +297,17 @@
     consentGiven = false;
     
 }
+void EventLogger::newUser(){
+    cout<<"setup new user\n";
+    nextUploadNumber = 0;
+    deviceID = ofGetSystemTimeMicros();
+    savedInteractionTime = 0;
+    questionnaireCompleted = false;
+    questionnaireUploaded = false;
+    consentGiven = true; // other wise we wouldn't be doing this
+    ((testApp *)ofGetAppPtr())->introHidden(true); // hacky
+    
+}
 //---------------------------------------------------------------------------
 // called from alertView OK in iViewController
 void EventLogger::setUsername(const char *u){
@@ -283,9 +363,9 @@
             theEvents.push_back(lEvent(evtType));
             break;
     }
-    if(theEvents.size() > nextUploadQty){
-        //try to upload
-        uploadEventLog();
+    if(theEvents.size() > nextUploadQty && !logUploadInProgress){
+        //try to upload asynchronously
+        uploadEventLog(true);
     }
     //sessionTime = (ofGetSystemTime() - sessionStartTime);
     totalInteractionTime = savedInteractionTime + (ofGetSystemTime() - sessionStartTime);
@@ -303,7 +383,7 @@
         logEvent(CONSENT_DENIED);
         Json::Value jlogs = logsToJson();
         // try to upload TODO (no - might hang and prevent exit???)
-        uploadEventLog();
+        uploadEventLog(true);
         return;
     }
     logEvent(APP_EXITED);
@@ -312,7 +392,8 @@
     string fname = ofxiPhoneGetDocumentsDirectory() + EVENT_LOG_FILENAME;
 
     // try to upload TODO (no - might hang and prevent exit???)
-    uploadEventLog();
+    // do it async because event list needs to be cleared to prevent saving on device
+    uploadEventLog(false);
     
     // write to file
     // json without the logs that were uploaded!
--- a/grid.mm	Fri Feb 01 18:31:43 2013 +0000
+++ b/grid.mm	Wed Feb 13 17:03:56 2013 +0000
@@ -33,7 +33,7 @@
     pixSize.setCoord(ofGetWidth(), ofGetHeight());
  
     //set scale and position to mid way
-    scale = 5500.0;
+    scale = 15500.0;
     snapDist = TwoVector(9,9);
     snapped = false;
     
--- a/presetManager.h	Fri Feb 01 18:31:43 2013 +0000
+++ b/presetManager.h	Wed Feb 13 17:03:56 2013 +0000
@@ -104,9 +104,9 @@
     // names values
     // check if already there
     // find and return all(?) presets within a certain coordinate range
-    vector<Preset *> thePresets; // we want vector ? or list? pointers using new?
+    vector<Preset *> thePresets; 
     
-    int addPreset(string name); // returns id or negative error number
+    int addPreset(string name); 
     int loadPreset(const TwoVector coord, const string name, long long stime);
     
     TwoVector recallPreset(int presetID); // by name ? id?
--- a/presetManager.mm	Fri Feb 01 18:31:43 2013 +0000
+++ b/presetManager.mm	Wed Feb 13 17:03:56 2013 +0000
@@ -110,7 +110,7 @@
         root["presets"][i] = (*presetIter)->presetToJson();
         i++;
     }
-    
+
     return root;
 }
 //---------------------------------------------------------------------------
--- a/testApp.h	Fri Feb 01 18:31:43 2013 +0000
+++ b/testApp.h	Wed Feb 13 17:03:56 2013 +0000
@@ -21,6 +21,7 @@
 #import "QuestionnaireViewController.h"
 #import "BottomTabViewController.h"
 #import "IntroViewController.h"
+#import "HelpViewController.h"
 #import "TopButtonViewController.h"
 #import "SliderViewController.h"
 #import "usernameAlertViewController.h"
@@ -39,6 +40,11 @@
     BottomTabViewController *bottomTabViewController;
     UsernameAlertViewController *usernameAlertViewController;
     HelpViewController *helpViewController;
+    QuestionnaireViewController * questionnaireViewController;
+    IntroViewController * introViewController;
+    TopButtonViewController * topButtonViewController;
+    SliderViewController * sliderViewController;
+    
     int prevTouchX;
     int prevTouchY;
     double prevDist;
@@ -65,11 +71,9 @@
     vector<int> freqIndexes;
     
     int numActiveTouches;
-    
-    QuestionnaireViewController * questionnaireViewController;
-    IntroViewController * introViewController;
-    TopButtonViewController * topButtonViewController;
-    SliderViewController * sliderViewController;
+    bool preventingMovePostScroll;
+
+
     //
     
     void setup();
@@ -99,6 +103,8 @@
     ofxOscSender sender;
     void sendOSCParams();
     
+    void setupNewUser();
+    
     void lockSynthPressed(bool locked);
     void lockSequencerPressed(bool locked);
     
@@ -108,6 +114,8 @@
     void introHidden(bool OK);
     void interfaceSelected(int which);
     void seqStartStop(bool go);
+    void showHelp();
+    void helpHidden();
     
     void setupBottomGui();
     void bottomGuiEvent();
--- a/testApp.mm	Fri Feb 01 18:31:43 2013 +0000
+++ b/testApp.mm	Wed Feb 13 17:03:56 2013 +0000
@@ -42,7 +42,7 @@
     prevTouch1.setCoord(10,20);
     prevDist = 10;
     slowFactor = 0.98;
-    
+    preventingMovePostScroll = false;
     
     // the 5 harmonics for the frequencer
     freqIndexes.push_back(0);
@@ -96,6 +96,11 @@
     
     usernameAlertViewController = [[UsernameAlertViewController alloc] init];
     
+    helpViewController	= [[HelpViewController alloc] initWithNibName:@"HelpViewController" bundle:nil];
+    [ofxiPhoneGetGLParentView() addSubview:helpViewController.view];
+    [helpViewController setAppRef:(id)this];
+    helpViewController.view.hidden = YES;
+    
     /*
     sliderViewController	= [[SliderViewController alloc] initWithNibName:@"SLiderViewController" bundle:nil];
     [ofxiPhoneGetGLParentView() addSubview:sliderViewController.view];
@@ -110,7 +115,8 @@
     presetManager.startupLoadAll();
     eventLogger.init();
     
-    whichInterfaceShowing = BOTH;
+    whichInterfaceShowing = SLIDERS;
+    setAllGUISliders(theGridView.getParams());
     // GO
     paused = false;
     
@@ -187,12 +193,11 @@
 
     // if(eventLogger.questionnaireCompleted) return;
     
-    paused = true;
+    paused = true; // need to set button
+    [topButtonViewController pausePressed:(id)this];
     
     //stopSequencer
-    core.pd.startMessage();
-    core.pd.addFloat(0);
-    core.pd.finishMessage("fromOF", "seqStartStop");
+    seqStartStop(false);
     
     questionnaireViewController	= [[QuestionnaireViewController alloc] initWithNibName:@"QuestionnaireViewController" bundle:nil];
     [ofxiPhoneGetGLParentView() addSubview:questionnaireViewController.view];
@@ -211,11 +216,7 @@
     
     // set "we've done questionnaire" to true in event logger
     paused = false;
-    
-    //startSequencer (TODO what about the toggle ? ?)
-    core.pd.startMessage();
-    core.pd.addFloat(1);
-    core.pd.finishMessage("fromOF", "seqStartStop");
+
     whichInterfaceShowing = BOTH;
     // tell bottomtabviewcontroller
     
@@ -239,7 +240,6 @@
 //--------------------------------------------------------------
 void testApp::introHidden(bool OK){
     if(OK){
-        paused = false;
         eventLogger.consentGiven = true;
         whichInterfaceShowing = BOTH;
         // show username prompt
@@ -369,6 +369,19 @@
     eventLogger.logEvent(RANDOMISE, theGridView.getCoord() ,0.0);
     
 }
+//-
+void testApp::showHelp(){
+    paused = true;
+    seqStartStop(false);
+    [topButtonViewController pausePressed:(id)this];
+    helpViewController.view.hidden = NO;
+    eventLogger.logEvent(HELP_PRESSED);
+}
+void testApp::helpHidden(){
+    paused = false;
+    // start seq?
+    
+}
 //--------------------------------------------------------------
 void testApp::sendParametersToPD(){
     // frequencer stuff to get 16 steps
@@ -398,22 +411,18 @@
     sendModFreq(sliderVals[9]);
     
 }
+void testApp::setupNewUser(){
+    // this function is for supervised trials with my ipad
+    eventLogger.newUser();
+}
 //--------------------------------------------------------------
 #pragma mark STANDARD OF FUNCTIONS
 //--------------------------------------------------------------
 void testApp::update(){
-	//we do a heartbeat on iOS as the phone will shut down the network connection to save power
-	//this keeps the network alive as it thinks it is being used.
+
     if(paused) return;
     
-	if( ofGetFrameNum() % 120 == 0 ){
-		ofxOscMessage m;
-		m.setAddress( "/misc/heartbeat" );
-		m.addIntArg( ofGetFrameNum() );
-		sender.sendMessage( m );
-	}
-    
-    // continiue to move at velocity, unless snapped
+    // continiue to move or zoom at velocity, unless snapped
     
     if (numActiveTouches == 0){ // no touches, use momentum
 
@@ -484,14 +493,12 @@
             break;
             
     }
-
     
 }
 
 //--------------------------------------------------------------
 void testApp::touchDown(ofTouchEventArgs &touch){
-
-    // TODO check if in gui area!!!
+    // in slider gui area?
     if(whichInterfaceShowing == SLIDERS){
         return;
     }else if (whichInterfaceShowing == BOTH && touch.x < (SLIDER_GUI_WIDTH+10)){
@@ -500,8 +507,8 @@
     }// otherwise we're good to let the zoomer handle touch
     
     numActiveTouches++;
-    // absolute position doesn't matter
-    // which one?
+    preventingMovePostScroll = false;
+
     if(touch.id == 0){
         touch0.setCoord(touch.x,touch.y);
         prevTouch0 = touch0;
@@ -515,6 +522,7 @@
         moveVel.setCoord(0.0, 0.0);
         prevMove.setCoord(0.0, 0.0);
         prevMove2.setCoord(0.0, 0.0);
+        
     }else if(numActiveTouches == 2){
         zoomVel = 0.0;
         prevZoom = 0.0;
@@ -534,13 +542,9 @@
     }else if (whichInterfaceShowing == BOTH && touch.x < (SLIDER_GUI_WIDTH+10)){
         return;
         
-    }// otherwise we're good to let the zoomer handle touch
+    }
     
-
-    // check if in other gui area
-    if(touch.x > getWidth()-200 && touch.y < 300){
-        return;
-    }
+    // otherwise we're good to let the zoomer handle touch
 
     // which one? keep track of each touch point
     if(touch.id == 0){
@@ -552,7 +556,7 @@
     }
 
     if(numActiveTouches == 1){
-
+        if(preventingMovePostScroll) return;
         handleScroll();
     }else if(numActiveTouches == 2){
         handleZoom();
@@ -564,6 +568,7 @@
 }
 
 //--------------------------------------------------------------
+// handle a finger being dragged
 void testApp::handleScroll(){
 
     TwoVector move = touch0 - prevTouch0;
@@ -596,6 +601,7 @@
     sendParametersToPD();
 }
 //--------------------------------------------------------------
+// handle pinch movememnt
 void testApp::handleZoom(){
     // work out change in difference
     double dist = touch1.distanceTo(touch0);
@@ -619,7 +625,7 @@
 //--------------------------------------------------------------
 void testApp::touchUp(ofTouchEventArgs &touch){
     if(numActiveTouches > 0) numActiveTouches--; // dirty
-    
+    preventingMovePostScroll = false;
     // TODO check if in gui area!!!
     if(whichInterfaceShowing == SLIDERS){
         return;
@@ -651,6 +657,10 @@
             
         }
         lastMoveTime = moveTime;
+    }else if (numActiveTouches == 1){
+        // just zoomed , but now lifted one of the fingers
+        // can be bad if moved so create special mode to stop scroll  (special modes bad!)
+        preventingMovePostScroll = true;
     }
 
 }