//	2004-Aug-20
//	Florin Zagan
//	haios.ro@gmail.com

var monthLength = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

// functie folosita de: checkDateElements(name), constructTimestamp(name)
function checkDate(year, month, day){
	var past = 0;
	var diff = 0;
	var now = new Date();
	now = now.getTime(); //NN3

	var dateToCheck = new Date();
	dateToCheck.setFullYear(year);
	dateToCheck.setMonth(month-1);
	dateToCheck.setDate(day);
	var checkDate = dateToCheck.getTime();

	diff = Math.round((checkDate - now) / (1000 * 60 * 60 * 24));
	
	if(diff < 0)
		past = 1;
	return past;
}
function checkDateElements(name, alerta)
{	message = '';
	
	var x = document.forma.elements;
	var year = parseInt(x[name+ "_year"].options[x[name+ "_year"].selectedIndex].value);
	var month = parseInt(x[name+ "_month"].options[x[name+ "_month"].selectedIndex].value);
	var month_name = x[name+ "_month"].options[x[name+ "_month"].selectedIndex].text;
	var day = x[name+ "_day"].value;
	
	var now = new Date();
		
	//	DAY CHECK           --------------------
	if(day != '')
	{	if((isNaN(day)) || (day < 1) || (day > monthLength[month - 1]))
		{	if(name == 'start')
			{	message += '\n - invalid day; automatically selected current day, feel free to change it\n';
				day = x[name+ '_day'].value = now.getDate();
			}
			if(name == 'end')
			{	message += '\n - invalid day; automatically selected day of tomorrow, feel free to change it\n';
				day = x[name+ '_day'].value = now.getDate() + 1;
			}
		}
	}
	if(day == '')
	{	if(name == 'start') x[name+ '_date'].value = '';
		if(name == 'end') x[name+ '_date'].value = '';
	}
	
	//	MONTH CHECK           ------------------------------
	// provided i have selected the current year, i need to take care of which month i also select, in order not to pick a month in the past. for a year selected in the future, i don't care about month
	if(month != '')
	{	if(year != '')
		{	if(now.getFullYear() >= year)
			{	if(now.getMonth() + 1 > month)
				{	if((now.getMonth() + 1) > 12)
					{	month = x[name+ '_month'].value = 1;
						year = x[name+ '_year'].value = now.getFullYear() + 1;
					}
					else month = x[name+ '_month'].value = now.getMonth() + 1;
					message += ' \n\''+ year+ '-'+ month_name+ '\' in the past; automatically selected current month, feel free to change it\n';
					x[name+ '_month'].focus();
				}
			}
		}else
		{	if(name == 'start') x[name+ '_date'].value = '';
			if(name == 'end') x[name+ '_date'].value = '';
		}
	}
	if(month == '')
	{	if(name == 'start') x[name+ '_date'].value = '';
		if(name == 'end') x[name+ '_date'].value = '';
	}
	
	//	YEAR CHECK                   -----------------------------------
	if(year != '')
	{	//anii bisecti au 29 de zile (ii identific pt ca se divid la 4)
		if (year / 4 == parseInt(year / 4)) monthLength[1] = 29;
		else monthLength[1] = 28;
		if(month != '')
		{	if(now.getFullYear() >= year)	// current year selected by user
				if(now.getMonth() + 1 > month)	// user chooses a month earlier to the current month, which is not good (this is bad only if user selected current year also, see line above)
				{	if((now.getMonth() + 1) > 12)		// va trebui sa incrementez luna aleasa de user, dar sa fiu atent sa nu ajung la 13, pt ca max e 12
					{	month = x[name+ '_month'].value = 1;
						year = x[name+ '_year'].value = now.getFullYear() + 1;
					}else month = x[name+ '_month'].value = now.getMonth() + 1;
					message += ' \n\''+ year+ '-'+ month_name+ '\' in the past; automatically selected current month, feel free to change it\n';
					x[name+ '_month'].focus();
				}
		}else
		{	if(name == 'start') x[name+ '_date'].value = '';
			if(name == 'end') x[name+ '_date'].value = '';
		}
	}
	if(year == '')
	{	if(name == 'start') x[name+ '_date'].value = '';
		if(name == 'end') x[name+ '_date'].value = '';
	}
	
	//	FULL DATE CHECK                    -------------------------------------
	if(day != '' && month != '' && year != '')
	{	past = checkDate(year, month, day);
		if(past == 1)	// user chose a date in the past, then I modify it to be over the current
		{	if(name == 'start')
			{	message += ' \n - date in the past; automatically selected current day, feel free to change it\n';
				year = x[name+ '_year'].value = now.getFullYear();
				month = x[name+ '_month'].value = now.getMonth() + 1;
				day = x[name+ '_day'].value = now.getDate();
			}
			if(name == 'end')
			{	message += ' \n - date in the past; automatically selected day of tomorrow, feel free to change it\n';
				if(now.getDate() + 1 > monthLength[month - 1])
				{	day = x[name+ '_day'].value = 1;
					if((now.getMonth() + 2) > 12)
					{	month = x[name+ '_month'].value = 1;
						year = x[name+ '_year'].value = now.getFullYear() + 1;
					}else month = x[name+ '_month'].value = now.getMonth() + 2;
				}else day = x[name+ '_day'].value = now.getDate() + 1;
			}
		}
		
		if(!(isNaN(day)) && (day >= 1) && (day <= monthLength[month - 1]))
		{	hidden = new Date();
			
			// daca nu folosesc if aici, se calculeaza ambele hidden elements, si start_date si end_date, chiar daca nu sint introduse elementele de data, le declanseazacealalta data
			if(name == 'start')
			{	hidden.setFullYear(year);
				hidden.setMonth(month);
				hidden.setDate(day);
				hidden_date = hidden.getTime();
				x[name+ '_date'].value = hidden_date;	// name poate fi doar 'start' sau 'end'
			}
			if(name == 'end')
			{	hidden.setFullYear(year);
				hidden.setMonth(month);
				hidden.setDate(day);
				hidden_date = hidden.getTime();
				x[name+ '_date'].value = hidden_date;	// name poate fi doar 'start' sau 'end'
			}
			
			if(x['start_date'].value != '' && x['end_date'].value != '' && !isNaN(x['start_date'].value) && !isNaN(x['end_date'].value))
			{	diff = Math.round((x['end_date'].value - x['start_date'].value) / (1000 * 60 * 60 * 24));
				if(diff < 0 )
				{	message += '\n - warning - end date before the start date\n';
					x['text_duration'].value = '';
				}else x['text_duration'].value = diff + 1;
			}else x['text_duration'].value = '';
		}else x['text_duration'].value = '';
	}else
	{	x['text_duration'].value = '';
		if(name == 'start') x[name+ '_date'].value = '';
		if(name == 'end') x[name+ '_date'].value = '';
	}
	
	if(message != '')
		if(alerta == 1)
			alert(message);
}


// variabile intrare: email - este valoarea emailului introdus intr-o casuta tip input (document.forma.element.value);	alerta (0, 1) - 1 scoate alerta pe ecran, 0 nu scoate alerta pe ecran
function checkEmail(email, alerta)
{	var emailStr = email.value;						//	email entered into the text field
	var emailPat = /^(.+)@(.+)$/;									//	the entered e-mail address fits the user@domain format.  It also is used to separate the username from the domain.
	var specialChars ="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";							//	string represents the pattern for matching all special chars that we don't want to allow in the address. These characters include ( ) < > @ , ; : \ " . [ ] 
	var validChars = "\[^\\s" + specialChars + "\]";						//	string represents the range of characters allowed in a username or domainname.  It really states which chars aren't allowed.
	var quotedUser = "(\"[^\"]*\")";									//	pattern applies if the "user" is a quoted string (in which case, there are no rules about which characters are allowed and which aren't).  E.g. "jiminy cricket"@disney.com
	var ipDomainPat = /^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;	//	pattern applies for domains that are IP addresses, rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal e-mail address. NOTE: The square brackets are required.
	var atom = validChars + '+';										//	string represents an atom (basically a series of non-special characters.)
	var word = "(" + atom + "|" + quotedUser + ")";						//	string represents one word in the typical username. For example, in john.doe@somewhere.com, john and doe are words. Basically, a word is either an atom or quoted string.
	var userPat = new RegExp("^" + word + "(\\." + word + ")*$");				//	patern describes the structure of the user
	var domainPat = new RegExp("^" + atom + "(\\." + atom +")*$");				//	pattern describes the structure of a normal symbolic domain, as opposed to ipDomainPat, shown above.

	if (emailStr == '')
	{	if(alerta == 1) alert('Please enter email address.\n');
		return false;
	}
	// Begin with the coarse pattern to simply break up user@domain into different pieces that are easy to analyze.
	var matchArray = emailStr.match(emailPat);
	if (matchArray == null) 
	{	if(alerta == 1) alert("Possible incorrect email address (check @ and .)\n");
		return false;
	}
	
	var user = matchArray[1];
	var domain = matchArray[2];

	// See if "user" is valid 
	if (user.match(userPat) == null) 
	{	if(alerta == 1) alert("Possible invalid name in the email address.\n");
		return false;
	}
	// if the e-mail address is at an IP address (as opposed to a symbolic host name) make sure the IP address is valid.
	var IPArray = domain.match(ipDomainPat);
	if (IPArray != null) 
		for (var i=1; i<=4; i++) 
			if (IPArray[i] > 255) 
			{	if(alerta == 1) alert("Invalid IP Address!\n");
				return false;
			}
	// Domain is symbolic name
	var domainArray = domain.match(domainPat);
	if (domainArray == null) 
	{	if(alerta == 1) alert("Possible invalid domain name in the email address.\n");
		return false;
	}

	// domain name seems valid, but now make sure that it ends in a three-letter word (like com, edu, gov) or a two-letter word, representing country (uk, nl), and that there's a hostname preceding the domain or country.

	// Now we need to break up the domain to get a count of how many atoms it consists of.
	var atomPat = new RegExp(atom, "g");
	var domArr = domain.match(atomPat);
	var len = domArr.length;
	if (domArr[domArr.length - 1].length < 2 || domArr[domArr.length - 1].length > 3) 
	{	if(alerta == 1) alert("Email address domain name has 2 or 3 letters!\n");
		return false;
	}

	// Make sure there's a host name preceding the domain.
	if (len < 2) 
	{	if(alerta == 1) alert("Email address lacks the domain name!\n");
		return false;
	}

	// If we've gotten this far, everything's valid!
	return true;
}
function checkIsURL(text){
	var regexp=/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
	if(regexp.test(text))return (true);
	else{
		message=' Possible incorrect URL.';
		alert(message);
		return (false);
	}
}
function checkLength(text, len)
{	text = text.toString();
	if (len - text.length < 0 )
	{	message = ' Proposal text too long. maximum '+ len+ ' characters\n';
		alert(message);
		return false;
	}else return true; 
}
function checkLength_shortness(text, len)
{	text = text.toString();
	if (text.length - len < 0 )
	{	message = 'Password too short. minimum '+ len+ ' chars\n';
		alert(message);
		return false;
	}else return true; 
}
function checkLengthNumber(text, len)
{	text = text.toString();
	number = len - text.length;
	return number;
}


function checkOptions(name)
{	message = '';
	var nota = parseInt(name.options[name.selectedIndex].value);
	if(nota == 100)
	{	message = ' - score not selected ';
		alert(message);
		return false;
	}else return true;
}

// fctie apelata onSubmit, parte din form validation. 
//in mod normal, validarea datelor se petrece cind se introduce data in form, dar daca userul nu modifica, ci alege din valori trecute datorita capabilitatii window de a lista valorile introduse in trecut, 
//nu se mai declanseaza fctia checkDateElements, asa cum ar fi normal, asa ca fctia compareDates() e fctie de backUp
function compareDates()
{	var message = '';
	var start_timestamp = constructTimestamp('start');
	var end_timestamp = constructTimestamp('end');
	
	if(start_timestamp == false) message += ' - corecteaza: data de start invalida\n';
	if(end_timestamp == false) message += ' - corecteaza: data de sfarsit invalida\n';
	if(message == '')
	{	diff = ((end_timestamp - start_timestamp) / (1000 * 60 * 60 * 24));
		if(diff < 0) message += ' - corecteaza: data de start > data de sfarsit\n';
		else message += '';
	}
	return message;
}
function constructTimestamp(name)	// fctie folosita de compareDates()
{	var past = 0;
	var x = document.forma.elements;
	var year = parseInt(x[name+ '_year'].options[x[name+ '_year'].selectedIndex].value);
	var month = parseInt(x[name+ '_month'].options[x[name+ '_month'].selectedIndex].value);
	var day = x[name+ '_day'].value;
	
	past = checkDate(year, month, day);
	if(past == 0)
	{	timestamp = new Date();
		timestamp.setFullYear(year);
		timestamp.setMonth(month-1);
		timestamp.setDate(day);
		timestamp = timestamp.getTime();
		return timestamp;
	}
	else return false;
}


/*
function calculateLengthTextarea()
{	while(forma.textarea_length.value > 0)
		forma.textarea_length.value = (forma.comments_len.value - forma.textarea_comments.value.length);
}
*/

function processAboneaza()
{	var message = '';
	var x = document.forma.elements;
	var email_originator = x['email_originator'];
	
	if(email_originator.value == '') message += ' - enter your email address.\n';
	else
	{	if(checkEmail(email_originator, 0) == false) message += ' - possible invalid email address.\n';
		else message += '';
	}
	
	if(message != '')
	{	alert(message);
		return false;
	}else return true;
}

function processOrderPassage()
{	var message = '';
	var x = document.forma.elements;
	
	if(x['checkbox_faraPassage'].checked) message += '';
	else
	{	if(x['textarea_comments'].value == '')
			message += ' - enter passage text\n';
		
		if(x['textarea_comments'].value != '')
			if(checkLength(x['textarea_comments'].value, x['comments_length'].value) == false)
				message += ' - shorten passage text length.\n';
	}
	
	if(message != '')
	{	alert('Please:\n\n'+ message);
		return false;
	}

	return true;
}

// fctie apelata din paginile Propune in sectiunea Bancuri, Stiati ca...?
function processPropune()
{	var message = '';
	var x = document.forma.elements;
	
	if(x['textarea_comments'].value == '') message += ' - enter proposal text\n';
	else
	{	if(checkLength(x['textarea_comments'].value, x['comments_length'].value) == false) message += ' - shorten proposal text length\n';
		else message += '';
	}
	
	if(message != '')
	{	alert(message);
		return false;
	}else return true;
}

function processPropune_Carte()
{	var message = '';
	var x = document.forma.elements;
	
	if(x['text_titlu'].value == '') message += ' - enter proposal title\n';
	else message += '';
	
	if(x['text_autor'].value == '') message += ' - enter author name\n';
	else message += '';
	
	if(x['textarea_copyright'].value == '') message += '';
	else{
		if(checkLength(x['textarea_copyright'].value, x['notes_len'].value) == false) message += ' - shorten copywright text length\n';
		else message += '';
	}
	if(x['textarea_notes'].value == '') message += '';
	else{
		if(checkLength(x['textarea_notes'].value, x['notes_len'].value) == false) message += ' - shorten comment text length\n';
		else message += '';
	}
	
	if(message != '')
	{	alert(message);
		return false;
	}else return true;
}

function processPropune_Comment(formc)
{	var message = '';
	var x = formc.elements;
	
	if(x['text_nume'].value == '') message += ' - enter your name\n';
	else message += '';
	
	var email = x['text_email'];
	if('' == email.value) message += ' - enter your email address\n';
	else if(checkEmail(email, 0) == false) message += ' - possible invalid email address\n';
	else message += '';
	
	var comment = x['textarea'];
	if(comment.value == '') message += ' - enter comment text\n';
	else
	{	if(checkLength(comment.value, x['max_length'].value) == false) message += ' - shorten comment text length\n';
		else message += '';
	}
	
	if(message != '')
	{	alert(message);
		return false;
	}else return true;
}

function processPropune_Intrebare()
{	var message = '';
	var x = document.forma.elements;
	
	// dates check
	date_complete = 1;
	datesAreWrong = '';
	if(x['start_year'].options[x['start_year'].selectedIndex].value == '' || x['start_month'].options[x['start_month'].selectedIndex].value == '' || x['start_day'].value == '')
	{	message += ' - enter start date\n';
		date_complete = 0;
	}
	if(x['end_year'].options[x['end_year'].selectedIndex].value == '' || x['end_month'].options[x['end_month'].selectedIndex].value == '' || x['end_day'].value == '')
	{	message += ' - enter end date\n';
		date_complete = 0;
	}
	if(date_complete == 1)
	{	datesAreWrong = compareDates();
		if(datesAreWrong != '') message += datesAreWrong;
	}
	
	// question check
	if(x['textarea_question'].value != '')
	{	if(checkLength(x['textarea_question'].value, x['question_length'].value) == false)
			message += ' - shorten question text length\n';
	}else message += ' - enter question text\n';
	
	// answers check
	for(i=1; i <= x['select_nr'].options[x['select_nr'].selectedIndex].value; i++)
	{	if(x['textarea_answer'+i].value != '')
		{	if(checkLength(x['textarea_answer'+i].value, x['answer_length'].value) == false)
				message += ' - shorten answer text length '+ i+ '\n';
		}else message += ' - enter answer text '+i + '\n';
	}
	
	if(message != '')
	{	alert(message);
		return false;
	}else return true;
}

function processPropune_Link()
{	var message = '';
	var x = document.forma.elements;
	
	if(x['text_nume'].value == '') message += ' - enter your name\n';
	else message += '';
	
	if('' == x['text_email'].value) message += ' - enter your email\n';
	else if(checkEmail(x['text_email'], 0) == false) message += ' - email address possible invalid\n';
	else message += '';

	if(x['password'].value=='') message += ' - enter password\n';
	else
	{	if(checkLength_shortness(x['password'].value, x['password_len'].value) == false) message += ' - password too short\n';
		else message += '';
	}
	
	if(x['password_confirm'].value=='') message += ' - confirm password\n';
	else
	{	if(checkLength_shortness(x['password_confirm'].value, x['password_len'].value) == false) message += ' - confirmed password too short\n';
		else message += '';
	}
	
	if(x['password'].value!=x['password_confirm'].value) message += ' - the two passwords do not match\n';
	else message+='';
	
	if(x['select_category'].options[x['select_category'].selectedIndex].value == '') message += ' - enter category\n';
	else message += '';
	
	if(x['textarea_titlu'].value == '') message += ' - enter title\n';
	else
	{	if(checkLength(x['textarea_titlu'].value, x['titlu_len'].value) == false) message += ' - scurteaza lungimea titlului\n';
		else message += '';
	}
	
	if(x['textarea_descriere'].value == '') message += ' - enter description\n';
	else
	{	if(checkLength(x['textarea_descriere'].value, x['descriere_len'].value) == false) message += ' - pls shorten description length\n';
		else message += '';
	}
	
	if(x['textarea_cheie'].value == '') message += ' - enter key words\n';
	else
	{	if(checkLength(x['textarea_cheie'].value, x['cheie_len'].value) == false) message += ' - scurteaza lungimea textului cuvinte cheie\n';
		else message += '';
	}

	if(x['text_url'].value == '') message += ' - enter URL\n';
	else
	{	var regexp=/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
		if(regexp.test(x['text_url'].value))message += '';
		else message+=' - URL posible incorrect\n';
	}

	if(x['text_page_url'].value == '') message += ' - enter page URL, where haios.ro code\n';
	else
	{	var regexp=/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
		if(regexp.test(x['text_page_url'].value))message += '';
		else message+=' - page URL where haios.ro code, possible incorrect\n';
	}

	if(x['code'].value == '') message += ' - enter numbers code\n';
	
	if(message != '')
	{	alert(message);
		return false;
	}else return true;
}

// fctie apelata din paginile Propune in sectiunea Bancuri, Stiati ca...?
function processPropune_Poze()
{	var message = '';
	var x = document.forma.elements;
	
	if(x['fisier'].value == '') message += ' - attach image file\n';
	else
	{	if(checkLength(x['textarea_comments'].value, x['comments_length'].value) == false) message += ' - shorten proposal text length\n';
		else message += '';
	}
	
	if(message != '')
	{	alert(message);
		return false;
	}else return true;
}


function processPropune_Rezumate()
{	var message = '';
	var x = document.forma.elements;
	
	if(x['text_titlu'].value == '') message += ' - enter article title\n';
	else message += '';
	
	if(x['text_autor'].value == '') message += ' - enter article author\'s name\n';
	else message += '';
	
	if(x['textarea_comments'].value == '') message += ' - enter proposal text\n';
	else
	{	if(checkLength(x['textarea_comments'].value, x['comments_length'].value) == false) message += ' - shorten proposal text length\n';
		else message += '';
	}
	
	if(message != '')
	{	alert(message);
		return false;
	}else return true;
}

function processTrimite()
{	var message = '';
	var x = document.forma.elements;
	var email_addressee = x['email_addressee'];
	
	if(''==x['email_addressee'].value&&''==x['email_addressee1'].value&&''==x['email_addressee2'].value&&''==x['email_addressee3'].value&& ''==x['email_addressee4'].value)
		message += ' - introdu macar o adresa de email.\n';
	else{
		if('' != x['email_addressee'].value && checkEmail(x['email_addressee'], 0) == false)
			message += ' - possible invalid no.1 email address.\n';
		if('' != x['email_addressee1'].value && checkEmail(x['email_addressee1'], 0) == false)
			message += ' - possible invalid no.2 email address.\n';
		if('' != x['email_addressee2'].value && checkEmail(x['email_addressee2'], 0) == false)
			message += ' - possible invalid no.3 email address.\n';
		if('' != x['email_addressee3'].value && checkEmail(x['email_addressee3'], 0) == false)
			message += ' - possible invalid no.4 email address.\n';
		if('' != x['email_addressee4'].value && checkEmail(x['email_addressee4'], 0) == false)
			message += ' - possible invalid no.5 email address.\n';
	}
	
	if(message != '')
	{	alert(message);
		return false;
	}else return true;
}

function processSugestii()
{	var message = '';
	var x = document.formaq.elements;
	
	if(x['textarea_comments'].value == '') message += ' - no suggestion entered\n';
	else
	{	if(checkLength(x['textarea_comments'].value, x['comments_length'].value) == false) message += ' - shorten entered text length\n';
		else message += '';
	}
	
	if(message != '')
	{	alert(message);
		return false;
	}else return true;
}