/*
 *
 * jqTransform
 * 
 ******************************************** */

(function ($) {

    $.fn.jqDisabled = function () {
        if (!this.hasClass('jqtransformdone')) { return; }
        if (this.hasClass('jqdisabled') != this[0].disabled) {
            this.toggleClass('jqdisabled').jqOverlay(this[0].disabled);
        }
        return this;
    };

    $.fn.jqOverlay = function (active) {
        return this.each(function () {
            var self = $(this), overlay = this.overlay, parent = this.wrapper;

            if (!parent) {
                parent = self.parent();
                while (!parent.is('body') && (parent.attr('class') || '').indexOf('Wrapper') == -1) {
                    parent = parent.parent();
                }
            }

            if (!overlay && active && self.is('input:radio')) {
                overlay = this.overlay = $('<div style="background:transparent url(../../jqtransformplugin/img/radio-overlay3.gif); position: absolute; repeat: no-repeat; top: 0px; left: 0px; width: 18px; height: inherit" />').css('opacity', 0.6).hide().appendTo(parent);
            }
            
            if (!overlay && active && !self.is('input:radio')) {
                overlay = this.overlay = $('<div style="background: white; position: absolute; top: 0; left: 0; width: 100%; height: inherit" />').css('opacity', 0.6).hide().appendTo(parent);
            }   

            if (!active && overlay) {
                overlay.hide();
            }

            if (active) {
                var pos = parent.css('position');
                if (pos == 'static') parent.css('position', 'relative');

                overlay.css({ width: parent.width(), height: parent.height() }).show();
            }
        });
    };

    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(); }
        });
    };

    /* Apply document listener */
    var jqTransformAddDocumentListener = function () {
        $(document).mousedown(function (e) {
            if ($(e.target).closest('.jqTransformSelectWrapper').length === 0) {
                jqTransformHideSelect($(e.target));
            }
        });
    };


    /* 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 btn = $(this);
            btn.jqDisabled();
            if (btn.hasClass('jqTransformHidden')) return;
            if (btn.hasClass('jqtransformdone')) { return; }            
            
            var inputSize = btn.width(); //Kevin added 
            if (inputSize ==1) 
            {
                btn.addClass('jqtransformdone jqTransformHidden');
                return; //don't transform infragistics webslider button 1px width, 1px height
            }
                        
            btn.addClass('jqtransformdone jqTransformHidden');

            var newBtn = $('<span id="' + this.id + '" name="' + this.name + '" type="' + this.type + '" class="jqTransformButton jqTransformButtonWrapper"><span><span>' + (btn.attr('value') || btn.html()) + '</span></span></span>')
				.hover(function () {
				    newBtn.addClass('jqTransformButton_hover');
				    //btn.trigger('mouseover');
				}, function () {
				    newBtn.removeClass('jqTransformButton_hover');
				    //btn.trigger('mouseout');
				}).mousedown(function () {
				    newBtn.addClass('jqTransformButton_click');
				    btn.trigger('mousedown');
				}).mouseup(function () {
				    newBtn.removeClass('jqTransformButton_click');
				    btn.trigger('mouseup');
				}).click(function () {
				    btn.trigger('click');
				})
			;

            this.wrapper = newBtn;
            btn.after(newBtn);
            btn.jqDisabled();
        });
    };

    /***************************
    Text Fields 
    ***************************/
    $.fn.jqTransInputText = function () {
        return this.each(function () {
            var $input = $(this);

            $input.jqDisabled();
            if ($input.hasClass('jqtransformdone') || !$input.is('input')) { return; }
            $input.addClass('jqtransformdone');

            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;

            $input.jqDisabled();
        });
    };

    /***************************
    Check Boxes 
    ***************************/
    $.fn.jqTransCheckBox = function () {
        return this.each(function () {
            var $input = $(this);

            $input.jqDisabled();
            if ($input.hasClass('jqtransformdone')) { return; }

            //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 jqtransformdone').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');
            $input.jqDisabled();
        });
    };
    /***************************
    Radio Buttons 
    ***************************/
    $.fn.jqTransRadio = function () {
        return this.each(function () {

            var $input = $(this), inputSelf = this;
            $input.jqDisabled();
            if ($input.hasClass('jqTransformHidden')) { return; }

            oLabel = jqTransformGetLabel($input);
            oLabel && oLabel.click(function () { aLink.trigger('click'); });

            var aLink = $('<a href="#" class="jqTransformRadio" rel="' + this.name + '"></a>');
            $input.addClass('jqTransformHidden jqtransformdone').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');
            $input.jqDisabled();
        });
    };

    /***************************
    TextArea 
    ***************************/
    $.fn.jqTransTextarea = function () {
        return this.each(function () {
            var textarea = $(this);
            textarea.jqDisabled();
            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));

            oTable.wrap('<span class="jqTransformTextareaWrapper"></span>');
            this.oTable = oTable;
            if ($.browser.safari) {
                $('#jqTransformTextarea-mm', oTable)
					.addClass('jqTransformSafariTextarea')
					.find('div')
						.css('height', textarea.height())
						.css('width', textarea.width())
				;
            }
            textarea.jqDisabled();
        });
    };

    /***************************
    Select 
    ***************************/
    $.fn.jqTransSelect = function () {
        var total = this.length;
        return this.each(function (index) {
            var $select = $(this);
           // if(!$select.is(':visible') || $select.parents().filter(':not(:visible)').length>0) return;
            if(!$select.is(':visible')) return;
                        
            $select.jqDisabled();

            if ($select.hasClass('jqTransformHidden')) { return; }
            if ($select.attr('multiple')) { return; }
            if ($select.attr('jqignore')) { return; }

            var oLabel = jqTransformGetLabel($select);
            /* First thing we do is Wrap it */
            var $wrapper = $select
              .wrap('<div class="jqTransformSelectWrapper"></div>')
              .parent(); //.css({ zIndex: total + 100 - 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').bind('select', function () {
                $('a.selected', $wrapper).removeClass('selected');
                var a = $(this).addClass('selected');
              
                $('span:eq(0)', $wrapper).html($(this).html());
            }).click(function (e) {
                var a = $(this).trigger('select');
                /* Fire the onchange event */
                if ($select[0].selectedIndex != a.attr('index')) {
                    $select[0].selectedIndex = a.attr('index');
                    $select.trigger('change');
                }
                $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; }
                  $('.jqTransformSelectWrapper').css({ zIndex: 99 });
                  $wrapper.css({ zIndex: 999 });

                  $ul.slideToggle('fast', function () {
                      var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);
                      $ul.animate({ scrollTop: offSet });
                  });

                  $select[0].focus();

                  return false;
              });

            $select.keyup(function () {
                var a = $ul.find('a').eq(this.selectedIndex).trigger('select');
                $ul.animate({ scrollTop: a[0].offsetTop - 24 }, 50);
            });

            // 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 - 15 });

            // 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-y': 'scroll' }); //hidden else bug with ff
            $ul.css({ display: 'none', visibility: 'visible' });

            $select.addClass('jqTransformHidden jqtransformdone');
            $select.jqDisabled();
        });
    };

//****************************** test *********************
    $.fn.jqTransImgBtn = function () {
        return this.each(function () {
            var ImgBtn = $(this);
            ImgBtn.addClass('jqtransformdone');
      });      
    };
    
    $.fn.jqTransFileUpload = function () {
        return this.each(function () {
            var flUp = $(this);
            flUp.addClass('jqtransformdone');
      });      
    };
        
//****************************** test *********************
    

    $.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');

            var doit = function () {
                $('.rounded').removeClass('.rounded').addClass('.rounded');
                var inputs = selfForm.find(':input:not(.jqignore):not(.jqtransformdone):not(.igdd_ValueDisplay)');
                inputs.filter('input:submit, input:reset, button, input[type="button"]').jqTransInputButton();
                inputs.filter('input:text, input:password').jqTransInputText();
                inputs.filter('input:checkbox').jqTransCheckBox();
                inputs.filter('input:radio').jqTransRadio();
                inputs.filter('textarea').jqTransTextarea();
               // inputs.filter('select').jqTransSelect();
                inputs.filter('input:image').jqTransImgBtn();
                inputs.filter('input:file').jqTransFileUpload();   
                //inputs.addClass('jqtransformdone');
            };
            doit();

           // if ($('select', selfForm).jqTransSelect().length > 0) { jqTransformAddDocumentListener(); }
            selfForm.bind('reset', function () { var action = function () { jqTransformReset(this); }; window.setTimeout(action, 10); });

            setInterval(doit, 100);
        }); /* End Form each */

    }; /* End the Plugin */

    $(function () {
        if (typeof ValidatorOnChange == "undefined") return;
        var old = ValidatorOnChange;
        window.ValidatorOnChange = function () {
            try {
                old();
            } catch (x) { }
        };
    });

})(jQuery);
				   

