jQuery.fn.extend({
    customCheckbox: function(){
        return $("input[type='checkbox']", this).each(function(i,e){
            $(e).wrap('<span class="checkbox'+((e.checked)?' checked':'')+((e.disabled)?' disabled':'')+'"></span>');
            var wrap = $(e).parent().get(0);
            var label = $(e).attr('id');
            $(e).click(function(event){event.stopPropagation();e.toggle(false)});
            e.enable = function(){
                e.disabled = false;
                $(wrap).removeClass('disabled');
                $("label[for='"+label+"']").removeClass('disabled');
            }
            e.disable = function(){
                e.disabled = true;
                $(wrap).addClass('disabled');
                $("label[for='"+label+"']").addClass('disabled');
            }
            e.check = function(){
                if (!e.disabled){
                    e.checked = true;
                    $(wrap).addClass('checked');
                    $("label[for='"+label+"']").addClass('checked');
                }
            }
            e.uncheck = function(){
                if (!e.disabled){
                    e.checked = false;
                    $(wrap).removeClass('checked');
                    $("label[for='"+label+"']").removeClass('checked');
                }
            }
            e.toggle = function(swap){
                if (e.checked){
                    if(swap)e.uncheck();else e.check();
                } else {
                    if(swap)e.check();else e.uncheck();
                }
            }
            $(wrap).mousedown(function(){$(wrap).addClass('down')});
            $(wrap).mouseout(function(){$(wrap).removeClass('down')});
            $(wrap).mouseup(function(){$(wrap).removeClass('down')});
            $(wrap).click(function(){e.toggle(true)});
            $(e.form).find("label[for='"+label+"']").click(function(){e.toggle(true);return false});
            $(e.form).find("label[for='"+label+"']").addClass(wrap.className);
            $(e.form).find("label[for='"+label+"']").mousedown(function(){$(wrap).addClass('down')});
            $(e.form).find("label[for='"+label+"']").mouseout(function(){$(wrap).removeClass('down')});
            $(e.form).find("label[for='"+label+"']").mouseup(function(){$(wrap).removeClass('down')});
        });
    },
    progressBars: function(){
    	return $('.progressbar', this).each(function(i,e){
	        var val = parseInt($(e).text());
	        $(e).wrapInner('<div class="wrapper"><div class="bar" style="width:'+val+'%"><b></b></div></div>').wrap('<div class="progressbar-wrapper"></div>');
	        $(e).after('<div class="value">'+val+'%</div>');
            e.set = function(val){
            	val = parseInt(val)+'%';
            	$(e).find('b').text(val);
            	$(e).find('.bar').css('width', val);
            	$(e).next().text(val);
            }
            e.get = function(){
            	return parseInt($(e).find('b').text());
        	}
	    });
	},
	dropdownbox: function(){
		return $('div.dropdownbox').each(function(i,e){
    		var init = true;
    		$(e).find("div.value-wrapper").click(function(event){
    			if (!$(e).hasClass('open')){
    				$('div.dropdownbox.open').each(function(i,ef){$(ef).removeClass('open')});
        			$(e).addClass('open');
					event.stopPropagation();
					var fn = function(){
	    				$(e).removeClass('open');
	    				$(document).unbind("mousedown", fn);
					}
	    			$(document).bind("mousedown", fn);
        		} else {
        		    $(document).mousedown();
        		}
    		});
    		$(e).find("div.value-wrapper").mousedown(function(event){event.stopPropagation()});
            $(e).parent().get(0).onselectstart = function(){return false};
    		var bt = $(e).next();
        	$(e).find("ul li").each(function(x,o){
        		if (x%2==0) $(o).addClass('alt');
				$(o).mouseover(function(){
					if (!$(o).hasClass('disabled')) $(o).addClass('over');
				});
				$(o).mouseout(function(){
					$(o).removeClass('over');
				});
				$(o).click(function(){
					if (!$(o).hasClass('disabled')){
						$(o).removeClass('over');
						$(e).find("ul li.selected").removeClass('selected');
						$(o).addClass('selected');
						$(e).find("div.selected").html($(o).html());
						$(e).find("input").val($.trim($(o).find("span").html()));
                        if (bt.hasClass('commit')){
                        	bt.attr('ddlabel', $(e).find("div.selected span.label").text());
                        	bt.attr('ddvalue', $(e).find("div.selected span.value").text());
                        }
                        if (!init) $(e).find("div.value-wrapper").click();
                        if ($(e).hasClass('autocommit')&&!init) bt.click();
					}
				});
				$(o).mousedown(function(event){event.stopPropagation()});
        	});
        	$(e).find("ul li.selected").click();
        	init = false;
    	});
	}
});