﻿var fh = new function() {

	this.SetFocus = function(o) {
		var oControl = f.SafeObject(o);
		if (oControl != null) {
			oControl.focus();
		}
	}



	/* postback handling */
	this.Postback = function(Command, Argument) {
		f.SetValue('Command', Command ? Command : '');
		f.SetValue('Argument', Argument ? Argument : '');
		document.forms[0].submit();
	}

	this.ButtonPostback = function(o) {
		var oButton = f.SafeObject(o);
		oButton.enabled = false;
		fh.Postback(oButton.id);
	}



	/* keyboard events */
	this.OnEnter = function(oEvent, oFunction) {
		if (f.GetKeyPressFromEvent(oEvent) == 13) {
			oFunction();
			oEvent.cancelBubble = true;
			oEvent.returnValue = false;
			return false;
		}
		return true;
	}

	this.IntegerOnly = function(oEvent) {
		var iKeyCode = f.GetKeyPressFromEvent(oEvent);
		return (iKeyCode > 47 && iKeyCode < 58) || iKeyCode < 32;
	}

	this.NumberOnly = function(oEvent) {
		var iKeyCode = f.GetKeyPressFromEvent(oEvent);
		return (iKeyCode > 47 && iKeyCode < 58) || (iKeyCode == 46 || iKeyCode == 45);
	}



	/* message box */
	this.Message = new function() {

		this.Clear = function() {
			f.Hide('divMessage');
		}

		this.CreateMessageHolder = function() {

			var oDiv = f.GetObject('divMessage');
			if (!oDiv) {
				oDiv = document.createElement('div');
				oDiv.setAttribute('id', 'divMessage');
				f.GetObject('divHolder').insertBefore(oDiv, f.GetObject('divHolder').childNodes[0]);
				f.AttachEvent('divMessage', 'click', function() { fh.Message.Clear(); });
			}
			return oDiv;

		}

		this.ShowWarning = function(sWarning) {
			oDiv = fh.Message.CreateMessageHolder();
			oDiv.className = 'warning';
			oDiv.innerHTML = sWarning;
			f.Show(oDiv);
		}


		this.ShowInformation = function(sInformation) {
			oDiv = fh.Message.CreateMessageHolder();
			oDiv.className = 'information';
			oDiv.innerHTML = sInformation;
			f.Show(oDiv);
		}
	}




	/* validator */
	this.Validator = function() {

		this.Validations = new Array();
		this.Warning = '';
		this.FirstControl;

		this.Add = function(Control, Validation, Message) {
			this.Validations.push({ Control: f.SafeObject(Control), Validation: Validation, Message: Message });
		}

		this.Validate = function() {

			var bAllValid = this.Warning == '';
			for (var i = 0; i < this.Validations.length; i++) {

				var oControl = this.Validations[i].Control;
				var sControlBase = s.Left(oControl.id, 3);

				var sValue;
				if (sControlBase == 'txt' || sControlBase == 'hid') {
					sValue = f.GetValue(oControl);
				} else if (sControlBase == 'ddl') {
					sValue = dd.GetText(oControl);
				} else if (sControlBase == 'sdd' || sControlBase == 'add') {
					sValue = dd.GetValue(oControl);
				}

				var rEmail = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;



				//if the validation is a boolean, then set it, else true
				var bValid = true;

				bValid = this.Validations[i].Validation.indexOf('NotEmpty') == -1 || sValue != '';
				if (this.Validations[i].Validation.indexOf('NotEmpty') > -1
						&& f.GetClass(oControl).indexOf('number') > -1
						&& n.SafeNumeric(sValue) == 0) {

					bValid = false;
				}
				bValid = bValid && (this.Validations[i].Validation.indexOf('IsEmail') == -1 || sValue == '' || rEmail.test(sValue));
				bValid = bValid && this.Validations[i].Validation != 'Fail';

				if (bValid) {
					fh.SetOK(oControl);
				} else {
					fh.SetError(oControl);
					this.Warning += this.Validations[i].Message + ' ';
				}

				if (bAllValid && !bValid) {
					fh.SetFocus(oControl);
				}

				bAllValid = bAllValid && bValid;
			}

			return bAllValid;
		}
	}

	/* error */
	this.SetError = function(o) {
		var oControl = f.SafeObject(o);
		if (oControl != null && oControl.className.indexOf(' error') < 0) {
			oControl.className += ' error';
		}
	}

	this.SetOK = function(o) {
		var oControl = f.SafeObject(o);
		if (oControl != null) {
			oControl.className = oControl.className.replace(' error', '');
		}
	}


	/* clear all errors */
	this.ClearAllErrors = function() {

		var a = f.GetObjectsByIDPrefix('txt', 'input');
		a=a.concat(f.GetObjectsByIDPrefix('txt', 'textarea'));
		for (var i = 0; i < a.length; i++) {
			f.RemoveClass(a[i], 'error');
		}
	}


	this.Dropdown = new function() {

		this.Populate = function(oList, sOptions, sFirstOption) {

			oList = f.SafeObject(oList);
			dd.Clear(oList);

			if (sFirstOption != undefined) {
				dd.AddOption(oList, sFirstOption);
			}
			var aOptions = sOptions.split('#');
			var aParts, sDisplay, sLastGroup, aDisplayParts;
			for (var i = 0; i < aOptions.length; i++) {
				aParts = aOptions[i].split('|');

				sDisplay = aParts[0];
				if (sDisplay.indexOf('~') > 0) {
					aDisplayParts = sDisplay.split('~');
					if (aDisplayParts[0] != sLastGroup) {
						dd.AddOption(oList, aDisplayParts[0], 0, 'group');
						sLastGroup = aDisplayParts[0];
					}
					sDisplay = aDisplayParts[1];
				}
				dd.AddOption(oList, sDisplay, aParts[1]);
			}
		}
	}



	/* date input */
	this.DateInput = new function() {

		this.Setup = function(sIDBase, iMinYear, iMaxYear, iDay, iMonth, iYear) {

			var oDay = f.SafeObject(sIDBase + '_Day');
			var oMonth = f.SafeObject(sIDBase + '_Month');
			var oYear = f.SafeObject(sIDBase + '_Year');

			dd.Clear(oDay);
			dd.AddOption(oDay, '');
			for (var i = 1; i < 32; i++) {
				dd.AddOption(oDay, i);
			}
			if (iDay != undefined) { dd.SetText(oDay, iDay) };

			dd.Clear(oMonth);
			dd.AddOption(oMonth, '');
			var aMonths = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
			for (var i = 0; i < aMonths.length; i++) {
				dd.AddOption(oMonth, aMonths[i], i + 1);
			}
			if (iMonth != undefined) { dd.SetValue(oMonth, iMonth) };

			dd.Clear(oYear);
			dd.AddOption(oYear, '');
			for (var i = iMinYear; i <= iMaxYear; i++) {
				dd.AddOption(oYear, i);
			}
			if (iYear != undefined) { dd.SetText(oYear, iYear) };
		}


		/* date input validate */
		this.IsValid = function(sIDBase, bAllowNone) {

			bAllowNone = bAllowNone == undefined ? false : bAllowNone;
			var iDay = n.SafeInt(dd.GetText(sIDBase + '_Day'));
			var iMonth = n.SafeInt(dd.GetValue(sIDBase + '_Month'));
			var iYear = n.SafeInt(dd.GetText(sIDBase + '_Year'));

			if (iDay > 0 && iMonth > 0 && iYear > 0) {
				var dDate = d.New(iDay, iMonth, iYear);
				return dDate.getDate() == iDay && 1 + dDate.getMonth() == iMonth && dDate.getFullYear() == iYear;
			} else if (bAllowNone && iDay == 0 && iMonth == 0 && iYear == 0) {
				return true;
			} else {
				return false;
			}
		}

		/* set ok */
		this.SetOK = function(sIDBase) {
			var oDay = f.SafeObject(sIDBase + '_Day');
			var oMonth = f.SafeObject(sIDBase + '_Month');
			var oYear = f.SafeObject(sIDBase + '_Year');

			fh.SetOK(oDay);
			fh.SetOK(oMonth);
			fh.SetOK(oYear);
		}


		/* set error */
		this.SetError = function(sIDBase) {
			var oDay = f.SafeObject(sIDBase + '_Day');
			var oMonth = f.SafeObject(sIDBase + '_Month');
			var oYear = f.SafeObject(sIDBase + '_Year');

			fh.SetError(oDay);
			fh.SetError(oMonth);
			fh.SetError(oYear);
		}


	}


	/* checked list */
	this.CheckList = new function() {

		this.SetupCheckAll = function(ListID) {
			var oCheckbox = f.GetObject(ListID + '_CheckAll');
			f.AttachEvent(oCheckbox, 'click', function(oEvent) { fh.CheckList.CheckAll(f.GetObjectFromEvent(oEvent)); });
		}


		this.CheckAll = function(oCheckbox) {
			var sListID = oCheckbox.id.split('_')[0];

			var aCheckboxes = f.GetObjectsByIDPrefix(sListID + '_', 'input');
			for (var i = 0; i < aCheckboxes.length; i++) {
				aCheckboxes[i].checked = oCheckbox.checked;
			}
		}
	}


	/* session call back */
	this.CheckSessionAlive;
	this.SessionAlive = function() {

		if (!fh.CheckSessionAlive) {
			fh.CheckSessionAlive = new WebService();
			fh.CheckSessionAlive.Go = function() {
				aParams = new Array();
				this.RunWebService('webservices/support.asmx', 'http://ltsb', 'CheckSessionAlive', aParams, this, false);
			}
			fh.CheckSessionAlive.Done = function(oXML) {
				var sReturn = this.GetTagValue(oXML, 'CheckSessionAliveResult');
				if (sReturn == 'false') {
					window.location = '/default.aspx?logout';
				}
			}
		}
		setTimeout('fh.SessionAliveStub();', 300000);

	}

	this.SessionAliveStub = function() {
		fh.CheckSessionAlive.Go();
		setTimeout('fh.SessionAliveStub();', 300000);
	}




	//auto suggest
	this.AutoSuggest = new function() {

		var me = this;
		this.Timer;
		this.Control;
		this.Dropdown;
		this.Position;
		this.ItemCount;
		this.CurrentDiv;
		this.CurrentID;
		this.CallBack;


		//setup
		this.Setup = function(oTextbox, oCallBack) {

			var oTextbox = f.SafeObject(oTextbox);
			f.AttachEvent(oTextbox, 'keyup', function(oEvent) {
				return fh.AutoSuggest.KeyUp(f.GetObjectFromEvent(oEvent), f.GetKeyPressFromEvent(oEvent));
			});
			f.AttachEvent(oTextbox, 'keydown', function(oEvent) {
				return fh.AutoSuggest.KeyDown(f.GetObjectFromEvent(oEvent), f.GetKeyPressFromEvent(oEvent));
			});
			this.CallBack = oCallBack;

		}


		//keyup
		this.KeyUp = function(oTextbox, iKeyCode) {

			if (iKeyCode < 41 && iKeyCode != 32 && iKeyCode != 8) { return; }
			if (f.GetValue(oTextbox).length < 1) { return; }

			if (me.Timer) { clearTimeout(me.Timer); }
			me.Timer = setTimeout('fh.AutoSuggest.Search()', 500);
			me.Control = oTextbox;
			f.AddClass(me.Control, 'working');
		}


		//keydown
		this.KeyDown = function(oTextbox, iKeyCode) {


			switch (iKeyCode) {

				case 38: //up arrow
					me.Move(-1);
					return;
				case 40: //down arrow
					me.Move(1);
					return;
				case 33: //page up
					me.Move(-5);
					return;
				case 34: //page down
					me.Move(5);
					return;
				case 27: //escape
					me.Close();
					return
				case 13: //return
					if (me.CurrentID > 0) {
						me.Select(me.CurrentDiv);
					}
					return false;

			}
		}


		//search
		this.Search = function() {

			var sQuery = f.GetValue(me.Control.id + '_Query');
			var sSearch = f.GetValue(me.Control);
			if (sSearch.length > 0) {
				me.AutoCompleteSearch.Go(sQuery, sSearch);
			} else {
				me.Close();
			}



		}


		//searchresponse
		this.SearchResponse = function(sHTML, iItemCount) {

			f.RemoveClass(me.Control, 'working');

			if (!me.Dropdown) {
				me.Dropdown = document.createElement('div');
				me.Dropdown.id = 'divAC';
				document.body.appendChild(me.Dropdown);

				var oPosition = e.GetPosition(me.Control);
				oPosition.Top = oPosition.Top + oPosition.Height;
				oPosition.Width = oPosition.Width - 2;
				oPosition.Height = 150;
				e.SetPosition('divAC', oPosition);
			}

			f.AttachEvent('divAC', 'click', function(oEvent) {
				fh.AutoSuggest.MouseClick(f.GetObjectFromEvent(oEvent));
			});

			me.Dropdown.innerHTML = sHTML;
			me.Position = 0;
			me.CurrentDiv = null;
			me.CurrentID = 0;
			me.ItemCount = iItemCount;
		}


		//move
		this.Move = function(By) {

			var iTarget = me.Position + By;

			if (iTarget >= 1 && iTarget <= me.ItemCount) {

				var aItems = f.GetObjectsByIDPrefix('ac_', 'div');
				for (var i = 0; i < aItems.length; i++) {
					if (aItems[i].getAttribute('tag') == iTarget) {
						f.AddClass(aItems[i], 'acselect');
						me.CurrentDiv = aItems[i];
					} else {
						f.RemoveClass(aItems[i], 'acselect');
					}
				}

				me.Position = iTarget;
				me.Dropdown.scrollTop = me.CurrentDiv.offsetTop - 20;
				me.CurrentID = me.CurrentDiv.id.split('_')[1];
			}

		}


		//select
		this.Select = function(oDiv) {

			//tease out text from div (remove em's and take left of span tag
			var sDisplay = oDiv.innerHTML;
			sDisplay = sDisplay.replace(/<.*?em>/ig, '');
			sDisplay = sDisplay.replace(/<span>.*?<\/span>/ig, '');
			f.SetValue(me.Control, sDisplay);
			f.SetValue(f.GetObject(me.Control.id + '_ID'), oDiv.id.split('_')[1]);
			me.Close();

			if (me.CallBack) {
				me.CallBack();
			}

		}

		//mouseclick
		this.MouseClick = function(oObject) {

			var oDiv = null;
			if (oObject.nodeName == 'DIV' && s.StartsWith(oObject.id, 'ac_')) {
				oDiv = oObject;
			} else if (oObject.parentNode.nodeName == 'DIV' && s.StartsWith(oObject.parentNode.id, 'ac_')) {
				oDiv = oObject.parentNode;
			}

			if (oDiv) {
				me.Select(oDiv);
			}

		}


		//close
		this.Close = function() {
			f.RemoveClass(me.Control, 'working');
			if (me.Dropdown) {
				document.body.removeChild(me.Dropdown);
				me.Dropdown = null;
			}
		}



		//webservice call to get data
		this.AutoCompleteSearch = new WebService();
		this.AutoCompleteSearch.Go = function(Query, Search) {
			aParams = new Array(['Query', Query], ['Search', Search]);
			this.RunWebService('/webservices/support.asmx', 'http://nix', 'AutoCompleteSearch', aParams, this, false);
		}
		this.AutoCompleteSearch.Done = function(oXML) {
			var sHTML = this.GetTagValue(oXML, 'HTML');
			var iItemCount = this.GetTagValue(oXML, 'ItemCount');
			fh.AutoSuggest.SearchResponse(sHTML, iItemCount);
		}

	}


	/* session call back */
	this.CheckSessionAlive;
	this.SessionAlive = function() {

		if (!fh.CheckSessionAlive) {
			fh.CheckSessionAlive = new WebService();
			fh.CheckSessionAlive.Go = function() {
				aParams = new Array();
				this.RunWebService('/webservices/support.asmx', 'http://nix', 'CheckSessionAlive', aParams, this, false);
			}
			fh.CheckSessionAlive.Done = function(oXML) {
				var sReturn = this.GetTagValue(oXML, 'CheckSessionAliveResult');
				if (sReturn == 'false') {
					window.location = '/default.aspx?logout';
				}
			}
		}
		setTimeout('fh.SessionAliveStub();', 300000);

	}

	this.SessionAliveStub = function() {
		fh.CheckSessionAlive.Go();
		setTimeout('fh.SessionAliveStub();', 300000);
	}

}



var Forms = new function() {

	this.ExtraFocus;
	this.ExtraBlur;
	this.LastControl;

	//setup
	this.Setup = function() {

		var aInput = f.GetObjectsByIDPrefix('txt', '*');
		var aSelect = f.GetObjectsByIDPrefix('ddl', '*');
		for (var j = 0; j < aSelect.length; j++) {
			aInput.push(aSelect[j]);
		}

		for (var i = 0; i < aInput.length; i++) {
			f.AttachEvent(aInput[i], 'focus',
						function(oEvent) {
							Forms.TextboxFocus(f.GetObjectFromEvent(oEvent));
						});
			f.AttachEvent(aInput[i], 'blur',
					function(oEvent) {
						Forms.TextboxBlur(f.GetObjectFromEvent(oEvent));
					});
		}
	}


	//textboxfocus and blur
	this.TextboxFocus = function(oTextbox) {
		f.AddClass(oTextbox.parentNode, 'current');
		if (Forms.ExtraFocus) {
			Forms.LastControl = oTextbox;
			Forms.ExtraFocus();
		}
	}
	this.TextboxBlur = function(oTextbox) {
		f.RemoveClass(oTextbox.parentNode, 'current');
		if (Forms.ExtraBlur) {
			Forms.LastControl = oTextbox;
			Forms.ExtraBlur();
		}
	}

}