/*
 *
 * 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);
            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('jqTransformChecked2') || aLink.removeClass('jqTransformChecked2');
                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('jqTransformChecked2');
        });
    };

/***************************
	  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 */
                if ($select[0].selectedIndex != $(this).attr('index') && $select[0].onchange) {
                    $select[0].selectedIndex = $(this).attr('index');
                    $select[0].onchange();
                }
                $select[0].selectedIndex = $(this).attr('index');
                $('span:eq(0)', $wrapper).html($(this).html());
                $ul.hide();
                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);
                    $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', newWidth);
            $ul.css('width', newWidth - 2);
            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: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);
            });

            //preloading dont needed anymore since normal, focus and hover image are the same one
/*if(opt.preloadImg && !jqTransformImgPreloaded){
				jqTransformImgPreloaded = true;
				var oInputText = $('input:text:first', selfForm);
				if(oInputText.length > 0){
					//pour ie on eleve les ""
					var strWrapperImgUrl = oInputText.get(0).wrapper.css('background-image');
					jqTransformPreloadHoverFocusImg(strWrapperImgUrl);					
					var strInnerImgUrl = $('div.jqTransformInputInner',$(oInputText.get(0).wrapper)).css('background-image');
					jqTransformPreloadHoverFocusImg(strInnerImgUrl);
				}
				
				var oTextarea = $('textarea',selfForm);
				if(oTextarea.length > 0){
					var oTable = oTextarea.get(0).oTable;
					$('td',oTable).each(function(){
						var strImgBack = $(this).css('background-image');
						jqTransformPreloadHoverFocusImg(strImgBack);
					});
				}
			}*/


        }); /* End Form each */

    }; /* End the Plugin */

})(jQuery);
