FormEditor = function(form)
{
    this.form = $(form);
    this.form.addEvent("submit", this.onSubmit.handler(this));
};

FormEditor.prototype = 
{
    form: null,
    fields: null,
    ajaxSubmit: true,
    autoEvents: false,
    
    setFields: function(fields)
    {        
        this.fields = fields;
        
        if(this.autoEvents)
        {
            this.addEventsToFields();
            this.fillFieldsWithDefaultValues();
        }
    },
    
    addEventsToFields: function()
    {
        for(key in this.fields)
        {
            var formField = this.form[key]; 
            
            if(formField.type == "text" || formField.type == "textarea" || formField.type == "password")
            {
                $(formField).addEvent("focus", this.onFieldFocus.handler(this));
                $(formField).addEvent("blur", this.onFieldBlur.handler(this));
            }
        }    
    },
    
    fillFieldsWithDefaultValues: function(overwriteAll)
    {
        for(key in this.fields)
        {
            var formField = this.form[key]; 
            
            if(formField.type == "text" || formField.type == "textarea" || formField.type == "password")
            {
                if(overwriteAll || formField.value == "")
                {
                    formField.value = this.fields[key].description;
                }
            }
        }
    },
    
    setValues: function(values)
    {
        ajax.fillForm(this.form, values);
        this.fillFieldsWithDefaultValues();
    },
    
    onFieldFocus: function(event)
    {
        if(event.obj.value == this.fields[event.obj.name].description)
        {
            event.obj.value = ""; 
        }
    },
    
    onFieldBlur: function(event)
    {
        if(event.obj.value == "")
        {
            event.obj.value = this.fields[event.obj.name].description;
        }
    },
    
    validate: function()
    {
        for(key in this.fields)
        {
            var fieldValue = this.form[key].value;
            
            if(this.fields[key].required && (fieldValue == '' || fieldValue == this.fields[key].description))
            {
                var message = (this.fields[key].errorMessage) ? this.fields[key].errorMessage : "Please enter " + this.fields[key].description
                alert(message);
                this.form[key].focus();
                return false;
            }
        }
        
        return true;
    },
    
    onSubmit: function(event)
    {
        if(this.validate())
        {
            
            /*for(key in this.fields)
            {
                if(this.form[key].value == this.fields[key].description)
                {
                    this.form[key].value = "";
                }
            } */
            
            if(this.ajaxSubmit)
            {
                var ajax = new AjaxClient();
                ajax.set("onSuccess", this.onSubmitSuccess.handler(this));
                ajax.set("onLoading", this.onLoading.handler(this));
                ajax.sendForm(this.form);
                
                if(event)
                {
                    event.preventDefault();
                }
            }
            
            //this.fillFieldsWithDefaultValues();
        }
        else
        {
            if(event)
            {
                event.preventDefault();
            }
        }
        
    },
    
    onLoading: function(ajaxObj)
    {
        //$('siteLoader').show();
    },
    
    onSubmitSuccess: function(ajaxObj)
    {
        //$('siteLoader').hide();
        var response = ajaxObj.parseJSON(); 

        switch(response.status)
        {
            case "ok":
                
                if(response.message)
                {
                    alert(response.message);
                }
                
                if(response.refresh)
                {
                    window.location.reload(false);
                }
                
                if(response.redirectUrl)
                {
                    window.location = response.redirectUrl;
                }
                
                if(response.resetForm)
                {
                    this.fillFieldsWithDefaultValues(true);
                }
                 
                break;
            
            case "sendFile":
                this.form.submit();
                break;
            
            case "error":
                this.onErrorHandler(response);
                break;
                
            case "confirm":
            
                if(confirm(response.message))
                {
                    this.form[response.what].value = "1";
                    this.onSubmit(false);
                }
                
                break;
        } 
    },
    
    setItem: function(item)
    {
        ajax.fillForm(this.form, item);
    },
    
    onErrorHandler: function(response)
    {
        alert(response.message);    
    }
}