(function ($) {
	
	$.registerForm = function (options) {
		return $.registerForm.impl.init(options);
	};
	
	$.fn.registerForm = function (options) {
		return $.registerForm.impl.init(this, options);
	};
	
	/*
	 * registerForm default options
	 */
	$.registerForm.defaults = {
	    
	};
	
	$.registerForm.impl = {
		
		/*
		 * registerForm options
		 */
		opts: null,
		
		/*
		 * registerForm helper
		 */
		helper: {},
		
		/*
		 * Initialize the registerForm
		 */
		init: function (options) {
            
            var self    = this;
            
            self.opts = $.extend({}, $.registerForm.defaults, options);
            
            // create the helper objects
            self.helper.container       = $('div.register-container');
            self.helper.overlay         = $('<div class="modal-overlay"></div>');
            self.helper.form            = $('div.register-form');
            self.helper.entry           = self.helper.form.find('div.form-entry');
            self.helper.confirmation    = self.helper.form.find('div.form-confirmation');
            
            // bind submit click
            self.helper.form.find('#btnRegisterSubmit').click(function(e){
			    e.preventDefault();
			    
			    if (self.helper.form.find('input:checkbox[id="chkTerms"]').attr('checked'))
			        self.submit();
			    else
			        self.helper.form.find('.checkbox').addClass('validation-failed');
			    
			});
			
			// bind open click
			$('a.open-register').click(function(e){
			    e.preventDefault();
			    
			    // reset the form
			    self.reset();
			    
			    self.helper.container
		            .css({
		                display:    'block',
		                left:       $(this).offset().left + 'px',
		                top:        $(this).offset().top - self.helper.container.height() - 5 + 'px'
		            })
		            ;
		        
//		        self.helper.overlay
//		            .insertBefore(self.helper.container)
//		            .css({
//		                display:    'block',
//		                opacity:    '0.00'
//		            })
//		            .fadeTo(0, '0.60');
//		            ;
		        
		        // bind close click
		        $('a.close-register').unbind().click(function(e){
		            e.preventDefault();
		            self.helper.container
		                .css({
		                    display:    'none'
		                })
		                ;
//		            self.helper.overlay
//		                .fadeOut(0)
//		                ;
		        });
			    
			});
            
			return self;
		},
		
		/*
		 * Reset the form
		 */
		reset: function () {
		    
		    var self    = this;
		    
		    self.helper.form.find('.validation-failed')
		        .removeClass('validation-failed')
		        ;
		    self.helper.entry
	            .css('display', 'block')
	            ;
	        self.helper.confirmation
	            .css('display', 'none')
	            ;
	        self.helper.form.find('li.field input, li.field textarea').each(function(){
	            $(this)
                    .val($.data($(this).get(0), 'value'))
                    .css({
                        color:          '#666',
                        textTransform:  'uppercase'
                    })
                    ;
	        });
		    
		    return;
		},
		
		/*
		 * Submit the form
		 */
		submit: function () {
		    
		    var self    = this;
		    
		    // block the form
		    self.blockForm();
		    
		    var firstName       = (self.helper.form.find('#firstName').val() != 'Name*') ? self.helper.form.find('#firstName').val() : '';
		    var emailAddress    = (self.helper.form.find('#emailAddress').val() != 'Email Address*') ? self.helper.form.find('#emailAddress').val() : '';
		    var country         = (self.helper.form.find('#country').val() != 'Country') ? self.helper.form.find('#country').val() : '';
		    var zip             = (self.helper.form.find('#zip').val() != 'Zip/Post Code') ? self.helper.form.find('#zip').val() : '';
		    var phoneNumber     = (self.helper.form.find('#phoneNumber').val() != 'Mobile Number') ? self.helper.form.find('#phoneNumber').val() : '';
		    var serviceProvider = (self.helper.form.find('#serviceProvider').val() != 'Service Provider') ? self.helper.form.find('#serviceProvider').val() : '';
		    
		    CreateThe.Com.Web.CodeBase.WebServices.RegistrationService.RegisterEmail(firstName, emailAddress, country, zip, phoneNumber, serviceProvider, $.registerForm.impl.submitSuccess, $.registerForm.impl.submitFailure, self);
		    
		    return;
		},
		
		/*
		 * Success
		 */
		submitSuccess: function (e, self) {
		    
		    var errors = eval(e);
		    
		    if (errors.length == 0)
		    {
		        self.showConfirmation();
		    }
		    else
		    {
		        // highlight field
		        $.each(errors, function(i, error){
		            self.helper.form.find('#' + error['FieldName'])
		                .parent().parent()
		                .addClass('validation-failed')
		                ;
		        });
		    }
		    
		    self.unblockForm();
		    
		    // tracking
		    pageTracker._trackPageview('submit_register');
		    
		    return;
		},
		
		/*
		 * Failure
		 */
		submitFailure: function (e, self) {
		    
		    self.unblockForm();
		    alert('An error has occurred. Please submit the form again.');
		    
		    return;
		},
		
		/*
		 * Show the confirmation
		 */
		showConfirmation: function () {
		    
		    var self    = this;
		    
		    self.helper.entry
		        .css('display', 'none')
		        ;
		    
		    self.helper.confirmation
		        .css('display', 'block')
		        ;
		    
		    return;
		},
		
		/*
		 * Block the form
		 */
		blockForm: function () {
		    
		    var self    = this;
		    
		    self.helper.form.find('.validation-failed').removeClass('validation-failed');
		    
		    self.helper.form.block({
                message: null,
                overlayCSS: {  
                    backgroundColor:    '#fff',
                    opacity:            '0.60'
                }
            });
		    
		    return;
		},
		
		/*
		 * Unblock the form
		 */
		unblockForm: function () {
		    
		    var self    = this;
		    
		    self.helper.form.unblock();
		    
		    return;
		}
		
	};
})(jQuery);