/*
 * UPDATED: 25.09.08
 *
 * jqTransform
 * by mathieu vilaplana mvilaplana@dfc-e.com
 * Designer ghyslain armand garmand@dfc-e.com
 *
 *
 * Version 1.0
 *
 ******************************************** */
 
(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 $select = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0);
            //do not hide if clicke on the label object associated to the select
            if (!(oTarget && $select.oLabel && $select.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 clickval = this.getAttribute("onclick");
            if(clickval !=null)            
                clickval = clickval.replace(/"/g, "&quot;");
            $(this).replaceWith('<button onclick="' + clickval + '" id="' + this.id + '" name="' + this.name + '" type="' + this.type + '" class="' + this.className + ' jqTransformButton"><span><span>' + $(this).attr('value') + '</span></span>');
        });
    };

    /***************************
    Text Fields 
    ***************************/
    $.fn.jqTransInputText = function () {
        return this.each(function () {
            var safari = $.browser.safari; /* We need to check for safari to fix the input:text problem */
            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')) {
                // alert($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 */
            safari && $wrapper.addClass('jqTransformSafari');
            safari && $input.css('width', $wrapper.width() + 16);
            this.wrapper = $wrapper;

        });
    };

    /***************************
    Check Boxes 
    ***************************/
    $.fn.jqTransCheckBox = function () {
        return this.each(function () {
            var $input = $(this);
            var inputSelf = this;

            if ($input.hasClass('jqTransformHidden')) { return; }

            var oLabel = jqTransformGetLabel($input);
            $input.addClass('jqTransformHidden').wrap('<span class="jqTransformCheckboxWrapper"></span>');
            var $wrapper = $input.parent();
            var aLink = $('<a href="#" class="jqTransformCheckbox"></a>');
            $wrapper.prepend(aLink);
            // Click Handler
            aLink.click(function () {
                var $a = $(this);
                if (inputSelf.checked === true) {
                    inputSelf.checked = false;
                    $a.removeClass('jqTransformChecked');
                }
                else {
                    inputSelf.checked = true;
                    $a.addClass('jqTransformChecked');
                }

                inputSelf.onchange && inputSelf.onchange();
                return false;
            });
            oLabel && oLabel.click(function () { aLink.trigger('click'); });
            // set the default state
            this.checked && aLink.addClass('jqTransformChecked');
        });
    };
    /***************************
    Radio Buttons 
    ***************************/
    $.fn.jqTransRadio = function () {
        return this.each(function () {
            var $input = $(this);
            var inputSelf = this;

            if ($input.hasClass('jqTransformHidden')) { return; }

            oLabel = jqTransformGetLabel($input);
            $input.addClass('jqTransformHidden').wrap('<span class="jqTransformRadioWrapper"></span>');
            var $wrapper = $input.parent();
            var aLink = $('<a href="#" class="jqTransformRadio" rel="' + this.name + '"></a>');
            $wrapper.prepend(aLink);
            // Click Handler
            aLink
				.each(function () {
				    this.radioElem = inputSelf;
				    $(this).click(function () {
				        var $a = $(this).addClass('jqTransformChecked');
				        inputSelf.checked = true;

				        // uncheck all others of same name
				        $('a.jqTransformRadio[rel="' + $a.attr('rel') + '"]', inputSelf.form).not($a).each(function () {
				            $(this).removeClass('jqTransformChecked');
				            this.radioElem.checked = false;
				        });

				        inputSelf.onchange && inputSelf.onchange();
				        return false;
				    });
				});
            oLabel && oLabel.click(function () { aLink.trigger('click'); });
            // 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 left MB10">';
            strTable += '<tr><td id="jqTransformTextarea-tl">&nbsp;</td><td id="jqTransformTextarea-tm">&nbsp;</td><td id="jqTransformTextarea-tr">&nbsp;</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">&nbsp;</td><td id="jqTransformTextarea-bm">&nbsp;</td><td id="jqTransformTextarea-br">&nbsp;</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;}
    //	
    //			var oLabel  =  jqTransformGetLabel($select);
    //			/* First thing we do is Wrap it */
    //			$select
    //				.addClass('jqTransformHidden')
    //				.wrap('<div class="jqTransformSelectWrapper"></div>')
    //			;
    //			var $wrapper = $select.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());
    //			/* Now we add the options */
    //			$('option', this).each(function(i){
    //				var oLi = $('<li><a href="#" index="'+ i +'">'+ $(this).html() +'</a></li>');
    //				$ul.append(oLi);
    //			});
    //			/* Hide the ul and add click handler to the a */
    //			$ul.hide().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();} 
    //					$ul.slideToggle('normal', function(){					
    //						var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);
    //						$ul.animate({scrollTop: offSet});
    //					});
    //					return false;
    //				})
    //			;
    //			//set the new width
    //			var iSelectWidth = $select.width();
    //			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);
    //			
    //		});
    //	};
    $.fn.jqTransform = function (options) {
        var self = this;
        var safari = $.browser.safari; /* We need to check for safari to fix the input:text problem */
        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);});

            //preloading
            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);
				

