/**
 * Input fields placeholder JQuery plugin
 *
 * @file mega.placeholder.js
 *
 * @brief mega.placeholder.js
 *
 * @author swdalex (Alexey Chavkin) <swdalex@gmail.com>
 * @version 1.0 (2011.03.10)
 * @date 2011.03.10 18:18
 * @copyright Copyright (c) 2011, MegaGroup (http://megagroup.ru)
 *
 */

(function($) {

    function Placeholder(container, config) {

        var ID = container.attr("id");
		if (!ID) {
		    ID = $.placeholder_index;
			if (!ID) {
				$.placeholder_index = 0;
				ID = 0;
			}
			
			$.placeholder_index++;
			ID = container.get(0).nodeName + ID;
		}
		
        var self = this;

        var settings = {
            text : '',
            attr : 'title',
            clazz : 'placeholder',
            placeholder : false
        };

        // merge settings with default config
        $.extend(settings, config);

        var init = function() {
            if (!settings.text || settings.text == '') {
                settings.text = container.attr(settings.attr);
            }

            var style = 'display:block; width:' + container.width() + 'px; height:' + container.height() + 'px; ' +
                        'position:absolute; top:' + container.position().top + 'px; left:' + container.position().left + 'px; ' +
                        'padding:' +
                         (integer(container.css('padding-top')) + integer(container.css('border-top-width'))) + 'px ' +
                         (integer(container.css('padding-right')) + integer(container.css('border-right-width'))) + 'px ' +
                         (integer(container.css('padding-bottom')) + integer(container.css('border-bottom-width'))) + 'px ' +
                         (integer(container.css('padding-left')) + integer(container.css('border-left-width'))) + 'px; ' +
                        '';

            container.after('<div id="' + ID + '_placeholder" class="' + settings.clazz + '" style="' + style + '">' + settings.text + '</div>');
            settings.placeholder = $('#' + ID + '_placeholder');

            if (container.val() && container.val() != '') {
                settings.placeholder.hide();
            }

            settings.placeholder.click(function() {
                container.focus();
            });
            container.focus(onFocus);
            container.blur(onBlur);
        };

        var onFocus = function() {
            settings.placeholder.hide();
        };

        var onBlur = function() {
            if (!container.val() || container.val() == '') {
                settings.placeholder.show();
            }
        };

        var integer = function(val) {
            val = parseInt(val);
            return isNaN(val) ? 0 : val;
        };
		
		var remove = function() {
			settings.placeholder.remove();
			container.unbind('focus');
			container.unbind('blur');
		};

        init();

        // Public methods
        $.extend(this, {
            getSettings : function() {
                return settings;
            },
            setSettings : function(newSettings) {
                $.extend(settings, newSettings);
                return self;
            },
			update : function() {
				remove();
				init();
			},
			remove : function() {
				remove();
				container.data("mega_placeholder", false);
			}
        });

    }

    $.fn.placeholder = function(settings) {

        // return existing instance
        var oldInstance = $(this).data("mega_placeholder");
        if (oldInstance) {
            return oldInstance;
        }

        var placeholder = new Placeholder($(this), settings);

        $(this).data("mega_placeholder", placeholder);

        return placeholder

    };


})(jQuery);
