/* Custom JQTransform Library */
/* Modified for APS Controls */
/* Last Revised: 26-Sep-11 */

/*
 * 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 !!
 *
 * Version 1.2 17.01.11
 * Fixed Safari/iOS rendering bugs [MR]
 ******************************************** */

(function ($jq) {
    var defaultOptions = { preloadImg: true };
    var jqTransformImgPreloaded = false;

    var jqTransformPreloadHoverFocusImg = function (strImgUrl) {
        //guillemets to remove for ie
        strImgUrl = strImgUrl.replace(/^url\((.*)\)/, '$jq1').replace(/^\"(.*)\"$jq/, '$jq1');
        var imgHover = new Image();
        imgHover.src = strImgUrl.replace(/\.([a-zA-Z]*)$jq/, '-hover.$jq1');
        var imgFocus = new Image();
        imgFocus.src = strImgUrl.replace(/\.([a-zA-Z]*)$jq/, '-focus.$jq1');
    };


    /***************************
    Labels
    ***************************/
    var jqTransformGetLabel = function (objfield) {
        var selfForm = $jq(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 = $jq('.jqTransformSelectWrapper ul:visible');
        ulVisible.each(function () {
            var oSelect = $jq(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))) { $jq(this).hide(); }
        });
    };
    /* Check for an external click */
    var jqTransformCheckExternalClick = function (event) {
        if ($jq(event.target).parents('.jqTransformSelectWrapper').length === 0) { jqTransformHideSelect($jq(event.target)); }
    };

    /* Apply document listener */
    var jqTransformAddDocumentListener = function () {
        $jq(document).mousedown(jqTransformCheckExternalClick);
    };

    /* Add a new handler for the reset action */
    var jqTransformReset = function (f) {
        var sel;
        $jq('.jqTransformSelectWrapper select', f).each(function () { sel = (this.selectedIndex < 0) ? 0 : this.selectedIndex; $jq('ul', $jq(this).parent()).each(function () { $jq('a:eq(' + sel + ')', this).click(); }); });
        $jq('a.jqTransformCheckbox, a.jqTransformRadio', f).removeClass('jqTransformChecked');
        $jq('input:checkbox, input:radio', f).each(function () { if (this.checked) { $jq('a', $jq(this).parent()).addClass('jqTransformChecked'); } });
    };

    /***************************
    Buttons
    ***************************/
    $jq.fn.jqTransInputButton = function () {
        return this.each(function () {
            if ($jq(this).hasClass('ignorejqt') == true) { return; }  // Added to check for inputs with "ignore" selector.
            var newBtn = $jq('<button id="' + this.id + '" name="' + this.name + '" type="' + this.type + '" class="' + this.className + ' jqTransformButton"><span><span>' + $jq(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') })
			;
            $jq(this).replaceWith(newBtn);
        });
    };

    /***************************
    Text Fields 
    ***************************/
    $jq.fn.jqTransInputText = function () {
        return this.each(function () {
            var $jqinput = $jq(this);

            if ($jqinput.hasClass('ignorejqt') == true) { return; }  // Added to check for inputs with "ignore" selector.
            if ($jqinput.hasClass('jqtranformdone') || !$jqinput.is('input')) { return; }
            $jqinput.addClass('jqtranformdone');

            var oLabel = jqTransformGetLabel($jq(this));
            oLabel && oLabel.bind('click', function () { $jqinput.focus(); });

            var inputSize = $jqinput.width();
            if ($jqinput.attr('size')) {
                inputSize = $jqinput.attr('size') * 10;
                $jqinput.css('width', inputSize);
            }

            $jqinput.addClass("jqTransformInput").wrap('<div class="jqTransformInputWrapper"><div class="jqTransformInputInner"><div></div></div></div>');
            var $jqwrapper = $jqinput.parent().parent().parent();
            $jqwrapper.css("width", inputSize + 10);
            $jqinput
				.focus(function () { $jqwrapper.addClass("jqTransformInputWrapper_focus"); })
				.blur(function () { $jqwrapper.removeClass("jqTransformInputWrapper_focus"); })
				.hover(function () { $jqwrapper.addClass("jqTransformInputWrapper_hover"); }, function () { $jqwrapper.removeClass("jqTransformInputWrapper_hover"); })
			;

            /* If this is safari we need to add an extra class */
            $jq.browser.safari && $jqwrapper.addClass('jqTransformSafari');
            //$jq.browser.safari && $jqinput.css('width',$jqwrapper.width()+16);    // Removed for Safari compability.
            this.wrapper = $jqwrapper;

        });
    };

    /***************************
    Check Boxes 
    ***************************/
    $jq.fn.jqTransCheckBox = function () {
        return this.each(function () {

            if ($jq(this).hasClass('ignorejqt') == true) { return; }  // Added to check for inputs with "ignore" selector.
            if ($jq(this).hasClass('jqTransformHidden')) { return; }

            var $jqinput = $jq(this);
            var inputSelf = this;

            //set the click on the label
            var oLabel = jqTransformGetLabel($jqinput);
            oLabel && oLabel.click(function () { aLink.trigger('click'); });

            var aLink = $jq('<a href="#" class="jqTransformCheckbox"></a>');
            //wrap and add the link
            $jqinput.addClass('jqTransformHidden').wrap('<span class="jqTransformCheckboxWrapper"></span>').parent().prepend(aLink);
            //on change, change the class of the link
            $jqinput.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 ($jqinput.attr('disabled')) { return false; }
                //trigger the envents on the input object
                $jqinput.trigger('click').trigger("change");
                return false;
            });

            // set the default state
            this.checked && aLink.addClass('jqTransformChecked');
        });
    };
    /***************************
    Radio Buttons 
    ***************************/
    $jq.fn.jqTransRadio = function () {
        return this.each(function () {

            if ($jq(this).hasClass('ignorejqt') == true) { return; }  // Added to check for inputs with "ignore" selector.
            if ($jq(this).hasClass('jqTransformHidden')) { return; }

            var $jqinput = $jq(this);
            var inputSelf = this;

            oLabel = jqTransformGetLabel($jqinput);
            oLabel && oLabel.click(function () { aLink.trigger('click'); });

            var aLink = $jq('<a href="#" class="jqTransformRadio" rel="' + this.name + '"></a>');
            $jqinput.addClass('jqTransformHidden').wrap('<span class="jqTransformRadioWrapper"></span>').parent().prepend(aLink);

            $jqinput.change(function () {
                inputSelf.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
                return true;
            });
            // Click Handler
            aLink.click(function () {
                if ($jqinput.attr('disabled')) { return false; }
                $jqinput.trigger('click').trigger('change');

                // uncheck all others of same name input radio elements
                $jq('input[name="' + $jqinput.attr('name') + '"]', inputSelf.form).not($jqinput).each(function () {
                    $jq(this).attr('type') == 'radio' && $jq(this).trigger('change');
                });

                return false;
            });
            // set the default state
            inputSelf.checked && aLink.addClass('jqTransformChecked');
        });
    };

    /***************************
    TextArea 
    ***************************/
    $jq.fn.jqTransTextarea = function () {
        return this.each(function () {
            var textarea = $jq(this);

            if (textarea.hasClass('ignorejqt') == true) { return; }  // Added to check for inputs with "ignore" selector.
            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 = $jq(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($jq('#jqTransformTextarea-mm div', oTable))
			;
            this.oTable = oTable;
            if ($jq.browser.safari) {
                $jq('#jqTransformTextarea-mm', oTable)
				.addClass('jqTransformSafariTextarea');
                //.find('div')                          // Removed for Safari compability.
                //	.css('height',textarea.height())
                //	.css('width',textarea.width())
                //;
            }
        });
    };

    /***************************
    Select 
    ***************************/
    $jq.fn.jqTransSelect = function () {
        return this.each(function (index) {
            var $jqselect = $jq(this);

            if ($jqselect.hasClass('ignorejqt') == true) { return; }  // Added to check for inputs with "ignore" selector.
            if ($jqselect.hasClass('jqTransformHidden')) { return; }
            if ($jqselect.attr('multiple')) { return; }

            var oLabel = jqTransformGetLabel($jqselect);
            /* First thing we do is Wrap it */
            var $jqwrapper = $jqselect
				.addClass('jqTransformHidden')
				.wrap('<div class="jqTransformSelectWrapper"></div>')
				.parent()
				.css({ zIndex: 64 - index })
			;

            /* Now add the html for the select */
            $jqwrapper.prepend('<div><span></span><a href="#" class="jqTransformSelectOpen"></a></div><ul></ul>');
            var $jqul = $jq('ul', $jqwrapper).css('width', $jqselect.width()).hide();
            /* Now we add the options */
            $jq('option', this).each(function (i) {
                var oLi = $jq('<li><a href="#" index="' + i + '">' + $jq(this).html() + '</a></li>');
                $jqul.append(oLi);
            });

            /* Add click handler to the a */
            $jqul.find('a').click(function () {
                $jq('a.selected', $jqwrapper).removeClass('selected');
                $jq(this).addClass('selected');
                /* Fire the onchange event */
                if ($jqselect[0].selectedIndex != $jq(this).attr('index') && $jqselect[0].onchange) { $jqselect[0].selectedIndex = $jq(this).attr('index'); $jqselect[0].onchange(); }
                $jqselect[0].selectedIndex = $jq(this).attr('index');
                $jq('span:eq(0)', $jqwrapper).html($jq(this).html());
                $jqul.hide();
                return false;
            });
            /* Set the default */
            $jq('a:eq(' + this.selectedIndex + ')', $jqul).click();
            $jq('span:first', $jqwrapper).click(function () { $jq("a.jqTransformSelectOpen", $jqwrapper).trigger('click'); });
            oLabel && oLabel.click(function () { $jq("a.jqTransformSelectOpen", $jqwrapper).trigger('click'); });
            this.oLabel = oLabel;

            /* Apply the click handler to the Open */
            var oLinkOpen = $jq('a.jqTransformSelectOpen', $jqwrapper)
				.click(function () {
				    //Check if box is already open to still allow toggle, but close all other selects
				    if ($jqul.css('display') == 'none') { jqTransformHideSelect(); }
				    if ($jqselect.attr('disabled')) { return false; }

				    $jqul.slideToggle('fast', function () {
				        var offSet = ($jq('a.selected', $jqul).offset().top - $jqul.offset().top);
				        $jqul.animate({ scrollTop: offSet });
				    });
				    return false;
				})
			;

            // Set the new width
            var iSelectWidth = $jqselect.outerWidth();
            var oSpan = $jq('span:first', $jqwrapper);
            var newWidth = (iSelectWidth > oSpan.innerWidth()) ? iSelectWidth + oLinkOpen.outerWidth() : $jqwrapper.width();
            $jqwrapper.css('width', newWidth);
            $jqul.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
            $jqul.css({ display: 'block', visibility: 'hidden' });
            var iSelectHeight = ($jq('li', $jqul).length) * ($jq('li:first', $jqul).height()); //+1 else bug ff
            (iSelectHeight < $jqul.height()) && $jqul.css({ height: iSelectHeight, 'overflow': 'hidden' }); //hidden else bug with ff
            $jqul.css({ display: 'none', visibility: 'visible' });

        });
    };
    $jq.fn.jqTransform = function (options) {
        var opt = $jq.extend({}, defaultOptions, options);

        /* each form */
        return this.each(function () {
            var selfForm = $jq(this);
            if (selfForm.hasClass('jqtransformdone')) { return; }
            selfForm.addClass('jqtransformdone');

            $jq('input:submit, input:reset, input[type="button"]', this).jqTransInputButton();
            $jq('input:text, input:password', this).jqTransInputText();
            $jq('input:checkbox', this).jqTransCheckBox();
            $jq('input:radio', this).jqTransRadio();
            $jq('textarea', this).jqTransTextarea();

            if ($jq('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 = $jq('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 = $jq('div.jqTransformInputInner',$jq(oInputText.get(0).wrapper)).css('background-image');
            jqTransformPreloadHoverFocusImg(strInnerImgUrl);
            }
				
            var oTextarea = $jq('textarea',selfForm);
            if(oTextarea.length > 0){
            var oTable = oTextarea.get(0).oTable;
            $jq('td',oTable).each(function(){
            var strImgBack = $jq(this).css('background-image');
            jqTransformPreloadHoverFocusImg(strImgBack);
            });
            }
            }*/


        }); /* End Form each */

    }; /* End the Plugin */

})(jQuery);
				   
