//Benjamin Keen Really Simple Validation
//http://www.benjaminkeen.com/software/rsv/jquery/
(function($) {
    var options = {};
    var returnHash = [];
    $.fn.RSV = function(params) {
        options = $.extend({},
        $.fn.RSV.defaults, params);
        return this.each(function() {
            $(this).bind('submit', {
                currForm: this,
                options: options
            },
            $(this).RSV.validate);
        });
    };
    $.fn.RSV.defaults = {
        rules: [],
        displayType: "alert-all",
        errorFieldClass: null,
        errorTextIntro: "Please fix the following error(s) and resubmit:",
        errorJSItemBullet: "* ",
        errorHTMLItemBullet: "&bull; ",
        errorTargetElementId: "rsvErrors",
        customErrorHandler: null,
        onCompleteHandler: null
    };
    $.fn.RSV.validate = function(event)
    {
        options = event.data.options;
        var form = event.data.currForm;
        var rules = options.rules;
        returnHash = [];
        for (var i = 0; i < rules.length; i++)
        {
            var row = rules[i].replace(/\\,/ig, "%%C%%");
            row = row.split(",");
            var satisfiesIfConditions = true;
            while (row[0].match("^if:"))
            {
                var cond = row[0];
                cond = cond.replace("if:", "");
                var comparison = "equal";
                var parts = [];
                if (cond.search("!=") != -1)
                {
                    parts = cond.split("!=");
                    comparison = "not_equal";
                }
                else
                parts = cond.split("=");
                var fieldToCheck = parts[0];
                var valueToCheck = parts[1];
                var fieldnameValue = "";
                if (form[fieldToCheck].type == undefined)
                {
                    for (var j = 0; j < form[fieldToCheck].length; j++)
                    {
                        if (form[fieldToCheck][j].checked)
                        fieldnameValue = form[fieldToCheck][j].value;
                    }
                }
                else if (form[fieldToCheck].type == "checkbox")
                {
                    if (form[fieldToCheck].checked)
                    fieldnameValue = form[parts[0]].value;
                }
                else
                fieldnameValue = form[parts[0]].value;
                if (comparison == "equal" && fieldnameValue != valueToCheck)
                {
                    satisfiesIfConditions = false;
                    break;
                }
                else if (comparison == "not_equal" && fieldnameValue == valueToCheck)
                {
                    satisfiesIfConditions = false;
                    break;
                }
                else
                row.shift();
            }
            if (!satisfiesIfConditions)
            continue;
            var requirement = row[0];
            var fieldName = row[1];
            var fieldName2,
            fieldName3,
            errorMessage,
            lengthRequirements,
            date_flag;
            if (requirement != "function" && form[fieldName] == undefined)
            {
                alert("RSV Error: the field \"" + fieldName + "\" doesn't exist! Please check your form and settings.");
                return false;
            }
            if (requirement != "function" && options.errorFieldClass)
            {
                if (form[fieldName].type == undefined)
                {
                    for (var j = 0; j < form[fieldName].length; j++)
                    {
                        if ($(form[fieldName][j]).hasClass(options.errorFieldClass))
                        $(form[fieldName][j]).removeClass(options.errorFieldClass);
                    }
                }
                else
                {
                    if ($(form[fieldName]).hasClass(options.errorFieldClass))
                    $(form[fieldName]).removeClass(options.errorFieldClass);
                }
            }
            if (row.length == 6)
            {
                fieldName2 = row[2];
                fieldName3 = row[3];
                date_flag = row[4];
                errorMessage = row[5];
            }
            else if (row.length == 5)
            {
                fieldName2 = row[2];
                fieldName3 = row[3];
                errorMessage = row[4];
            }
            else if (row.length == 4)
            {
                fieldName2 = row[2];
                errorMessage = row[3];
            }
            else
            errorMessage = row[2];
            if (requirement.match("^length"))
            {
                lengthRequirements = requirement;
                requirement = "length";
            }
            if (requirement.match("^range"))
            {
                rangeRequirements = requirement;
                requirement = "range";
            }
            switch (requirement)
            {
            case "required":
                if (form[fieldName].type == undefined)
                {
                    var oneIsChecked = false;
                    for (var j = 0; j < form[fieldName].length; j++)
                    {
                        if (form[fieldName][j].checked)
                        oneIsChecked = true;
                    }
                    if (!oneIsChecked)
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                }
                else if (form[fieldName].type == "select-multiple")
                {
                    var oneIsSelected = false;
                    for (var k = 0; k < form[fieldName].length; k++)
                    {
                        if (form[fieldName][k].selected)
                        oneIsSelected = true;
                    }
                    if (!oneIsSelected || form[fieldName].length == 0)
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                }
                else if (form[fieldName].type == "checkbox")
                {
                    if (!form[fieldName].checked)
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                }
                else if (!form[fieldName].value)
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "digits_only":
                if (form[fieldName].value && form[fieldName].value.match(/\D/))
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "letters_only":
                if (form[fieldName].value && form[fieldName].value.match(/[^a-zA-Z]/))
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "is_alpha":
                if (form[fieldName].value && form[fieldName].value.match(/\W/))
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "custom_alpha":
                var conversion = {
                    "L": "[A-Z]",
                    "V": "[AEIOU]",
                    "l": "[a-z]",
                    "v": "[aeiou]",
                    "D": "[a-zA-Z]",
                    "F": "[aeiouAEIOU]",
                    "C": "[BCDFGHJKLMNPQRSTVWXYZ]",
                    "x": "[0-9]",
                    "c": "[bcdfghjklmnpqrstvwxyz]",
                    "X": "[1-9]",
                    "E": "[bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ]"
                };
                var reg_exp_str = "";
                for (var j = 0; j < fieldName2.length; j++)
                {
                    if (conversion[fieldName2.charAt(j)])
                    reg_exp_str += conversion[fieldName2.charAt(j)];
                    else
                    reg_exp_str += fieldName2.charAt(j);
                }
                var reg_exp = new RegExp(reg_exp_str);
                if (form[fieldName].value && reg_exp.exec(form[fieldName].value) == null)
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "reg_exp":
                var reg_exp_str = fieldName2;
                if (row.length == 5)
                var reg_exp = new RegExp(reg_exp_str, fieldName3);
                else
                var reg_exp = new RegExp(reg_exp_str);
                if (form[fieldName].value && reg_exp.exec(form[fieldName].value) == null)
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "length":
                comparison_rule = "";
                rule_string = "";
                if (lengthRequirements.match(/length=/))
                {
                    comparison_rule = "equal";
                    rule_string = lengthRequirements.replace("length=", "");
                }
                else if (lengthRequirements.match(/length>=/))
                {
                    comparison_rule = "greater_than_or_equal";
                    rule_string = lengthRequirements.replace("length>=", "");
                }
                else if (lengthRequirements.match(/length>/))
                {
                    comparison_rule = "greater_than";
                    rule_string = lengthRequirements.replace("length>", "");
                }
                else if (lengthRequirements.match(/length<=/))
                {
                    comparison_rule = "less_than_or_equal";
                    rule_string = lengthRequirements.replace("length<=", "");
                }
                else if (lengthRequirements.match(/length</))
                {
                    comparison_rule = "less_than";
                    rule_string = lengthRequirements.replace("length<", "");
                }
                switch (comparison_rule)
                {
                case "greater_than_or_equal":
                    if (! (form[fieldName].value.length >= parseInt(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "greater_than":
                    if (! (form[fieldName].value.length > parseInt(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "less_than_or_equal":
                    if (! (form[fieldName].value.length <= parseInt(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "less_than":
                    if (! (form[fieldName].value.length < parseInt(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "equal":
                    var range_or_exact_number = rule_string.match(/[^_]+/);
                    var fieldCount = range_or_exact_number[0].split("-");
                    if (fieldCount.length == 2)
                    {
                        if (form[fieldName].value.length < fieldCount[0] || form[fieldName].value.length > fieldCount[1])
                        {
                            if (!processError(form[fieldName], errorMessage))
                            return false;
                        }
                    }
                    else
                    {
                        if (form[fieldName].value.length != fieldCount[0])
                        {
                            if (!processError(form[fieldName], errorMessage))
                            return false;
                        }
                    }
                    break;
                }
                break;
            case "valid_email":
                if (form[fieldName].value && !isValidEmail(form[fieldName].value))
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "valid_date":
                var isLaterDate = false;
                if (date_flag == "later_date")
                isLaterDate = true;
                else if (date_flag == "any_date")
                isLaterDate = false;
                if (!isValidDate(form[fieldName].value, form[fieldName2].value, form[fieldName3].value, isLaterDate))
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "same_as":
                if (form[fieldName].value != form[fieldName2].value)
                {
                    if (!processError(form[fieldName], errorMessage))
                    return false;
                }
                break;
            case "range":
                comparison_rule = "";
                rule_string = "";
                if (rangeRequirements.match(/range=/))
                {
                    comparison_rule = "equal";
                    rule_string = rangeRequirements.replace("range=", "");
                }
                else if (rangeRequirements.match(/range>=/))
                {
                    comparison_rule = "greater_than_or_equal";
                    rule_string = rangeRequirements.replace("range>=", "");
                }
                else if (rangeRequirements.match(/range>/))
                {
                    comparison_rule = "greater_than";
                    rule_string = rangeRequirements.replace("range>", "");
                }
                else if (rangeRequirements.match(/range<=/))
                {
                    comparison_rule = "less_than_or_equal";
                    rule_string = rangeRequirements.replace("range<=", "");
                }
                else if (rangeRequirements.match(/range</))
                {
                    comparison_rule = "less_than";
                    rule_string = rangeRequirements.replace("range<", "");
                }
                switch (comparison_rule)
                {
                case "greater_than_or_equal":
                    if (! (form[fieldName].value >= Number(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "greater_than":
                    if (! (form[fieldName].value > Number(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "less_than_or_equal":
                    if (! (form[fieldName].value <= Number(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "less_than":
                    if (! (form[fieldName].value < Number(rule_string)))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                case "equal":
                    var rangeValues = rule_string.split("-");
                    if ((form[fieldName].value < Number(rangeValues[0])) || (form[fieldName].value > Number(rangeValues[1])))
                    {
                        if (!processError(form[fieldName], errorMessage))
                        return false;
                    }
                    break;
                }
                break;
            case "function":
                custom_function = fieldName;
                eval("var result = " + custom_function + "()");
                if (result.constructor.toString().indexOf("Array") != -1)
                {
                    for (var j = 0; j < result.length; j++)
                    {
                        if (!processError(result[j][0], result[j][1]))
                        return false;
                    }
                }
                break;
            default:
                alert("Unknown requirement flag in validateFields(): " + requirement);
                return false;
            }
        }
        if (typeof options.customErrorHandler == 'function')
        return options.customErrorHandler(form, returnHash);
        else if (options.displayType == "alert-all")
        {
            var errorStr = options.errorTextIntro + "\n\n";
            for (var i = 0; i < returnHash.length; i++)
            {
                errorStr += options.errorJSItemBullet + returnHash[i][1] + "\n";
                styleField(returnHash[i][0], i == 0);
            }
            if (returnHash.length > 0)
            {
                alert(errorStr);
                return false;
            }
        }
        else if (options.displayType == "display-html")
        {
            var success = displayHTMLErrors(form, returnHash);
            if (!success)
            return false;
        }
        if (typeof options.onCompleteHandler == 'function')
        return options.onCompleteHandler();
        else
        return true;
    }
    function processError(obj, message)
    {
        message = message.replace(/%%C%%/ig, ",");
        var continueProcessing = true;
        switch (options.displayType)
        {
        case "alert-one":
            alert(message);
            styleField(obj, true);
            continueProcessing = false;
            break;
        case "alert-all":
        case "display-html":
            returnHash.push([obj, message]);
            break;
        }
        return continueProcessing;
    }
    function displayHTMLErrors(f, errorInfo)
    {
        var errorHTML = options.errorTextIntro + "<br /><br />";
        for (var i = 0; i < errorInfo.length; i++)
        {
            errorHTML += options.errorHTMLItemBullet + errorInfo[i][1] + "<br />";
            styleField(errorInfo[i][0], i == 0);
        }
        if (errorInfo.length > 0)
        {
            $("#" + options.errorTargetElementId).css("display", "block");
            $("#" + options.errorTargetElementId).html(errorHTML);
            return false;
        }
        return true;
    }
    function styleField(field, focus)
    {
        if (field.type == undefined)
        {
            if (focus)
            field[0].focus();
            for (var i = 0; i < field.length; i++)
            {
                if (!$(field[i]).hasClass(options.errorFieldClass))
                $(field[i]).addClass(options.errorFieldClass);
            }
        }
        else
        {
            if (options.errorFieldClass)
            $(field).addClass(options.errorFieldClass);
            if (focus)
            field.focus();
        }
    }
    function isValidEmail(str)
    {
        var s = $.trim(str);
        var at = "@";
        var dot = ".";
        var lat = s.indexOf(at);
        var lstr = s.length;
        var ldot = s.indexOf(dot);
        if (s.indexOf(at) == -1 || (s.indexOf(at) == -1 || s.indexOf(at) == 0 || s.indexOf(at) == lstr) || (s.indexOf(dot) == -1 || s.indexOf(dot) == 0 || s.indexOf(dot) == lstr) || (s.indexOf(at, (lat + 1)) != -1) || (s.substring(lat - 1, lat) == dot || s.substring(lat + 1, lat + 2) == dot) || (s.indexOf(dot, (lat + 2)) == -1) || (s.indexOf(" ") != -1))
        {
            return false;
        }
        return true;
    }
    function isValidDate(month, day, year, isLaterDate)
    {
        var daysInMonth;
        if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0)))
        daysInMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
        else
        daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
        if (!month || !day || !year) return false;
        if (1 > month || month > 12) return false;
        if (year < 0) return false;
        if (1 > day || day > daysInMonth[month - 1]) return false;
        if (isLaterDate)
        {
            var today = new Date();
            var currMonth = today.getMonth() + 1;
            var currDay = today.getDate();
            var currYear = today.getFullYear();
            if (String(currMonth).length == 1) currMonth = "0" + currMonth;
            if (String(currDay).length == 1) currDay = "0" + currDay;
            var currDate = String(currYear) + String(currMonth) + String(currDay);
            if (String(month).length == 1) month = "0" + month;
            if (String(day).length == 1) day = "0" + day;
            incomingDate = String(year) + String(month) + String(day);
            if (Number(currDate) > Number(incomingDate))
            return false;
        }
        return true;
    }
})(jQuery);

/**
 * Appendo Plugin for jQuery v1.01
 * Creates interface to create duplicate clones of last table row (usually for forms)
 * (c) 2008 Kelly Hallman. Free software released under MIT License.
 * See http://deepliquid.com/content/Appendo.html for more info
 */

// Attach appendo as a jQuery plugin
jQuery.fn.appendo = function(opt)
 {
    this.each(function() {
        jQuery.appendo.init(this, opt);
    });
    return this;
};

// appendo namespace
jQuery.appendo = function() {

    // Create a closure so that we can refer to "this" correctly down the line
    var myself = this;

    // Global Options
    // These can be set with inline Javascript like so:
    // jQuery.appendo.opt.maxRows = 5;
    // $.appendo.opt.allowDelete = false;
    // (no need, in fact you shouldn't, wrap in jQuery(document).ready() etc)
    this.opt = {};

    this.init = function(obj, opt) {

        // Extend the defaults with global options and options given, if any
        var options = jQuery.extend({
            labelAdd: 'Add Row',
            labelDel: 'Remove',
            allowDelete: true,
            // copyHandlers does not seem to work
            // it's been removed from the docs for now...
            copyHandlers: false,
            focusFirst: true,
            onAdd: function() {
                return true;
            },
            onDel: function() {
                return true;
            },
            maxRows: 0,
            wrapClass: 'appendoButtons',
            wrapStyle: {
                padding: '.4em .2em .5em'
            },
            buttonStyle: {
                marginRight: '.5em'
            },
            subSelect: 'tr:last'
        },
        myself.opt,
        opt
        );

        // Store clone of last table row
        var $cpy = jQuery(obj).find(options.subSelect).clone(options.copyHandlers);
        // We consider this starting off with 1 row
        var rows = 1;
        // Create two button objects
        var $add_btn = new_button(options.labelAdd).click(clicked_add),
        $del_btn = new_button(options.labelDel).click(clicked_del).hide()
        ;

        // Append a row to table instance
        function add_row()
        {
            var $dup = $cpy.clone(options.copyHandlers);
            $dup.appendTo(obj);
            update_buttons(1);
            if (typeof(options.onAdd) == "function") options.onAdd($dup);
            if ( !! options.focusFirst) $dup.find('input:first').focus();
        };

        // Remove last row from table instance
        function del_row()
        {
            var $row = jQuery(obj).find(options.subSelect);
            if ((typeof(options.onDel) != "function") || options.onDel($row))
            {
                $row.remove();
                update_buttons( - 1);
            }
        };

        // Updates the button states after rows change
        function update_buttons(rowdelta)
        {
            // Update rows if a delta is provided
            rows = rows + (rowdelta || 0);
            // Disable the add button if maxRows is set and we have that many rows
            $add_btn.attr('disabled', (!options.maxRows || (rows < options.maxRows)) ? false: true);
            // Show remove button if we've added rows and allowDelete is set
            (options.allowDelete && (rows > 1)) ? $del_btn.show() : $del_btn.hide();
        };

        // Returns (jQuery) button objects with label
        function new_button(label)
        {
            return jQuery('<button />')
            .css(options.buttonStyle)
            .html(label);
        };

        // This function can be returned to kill a received event
        function nothing(e)
        {
            e.stopPropagation();
            e.preventDefault();
            return false;
        };

        // Handles a click on the add button
        function clicked_add(e)
        {
            if (!options.maxRows || (rows < options.maxRows)) add_row();
            return nothing(e);
        };

        // Handles a click event on the remove button
        function clicked_del(e)
        {
            if (rows > 1) del_row();
            return nothing(e);
        };

        // Add the buttons after the table instance
        jQuery('<div />')
        .addClass(options.wrapClass)
        .css(options.wrapStyle)
        .append($add_btn, $del_btn)
        .insertAfter(obj);

        // Update the buttons
        update_buttons();

    };
    return this;
} ();

// Call default options on any table with class "appendo"
jQuery(function() {
    jQuery('table.appendo').appendo();
});

/*
 *
 * jqTransform
 * by mathieu vilaplana mvilaplana@dfc-e.com
 * Designer ghyslain armand garmand@dfc-e.com
 *
 *
 * Version 1.0 25.09.08
 * Version 1.1 06.08.09
 * Add event click on Checkbox and Radio
 * Auto calculate the size of a select element
 * Can now, disabled the elements
 * Correct bug in ff if click on select (overflow=hidden)
 * No need any more preloading !!
 * 
 ******************************************** */

 (function($) {
    var defaultOptions = {
        preloadImg: true
    };
    var jqTransformImgPreloaded = false;

    var jqTransformPreloadHoverFocusImg = function(strImgUrl) {
        //guillemets to remove for ie
        strImgUrl = strImgUrl.replace(/^url\((.*)\)/, '$1').replace(/^\"(.*)\"$/, '$1');
        var imgHover = new Image();
        imgHover.src = strImgUrl.replace(/\.([a-zA-Z]*)$/, '-hover.$1');
        var imgFocus = new Image();
        imgFocus.src = strImgUrl.replace(/\.([a-zA-Z]*)$/, '-focus.$1');
    };


    /***************************
	  Labels
	***************************/
    var jqTransformGetLabel = function(objfield) {
        var selfForm = $(objfield.get(0).form);
		//oLabel.style.filter = null;
        var oLabel = objfield.next();
		
        if (!oLabel.is('label')) {
            oLabel = objfield.prev();
            if (oLabel.is('label')) {
                var inputname = objfield.attr('id');
                if (inputname) {
                    oLabel = selfForm.find('label[for="' + inputname + '"]');
                }
            }
        }
		
        if (oLabel.is('label')) {
            return oLabel.css('cursor', 'pointer');
        }
        return false;
    };

    /* Hide all open selects */
    var jqTransformHideSelect = function(oTarget) {
        var ulVisible = $('.jqTransformSelectWrapper ul:visible');
        ulVisible.each(function() {
            var oSelect = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0);
            //do not hide if click on the label object associated to the select
            if (! (oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0))) {
                $(this).hide();
            }
        });
    };
    /* Check for an external click */
    var jqTransformCheckExternalClick = function(event) {
        if ($(event.target).parents('.jqTransformSelectWrapper').length === 0) {
            jqTransformHideSelect($(event.target));
        }
    };

    /* Apply document listener */
    var jqTransformAddDocumentListener = function() {
        $(document).mousedown(jqTransformCheckExternalClick);
    };

    /* Add a new handler for the reset action */
    var jqTransformReset = function(f) {
        var sel;
        $('.jqTransformSelectWrapper select', f).each(function() {
            sel = (this.selectedIndex < 0) ? 0: this.selectedIndex;
            $('ul', $(this).parent()).each(function() {
                $('a:eq(' + sel + ')', this).click();
            });
        });
        $('a.jqTransformCheckbox, a.jqTransformRadio', f).removeClass('jqTransformChecked');
        $('input:checkbox, input:radio', f).each(function() {
            if (this.checked) {
                $('a', $(this).parent()).addClass('jqTransformChecked');
            }
        });
    };

    /***************************
	  Buttons
	 ***************************/
    $.fn.jqTransInputButton = function() {
        return this.each(function() {
            var newBtn = $('<button id="' + this.id + '" name="' + this.name + '" type="' + this.type + '" class="' + this.className + ' jqTransformButton"><span><span>' + $(this).attr('value') + '</span></span>')
            .hover(function() {
                newBtn.addClass('jqTransformButton_hover');
            },
            function() {
                newBtn.removeClass('jqTransformButton_hover')
            })
            .mousedown(function() {
                newBtn.addClass('jqTransformButton_click')
            })
            .mouseup(function() {
                newBtn.removeClass('jqTransformButton_click')
            })
            ;
            $(this).replaceWith(newBtn);
        });
    };

    /***************************
	  Text Fields 
	 ***************************/
    $.fn.jqTransInputText = function() {
        return this.each(function() {
                  var $input = $(this);
        
                  if ($input.hasClass('jqtranformdone') || !$input.is('input')) {
                      return;
                  }
                  $input.addClass('jqtranformdone');
        
                  var oLabel = jqTransformGetLabel($(this));
                  oLabel && oLabel.bind('click',
                  function() {
                      $input.focus();
                  });
        
                  var inputSize = $input.width();
                  // if ($input.attr('size')) {
                  //     inputSize = $input.attr('size') * 10;
                  //     $input.css('width', inputSize);
                  // }
        
                  $input.addClass("jqTransformInput").wrap('<div class="jqTransformInputWrapper"><div class="jqTransformInputInner"><div></div></div></div>');
                  var $wrapper = $input.parent().parent().parent();
                  $wrapper.css("width", inputSize + 10);
                  $input
                  .focus(function() {
                      $wrapper.addClass("jqTransformInputWrapper_focus");
                  })
                  .blur(function() {
                      $wrapper.removeClass("jqTransformInputWrapper_focus");
                  })
                  .hover(function() {
                      $wrapper.addClass("jqTransformInputWrapper_hover");
                  },
                  function() {
                      $wrapper.removeClass("jqTransformInputWrapper_hover");
                  })
                  ;
        
                  /* If this is safari we need to add an extra class */
                  $.browser.safari && $wrapper.addClass('jqTransformSafari');
                  $.browser.safari && $input.css('width', $wrapper.width() + 16);
                  this.wrapper = $wrapper;
        
              });
    };

    /***************************
	  Check Boxes 
	 ***************************/
    $.fn.jqTransCheckBox = function() {
        return this.each(function() {
            if ($(this).hasClass('jqTransformHidden')) {
                return;
            }

            var $input = $(this);
            var inputSelf = this;

            //set the click on the label
            var oLabel = jqTransformGetLabel($input);
            oLabel && oLabel.click(function() {
                aLink.trigger('click');
            });

            var aLink = $('<a href="#" class="jqTransformCheckbox"></a>');
            //wrap and add the link
            $input.addClass('jqTransformHidden').wrap('<span class="jqTransformCheckboxWrapper"></span>').parent().prepend(aLink);
            //on change, change the class of the link
            $input.change(function() {
                this.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
                return true;
            });
            // Click Handler, trigger the click and change event on the input
            aLink.click(function() {
                //do nothing if the original input is disabled
                if ($input.attr('disabled')) {
                    return false;
                }
                //trigger the envents on the input object
                $input.trigger('click').trigger("change");
                return false;
            });

            // set the default state
            this.checked && aLink.addClass('jqTransformChecked');
        });
    };
    /***************************
	  Radio Buttons 
	 ***************************/
    $.fn.jqTransRadio = function() {
        return this.each(function() {
            if ($(this).hasClass('jqTransformHidden')) {
                return;
            }

            var $input = $(this);
            var inputSelf = this;

            oLabel = jqTransformGetLabel($input);
            oLabel && oLabel.click(function() {
                aLink.trigger('click');
            });

            var aLink = $('<a href="#" class="jqTransformRadio" rel="' + this.name + '"></a>');
            $input.addClass('jqTransformHidden').wrap('<span class="jqTransformRadioWrapper"></span>').parent().prepend(aLink);

            $input.change(function() {
                inputSelf.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
                return true;
            });
            // Click Handler
            aLink.click(function() {
                if ($input.attr('disabled')) {
                    return false;
                }
                $input.trigger('click').trigger('change');

                // uncheck all others of same name input radio elements
                $('input[name="' + $input.attr('name') + '"]', inputSelf.form).not($input).each(function() {
                    $(this).attr('type') == 'radio' && $(this).trigger('change');
                });

                return false;
            });
            // set the default state
            inputSelf.checked && aLink.addClass('jqTransformChecked');
        });
    };

    /***************************
	  TextArea 
	 ***************************/
    $.fn.jqTransTextarea = function() {
        return this.each(function() {
            var textarea = $(this);

            if (textarea.hasClass('jqtransformdone')) {
                return;
            }
            textarea.addClass('jqtransformdone');

            oLabel = jqTransformGetLabel(textarea);
            oLabel && oLabel.click(function() {
                textarea.focus();
            });

            var strTable = '<table cellspacing="0" cellpadding="0" border="0" class="jqTransformTextarea">';
            strTable += '<tr><td id="jqTransformTextarea-tl"></td><td id="jqTransformTextarea-tm"></td><td id="jqTransformTextarea-tr"></td></tr>';
            strTable += '<tr><td id="jqTransformTextarea-ml">&nbsp;</td><td id="jqTransformTextarea-mm"><div></div></td><td id="jqTransformTextarea-mr">&nbsp;</td></tr>';
            strTable += '<tr><td id="jqTransformTextarea-bl"></td><td id="jqTransformTextarea-bm"></td><td id="jqTransformTextarea-br"></td></tr>';
            strTable += '</table>';
            var oTable = $(strTable)
            .insertAfter(textarea)
            .hover(function() {
                ! oTable.hasClass('jqTransformTextarea-focus') && oTable.addClass('jqTransformTextarea-hover');
            },
            function() {
                oTable.removeClass('jqTransformTextarea-hover');
            })
            ;

            textarea
            .focus(function() {
                oTable.removeClass('jqTransformTextarea-hover').addClass('jqTransformTextarea-focus');
            })
            .blur(function() {
                oTable.removeClass('jqTransformTextarea-focus');
            })
            .appendTo($('#jqTransformTextarea-mm div', oTable))
            ;
            this.oTable = oTable;
            if ($.browser.safari) {
                $('#jqTransformTextarea-mm', oTable)
                .addClass('jqTransformSafariTextarea')
                .find('div')
                .css('height', textarea.height())
                .css('width', textarea.width())
                ;
            }
        });
    };

    /***************************
	  Select 
	 ***************************/
    $.fn.jqTransSelect = function() {
        return this.each(function(index) {
            var $select = $(this);

            if ($select.hasClass('jqTransformHidden')) {
                return;
            }
            if ($select.attr('multiple')) {
                return;
            }

            var oLabel = jqTransformGetLabel($select);
            /* First thing we do is Wrap it */
            var $wrapper = $select
            .addClass('jqTransformHidden')
            .wrap('<div class="jqTransformSelectWrapper"></div>')
            .parent()
            .css({
                zIndex: 10 - index
            })
            ;

            /* Now add the html for the select */
            $wrapper.prepend('<div><span></span><a href="#" class="jqTransformSelectOpen"></a></div><ul></ul>');
            var $ul = $('ul', $wrapper).css('width', $select.width()).hide();
            /* Now we add the options */
            $('option', this).each(function(i) {
                var oLi = $('<li><a href="#" index="' + i + '">' + $(this).html() + '</a></li>');
                $ul.append(oLi);
            });



            /* Add click handler to the a */
            $ul.find('a').click(function() {
                $('a.selected', $wrapper).removeClass('selected');
                $(this).addClass('selected');
                /* Fire the onchange event */

                $select[0].selectedIndex = $(this).attr('index');
                $('span:eq(0)', $wrapper).html($(this).html());
                $ul.hide();
                $($select).change();
                return false;
            });
            /* Set the default */
            $('a:eq(' + this.selectedIndex + ')', $ul).click();
            $('span:first', $wrapper).click(function() {
                $("a.jqTransformSelectOpen", $wrapper).trigger('click');
            });
            oLabel && oLabel.click(function() {
                $("a.jqTransformSelectOpen", $wrapper).trigger('click');
            });
            this.oLabel = oLabel;

            /* Apply the click handler to the Open */
            var oLinkOpen = $('a.jqTransformSelectOpen', $wrapper)
            .click(function() {
                //Check if box is already open to still allow toggle, but close all other selects
                if ($ul.css('display') == 'none') {
                    jqTransformHideSelect();
                }
                if ($select.attr('disabled')) {
                    return false;
                }

                $ul.slideToggle('fast',
                function() {
                    // var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top + 10);
                    // 						$ul.animate({scrollTop: offSet});
                    });
                return false;
            })
            ;

            // Set the new width
            var iSelectWidth = $select.outerWidth();
            var oSpan = $('span:first', $wrapper);
            var newWidth = (iSelectWidth > oSpan.innerWidth()) ? iSelectWidth + oLinkOpen.outerWidth() : $wrapper.width();
            $wrapper.css('width', 87);
            $('div.jqTransformSelectWrapper:first').css('margin-left', '2px');
            $ul.css('width', 85).css('margin', '0');
            oSpan.css({
                width: iSelectWidth
            });

            // Calculate the height if necessary, less elements that the default height
            //show the ul to calculate the block, if ul is not displayed li height value is 0
            $ul.css({
                display: 'block',
                visibility: 'hidden'
            });
            var iSelectHeight = ($('li', $ul).length) * ($('li:first', $ul).height());
            //+1 else bug ff
            (iSelectHeight < $ul.height()) && $ul.css({
                height: iSelectHeight,
                'overflow': 'hidden'
            });
            //hidden else bug with ff
            $ul.css({
                display: 'none',
                visibility: 'visible'
            });

        });
    };
    $.fn.jqTransform = function(options) {
        var opt = $.extend({},
        defaultOptions, options);

        /* each form */
        return this.each(function() {
            var selfForm = $(this);
            if (selfForm.hasClass('jqtransformdone')) {
                return;
            }
            selfForm.addClass('jqtransformdone');

            $('input:submit, input:reset, input[type="button"]', this).jqTransInputButton();
            $('input:text, input:password', this).jqTransInputText();
            $('input:checkbox', this).jqTransCheckBox();
            $('input:radio', this).jqTransRadio();
            $('textarea', this).jqTransTextarea();

            if ($('select', this).jqTransSelect().length > 0) {
                jqTransformAddDocumentListener();
            }
            selfForm.bind('reset',
            function() {
                var action = function() {
                    jqTransformReset(this);
                };
                window.setTimeout(action, 10);
            });

        });
        /* End Form each */

    };
    /* End the Plugin */

})(jQuery);
