﻿var ctls = [];
var submitBtn = null;

var monthObj = {
	names: ['January','February','March','April','May','June','July','August','September','October','November','December'],
	getIndex: function(month){for(var i=0; i<this.names.length; i++){if(this.names[i] === month){return i;}}},
	getName: function(idx){return this.names[idx];},
	getDaysInMonth: function(year, month){
	var isLeapYear = function(year){return( ((year%4===0) && (year%100!==0))||(year%400===0) );};
	return[31, (isLeapYear(year)? 29: 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];},

	getFirstDay: function(y,m){
	var tDate = new Date(y,m,1);
	return tDate.getDay();},

	getPreviousMonth: function(year, month, ctl){
	var month= isNaN(this.month)? this.getIndex(month): month;
	var m = (month-1)%12;
	if(m === -1){year -= 1; m = 11;}
	buildCalendar(m, year, 0, ctl);},

	getNextMonth: function(year, month, ctl){
	var month = isNaN(month)? this.getIndex(month): month;
	var m = (month+1)%12;
	if(month > m){year += 1;}
	buildCalendar(m, year, 0, ctl);}
};

var Calendar = function(month, year, ctl){
	var dayNames = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
	var calendar = function(){
	var node = document.createElement('div');
	node.id = 'calendar';
	return node;}();

	var calCtls = function(){
	var node = document.createElement('div');
	node.id = 'calCtls';
	return node;}();

	var prevY = function(){
	var node = document.createElement('span');
	node.id = 'prevY';
	node.innerHTML = '&lt;&lt;';
	node.onclick = function(){
	var year = parseInt(document.getElementById('yName').innerHTML, 10);
	var month = document.getElementById('mName').innerHTML;
	var m = monthObj.getIndex(month);
	return buildCalendar(m, year-1, 0, ctl);};
	return node;}();

	var prevM = function(){
	var node = document.createElement('span');
	node.id = 'prevM';
	node.innerHTML = '&lt;';
	node.onclick = function(){
	var year = parseInt(document.getElementById('yName').innerHTML, 10);
	var month = document.getElementById('mName').innerHTML;
	monthObj.getPreviousMonth(year, month, ctl);};
	return node;}();

	var mName = function(){
	var node = document.createElement('span');
	node.id = 'mName';
	return node;}();

	var yName = function(){
	var node = document.createElement('span');
	node.id = 'yName';
	return node;}();

	var nxtY = function(){
	var node = document.createElement('span');
	node.id = 'nxtY';
	node.innerHTML = '&gt;&gt;';
	node.onclick = function(){
	var year = parseInt(document.getElementById('yName').innerHTML, 10);
	var month = document.getElementById('mName').innerHTML;
	var m = monthObj.getIndex(month);
	return buildCalendar(m, year+1, 0, ctl);};
	return node;}();

	var nxtM = function(){
	var node = document.createElement('span');
	node.id = 'nxtM';
	node.innerHTML = '&gt;';
	node.onclick = function(){
	var year = parseInt(document.getElementById('yName').innerHTML, 10);
	var month = document.getElementById('mName').innerHTML;
	monthObj.getNextMonth(year, month, ctl);};
	return node;}();

	var calTbl = function(){
	var node = document.createElement('table');
	node.id = 'calTbl';
	node.cellSpacing = 0;
	return node;}();

	var calBody = function(){
	var node = document.createElement('tbody');
	node.id = 'dates';
	return node;}();

	var cancelBtn = function(){
	var lnkBtn = window.document.createElement('td');
	lnkBtn.colSpan = 7;
	lnkBtn.className = 'linkCtl';
	lnkBtn.style.textAlign = 'right';
	lnkBtn.innerHTML = 'close';
	lnkBtn.onclick = function(){
	window.document.getElementById('calendar').parentNode.removeChild(window.document.getElementById('calendar'));};
	return lnkBtn;}();

	var build_calendar = function(){
	var build_calCtls = function(){
	calCtls.appendChild(prevY);
	calCtls.appendChild(prevM);
	calCtls.appendChild(nxtY);
	calCtls.appendChild(nxtM);
	calCtls.appendChild(mName);
	calCtls.appendChild(yName);}();

	var build_calTbl = function(){
	var col1 = document.createElement('col');
	var col2_6 = document.createElement('col');
	var col7 = document.createElement('col');
	var calHead = calTbl.createTHead();
	var hRow = calHead.insertRow(0);
	var calFoot = calTbl.createTFoot();
	var fRow = calFoot.insertRow(0);
	fRow.appendChild(cancelBtn);
	col1.style.backgroundColor = '#FBFBFB';
	col2_6.span = 5;
	col2_6.style.backgroundColor = '#FFFFFF';
	col7.style.backgroundColor = '#FBFBFB';
	for(var i=0; i<dayNames.length; i+=1){
	var hCell = hRow.insertCell(i);
	hCell.innerHTML = dayNames[i];}
	calTbl.appendChild(col1);
	calTbl.appendChild(col2_6);
	calTbl.appendChild(col7);
	calTbl.appendChild(calBody);}();

	calendar.appendChild(calCtls);
	calendar.appendChild(calTbl);
	document.body.appendChild(calendar);}();
};

var buildCalendar = function(m, y, d, ctl) {
	var dCells = document.getElementById('dates');
	var dayCount = 1;
	var daysInMonth = monthObj.getDaysInMonth(y, m);
	var firstDay = monthObj.getFirstDay(y,m);

	var setDate = function(tDate,ctl){
	var input_date = ctl;
	var calCtl = window.document.getElementById('calendar');
	var day = function(){
	var dy = tDate.data;
	if(tDate.length === 1){dy = '0' + tDate.data;}
	return dy;}();
	var month = function(){
	var mnth = m + 1;
	if(mnth < 10){mnth = '0' + mnth;}
	return mnth;}();
	input_date.value = month + '/' + day + '/' + y;
	calCtl.parentNode.removeChild(calCtl);};

	document.getElementById('mName').innerHTML = monthObj.getName(m);
	document.getElementById('yName').innerHTML = y;

	while(dCells.rows.length > 0){dCells.deleteRow(-1);}
	for(var i=0; i<6; i++) {
	var cRow = dCells.insertRow(i);
	for (var j=0; j<7; j++){
	if((cRow.rowIndex === 1 && j < firstDay) || dayCount > daysInMonth){cRow.insertCell(j);}
	else{
	var dCell = cRow.insertCell(j);
	dCell.style.cursor = 'pointer';
	var tDate = document.createTextNode(dayCount);
	dCell.appendChild(tDate);
	if(dayCount === d){
	dCell.style.fontWeight = 'bold';
	dCell.style.color = 'red';}
	dCell.onclick = function(tDate){return function(){setDate(tDate,ctl);};}(tDate);
	dayCount += 1;}}}
};

var currentDate = function(ctl){
var date = new Date();
Calendar(date.getMonth(), date.getFullYear(), ctl);
buildCalendar(date.getMonth(), date.getFullYear(), date.getDate());};

var allCtlsValid = function(){
var invalidCtls = 0;
var invalidReqCtls = 0;
for(var i=0; i<ctls.length; i+=1){
if(ctls[i].isValid === false){invalidCtls += 1;}
if(ctls[i].isRequired && ctls[i].value === ''){invalidReqCtls += 1;}}
if(invalidCtls !== 0 || invalidReqCtls !== 0){submitBtn.disabled = true;}
else{submitBtn.disabled = false;}};

var InputCtl = function(ctl, isRequired){
var validate = function(){
ctl.value = ctl.value.replace(/^\s+|\s+$/g,'');
if(!ctl.vString.test(ctl.value)){
if(ctl.value !== ''){
if(!ctl.msg){
ctl.msg = window.document.createElement('div');
ctl.msg.className = 'errMsg';
ctl.msg.innerHTML = ctl.invalidMsg;}
ctl.msg.style.display = 'block';
ctl.parentNode.appendChild(ctl.msg);
ctl.isValid = false;}
else if(ctl.isRequired === false && ctl.value === ''){
ctl.isValid = true;}}
else{
if(ctl.msg){
ctl.msg.parentNode.removeChild(ctl.msg);
ctl.isValid = true;}}
allCtlsValid();};
ctls.push(ctl);
ctl.isValid = true;
ctl.isRequired = isRequired;
ctl.onblur = function(){
if(ctl.value !== '' || isRequired){
return validate();}};
ctl.onkeyup = function(){
if(ctl.isRequired){
return allCtlsValid();}};
return ctl;};

var maskCtl = function(ctl, isRequired){
ctl.onkeydown = function(event){
var key = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
if((key >= 48 && key <= 90) || (key >= 96 && key <= 105)){
event.preventDefault();
var ch = String.fromCharCode(key);
var str = ctl.value + ch;
var pos = str.length;
if(ctl.regex.test(ch) && pos <= ctl.format.length){
if(ctl.format.charAt(pos - 1) !== ' '){str = ctl.value + ctl.format.charAt(pos - 1) + ch;}
ctl.value = str;}}};
new InputCtl(ctl, isRequired);
return ctl;};

var requiredCtl = function(ctl){
new InputCtl(ctl, true);
ctl.vString = /\S+/;
ctl.invalidMsg = 'Invalid Format: this is a reqired field';};

var alphaCtl = function(ctl, isRequired){
new InputCtl(ctl, isRequired);
ctl.vString = /^[a-zA-Z]+$/;
ctl.invalidMsg = 'Invalid Format: only letters a through z are allowed';};

var alphaSpaceCtl = function(ctl, isRequired){
new InputCtl(ctl, isRequired);
ctl.vString = /^[a-zA-Z\s-']+$/;
ctl.invalidMsg = 'Invalid Format: only letters a through z are allowed';};

var addressCtl = function(ctl, isRequired){
new InputCtl(ctl, isRequired);
ctl.vString = /^[a-zA-Z\s.0-9]+$/;
ctl.invalidMsg = 'Invalid Format: only letters a through z are allowed';};

var emailCtl = function(ctl, isRequired){
new InputCtl(ctl, isRequired);
ctl.vString = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/
ctl.invalidMsg = 'Invalid Format: the email address format is incorrect';};

var numCtl = function(ctl, isRequired){
new InputCtl(ctl, isRequired);
ctl.vString = /^\d+$/;
ctl.invalidMsg = 'Invalid Format: only digits 0 through 9 are allowed';};

var zipCtl = function(ctl, isRequired){
new maskCtl(ctl, isRequired);
ctl.vString = /^\d{5}([- /]?\d{4})?$/;
ctl.format = '     -    ',
ctl.regex = /\d/;
ctl.invalidMsg = 'Invalid Format: Use  ##### or #####-####';};


var phoneCtl = function(ctl, isRequired){
new maskCtl(ctl, isRequired);
ctl.vString = /^\([2-9]\d{2}\)\d{3}-\d{4}$/;
ctl.format = '(   )   -    ';
ctl.regex = /\d/;
ctl.invalidMsg = 'Invalid Format: Use (###)###-####';};

var dateCtl = function(ctl, isRequired){
	new maskCtl(ctl, isRequired);
	ctl.vString = /^([[0][1-9]|[1][012])\/([012][0-9]|[3][01])\/[12][0-9]{3}$/;
	ctl.format = '  /  /    ';
	ctl.regex = /\d/;
	ctl.invalidMsg = 'Invalid Format: Use mm/dd/yyyy';
	
	var m = 0;
	var d = 0;
	var y = 0;

	var parseCtlTxt = function(){
	var txt = ctl.value;
	if(txt === ''){
	var date = new Date();
	m = date.getMonth();
	d = date.getDate();
	y = date.getFullYear();}
	else {
	var parsedTxt = txt.split('/', 3);
	m = parseInt(parsedTxt[0],10) - 1;
	d = parseInt(parsedTxt[1],10);
	y = parseInt(parsedTxt[2],10);}}();

	var imgSpan = window.document.createElement('span');
	imgSpan.style.paddingLeft = '5px';
	var img = window.document.createElement('img');
	img.src = '../Images/Icons/Calendar.jpg';
	img.alt = 'calendar icon';

	img.onclick = function(){
	Calendar(m, y, ctl);
	buildCalendar(m, y, d, ctl);
	var calendar = window.document.getElementById('calendar');
	calendar.style.top = img.offsetTop + 'px';
	calendar.style.left = img.offsetLeft + 'px';};

	imgSpan.appendChild(img);
	ctl.parentNode.appendChild(imgSpan);
};

/*var selectCtl(ctl, idx, isRequired){
	ctl.isRequired = isRequired;
	
	if(ctl.selectedIndex === idx){
		ctl.isValid = false;
	}
	else {ctl.isValid = true;}
};*/

var submitCtl = function(ctl, sameAsEnter){
submitBtn = ctl;
if(sameAsEnter){
document.onkeydown = function(e){
var key = window.event ? event.keyCode : e.which ? e.which : e.charCode;
if(key === 13 && !ctl.disabled){ctl.focus();}};}};
