/*
============================================================================
============================================================================
    
    Jeff Seals
    Signal Advertising
    
    Simple Form Creation, Validation, and Implementation. 
    
        The entire form is built using simple semantics without unnecessary
        markup and elemental misplacement.
    
        Each field is drawn from a DB table and then created according
        to the following (and form.php). If required, the field will be 
        validated based on its type of entry. 
        
        Required fields are intuitively designed and placed so that users
        know exactly what fields must possess (valid) entries.
         
============================================================================
============================================================================
*/


$(document).ready(function(event){ 
    if($('form input[type=file]').is(':hidden')){
        $('form').attr('enctype','multipart/form-data');
    }

      
    $('input,textarea').each(function(event){
        var $field      = $(this);
        var $field_name = $(this).attr('name');
        var $pseudo     = $(this).attr('pseudo');
        
        if($pseudo){
            var $label_value= $(this).val();
            var $select     = $('ul[input='+$field_name+']');
            var $selected   = false;
            
            $field.focus(function(event){
                var $value  = $field.val();
            
                if($selected){ $select.parent().show(); }
                else { $select.show().jScrollPane(); $selected = true; }
                
                if($value && $value != $label_value){ pass_field($field); } else { $value = $label_value; fail_field($field); };
                $('blockquote[info='+$field_name+']').show();
            });
            
            $field.blur(function(event){
                setTimeout(function(event){
                    if($selected){ $select.parent().hide(); }
                    else { $select.hide(); $select.parent().hide(); }
                    
                    var $value  = $field.val();
            
                    if($value && $value != $label_value){ pass_field($field); } else { $value = $label_value; fail_field($field); };
                    $('blockquote[info='+$field_name+']').hide();
                },100);
            });
        } else {
            $field.focus(function(event){
                $('blockquote[info='+$field_name+']').show();
            });
            
            $field.blur(function(event){
                coerce_fields($field_name);
                $('blockquote[info='+$field_name+']').hide();
            });
        }
    });
        
    
    $('form ul a').click(function(event){   
        var $field_name = $(this).parent().attr('input');
        var $new_value  = $(this).attr('value');
        
        $('input[name='+$field_name+']').val($new_value);
    });
    
    
    $('form ol a').each(function(event){
        var $checkbox   = $(this);
        var $field_name = $checkbox.parent().attr('input');
        var $input      = $('input[name='+$field_name+']');
        
        $checkbox.mouseover(function(event){ $('blockquote[info='+$field_name+']').show(); });
        $checkbox.mouseout(function(event){  $('blockquote[info='+$field_name+']').hide(); });
        $checkbox.toggle(
            function(event){ 
                $checkbox.attr('checked','set'); 
                
                var $value      = $input.val();
                var $new_value  = $checkbox.attr('value');
                
                $new_value      = $value.replace($new_value) + $new_value;
                $('input[name='+$field_name+']').val($new_value);
                
                coerce_fields($field_name);
            },
            function(event){ 
                $checkbox.removeAttr('checked'); 
                
                var $value      = $input.val();
                var $old_value  = $checkbox.attr('value');
                
                var $new_value  = $value.replace($old_value);
                if($new_value  == 'undefined'){ $new_value = ''; }
                
                $('input[name='+$field_name+']').val($new_value);
                
                coerce_fields($field_name);
            }    
        );
    });
    
    
    $('form dl a').each(function(event){
        var $radio      = $(this);
        var $field_name = $radio.parent().attr('input');
        var $input      = $('input[name='+$field_name+']');
        var $radio_set  = $('dl[input='+$field_name+'] a');
        
        $radio.mouseover(function(event){ $('blockquote[info='+$field_name+']').show(); });
        $radio.mouseout(function(event){  $('blockquote[info='+$field_name+']').hide(); });
        $radio.click(function(event){ 
            $radio_set.removeAttr('checked');
            $radio.attr('checked','set'); 
            
            var $new_value  = $radio.attr('value');
            $('input[name='+$field_name+']').val($new_value);
            
            coerce_fields($field_name);
        });
    });
    
    
    $('form li').each(function(event){
        var $upload_button  = $(this);
        var $field_name     = $upload_button.attr('input');
        var $input          = $('input[name='+$field_name+']');
        
        $upload_button.mouseover(function(event){ $('blockquote[info='+$field_name+']').show(); });
        $upload_button.mouseout(function(event){  $('blockquote[info='+$field_name+']').hide(); });
        
        $input.mouseover(function(event){ $('blockquote[info='+$field_name+']').show(); });
        $input.mouseout(function(event){  $('blockquote[info='+$field_name+']').hide(); });
        $input.change(function(event){
            $upload_button.removeClass().addClass('valid');
            $upload_button.text($upload_button.attr('modify'));
            
            coerce_fields($field_name);
        });        
    });
    
    
    $('input[submit]').click(function(event){
        var $submit_button  = $(this);
        var $form_name      = $submit_button.parent().attr('name');
        
        validate_form($form_name);
    });
});

    function coerce_fields(field_name){
        var $field_name = field_name;
        var $field      = $('[name='+$field_name+']');
        var $parent     = $field.parent().parent().attr('field');        
        var $required   = $('div[field='+$parent+'] span kbd').attr('type');
        
        if($required){
            switch($field_name){
                case 'zip_code' : validate_field('zip_code');   break;
                case 'email'    : validate_field('email');      break;
                case 'email_to' : validate_field('email_to');   break;
                default         : validate_field($field_name);
            }
        }
    }
    

    function pass_field(field_name){
        var $field      = field_name;
        var $name       = $field.attr('name');
        var $parent     = $field.parent().parent().attr('field');
        var $required   = $('div[field='+$parent+'] span kbd');
        var $info       = $('blockquote[info='+$name+']');
        
        $required.removeClass('invalid').addClass('valid');
        $field.removeClass('invalid').addClass('valid');
        $info.removeClass('invalid').addClass('valid');
    }
    
    function fail_field(field_name){
        var $field      = field_name;
        var $name       = $field.attr('name');
        var $parent     = $field.parent().parent().attr('field');
        var $required   = $('div[field='+$parent+'] span kbd');
        var $info       = $('blockquote[info='+$name+']');
        
        $required.removeClass('valid').addClass('invalid');
        $field.removeClass('valid').addClass('invalid');
        $info.removeClass('valid').addClass('invalid');
    }
    
    
    function validate_field(field_type){
        var $field_type = field_type;
        var $field      = $('[name='+$field_type+']');
        var $value      = $field.val();
        
        
        switch($field_type){
            case 'phone'    :   if($value.length >= 10){ pass_field($field); } else { fail_field($field); } break;
            
            case 'zip_code' :   if($value.length == 6 || $(this).val().length == 7){
                                    $field.val($value.replace(/ /g,''));
                                    if(!/^[0-9a-zA-Z]+$/.test($value)){ fail_field($field); } else { pass_field($field); }
                                } else if($value.length == 5){
                                    if(!/^[0-9]+$/.test($value)){ fail_field($field); } else { pass_field($field); }
                                } else if($value.length == 10){
                                    var pass_zip= '0123456789-';
                                    var hyphens = 0;
                                    
                                    for(var i=0; i<$value.length; i++){
                                    	ext_zip = '' + $value.substring(i,i+1);
                                    	if(ext_zip == '-') hyphens++;
                                    	if(pass_zip.indexOf(ext_zip) == '-1'){ fail_field($field); }
                                    	if((hyphens > 1) || (($value.length == 10) && ''+$value.charAt(5) != '-')){ 
                                    		fail_field($field);
                                    	} else {
                                    		pass_field($field);
                                    	}
                                    }
                                } else { fail_field($field); }
                                
                                break;
                                
            case 'email'    :   if(!/.+@.+\.[a-zA-Z]{2,4}$/.test($value)){ fail_field($field); } else { pass_field($field); } break;
            
            case 'email_to' :   if(!/.+@.+\.[a-zA-Z]{2,4}$/.test($value)){ fail_field($field); } else { pass_field($field); } break;
            
            default         :   if($value){ pass_field($field); } else { fail_field($field); }
        }
    }
    
    
    function validate_form(form_name){
        var $form_name      = form_name;    
        var $errors         = 0;
        
        $('form#'+$form_name+' :input').blur();
        $('form#'+$form_name+' blockquote.invalid').show();
        
        $('form#'+$form_name+' blockquote.invalid').each(function(event){
            $errors++;
        });
        
        if($errors){ alert('There are '+$errors+' required fields omitted and/or invalid.'); }
        else { alert('Form Valid!'); }
    }