var signup;
var errors;

Event.onReady(function() {
	
	 check_if_user_signed_in();

	 if (/signup$/.test(window.location) |
		 /login$/.test(window.location) |
	     /forgot-my-password$/.test(window.location))
		{
	     	errors = new errorCollection();
					
	     	signup = new signupForm();
			signup.createHooks(window.location);					
		}
		
	 if(/profile$/.test(window.location)){
	  if($('change-name') && $('change-email')){
	    new Ajax.InPlaceEditor('change-name', '/user/migrate/change/name',{ callback: function(form, value) { return 'user_name=' + escape(value) }});
        new Ajax.InPlaceEditor('change-email', '/user/migrate/change/email',{ callback: function(form, value) { return 'email=' + escape(value) }});
	  }
	 }
	 
	 if(/reviews/.test(window.location)){deleteHooks();}  
     if(/favorites/.test(window.location)){
       deleteHooks();
       spinner = new Image();
	   spinner.src = '/images/community/spinner.gif';
	   // move to an object
       $$("ul#favorites li").each(function(value){Element.observe(value, 'mouseover', function(){value.style.cursor= "move"})});
	   Sortable.create($('favorites'),{onUpdate: 
         function(){
		   Element.update('my_favorites_saved_highlight', "<img src='/images/community/spinner.gif'>");
	       new Ajax.Request('/favorites/reorder',{
		     method: 'post',
			 parameters: Sortable.serialize('favorites').replace(/\[\]/g,""),
			 onSuccess: function(e){
			 	Element.update('my_favorites_saved_highlight', "Saved!!");
				new Effect.Highlight('my_favorites_saved_highlight', {duration: 1});
				setTimeout("Element.update('my_favorites_saved_highlight', '')", 2000);
				}
		   });
         }  
       });
	 }
});

function check_if_user_signed_in(){

	try{
		var cookies = new CookieMgr();
		var cookieVal = "";
		
		cookieVal = cookies.get("UNAME");
		
		if (cookieVal == false) {	
			var loginText = '<div id="user"><div id="usiOptions"><a href="/user/signup" title="Sign Up">Sign Up</a><a href="/user/login" title="Log In">Log In</a><a href="http://subs.timeinc.net/CampaignHandler/wi_nb?source_id=13" title="Subscribe" class="last">Subscribe</a></div></div>';
			Element.replace($("status-spinner"), loginText);
		}
		else {
			var username = cookieVal.substring (0, cookieVal.indexOf('-'));		
			var signoutpg = '/user/do/logout/' + username;
			var logoutText = '<div id="user"><div id="usiOptions"><em>Welcome <span id="user-name"><strong >' + username + '</strong></span>!</em><a href="/user/' + username + '/profile" title="My Profile">My Profile<em></em></a><a href="/user/' + username + '/favorites" title="My Favorites">My Favorites<em></em></a><a href="/user/' + username + '/reviews" title="My Reviews">My Reviews<em></em></a><a href="http://subs.timeinc.net/CampaignHandler/wi_nb?source_id=13" title="Subscribe">Subscribe</a><a href="#" onclick="new Ajax.Request('+"'"+ signoutpg +"'"+', {asynchronous:true, evalScripts:true, onComplete:function(request){set_signed_out()}}); return false;" title="Log Out">Log Out<em></em></a></div></div>';
			Element.replace($("status-spinner"), logoutText);
			
		}
	}catch(err){
		alert(err);		
	}
}

function set_signed_out()
{
	Element.replace($("user"), '<div id="user"><div id="usiOptions"><em>Welcome to <strong>Food & Wine</strong>!</em><a href="/user/signup" title="Sign Up">Sign Up</a><a href="/user/login" title="Log In">Log In</a><a href="http://subs.timeinc.net/CampaignHandler/wi_nb?source_id=13" title="Subscribe">Subscribe</a></div></div>');

	if (/recipes/.test(window.location)) {			 	
		Element.replace($("review-form"), '<div id="review-form"><div id="user-pane-2" class="review-button"><a href="/user/login">Log in</a> or <a href="/user/signup">sign up</a> to review</div></div>');			 				 
	}
}

var signupForm = Class.create();
signupForm.prototype = {
   initialize: function(){},
   createHooks: function(location){
   	
	    if( /signup/.test(location) ){
			this.signupHook();
	     	Element.observe($("signup"), "submit", signup.submitForm.bind($("signup")));				
		}
		if(/login/.test(location))
		{
			this.loginHook();
	     	Element.observe($("login"), "submit", signup.submitForm.bind($("login")));		
		}
		if(/forgot-my-password/.test(location))
		{
			this.forgotHook();
	     	Element.observe($("forgot-my-password"), "submit", signup.submitForm.bind($("forgot-my-password")));		
		}		   	
   },
/*   loginHook: function(){
     links = $$("p#noaccount a");
	 obj = this;
	 links.each(function(value){
	   	 if (/login|signup|forgot-my-password/.test(value)){
		   value.onclick = obj.getForm;
		 }
	  });
	 Event.observe('user_name', 'blur', function(){
	   signup.checkLoginUser($('user_name'), $('user_name_message'));
	 });
	 Event.observe('password', 'blur', function(){
	   signup.checkLoginPassword($('password'), $('password_message'));
	 });
	 this.addError($('user_name'), $('user_name_message'), 'Please enter value => ');	
	 this.addError($('password'), $('password_message'), 'Please enter value => ');	
   },*/
   signupHook: function(){
	  Event.observe('user_name', 'focus', function(){
  	   checker = setInterval("signup.checkUserName($('user_name'), $('user_name_message'))",1000);
       return false;
      });
	  Event.observe('user_name', 'blur', function(){
	   clearInterval(checker);
	   signup.checkUserName($('user_name'), $('user_name_message'));
	  });
	  Event.observe('email', 'blur', function(){
	   signup.checkEmail($('email'), $('email_message'));
	  });
	  Event.observe('password_1', 'blur', function(){
	   signup.checkPassword($('password_1'), $('password_1_message'));
	  });
	  Event.observe('password_2', 'blur', function(){
	   signup.checkPassword($('password_2'), $('password_2_message'));
	  });
	  Event.observe('terms', 'click', function(){
	   signup.checkTerms($('terms'), $('terms_message'));
	  });
	  this.addError($('user_name'), $('user_name_message'), 'Username has too few characters => '); 
      this.addError($('email'), $('email_message'), 'Please enter your email here => ');  
      this.addError($('password_1'), $('password_1_message'), 'Please enter your password here => '); 
      this.addError($('password_2'), $('password_2_message'), 'Please enter your password here => '); 
      this.addError($('terms'), $('terms_message'), 'Please review: ');  
   },
   forgotHook: function(){
	  Event.observe('user', 'blur', function(){
	  	signup.checkForgot($('user'), $('user_message'));
	  });
	  Event.observe('signup_link', 'click', this.getForm);
	  this.addError($('user'), $('user_message'), ' ! ');
   },
  /*checkLoginUser: function(field, display){
     if ( !this.isBlank(field.value) ){
       this.thumbsUp(field,display,'');
     } else {
       this.thumbsDown(field,display,'Please enter value => ');
       this.form.user_name.focus();
     }
   },
   checkLoginPassword: function(field, display){
   	  if ( this.isBlank(field.value) ){
	      this.thumbsDown(field,display,'Password cannot be empty! => ');
	  } else {
	  	  this.thumbsUp(field,display,'');
	  }
   },*/
   checkUserName: function(field,display){
   	 if (field.value.strip().length > 2){
   	   if (field.value.strip().length > 20) {
   	     this.thumbsDown(field,display,'Maximum 20 characters => ');  	
   	   }else{
	     var validName = /^[a-zA-Z0-9\.\-\_]+$/;
	     if(validName.test(field.value)){
	   	   new Ajax.Request("/user/check/name/"+field.value, {
		       onSuccess: function(e){
			     eval(e.responseText);
			     if(namespace.availability){
			       signup.thumbsUp(field,display,namespace.message);
			     } else {
			  	   signup.thumbsDown(field,display,namespace.message);
			     }
		       }
	       });
	   
	     } else {
		   this.thumbsDown(field,display,'Not valid username => ');
	     }
   	   }
     } else {
	 	 Element.update(display, "");
	 }
   },
   checkEmail: function(field,display){
   	  if ( this.isBlank(field.value) ){
	     this.thumbsDown(field,display,'Email cannot be empty! => ');
   	  }else if ( field.value.strip().length < 4 ){ 
   	     this.thumbsDown(field,display,'Email syntax looks invalid  '); 
   	  }else{   
         var validEmail = /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
	     if(validEmail.test(field.value.strip())){
			  new Ajax.Request("/user/check/email/"+field.value, {
			     onSuccess: function(e){
			       eval(e.responseText);	               
			       if(namespace.availability){
					  signup.thumbsUp(field,display,namespace.message);
			       } else {
					  signup.thumbsDown(field,display,namespace.message);
			       }
			    }
			  });
		 }else{
            this.thumbsDown(field,display,'Email syntax looks invalid => ');
		 }
	 }
   },
   checkPassword: function(field, display){
	  if ( this.isBlank(field.value) ){
	       this.thumbsDown(field,display,'Password cannot be empty! => ');
      } else if( field.value.strip().length < 6 ){
      	   this.thumbsDown(field,display,'Minimum 6 characters => ');
      }else if ( field.value.strip().length > 20 ){ 
   	       this.thumbsDown(field,display,'Maximum 20 characters => '); 
	  } else {
	  	   // cross-validate
	  	   otherField =(field.name == 'password_1')? $('password_2') : $('password_1') ;  	
	  	    
           if ( !this.isBlank(otherField.value) ) {
                var isMatch = this.matchValues(field,otherField);
                if( !isMatch ){
                   this.thumbsDown($('password_2'),display,'Passwords must match! => ');
                } else {
                   this.thumbsUp(field,display,'Ok => ');
                   this.thumbsUp(otherField,display,'Ok => ');
                }	  	
           } else {
           	    this.thumbsUp(field,display,'Ok => ');
           }	  
	  }  	
   },
   checkTerms: function(field, display){
     if (field.checked){
       this.thumbsUp(field,display,'');
     } else {
       this.thumbsDown(field,display,'Please review => ');
     }
   },
   checkForgot: function(field, display){
     if ( !this.isBlank(field.value) ){
       this.thumbsUp(field,display,'');
     } else {
       this.thumbsDown(field,display,' ! ');
     }
   },
   submitForm: function(){
      if (errors.hasErrors()){
      	signup.displayErrors();
	  	return false;
	  } else {
	 	return true;
	  }	  
   },
   thumbsUp: function(field,display,message){
   	  this.displayMessage(field,display,message,'valid');
   	  this.removeError(field);
   },
   thumbsDown: function(field,display,message){  
   	  this.displayMessage(field,display,message,'error');
   	  this.addError(field,display,message);
   	  field.focus();
   },
   addError: function(field,display,message){
   	  this.removeError(field);
   	  var thisError = [field,display,message];
   	  errors.addError(thisError);  
   },
   removeError: function(field){
   	  var count = errors.count();
   	  if (count > 0){
   	     var error = '';
   	     for(var i = 0; i < count; i++) {
            error = errors.getError(i);
            if (typeof(error) != 'undefined') {
	            if (error[0].name == field.name){   	    
	   	          errors.removeError(i);  
	            }	
            } 
   	     }
   	  }
   },
   displayErrors: function(){
   	  var count = errors.count();
   	  if (count > 0){
   	     var error = '';
   	     for(var i = 0; i < count; i++) {
            error = errors.getError(i);
            if (typeof(error) != 'undefined') {
	            signup.displayMessage(error[0],error[1],error[2],'error');  	
            } 
   	     }
   	  }
   },
   displayMessage: function(field,display,message,classname){
   	  var classname = classname || '';  
      if (classname != '') { 
      	field.className = classname;
        display.className = classname; 
      }
	  Element.update(display, message);
   },
   isBlank: function(value){
     var bool = false;
     if (value.strip().length == 0) { bool = true };
     return bool;
   },
   matchValues: function(field,otherField){
   	  var bool = false;
      if( field.value == otherField.value ){
         bool = true;	
      }
      return bool;
   }
}


/*********** Cookie Handler ************/

function CookieMgr () {
	this.valid = false;
	this.val = null;
	this.path = "/";
	this.domain = "";
}

new CookieMgr();

CookieMgr.prototype.get = function (key) {
	this.getv(key);
	return this.valid ? this.val : false;
}

CookieMgr.prototype.set = function (key,val) {

	var today = new Date()
	expires = new Date(today.getTime() + 2*24*60*60*1000);
	document.cookie = key + "=" + escape(val) + "; expires=" + expires.toGMTString() + 
		(this.path=="" ? "" : "; path=" + this.path) + 
		(this.domain=="" ? "" : "; domain=" + this.domain);
}

CookieMgr.prototype.del = function (key,path,domain) {
	document.cookie= key + "=" +
		((path) ? "; path=" + path : this.path) +
		((domain) ? "; domain=" + domain : this.domain) +
		"; expires=Thu 01-Jan-70 00:00:01 GMT";
}

CookieMgr.prototype.getv = function (key) { // sets valid and val, returns true/false on success/failure

	var endstr;
	var arg = key + "=";
	var alen = arg.length;
	var clen = document.cookie.length;
	var i=0, j=0;
	
	while (i < clen) {
		j = i + alen;
		if (document.cookie.substring(i, j) == arg) {
			endstr = document.cookie.indexOf(";", j);
			if (endstr == -1) {
				endstr = document.cookie.length;
			}
			this.val = unescape(document.cookie.substring(j, endstr));
			this.valid = true;
			return true;
		}
		i = document.cookie.indexOf(" ", i) + 1;
		if (i == 0) {
			break;
		}
	}
	this.valid = false;
	return false;
}

function deleteHooks(){
  deletes = $$('input.delete_button');
  deletes.each(function(value){		 
    value.onclick = confirmDelete;		 
  });
}

function confirmDelete(){
  if (confirm("Are you sure you want to delete this?")){
    return true;
  }else{
    return false;
  }
}
