/*
jquery.nc.emailFriend.js

 $('#email-friend-form' ).emailFriend();

email-form
notice-success
notice-failure
*/
(function($) {  
    $.widget("ui.emailFriend", {  

        validators: {
            email : function(value){
                return ( value.search(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/) != -1)?null: "error-invalid";
            },
            required: function(value){
                return ( value.length != 0 )? null : "error-required";
            }         
        },
        
        _init : function (options) {
            var $this = this.element, self = this;                       
            
            $this.find('input').bind('blur', function(){
                self.validateField($(this));
                self._setupErrorState();
            });

            $this.find('.btn-cancel').bind('click', function(){
                self.close();
                return false;
            });
        
            $this.find('.btn-ok').bind('click', function(){
                var isVal = self.validateAllFields();
                self._setupErrorState();
                if(isVal) {
                    $.ajax({dataType: "json",  type: "POST", url: "/global/includes/php/emailjoblisting.php", data: $this.find("#email-friend-form").serialize(),
                        success: function(json){
                            var success = (json == null || json.success != true)?false:true;
                            self._processMailResults(success);
                        },
                        statusCode: {
                            500: function() {
                                $.log('404');
                                self._processMailResults(false);
                            }
                        }
                    });
                }
                return false;
            });
        },
        
        _processMailResults : function(success) {
                    var $this = this.element, self=this;                         
                    if(success) {
                            $this.find('.email-form').hide();
                            $this.find('input').val('');
                            $this.find('.notice-success').show().find('a.btn-confirm').bind('click', function(){
                                    self.close();
                                    return false;
                            });
                    }
                    else {
                            $this.find('.email-form').hide();
                            $this.find('.notice-failure').show().find('a.btn-confirm').bind('click', function(){
                                    self.close();
                                    return false;
                            });
                    }
        },
        
        show : function(){
                    this.element.trigger('show');
                    $('.email-form').show();
                    $('.notice-success').hide();
                    $('.notice-failure').hide();
        },
        close : function(){
                    this.element.trigger('close');
                    $('.email-form').hide();
                    $('.notice-success').hide();
                    $('.notice-failure').hide();
        },
        
        validateField: function($field, markInvalid) {
            var $this = this.element;
            var errorId = null;
            var validator = this.validators[$field.attr('validation')];
            if(validator) 
                errorId = validator($field.val());
            if(markInvalid != false) {
                var p = $field.parent();
                if(errorId==null)
                    p.removeClass('error error-required error-invalid');
                else
                    p.addClass('error ' + errorId);
            }
            return errorId;
        },
        
        _setupErrorState: function() {
            var $this = this.element;
            if($this.find("label.error-required").length == 0)
                $this.find("p.error-required").removeClass('error');
            else
                $this.find("p.error-required").addClass('error');
            if($this.find("label.error-invalid").length == 0)
                $this.find("p.error-invalid").removeClass('error');
            else
                $this.find("p.error-invalid").addClass('error');
                
            if(!this.validateAllFields(false))
                $('a.btn-ok').removeClass("valid");
            else
                $('a.btn-ok').addClass("valid");
        },
      
        validateAllFields : function(markInvalid){
            var self = this;
            var isValid = true;
            self.element.find("input").each(function() {
                if(self.validateField($(this),  markInvalid) != null)
                    isValid = false;
                    return;
            });
            return isValid;
        }
    });
})(jQuery);

