/**
 * editableText plugin that uses contentEditable property (FF2 is not supported)
 * Project page - http://github.com/valums/editableText
 * Copyright (c) 2009 Andris Valums, http://valums.com
 * Licensed under the MIT license (http://valums.com/mit-license/)
 */
(function () {
    /**
    * The dollar sign could be overwritten globally,
    * but jQuery should always stay accesible
    */
    var $ = jQuery;
    /**
    * Extending jQuery namespace, we
    * could add public methods here
    */
    var StartHeight;
    $.editableText = {};
    $.editableText.defaults = {
        /**
        * Pass true to enable line breaks.
        * Useful with divs that contain paragraphs.
        */
        newlinesEnabled: false,
        /**
        * Event that is triggered when editable text is changed
        */
        changeEvent: 'change'
    };
    /**
    * Usage $('selector).editableText(optionArray);
    * See $.editableText.defaults for valid options 
    */
    $.fn.editableText = function (options) {
        var options = $.extend({}, $.editableText.defaults, options);

        return this.each(function () {
            // Add jQuery methods to the element
            var editable = $(this);


            /**
            * Save value to restore if user presses cancel
            * This var will hold previous value
            */
            var prevValue;

            // Create edit/save buttons
            //            var buttons = $(
            //				"<div class='editableToolbar'>" +
            //            		"<a href='#' class='edit'></a>" +
            //            		"<a href='#' class='save'></a>" +
            //            		"<a href='#' class='cancel'></a>" +
            //            	"</div>")
            //				.insertBefore(editable);

            // Save references and attach events   

            editable.dblclick(startEditing);
            //var editEl = buttons.find('.edit').click(startEditing);


            editable.keyup(function (e) {
                //alert(e.keyCode);

                if (editable.html().length == 0) {
                    editable.html() = " ";
                }

                if (e.keyCode == 13) {
                    stopEditing();
                    prevValue = editable.html();
                    editable.trigger(options.changeEvent);
                }

                if (e.keyCode == 8 || e.keyCode == 46) { // backspace

                    editable.css('font-size', '80px');

                    currentHeight = editable.innerHeight();
                    lineHeight = editable.css('line-height').replace('px', '');
                    fontSize = editable.css('font-size').replace('px', '');

                    //var innerElements = editable.children(':visible')
                    if (currentHeight > lineHeight) {

                        do {
                            fontSize = fontSize - 1;
                            editable.css('font-size', fontSize + 'px');
                            currentHeight = editable.innerHeight();

                        } while (currentHeight > lineHeight);
                    }
                }




                currentHeight = editable.innerHeight();

                //alert(currentHeight);

                lineHeight = editable.css('line-height').replace('px', '');
                fontSize = editable.css('font-size').replace('px', '');

                //var innerElements = editable.children(':visible')
                if (currentHeight > lineHeight) {

                    do {
                        fontSize = fontSize - 1;
                        editable.css('font-size', fontSize + 'px');
                        currentHeight = editable.innerHeight();

                    } while (currentHeight > lineHeight);
                }



                //alert(editable.innerHeight());
            });

            editable.blur(function () {
                stopEditing();
                prevValue = editable.html();
                editable.trigger(options.changeEvent);
            });

            //			buttons.find('.save').click(function(){
            //				stopEditing();
            //				editable.trigger(options.changeEvent);
            //			});				
            //			buttons.find('.cancel').click(function(){
            //				stopEditing();
            //				editable.html(prevValue);
            //			});		

            // Display only edit button			
            //buttons.children().css('display', 'none');
            //editEl.show();			

            if (!options.newlinesEnabled) {
                // Prevents user from adding newlines to headers, links, etc.
                editable.keypress(function (event) {
                    // event is cancelled if enter is pressed
                    return event.which != 13;
                });
            }

            /**
            * Makes element editable
            */

            function startEditing() {
                // Save previous value               
                prevValue = editable.html();


                StartHeight = editable.innerHeight();
                //buttons.children().show();
                //editEl.hide();


                editable.attr('contentEditable', true);
                SelectText(editable.attr('id'));
                //alert(editable.attr('id'));
            }
            /**
            * Makes element non-editable
            */
            function stopEditing() {
                //buttons.children().hide();
                //editEl.show();				
                editable.attr('contentEditable', false);
            }

            function SelectText(element) {
                var text = document.getElementById(element);
                if ($.browser.msie) {
                    var range = document.body.createTextRange();
                    range.moveToElementText(text);
                    range.select();
                } else if ($.browser.mozilla || $.browser.opera) {
                    var selection = window.getSelection();
                    var range = document.createRange();
                    range.selectNodeContents(text);
                    selection.removeAllRanges();
                    selection.addRange(range);
                } else if ($.browser.safari) {
                    var selection = window.getSelection();
                    selection.setBaseAndExtent(text, 0, text, 1);
                }
            }
        });
    }
})();
