ONEHAT.widget.Contact = function() {
	var obj = {
		init: function() {
			var oThis = this;
			
			// Get elements to work with
			this.form = Ext.get('feedbackForm');
			this.custName = Ext.get(this.form.dom.custName);
			this.phone = Ext.get(this.form.dom.phone);
			this.email = Ext.get(this.form.dom.email);
			this.hear = Ext.get(this.form.dom.hear);
			this.comments = Ext.get(this.form.dom.comments);
						
			// Assign event handlers
			this.form.on('submit', function(e) {
				oThis.handleSubmit(e);
			});

			if (typeof GEvent !== 'undefined') {
				this.initMap();
			}

		},
				
		handleSubmit: function(e) {
			e.stopEvent();
			
			var oThis = this;
			var el;
			
			try {
				// check for validity of form elements
				el = this.custName;
				if (el.dom.value === '') { throw new Error('Please enter your name.'); }
				if (!el.dom.value.match(this.patterns.title.pattern)) { throw new Error('Problem with Name field. Please use ' + this.patterns.title.errmsg); }
				
				el = this.phone;				
				if (el.dom.value === '' && this.email.dom.value === '') { throw new Error('Please give us a way to get in touch with you&mdash;either email or phone.'); }
				if (el.dom.value !== '') {
					if (!el.dom.value.match(this.patterns.phone.pattern)) { throw new Error('Problem with Phone field. Please use ' + this.patterns.phone.errmsg); }
				}

				el = this.email;
				if (el.dom.value !== '') {
					if (!el.dom.value.match(this.patterns.email.pattern)) { throw new Error('Problem with Email field. Please use ' + this.patterns.email.errmsg); }
				}

				el = this.comments;				
				if (el.dom.value === '') { throw new Error('Please enter a message.'); }
				
			} catch (err) {
				Ext.Msg.alert('Error', err.message, function() {
					el.focus();
					el.highlight();
				});
				return false;
			}
			
			// send request to get location data
			this.ajax = Ext.Ajax.request({
				url: 'ajax/contact/form/handle',
				method: 'POST',
				success: handleSuccess,
				failure: function(a){
					Ext.Msg.alert('Error', a.msg);
				},
				scope: oThis,
				params: {},
				form: this.form
			});
			
			function handleSuccess(a, b) {
				var data = eval(arguments[0].responseText);
				Ext.Msg.alert('Success', data.msg);
			}
		},
		
		initMap: function() {
			var GoogleMap = function() {
				oThis = this;
				if (GBrowserIsCompatible()) {
					// set point on earth
					var latLng = new GLatLng(40.688957, -89.586487);
				
					// create map
					this.map = new GMap2(document.getElementById("map"));
					this.map.setCenter(latLng, 14);
					this.map.addControl(new GSmallMapControl());
					//this.map.addControl(new GMapTypeControl());
					
					// create marker & set params
					var marker = new GMarker(latLng);
					this.map.addOverlay(marker);
					marker.openInfoWindowHtml(
						'<div id="infoWindow">'
						+ '<img src="images/contact/spiritlogo.png" width="80" height="33" class="floatRight" />'
						+ '<h2>Spirit of Peoria</h2>'
						+ '<p>100 Water Street<br />'
						+ 'Peoria, IL 61602</p>'
						+ '</div>'
					);		
				}
			};
			
			var googleMap = new GoogleMap();
			
		},
		
		patterns: {
			title: {
				pattern	: /^[\w\s\-\/\'\",\.!]{1,}$/,
				errmsg	: 'only letters, numbers, dashes, quotes, exclamation marks, or the underscore'
			},
			paragraph: {
				pattern	: /^[\w\s\.\(\)\'\"\!\?\$\/,:;&@<>#\-]{1,}$/,
				errmsg	: 'letters, numbers, spaces, or standard punctuation'
			},
			email: {
				pattern	: /^([\w\.\-\_]+)@[a-zA-Z0-9\.\-]+\.[a-zA-Z]{2,4}$/,
				errmsg	: 'a valid email address'
			},
			zip: {
				pattern	: /^([0-9]{5})(-[0-9]{4})?$/,
				errmsg	: 'a valid zip code'
			},
			message: {
				pattern	: /^[\w\s\.\,\'\"\?\!]{1,}$/,
				errmsg	: 'letters, numbers, spaces, or the following: .,\'"?!'
			},
			stateAbbr: {
				pattern	: /^A[LKSZR]|C[AOT]|D[EC]|F[ML]|G[AU]|HI|I[DLNA]|K[SY]|LA|M[EHDAINSOT]|N[EVHJMYCD]|MP|O[KHR]|P[WAR]|RI|S[CD]|T[NX]|UT|V[TIA]|W[AIVY]$/,
				errmsg	: 'a valid US state abbreviation'
			},
			street: {
				pattern	: /^[\w\s\.\-\/]{1,128}$/,
				errmsg	: 'a valid US street address'
			},
			phone: {
				pattern	: /^(\(?[0-9]{3}\)?)?[\s\.\-]?[0-9]{3}[\s\.\-]?[0-9]{4}$/,
				errmsg	: 'a valid US phone number'
			}
		} // end patterns
	};
	obj.init();
	return obj;
}();