/* $Id: yokohama-yl2.js,v 1.1 2008/08/26 11:51:00 glenn Exp $  */

var BLUE = function()
{
	/**
	*	Run any new <script> elements that are dynamically loaded...
	*/
	function executeScripts(divElmId)
	{
		var divElm = document.getElementById(divElmId);
		var nodeList = divElm.getElementsByTagName("script");
		for (var i=0; i<nodeList.length; i++)
		{
			var elm = nodeList.item(i);
			/*if(elm.getAttribute('src') != undefined)
				methods.loadjs(elm.getAttribute('src'), new function() { } );
			else*/
				eval(elm.innerHTML);
		}
	};
	
	/* This requests HTML from the server and populates a div with the results */
	function requestInternal(url,elementId)
	{
		if(elementId)
		{
			elementUnload(elementId);

			var welm = document.getElementById('w' + elementId.substr(2));

			if(welm != null)
				welm.innerHTML = '<img src="images/wait.gif"/>';
		}

		var responseSuccess = function(o) {
			if(elementId)
			{
				if(welm != null)
					welm.innerHTML = '';
				document.getElementById(elementId).innerHTML=o.responseText;
				document.getElementById(elementId).style.display = "block";
				elementLoad(elementId);
				executeScripts(elementId);
			}
		};
		
		var responseFailure = function(o) {
			if(welm != null)
				welm.innerHTML = '';
			if(elementId)
				document.getElementById(elementId).innerHTML = '<center>&lt;Error&gt;</center>';
			alert('We are sorry, there was a problem with the request.');			
		}
				
		var callback = {
			success : responseSuccess,
			failure : responseFailure};
			
		var transaction = YAHOO.util.Connect.asyncRequest('GET', url, callback, null); 
		
		//document.getElementById(elementId).scrollIntoView();
	};

	/* When an element is populated dynamically, this is run afterwards for init */
	function elementLoad(divElm)
	{
		enableRichTextInt(divElm);
	};
	
	/* Scan all text areas within the element and switch to rich text editing for all richtext="true" */
	function enableRichTextInt(divElm,xconfig)
	{
		if(typeof divElm == "string") 
			divElm = document.getElementById(divElm);
		
		var nodeList = divElm.getElementsByTagName("textarea");

		var config = {
								height: '300px',
								width: '522px',
								dompath: false,
								animate: true,
								markup: "xhtml",
								handleSubmit: true,
								toolbar: {
									titlebar: 'Rich Text Editor',
									buttons: [
										{ group: 'textstyle', label: 'Font Style',
											buttons: [
												{ type: 'push', label: 'Bold', value: 'bold' },
												{ type: 'push', label: 'Italic', value: 'italic' },
												{ type: 'push', label: 'Underline', value: 'underline' } ]
										}]
								}
						};

		//config = YAHOO.lang.merge(config,xconfig);

		for (var i=0; i<nodeList.length; i++)
		{
			var elm = nodeList.item(i);
			if(elm.getAttribute('richtext') == "true")
			{
				var loader = new YAHOO.util.YUILoader({ require: ["editor"], loadOptional: true, base: "javascript/yui/", onSuccess: function() {
						//var myEditor = new YAHOO.widget.Editor(elm.id, { 
						myEditor = new YAHOO.widget.Editor(elm.id, config);
						
						/*myEditor.on('editorContentLoaded', function() {
								var head = this._getDoc().getElementsByTagName('head')[0];
								var link = this._getDoc().createElement('link');
								link.setAttribute('rel', 'stylesheet');
								link.setAttribute('type', 'text/css');
								link.setAttribute('href', 'bluejava.css');
								head.appendChild(link);
							}, myEditor, true);*/
						
						myEditor.render(); 
					}});
				loader.insert();
			}

			if(elm.className.indexOf('htmlPrivate') >= 0)  /* change this to YAHOO.util.Dom.hasClass() */
			{
				var loader = new YAHOO.util.YUILoader({ require: ["editor"], loadOptional: true, base: "javascript/yui/", onSuccess: function() {
						//var myEditor = new YAHOO.widget.Editor(elm.id, {
						myEditor = new YAHOO.widget.Editor(elm.id, { handleSubmit: true, animate: true, markup: "xhtml"});
						myEditor.render();
					}});
				loader.insert();
			}
		}
	};

	/* When an element is to be re-populated with dynamic content, call this first */
	function elementUnload(divElmId)
	{
	};

	// pad to 2 digits
	function pad(n)
	{
		if(n > 9)
			return n;
		return "0" + n;
	};

	var methods = {
		popup : function(url,target,width,height)
			{
				if (width == null)
					width=600;
				if (height == null)
					height = 700;
				var myRef = window.open(url,target,'left=30,top=20,width='+width+',height='+height+',titlebar=no,location=no,status=no,resizable=yes,scrollbars=yes');
				myRef.focus();
			},

		timerRunning : false,
		timerId : 0,
		divNum : 1,
		panels : [],
		loadedjs : [],

		// This method listens for keypresses on a specific field.  Once a keypress is detected, it waits 200
		// milliseconds and then calls makeRequest() on the url specified.  If during those 200ms another keypress
		// is detected, the counter starts over.  This makes for a good dynamic "hint" system.
		keypressRequest : function(field,url,elementId)
			{
				if(timerRunning)
					clearTimeout(timerId);
				timerRunning = false;

				if(field.value.length > 1)
				{
					timerRunning = true;
					f = function()
					{
						requestInternal(url,elementId);
						timerRunning = false;
					}
					timerId = setTimeout(f,200);
				}
				else
				{
					document.getElementById(elementId).innerHTML = "";
					document.getElementById(elementId).style.display = "none";
				}
			},

		makeRequest : function(url,elementId) 
		{
			var loader = new YAHOO.util.YUILoader({ require: ["connection"], loadOptional: true, base: "javascript/yui/", onSuccess: function() {
				requestInternal(url,elementId);
			}});
			loader.insert();
		},

		checkAllBoxes : function(form, fieldPrefix)
			{
				e = document.forms[form].elements;
				for(var i=0;i< e.length;i++)
				{
					if(e[i].name.substring(0,fieldPrefix.length) == fieldPrefix)
						e[i].checked = true;
				}
			},

		uncheckAll : function(form, fieldPrefix)
			{
				e = document.forms[form].elements;
				for(var i=0;i< e.length;i++)
				{
					if(e[i].name.substring(0,fieldPrefix.length) == fieldPrefix)
						e[i].checked = false;
				}
			},

		isWellFormedEmailAddress : function(testAddress)
			{
				var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
				if(filter.test(testAddress))
					return true;
				return false;
			},

		toggleDisplay : function(elmId)
			{
				var divElm = document.getElementById(elmId);
				if(divElm.style.display == 'none')
					divElm.style.display = "block";
				else
					divElm.style.display = "none";
			},

		toggleNextDivDisplay : function(me)
			{
				var next = BLUE.getNextDiv(me);

				if(next != null)
				{
					if(next.style.display == 'none')
						next.style.display = "block";
					else
						next.style.display = "none";
				}
				
				return false;
			},

		showNextDivDisplay : function(me)
			{
				var next = getNextDiv(me);
				if(next != null)
					next.style.display = "block";
			},

		hideNextDivDisplay : function(me)
			{
				var next = getNextDiv(me);
				if(next != null)
					next.style.display = "none";
			},
			
		getNextDiv : function(me)
			{
				var next = me.nextSibling;
				while((next != null) && (next.nodeName.toLowerCase() != "div"))
					next = next.nextSibling;
				return next;
			},			

		/** use this to ensure something is hidden - regardless of previous state */
		hideElement : function(elmId)
			{
				divElm = document.getElementById(elmId);
				divElm.style.display = "none";
			},

		/** use this to ensure something is shown - regardless of previous state */
		showElement : function(elmId)
			{
				divElm = document.getElementById(elmId);
				divElm.style.display = "block";
			},
			 
		updateTime : function(divId,conf)
		 {
			var t = document.getElementById(divId);
			var d = new Date();
			if(conf.offsetMinutes != -1)
				d.setTime(d.getTime() + ((d.getTimezoneOffset() - conf.offsetMinutes) * 60 * 1000));
			if(conf.timeOverride != -1)
				d.setTime(conf.timeOverride);
			var dayMod = "";
			var today = new Date();
			if(today.getDate() != d.getDate())  // if dates don't match
				 {
					  if(today.getTime() > d.getTime())
						   dayMod = " (yesterday)";
					else
						 dayMod = " (tomorrow)";
				  }
			var newTime = "";
			if(conf.showDate)
				newTime += d.getFullYear() + "-" + pad(d.getMonth()+1) + "-" + pad(d.getDate()) + " | ";
			newTime += d.getHours() + ":" + pad(d.getMinutes());
			if(conf.showSecs)
				newTime += ":" + pad(d.getSeconds());
			if(!conf.showDate)
				newTime += dayMod;
			t.innerHTML = newTime;
		 },
		  
		startTimeDisplay : function(td,offsetMinutes,showSecs)
		{
			var offsetMinutes = (offsetMinutes == null) ? -1 : offsetMinutes;
			
			BLUE.updateTime(td,{offsetMinutes:offsetMinutes,showSecs:showSecs});
			if(showSecs)
				setInterval( "BLUE.updateTime('" + td + "',{offsetMinutes:" + offsetMinutes + ",showSecs:true})" ,1000);
			else
				setInterval( "BLUE.updateTime('" + td + "',{offsetMinutes:" + offsetMinutes + ",showSecs:false})",1000*60);
		},

		showPanel : function(sUrl,configOver)
		{
            var loader = new YAHOO.util.YUILoader({ require: ["container"], loadOptional: true, base: "javascript/yui/", onSuccess: function() {

					var pid = "panel" + this.divNum;
					this.divNum = this.divNum + 1;

					var config = { close: true, visible: true, width:"400px",fixedcenter:true, modal: true, zindex: 100, constraintoviewport:true };
					if(configOver != null)
					{
						for (c in configOver)
							config[c] = configOver[c];
					}
					var p = new YAHOO.widget.Panel(pid, config);
                    p.setBody('<img src="http://us.i1.yimg.com/us.yimg.com/i/us/per/gr/gp/rel_interstitial_loading.gif" />');
					if(config.title != null)
						p.setHeader(config.title);
                    var callback =
                    {
                        display : function(html)
                        {
                            p.setBody(html);
                            elementLoad(pid);
							executeScripts(pid);
							if(config.cb != null)
								config.cb();
                        },

                        success : function(o)
                        {
                            this.display(o.responseText);
							p.center();
                        },

                        failure : function(o)
                        {
                            this.display("There has been an error communicating with the server.  We are sorry but we can not continue.  Please try again later.");
                        }
                    };
                    YAHOO.util.Connect.asyncRequest('GET', sUrl, callback, null);
                    p.render(document.body);
                }});
            loader.insert();
		},

		panelize : function(divId,title,panelWidth)
		{
			var p = null;
			if(document.getElementById(divId + '_c') == undefined) // don't allow multiple instances
			{
				var loader = new YAHOO.util.YUILoader({ require: ["container"], loadOptional: true, base: "javascript/yui/", onSuccess: function() {
						
					// default the panelWidth to 400px
					if (panelWidth == null)
						panelWidth=400;
		
					p = new YAHOO.widget.Panel(divId, { close: true, visible: true, width:""+panelWidth+"px", fixedcenter:true, modal: true, zindex: 100, constraintoviewport:true});
					
					p.setHeader(title);
					//p.hideEvent.subscribe(function() { p.destroy(); } );
					var divElm = document.getElementById(divId);
					divElm.style.display = "block";
					p.render(document.body);
					//panels[divId] = p;
		
					//	focus on the first of any subforms
					var divForms = divElm.getElementsByTagName("form");
					if (divForms.length > 0)
						divForms[0].elements[0].focus();
				}});
				loader.insert();
				return p;
			}
			else
			{
				document.getElementById(divId + '_c').style.visibility = "visible";
				document.getElementById(divId + '_mask').style.display = "block";
			}
		},

		hidePanel : function(divId)
		{
			document.getElementById(divId + '_c').style.visibility = "hidden";
			document.getElementById(divId + '_mask').style.display = "none";
		},
		
		alert : function(header,text,panelWidth)
		{
			BLUE.run("container,button,fonts,selector", function() {
			
				// default the panelWidth to 400px
				if (panelWidth == null)
					panelWidth=300;
	
				var msgBox = new YAHOO.widget.SimpleDialog("simpledialog1", 
						{ 	width: "" + panelWidth + "px",
							fixedcenter: true,
							visible: false,
							draggable: false,
							zIndex: 9999,
							close: true,
							modal: true,
							effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.5},
							constraintoviewport: true,
							buttons: [ { text:"close", handler: function(){this.hide();}, isDefault:true }],
							icon: YAHOO.widget.SimpleDialog.ICON_INFO
						});
				msgBox.setHeader(header);
				msgBox.render(document.body);
				msgBox.setBody(text);
				msgBox.show();
				
				});
		},		

		cancelPanel : function(id)
		{
			this.panels[id].hideMask();
			this.panels[id].hide();
			//this.panels[id] = null;
		},

		pad : function(n)
		{
			return pad(n);
		},

		/*  The id must be unique.  The calendar will display and ensure the population of shown or hidden form
			fields named id.day, id.month and id.year and the hidden field id.date which is in format of YYYY-mm-dd */
		showFormCal : function(divid,fieldName,config)
		{
			var loader = new YAHOO.util.YUILoader({ require: ["calendar"], loadOptional: true, base: "javascript/yui/", onSuccess: function() {
					
				if(config === undefined)
					config = { };
				
				config.navigator = true;
	
				var cal = new YAHOO.widget.Calendar("cal" + divid,divid, config);
				cal.render();
	
				var pNode = document.getElementById(divid).parentNode;
	
				if(config.showYear)
				{
					var year = document.createElement("select");
					for(var ynum=1900;ynum  < 2015; ynum++)
					{
						var opt = document.createElement("option");
						opt.value = ynum;
						opt.appendChild(document.createTextNode(ynum));
						year.appendChild(opt);
					}
					year.id = divid + ".year";
					year.name = divid + ".year";
					pNode.appendChild(document.createTextNode("Jump to Year: "));
					pNode.appendChild(document.createElement("br"));
					year.onchange = function() { cal.setYear(parseInt(this.value)); cal.render(); }
					pNode.appendChild(year);
					year.value=((new Date()).getFullYear());
				}
	
				if((config.nofields == undefined) || (!config.nofields))
				{
					var date = document.createElement("input");
					date.id = divid + ".date";
					date.name = fieldName;
					date.type="hidden";
					pNode.appendChild(date);
		
					var setDate = function(year,month,day)
					{
						var dField = year + "-" + BLUE.pad(month) + "-" + BLUE.pad(day);
						document.getElementById(divid + ".date").value=dField;
						if(config.showYear)
							document.getElementById(divid + ".year").value=year;
					}
		
					var handleCalSelect = function(type,args,obj)
					{
						var dates = args[0];
						var date = dates[0];
						var year = date[0], month = date[1], day = date[2];
						setDate(year,month,day);
					}
		
					cal.selectEvent.subscribe(handleCalSelect,cal);
		
					if(config.selected)
					{
						var date = cal.getSelectedDates()[0];
						setDate(date.getFullYear(),date.getMonth()+1,date.getDate());
					}
				}
				
				if(config.selectCallback != undefined)
				{
					cal.selectEvent.subscribe(config.selectCallback,cal);
				}
			}}); // - ends the onDOMReady encapsulation
			loader.insert();
		},

		val : function(field, valObj)
		{
			if(valObj.required)
			{
				if(field.value == "")
				{
					alert('This field is required and must be assigned a value.');
					field.focus();
				}
			}
		},

		/*
			focus on the first field in the specified form
			If no index is specified for the form, focus on the first form field.
			If the specified index is greater than the number of forms - then focus on the last form on the page.
		*/
		focusFirstFormField : function(formIndex)
		{
			var numForms = document.forms.length;
			if (formIndex == null)
				formIndex = 0;
			//alert('going to set the focus.  formIndex: ' + formIndex + ', numforms: ' + numForms);
			if (numForms > 0)
			{
				if (formIndex >= numForms)
					formIndex = numForms - 1;
				//alert('focusing on formIndex: ' + formIndex);
				document.forms[formIndex].elements[0].focus();
			}
		},

		/**  check if a form's "email" field is valid */
		testEmail : function(form,fieldName)
		{
			//alert("fieldName: " + fieldName);
			var els = form.elements;
			for (var i=0; i<els.length; ++i)
			{
				var fieldObj = form.elements[i];
				if (fieldObj.name === fieldName)
				{
					var emailValue = fieldObj.value;

					if (BLUE.isWellFormedEmailAddress(emailValue))
						return true;
					else
					{
						alert('Please enter a valid email address!');
						fieldObj.focus();
						fieldObj.select();
						return false;
					}
				}
			}
		},

		fieldAlert : function(field, msg)
		{
			var ferr = document.getElementById('ferr' + field.id);
			YAHOO.util.Dom.addClass(field,"fieldAlert");
			if(ferr != null)
			{
				ferr.style.opacity = 0;
				ferr.innerHTML = '<span class="fieldError">' + msg + '</span>';
				var a = new YAHOO.util.Anim(ferr, { opacity: { from: 0, to:1 }});
				a.animate();
			}
		},
		
		fieldInfo : function(field, msg)
		{
			var ferr = document.getElementById('ferr' + field.id);
			if(ferr != null)
			{
				ferr.style.opacity = 0;
				ferr.innerHTML = '<span class="fieldInfo">' + msg + '</span>';
				var a = new YAHOO.util.Anim(ferr, { opacity: { from: 0, to:1 }});
				a.animate();
			}
		},
		
		clearFieldAlert : function(field, msg)
		{
			YAHOO.util.Dom.removeClass(field,"fieldAlert");
			var ferr = document.getElementById('ferr' + field.id);
			if(ferr != null)
				ferr.innerHTML = "";
		},
		
		addFormValidation : function(formId,fStruct)
		{
			function checkField(e,f) 
			{
				var ff = document.getElementById(f.id);
				// note - these strings largely must match those in DataFieldException
				if((f.required) && (ff.value.length == 0))
				{
					BLUE.fieldAlert(ff,"This field is required.  Please enter a value.");
					return;
				}
				else
				if((f.minLength > 0) && (ff.value.length < f.minLength))
				{
					BLUE.fieldAlert(ff,"Entry is too short - must have length of at least " + f.minLength + " characters.");
					return;
				}
				else
				if((f.maxLength > 0) && (ff.value.length > f.maxLength))
				{
					BLUE.fieldAlert(ff,"Entry is too long - must not have length greater than " + f.maxLength + " characters.");
					return;
				}
				else
				if((f.regex != undefined) && (!((new RegExp(f.regex)).test(ff.value))))
				{
					if(f.regexErrMsg != undefined)
						BLUE.fieldAlert(ff,f.regexErrMsg);
					else
						BLUE.fieldAlert(ff,"This field is not in the proper format.  Please re-enter.");
					return;
				}
				else
				if((f.ftype == 'integer') && (!(/^-?[0-9]*$/.test(ff.value))))
				{
					BLUE.fieldAlert(ff,"Entry must be a whole number.");
					return;
				}
				else
				if((f.minValue != undefined) && (parseInt(ff.value) < parseInt(f.minValue)))
				{
					BLUE.fieldAlert(ff,"Entry must be greater or equal to " + f.minValue + ".");
					return;
				}
				else
				if((f.maxValue != undefined) && (parseInt(ff.value) > parseInt(f.maxValue)))
				{
					BLUE.fieldAlert(ff,"Entry must be less than or equal to " + f.maxValue + ".");
					return;
				}

				if(f.vjs != undefined)
				{
					if(!f.vjs(f,ff))
						return;
				}

				BLUE.clearFieldAlert(ff);
				
				if(f.vserv != undefined)
					BLUE.requestJSON("services.js?name=" + f.vserv + "&value=" + ff.value, function(res) { if(res.status != "OK") BLUE.fieldAlert(ff,res.statusMsg); });
			}
			
			function focusField(e,f) 
			{
				var ff = document.getElementById(f.id);
				if(f.description != undefined)
					BLUE.fieldInfo(ff,f.description);
			}
			
			if(fStruct.length > 0)
			{
				BLUE.run("event,dom,animation",function() {
					for(var i=1; i < fStruct.length ; i++)
					{
						var f = fStruct[i];
						if(f.c == 'ferr')
							BLUE.fieldAlert(document.getElementById(f.id),f.msg);
						else
						{
							YAHOO.util.Event.addListener(f.id, "blur", checkField , f);
							YAHOO.util.Event.addListener(f.id, "focus", focusField , f);
						}
					}
				});
			}
			
			//var sf = new function() { alert('submission on form ' + formId); };
			//YAHOO.util.Event.addListener(formId, "submit", sf );
		},
		
		requestJSON : function(url,func,errFunc)
		{
			BLUE.run("connection", function() {
				var responseSuccess = function(o) 
				{
					var jsonRaw = o.responseText;
					var jsonEval = eval("(" + jsonRaw + ")");
					if(func != undefined)
						func(jsonEval);
					else
						return jsonEval;
				};
				
				var responseFailure = function(o) 
				{
					if(errFunc == undefined)
						alert('Unable to connect to process request.');
					else
						errFunc(o);
				}
						
				var callback = { success : responseSuccess, failure : responseFailure};
					
				var transaction = YAHOO.util.Connect.asyncRequest('GET', url, callback, null);
			});
		},
	
		debug : function(a,msg,tagtree)
		{
			var dd = document.getElementById('debugdiv');
			dd.innerHTML = msg + "<br/>" + tagtree;
			dd.style.display="block";
		},
		
		undebug : function(a)
		{
			var dd = document.getElementById('debugdiv');
			dd.style.display="none";
		},
		
		pageLoaded : function()
		{
			enableRichTextInt(document);
		},
		
		run : function(modules,func)
		{
			var loader = new YAHOO.util.YUILoader({ require: modules.split(","), loadOptional: true, base: "javascript/yui/", onSuccess: func});
			loader.insert();			
		},
		
		/* Loads a javascript file asynchronously, and calls the passed function when done.  */
		loadjs : function(name,func)
		{
			if(this.loadedjs[name] == 'loaded')
			{
				func();
				return;
			}
			
			this.loadedjs[name] = func;
			
			var s = document.createElement("script");
			s.src = name;
			document.getElementsByTagName("head")[0].appendChild(s);
		},
			
		loaded : function(name)
		{
			var f = this.loadedjs[name];
			this.loadedjs[name] = "loaded";
			if(this.loadedjs[name] != undefined)
				f();
		},

		enableRichText : function(divElm,xconfig)
		{
			enableRichTextInt(divElm,xconfig);
		},

		runOnMouseLeaves : function(el,f)
		{
			BLUE.run("dom", function() {
					var elem = YAHOO.util.Dom.get(el);
					elem.onmouseout = function(e) {
						var r = YAHOO.util.Region.getRegion(elem);
						var p = new YAHOO.util.Point(e.pageX,e.pageY);
						if(!r.contains(p)) f();
					};
				});
		}
	};

	return methods;
}();

