$.fn.extend({
	  combocheck: function(settings) {		  
		function _init(obj,settings){
			this.visualBox = null;
			this.controll = null;
			this.offscreen = true;
			this.textContainer = null;
			this.wrapper = null;
			this.element = obj;
			this.objselect = obj.get(0);
			this.settings = jQuery.extend({
			    width: null,
	            maxDropHeight: null,
	            firstChecksAll: false,
	            minWidth: 50,
				onChange: function(data){},
				onInit: function(data){}
			}, settings);			
			this.data = [];
			
			this.handleElement = function(sender){
				var str = '';
				var allCheck = false;
				var $elem = this.visualBox.find('input');
				if( sender != null ){
					if(sender.attr("alt")==0){
						if( this.settings.firstCheckAll ){
							var _state = this.visualBox.find('input:first').attr('checked');					
							$elem.each( function(){	this.checked = _state; });
						};
					}else{
						var c_all = true;						
						$elem.each( function(){
							var _internal = $(this);
							if(_internal.attr('alt')!=0)
								if(!_internal.attr('checked'))
									c_all = false;
						});
						if(c_all)
							$elem.each( function(){ this.checked = true; });
						else
							$elem.filter(':first').attr('checked',false);						
					}
				}else{
					var ok = false;
					if(sender==null){
						ok = true;	
					}else{
						if(sender.attr('alt')==0)
							ok = true;
					}
					if(ok)
						if(this.settings.firstCheckAll && this.visualBox.find('input').get(0)){
							var _state = this.visualBox.find('input').get(0).checked;
							$elem.each( function(){ this.checked = _state; });
						};
				}
				
				/*this.element.find('option').each( function(){
					var p = $(this).parent().data('combocheck');					
				});
				*/
				
				var x = this.visualBox.find('input');
				var y = this.element.find('option');
				for(var i=0;i<x.length;i++){
					//y[i].attr('selected',x[i].attr('checked'));
					y[i].selected = x.get(i).checked;
				}
				
				allCheck = this.settings.firstCheckAll? this.visualBox.find('input:first').attr('checked') : false;
				if( allCheck ){
					str = this.visualBox.find('input:first').next().html();
				}else{
					$elem.each( function(){
						var _internal = $(this);
						if(str=='')
							str =  _internal.attr('checked') ? _internal.next().html() : '';
						else
							str +=  _internal.attr('checked') ? ', ' + _internal.next().html() : '';
					});
				}
				this.textContainer.html(str);
				if(sender)this.settings.onChange(this);
			};
			
			this.makeElement = function(){
				this.resetElement();				
				this.visualBox.css({ height : this.settings.maxDropHeight + 'px' });
				var t = this.objselect.options;
				for(var i=0;i<t.length;i++){
					var x = t[i];
					var p = x.value;
					var _cont = $("<div class='combocheck-top'/>");
					if(x.selected){
						var _check = $('<input type="checkbox" value="'+p+'"/>');
						_check.attr('checked',true);
					}else
						var _check = $('<input type="checkbox" value="'+p+'"/>');
						
					_check.attr('alt',i).click( function(event){						
						event.stopPropagation();
						var _internal = $(this);
						var $class = _internal.parents('.combocheck-wrapper').prev('select').data('combocheck');						
						$class.handleElement(_internal);
					});
					_cont.append(_check);					
					var _label = $("<span class='combocheck-label'/>");
					_label.click(function(data){						
						var _internal = $(this);
						_internal.prev().click();
						var $class = _internal.parents('.combocheck-wrapper').prev('select').data('combocheck');						
						$class.handleElement(_internal);
					}).css('cursor','pointer');
					_label.html(x.text);
					_cont.append(_label);
					this.visualBox.append(_cont);
				}
				this.element.hide();								
				this.handleElement(null);				
			};
			
			this.resetElement = function(){
				var t = this.visualBox.children('div.combocheck-top');
				if(t.length>0) t.remove();				
				/*
				$data = this.element.get(0).options;
				$datalen = $data.length;
				var _dt = 0;
				for(var i=0;i<$datalen;i++){
					this.data[$data[i].value] = {value:$data[i].text,checked:$data[i].selected};
				}
				*/
			};			
			
			s = function(event){
				var obj = event.srcElement;
				if(obj==undefined) obj=event.relatedTarget;
				if($(obj).html()!='' && !$(obj).hasClass('combocheck-box')&& !$(obj).hasClass('combocheck-top')&& !$(obj).hasClass('combocheck-text')&& !$(obj).hasClass('combocheck-wrapper')&&!$(obj).hasClass('wrapperspace')&& !$(obj).hasClass('combocheck-list')&&!$(obj).hasClass('combocheck-spacer')&&$(obj).parent().attr('class')!='combocheck-top'){
					var $ok = 1;
					if($.browser.mozilla){
						if( ($(obj).attr('prefix')=='xul') ) $ok = 0;
					};
					if($ok==1){
						event.data.obj.hide();
						$(document).unbind('mouseover',s);					
					}
				}
			};
			
			this.construct = function(){
				this.element.hide();
				
				this.element.attr('multiple',true);
				this.wrapper = $("<span/>").addClass("combocheck-wrapper").css({
            	    display: "inline-block",
                	cursor: "default"
        	    });				
				var $w =0;
				if(($.browser.mozilla)&&(this.settings.width<200)) $w=-4;
				this.controll = $("<span/>").addClass("combocheck-list").css({ display: "block", width: this.settings.width+$w });
				this.controll.click(function(event){					
				    event.stopPropagation()					
					var $elem = $(this).parent().children('div:first');					
					var $h = $elem.height();
					
					$elem.height('auto');

					if( ($h>0) && ($h<$elem.height()) ) $elem.height($h);
					if($elem.width()<$(this).width()) $elem.width($(this).width());
					var state = $elem.is(':visible');
					$(document).click();
					if(state)
						$elem.hide();
					else{
						$elem.show();
						$(document).bind('mouseover',{obj:$elem},s);
					}
				});		
		
				var $spacer = $("<img class='combocheck-spacer'/>");
				$spacer.css({
							display: 'block',
							width: '100%',
							height: '1px',
							margin: 0,
							padding: 0
							});
				$spacer.addClass('wrapperspace');				
				this.textContainer = $("<span/>").addClass("combocheck-text").css({
		            display: "block",
		            overflow: "hidden",
					width: this.settings.width ? this.settings.width : this.settings.minWidth + 'px'
		        });
				
				this.visualBox = $("<div class='wrapper'/>");
				this.makeElement();
				this.controll.append(this.textContainer);
				this.wrapper.append(this.controll);
				this.wrapper.append($spacer);
				this.wrapper.append(this.visualBox);
				this.element.after(this.wrapper);
				
				
				this.visualBox.addClass("combocheck-box").css({ display: 'none'	});
				
				var $w =0;
				if(($.browser.mozilla)&&(this.settings.width<200)) $w=-4;
				if(this.settings.maxDropHeight>0)
					this.visualBox.css({ height : this.settings.maxDropHeight + 'px', width : this.settings.width+$w, overflow: 'auto' });
			};
			this.destruct = function(){
				this.element.next().remove();
				this.element.show();
				this.settings = null;
			};			
			this.destroy = function(){
				this.destruct();
			};			
		}		
	    return this.each(function(){
			var $elem = $(this).get(0);
			var $obj = new _init($(this),settings);
			$.data($elem,'combocheck',$obj);
			$obj.construct();			
		});
	  },
	  destroy: function($name){  
		  return $(this).each(function(){
			var $elem = $(this);
			  if( $elem.data($name) != undefined){
				  $object = $elem.data($name);
				  $.removeData($elem,$name);
				  if($.isFunction($object.destroy))
					  $object.destroy();
			  }
		  });
	  }
	});
