/*
 * Copyright (c) 2007 Josh Bush (digitalbush.com)
 * 
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use,
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following
 * conditions:

 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE. 
 */
 
/*
 * Version: Beta 1
 * Release: 2007-06-01
 */
(function($) {
    $.fn.outerHTML = function(ignore, override, aggregate) {
        var _emptyTags = { "IMG": true, "BR": true, "INPUT": true, "META": true, "LINK": true, "PARAM": true, "HR": true };
        var g = ((ignore) ? ignore : new Object()), o = ((override) ? override : new Object());
        if ((aggregate) && ("length" in aggregate))
            return this.each(
            function() {
                var attrs = this.attributes, v, n;
                var str = "<" + this.tagName;
                for (var i = 0; i < attrs.length; i++) {
                    v = attrs[i].value; n = attrs[i].name;
                    if ((v) && (v != "null") && (!((n in g) || (n.toLowerCase() in g) || (n.toUpperCase() in g))))
                        str += " " + n + "=\"" +
                            (((n in o) || (n.toLowerCase() in o) || (n.toUpperCase() in o)) ? o[n] : v).toString().replace("\"", "&quot;") + "\"";
                }
                aggregate[aggregate.length] = (_emptyTags[this.tagName]) ? str + ">" : str + ">" + this.innerHTML + "</" + this.tagName + ">";
            });
        else return this;
    }
})(jQuery);

(function($) {
    var map = new Array();
    $.Watermark = {
        ShowAll: function() {
            for (var i = 0; i < map.length; i++) {
                if (map[i].obj.val() == "") {
                    map[i].obj.val(map[i].text);
                    map[i].obj.css("color", map[i].WatermarkColor);
                } else {
                    map[i].obj.css("color", map[i].DefaultColor);
                }
            }
        },
        HideAll: function() {
            for (var i = 0; i < map.length; i++) {
                if (map[i].obj.val() == map[i].text)
                    map[i].obj.val("");
            }
        }
    }

    $.fn.Watermark = function(text, color) {
        if (!color)
            color = "#aaa";
        return this.each(
			function() {
			    //debugger;
			    var input = $(this);
			    var defaultColor = input.css("color");
			    var defaultType = input.attr("type");
			    map[map.length] = { text: text, obj: input, DefaultColor: defaultColor, WatermarkColor: color, DefaultType: defaultType };
			    function clearMessage() {
			        if (input.val() == text)
			            input.val("");
			        input.css("color", defaultColor);
			        switchType(defaultType, true);
			    }

			    function insertMessage() {
			        if (input.val().length == 0 || input.val() == text) {
			            input.val(text);
			            input.css("color", color);
			            switchType("text", false);
			        } else
			            input.css("color", defaultColor);
			    }

			    function switchType(newType, focus) {
			        if ((newType.toLowerCase() == input.attr("type").toLowerCase()) && (input.css("display") != "none")) return;
			        if ("fe7f435f" in input) {
			            if ((focus && (input.css("display") == "none")) ||
			                (!focus && !(input.css("display") == "none"))) {
			                input.toggle(); input.fe7f435f.toggle();
			            }
			        }
			        else {
			            // browser types other than IE allow dynamic switch
			            try {
			                var el = input.clone().get(0);
			                el.type = newType;
			                el = $(el);
			                input.replaceWith(el);
			                input = el;
			                attachHandlers();
			            } catch (e) {
			                // in case of an IE, create a new input element and alternate password and text inputs
			                if (!("fe7f435f" in input)) {
			                    var o = []; input.outerHTML({ "name": 1, "id": 1, "checked": 1, "hidefocus": 1, "disabled": 1, "readonly": 1 }, { "type": "text", "value": input.val() }, o);
			                    input.after(o[0]);
			                    input.fe7f435f = input.next();
			                    input.fe7f435f.css("color", input.css("color"));
			                    input.fe7f435f.toggle();
			                    input.fe7f435f.get(0).attachEvent("onfocus", function() { clearMessage(); });
			                }
			                input.toggle(); input.fe7f435f.toggle();
			            }
			        }
			        if (focus) { window.setTimeout(function() { try { input.get(0).focus(); input.get(0).select(); } catch (e) { ; } }, 10); }
			    }

			    function attachHandlers() {
			        input.focus(clearMessage);
			        input.blur(insertMessage);
			        input.change(insertMessage);
			    }

			    attachHandlers();
			    insertMessage();
			}
		);
    };
})(jQuery);

