/*	
	CP Form
	By: Tim Gieseking 

	Fancy form plugin for the Complete Package template
	http://cpackage.timgweb.com
	
	Version 0.9 
*/
	
;(function($) {
			
	$.fn.cpform = function(options) {

		var opts = $.extend({}, $.fn.cpform.defaults, options),
			$cpform = this,
			$cplabels = $cpform.find('label'),
			$cptext = $cpform.find('input[type="text"], textarea'),
			$cpradio = $cpform.find('input[type="radio"]'),
			$cpcheckbox = $cpform.find('input[type="checkbox"]'),
			$cpselect = $cpform.find('select');
		
		// SELECT BOXES
		
		// hide open selects when user clicks somewhere
		if ($cpselect.length > 0)
		{
			var cpfHideSelects = function(o){
				var $uls = $('.cpselect-container ul:visible');
				$uls.hide();
			};
		
			var cpfCheckClick = function(e) {
				var $target = $(e.target);
				if ($target.parents('.cpselect-container').length === 0) { cpfHideSelects($target); }
			};
		
			var cpfSelectListener = function () {
				$(document).mousedown(cpfCheckClick);
			};
			
			if( $cpselect.length > 0 ){ cpfSelectListener(); }
			
			$cpselect.each(function() 
			{
				var $thisselect = $(this),
					$sopts = $thisselect.children('option'),
					existingClasses = $thisselect.attr('class'),
					sclass = opts.selectClass;
					
					if (existingClasses != '') { sclass += " " + existingClasses; }
					
					var shtml = '<div class="cpselect-container"><div class="' + sclass + '"><span>' + $sopts.filter(':selected').text() + '</span><a href="#"></a></div><ul class="' + opts.selectULClass + '">';
				 
				 $sopts.each(function() { 
				 	shtml += '<li><a href="#"><span>' + $(this).text() + '</span></a></li>';
				 });
				 
				 shtml += '</ul></div>';
				 
				 var $pseudolist = $(shtml).insertBefore($thisselect),
				 	 $pseudolistdiv = $pseudolist.find('div.' + opts.selectClass),
				 	 $pseudolisttext = $pseudolistdiv.children('span'),
				 	 $pseudolistanchor = $pseudolistdiv.children('a'),
				 	 $pseudolistul = $pseudolist.find('ul.' + opts.selectULClass),
				 	 $pseudolistitems = $pseudolistul.find('a');
				 					 			 
				 $pseudolistitems.click(function(e) { 
				 	e.preventDefault();
				 	
				 	var $this = $(this),
				 		idx = $pseudolistitems.index($this);
				 	
				 	$thisselect[0].selectedIndex = idx;
				 	$thisselect.trigger('change');
				 	$pseudolistul.hide();
				 });
				 
				 $pseudolistdiv.click(function(e) { 
				 	e.preventDefault();
				 	$('.cpselect-container ul.' + opts.selectULClass).not($pseudolistul).hide();
				 	$pseudolistul.slideToggle('fast');
				 });
				 
				 $thisselect.change(function() { 
				 	$pseudolisttext.text($sopts.filter(':selected').text());
				 });

			 	 $pseudolistul.show();
				 var ulheight = 0;
				 
				 $pseudolistul.children('li').each(function() {
				 	ulheight = ulheight + parseInt($(this).outerHeight());
				 });
				 
				 if ($pseudolistul.height() > ulheight && ulheight > 0) { $pseudolistul.height(ulheight); }
				 
				 if (opts.selectAutoWidth === true)
				 {
				 	
				 	var maxwidth = 0;
				 	
				 	$pseudolistitems.children('span').each(function() { 
				 	
				 		var $this = $(this),
				 			$thisanchor = $this.parent(),
				 			thiswidth = parseInt($this.outerWidth()) + parseInt($thisanchor.css('paddingLeft')) + parseInt($thisanchor.css('paddingRight'));
				 						 		
				 		if (thiswidth > maxwidth) { maxwidth = thiswidth; }
				 	});
				 	
				 	if (maxwidth > 0) 
				 	{
				 		maxwidth = maxwidth + parseInt($pseudolistanchor.outerWidth()) + 'px';
				 		$pseudolistdiv.width(maxwidth);
					 	$pseudolistul.width(maxwidth);
					}
					
				 }
				 
				$pseudolistul.hide();
				 
			});
		}
		
		// RADIO INPUTS
		$cpradio.each(function() 
		{ 
			var $this = $(this),
				rclass = opts.radioClass,
				existingClasses = $this.attr('class');
				
			if ($this[0].checked) { rclass += " " + opts.radioCheckedClass; }
			if (existingClasses != '') { rclass += " " + existingClasses; }
			
			var $cpradiobtn = $('<a href="#" class="' + rclass + '"></a>').insertBefore($this);
			
			$cpradiobtn.click(function(e) { 
			 	e.preventDefault();
				$this.trigger('click').trigger('change');
			});
			
			$this.next('span').click(function() { $cpradiobtn.trigger('click'); });
			
		})
		.change(function() 
		{ 
			var $this = $(this);
			
			if ($this[0].checked)
			{
				$this.siblings('.' + opts.radioClass).removeClass(opts.radioCheckedClass);
				$this.prev('.' + opts.radioClass).addClass(opts.radioCheckedClass);	
			}
			
		});
		
		// CHECKBOXES
		$cpcheckbox.each(function() 
		{ 
			var $this = $(this),
				chclass = opts.checkboxClass,
				existingClasses = $this.attr('class');
				
			if ($this.is(':checked')) { chclass += " " + opts.checkboxCheckedClass; }
			if (existingClasses != '') { chclass += " " + existingClasses; }
			
			var $cpcheckbtn = $('<a href="#" class="' + chclass + '"></a>').insertBefore($this);
			
			$cpcheckbtn.click(function(e) {
			 	e.preventDefault();
				$this.trigger('click').trigger('change');
			});
			
			$this.next('span').click(function() { $cpcheckbtn.trigger('click'); });
			
		})
		.change(function() 
		{ 
			var $this = $(this);
			
			if ($this.is(':checked'))
			{
				$this.prev('.' + opts.checkboxClass).addClass(opts.checkboxCheckedClass);	
			}
			else
			{
				$this.prev('.' + opts.checkboxClass).removeClass(opts.checkboxCheckedClass);	
			}
			
		});
				
		// TEXT INPUTS AND TEXTAREAS
		// LABELS (for text inputs)
		$cplabels.click(function() 
		{ 
			var $this = $(this),
				$cpinput = $this.siblings('input, textarea'),
				newleft = parseInt($cpinput.outerWidth()) - parseInt($this.outerWidth()) - parseInt($cpinput.css('paddingRight'));
			
			$this.addClass(opts.focusClass);			
			$this.animate({left: newleft}, opts.speed, opts.easing);
			$cpinput.focus();	
		});
		
		$cptext.each(function() 
		{ 
			var $this = $(this);
			if ($this.val() != '')
			{
				var $cplabel = $this.siblings('label');
				$cplabel.hide();
			}
			//$this.parent().width($this.outerWidth());
		})
		.focus(function() 
		{ 
			var $cplabel = $(this).siblings('label');
			if (!$cplabel.hasClass(opts.focusClass)) { $cplabel.trigger('click'); }
			
		})
		.click(function() 
		{ 
			$(this).trigger('focus'); 
		})
		.blur(function() 
		{ 
			var $this = $(this);
			if ($this.val() == $this[0].defaultValue || $this.val() == '') 
			{ 
				var $cplabel = $this.siblings('label');
				$cplabel.css({left: '', right: ''});
				$cplabel.removeClass(opts.focusClass);
			}
		})
		.keyup(function() 
		{ 
			var $this = $(this),
				$cplabel = $this.siblings('label');
			
			if ($this.val() != '') { $cplabel.fadeOut(opts.speed); }
			else { $cplabel.fadeIn(opts.speed); }
			
		});
		
		// on submit
		$cpform.submit(function() 
		{ 		
					
			var $this = $(this),
				$errordiv = $('.' + opts.errorClass);
						
			$errordiv.hide();
			$('#' + opts.successMessageID).remove();
					
			if (opts.validateSubmit === true)
			{
				var requiredfields = $this.find('.required'),
					blocksubmit = false;
				
				requiredfields.removeClass(opts.highlightRequiredClass);
				
				requiredfields.each(function() { 
					var $thisfield = $(this),
						thisvalue = $thisfield.val();
					if (thisvalue == '') { 
						blocksubmit = true;
						$thisfield.addClass(opts.highlightRequiredClass); 
					}
				});
				
				if (blocksubmit === true) 
				{ 					
					if ($errordiv.length === 0) { $('<div class="'+ opts.errorClass + '">' + opts.fillRequiredError + '</div>').insertBefore($this).fadeIn(); }
					else { $errordiv.fadeIn(); }
					
					return false;
				}
			}
			
			if (opts.ajaxSubmit === true)
			{
		
				var $messagediv =  $('<div class="'+ opts.successMessageClass + '" id="' + opts.successMessageID + '"></div>').insertBefore($this),
			    	asoptions = { 
			        	target:        '#' + opts.successMessageID,
			        	success:       ajaxSuccess,
			        	resetForm:	   false
					};
				
				$this.fadeOut('fast', function() { 
					
					$('<span class="'+ opts.pleaseWaitClass + '">' + opts.pleaseWaitText + '</span>').insertBefore($this); 
					
					$this.ajaxSubmit(asoptions);
					
				});
								
				return false;
			}
			
		});
		
		function ajaxSuccess(responseText, statusText)
		{
			var $message = $('#' + opts.successMessageID);
			
			$('.' + opts.pleaseWaitClass).remove();

			$message.html(responseText).fadeIn();
			
			if (statusText != "success")
			{
				$cpform.fadeIn();
			}
			
		}		

	};
		
	// default options
	$.fn.cpform.defaults = {
		speed: 200,
		easing: "swing",
		focusClass: "hasfocus",
		ajaxSubmit: true,
		radioClass: "radiobtn",
		radioCheckedClass: "radiochecked",
		checkboxClass: "checkbtn",
		checkboxCheckedClass: "checkchecked",
		selectClass: "selectbox",
		selectULClass: "selectlist",
		highlightRequiredClass: "highlightrequired",
		errorClass: "error",
		successMessageClass: "message",
		successMessageID: "successmessage",
		fillRequiredError: "Wypełnij wszystkie wymagane pola.",
		pleaseWaitText: "Proszę czekać...",
		pleaseWaitClass: "pleasewait",
		selectAutoWidth: true,
		validateSubmit: true
	};
	
})(jQuery);
