﻿/*global $, Dom, Event, YAHOO */
/*members Panel, aCalFields, aCopyEmployer, aCopyInsurance, aCopySection, 
    aDefinitions, aMagicSelects, aOtherFields, addClass, addListener, 
    appendChild, applyKinCopy, applyPatientCopy, bCopyInsurance, 
    bCopySection, baby, backgroundColor, body, checked, className, close, 
    concat, constraintoviewport, createElement, createTextNode, 
    doCopyFromKin, doCopyFromPatEmployer, doCopyFromPatient, doMagicSelects, 
    doOtherFields, doPopupDefinitions, draggable, emerg, field, firstChild, 
    fixedcenter, flipOther, focus, formPage, from, getElementsBy, 
    getOtherFieldBySelectId, getTarget, handleKinCopy, handleMagicSelect, 
    handlePatientCopy, hasClass, hide, href, id, init, kin, legend, length, 
    modal, monitorresize, name, nodeValue, oCalContainer, oCalField, 
    oCalendar, options, panel, patient, popup, push, removeClass, render, 
    replaceClass, select, selectedIndex, setAttribute, setFooter, 
    setTimeout, show, style, substring, tagName, to, toLowerCase, toString, 
    toUpperCase, underlay, value, visible, widget, width
*/

var PatientRegistration = {
	toString: function() { return 'Patient Registration Form (Page ' + this.formPage + ') '; },
	formPage: 0, // Default page is non-existant.
	// Define which select items include an 'other' field that causes an additional text box to appear.
	aOtherFields: [ ],

	// Define which blocks include defining text, and where to put the link for that popup.
	aDefinitions: [ ],

	// Define a list of matching fields between Next Of Kin and Emergency Contact.
	bCopySection:  false,
	aCopySection: [
		{ emerg: 'EmCFName'        , kin: 'KinFName'         },
		{ emerg: 'EmCLName'        , kin: 'KinLName'         },
		{ emerg: 'EmCAddy1'        , kin: 'KinAddy1'         },
		{ emerg: 'EmCAddy2'        , kin: 'KinAddy2'         },
		{ emerg: 'EmCCity'         , kin: 'KinCity'          },
		{ emerg: 'EmCState'        , kin: 'KinState'         },
		{ emerg: 'EmCZip'          , kin: 'KinZip'           },
		{ emerg: 'EmCPhone'        , kin: 'KinPhone'         },
		{ emerg: 'EmCAltPhone'     , kin: 'KinAltPhone'      },
		{ emerg: 'EmCRelationship' , kin: 'KinRelationship'  },
		{ emerg: 'EmCOtherRelation', kin: 'KinOtherRelation' }],

	// Define a list of matching fields between Patient Insurance and Baby Insurance.
	bCopyInsurance: false,
	aCopyInsurance: [
		{ patient: 'Insurance'     , baby: 'BabyInsurance'      },
		{ patient: 'Medicare'      , baby: 'BabyMedicare'       }],
	

	//Define a list of matching fields between Patient's Employer and Insurance Subscriber's Employer.
	aCopyEmployer: [
		{ from: 'EmpNameID'  , to: 'InsEmpName'  },
		{ from: 'EmpPhoneID' , to: 'InsEmpPhone' },
		{ from: 'EmpAddy1ID' , to: 'InsEmpAddy1' },
		{ from: 'EmpAddy2ID' , to: 'InsEmpAddy2' },
		{ from: 'EmpCityID'  , to: 'InsEmpCity'  },
		{ from: 'EmpStateID' , to: 'InsEmpState' },
		{ from: 'EmpZipID'   , to: 'InsEmpZip'   }],

	// Define a list of select boxes that prepopulate other fields.
	aMagicSelects: [ ],
	    
	// Define a list of select boxes that prepopulate other fields.
	aCongregationSelects: [ 
	    { select: 'Religion'        , cascadingSelect: 'Congregation' }],

	// Helper variables for the calendar display.
	aCalFields:    [ ],              // Fields that trigger a calendar display.
	oCalField:     null,             // The field that has triggered the current appearance
	oCalContainer: null,             // The container for the calendar
	oCalendar:     null,             // The calendar itself

	init: function() {

		// Several select boxes have "Other" values that should cause new text fields to appear.
		this.doOtherFields();

		// There are a couple of popup definitions
		this.doPopupDefinitions();

		// Emergency Contact has a checkbox that should copy info from Next Of Kin.
		this.doCopyFromKin();

		// Baby Insurance has a checkbox that should copy info from patient insurance.
		this.doCopyFromPatient();

		// The maternity form includes doctor selections that should populate the phone number box.
		this.doMagicSelects();

		// Primary Insurance should copy some values from "Employer" under some conditions.
		this.doCopyFromPatEmployer();
		
		// Selecting a Religion will populate the Congregation dropdown and make it visible.
		this.doCongregationSelects();

	},

	// Some select boxes have an option that reads "Other."
	// When "Other" is selected, a text field should appear to accept this new value.
	// If "Other" is then deselected, the text field should vanish.
	// 2007-12-26: client has requested making the text field more obvious. Adding some pixie dust.
	doOtherFields: function() {
		var aFields = this.aOtherFields;
		var i       = aFields.length;
		var oSelect, oField;
		while (i--) {
			oField  = $(aFields[i].field);
			oSelect = $(aFields[i].select);
			if (!oField || !oSelect) { continue; }
			if (Dom.hasClass(oField, 'xsl') === false) { Dom.addClass(oField, 'js'); }
			Event.addListener(oSelect, 'change', this.flipOther, this, true);
		}
	},
	
	getOtherFieldBySelectId: function(s) {
		var i = this.aOtherFields.length; while (i--) {
			if (this.aOtherFields[i].select === s) { return $(this.aOtherFields[i].field); }
		}
	},
	
	flipOther: function(e) {
		var oTarget = Event.getTarget(e);
		var sID     = oTarget.id;
		var oField  = this.getOtherFieldBySelectId(sID); if (!oField) { return; }
		var oOption = oTarget.options[oTarget.selectedIndex];
		var sValue  = (oOption.value) ? oOption.value : (oOption.firstChild) ? oOption.firstChild.nodeValue : '';

		// Pixie dust
		var n       = 0;
		var fnFlash;
		fnFlash = function() {
			oField.style.backgroundColor = (n % 2) ? '#FFF' : '#FF0';
			if (n++ < 7) { window.setTimeout(fnFlash, 200); }
		};

		if (sValue.toLowerCase() === 'other') {
			Dom.removeClass(oField, 'js');
			oField.focus();
			fnFlash();
		} else {
			Dom.replaceClass(oField, 'xsl', 'js');
		}
	},

	// Some sections have special instructions.
	// These are to appear in a special window instead of obscuring the form.
	// This handles that special window.
	doPopupDefinitions: function() {
		var oConfig = {
			width               : '600px',
			fixedcenter         : true,
			constraintoviewport : true,
			close               : true,
			draggable           : false,
			underlay            : 'shadow',
			modal               : false,
			visible             : false,
			monitorresize       : false
		};

		var oFooter, oLegend, oLink;
		var aDefs = this.aDefinitions;
		var i = aDefs.length; while (i--) {
			oLegend = $(aDefs[i].legend); if (!oLegend) { continue; }
			aDefs[i].panel = new YAHOO.widget.Panel(aDefs[i].popup, oConfig);

			oFooter = document.createElement('button');
			oFooter.setAttribute("type", "button");
			oFooter.appendChild(document.createTextNode('Close'));
			Event.addListener(oFooter, 'click', aDefs[i].panel.hide, aDefs[i].panel, true);
			aDefs[i].panel.setFooter(oFooter);
			aDefs[i].panel.render(document.body);

			oLink       = document.createElement('a');
			oLink.href  = '#null';
			oLink.appendChild(document.createTextNode('definition'));
			Event.addListener(oLink, 'click', aDefs[i].panel.show, aDefs[i].panel, true);
			oLegend.appendChild(document.createTextNode(' ('));
			oLegend.appendChild(oLink);
			oLegend.appendChild(document.createTextNode(')'));
		}
	},

	doCopyFromKin: function() {
		var aFields = [ ];
		var oCntrl = $('SameAsKin'); if (!oCntrl) { return; }
		var i = this.aCopySection.length; while (i--) {
			this.aCopySection[i].emerg = $(this.aCopySection[i].emerg);
			this.aCopySection[i].kin   = $(this.aCopySection[i].kin);
			aFields.push(this.aCopySection[i].emerg);
			aFields.push(this.aCopySection[i].kin);
		}
		if (aFields.length === 0) { return; }
		Event.addListener(oCntrl,  'click',  this.applyKinCopy, this, true);
		Event.addListener(aFields, 'change', this.handleKinCopy, this, true);
		this.bCopySection = oCntrl.checked;
	},

	applyKinCopy: function(e) {
		var oTarget  = Event.getTarget(e);
		var aFields  = this.aCopySection;
		var i, oOther;
		if (oTarget.checked === true) {
			this.bCopySection = true;

			i = aFields.length; while (i--) {
				switch (aFields[i].emerg.tagName.toLowerCase()) {
					case 'input':  aFields[i].emerg.value         = aFields[i].kin.value;         break;
					case 'select': aFields[i].emerg.selectedIndex = aFields[i].kin.selectedIndex; break;
				}
			}

			oOther = $('EmCRelationship');
			if (oOther.options[oOther.selectedIndex].value.toLowerCase() === 'other') {
				Dom.removeClass('EmCOtherRelation', 'js');
			} else {
				Dom.addClass('EmCOtherRelation', 'js');
			}

		} else {
			this.bCopySection = false;
		}
	},
	
	handleKinCopy: function(e) {
		if (this.bCopySection === false) { return; }
		var oTarget  = Event.getTarget(e);
		var sID      = oTarget.id;
		var sMode    = (sID.substring(0, 3).toLowerCase() === 'kin') ? 'Kin' : 'Emerg';
		var oDest, sType;

		// If we've changed an emergency contact, we want to uncheck the checkbox.
		// If we've changed a kin contact, we want to copy that to the emergency contact.
		switch (sMode) {
			case 'Kin':
				oDest = $('EmC' + sID.substring(3));
				sType = oDest.tagName.toLowerCase();

				switch (sType) {
					case 'input'  : oDest.value         = oTarget.value;         break;
					case 'select' : oDest.selectedIndex = oTarget.selectedIndex; break;
				}

				if (sID === 'KinRelationship') {
					if (oTarget.options[oTarget.selectedIndex].value.toLowerCase() === 'other') {
						Dom.removeClass('EmCOtherRelation', 'js');
					} else {
						Dom.addClass('EmCOtherRelation', 'js');
					}
				}
				break;

			case 'Emerg' :
				$('SameAsKin').checked = false;
				this.bCopySection = false;
				break;
		}
	},

	// Copy Patient's employer contact to Subscriber's employer contact if the patient is also the subscriber
	doCopyFromPatEmployer: function() {
		var oCntrl  = $('InsRelationship'); if (!oCntrl) { return; }
		var aFields = this.aCopyEmployer;
		var i = aFields.length; while (i--) {
			aFields[i].from = $(aFields[i].from);
			aFields[i].to   = $(aFields[i].to);
		}
		Event.addListener(oCntrl,  'change', function() {
			var x = aFields.length;
			if (oCntrl.options[oCntrl.selectedIndex].value !== "Self") { return; }
			while (x--) { aFields[x].to.value = aFields[x].from.value; }
		}, this, true);
	},

	doCopyFromPatient: function() {
		var oData   = this.aCopyInsurance;
		var oForm   = $('formID_10');
		var oCntrl  = Dom.getElementsBy(function(o) {
			return (o.name === 'BabySameInsurance' && o.value === '1');
		}, 'input', oForm)[0]; if (!oCntrl) { return; }
		var aFields = [ ];
		var s, i;
		function fnMatch(o) { return (o.name.toUpperCase() === s); }
		i = oData.length; while (i--) {
			s = oData[i].patient.toUpperCase();
			oData[i].patient = Dom.getElementsBy(fnMatch, 'input', oForm);

			s = oData[i].baby.toUpperCase();
			oData[i].baby    = Dom.getElementsBy(fnMatch, 'input', oForm);

			aFields = aFields.concat(oData[i].patient);
			aFields = aFields.concat(oData[i].baby);
		}
		if (aFields.length === 0) { return; }
		Event.addListener(oCntrl,  'click', this.applyPatientCopy,  this, true);
		Event.addListener(aFields, 'click', this.handlePatientCopy, this, true);
		this.bCopyInsurance = oCntrl.checked;
	},
	
	applyPatientCopy: function(e) {
		var oTarget  = Event.getTarget(e);
		var aFields  = this.aCopyInsurance;
		var i, x, sVal;
		if (oTarget.checked === true) {
			this.bCopyInsurance = true;

			i = aFields.length; while (i--) {
				sVal = '';
				x = aFields[i].patient.length; while (x--) {
					if (aFields[i].patient[x].checked) {
						sVal = aFields[i].patient[x].value;
						break;
					}
				}

				x = aFields[i].baby.length; while(x--) {
					aFields[i].baby[x].checked = (aFields[i].baby[x].value === sVal);
				}

			}

		} else {
			this.bCopyInsurance = false;
		}
	},
	
	handlePatientCopy: function(e) {
		if (this.bCopyInsurance === false) { return; }
		var oForm    = $('formID_10');
		var oTarget  = Event.getTarget(e);
		var sName    = oTarget.name;
		var sMode    = (sName.substring(0, 4).toLowerCase() === 'baby') ? 'Baby' : 'Patient';
		var x, oCntrl;
		var sVal, aFields;

		switch (sMode) {

			case 'Patient':
				sVal    = oTarget.value;
				sName   = ('Baby' + sName).toUpperCase();
				aFields = Dom.getElementsBy(function(o) { return (o.name.toUpperCase() === sName); }, 'input', oForm);
				x = aFields.length; while (x--) { aFields[x].checked = (aFields[x].value === sVal); }
				break;

			case 'Baby':

				oCntrl = Dom.getElementsBy(function(o) { return (o.name === 'BabySameInsurance'); }, 'input', oForm);
				x = oCntrl.length; while (x--) { oCntrl[x].checked = (oCntrl[x].value === '0'); }
				this.bCopyInsurance = false;
				break;

		}
	},

	doMagicSelects: function() {
		if (this.aMagicSelects.length === 0) { return; }
		var aSels = [ ];
		var i = this.aMagicSelects.length; while (i--) { aSels.push(this.aMagicSelects[i].select); }
		Event.addListener(aSels, 'change', this.handleMagicSelect, this, true);
	},
	
	handleMagicSelect: function(e) {
		var oTarget = Event.getTarget(e);
		var sID     = oTarget.id;
		var sValue  = oTarget.options[oTarget.selectedIndex].className || '';
		var i = this.aMagicSelects.length; while (i--) {
			if (this.aMagicSelects[i].select === sID) {
				$(this.aMagicSelects[i].field).value = sValue;
				break;
			}
		}
	},
	
	// When an item is selected, another dropdown will be populated based in the selection
	doCongregationSelects: function() {
	    //if (this.aCongregationSelects.length === 0) { return; }
		//var aSels = [ ];
		//var i = this.aCongregationSelects.length; while (i--) { aSels.push(this.aCongregationSelects[i].select); }
		var religionSelect = $('Religion');
		if (religionSelect !== null) {
		    var religionCode = religionSelect.options[religionSelect.selectedIndex].className || '';
		    this.populateCongregations(religionCode);
		}
		
		Event.addListener('Religion', 'change', this.handleCongregationSelect, this, true);
	},
	
	handleCongregationSelect: function(e) {
		var oTarget = Event.getTarget(e);
		var sID     = oTarget.id;
		var sValue  = oTarget.options[oTarget.selectedIndex].className || '';
		var oCascadingList;
		
		this.populateCongregations(sValue);
	},
	
	populateCongregations: function(religionCode) {
        if (religionCode !== '') {
	        var sUrl = 'PatientRegistration_AJAXDB.asp?religionCode=' + religionCode;
	        var selectedCongregation = $('hiddenCongregation').value;
	        YAHOO.util.Connect.asyncRequest(
	            'GET',
	            sUrl,
	            callback = {
	                success: function(o) {
	                    var newRow      = $('CongregationRow');
	                    var newSelect   = $('Congregation');
    	                
	                    var results = o.responseText.split("|");
    	                
    	                // clear congregations from dropdown before repopulating
    	                newSelect.options.length = 1;
    	                
    	                if (results.length > 0 && !(results[0] == '' && results.length == 1)) {
	                        for (var i = 0; i < results.length - 1; i++) {	                            
	                            var selected = (results[i] == selectedCongregation);
	                            newSelect.options[newSelect.length] = new Option(results[i], results[i], selected);                           
	                        }
        	                    
	                        newRow.style.visibility = 'visible';
	                    }
	                    else {
	                        newRow.style.visibility = 'hidden';
	                    }
	                }
	            }
	        );
	    }
	},
	
	selectCongregation: function(congregation) {
	    if (congregation !== '') {	        
	        var newSelect   = document.getElementById('Congregation');
	        alert(newSelect);
	        for (var i = 0; i < newSelect.options.length; i++) {
	            alert(newSelect.options[i].value);
	            if (newSelect.options[i].value = congregation) {
	                newSelect.selectedIndex = i;
	                break;
	            }
	        }
	    }
	}
};

