/**
* Form Object Checker v 1.2
*
* © 2006 MJ Bytes Ltd
* Written by Miro Jurik
* http://www.mjbytes.com
*
* Language: Javascript
* @Last Revision: 28/May/2007
* 
*/

function FormChecker(frm)
{
	if (document.getElementById(frm))
	{
		this.frm = document.getElementById(frm);
		this.init();
	}
	else return false;
}

FormChecker.prototype =
{
	init: function()
	{
		this.inputs = this.frm.getElementsByTagName('input');
		this.areas = this.frm.getElementsByTagName('textarea');

		for (var i = 0; i < this.inputs.length; i++)
		{
			var obj = this.inputs[i];
			
			if (obj.type == 'text')
			{
				this.addEvent(obj, 'focus', this.focusIn);
				this.addEvent(obj, 'blur', this.focusOut);
				
				if (XFormToolTip[obj.id])
				{
					this.addEvent(obj, 'focus', this.tooltipOn);
					this.addEvent(obj, 'blur', this.tooltipOff);
				}
			}
			else if (obj.id == 'submit')
			{
				this.addEvent(obj, 'blur', this.tooltipOff);
			}
		}
		
		for (var i = 0; i < this.areas.length; i++)
		{
			this.addEvent(this.areas[i], 'focus', this.focusIn);
			this.addEvent(this.areas[i], 'blur', this.focusOut);
		}
		
		this.frm.method = 'post';
		this.frm.enctype = 'multipart/form-data';
		//this.frm.action = 'http://' + document.domain + '/cgi/form/index.php';
	},
	
	setAction: function(a)
	{
		this.frm.action = 'http://' + document.domain + '/' + a;
	},
	
	focusIn: function(e)
	{
		var obj = e.target ? e.target : (e.srcElement ? e.srcElement : null);

		if (obj && obj.style)
			obj.style.backgroundColor = '#eee';
	},

	focusOut: function(e)
	{
		var obj = e.target ? e.target : (e.srcElement ? e.srcElement : null);

		if (obj && obj.style)
			obj.style.backgroundColor = '#fff';
	},

	tooltipOn: function(e)
	{
		var obj = new Object(e.target ? e.target : (e.srcElement ? e.srcElement : null));
		var w = e.target ? e.target.offsetWidth : e.srcElement.offsetWidth;
		var id = e.target ? e.target.id : e.srcElement.id;
		var x, y;
		
		var content = '<div class="bubbletitle">' + id.toUpperCase() + '</div>';
		content += '<div class="bubblebody">' + (XFormToolTip[id] || '') + '</div>';
		
		if (obj.offsetParent) 
		{
			x = obj.offsetLeft;
			y = obj.offsetTop;
			
			while (obj = obj.offsetParent) 
			{
				x += obj.offsetLeft;
				y += obj.offsetTop;
			}
		}
		
		if (e.srcElement)
		{
			e.srcElement.tooltip = new ToolTip('tooltip');
			e.srcElement.tooltip.setVisibility('visible');
			e.srcElement.tooltip.setBackground('#5e328b');
			e.srcElement.tooltip.setXY(x + w + 10, y - 10);
			e.srcElement.tooltip.setContent(content);		
		}
		else
		{
			this.tooltip = new ToolTip('tooltip');
			this.tooltip.setVisibility('visible');
			this.tooltip.setBackground('#5e328b');
			this.tooltip.setXY(x + w + 10, y - 10);
			this.tooltip.setContent(content);
		}
	},

	tooltipOff: function(e)
	{
		if (e.srcElement && e.srcElement.tooltip) 
		{
			e.srcElement.tooltip.destroyToolTip();
		}
		else if (e.target && e.target.tooltip)
		{
			e.target.tooltip.destroyToolTip();
		}
		else if (this.tooltip) this.tooltip.destroyToolTip();
	},
	
	sendForm: function(frm)
	{
		var err = 0;
		var inputs = frm.getElementsByTagName('input');
		
		for (var i=0; i < inputs.length; i++)
		{
			if (inputs[i].type == 'text' && XFormRegex[inputs[i].id])
			{
				var reg = new RegExp(XFormRegex[inputs[i].id]);
				
				if (inputs[i].id == 'password2')
				{
					if (inputs[i].value != inputs[i-1].value)
					{
						inputs[i].style.backgroundColor = '#ff0000';
						err++;					
					}
				}
				else
				{
					if (!reg.test(inputs[i].value))
					{
						inputs[i].style.backgroundColor = '#ff0000';
						err++;
					}
				}
			}
			else if (inputs[i].type == 'radio' && XFormRegex[inputs[i].name])
			{
				var j = new Object();
				var n = inputs[i].name;
				var reg = new RegExp(XFormRegex[inputs[i].name]);

				j.number = i;

				while (inputs[j.number].type == 'radio' && inputs[j.number].name == n)
				{
					if (inputs[j.number].checked)
						j.value = inputs[j.number].value;
					
					j.number++;
				}

				if (!reg.test(j.value))
					err++;

				i = --j.number;
			}
		}
		
		if (err)
		{
			var coords = this.getXY(inputs.submit);
			
			inputs.submit.tooltip = new ToolTip('tooltip');
			inputs.submit.tooltip.setVisibility('visible');
			inputs.submit.tooltip.setBackground('#ff0000');
			inputs.submit.tooltip.setXY(coords.x + inputs.submit.offsetWidth + 10, coords.y - 10);

			var content = '<div class="bubbletitle"><img src="./images/icons/icon_warning_form.png" height="14" alt="Warning" />ERROR</div>';
			content += '<div class="bubblebody"> Your form data contains errors or typos. Please correct it.</div>';
			inputs.submit.tooltip.setContent(content);
		}

		return err ? false : true;
	},
	
	sendBusinessForm: function(frm)
	{
		var selects = frm.getElementsByTagName('select');
		var input = frm.getElementsByTagName('input');
		var err = false;
		
		if (0 == selects.category.selectedIndex && 
			0 == selects.subcategory.selectedIndex && 
			0 == selects.suburb.selectedIndex)
		{
			var coords = this.getXY(input.submit);
			err = true;
			
			input.submit.tooltip = new ToolTip('tooltip');
			input.submit.tooltip.setVisibility('visible');
			input.submit.tooltip.setBackground('#ff0000');
			input.submit.tooltip.setXY(coords.x + input.submit.offsetWidth + 10, coords.y - 10);

			var content = '<div class="bubbletitle"><img src="./images/icons/icon_warning_form.png" height="14" alt="Warning" />ERROR</div>';
			content += '<div class="bubblebody"> You have to select at least one search criterion to start the search.</div>';
			input.submit.tooltip.setContent(content);
		}

		return err ? false : true;
	},
	
	sendCreateeventForm: function(frm)
    {
        var selects = frm.getElementsByTagName('select');
        var input = frm.getElementsByTagName('input');
        var textarea = frm.getElementsByTagName('textarea');
        var err = false;
        
        if (input.title.value == "" || textarea.description.value == "" || input.startDate.value == "" || input.endDate.value == "")
        {
            var coords = this.getXY(input.submit);
            err = true;
            
            input.hidAddEvent.tooltip = new ToolTip('tooltip');
            input.hidAddEvent.tooltip.setVisibility('visible');
            input.hidAddEvent.tooltip.setBackground('#ff0000');
            input.hidAddEvent.tooltip.setXY(coords.x + input.hidAddEvent.offsetWidth + 10, coords.y - 10);

            var content = '<div class="bubbletitle"><img src="./images/icons/icon_warning_form.png" height="14" alt="Warning" />ERROR</div>';
            content += '<div class="bubblebody"> All fields are required.</div>';
            input.hidAddEvent.tooltip.setContent(content);
        }

        return err ? false : true;
    },
    
    sendEditEventForm: function(frm)
	{
		var selects = frm.getElementsByTagName('select');
		var input = frm.getElementsByTagName('input');
		var textarea = frm.getElementsByTagName('textarea');
		var err = false;
		
		if (input.title.value == "" || textarea.description.value == "" || input.startDate.value == "" || input.endDate.value == "")
		{
			var coords = this.getXY(input.submit);
			err = true;
			
			input.hidEditEvent.tooltip = new ToolTip('tooltip');
			input.hidEditEvent.tooltip.setVisibility('visible');
			input.hidEditEvent.tooltip.setBackground('#ff0000');
			input.hidEditEvent.tooltip.setXY(coords.x + input.hidEditEvent.offsetWidth + 10, coords.y - 10);

			var content = '<div class="bubbletitle"><img src="./images/icons/icon_warning_form.png" height="14" alt="Warning" />ERROR</div>';
			content += '<div class="bubblebody"> All fields are required.</div>';
			input.hidEditEvent.tooltip.setContent(content);
		}

		return err ? false : true;
	},
	
	sendEditAccountForm: function(frm)
	{
		var selects = frm.getElementsByTagName('select');
		var input = frm.getElementsByTagName('input');
		var err = false;
		
		if (input.firstname.value == "" || input.lastname.value == "" /*|| input.streetaddress.value == "" || input.suburb.value == "" || input.state.value == "" || input.age.value == "" || selects.gender.value == "-1"*/)
		{
			var fields = "";
			if(input.firstname.value == "") {
				fields = fields + "First Name<br />";
			}
			if(input.lastname.value == "") {
				fields = fields + "Last Name<br />";
			}
			/*if(input.streetaddress.value == "") {
				fields = fields + "Street Address<br />";
			}
			if(input.suburb.value == "") {
				fields = fields + "Suburb<br />";
			}
			if(input.state.value == "") {
				fields = fields + "State<br />";
			}
			if(input.age.value == "") {
				fields = fields + "Age<br />";
			}
			if(selects.gender.value == "-1") {
				fields = fields + "Gender<br />";
			}
            */
			var coords = this.getXY(input.submit);
			err = true;
			
			input.submit.tooltip = new ToolTip('tooltip');
			input.submit.tooltip.setVisibility('visible');
			input.submit.tooltip.setBackground('#ff0000');
			input.submit.tooltip.setXY(coords.x + input.submit.offsetWidth + 10, coords.y - 10);

			var content = '<div class="bubbletitle"><img src="./images/icons/icon_warning_form.png" height="14" alt="Warning" />ERROR</div>';
			content += '<div class="bubblebody"> Your form data contains errors or typos. Please check the following:<br />' + fields + '</div>';
			input.submit.tooltip.setContent(content);
		}

		return err ? false : true;
	},
	
	sendWhereamiForm: function(frm)
    {
        var selects = frm.getElementsByTagName('select');
        var input = frm.getElementsByTagName('input');
        var err = false;
        
        if (0 == selects.suburb.selectedIndex || input.streetaddress.value == "" || input.streetaddress.value == "1 Search Street")
        {
            var coords = this.getXY(input.submit);
            err = true;
            
            input.submit.tooltip = new ToolTip('tooltip');
            input.submit.tooltip.setVisibility('visible');
            input.submit.tooltip.setBackground('#ff0000');
            input.submit.tooltip.setXY(coords.x + input.submit.offsetWidth + 10, coords.y - 10);

            var content = '<div class="bubbletitle"><img src="./images/icons/icon_warning_form.png" height="14" alt="Warning" />ERROR</div>';
            content += '<div class="bubblebody"> You have to enter an address and select a suburb to start the search.</div>';
            input.submit.tooltip.setContent(content);
        }

        return err ? false : true;
    },
    
    sendMemberMessageBoardForm: function(frm)
	{
		var textarea = frm.getElementsByTagName('textarea');
        var input = frm.getElementsByTagName('input');
		var err = false;
		
		if (textarea.comment.value == "" || textarea.comment.title == textarea.comment.value)
		{
			var coords = this.getXY(input.submit);
			err = true;
			
			input.submit.tooltip = new ToolTip('tooltip');
			input.submit.tooltip.setVisibility('visible');
			input.submit.tooltip.setBackground('#ff0000');
			input.submit.tooltip.setXY(coords.x + input.submit.offsetWidth + 10, coords.y - 10);

			var content = '<div class="bubbletitle"><img src="./images/icons/icon_warning_form.png" height="14" alt="Warning" />ERROR</div>';
            content += '<div class="bubblebody">Please enter your message!</div>';
			input.submit.tooltip.setContent(content);
		}

		return err ? false : true;
	},
	
	getXY: function(obj)
	{
		var coords = new Object;
		coords.x = coords.y = 0;

		if (obj.offsetParent) 
		{
			coords.x = obj.offsetLeft;
			coords.y = obj.offsetTop;
			
			while (obj = obj.offsetParent) 
			{
				coords.x += obj.offsetLeft;
				coords.y += obj.offsetTop;
			}
		}

		return coords;
	},

	addEvent: function(obj, ev, fn)
	{
		if (obj.addEventListener)
		{
			obj.addEventListener(ev, fn, false);
		}
		else if (obj.attachEvent)
		{
			obj.attachEvent('on' + ev, fn);
		}
		else { obj['on' + ev] = fn };
	},

	removeEvent: function(obj, ev, fn)
	{
		if (obj.removeEventListener)
		{
			obj.removeEventListener(ev, fn, false);
		}
		else if (obj.detachEvent)
		{
			obj.detachEvent('on' + ev, fn);
		}
		else { obj['on' + ev] = null };
	}
}

function ToolTip(id)
{
	if (id) 
	{
		this.createToolTip(id);
	}
	else return false;
}

ToolTip.prototype = 
{
	createToolTip: function(id)
	{
		this.tooltip = document.createElement('div');
		this.tooltip.style.position = 'absolute';
		this.tooltip.id = id;

		document.body.appendChild(this.tooltip);
	},
	
	destroyToolTip: function()
	{
		if (this.tooltip)
		{
			document.body.removeChild(this.tooltip);
			delete this.tooltip;
			this.tooltip = null;
		}
	},
	
	setVisibility: function(vs)
	{
		this.tooltip.visibility = vs;
	},
	
	setBackground: function(bg)
	{
		this.tooltip.style.backgroundColor = bg;
	},
	
	setXY: function(x, y)
	{
		this.tooltip.style.left = x + 'px';
		this.tooltip.style.top = y + 'px';
	},
	
	setContent: function(html)
	{
		this.tooltip.innerHTML = html;
	}
	
}

var XFormToolTip =
{
	firstname: 'Please enter your first name.',
	lastname: 'Please enter your last name.',
	fullname: 'Please enter your full name.',
	email: 'Please enter your email address.',
	username: 'Please enter your email address.',
	password: 'Please enter your password.',
	password1: 'Please choose your password. Must be longer than 7 characters. For better security, it is strongly recommended to choose a mix of letters and numbers.',
	password2: 'Please repeat your password to confirm.',
	streetaddress: 'Please enter your street address.',
	suburb: 'Please enter your suburb.',
	state: 'Please enter your state.',
	country: 'Please enter your country.',
	phone: 'Please enter your landline or mobile phone number. Start with your city prefix.<br /><br />Canberra: 02<br />Sydney: 02<br /> Melbourne: 03<br />Hobart: 03<br />Brisbane: 07<br />Adelaide: 08<br />Perth: 08<br />Darwin: 08',
	age: 'Please enter your age (two digits).',
	sex: 'Please indicate your sex.',
	location: 'Please enter the location.',
	occupation: 'Please enter your occupation. One or two descriptive words.'
}

var XFormRegex =
{
	title: /^(Mr|Ms|Mrs|Dr|Prof)$/,
	firstname: /^[A-Za-z]+(\s*\-\s*[A-Za-z]+)?$/,
	lastname: /^[A-Za-z]\'?[A-Za-z]+(\s*\-\s*[A-Za-z]\'?[A-Za-z]+)?$/,
	fullname: /^[A-Za-z]+(\s*\-\s*[A-Za-z]+)?\s+[A-Za-z]\'?[A-Za-z]+(\s*\-\s*[A-Za-z]\'?[A-Za-z]+)?$/,
	email: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,
	username: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,
	password: /(.){8,}/,
	password1: /(.){8,}/,
	password2: /(.){8,}/,
	streetaddress: /^((Unit|Flat|Suite|Site)?\s*[1-9][0-9]*\s*([A-Za-z]\s*)?(\,|\/)?\s*)?[A-Z]?[1-9][0-9]*(\s*[A-Za-z])?(\s*\-?\s*([1-9][0-9]*))?\s+([SM][Tt]\.?)?(\s*[A-Za-z]\'?[A-Za-z]+){2,}$/,
	suburb: /^([SM][Tt]\.?)?(\s*[A-Za-z]\'?[A-Za-z]+)+$/,
	state: /^([A-Za-z][A-Za-z]+\s*)+$/,
	country: /^([SM][Tt]\.?)?(\s*[A-Za-z]\'?[A-Za-z]+)+$/,
	postcode: /^((08[0-9]{2})|[2-9][0-9]{3})$/,
	phone: /^0[2-9][0-9]{8}$/,
	age: /^[1-9][0-9]{0,2}$/,
	sex: /^(Male|Female|M|F)$/,
	location: /^([SM][Tt]\.?)?(\s*[A-Za-z]\'?[A-Za-z]+)+$/,
	occupation: /^([A-Za-z]+\s*)+$/
}