




$.fn.ajaxForm = function(options) {

    var opts = null;
    var form = $(this);
    var defaults = {};
    var form_url = null;


    /**
     *  Constructor; Initializes form and add submit events
     */
    var __init__ = function() {
        opts = $.extend({}, defaults, options);
        // decide if to use url prefix or not.
        // this is a hacky workaround but brings genericity, so use the url
        // prefix in case there is a '::use_prefix::' at the end of the url.
       
        form_url = form.attr('action');
        //alert("ajaxform initialized");
        // bind submit event to form

        form.unbind('submit');

        $(form).bind('submit', function() {
            
            if (form.find(':file').length != 0) {
                // in case form has a file-upload field
                iframe_submit();
                
            } else {
                // form without fileupload fields
                ajax_submit();
                return false;
            }
            
        });
    }

    /*
     * Sends form data as zerialized Array with an AJAX-Post-Request
     */
    var ajax_submit = function() {

            //alert($.toJSON(form.serializeArray()));
            
            
            //display_loader();
            $.ajax( {
                type : 'POST',
                url : form_url,
                dataType : 'html',
                data : form.serializeArray(),
                beforeSend: function(){
                    //alert (form_url);
                },
                success : function(response) {
                    //alert(response);
                    $(opts.update).replaceWith(response);
                    $(document).trigger('ajaxform.sent');
                }
            });
    }



    /*
     *  Displays loading animation
     */
    var display_loader = function() {
        form.css( {
                'position' : 'relative'
        });
        var loader = $.create('span', {}, ['&nbsp;']);
        loader.attr('class', 'form_loader');
        form.append(loader);
    }

    /*
     * Sends the form data in a invinsible Iframe. (Needed for
     * file-uploads).
     */
    var iframe_submit = function() {
        
        //display_loader();
        var iframe;
        try {
            // IE HACK
            iframe = $.create('<iframe style="display:none;" name="upload_target", id="iframe_test" src=""></iframe>',{});
        } catch (ex) {
            iframe = $.create('iframe', {
                    src : '',
                    style : 'display:none',
                    name : 'upload_target',
                    id : 'iframe_test'
            });
            
        }


        iframe.insertAfter(form);
        //alert(form.html());
        form.attr('target', 'upload_target');
        
        
        $('#iframe_test').load( function() {

                var a = $($(this).contents().children()[0]);
                var iframe_content = a.find(opts.update).html();
                $('#iframe_test').remove();
                //alert(iframe_content);
                $(opts.update).html(iframe_content);
                $(document).trigger('ajaxform.sent');
                
        });
    }


   // call constructor
    __init__();
 }







/*
 *	AjaxForm supplies AJAX functionality for forms, including fileuploads
 */

AjaxForm = function(selector, opts) {

	var form = null;
	var update_elem = null;

	/*
	 * Sends form data as zerialized Array with an AJAX-Post-Request
	 */
	var ajax_submit = function() {
		display_loader(); 
		$.ajax( {
			type : 'POST',
			url : form.attr('action'),
			dataType : 'html',
			data : form.serializeArray(),
			success : function(response) {
                
				$(update_elem).replaceWith(response);
                
			}
		});
	}
	

	
	/*
	 *  Displays loading animation  
	 */
	var display_loader = function() {
		
		form.css( {
			'position' : 'relative'
		});

		var loader = $.create('span', {}, ['&nbsp;']);
		loader.attr('class', 'form_loader');
		
		form.append(loader);
		
	}

	/*
	 * Sends the form data in a invinsible Iframe. (Needed for
	 * file-uploads). 
	 */
	var iframe_submit = function() {
		
		display_loader(); 
		
		
		var iframe;
		try {
			// IE HACK
			iframe = $.create('<iframe style="display:none;" name="upload_target", id="iframe_test" src=""></iframe>',{});
		} catch (ex) {
			iframe = $.create('iframe', {
				src : '',
				style : 'display:none',
				name : 'upload_target',
				id : 'iframe_test'
			});
		}
		
		
		iframe.insertAfter(form);
		form.attr('target', 'upload_target');
		
		
			
		$('#iframe_test').load( function() {
			var a = $($(this).contents().children()[0]);
			$(opts.update).html(a.find(opts.update).html());
		});
	}

	function __init__() {
		form = $(selector);
        
		update_elem = opts.update;
        
		// bind submit event to form
		$(form).bind('submit', function() {
           
			if (form.find(':file').size() != 0) {
				// in case form has a file-upload field
				iframe_submit();
				
			} else {
				// form without fileupload fields
				ajax_submit();
				return false;
			}

		});

	}
	__init__();

}