$(document).ready(function(){
	Validate.RegisterForm("warranty-request-form");
});

///////////////////////////////////////////////////////////////////////////////////////////////////
//=================================================================================================
// Warranty related API
//=================================================================================================
function Warranty() {}
///////////////////////////////////////////////////////////////////////////////////////////////////
	Warranty.AddItem = function(element)
	{
		var description = myString.Trim(element.value);
		if (description.length > 0)
		{
			var ol = document.getElementById("warranty-list");
			var li = document.createElement("LI");
			var span = document.createElement("SPAN");
			li.className = "warranty-item";
			li.title = "Warranty items can be edited by a single mouse click.";
			li.onclick = function(event) {Warranty.EditItem(this);};
			li.onmouseover = function() {Generic.ChangeClass(this, "warranty-item-hover");}
			li.onmouseout = function() {Generic.ChangeClass(this, "warranty-item");}
			span.style.fontWeight = "normal";
			span.appendChild(document.createTextNode(element.value));
			li.appendChild(span);
			ol.insertBefore(li, ol.childNodes[ol.childNodes.length - 1]);
			element.value = "";
			element.focus();
		}
		Warranty.UpdateItemCount();
	}

	Warranty.EditItem = function(element)
	{
		var textarea = document.getElementById("item-description");
		textarea.value = element.firstChild.innerHTML;
		element.parentNode.removeChild(element);
		Warranty.UpdateItemCount();
	}

	Warranty.ItemsExist = function()
	{
		var ol = document.getElementById("warranty-list");
		return (ol.childNodes.length > 1 ? true : false);
	}

	Warranty.UpdateItemCount = function()
	{
		var ol = document.getElementById("warranty-list");
		var title = document.getElementById("warranty-list-title");
		var notice = document.getElementById("warranty-submit-notice");
		title.innerHTML = (ol.childNodes.length > 1 ? ol.childNodes.length - 1 : "No") + " warranty item" + (ol.childNodes.length == 2 ? "" : "s");
		notice.innerHTML = (ol.childNodes.length > 1 ? "Submit your " + (ol.childNodes.length - 1) + " warranty item" + (ol.childNodes.length == 2 ? "" : "s") : "Add one or more warranty items and submit your warranty request");
		Warranty.Validate();
	}

	Warranty.DownloadStatus = function(allow)
	{
		var download = document.getElementById("download-manual-button");
		download.disabled = !allow;
		download.src = (download.disabled ? "/assets/snippets/warranty/download-manual-d.gif" : "/assets/snippets/warranty/download-manual.gif");
		download.style.cursor = (download.disabled ? "not-allowed" : "pointer");
	}
	
	Warranty.SubmitStatus = function(allow)
	{
		var submit = document.getElementById("submit-warranty-request");
		submit.disabled = !allow;
		submit.src = (submit.disabled ? "/assets/snippets/warranty/submit-request-d.gif" : "/assets/snippets/warranty/submit-request.gif");
		submit.style.cursor = (submit.disabled ? "not-allowed" : "pointer");
	}
	
	Warranty.AddressIsPRH = function(address, city)
	{
		var target = "/assets/snippets/warranty/get.php?request=IsPRH";
		request = XML.HttpRequest();
		if (!request) {return false;}
		request.onreadystatechange = function()
		{
			if (request.readyState == 4)
			{
				if (request.status == 200)
				{
					result = XML.Parse(request.responseText, "Node0", "IsPRH");
					var notice = document.getElementById("community-lot");
					if (result != null && result[0].IsPRH == "true")
					{
						document.forms["warranty-request-form"].buyer.value = result[0].contact_id;
						document.forms["warranty-request-form"].cid.value = result[0].construction_id;
						document.forms["warranty-request-form"].address.value = result[0].address;
						document.forms["warranty-request-form"].city.value = result[0].city;
						notice.innerHTML = result[0].platName.toUpperCase() + " #" + result[0].lot.toUpperCase();
						Warranty.DownloadStatus(true);
						Warranty.SubmitStatus(Validate.IsComplete(document.forms["warranty-request-form"]) && Warranty.ItemsExist());
					}
					else
					{
						notice.innerHTML = "PACIFIC RIDGE HOMES IS NOT ASSOCIATED WITH THE ABOVE ADDRESS!";
						Warranty.DownloadStatus(false);
						Warranty.SubmitStatus(false);
					}
				}
			}
		}
		var params = "address=" + encodeURI(address);
		params += "&city=" + encodeURI(city);
		request.open('POST', target, true);
		request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		request.setRequestHeader("Content-length", params.length);
		request.setRequestHeader("Connection", "close");
		request.send(params);
	}

	Warranty.Validate = function()
	{
		var formCompleted = Validate.IsComplete(document.forms["warranty-request-form"]);
		var address = myString.Trim(document.forms["warranty-request-form"].address.value);
		var city = myString.Trim(document.forms["warranty-request-form"].city.value);
		if (formCompleted || (address.length > 0 && city.length > 0))
		{
			Warranty.AddressIsPRH(address, city);
		}
		else
		{
			Warranty.DownloadStatus(false);
			Warranty.SubmitStatus(false);
		}
	}

// 4629 158th PL SW
// Lynnwood

	Warranty.OnSubmit = function()
	{
		var ul = document.getElementById("warranty-list");

		// community & lot 
		var h = document.createElement("input");
		h.type = "hidden";
		h.id = h.name = "community-lot";
		h.value = document.getElementById("community-lot").innerHTML;
		document.forms["warranty-request-form"].appendChild(h);

		// item count
		h = document.createElement("input");
		h.type = "hidden";
		h.id = h.name = "item-count";
		h.value = ul.childNodes.length - 1;
		document.forms["warranty-request-form"].appendChild(h);

		// all items
		for (var i = 0; i < ul.childNodes.length - 1; i++)
		{
			h = document.createElement("input");
			h.type = "hidden";
			h.id = h.name = "request-" + i;
			h.value = ul.childNodes[i].innerHTML;
			document.forms["warranty-request-form"].appendChild(h);
		}
		return true;
	}

	Warranty.DownloadManual = function(button, url)
	{
		if (!/d\.gif$/.test(button.src))
		{
			Browser.Window(url, "height=576,width=768,toolbar=no,location=no,status=no,menubar=no,resizable=yes", "HO-Manual");
		}
	}
	
	
///////////////////////////////////////////////////////////////////////////////////////////////////
//=================================================================================================
// Formatting related API
//=================================================================================================
function Format() {}	
///////////////////////////////////////////////////////////////////////////////////////////////////
	Format.Phone = function(input)
	{
		format = "";
		var phone = input;
		phone = phone.replace(/\D/g, '');
		var c1 = phone.match(/^(\d{3})\d+$/);
		var c2 = phone.match(/^\d{3}(\d{3})\d{4}$/);
		var c3 = phone.match(/^\d+(\d{4})$/);
		return c1[1]+"-"+c2[1]+"-"+c3[1];
	}

	Format.Date = function(date, format)
	{
		/******************
		dd = day
		MM = month
		yy = year (or yyyy)
		hh = hours
		mm = minutes
		ss = seconds
		*******************/
		function _addZero(number) {return (number < 10 ? "0" : "") + number;}
		var day = _addZero(date.getDate());
		var month = _addZero(date.getMonth() + 1);
		var yearlong = _addZero(date.getFullYear());
		var yearshort = _addZero(date.getFullYear().toString().substring(3, 4));
		var year = (format.indexOf("yyyy") > -1 ? yearlong : yearshort);
		var hour = _addZero(date.getHours());
		var minute = _addZero(date.getMinutes());
		var second = _addZero(date.getSeconds());
		var formatted = format.replace(/dd/g, day).replace(/MM/g, month).replace(/y{1,4}/g, year);
		return formatted.replace(/hh/g, hour).replace(/mm/g, minute).replace(/ss/g, second);
	} 

	Format.Number = function(value, precision, seperator)
	{
		precision = (precision == null ? 2 : precision);
		seperator = (seperator == null ? "" : seperator);
		var result = (precision > 0 ? parseFloat(value).toFixed(precision) : Math.round(value));
		if (isNaN(result)) {return "";}
		if (seperator)
		{
			result += "";
			x = result.split(".");
			x1 = x[0];
			x2 = (x.length > 1 ? "." + x[1] : "");
			var rgx = /(\d+)(\d{3})/;
			while (rgx.test(x1))
			{
				x1 = x1.replace(rgx, '$1' + seperator + '$2');
			}
			result = x1 + x2;
		}
		return result;
	}

	Format.Currency = function(value, prefix, precision)
	{
		prefix = (prefix == null ? "$" : prefix);
		precision = (precision == null ? 2 : precision);
		value = (value + "").replace(/[$\,]/g, "");
		var result = Format.Number(value, precision, ",");
		return (result.length > 0 ? prefix + result : result);
	}
///////////////////////////////////////////////////////////////////////////////////////////////////
//=================================================================================================
// Validation related API
//=================================================================================================
function Validate() {}
///////////////////////////////////////////////////////////////////////////////////////////////////
	Validate.Phone = function(phone)
	{
		phone = myString.Trim(phone);
		phone = phone.replace(/\s+/g, ' ');
		return /^\({0,1}\d{3}[ \)\.-]{0,1}\d{3}[ \)\.-]{0,1}\d{4}$/.test(phone);
	}

	Validate.Email = function(e, notify)
	{
		notify = (notify == null || notify ? true : false);
		var v = e.value;
		var isValid = v.match(/\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i);
		if (!notify) {return isValid;}
		if (!isValid)
		{
			alert("Invalid email address!");
			e.focus();
			e.select();
			return false;
		}
		else
		{
			return true;
		}
	}

	Validate.State = function(e)
	{
		var v = e.value;
		if (v == "") {return true;}
		if (!DataLib.States(v))
		{
			alert("Invalid state entry!!");
			e.select();
			e.focus();
			return false;
		}
		else
		{
			e.value.toUpperCase();
			return true;
		}
	}
	
	Validate.Zip = function(e)
	{
		v = e.value;
		if (v == "") {return true;}
		else if (/^\d{5}$/.test(v)) {return true;}
		else if (/^\d{5}-\d{4}$/.test(v)) {return true;}
		else
		{
			alert("Invalid zip code entry!");
			e.focus();
			return false;
		}
	}

	Validate.IsDate = function(input)
	{
		input = input.replace(/\s/g, '');
		if (/^\d{2}\/\d{2}\/\d{4}$/.test(input)) {return true;}
		else {return false;}
	}

	/* Shrinksafe cannot parse.  Is not in use currently
	Validate.URL = function(url)
	{
		var regx = /(ftp|http|file):\/\/[^/]+\.(com|edu|biz|org|gov|info|mil|net|[a-z][a-z])$/;
		return regx.test(url);
	}
	*/

	Validate.Currency = function(currency)
	{
		currency = (currency + "").replace(/[$\,]/g, "");
		var regx = /^((\$\d*)|(\$\d*\.\d{2})|(\d*)|(\d*\.\d*))$/;
		return regx.test(currency);
	}

	Validate.Numeric = function(value)
	{
		return !isNaN(value);
	}

	Validate.Integer = function(value)
	{
		var regx = /^\d+\.*0*$/;
		return regx.test(value);
		//return !isNaN(parseInt(value));
	}

	Validate.RegisterForm = function(name)
	{
		var form = document.getElementById(name);
		var textboxes = document.getElementsByTagName("input");
		var selectlists = document.getElementsByTagName("select");
		var inputs = new Array();
		for (var i = 0; i < textboxes.length; i++)
		{
			if (textboxes[i].type == "text") {inputs[inputs.length] = textboxes[i];}
		}
		for (var i = 0; i < selectlists.length; i++)
		{
			inputs[inputs.length] = selectlists[i];
		}
		for (var i = 0; i < inputs.length; i++)
		{
			var require = inputs[i].getAttribute("require");
			if (require != null)
			{
				inputs[i].onblur = function() {Validate.Required("onblur", this);};
				inputs[i].onchange = function() {Validate.Required("onchange", this);};
				inputs[i].onpaste = function() {Validate.Required("onpaste", this);};
				inputs[i].onkeyup = function() {Validate.Required("onkeyup", this);};
				Validate.Required("onload", inputs[i]);
			}
		}
	}

	Validate.IsComplete = function(form)
	{
		var ready = true;
		for (var i = 0; i < form.elements.length; i++)
		{
			var require = form.elements[i].getAttribute("require");
			var invalid = form.elements[i].getAttribute("invalid");
			ready = (require != null && form.elements[i].className == invalid ? false : ready);
		}
		return ready;
	}

	Validate.Form = function(form)
	{
		var ready = true;
		for (var i = 0; i < form.elements.length; i++)
		{
			var require = form.elements[i].getAttribute("require");
			var valid = form.elements[i].getAttribute("valid");
			var invalid = form.elements[i].getAttribute("invalid");
			var handler = form.elements[i].getAttribute("handler");
			var additional = (handler != null ? eval(handler) : true);
			ready = (require != null && form.elements[i].className == invalid ? false : ready);
			ready &= additional; 
		}
		for (var i = 0; i < form.elements.length; i++)
		{
			if (form.elements[i].type == "submit")
			{
				form.elements[i].disabled = !ready;
			}
		}
		return ready;
	}

	Validate.Required = function(e, element)
	{
		var format = false;
		var require = element.getAttribute("require");
		var valid = element.getAttribute("valid");
		var invalid = element.getAttribute("invalid");
		var handler = element.getAttribute("handler");
		switch (require)
		{
			case "currency":
				format = (e == "onload" || e == "onblur" || e == "onchange");
				element.className = (element.value != "" && Validate.Currency(element.value) ? valid : invalid);
				if (format && element.className == valid) {element.value = Format.Currency(element.value);}
				break;
			case "numeric":
				format = (e == "onload" || e == "onblur" || e == "onchange");
				element.className = (element.value != "" && Validate.Numeric(element.value) ? valid : invalid);
				if (format && element.className == valid) {element.value = Format.Number(element.value);}
				break;
			case "integer":
				format = (e == "onload" || e == "onblur" || e == "onchange");
				element.className = (element.value != "" && Validate.Numeric(element.value) ? valid : invalid);
				if (format && element.className == valid) {element.value = Format.Number(element.value, 0);}
				break;
			case "phone":
				element.className = (element.value != "" && Validate.Phone(element.value) ? valid : invalid);
				if (element.className == valid && !/^\d{3}-\d{3}-\d{4}$/.test(element.value)) {element.value = Format.Phone(element.value);}
				break;
			case "email":
				element.className = (element.value != "" && Validate.Email(element, false) ? valid : invalid);
				break;
			case "string":
				element.className = (element.value != "" && myString.Trim(element.value).length > 0 ? valid : invalid);
				break;
			case "prh-address":
				element.className = (element.value != "" && myString.Trim(element.value).length > 0 ? valid : invalid);
				break;
		}
		if (handler != null && eval(handler)) {Validate.Form(element.form);}
	}