/*
	Indysign JavaScript Validator 0.4 BETA

	Copyright 2004 Indysign.dk. All rights reserved.

	Todo:
		Lave subelements om til seperate objekter. Dette gør det nemmere at lave komplicerede checks, hvilket er ret umuligt nu.

	2004-03-07
		Version 0.4 BETA
		Tilføjede følgende check:
			JSVALIDATOR_CHECK_VALUE_AND_NOT_EMPTY
	2004-03-06
		Tilføjede følgende check:
			JSVALIDATOR_CHECK_DELETE_CONFIRM
	2004-02-23:
		Tilføjede "password"-felter til focusIfCan().
		Tilføjede følgende checks:
			JSVALIDATOR_CHECK_URL
			JSVALIDATOR_CHECK_IF_CHECKED
	2004-02-19:
		Flyttede valideringerne til en selvstændig funktion.
		Tilføjede følgende checks:
			JSVALIDATOR_CHECK_IF_NOT_EMPTY
			JSVALIDATOR_CHECK_NOT_EMPTY_IF_CHECKED
			JSVALIDATOR_CHECK_PHONE
	2004-02-07:
		Initial beta.
		Tilføjede addElementChecks() til at lave flere checks på samme felt med samme fejltekst.
*/

// globals
var JSVALIDATOR_CHECK_NOT_EMPTY = 100;
var JSVALIDATOR_CHECK_NUMBERS_ONLY = 101;
var JSVALIDATOR_CHECK_MIN_LENGTH = 102;
var JSVALIDATOR_CHECK_PRECISE_LENGTH = 103;
var JSVALIDATOR_CHECK_MAX_LENGTH = 104;
var JSVALIDATOR_CHECK_EMAIL = 105;
var JSVALIDATOR_CHECK_IF_NOT_EMPTY = 106;
var JSVALIDATOR_CHECK_NOT_EMPTY_IF_CHECKED = 107;
var JSVALIDATOR_CHECK_PHONE = 108;
var JSVALIDATOR_CHECK_URL = 109;
var JSVALIDATOR_CHECK_IF_CHECKED = 110;
var JSVALIDATOR_CHECK_DELETE_CONFIRM = 111;
var JSVALIDATOR_CHECK_VALUE_AND_NOT_EMPTY = 112;

// Constructor
function JSValidator(form)
{	this.form = form;
	this.elements = new Array();

	this.addElementCheck = addElementCheck;
	this.addElementChecks = addElementChecks;
	this.validateAll = validateAll;
	this.validate = validate;
	this.focusIfCan = focusIfCan;
}

// Functions
function addElementCheck(name, checkType, errorText, extra, subExtra, subElement)
{	var index = this.elements.length;
	this.elements[index] = {'name': name, 'type': checkType, 'errorText': errorText, 'extra': extra, 'subExtra': subExtra, 'subElement': subElement};
}

function addElementChecks(name, checkTypes, errorText, extra)
{	for (var i=0; i<checkTypes.length; i++)
	{	this.addElementCheck(name, checkTypes[i], errorText, extra[i]);
	}
}

function validateAll()
{	for (var i=0; i<this.elements.length; i++)
	{	var checkElm = this.elements[i];
		if (typeof this.form.elements[checkElm.name] != 'undefined')
		{	var realElm = this.form.elements[checkElm.name];
			if (!this.validate(realElm, checkElm))
			{	if (checkElm.errorText != '')
				{	alert(checkElm.errorText);
				}
				if (!this.focusIfCan(realElm) && checkElm.subElement != '')
				{	this.focusIfCan(this.form.elements[checkElm.subElement]);
				}
				return false;
			}
			else if (checkElm.type == JSVALIDATOR_CHECK_DELETE_CONFIRM)
			{	return true;
			}
		}
	}
	return true;
}

function validate(realElm, checkElm)
{	switch (checkElm.type)
	{	case JSVALIDATOR_CHECK_NOT_EMPTY:
			if (realElm.value == '')
			{	return false;
			}
			return true;
		break;
		case JSVALIDATOR_CHECK_NUMBERS_ONLY:
			return realElm.value.match(/^[0-9]+$/);
		break;
		case JSVALIDATOR_CHECK_MIN_LENGTH:
			if (realElm.value.length < checkElm.extra)
			{	return false;
			}
			return true;
		break;
		case JSVALIDATOR_CHECK_PRECISE_LENGTH:
			if (realElm.value.length != checkElm.extra)
			{	return false;
			}
			return true;
		break;
		case JSVALIDATOR_CHECK_MAX_LENGTH:
			if (realElm.value.length > checkElm.extra)
			{	return false;
			}
			return true;
		break;
		case JSVALIDATOR_CHECK_EMAIL:
			return realElm.value.match(/^[A-Za-z0-9\-_.]+@[A-Za-z0-9\-_.]+\.[A-Za-z]{2,4}$/);
		break;
		case JSVALIDATOR_CHECK_IF_NOT_EMPTY:
			if (realElm.value != '')
			{	var newCheckElm = {'type': checkElm.extra, 'extra': checkElm.extraExtra};
				return this.validate(realElm, newCheckElm);
			}
			return true;
		break;
		case JSVALIDATOR_CHECK_NOT_EMPTY_IF_CHECKED:
			if (this.form.elements[checkElm.extra].checked)
			{	var newCheckElm = {'type': JSVALIDATOR_CHECK_NOT_EMPTY};
				return this.validate(realElm, newCheckElm);
			}
			return true;
		break;
		case JSVALIDATOR_CHECK_PHONE:
			return realElm.value.match(/^(\+ ?[0-9]{2} ?)?( ?[0-9]{2}){4}$/);
		break;
		case JSVALIDATOR_CHECK_URL:
			return realElm.value.match(/^http:\/\/(www\.)?[a-zA-Z0-9_\-.]+\.[a-zA-Z]{2,4}$/);
		break;
		case JSVALIDATOR_CHECK_IF_CHECKED:
			if (realElm.checked)
			{	var newRealElm = this.form.elements[checkElm.subElement];
				var newCheckElm = {'type': checkElm.extra, 'extra': checkElm.subExtra};
				return this.validate(newRealElm, newCheckElm);
			}
			return true;
		break;
		case JSVALIDATOR_CHECK_DELETE_CONFIRM:
			if (realElm.checked)
			{	return confirm(checkElm.errorText);
			}
			return true;
		break;
		case JSVALIDATOR_CHECK_VALUE_AND_NOT_EMPTY:
			if (realElm.value == checkElm.extra)
			{	var newRealElm = this.form.elements[checkElm.subElement];
				if (newRealElm.value != '')
				{	return confirm(checkElm.errorText);
				}
			}
			return true;
		break;
	}
	return false;
}

function focusIfCan(elm)
{	if (elm.type == 'text' || elm.type == 'password')
	{	elm.focus();
		return true;
	}
	return false;
}