//in case when we are working without ImpHelper

if(typeof getElForm == 'undefined'){
	getElForm = function(el){
		return el ? (el.form ? el.form : (el.fakeForm ? el.fakeForm : null) ) : null;
	}
}


(function($){

	$.comboboxConf = {
		comboboxContainerClass: "j-select",
		comboboxValueContentContainerClass: "j-select-w",
		comboboxValueContentClass: "j-select-s",
		comboboxDropDownClass: "j-select-list",
		comboboxDropDownButtonClass: "j-select-b",
		comboboxDropDownItemClass: "j-select-item",
		comboboxDropDownItemHoverClass: "selected",						
		comboboxDropDownGroupItemHeaderClass: "j-select-item-h",
		comboboxDropDownGroupItemContainerClass: "j-select-item-h"
	};
	
	/***************************
	  Labels
	***************************/
	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;
	};
	
	/***************************
	  Text Fields 
	 ***************************/
	$.fn.jqTransInputText = function(){
		this.each(function(i, inputSelf){
			var $input = $(inputSelf);
			var $wrapper = $input.parent().parent();
			if(!$input.hasClass('jqtransformdone')){
				$input.addClass('jqtransformdone');
				$wrapper.attr('jqwrapper', 'true');
			}else{
				if($input.attr('disabled') || $input.attr('readonly')){			
					$wrapper.addClass('disabled');
				}else{
					$wrapper.removeClass('disabled');
				}
			}
			/*
			if(oLabel = jqTransformGetLabel($input)){
				oLabel.bind('click',function(){$input.focus()});
			}
			*/
		});
	};
	
	/***************************
	  TextArea 
	 ***************************/	
	$.fn.jqTransTextarea = function(){
		this.each(function(i, inputSelf){
			var $textarea = $(inputSelf);
			var $wrapper = $textarea.parent().parent().parent();

			if(!$textarea.hasClass('jqtransformdone')){
				$textarea.addClass('jqtransformdone');
				$wrapper.attr('jqwrapper', 'true');
			}else{
				if ($textarea.attr('disabled') || $textarea.attr('readonly')){
					$wrapper.addClass('disabled');
				}else{
					$wrapper.removeClass('disabled');
				}
			}
			if(!jQuery.data(inputSelf, "jqTransformRendered") && (width = $wrapper.width()) ){
				$wrapper.find('.j-textarea-w2,.j-textarea-w4').css('width', width);
				jQuery.data(inputSelf, "jqTransformRendered", true);
				$textarea.removeClass('rewrap');
			}else{
				$textarea.addClass('rewrap');
			}
			/*
			if(oLabel = jqTransformGetLabel($textarea)){
				oLabel.click(function(){$textarea.focus()});
			}
			*/
		});
	};
	/***************************
	  Check Boxes 
	 ***************************/	
	$.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();
									ImpForm && ImpForm.tab($(keyEvent.target));
								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');
		});
	};
	
	/***************************
	  Radio Buttons 
	 ***************************/
	$.jqTransRadioRelations = {};	
	$.fn.jqTransRadio = 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 dataObj = $.data(inputSelf, "jqTransform");
			if(typeof(dataObj)=='undefined'){
				$input.removeClass('jqtransformdone');
				$.jqTransRadioRelations[$input.attr('name')] = null;
			}
			//initialization		
			if(!$input.hasClass('jqtransformdone')) {
				$input.addClass('jqtransformdone')
				$aLink.attr('rel', $input.attr('name'));
				$wrapper.attr('jqwrapper', 'true');
				
				$.data(inputSelf, 'jqTransform',{
					funcs:{
						aLinkClickFunc: function(){						
							var $a = $(this).removeClass('j-radio-off').addClass('j-radio-on');
							inputSelf.checked = true;
							if(!$.jqTransRadioRelations[$a.attr('rel')]){
								$.jqTransRadioRelations[$a.attr('rel')] = $('a.j-radio-a[rel="'+ $a.attr('rel') +'"]');
							}
							// uncheck all others of same name
							$.jqTransRadioRelations[$a.attr('rel')].not($a).removeClass('j-radio-on').addClass('j-radio-off');

							//validation
							pos = (inputSelf.id+'').indexOf('option');
							if(pos>=0){
								groupId = inputSelf.id.substr(0,pos-1);
								$('#'+groupId+' :hidden[group]').each(function (){
									$(this).valid && $(this).valid();
								});
							}else if(inputSelf.className.indexOf('validate:{')!=-1){
								$(this).valid && $(this).valid();
							}						
							if($input.attr('originalClick')!=1 || $.browser.msie){
								$input.click && $input.click();
								$input.change && $input.change();
								//inputSelf.defaultChecked = inputSelf.checked;
							}
							return false;
						},
						wrapperKeyDownFunc: function(keyEvent){
							keyEvent.preventDefault();
							switch (keyEvent.which){
								case 37://Left					
								case 38://up
									var found = prev = false; 
									if(!$.jqTransRadioRelations[$aLink.attr('rel')]){
										$.jqTransRadioRelations[$aLink.attr('rel')] = $('a.j-radio-a[rel="'+ $aLink.attr('rel') +'"]');
									}
									$.jqTransRadioRelations[$aLink.attr('rel')].each(function(){
										if(!found){
											if(this==$aLink[0]){								
												found = true;
												return;
											}else prev = this;
										}
									});
									if(prev){
										$(prev).click();
										prev.parentNode.focus();
									}
									break;
								case 39://Right
								case 40://Down
									var foundSelf = false;
									if(!$.jqTransRadioRelations[$aLink.attr('rel')]){
										$.jqTransRadioRelations[$aLink.attr('rel')] = $('a.j-radio-a[rel="'+ $aLink.attr('rel') +'"]');
									}
									$.jqTransRadioRelations[$aLink.attr('rel')].each(function(){
										if(foundSelf){
											$(this).click();
											this.parentNode.focus();
											return; 
										}
										if(this==$aLink[0]){								
											foundSelf = true;
										}
									});
									break;
								case 32://space
									$aLink.click();
									break;
								case 9:// Tab
									this.blur();
									jQuery(window)[0].focus();
									ImpForm && ImpForm.tab($(keyEvent.target));
									break;
							}
						},
						oLabelClickFunc: function(){
							$input.attr('originalClick', 1);
							$aLink.trigger('click');
							$input.attr('originalClick', 0);
						}
					},
					eventsBound: false
				});
			}else{
				var state = inputSelf.checked; 
				$aLink.removeClass('j-radio-'+(state?'off':'on')).addClass('j-radio-'+(state?'on':'off'));
				if(disabled){			
					$wrapper.addClass('disabled').removeAttr('tabIndex');
					$wrapper.get(0).tabIndex = -1;
				}else{
					$wrapper.removeClass('disabled').attr('tabIndex', '0');
				}
				if(!$.jqTransRadioRelations[$aLink.attr('rel')]){
					$.jqTransRadioRelations[$aLink.attr('rel')] = $('a.j-radio-a[rel="'+ $aLink.attr('rel') +'"]');
				}
				if(state){
					// uncheck all others of same name
					$.jqTransRadioRelations[$aLink.attr('rel')].not($aLink).removeClass('j-radio-on').addClass('j-radio-off');
				}

			}

			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)){
					eval("oLabel."+action+"('click', dataObj.funcs.oLabelClickFunc)");
				}
				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');
		});
	};
	
	$.fn.jqTransSelect = function(){
		this.each(function(i, select){
			select.internalCombobox && select.internalCombobox.refresh();
		});
	}

/*	$.jqSelectFilterFunc = function(){
		$el = $(this);		
		var res = ( 
			!$el.hasClass('jq') || 
			$el.hasClass('jqtransformdone') || 
			$el.hasClass('jqTransformHidden') ||
			!$(this).width()
			) ? false : true;
		//TODO: this doesnt work now
		if(!res) $el.addClass('rewrap');
		return res;
	};
*/	
	$.fn.jqTransform = function(refresh){
		this.each(function() {			
		 	if(refresh){
				//$('select', this).jqTransSelect();
				$('textarea', this).filter('.jq').jqTransTextarea();
				$('select.jq.jqIgnore', this).removeClass('jqIgnore').combobox($.comboboxConf,{animationType: 'slide', width: 250}, true);
				var $inputs = $('input:not([type="hidden"]).jq.jqIgnore', this);
				$inputs.filter('input:checkbox').removeClass('jqIgnore').jqTransCheckBox();
				$inputs.filter('input:radio').removeClass('jqIgnore').jqTransRadio();
		 	}else{
				//var start = new Date();
				var $inputs = $('input:not([type="hidden"]).jq', this);
				$inputs.filter('input:text, input:password').jqTransInputText();
				$inputs.filter('input:checkbox:not(.jqIgnore)').jqTransCheckBox();
				$inputs.filter('input:radio:not(.jqIgnore)').jqTransRadio();
				$('textarea', this).filter('.jq').jqTransTextarea();
				$('select.jq:not(.jqIgnore)', this).combobox($.comboboxConf,{animationType: 'slide', width: 250}, true);
				//debug((new Date().getTime()-start.getTime()) / 1000);
			}
		});
	};
	$.fn.jqTransformRefresh = function(refresh){
		//var start = new Date();
		this.each(function() {
			var key = null;
			var $input = $(this);
			if($input.hasClass('jq') && !$input.hasClass('jqIgnore') && this.nodeType==1) switch(this.nodeName.toLowerCase()){
				case 'input':
					switch(this.getAttribute('type')){
						case 'text':
						case 'password': key = 'InputText'; break;
						case 'checkbox': key = 'CheckBox';	break;
						case 'radio':	 key = 'Radio';		break;
					}				
				break; 
				case 'textarea': key = 'Textarea';	break;
				case 'select': key = 'Select'; break;
			}
			if(key){
				var method = 'jqTrans'+key;
			 	$input[method]();
			}
		});
		//debug((new Date().getTime()-start.getTime()) / 1000);
	};
})(jQuery);
