if(typeof getElForm == 'undefined'){
	getElForm = function(el){
		return el ? (el.form ? el.form : (el.fakeForm ? el.fakeForm : null) ) : null;
	}
}
(function($){
	var jqTransformGetLabel = function(objfield){
		var selfForm = $(getElForm(objfield.get(0)));

		if(inputname = objfield.attr('id')){
			oLabel = selfForm.find('label[for="'+inputname+'"]');
			if(oLabel.is('label')){
				return oLabel/*.css('cursor','pointer')*/;
			}
		} 	
		return false;
	};
	$.fn.jqTransCheckBox = function(){
		this.each(function(i,inputSelf){
			var $input = $(inputSelf);
			var $wrapper = $input.parent();
			var $aLink = $wrapper.find('a');			
			var disabled = $input.attr('disabled') || $input.attr('readonly');
			var eventsBound = jQuery.data(inputSelf, "jqTransformEventsBound");
			
			if(!$input.hasClass('jqtransformdone')) {
				$input.addClass('jqtransformdone');
				$wrapper.attr('jqwrapper', 'true');
				
				$.data(inputSelf, 'jqTransform',{
					funcs:{
						aLinkClickFunc: function(){
							var $a = $(this);
							var state = inputSelf.checked;
							
							$input.click && $input.click();
							$input.change && $input.change();					
							$a.removeClass('j-checkbox-'+(state?'on':'off')).addClass('j-checkbox-'+(state?'off':'on'));										
							inputSelf.checked = !state;					 
							pos = (inputSelf.id+'').indexOf('option');
							if(pos>=0){
								var groupHandler = $('#'+inputSelf.id.substr(0,pos-1)+' :hidden[group]');
								groupHandler.valid && groupHandler.valid();
							}					
							return false;
						},
						wrapperKeyDownFunc: function(keyEvent){
							keyEvent.preventDefault();
							switch (keyEvent.which){
								case 32://space
									$aLink.click();
								break;
								case 9:// Tab
									this.blur();
									jQuery(window)[0].focus();
								break;
							}
						},
						inputChangeFunc: function(){				
							var state = this.checked;
							$aLink.removeClass('j-checkbox-'+(state?'off':'on')).addClass('j-checkbox-'+(state?'on':'off'));
							pos = (inputSelf.id+'').indexOf('option');
							if(pos>=0){
								var groupHandler = $('#'+inputSelf.id.substr(0,pos-1)+' :hidden[group]');
								groupHandler.valid && groupHandler.valid();
							}
						},
						oLabelClickIE: function(){ $aLink.click() }
					},
					eventsBound: false
				});
			}else{
				var state = inputSelf.checked;
				$aLink.removeClass('j-checkbox-'+(state?'off':'on')).addClass('j-checkbox-'+(state?'on':'off'));
				if(disabled){			
					$wrapper.addClass('disabled').removeAttr('tabIndex');
					$wrapper.get(0).tabIndex = -1;
				}else{
					$wrapper.removeClass('disabled').attr('tabIndex', '0');
				}
			}
			
			var dataObj = $.data(inputSelf, "jqTransform");
			
			var eventFunc = function(action){						
				eval("$aLink."+action+"('click', dataObj.funcs.aLinkClickFunc)");
				eval("$wrapper."+action+"('keydown', dataObj.funcs.wrapperKeyDownFunc)");
				if(oLabel = jqTransformGetLabel($input)){
					if($.browser.msie){
						eval("oLabel."+action+"('click', dataObj.funcs.oLabelClickIE)");
					}else{
						eval("$input."+action+"('change', dataObj.funcs.inputChangeFunc)");
					}
				}
				dataObj.eventsBound = action=='bind'?true:false;
				jQuery.data(inputSelf, "jqTransform", dataObj);
			};				
			// Events
			if(disabled){			
				if(dataObj['eventsBound'])	eventFunc('unbind');
			}else if(!dataObj['eventsBound'])
				eventFunc('bind');
		});
	};
})(jQuery);