(function($){

	var methods = {
		detectControl: function( el )
		{
			var tag = el.attr('tagName').toLowerCase();

			switch ( tag ) {
				case 'undefined':
					return false;
					break;
				case 'input':
					return tag + '-' + el.attr("type").toLowerCase();
					break;
				default:
					return tag;
			};
		},
		createSelect: function( el, opts )
		{
			var shim = opts.shim;
			var a = '<'+shim+'>';
			el.wrap($(a).addClass('tehcontrol select'));
			el.before($(a).addClass('tehcontrolfake select'));

			var wrap = el.parent();
			var fake = el.parent().find('.tehcontrolfake');
			var fakeW = fake.outerWidth();
			var label = (el.attr('title') != '' ) ? el.attr('title') : el.find(':selected').text();

			// Apply critical styles
			wrap.css({position:'relative'});
			el.css({Width:fakeW+"px"});

			fake.text( (label.length < 18) ? label : label.substr(0,17) + "…" );

			el.click(function(e){
			/*	el.css({width:'auto'});*/
			});

			el.change( function(){
				var current = el.find(':selected').text();
				fake.text( (current.length < 18) ? current : current.substr(0,17) + "…" );
				el.css({width:fake.outerWidth()+"px"});
			});
		},
		updateSelect: function( el )
		{
			var fake = el.parent().find('.tehcontrolfake');
			var current = el.find(':selected').text();
			fake.text( (current.length < 18) ? current : current.substr(0,17) + "…" );
		},
		createCheckbox: function( el, opts )
		{
			var shim = opts.shim;
			var addClickHandler = false;

			if( el.parent().attr('tagName').toLowerCase() != 'label' ) {
				addClickHandler = true;
			}

			var a = '<'+shim+'>';
			el.wrap($(a).addClass('tehcontrol checkbox'));
			el.before($(a).addClass('tehcontrolfake checkbox'));

			var wrap = el.parent();
			var fake = el.parent().find('.tehcontrolfake');

			wrap.css({position:'relative'});

			if( addClickHandler )
			{
				fake.click( function() {
					el.attr('checked', !el.attr('checked') );
					fake.toggleClass('checked');
				});
			} else {
				el.change( function() {
					fake.toggleClass('checked');
				});
			}
		}
	};

	$.fn.tehCustomControl = function(opts)
	{

		var _opts = $.extend( {}, $.fn.tehCustomControl.defaults, opts );

		return this.each(function(i,e){
			var type = methods.detectControl( $(e) );
			switch(type) {
				case 'select':
					methods.createSelect( $(e), _opts );
					break;
				case 'input-checkbox':
					methods.createCheckbox( $(e), _opts );
					break;
			}
		});
	};

	$.fn.tehCustomControl.defaults = {
		shim:'div'
	};

})(jQuery);

