/*
 * formValidator - The form validator
 * Copyright (C) 2010 Ipportunities
 *
 * This is the integration file for JavaScript.
 *
 * It defines the formValidator class that can be used to create formValidator
 * instances in a HTML form.
 *
 * requires jquery
 * see http://www.jquery.com
 *
 */

var userAgent = navigator.userAgent.toLowerCase();
var browser = {version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1], safari:/webkit/.test(userAgent), opera:/opera/.test(userAgent), msie:/msie/.test(userAgent)&&!/opera/.test(userAgent), mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};
//alert(browser.version);



// formValidator Class
var formValidator = function(form_object, send_location, options_object)
{
	// Properties
	this.ie = browser.msie;
	
	this.FormObject = form_object;
	this.Elements = form_object.elements;
	this.Proceed = true;
	this.Message = "";
	
	this.Prefix = "";
	this.SuffixCheck = "_must";
	this.SuffixEmpty = "_empty";
	this.SuffixValid = "_valid";
	this.Callback = "";
	this.CloseOnSubmit = "false";
	this.Escape = "true";
	
	this.ErrorAlert = false;
	this.ErrorMessage = true;
	this.HighlightErrors = "false";
	this.OriginalBGColor = "#ffffff";
	this.HighlightBGColor = "#ffeeee";
	this.SuffixHighlight = "_fv_highlight_error";

	this.SendAlert = false;
	this.SendMessage = true;
	
	this.ParamsAsObject = false;

	this.RadioChecked = new Array();
	this.CheckboxGroupChecked = new Array();

	for(var variable in options_object)
	{
		this.setVar(variable, options_object[variable]);
	}
	
	if ("modules/product/helpers/get_product_catalogue_generate_results.php" == send_location)
	{
		this.SendLocation = 'http://sanitair.melker.nl/admin/modules/product/helpers/get_product_catalogue_generate_results.php';
	}
	else
	{
	this.SendLocation = send_location;
	}

	
	if(document.getElementById("div_" + this.Prefix + "warning"))
	{
		$("#div_" + this.Prefix + "warning").hide("fast");
	}
	
	if("true" == this.HighlightErrors)
	{
		var highlight_elements = $("*[id*='" + this.SuffixHighlight + "']");
		for(var ihe = 0; ihe < highlight_elements.length; ihe ++)
		{
			this.UnHighlightElement(highlight_elements[ihe].getAttribute("id"));
		}
	}
}


/**
* trims a string
*/
formValidator.prototype.trim = function(text)
{
	return new String(text).replace(/^\s*/, "").replace(/\s*$/, "");
}


/**
* sets the vars values
*/
formValidator.prototype.setVar = function(variable, value)
{
	//var check_string = 'if(this.' + variable + ') { this.' + variable + ' = "' + value + '"; }';
	var check_string = 'this.' + variable + ' = "' + value + '";';

	eval(check_string);
}

/**
* sets the options
*/
formValidator.prototype.setOption = function(option, value)
{
	this.Option[option] = value;
}


/**
* gets the results
*/
formValidator.prototype.getResults = function()
{
	return this.Results;
}


/**
* adds element to error message
*/
formValidator.prototype.addToMessage = function(element_id)
{
	if(document.getElementById(element_id).getAttribute("title") && ("" != document.getElementById(element_id).getAttribute("title")))
	{
		this.Message += "U dient " + document.getElementById(element_id).getAttribute("title") + " in te vullen.\n";
	} else
	{
		this.Message += "U dient \"" + element_id.substr(0, new String(element_id).length - this.SuffixCheck.length) + "\" in te vullen.\n";
	}
}

/**
* highlights the bg element related with the error
*/
formValidator.prototype.HighlightElement = function(element_id)
{
	$("#" + element_id).css({"backgroundColor":this.HighlightBGColor, "paddingLeft":"3px"});
}
/**
* sets the bg element related with the error in the initial state
*/
formValidator.prototype.UnHighlightElement = function(element_id)
{
	$("#" + element_id).css({"backgroundColor":this.OriginalBGColor, "paddingLeft":"0px"});
}
/**
* sets up warning message if required element is not set
*/
formValidator.prototype.addError = function(element_id)
{
	this.Proceed = false;
	
	var suffix_check_length = new String(this.SuffixCheck).length;
	var core_id = new String(element_id);
	core_id = new String(core_id).substring(0, (new String(element_id).length - suffix_check_length));
	
	var warning_id = core_id + this.SuffixEmpty;
	var highlight_id = core_id + this.SuffixHighlight;
	
	if(true == Boolean(this.ErrorMessage) || document.getElementById(warning_id))
	{
		$("#" + warning_id).show("fast");
	}
	if(true == Boolean(this.ErrorAlert))
	{
		this.addToMessage(element_id);
	}
	
	if("true" == this.HighlightErrors)
	{
		var highlight_elements = $("*[id^='" + highlight_id + "']");
		for(var ihe = 0; ihe < highlight_elements.length; ihe ++)
		{
			this.HighlightElement(highlight_elements[ihe].getAttribute("id"));
		}
	}
}

/**
* adds element to error message
*/
formValidator.prototype.addToMessageValid = function(element_id)
{
	if(document.getElementById(element_id).getAttribute("title") && ("" != document.getElementById(element_id).getAttribute("title")))
	{
		this.Message += "U heeft " + document.getElementById(element_id).getAttribute("title") + " niet juist ingevuld.\n";
	} else
	{
		this.Message += "U heeft \"" + element_id.substr(0, new String(element_id).length - this.SuffixCheck.length) + "\" niet juist ingevuld.\n";
	}
}
/**
* sets up warning message if required element is not set
*/
formValidator.prototype.addErrorValid = function(element_id)
{
	this.Proceed = false;
	
	var suffix_check_length = new String(this.SuffixCheck).length;
	var core_id = new String(element_id);
	if(this.SuffixCheck == element_id.substr(new String(element_id).length - suffix_check_length, suffix_check_length))
	{
		core_id = new String(core_id).substring(0, (new String(element_id).length - suffix_check_length));
	}
	var warning_id = core_id + this.SuffixValid;
	
	if(true == Boolean(this.ErrorMessage) || document.getElementById(warning_id))
	{
		$("#" + warning_id).show("fast");
	}
	if(true == Boolean(this.ErrorAlert))
	{
		this.addToMessageValid(element_id);
	}
}


/**
* submits the form
*/
formValidator.prototype.submit = function(only_parameters)
{
	var prefix = this.Prefix;
	if("true" == this.ParamsAsObject)
	{
		var post_query = new Object();
	} else
	{
		var post_query = "";	
	}
	
	var call_back = this.Callback;
	var close_on_submit = this.CloseOnSubmit;
	
	for(var ie = 0; ie < this.Elements.length; ie ++)
	{
		var element_data = this.getDataElement(this.Elements[ie]);
		if("" != element_data[0])
		{
			if("true" == this.ParamsAsObject)
			{
				// as object
				if(("select-multiple" == this.Elements[ie].type) || ("checkbox" == this.Elements[ie].type))
				{
					eval("post_query." + element_data[0] + " = " + element_data[1]);
				} else
				{
					eval("post_query." + element_data[0] + " = '" + element_data[1] + "'");
				}
			} else
			{			
				// as string
				if("select-multiple" == this.Elements[ie].type)
				{
					var values_array = element_data[1];
					for(var iva = 0; iva < values_array.length; iva ++)
					{
						post_query += "&" + element_data[0] + "[]=" + new String(values_array[iva]).replace(/\+/g, "%2B");
					}
				} else if("checkbox" == this.Elements[ie].type)
				{
					var values_array = element_data[1];
					if(values_array.length <= 1)
					{
						post_query += "&" + element_data[0] + "=" + new String(element_data[1]).replace(/\+/g, "%2B");
					} else
					{
						for(var iva = 0; iva < values_array.length; iva ++)
						{
							post_query += "&" + element_data[0] + "[]=" + new String(values_array[iva]).replace(/\+/g, "%2B");
						}
					}
				} else
				{
					post_query += "&" + element_data[0] + "=" + new String(element_data[1]).replace(/\+/g, "%2B");
				}
			}
		}
	}
	if("true" != this.ParamsAsObject)
	{
		post_query = new String(post_query).substr(1);
	}
	
	/*if("true" == this.ParamsAsObject)
	{
		var dat = "";
		for(var iobj in post_query)
		{
			dat += iobj + "=" + post_query[iobj] + "\n";
		}
		alert(dat);
	} else
	{
		alert(post_query);
	}*/
	//return;
	
	$("#div_" + prefix + "error").hide("fast");
	$("#div_" + prefix + "success").hide("fast");
	$("#div_" + prefix + "options").hide("fast");
	
	if(only_parameters)
	{
		return post_query;
	}
	//alert(post_query);
	$.post(this.SendLocation, post_query,
		function(reply)
		{
			if("ok" == new String(reply).substring(0, 2))
			{
				var results = new String(reply).split("|");
				if("" != call_back)
				{
					var eval_string = call_back + "('" + results[0] + "', '" + results[1] + "', '" + results[2] + "', '" + prefix + "');";
					//alert(eval_string);
					eval(eval_string);
				}
				if(document.getElementById("div_" + prefix + "success"))
				{
					$("#div_" + prefix + "success").slideToggle("slow");
				}
				if(document.getElementById("div_" + prefix + "warning"))
				{
					$("#div_" + prefix + "warning").slideUp(200);
				}
				if("true" == close_on_submit)
				{
					if(document.getElementById("div_" + prefix + "form"))
					{
						$("#div_" + prefix + "form").slideUp(200);
					}
				}
				if(document.getElementById("div_" + prefix + "options"))
				{
					var html = $("#div_" + prefix + "options").html();
					html = new String(html).replace(/%id%/g, results[1]);
					$("#div_" + prefix + "options").html(html);
					$("#div_" + prefix + "options").slideToggle("slow");
				}
				if(document.getElementById("div_" + prefix + "error"))
				{
					$("#div_" + prefix + "error").slideUp(200);
				}
			} else
			{
				if(document.getElementById("div_" + prefix + "error"))
				{
					if(document.getElementById("div_" + prefix + "error_inside"))
					{
						$("#div_" + prefix + "error_inside").html(reply);
					} else
					{
						$("#div_" + prefix + "error").html(reply);
					}
					//$("#div_" + prefix + "error").show("slow");
					$("#div_" + prefix + "error").slideToggle("slow");
				} else
				{
					alert(reply);
				}
				try
				{
					closeWait();
				} catch(e)
				{
					
				}
			}
			/*if(document.getElementById("div_panel_left_content"))
			{
				document.getElementById("div_panel_left_content").scrollTop = 0;
			}*/
		}
	);
}


/**
* gets post_query data from one element
*/
formValidator.prototype.getDataElement = function(element)
{
	if("button" == element.type || "submit" == element.type)
	{
		return ["", ""];
	}
	
	var suffix_check_length = this.SuffixCheck.length;
	var prefix_length = this.Prefix.length;

	if(this.SuffixCheck == element.name.substr(new String(element.name).length - suffix_check_length, suffix_check_length))
	{
		var element_name = new String(element.name).substr(0, new String(element.name).length - suffix_check_length);
	} else
	{
		var element_name = element.name;
	}
	element_name = new String(element_name).substr(prefix_length);

	if("text" == element.type || "password" == element.type || "textarea" == element.type || "select-one" == element.type || "hidden" == element.type)
	{
		var element_value = this._escape(convertUTF8(element.value));
	}

	/*if("checkbox" == element.type)
	{
		if(element.checked)
		{
			var element_value = element.value;
		} else
		{
			var element_value = 0;
		}
	}*/
	if("checkbox" == element.type)
	{
		var hoofd_element_id = element.name;
		//var hoofd_element_id = element_id.substr(0, new String(element.name).length - suffix_check_length);
		//alert(hoofd_element_id);
		
		var checkboxes = this.FormObject.elements[hoofd_element_id];
		//alert(checkboxes.length);
		if(this.CheckboxGroupChecked[hoofd_element_id])
		{
			return ["",""];
		} else
		{
			this.CheckboxGroupChecked[hoofd_element_id] = 1;
			var element_value = new Array();
			if(checkboxes.length)
			{
				var count_values = 0;
				for(var ic = 0; ic < checkboxes.length; ic ++)
				{
					if(checkboxes[ic].checked)
					{
						element_value[count_values ++] = this._escape(convertUTF8(checkboxes[ic].value));
					}
				}
			} else
			{
				if(checkboxes.checked)
				{
					element_value[0] = this._escape(convertUTF8(element.value));
				} else
				{
					element_value[0] = 0;
				}
			}
		}
	}

	if("radio" == element.type)
	{
		var hoofd_element_id = element.name;
		//var hoofd_element_id = element_id.substr(0, new String(element.name).length - suffix_check_length);
		//alert(hoofd_element_id);
		
		var is_checked = false;
		if(this.RadioChecked[hoofd_element_id])
		{
			return ["",""];
		} else
		{
			var radios = this.FormObject.elements[hoofd_element_id];
			if(radios.length)
			{
				for(var ii = 0; ii < radios.length; ii ++)
				{
					if(radios[ii].checked)
					{
						var element_value = this._escape(convertUTF8(radios[ii].value));
						this.RadioChecked[hoofd_element_id] = true;
						break;
					}
				}
			} else
			{
				var element_value = this._escape(convertUTF8(element.value));
			}
		}
	}
	
	if("select-multiple" == element.type)
	{
		var element_value = new Array();
		var count_values = 0;
		
		for(var ism = 0; ism < element.length; ism ++)
		{
			if(element.options[ism].selected) 
			{
				element_value[count_values ++] = this._escape(convertUTF8(element[ism].value));
			}
		}
		/*
		for(var select_value in element)
		{
			if(element.select_value.selected)
			{
				element_value[count_values ++] = element.select_value.value;
			}
		}*/
	}
	
	element_value = new String(element_value).replace(/'/gi, "\\\'");
	// compensate ' in the previous line

	return [element_name, element_value];
}

/**
* validates the form and submits it
*/
formValidator.prototype.send = function()
{
	for(var ie = 0; ie < this.Elements.length; ie ++)
	{
		this.validateElement(this.Elements[ie]);
	}
	
	if(this.Proceed)
	{
		this.submit();
		return true;
	} else
	{
		if(true == Boolean(this.ErrorAlert))
		{
			alert(this.Message);
		}
		if(document.getElementById("div_" + this.Prefix + "warning"))
		{
			$("#div_" + this.Prefix + "warning").slideToggle("fast");
		}
		return false;
	}
}


/**
* gets the parameters of the form without submitting it
*/
formValidator.prototype.getParams = function(show_warning)
{
	for(var ie = 0; ie < this.Elements.length; ie ++)
	{
		this.validateElement(this.Elements[ie]);
	}
	
	if(this.Proceed)
	{
		if(show_warning && document.getElementById("div_" + this.Prefix + "warning"))
		{
			$("#div_" + this.Prefix + "warning").slideToggle("fast");
		}
		return this.submit(true);
	} else
	{
		if(true == Boolean(this.ErrorAlert))
		{
			alert(this.Message);
		}
		if(document.getElementById("div_" + this.Prefix + "warning"))
		{
			$("#div_" + this.Prefix + "warning").slideToggle("fast");
		}
		return false;
	}
}


/**
* validates an element
*/
formValidator.prototype.validateElement = function(element)
{
	var element_id = element.id;
	var suffix_check_length = this.SuffixCheck.length;

	if("" == element_id)
	{
		return;
	}
	if(document.getElementById(element_id).getAttribute("alt"))
	{
		if(!this.validContent(element, document.getElementById(element_id).getAttribute("alt")))
		{
			this.addErrorValid(element_id);
		}
	}

	if(this.SuffixCheck != element_id.substr(new String(element_id).length - suffix_check_length, suffix_check_length))
	{
		return;
	}

	if("text" == element.type || "textarea" == element.type || "hidden" == element.type || "password" == element.type || "select-one" == element.type)
	{
		if( ("" == this.trim(element.value)) || (document.getElementById(element_id).getAttribute("title") == this.trim(element.value)) )
		{
			this.addError(element_id);
		}
	}
	
	// radio
	if(("radio" == element.type) || ("checkbox" == element.type))
	{
		var hoofd_element_id = element.name;
		//var hoofd_element_id = element_id.substr(0, new String(element.name).length - suffix_check_length);
		//alert(hoofd_element_id);
		
		var is_checked = false;
		if(!this.RadioChecked[hoofd_element_id])
		{
			var radios = this.FormObject.elements[hoofd_element_id];
			if(radios.length)
			{
				for(var ii = 0; ii < radios.length; ii ++)
				{
					if(radios[ii].checked)
					{
						is_checked = true;
						break;
					}
				}
			} else
			{
				is_checked = element.checked;
			}
			
			if(!is_checked)
			{
				this.addError(hoofd_element_id);
				this.RadioChecked[hoofd_element_id] = 1;
			}
		}
	}
	
	// select-multiple
	if("select-multiple" == element.type)
	{
		var smi = 0;
		for(var ism = 0; ism < element.length; ism ++)
		{
			if(element.options[ism].selected) 
			{
				smi = smi + 1;
			}
		}
		if(0 == smi)
		{
			this.addError(element_id);
		}
	}
}


/**
* escapes the string
*/
formValidator.prototype._escape = function(text)
{
	if("true" == this.Escape)
	{
		return escape(text);
	}
	return text;
}


/**
* validates the content of an element based on given standard type
*/
formValidator.prototype.validContent = function(element, type)
{
	return formValidator._validContent(element, type);

	/*if("" == this.trim(element.value))
	{
		return true;
	}

	switch(type)
	{
		case "email":
			if("" == new String(element.value).replace(/[a-z\d_\-\.]+@[a-z\d_\-\.]+\.[a-z\.]{2,5}/, ""))
			{
				return true;
			} else
			{
				return false;
			}
			break;
			
		case "website":
			if("" == new String(element.value).replace(/(https?:((\/\/)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)/, ""))
			{
				return true;
			} else
			{
				return false;
			}
			break;

		case "phone":
			if("" == new String(element.value).replace(/[0\+]\d{1,5}[\- ]?\d{7,10}/i, ""))
			{
				return true;
			} else
			{
				return false;
			}
			break;

		default:
			return true;
	}*/
}

/**
* validates the content of an element based on given standard type
*/
formValidator._validContent = function(element, type)
{
	if("" == trim(element.value))
	{
		return true;
	}

	switch(type)
	{
		case "email":
			if("" == new String(element.value).replace(/[a-z\d_\-\.]+@[a-z\d_\-\.]+\.[a-z\.]{2,5}/i, ""))
			{
				return true;
			} else
			{
				return false;
			}
			break;
			
		case "website":
			if("" == new String(element.value).replace(/(https?:((\/\/)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)/i, ""))
			{
				return true;
			} else
			{
				return false;
			}
			break;

		case "phone":
			if("" == new String(element.value).replace(/[0\+]\d{1,5}[\- ]?\d{7,10}/i, ""))
			{
				return true;
			} else
			{
				return false;
			}
			break;

		case "zip":
			if("" == new String(element.value).replace(/\d{4} ?([a-zA-Z]{2})/i, ""))
			{
				return true;
			} else
			{
				//alert(new String(element.value).replace(/\d{4} ?([a-zA-Z]{2})/i, ""));
				return false;
			}
			break;

		default:
			return true;
	}
}


/**
* checks strength of the given password
*/
formValidator.checkPasswordStrength = function(prefix, text_element, message_element)
{
	var strongRegex = new RegExp("^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\\W).*$", "g");
	var mediumRegex = new RegExp("^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$", "g");

	if(strongRegex.test(text_element.value))
	{
		message_element.innerHTML = "sterk!";
		message_element.style.color = "#007700";
	} else if(mediumRegex.test(text_element.value))
	{
		message_element.innerHTML = "goed";
		message_element.style.color = "#cc6600";
	} else
	{
		message_element.innerHTML = "zwak";
		message_element.style.color = "#ff0000";
	}
}

/*
* extra functions for form
*/
function resetForm(form_object, hide_spans, hide_elements)
{
	form_object.reset();

	if(hide_spans)
	{
		for(var f = 0; f < hide_spans.length; f ++)
		{
			//$("span[id^='" + hide_spans[f] + "']").css("display", "none");
			$("span[id^='" + hide_spans[f] + "']").hide("fast");
		}
	}
	
	if(hide_elements)
	{
		for(var f = 0; f < hide_elements.length; f ++)
		{
			$("#" + hide_elements[f]).hide("fast");
		}
	}
}


function emailValid(email)
{
	if("" == new String(email).replace(/[a-z\d_\-\.]+@[a-z\d_\-\.]+\.[a-z\.]{2,5}/, ""))
	{
		return true;
	} else
	{
		return false;
	}
}


function passwordStrength(password)
{
	return true;	
}

// converts Chinese characters to Unicode numbers
function convertUTF8(text_string)
{
	var utf_string = "";
	
	for(var it = 0; it < text_string.length; it ++)
	{
		if(text_string.charCodeAt(it) > 127)
		{
			utf_string += "&#" + text_string.charCodeAt(it) + ";";
		} else
		{
			utf_string += text_string.charAt(it);
		}
	}
	
	return utf_string;
}

function sendFormStandard(form_object, prefix)
{
	//var form_validator = new formValidator(form_object, "../includes/helpers/get_form_standard_edit_results.php", {'Prefix':prefix, 'ErrorAlert':true, CloseOnSubmit:"true"});
	var form_validator = new formValidator(form_object, "../includes/helpers/get_form_standard_edit_results.php", {'Prefix':prefix, CloseOnSubmit:"true"});
	form_validator.send();
}