(function ($) {
	var defaultOptions = {
		preloadImg: true
	};
	var jqTransformImgPreloaded = false;
	var jqTransformPreloadHoverFocusImg = function (strImgUrl) {
		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');
	};
	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;
	};
	var jqTransformHideSelect = function (oTarget) {
		var ulVisible = $('.jqTransformSelectWrapper ul:visible');
		ulVisible.each(function () {
			var oSelect = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0);
			if (! (oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0))) {
				$(this).hide();
			}
		});
	};
	var jqTransformCheckExternalClick = function (event) {
		if ($(event.target).parents('.jqTransformSelectWrapper').length === 0) {
			jqTransformHideSelect($(event.target));
			$(".jqTransformSelectWrapper").removeClass("jqSelectOpen");
		}
	};
	var jqTransformAddDocumentListener = function () {
		$(document).mousedown(jqTransformCheckExternalClick);
	};
	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');
			}
		});
	};
	$.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);
		});
	};
	$.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");
			});
			$.browser.safari && $wrapper.addClass('jqTransformSafari');
			$.browser.safari && $input.css('width', $wrapper.width() + 16);
			this.wrapper = $wrapper;
		});
	};
	$.fn.jqTransCheckBox = function () {
		return this.each(function () {
			if ($(this).hasClass('jqTransformHidden')) {
				return;
			}
			var $input = $(this);
			var inputSelf = this;
			var oLabel = jqTransformGetLabel($input);
			oLabel && oLabel.click(function () {
				aLink.trigger('click');
			});
			var aLink = $('<a href="#" class="jqTransformCheckbox"></a>');
			$input.addClass('jqTransformHidden').wrap('<span class="jqTransformCheckboxWrapper"></span>').parent().prepend(aLink);
			$input.change(function () {
				this.checked && aLink.addClass('jqTransformChecked') || aLink.removeClass('jqTransformChecked');
				return true;
			});
			aLink.click(function () {
				if ($input.attr('disabled')) {
					return false;
				}
				$input.trigger('click').trigger("change");
				return false;
			});
			this.checked && aLink.addClass('jqTransformChecked');
		});
	};
	$.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;
			});
			aLink.click(function () {
				if ($input.attr('disabled')) {
					return false;
				}
				$input.trigger('click').trigger('change');
				$('input[name="' + $input.attr('name') + '"]', inputSelf.form).not($input).each(function () {
					$(this).attr('type') == 'radio' && $(this).trigger('change');
				});
				return false;
			});
			inputSelf.checked && aLink.addClass('jqTransformChecked');
		});
	};
	$.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"> </td><td id="jqTransformTextarea-mm"><div></div></td><td id="jqTransformTextarea-mr"> </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());
			}
		});
	};
	$.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);
			var $wrapper = $select.addClass('jqTransformHidden').wrap('<div class="jqTransformSelectWrapper"></div>').parent().css({
				zIndex: 10 - index
			});
			$wrapper.prepend('<div><span></span><a href="#" class="jqTransformSelectOpen"></a></div><ul></ul>');
			var $ul = $('ul', $wrapper).hide();
			$('option', this).each(function (i) {
				var oLi = $('<li><a href="#" index="' + i + '">' + $(this).html() + '</a></li>');
				$ul.append(oLi);
			});
			$ul.find('a').click(function () {
				$wrapper.removeClass("jqSelectOpen");
				$('a.selected', $wrapper).removeClass('selected');
				$(this).addClass('selected');
				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;
			});
			$('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;
			var oLinkOpen = $('a.jqTransformSelectOpen', $wrapper).click(function () {
				$wrapper.removeClass("jqSelectOpen");
				if ($ul.css('display') == 'none') {
					$wrapper.addClass("jqSelectOpen");
					jqTransformHideSelect();
				}
				if ($select.attr('disabled')) {
					return false;
				}
				$ul.slideToggle(100, function () {
					var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);
					$ul.animate({
						scrollTop: offSet
					});
				});
				return false;
			});
			var iSelectWidth = $wrapper.outerWidth();
			var oSpan = $('span:first', $wrapper);
			oSpan.css({
				width: iSelectWidth - 15
			});
			$ul.css({
				display: 'block',
				visibility: 'hidden'
			});
			var iSelectHeight = ($('li', $ul).length) * ($('li:first', $ul).height());
			(iSelectHeight < $ul.height()) && $ul.css({
				height: iSelectHeight,
				'overflow': 'hidden'
			});
			$ul.css({
				display: 'none',
				visibility: 'visible'
			});
		});
	};
	$.fn.jqTransform = function (options) {
		var opt = $.extend({},
		defaultOptions, options);
		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);
			});
		});
	};
})(jQuery);
