var TRACKSTAR = {};

TRACKSTAR.Inits = {
   initialize: function(){
      var signupBtn = $('betaSignupButton');
      var cancelLink = $('cancelBetasignup');
      var accountSubmit = $('account_submit');
      var newAccountSignup = $('newAccountSignup');
      if(signupBtn){
         signupBtn.addEvent('click', TRACKSTAR.Events.showSignupForm);  
         cancelLink.addEvent('click', TRACKSTAR.Events.hideSignupForm);
         $('betasignup_submit').disabled = true;
         $('betasignup_email').addEvent('keyup', TRACKSTAR.Events.validateSignupForm());
         $('betasignup_name').addEvent('keyup', TRACKSTAR.Events.validateSignupForm());
         $('betasignup_email').addEvent('change', TRACKSTAR.Events.validateSignupForm());
         $('betasignup_name').addEvent('change', TRACKSTAR.Events.validateSignupForm());
         $('addBetasignup').addEvent('submit', TRACKSTAR.Events.submitSignupForm());
      }
      if(accountSubmit){
         $('account_subdomain').addEvent('blur', TRACKSTAR.Events.validateSubdomain.bindAsEventListener($('account_subdomain')));
         $('account_title').addEvent('blur', TRACKSTAR.Events.validateAcctSignupForm.bindAsEventListener($('account_title')));
         $('user_name').addEvent('blur', TRACKSTAR.Events.validateAcctSignupForm.bindAsEventListener($('user_name')));
         $('user_username').addEvent('blur', TRACKSTAR.Events.validateAcctSignupForm.bindAsEventListener($('user_username')));
         $('user_email').addEvent('blur', TRACKSTAR.Events.validateAcctSignupForm.bindAsEventListener($('user_email')));
         $('user_password').addEvent('keyup', TRACKSTAR.Events.validateAcctSignupForm.bindAsEventListener($('user_password')));
         $('user_password_confirm').addEvent('keyup', TRACKSTAR.Events.validateAcctSignupForm.bindAsEventListener($('user_password_confirm')));
         $('addNewAccountForm').addEvent('submit', function(){
            $('account_submit').style.display = 'none';
            $('submitSpinner').style.display = 'block';
         });
         
         //incase of refresh with already filled in values
         TRACKSTAR.Events.validateSubdomain.bindAsEventListener($('account_subdomain'))();
         TRACKSTAR.Events.validateAcctSignupForm(null,$('account_title'));
         TRACKSTAR.Events.validateAcctSignupForm(null,$('user_name'));
         TRACKSTAR.Events.validateAcctSignupForm(null,$('user_username'));
         TRACKSTAR.Events.validateAcctSignupForm(null,$('user_email'));
         TRACKSTAR.Events.validateAcctSignupForm(null,$('user_password'));
         TRACKSTAR.Events.validateAcctSignupForm(null,$('user_password_confirm'));
      }
      TRACKSTAR.Events.embedFlash();
   }
};

TRACKSTAR.Utils = function(){
	return{
		isEmail:function(val){
			value = val.clean();
			reg = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;
			return(reg.test(value));
		}		
	};
}();

TRACKSTAR.Global = function(){
	return {
		networkErrorMessage: "<p><strong>Network error while trying to process your last request.  Please refresh the page and try again</strong></p>"
	};
}();

TRACKSTAR.Events = function(){
   return{
      
      showSignupForm: function(evt){
         var event = new Event(evt);
         TRACKSTAR.Events.validateSignupForm()();
         $('betaSignupButton').effect('margin-top', {duration: 200}).start(300);
         $$('div.dynamicForm')[0].effect('margin-top', {duration: 200}).start(0);
         event.stop();
      },
      
      hideSignupForm: function(evt){
         var event = new Event(evt);
         $('betaSignupButton').effect('margin-top', {duration: 200}).start(0);
         $$('div.dynamicForm')[0].effect('margin-top', {duration: 200}).start(108);
         TRACKSTAR.Dom.clearDynamicFormError();
         event.stop();
      },
      
      validateSignupForm: function(){
         var emailInput;
         var nameInput;
         var emailLabel;
         var nameLabel;
         var submitBtn;
         return function(){
            TRACKSTAR.Dom.clearDynamicFormError();
            emailInput = emailInput || $('betasignup_email');
            nameInput = nameInput || $('betasignup_name');
            emailLabel = emailLabel || $('betasignupEmailLabel');
            nameLabel = nameLabel || $('betasignupNameLabel');
            submitBtn = submitBtn || $('betasignup_submit');
            var emailValid = TRACKSTAR.Utils.isEmail(emailInput.value.clean());
            var nameValid = nameInput.value.clean().length >= 3;
            if(nameValid){
               nameLabel.addClass('validated');
            }else{
               nameLabel.removeClass('validated');
            }
            if(emailValid){
               emailLabel.addClass('validated');
            }else{
               emailLabel.removeClass('validated');
            }
            if(emailValid && nameValid){
               submitBtn.disabled = false;
            }else{
               submitBtn.disabled = true;
            }
         };
      },
      
      validateAcctSignupForm: function(event, el){
         var el = el || this;
         if(el.value.clean().length < 3){
            return false;
         }
         var validated = false;
         var _label = el.getPrevious('label');
         if(el.hasClass('validateEmail')){
            if(TRACKSTAR.Utils.isEmail(el.value.clean())){
               _label.addClass('validated');
            }else{
               _label.removeClass('validated');
            }
            TRACKSTAR.Events.checkIfAccountFormIsValid();
            return false;
         }
         
         if(el.hasClass('validatePasswordConfirm')){
            if(el.value.clean() == $('user_password').value.clean()){
               _label.addClass('validated');
            }else{
               _label.removeClass('validated');
            }
            TRACKSTAR.Events.checkIfAccountFormIsValid();
            return false;
         }
         
         if(el.hasClass('validatePassword')){
            if(el.value.clean().length >= 5){
               _label.addClass('validated');
            }else{
               _label.removeClass('validated');
            }
            TRACKSTAR.Events.checkIfAccountFormIsValid();
            return false;
         }
         
         if(el.value.clean().length >= 3){
            _label.addClass('validated');
         }else{
            _label.removeClass('validated');
         }
         TRACKSTAR.Events.checkIfAccountFormIsValid();
      },
      
      checkIfAccountFormIsValid: function(){
         var valid = true;
         $$('#addNewAccountForm label').each(function(el){
            if(!el.hasClass('validated')){
               valid = false;
            }
         });
         if(valid){
            $('account_submit').disabled = false;
            $('account_submit').removeClass('disabled');
         }
      },
      
      submitSignupForm: function(){
         var submitBtn;
         var spinner;
			return function(evt){
				var event = new Event(evt);
				submitBtn = submitBtn || $('betasignup_submit');
				spinner = spinner || $('betasignupSubmitSpinner');
				submitBtn.style.display = 'none';
				spinner.style.display = 'block';
				var theForm = this;
				this.send({
					onSuccess: function(response){
						if(response.match(/^failure/)){
							this.onFailure();
						}else{
						   response = Json.evaluate(response);
						   theForm.reset();
						   TRACKSTAR.Events.showThankYou(response.attributes.name);
						   //google pageview code
               		pageTracker._trackPageview('/betaSignupSuccess');
					   }
					},
					onFailure: function(response){
						if(response.responseText.match(/^failure/)){//the application found something wrong with the request
							TRACKSTAR.Dom.showDynamicFormError(response.responseText);
						}else{//general network failure
						   TRACKSTAR.Dom.showDynamicFormError(TRACKSTAR.Global.networkErrorMessage);
						}
					},
					onComplete: function(){
						submitBtn.style.display = 'block';
						spinner.style.display = 'none';
						submitBtn.disabled = true;
						$('betasignupEmailLabel').removeClass('validated');
						$('betasignupNameLabel').removeClass('validated');
				   }
				});
				event.stop();
			};
      },
      
      showThankYou: function(name){
         var span = $('submitThankyou').getElement('span');
         span.firstChild.nodeValue = name;
         $('submitThankyou').effect('bottom', {duration: 200}).start(0);
         $$('div.dynamicForm')[0].effect('margin-top', {duration: 200}).start(108);
         (function(){
            $('betaSignupButton').effect('margin-top', {duration: 200}).start(0);
            $('submitThankyou').effect('bottom', {duration: 200}).start(-108);
         }).delay(5000);
      },
      
      embedFlash: function(){
         swfobject.embedSWF("/flash/trackstar.swf", "flashVideo", "580", "390", "9.0.0");
      },
      
      validateSubdomain: function(e){
         var val = this.value.clean();
         var label = $('accountSubDomain');
         var labelEm = label.getElement('em');
         if((!e)&&(val.length == 0)){
            return false;
            //page refresh and value is empty
         }
         if(val.length < 3 || val === 'www' || val === 'ftp' || val === 'admin' || val === 'system' || val === 'trackstar' || val === 'forums' || val === 'forum' || val === 'help'){
            label.removeClass('validated');
			   label.addClass('error');
			   labelEm.innerHTML = 'subdomain is NOT valid. Please choose another.';
			   return false;
         }
         var validSubdomain = new RegExp(/^[A-Za-z0-9-]+$/);
         if(!(validSubdomain.test(val))){
            label.removeClass('validated');
			   label.addClass('error');
            labelEm.innerHTML = 'Invalid domain name. Please only use names with letters (A-Z) and numbers (0-9).';
            return false;
         }
         var spinner = $('subdomainSpinner');
         var url = '/accounts/validate';
         var body = {'account[subdomain]': val};
         var request = new Ajax(url, {
				method: 'post',
				postBody: body,
				onRequest: function(){
					spinner.style.display = "block";
				},
				onSuccess: function(response){
					//console.info(response);
					if(response == 'true'){
					   //subdomain is already available
					   label.removeClass('error');
					   label.addClass('validated');
					   labelEm.innerHTML =  'subdomain is available';
					}else{
					   //subdomain is taken
					   label.removeClass('validated');
					   label.addClass('error');
					   labelEm.innerHTML = 'subdomain is NOT available. Please choose another.';
					}
				},
				onFailure: function(response){
					//TRACKSTAR.Events.retryXHR.bind(this, retries).delay(1000);
				},
				onComplete: function(){
					spinner.style.display = "none";
				}
			});
			request.request();
      }
   };
}();

TRACKSTAR.Dom = function(){
   var dynamicFormError = false;
	var dynamicFormId;
	var bannerHeight = 108;
   return {
      showDynamicFormError: function(msg, id){
			var error = "<p>The following error(s) occured:</p>";
			var parent = this.getDynamicFormErrorElement(id);
			var bannerFormHolder = $('bannerFormHolder');
			error += msg.replace('failure=','');
			var holder = $E('div', parent);
			parent.style.height = 0;
			holder.innerHTML = error;
			var height = holder.getCoordinates().height;
			var showError = new Fx.Styles(parent, {duration: 200});
			showError.start({
				'height': [height],
				'opacity': [0, 1],
				'marginBottom':[0, 15],
				'marginTop':[0, 15]
			});
			if(bannerFormHolder){
			   bannerFormHolder.effect('height', {duration: 200}).start(bannerHeight + height + 30);
		   }
			dynamicFormError = true;
			dynamicFormId = id;
		},
		
		getDynamicFormErrorElement: function(id){
			if(id){
				return $('dynamicFormErrors_'+id);
			}else{
				return $('dynamicFormErrors');
			}
		},
		
		clearDynamicFormError: function(){
			if(!dynamicFormError){
				return;
			}
			var parent = this.getDynamicFormErrorElement(dynamicFormId);
			var holder = $E('div', parent);
			var bannerFormHolder = $('bannerFormHolder');
			var showError = new Fx.Styles(parent, {duration: 200});
			showError.start({
				'height': [0],
				'opacity': [0],
				'marginBottom':[0],
				'marginTop':[0]
			});
			if(bannerFormHolder){
			   bannerFormHolder.effect('height', {duration: 200}).start(bannerHeight);
		   }
			dynamicFormError = false;
			dynamicFormId = null;
		}
   };
}();

















/* -----------------------------------*/
/* ----->>> ONLOAD FUNCTIONS <<<------*/
/* -----------------------------------*/

window.onDomReady(function(){ 
	TRACKSTAR.Inits.initialize();
});