var validator_form = {
	init: function (aSettings){
	
		var aDefaults = {
			showPrompt: true,
			spanMode: false,
			errorInfo: "Proszę wypełnić pola oznaczone '*'",
			errorEmail: 'Podany adres email jest nieprawidłowy',
			errorSelCheck: 'Proszę wybrać odpowiednią opcję',
			errorPassword: 'Podane hasła się różnią!',
			errorText: 'Proszę wypełnić pole'
		}  
		var aSettings =  $.extend(aDefaults, aSettings); 
		$("form#"+aSettings["formId"]).submit(function(){
		
				var sErrorInfo = $('#errorInfoTxt span');	
				sErrorInfo.html('');
				
				aError = [];
				aErrorTxt = [];
				aValidationTypes = [
					"isRequired", "isEmail", "isNumeric", 
					"isSelectRequire", "isMultiSelect", "wysiwyg",
					"isCheckPasswd", "isChecked", "isStars",
					"isCheckedCheckbox"
				];
				
		 		for(var n = 0; n < aValidationTypes.length; n++) 
				{
					var aPola = aSettings[aValidationTypes[n]];
							
					if(aPola != null) 
					{
						if(aValidationTypes[n] == 'isCheckPasswd')
						{
							sInputField1 = $("#"+aPola[0]);
							sInputField2 = $("#"+aPola[1]);
							bValid = (sInputField1.val() == sInputField2.val()) ? true : false;
							
							if(!bValid)
							{
								aError.push(aPola[0]);
								sInputField1.addClass("error_colors");
								sInputField2.addClass("error_colors");
								
								aErrorTxt.push(aSettings.errorPassword);
							}
						}
						else if(aValidationTypes[n] == 'isStars')
						{
							if(typeof aSettings['isStars'][0] != undefined)
							{
								if(aSettings['isStars'][0] == aPola[0])
								{
									bValid = !isRequired(sInputField.val());
									sInputField = $("#"+aSettings['isStars'][1]);
									
									if(!bValid) 
									{
										aError.push(aPola[0]);
										sInputField.addClass("error_colors");
										
//										aErrorTxt.push(aSettings.errorPassword);
									} 
									else 
										sInputField.removeClass("error_colors");
								}
							}
						}
						else
						{
							for(i=0; i < aPola.length; i++) 
							{
								sInputField = $("#"+aPola[i]);
								switch (aValidationTypes[n]) 
								{
									case "isRequired":
										bValid = !isRequired(sInputField.val());
										if(!bValid)
											aErrorTxt.push(aSettings.errorText);
										break;
										
									case "isEmail":
										bValid = isEmail(sInputField.val());
										if(!bValid)
											aErrorTxt.push(aSettings.errorEmail);
										break;
										
									case "isNumeric":
										bValid = isNumeric(sInputField.val());
										if(!bValid)
											aErrorTxt.push(aSettings.errorText);
										break;
										
									case "isSelectRequire":
										bValid = !isSelectRequire(sInputField.val());
										if(!bValid)
											aErrorTxt.push(aSettings.errorSelCheck);
										break;
										
									case "isMultiSelect":
										bValid = !hasSelected((sInputField.val() || []));
										if(!bValid)
											aErrorTxt.push(aSettings.errorSelCheck);
										break;
										
									case 'isChecked':
										bValid = $("input[@name='"+aPola[i]+"']:checked").val();
										if(!bValid)
											aErrorTxt.push(aSettings.errorSelCheck);
										break;
										
									case 'isCheckedCheckbox':
										var sDiv = $('div#'+aPola[i]);
										var iCnt = $("input[@type=checkbox][@checked]", sDiv).size();

										bValid = (iCnt == 0) ? false : true;

										if(!bValid)
											aErrorTxt.push(aSettings.errorSelCheck);
										break;
										
									case "wysiwyg":
										if(in_array(aPola[i], aSettings["wysiwyg"], false))
										{
											sInputField = $("#"+aPola[i]+"___Frame");
											var oEditor = FCKeditorAPI.GetInstance(aPola[i]);
											
											if(oEditor.GetXHTML() == "" || oEditor.GetXHTML() == null)
												bValid = false;
											else
												bValid = true;
										}
										
										if(!bValid)
											aErrorTxt.push(aSettings.errorText);
										break
								}
								
								if(!bValid) 
								{
									aError.push(aPola[i]);
									sInputField.addClass("error_colors");
								} 
								else 
								{
									$('#put_error_'+aPola[i]).html('').removeClass("span_error_colors").hide();
									sInputField.removeClass("error_colors");
								}
							}
						}
					}
				}
				
				if(aError.length > 0)
				{
					if(aSettings.showPrompt)
						$.prompt(VALID_ALL_EMPTY_FIELDS, { buttons: { ZAMKNIJ: true } });
					else
					{
						if(aSettings.spanMode)
						{
							for(var iK = 0; iK < aError.length; iK++)
							{
								$('#put_error_'+aError[iK]).html(aErrorTxt[iK]).addClass("span_error_colors").show();
							}
						}
						else
						{
							$('#errorInfoTxt span').append('<div>'+aSettings.errorInfo+'</div>');
							$('#errorInfoTxt').show();
						}
					}
				}
				else if(aSettings.showPrompt)
				{
					if(aSettings.spanMode)
					{
						for(var iK = 0; iK < aError.length; iK++)
						{
							$('#put_error_'+aError[iK]).html(aErrorTxt[iK]).addClass("span_error_colors").show();
						}
					}
					else
					{
						$('#errorInfoTxt span').html('');
						$('#errorInfoTxt').hide();
					}
				}
				
				return (aError.length > 0) ? false : true;
			}
		);
	}
};

function hasSelected(oSel)
{
	return (oSel.length > 0) ? false : true;
}

function in_array(needle, haystack, strict) 
{
    if (strict) 
	 	function equals(a,b) { return a === b }
    else 
	 	function equals(a,b) { return a == b }

    for (var i in haystack) 
	 {
        if (equals(haystack[i], needle)) 
		  		return true;
    }
    return false;
}

// returns true if the string is not empty
function isRequired(str)
{
	return (str == null) || (str.length == 0);
}

function isSelectRequire(int)
{
	return (int == "") || (int == 0);
}

// returns true if the string is a bValid email
function isEmail(str)
{
	if(isRequired(str)) return false;
	var re = /^[^\s()<>@,;:\/]+@\w[\w\.-]+\.[a-z]{2,}$/i
	return re.test(str);
}

// returns true if the string only contains characters 0-9 and is not null
function isNumeric(str)
{
	if(isRequired(str)) return false;
	var re = /[\D]/g
	if (re.test(str)) return false;
	return true;
}