/*
 * Inline Text Editing 1.3
 * April 26, 2010
 * Corey Hart @ http://www.codenothing.com
 * modified by Wilson Fung
 */ 

(function( $, undefined ){

    $.fn.updateContent = function( options ) {
        return this.each(function(){
            // Settings and local cache
            var self = this, $main = $( self ),
            settings = $.extend({
                href: 'ajax.php',
                requestType: 'POST',
                html: true,
                load: undefined,
                container: '.container',
                display: '.display',
                form: '.form',
                img: '.img',
                text: '.text',
                save: '.save',
                cancel: '.cancel',
                revert: '.revert',
                loadtxt: 'Loading...',
                hover: undefined,
                postVar: 'text',
                postData: {},
                postFormat: undefined,
                original: undefined
            }, options || {}, $.metadata ? $main.metadata() : {} ),

            // Cache All Selectors
            $container = $main.find( settings.container ),
            $display = $container.find( settings.display ),
            $form = $main.find( settings.form ),
            $text = $form.find( settings.text ),
            $save = $form.find( settings.save ),
            $revert = $form.find( settings.revert ),
            $cancel = $form.find( settings.cancel ),
            $img = $container.find( settings.img );

            // Make sure the plugin only get initialized once
            if ( $.data( self, 'inline-edit' ) === true ) {
                return;
            }
            $.data( self, 'inline-edit', true );

            // Prevent sending form submission
            $form.bind( 'submit.inline-edit', function(){
                $save.trigger( 'click.inline-edit' );
                return false;
            });
	
            // Display Actions
            $img.bind( 'click.inline-edit', function(){
                $img.hide();
                $container.fadeOut('fast', function(){
                    $form.fadeIn();
                });

                if ( settings.html ) {                    
                    if ( settings.original === undefined ) {
                        if ($display.has('.ui-button-text').length) {
                            $buttonText = $display.find('.ui-button-text');
                        } else {
                            $buttonText = $display;
                        }
                        settings.original = $buttonText.html();
                    }

                    $text.val( settings.original ).focus();
                } else if ( settings.original === undefined ) {
                    settings.original = $display.val();
                    $text.val( settings.original ).focus();
                }

                return false;
            });
            $container.bind( 'mouseenter.inline-edit', function(){
                $display.addClass( settings.hover );
                $img.fadeIn('fast');
            })
            .bind( 'mouseleave.inline-edit', function(){
                $display.removeClass( settings.hover );
                $img.fadeOut('fast');
            });

            // Add revert handler
            $revert.bind( 'click.inline-edit', function(){
                $text.val( settings.original || '' ).focus();
                return false;
            });

            // Cancel Actions
            $cancel.bind( 'click.inline-edit', function(){
                $form.fadeOut('fast', function(){
                    $container.fadeIn();
                });

                // Remove hover action if stalled
                if ( $display.hasClass( settings.hover ) ) {
                    $display.removeClass( settings.hover );
                }

                return false;
            });

            // Save Actions
            $save.bind( 'click.inline-edit', function( event ) {
                $postData = settings.postData + "&"+settings.postVar+'='+$text.val();
                $form.fadeOut('fast', function(){
                    $container.fadeIn();
                });

                if ($display.has('.ui-button-text').length) {
                    $buttonText = $display.find('.ui-button-text');
                } else {
                    $buttonText = $display;
                }


                if (settings.html) {
                    $buttonText.html( settings.loadtxt ).show();
                } else {
                    $buttonText.val( settings.loadtxt ).show();
                }

                if ( $display.hasClass( settings.hover ) ) {
                    $display.removeClass( settings.hover );
                }

                $.ajax({
                    url: settings.href,
                    type: settings.requestType,
                    data: settings.postFormat ?
                    settings.postFormat.call( $main, event, {
                        settings: settings,
                        postData: $postData
                    } ) :
                    $postData,
                    success: function( response ){

                                                
                        if ( settings.load ) {
                            settings.load.call( $buttonText, event, {
                                response: response,
                                settings: settings
                            } );
                            settings.original = undefined;
                            return;
                        }
                        
                        if ( settings.html ) {
                            $buttonText.html(response);
                        } else {
                            $buttonText.val(response);
                        }
                                               
                        settings.original = undefined;
                    }
                });

                return false;
            });
        });
    };

})( jQuery );

