Element.addMethods({
	absolutize: function(element) {
		element = $(element);
		if (element.getStyle('position') == 'absolute') return;
	
		var offsets = element.positionedOffset();
		var top     = offsets[1];
		var left    = offsets[0];
		var width   = element.clientWidth;
		var height  = element.clientHeight;
	
		element._originalLeft   = left - parseFloat(element.style.left  || 0);
		element._originalTop    = top  - parseFloat(element.style.top || 0);
		element._originalWidth  = element.style.width;
		element._originalHeight = element.style.height;
	
		element.style.position = 'absolute';
		element.style.top    = top + 'px';
		element.style.left   = left + 'px';
		element.style.width  = width + 'px';
		element.style.height = height + 'px';
		Globals.Absolutized.push(element.id);
		return element;
	},
	relativize: function(element) {
		element = $(element);
		if (element.getStyle('position') == 'relative') return;
		
		element.style.position = 'relative';
		var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
		var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
		
		element.style.top    = top + 'px';
		element.style.left   = left + 'px';
		element.style.height = element._originalHeight;
		element.style.width  = element._originalWidth;
		Globals.Relativized.push(element.id);
		return element;
	}
});
var base_zIndex = 0;
if(YAHOO.util.DD) {
	YAHOO.DDRegion = function(id, sGroup, config) {
		this.cont = config.cont;
		YAHOO.DDRegion.superclass.constructor.apply(this, arguments);
	};
	
	YAHOO.extend(YAHOO.DDRegion, YAHOO.util.DD, {
		cont: null,
		regionXY: null,
		init: function() {
			YAHOO.DDRegion.superclass.init.apply(this, arguments);
			this.initConstraints();
		},
		initConstraints: function(obj) {
			if(obj) {
				var region = YAHOO.util.YAHOO.util.Dom.getRegion(obj.cont);
				var el = obj.getEl();
				var regionXY = YAHOO.util.YAHOO.util.Dom.getXY(obj.cont);
				var xy = YAHOO.util.YAHOO.util.Dom.getXY(el);
				var width = parseInt(YAHOO.util.YAHOO.util.Dom.getStyle(el, 'width'), 10);
				var height = parseInt(YAHOO.util.YAHOO.util.Dom.getStyle(el, 'height'), 10);
				var left = 0;
				var right = (region.right-region.left) - width;
				var top = 0;
				var bottom = (region.bottom - region.top) - height; 
	
				obj.setXConstraint(left, right);
				obj.setYConstraint(top, bottom);
			} else {
				var region = YAHOO.util.YAHOO.util.Dom.getRegion(this.cont);
				var el = this.getEl();
				var xy = YAHOO.util.YAHOO.util.Dom.getXY(el);
				var width = parseInt(YAHOO.util.YAHOO.util.Dom.getStyle(el, 'width'), 10);
				var height = parseInt(YAHOO.util.YAHOO.util.Dom.getStyle(el, 'height'), 10);
				var left = xy[0] - region.left;
				var right = region.right - xy[0] - width;
				var top = xy[1] - region.top;
				var bottom = region.bottom - xy[1] - height;
	
				this.setXConstraint(left, right);
				this.setYConstraint(top, bottom);
			}
		},
		repositionTagger: function(obj) {
			var region = YAHOO.util.YAHOO.util.Dom.getRegion(obj.cont);
			var el = obj.getEl();
			var regionXY = YAHOO.util.YAHOO.util.Dom.getXY(obj.cont);
			var xy = YAHOO.util.Dom.getXY(el);
			YAHOO.util.Dom.setXY(el, regionXY);
		}
	});
	
	YAHOO.DDPlayer = function(id, sGroup, config, startSlot) {
		this.cont = config.cont;
		YAHOO.DDPlayer.superclass.constructor.apply(this, arguments);
		this.initPlayer(id, sGroup, config, startSlot);
	};
	
	YAHOO.extend(YAHOO.DDPlayer, YAHOO.util.DDProxy, {
		TYPE: "DDPlayer",
		initPlayer: function(id, sGroup, config, startSlot) {
	
			if (!id) { 
				return; 
			}
	
			var el = this.getDragEl()
			YAHOO.util.YAHOO.util.Dom.setStyle(el, "borderColor", "transparent");
			YAHOO.util.YAHOO.util.Dom.setStyle(el, "opacity", 0.76);
	
			this.isTarget = false;
			this.originalStyles = [];
			this.type = YAHOO.DDPlayer.TYPE;
			this.slot = startSlot;
			this.slot.player = this;
			this.startPos = YAHOO.util.YAHOO.util.Dom.getXY( this.getEl() );
			
			if(config.cont !== null) {
				YAHOO.util.Event.on(window, 'resize', function() {
					this.initConstraints();
				}, this, true);
				
				this.initConstraints();
			}
		},
		initConstraints: function() {
			var region = YAHOO.util.Dom.getRegion(this.cont);
			var el = this.getEl();
			var xy = YAHOO.util.Dom.getXY(el);
			var width = parseInt(YAHOO.util.Dom.getStyle(el, 'width'), 10);
			var height = parseInt(YAHOO.util.Dom.getStyle(el, 'height'), 10);
			var left = xy[0] - region.left;
			var right = region.right - xy[0] - width;
			var top = xy[1] - region.top;
			var bottom = region.bottom - xy[1] - height;
	
			this.setXConstraint(left, right);
			this.setYConstraint(top, bottom);
		},
		startDrag: function(x, y) {
			var dragEl = this.getDragEl();
			var clickEl = this.getEl();
	
			dragEl.innerHTML = clickEl.innerHTML;
			dragEl.className = clickEl.className;
	
			YAHOO.util.Dom.setStyle(dragEl, "color",  YAHOO.util.Dom.getStyle(clickEl, "color"));
			YAHOO.util.Dom.setStyle(dragEl, "backgroundColor", YAHOO.util.Dom.getStyle(clickEl, "backgroundColor"));
			YAHOO.util.Dom.setStyle(clickEl, "opacity", 0.1);
	
			var targets = YAHOO.util.YAHOO.util.DragDropMgr.getRelated(this, true);
	
			for (var i=0; i<targets.length; i++) {
				var targetEl = this.getTargetDomRef(targets[i]);
	
				if (!this.originalStyles[targetEl.id]) {
					this.originalStyles[targetEl.id] = targetEl.className;
				}
	
				targetEl.className = "target";
			}
		},
		getTargetDomRef: function(oDD) {
			if (oDD.player) {
				return oDD.player.getEl();
			} else {
				return oDD.getEl();
			}
		},
		endDrag: function(e) {
			var targets = YAHOO.util.YAHOO.util.DragDropMgr.getRelated(this, true);
	
			for (var i=0; i<targets.length; i++) {
							
				var targetEl = this.getTargetDomRef(targets[i]);
	
				if (!this.originalStyles[targetEl.id]) {
					this.originalStyles[targetEl.id] = "";//targetEl.className;
				}
				
				$(targetEl.id).removeClassName("target");
				Globals.Relativize(targets[i].id);
			}
			
			YAHOO.util.YAHOO.util.Dom.setStyle(this.getEl(), "opacity", 1);
			
			this.resetTargets();
		},
		resetTargets: function() {
			var targets = YAHOO.util.YAHOO.util.DragDropMgr.getRelated(this, true);
			for (var i=0; i<targets.length; i++) {
				var targetEl = this.getTargetDomRef(targets[i]);
				var oldStyle = this.originalStyles[targetEl.id];
				if (oldStyle) {
					targetEl.className = oldStyle;
				}
			}
		},
	
		onDragDrop: function(e, id) {
			var oDD;
			
			if ("string" == typeof id) {
				oDD = YAHOO.util.YAHOO.util.DragDropMgr.getDDById(id);
			} else {
				oDD = YAHOO.util.YAHOO.util.DragDropMgr.getBestMatch(id);
			}
	
			var el = this.getEl();
					
			if (oDD.player) {
				if (this.slot) {
					if ( YAHOO.util.YAHOO.util.DragDropMgr.isLegalTarget(oDD.player, this.slot) ) {
						YAHOO.util.YAHOO.util.DragDropMgr.moveToEl(oDD.player.getEl(), el);
						this.slot.player = oDD.player;
						oDD.player.slot = this.slot;
					} else {
						YAHOO.util.YAHOO.util.Dom.setXY(oDD.player.getEl(), oDD.player.startPos);
						this.slot.player = null;
						oDD.player.slot = null
					}
				} else {
					oDD.player.slot = null;
					YAHOO.util.YAHOO.util.DragDropMgr.moveToEl(oDD.player.getEl(), el);
				}
			} else {
				if (this.slot) {
					this.slot.player = null;
				}
			}
	
			YAHOO.util.YAHOO.util.DragDropMgr.moveToEl(el, oDD.getEl());
			this.resetTargets();
	
			this.slot = oDD;
			this.slot.player = this;
		},
		swap: function(el1, el2) {
			var pos1 = YAHOO.util.Dom.getXY(el1);
			var pos2 = YAHOO.util.Dom.getXY(el2);
			YAHOO.util.Dom.setXY(el1, pos2);
			YAHOO.util.Dom.setXY(el2, pos1);
		},
		onDragOver: function(e, id) {
		},
	
		onDrag: function(e, id) {
		}
	});
	
	YAHOO.util.DDOnTop = function(id, num) {
		YAHOO.util.DDOnTop.superclass.constructor.apply(this, arguments);
	};
	
	YAHOO.extend(YAHOO.util.DDOnTop, YAHOO.util.DD, {
		startDrag: function(x, y) {
			var style = this.getEl().style;
			style.zIndex = this.zIndex+1;
		},
		endDrag: function(e) {
		}
	});
}
if(YAHOO.widget.Panel) {
	YAHOO.Lightbox = function(conf){
		this.conf = conf == null ? {} : conf;
		this._init();
		this._initLoader();
		this._initLightbox();
	};
	
	YAHOO.Lightbox.prototype._init = function(){
		YAHOO.util.Dom.addClass(document.body, 'yui-skin-sam');
	};
	
	YAHOO.Lightbox.prototype._loadData = function(){
		var r = this.conf.dataSource;
	
		for(var i in r){
			var onImgClick = function(e, o){
				var onImageLoad = function(e, o){
					o.self.lightboxLoader.hide();
					while(o.self._resizeBtnCon.firstChild){
						o.self._resizeBtnCon.removeChild(o.self._resizeBtnCon.firstChild);
					}
					YAHOO.util.Event.purgeElement(o.self.showImgPanel.header, false, 'dblclick');
					o.self.conf.dataSource[o.imgId].width = o.image.width;
					o.self.conf.dataSource[o.imgId].height = o.image.height;
					var imageWidth = o.self.conf.dataSource[o.imgId].width;
					var imageHeight = o.self.conf.dataSource[o.imgId].height;
					var viewPortWidth = YAHOO.util.Dom.getViewportWidth() - 50;
					var viewPortHeight = YAHOO.util.Dom.getViewportHeight() - 70;
	
					if(imageWidth > 250 && imageHeight > 250 &&
					(imageWidth > viewPortWidth || imageHeight > viewPortHeight)){
						var onBtnMaximumClick = function(e, o){
							o.image.width = o.self.conf.dataSource[o.imgId].width;
							o.image.height = o.self.conf.dataSource[o.imgId].height;
							o.self.showImgPanel.cfg.setProperty('width', 
							(parseInt(o.self.conf.dataSource[o.imgId].width) + 20)+ 'px');
							o.self.showImgPanel.cfg.setProperty('x', 5);
							o.self._setResizeButton('restore');
							o.self.showImgPanel.showState = 'maximum';
						};
						YAHOO.util.Event.on(o.self._btnMaximum, 'click', onBtnMaximumClick, o);
	
						var onBtnRestoreClick = function(e, o){
							o.self._setResizeButton('maximum');
							o.self._autoFit(o.image, o.imgId);
							o.self.showImgPanel.showState = 'restore';
						};
						YAHOO.util.Event.on(o.self._btnRestore, 'click', onBtnRestoreClick, o);
	
						var showImgPanelHeaderDblClickHandler = function(e, o){
							if(o.self.showImgPanel.showState == 'maximum'){
								o.onBtnRestoreClick('dblclick', o);
							}else{
								o.onBtnMaximumClick('dblclick', o);
							}
						};
						YAHOO.util.Event.on(o.self.showImgPanel.header, 'dblclick',
						showImgPanelHeaderDblClickHandler,
						{
							self: o.self,
							image: o.image,
							imgId: o.imgId,
							onBtnMaximumClick: onBtnMaximumClick,
							onBtnRestoreClick: onBtnRestoreClick
						});
						o.self.showImgPanel.showState = 'restore';
						o.self._setResizeButton('maximum');
					}
	
					var title;
					if(o.self.conf.dataSource[o.imgId].title == null || 
					o.self.conf.dataSource[o.imgId].title.length == 0){
						title = '&nbsp;';
					}else{
						title = o.self.conf.dataSource[o.imgId].title;
					}
					o.self.showImgPanel.setHeader(title);
					o.self.showImgPanel.show();
					o.self._autoFit(o.image);
				};
				while(o.self._imgHolder.firstChild){
					o.self._imgHolder.removeChild(o.self._imgHolder.firstChild);
				}
				var image = document.createElement('img');
				o.self._imgHolder.appendChild(image);
				YAHOO.util.Event.on(image, 'load', onImageLoad, {self:o.self, image: image, imgId: o.imgId});
				o.self.lightboxLoader.show();
				image.src = r[o.imgId].url;
	
			};
			var imgSmall = YAHOO.util.Dom.get(i);
			YAHOO.util.Event.on(imgSmall, 'click', onImgClick, {self: this, imgId: i});
			YAHOO.util.Dom.setStyle(imgSmall, 'cursor', 'pointer');
		}
	};
	
	YAHOO.Lightbox.prototype._autoFit = function(image){
		var iw = image.width ;
		var ih = image.height;
		var vw = YAHOO.util.Dom.getViewportWidth() - 50;
		var vh = YAHOO.util.Dom.getViewportHeight() - 70;
		if(iw >= 250 || ih >= 250){
			if(iw > vw || ih > vh){
				var ratioi = iw/ih;
				var ratiow = vw/vh;
				if(ratioi <= ratiow){
					image.height = vh;
					image.width = iw * (vh / ih);
				}else{
					image.width = vw;
					image.height = ih * (vw / iw);
				}
			}
			this.showImgPanel.cfg.setProperty('width', (image.width + 20)  + 'px');
		}else{
			this.showImgPanel.cfg.setProperty('width', '250px');
		}
		this.showImgPanel.center();
	};
	
	YAHOO.Lightbox.prototype._initLoader = function(){
		var lightboxLoader = new YAHOO.widget.Panel('tcc_lightboxLoader',{
			width:"240px",
			fixedcenter:true,
			close:false,
			draggable:false,
			modal:true,
			visible:false
		});
		lightboxLoader.setHeader("Loading, please wait...");
		var progressBar = document.createElement('img');
		progressBar.src = this.conf.imageBase + '/progressBar.gif';
		lightboxLoader.setBody(progressBar);
		lightboxLoader.render(document.body);
	
		this.lightboxLoader = lightboxLoader;
	};
	
	YAHOO.Lightbox.prototype._initLightbox = function(){
		var showImgPanel = new YAHOO.widget.Panel('tcc_showImgPanel', {
			width: '400px',
			visible : false,
			draggable:true,
			modal:true,
			fixedcenter:true
		});
		
		var imgHolder = document.createElement('div');
		imgHolder.id = 'tcc_showImgPanelImgHolder';
		YAHOO.util.Dom.setStyle(imgHolder, 'text-align', 'center');
		showImgPanel.setBody(imgHolder);
		showImgPanel.setHeader('&nbsp;');
		showImgPanel.render(document.body);
		var showImgPanelCloseHandler = function(e, o){
			o.hide();
		};
		
		var showImgPanelMoveHandler = function(e, o){
			this.sizeMask();
		};
		showImgPanel.moveEvent.subscribe(showImgPanelMoveHandler);
	
		var showImgPanelElem = YAHOO.util.Dom.get('tcc_showImgPanel');
		var resizeBtnCon = document.createElement('div');
		resizeBtnCon.id = 'tcc_showImgPanelResizeBtnCon';
		YAHOO.util.Dom.setStyle(resizeBtnCon, 'position', 'absolute');
		YAHOO.util.Dom.setStyle(resizeBtnCon, 'right', '35px');
		YAHOO.util.Dom.setStyle(resizeBtnCon, 'top', '5px');
	
		showImgPanelElem.appendChild(resizeBtnCon);
	
		var btnMaximum = document.createElement('img');
		btnMaximum.src = this.conf.imageBase + '/maximum.gif';
	
		var btnRestore = document.createElement('img');
		btnRestore.src = this.conf.imageBase + '/restore.gif';
	
		this._resizeBtnCon = resizeBtnCon;
		this._btnRestore = btnRestore;
		this._btnMaximum = btnMaximum;
		this._imgHolder = imgHolder;
		this.showImgPanel = showImgPanel;
	};
	
	YAHOO.Lightbox.prototype._setResizeButton = function(type){
		while(this._resizeBtnCon.firstChild){
			this._resizeBtnCon.removeChild(this._resizeBtnCon.firstChild);
		}
		if(type == 'maximum'){
			this._resizeBtnCon.appendChild(this._btnMaximum);
		}else{
			this._resizeBtnCon.appendChild(this._btnRestore);
		}
	};
}
function Alert(messageBody,title,showCloseButton,AlertHeight,AlertWidth,closeOnModalClick,shadowThickness,shadowOpacity,modalOpacity,refForContainerID) {
	if(!title) var title = "Warning";
	if(!AlertWidth) var AlertWidth = 400;
	if(!AlertHeight) var AlertHeight = 200;
	if(!shadowThickness) var shadowThickness = 5;
	if(!shadowOpacity) var shadowOpacity = 0.5;
	if(!modalOpacity) var modalOpacity = 0.6;
	if(!closeOnModalClick) var closeOnModalClick = false;
	
	var viewport = [
		top.YAHOO.util.YAHOO.util.Dom.getDocumentWidth(),
		top.YAHOO.util.YAHOO.util.Dom.getDocumentHeight()
	];
	
	if(!$("AlertModalBackground")) {
		var modalBackground = top.document.createElement('div');
		modalBackground.id = "AlertModalBackground";
		if(closeOnModalClick) modalBackground.onclick = clearModalAlert;
		modalBackground.style.position = "absolute";
		modalBackground.style.top = "0";
		modalBackground.style.left = "0";
		modalBackground.style.width = viewport[0] + "px";
		modalBackground.style.height = viewport[1] + "px";
		modalBackground.style.zIndex = 50;
		top.YAHOO.util.YAHOO.util.Dom.setStyle(modalBackground, 'opacity', modalOpacity);
	}
		
	var modalContainer = top.document.createElement('div');
	modalContainer.id = "AlertModalContainer"+Globals.RandomName(3);
	modalContainer.style.position = "absolute";
	modalContainer.style.width = AlertWidth + "px";


	modalContainer.style.height = AlertHeight + "px";
	modalContainer.style.zIndex = modalBackground.style.zIndex+1;
	if(Globals.Alerts > 0) {
		modalContainer.style.top = (viewport[1]/2 - AlertHeight/2) + 5 + "px";
		modalContainer.style.left = (viewport[0]/2 - AlertWidth/2) + 5 + "px";
	} else {
		modalContainer.style.top = (viewport[1]/2 - AlertHeight/2) + "px";
		modalContainer.style.left = (viewport[0]/2 - AlertWidth/2) + "px";
	}
	modalContainer.className = "AlertModalContainer";
	
	if(refForContainerID != null) {
		refForContainerID.LoadingContainerID = modalContainer.id;
	}
	
	var shadowBottom = top.document.createElement('div');
	shadowBottom.className = "modalShadow";
		shadowBottom.style.bottom = "-" + shadowThickness + "px";
		shadowBottom.style.left = shadowThickness + "px";
	shadowBottom.style.width = AlertWidth - shadowThickness + "px";
	shadowBottom.style.height = shadowThickness + "px";
	shadowBottom.style.backgroundColor = "#000";
	top.YAHOO.util.YAHOO.util.Dom.setStyle(shadowBottom, 'opacity', shadowOpacity);
	
	var shadowRight = top.document.createElement('div');
	shadowRight.className = "modalShadow";
		shadowRight.style.top = shadowThickness + "px";
		shadowRight.style.right = "-" + shadowThickness + "px";
	shadowRight.style.width = shadowThickness + "px";
	shadowRight.style.height = AlertHeight - shadowThickness + "px";
	shadowRight.style.backgroundColor = "#000";
	top.YAHOO.util.YAHOO.util.Dom.setStyle(shadowRight, 'opacity', shadowOpacity);
	
	var shadowBottomRight = top.document.createElement('div');
	shadowBottomRight.className = "modalShadow";
		shadowBottomRight.style.right = "-" + shadowThickness + "px";
		shadowBottomRight.style.bottom = "-" + shadowThickness + "px";
	shadowBottomRight.style.width = shadowThickness + "px";
	shadowBottomRight.style.height = shadowThickness + "px";
	shadowBottomRight.style.backgroundColor = "#000";
	top.YAHOO.util.YAHOO.util.Dom.setStyle(shadowBottomRight, 'opacity', shadowOpacity);
	
	var shadowBottomLeft = top.document.createElement('div');
	shadowBottomLeft.className = "modalShadow";
	shadowBottomLeft.style.left = "0";
	shadowBottomLeft.style.bottom = "-" + shadowThickness + "px";
	shadowBottomLeft.style.width = shadowThickness + "px";
	shadowBottomLeft.style.height = shadowThickness + "px";
	shadowBottomLeft.style.backgroundColor = "#000";
	top.YAHOO.util.YAHOO.util.Dom.setStyle(shadowBottomLeft, 'opacity', shadowOpacity);
	
	var shadowTopRight = top.document.createElement('div');
	shadowTopRight.className = "modalShadow";
	shadowTopRight.style.right = "-" + shadowThickness + "px";
	shadowTopRight.style.top = "0";
	shadowTopRight.style.width = shadowThickness + "px";
	shadowTopRight.style.height = shadowThickness + "px";
	shadowTopRight.style.backgroundColor = "#000";
	top.YAHOO.util.YAHOO.util.Dom.setStyle(shadowTopRight, 'opacity', shadowOpacity);

	var headerContainer = top.document.createElement('div');
	headerContainer.className = "modalHeader";
	headerContainer.style.width = AlertWidth + "px";
	var headerContents = top.document.createTextNode(title);
	
	var alertBody = top.document.createElement('div');
	alertBody.className = "modalBody";
	alertBody.innerHTML = messageBody;
	
	var okButton = top.document.createElement('input');
	okButton.id = "okButon"+Globals.RandomName(3);
	okButton.setAttribute("type","button");
	okButton.setAttribute("value","OK");
	okButton.className = "modalInputButton";

	if(!$("AlertModalBackground")) {
		top.document.body.appendChild(modalBackground);
	}
	top.document.body.appendChild(modalContainer);
	modalContainer.appendChild(shadowBottom);
	modalContainer.appendChild(shadowRight);
	modalContainer.appendChild(shadowBottomRight);
	modalContainer.appendChild(headerContainer);
	modalContainer.appendChild(okButton);
	if(!showCloseButton)
		hide(okButton);
		
	headerContainer.appendChild(headerContents);
	modalContainer.appendChild(alertBody);
	YAHOO.util.YAHOO.util.Event.addListener(okButton.id,"click",function() { clearAlertBoxWrapper(modalContainer.id); });
	Globals.Alerts = Globals.Alerts+1;
	var dd = new YAHOO.util.DDOnTop(modalContainer.id);
}

function clearModalAlert(elmId) {
	$(elmId).remove();
	Globals.Alerts--;
	if(Globals.Alerts == 0) {
		$('AlertModalBackground').remove();
	}
}

function clearAlertBoxWrapper(containerID) {	
	clearModalAlert(containerID);
}
var Base = Class.create({
	initialize: function() {
	},
	id: null,
	state: null,
	content: null,
	display: true,
	render: function() {
	if(this.state == Globals.States.Loaded) {
			if(!this.display) { this.show(); }
			if(this.content != null && $(this.id) != null) $(this.id).innerHTML = this.content;
		}
	},
	remove: function() {
		if($(this.id) != null) $(this.id).remove();
	},
	removeContent: function() {
		if($(this.id) != null) $(this.id).innerHTML = '';
	},
	removeLoad: function() {
		if(this.state == Globals.States.Loading) {
			$(this.id).innerHTML = '';
		}
	},
	_delete: function() {
		if(this.state == Globals.States.Loading) {
			this.removeLoad();
		}
		if($(this.id)) {
			this.remove();
		}
	},
	setLoad: function() {
		if($(this.id) != null) {
			setLoading(this.id,'1');
			this.state = Globals.States.Loading;
		}
	},
	setPageLoad: function(title, message, closeable) {
		Globals.Alert(message, title, closeable);
	},
	hide: function() {
		if($(this.id) != null && this.display == true) {
			$(this.id).hide();
			this.display = false;
		}
	},
	show: function() {
		if($(this.id) != null && this.display == false) {
			$(this.id).show();
			this.display = true;
		}
	},
	style: function (style) {
		if($(this.id) != null) $(this.id).setStyle(style);
	}	
});
var Container = Object.extend(new Base(), {
	initialize: function(idx,parentx,contentx,stylex,classnamex,displayx) {
		(!idx) ? this.id =  Globals.RandonName(8) : this.id = idx;
		(!parentx) ? this.parent = $('body') : this.parent = parentx;
		(!contentx) ? this.content = '&nbsp;' : this.content = contentx;
		(classnamex) ? this.cssClass = classnamex : this.cssClass = '';
		(displayx) ? this.show() : this.hide();
		if(stylex) {
			this.style(stylex);
		}
	},
	cssClass: null,
	parent: null,
	loadingStyle: 1
});
var AjaxU = Class.create({
	initialize: function(target, loading) {
		this.targetArea = target;
		this.showLoading = loading;
		this.loadingContainer = null;
		this.cancel = false;
	},	
	start:function(state, args){
		if(args[1][0].showLoading) {
			args[1][0].loadingContainer = Globals.setLoading(args[1][0].targetArea,1, false);
		}
	},
	complete:function(state, args){
		Globals.timeOut(Globals.removeLoading, args[1][0], 5000);
		Globals.timeOut(Globals.replaceHTML, [args[1][0].targetArea,args[0].conn.responseText],6000);
	},
	success:function(state, args){
	},
	failure:function(state, args){
	},
	abort:function(state, args){
	},
	handleSuccess: function(state, args){
	},
	handleFailure: function(state, args){
	},
	connect: function(method, sUrl, callback, postData) {
		if(!this.cancel) {
			YAHOO.util.Connect.asyncRequest(method, sUrl, callback, postData);
		} else {
			this.abort();	
		}
	}
});
var CallBack = function(obj) {
	this.callback = {
		//success:obj.handleSuccess,
		//failure:obj.handleFailure,
		customevents:{
			onStart:obj.start,
			onComplete:obj.complete,
			onSuccess:obj.success,
			onFailure:obj.failure,
			onAbort:obj.abort
		},
		argument:[obj]
	}
};
var YUItoggle = Class.create({
	initialize: function(ele, objref, callbackx) {
		this.element = ele;
		this.objRef = objref;
		this.durration = 0.5;
		this.currentHeight = parseInt(($(this.element).getStyle('height')) ? $(this.element).getStyle('height') : $(ele).offsetHeight);
		this.callback = {ToggleUp: null, ToggleDown: null};
		this.callback.ToggleUp = new YAHOO.util.CustomEvent("ToggleUp");
		this.callback.ToggleDown = new YAHOO.util.CustomEvent("ToggleDown");
		this.callback.ToggleUp.subscribe(callbackx.up);
		this.callback.ToggleDown.subscribe(callbackx.down);
	},
	addtoggleUp: function() {
		YAHOO.util.Event.removeListener(this.objRef, "click");
		YAHOO.util.Event.addListener(this.objRef, "click", this.toggleUp, this);
	},
	addtoggleDown: function() {
		YAHOO.util.Event.removeListener(this.objRef, "click");
		YAHOO.util.Event.addListener(this.objRef, "click", this.toggleDown, this);
	},
	toggleUp: function(e, obj) {
		for(var i=0;i<Globals.Absolutized.length;i++) {
			if($(Globals.Absolutized[i]) !== null) {
				if($(Globals.Absolutized[i]).descendantOf(obj.element)) {
					Globals.Relativize(Globals.Absolutized[i]);
					Globals.Relativized.push(Globals.Absolutized[i]);
				}
			}
		}
		
		$(obj.element).setStyle({overflow:"hidden"});

		var children = $(obj.element).childElements();

		var anim = new YAHOO.util.Anim(obj.element, {height:{to:0}, opacity:{to:0}}, obj.durration, YAHOO.util.Easing.easeOut);
		anim.animate();
		
		obj.addtoggleDown();
		obj.callback.ToggleUp.fire(obj.objRef, "up");
	},
	toggleDown: function(e, obj) {
		for(var i=0;i<Globals.Relativized.length; i++) {
			if($(Globals.Relativized[i]) !== null) {
				if($(Globals.Relativized[i]).descendantOf(obj.element)) {
					Globals.Absolutize(Globals.Relativized[i], true, 500);
					Globals.Absolutized.push(Globals.Relativized[i]);
				}
			}
		}
		var anim = new YAHOO.util.Anim(obj.element, {height:{to:obj.currentHeight}, opacity:{to:1}}, obj.durration, YAHOO.util.Easing.easeOut);
		
		anim.onComplete.subscribe(function() { $(obj.element).setStyle({overflow:""});} );
		
		anim.animate();
		Globals.timeOut(function() { $(obj.element).setStyle({height: "auto"}); }, null, 1000);
		obj.addtoggleUp();
		obj.callback.ToggleDown.fire(obj.objRef, "down");
	}
});
var ImageMap = Class.create({
	initialize: function(img, coords, container, region) { 
		this.ImgHash = img;
		this.Coords = coords;
		this.imgContainer = (YAHOO.lang.isObject(container)) ? container : $(container);
		this.region = (region) ? $(region) : this.imgContainer;
		this.createTagDivs();
		this.show = null;
		this.hide = null;
		
		return;
	},
	createTagDivs: function() {
		for(var i=0;i<this.Coords.length; i++) {
			var coordsArray = this.Coords[i].coords.split(",");
			var regionXY = YAHOO.util.Dom.getXY(this.region);
			
			var leftPx = Math.round(parseInt(regionXY[0])+parseInt(coordsArray[0]))+"px";
			var topPx = Math.round(parseInt(regionXY[1])+parseInt(coordsArray[1]))+"px";
			var widthPX = Math.round(coordsArray[2])+"px";
			var heightPX = Math.round(coordsArray[3])+"px";
			
			var div = document.createElement("DIV");
				div.id = this.ImgHash+"_"+i;
				div.style.position = 'absolute';
				div.style.zIndex = 10;
				div.style.top = topPx;
				div.style.left =  leftPx;
				div.style.width =  widthPX;
				div.style.height = heightPX;
				div.style.cursor = 'pointer';
				div.style.border = '1px solid #000000';
				
			var innerDiv = document.createElement("DIV");
				innerDiv.id = div.id+"_inner";
				innerDiv.style.height = heightPX;
				innerDiv.style.border = '1px solid #ffffff';
				innerDiv.style.backgroundColor = "#efefef";
				
			var tagDiv = document.createElement("DIV");
				tagDiv.id = div.id+"_tag";
		
				tagDiv.style.textAlign = "left";
				tagDiv.style.backgroundColor = "#E6EE8F";
				tagDiv.style.border = '1px solid #000';
				tagDiv.style.color = "#000";		
				tagDiv.style.margin = "0 auto";
				tagDiv.style.fontFamily = "verdana";
				tagDiv.style.fontSize = "11px";
				tagDiv.style.position = "absolute";
				tagDiv.style.width = widthPX;
				tagDiv.style.top = heightPX;
				tagDiv.style.left = "-1px";
				tagDiv.style.padding = '5px';
				
				tagDiv.innerHTML = this.Coords[i].tagText;
				
				if(this.Coords[i].Friends != "") {
					tagDiv.innerHTML += "<br />Friends: "+this.Coords[i].Friends;
				}
				
				div.appendChild(tagDiv);		
				div.appendChild(innerDiv);
			
				this.imgContainer.appendChild(div);
				
			YAHOO.util.YAHOO.util.Dom.setStyle(div.id, 'opacity',0); 
			
			YAHOO.util.YAHOO.util.Event.addListener(div.id, 'mouseover',this.showTag, this);
			YAHOO.util.YAHOO.util.Event.addListener(div.id, 'mouseout', this.hideTag, this);
			YAHOO.util.Event.addListener(window, 'resize',	function() { reCalcTagLoction(div.id, coordsArray); });										 

		}
	},
	applyMap: function() {
		if($(this.img)) {
			$(this.img).useMap = "#"+this.ImgHash+"_map";
		}
	},
	showTag: function(e, obj) {
		var elem=e.currentTarget;
		
		var anim = new YAHOO.util.Anim(elem.id, {opacity:{to:1}}, 0.3, YAHOO.util.Easing.easeOut);
		YAHOO.util.YAHOO.util.Dom.setStyle(elem.id+"_inner", 'opacity',0.3); 
		anim.animate();
	},
	hideTag: function(e, obj) {
		var ele = e.currentTarget;
	
		var anim = new YAHOO.util.Anim(ele.id, {opacity:{to:0}}, 0.3, YAHOO.util.Easing.easeOut);
		anim.animate();
	}
});

var Globals = new Object();
if(YAHOO.lang && YAHOO.util) {
	Globals = {
		Alerts: 0,
		States: {Loading: 0,Complete: 1},
		Containers: {},
		Absolutized: [],
		Relativized: [],
		DDRelements: [],
		DDElements: [],
		Dragables: [],
		loadingObjects: [],
		Alerts: 0,
		RandomName: function(length) {
			var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
			var string_length = (length) ? length : 10;
			var randomstring = '';
			for (var i=0; i<string_length; i++) {
				var rnum = Math.floor(Math.random() * chars.length);
				randomstring += chars.substring(rnum,rnum+1);
			}
			
			return randomstring;
		},
		stripWhite: function(string) {
			var tstring = "";
			string = '' + string;
			splitstring = string.split(" ");
			for(i = 0; i < splitstring.length; i++)
			tstring += splitstring[i];
			
			return tstring;
		},
		NOW: function(dateOrTime, asObject) {
			var d = new Date;
			var dateNow;	
			if(!dateOrTime) {
				if(!asObject)
					dateNow = d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
				else
					dateNow = {Year: d.getFullYear(), Month: d.getMonth()+1, Day: d.getDate(), Hours: d.getHours(), Min: d.getMinutes(), Sec: d.getSeconds()};
			}
			
			if(dateOrTime == "date") {
				if(!asObject) 
					dateNow = d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate();
				else
					dateNow = {Year: d.getFullYear(), Month: d.getMonth()+1, Day: d.getDate(), Hours: 0, Min: 0, Sec: 0};
			}
			
			if(dateOrTime == "time") {
				if(!asObject) 
					dateNow = d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
				else
					dateNow = {Year: 0, Month: 0, Day: 0, Hours: d.getHours(), Min: d.getMinutes(), Sec: d.getSeconds()};
			}
			
			return dateNow;
		},
		MonthNames: ["","January","February","March","April","May","June","July","August","September","October","November","December"],
		MonthNamesShort: ["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],
		mkTime: function(date) {
			if(YAHOO.lang.isObject(date)) {
				return (Date.parse(date.Month+"/"+date.Day+"/"+date.Year+" "+date.Hours+":"+date.Min+":"+date.Sec)/1000);
			} else {
				return (Date.parse(date[1]+"/"+date[2]+"/"+date[0]+" "+date[3]+":"+date[4]+":"+date[5])/1000);
			}
		},
		daysInMonth: function(month,year) {
			var m = [0,31,28,31,30,31,30,31,31,30,31,30,31];
	
			if (month != 3) return m[month];
			if (year%4 != 0) return m[2];
			if (year%100 == 0 && year%400 != 0) return m[2];
			return m[2] + 1;
		} ,
		mkWeek: function(today) {
			var year  = today.Year;
			var month = today.Month;
			var day   = today.Day;
			var hours  = today.Hours;
			var mins   = today.Min;
			var sec   = today.Sec;
			
			day = day+5;
			
			if(day>Globals.daysInMonth(month,year)) {
				month++;
				
				if(month  > 12) {
					month = 1;
					year++;
				}
				
				day = day - Globals.daysInMonth(month,year);
			} 
			
			if(month > 12) {
				month = 1;
				year++;
			}
			
			return {Year: year, Month: month, Day: day, Hours: hours, Min: mins, Sec: sec};
		},
		timeStampToDate: function(stamp) {
			var date = new Date(stamp*1000);
			var day = date.getDate();
			var month = date.getMonth()+1;
			var year = date.getFullYear();
			var hours = date.getHours();
	
			if(hours > 12) {
				var hours12 = hours-12;
				var ampm = "am";
			} else {
				var hours12 = hours;
				var ampm = "pm";	
			}
				
			var mins = date.getMinutes();
			var sec = date.getSeconds();
			
			return {Year: year, Month: month, Day: day, Hours: hours, Mins: mins, Sec: sec, AMPM: ampm, Hours12: hours12};
		},
		Destantiate: function (objRef) {
			if(YAHOO.lang.isObject(objRef)) {
				delete objRef;
			} else {
				try {
					delete $(objRef);
				} catch(err) {
					for(var i in Globals.Containers) {
						if(Globals.Containers[i].id == objRef) {
							Globals.Containers[i]._delete();
							delete Globals.Containers[i];
							break;
						}
					}
				}
			}
			return;
		},
		Absolutize: function(element, timeout, seconds) {
			var time = (seconds) ? seconds: 100;
			if(YAHOO.lang.isObject(element)) {
				if(element.id !== null) {
					if(timeout) {
						Globals.timeOut(Element.absolutize, element.id,time);
					} else {
						Element.absolutize(element.id);
					}
				}
			} else {
				if(timeout) {
					Globals.timeOut(Element.absolutize, element,time);
				} else {
					Element.absolutize(element);
				}
			}
			return;
		},
		Relativize: function(element, timeout, seconds) {
			var time = (seconds) ? seconds: 100;
			if(YAHOO.lang.isObject(element)) {
				if(element.id !== null) {
					if(timeout) {
						Globals.timeOut(Global.Relativize, element.id, time);
					} else {
						Element.relativize(element.id);
					}
				}
			} else {
				if(timeout) {
					Globals.timeOut(Global.Relativize, element, time);
				} else {
					Element.relativize(element);
				}
			}
			
			return;
		},
		timeOut: function(fn, param, time) {
			setTimeout(function(){ fn(param); },time);
			return;
		},
		setLoading: function(container, style, cancelOption, cancelOptionCallback, objScope) {
			 style = (style !== null) ? style : 1;
			
			switch(style) {
				case "1" : var  img=document.createElement('IMG');
								img.src='/gfx/collegefitness/design/loadingAnimation.gif';
								img.style.border='0px';
								break;
				case "2" : var  img=document.createElement('IMG');
								img.src='/gfx/collegefitness/design/loadingAnimation.gif';
								img.style.border='0px';
								break;
				default : var   img=document.createElement('IMG');
								img.src='/gfx/collegefitness/design/loadingAnimation.gif';
								img.style.border='0px';
			}
					
			var loadingContainer = document.createElement('DIV');
				loadingContainer.id = Globals.RandomName();
				loadingContainer.style.display = 'none';
				loadingContainer.style.width   = '100%';
				loadingContainer.style.height  = '100%';
				loadingContainer.style.backgroundColor = '#f0f0f0';
				
			var loadingContents = document.createElement('DIV');
				loadingContents.id = loadingContainer.id+'_contents';
				
				img.id = loadingContainer.id+'_img';
				loadingContents.appendChild(img);
				
			if(cancelOption) {
				var cancelButtonContainer = document.createElement("DIV");
					cancelButtonContainer.id = loadingContainer.id+"_CancelDiv";
					cancelButtonContainer.style.margin = '0 auto';
					cancelButtonContainer.style.textAlign = 'right';
					
				var cancelButton = document.createElement("IMG");
					cancelButton.src = '/gfx/collegefitness/design/button_cancel.png';
					cancelButton.alt = 'Cancel Action.';
					cancelButton.style.border='0px';
					cancelButton.id = loadingContainer.id+"_CancelButton";
					
					cancelButton.style.cursor = 'pointer';
					
				cancelButtonContainer.appendChild(cancelButton);
				
				loadingContainer.appendChild(cancelButtonContainer);				
			}
				
			Element.insert(container, { top: loadingContainer  });
			
			if(cancelOption) {
				$(cancelButtonContainer.id).setStyle({float:"right"});
				
				YAHOO.util.Event.addListener(cancelButton.id, "mouseover", function() { cancelButton.src = '/gfx/collegefitness/design/button_cancel_over.png';} );
				YAHOO.util.Event.addListener(cancelButton.id, "mouseout", function() { cancelButton.src = '/gfx/collegefitness/design/button_cancel.png';} );
				YAHOO.util.Event.addListener(cancelButton.id, "click", cancelOptionCallback, objScope);
			}
			
			$(loadingContainer.id).setStyle({opacity: 0.7});
			
			loadingContainer.appendChild(loadingContents);
				$(loadingContents.id).style.margin = '0 auto';
				$(loadingContents.id).style.textAlign = 'center';
			
			var parentElementValues = document.defaultView.getComputedStyle($(container), null);
			var parentHeight = parseInt(parentElementValues.getPropertyValue('height'));
			var paddingTop = (Globals.isNumeric(parseInt(parentElementValues.getPropertyValue('padding-top')))) ? parseInt(parentElementValues.getPropertyValue('padding-top')) : 0;
			var paddingBottom = (Globals.isNumeric(parseInt(parentElementValues.getPropertyValue('padding-bottom')))) ? parseInt(parentElementValues.getPropertyValue('padding-bottom')) : 0;
			var borderTop = (Globals.isNumeric(parseInt(parentElementValues.getPropertyValue('border-top')))) ? parseInt(parentElementValues.getPropertyValue('border-top')) : 0;
			var totalBorders = borderTop*4;
			var totalPadding = paddingTop+paddingBottom;
			var containerChildElements = $(loadingContents.id).childElements();
			var imgElementValues = document.defaultView.getComputedStyle(containerChildElements[0], null);
			var imgHeight = (Globals.isNumeric(imgElementValues.getPropertyValue('height'))) ?
							parseInt(imgElementValues.getPropertyValue('height')):
							(Globals.isNumeric(imgElementValues.getPropertyValue('line-height'))) ?
							parseInt(imgElementValues.getPropertyValue('line-height')) : 0;
			
			loadingContents.style.paddingTop = parseInt((parentHeight-imgHeight)/2)+"px";
			
			if(paddingTop > 0) {
				var moveTop = paddingTop;	
			} else {
				var moveTop = 0;
			}
			
			Globals.SetStyle(loadingContainer.id, {display: 'block',visibility: 'visible', height: (parentHeight+totalPadding+totalBorders)+'px'});
			Globals.Absolutize(loadingContainer.id);
			Globals.SetStyle(loadingContainer.id, {top: parseInt($(loadingContainer.id).getStyle('top')) - moveTop+"px"});
			Globals.loadingObjects.push(loadingContainer.id);
			
			return loadingContainer.id;
		},
		removeLoading: function(oElement) {
			if(!YAHOO.lang.isObject(oElement)) {
				$(oElement).remove();
			} else {
				if($(oElement.targetArea) !== null) {
					if($(oElement.loadingContainer) !== null) {
						$(oElement.loadingContainer).remove();
					}
				}
			} 
		},
		makeRequest: function(ajaxObject, method, sUrl, postData, target, loading, objCallback){
			method = (method !== null) ? method : "POST";
			
			if(ajaxObject) {
				if(!ajaxObject.targetArea) {
					ajaxObject.targetArea = (YAHOO.lang.isObject(target)) ? target : $(target);
				}
				ajaxObject.showLoading = (loading !== null) ? loading: false;
			} else {
				var ajaxObject = new Ajax(targetArea, loading);
			}
	
			if(!objCallback) {
				var objCallback = new CallBack(ajaxObject);
			}
					
			var request = ajaxObject.connect(method, sUrl, objCallback.callback, postData);
			
			return request;
		},
		SetStyle: function(element, style) {
			if($(element) !== null) {
				$(element).setStyle(style);
			}
			return;
		},
		GetStyle: function(element) {
			if($(element) !== null) {
				var newStyle = {};
				var enum0 = $(element).style;
				
				var enum1 = [];
				
				for(x in enum0) {
					enum1[x]=enum0[x];
				}
				enum1.each(function(name, index) {
				  if(!Globals.isNumeric(name)) {
					this[name] = index;
				  }
				}, newStyle);
							
				return newStyle;
			} else {
				return {};
			}
		},
		addClassName: function(elem,cl) {
			if (elem == null) {
				elem = parent[elem];
			}
			removeClassName(elem, cl);
			elem.className = (elem.className + " " + cl).trim();
			return;
		},
		removeClassName: function(elem, cl) {
			elem.className = elem.className.replace(cl, "").trim();
			return;
		},
		md5me: function(Obj) {
			if(YAHOO.lang.isObject(Obj)) {
				if(Obj.value.length>0) {
					Obj.value = hex_md5(Obj.value);
					return Obj.value;
				}
			} else if(YAHOO.lang.isString(Obj)) {
				Obj = hex_md5(Obj);
				return Obj;
			} else {
				return Obj;	
			}
		}, 
		addListener: function(element, type, callback, scope) {
			YAHOO.util.Event.addListener(element, type, callback, scope);
			return;
		},
		removeListener: function(element, type) {
			YAHOO.util.Event.removeListener(element, type);
			return;
		},
		requestListeners: function() {
			return YAHOO.util.Event.getListeners(element, stype);
		},
		isNumeric: function(val) {
			return !isNaN(parseFloat(val));
		},
		Dragable: function(element) {
			if(YAHOO.lang.isArray(element)) {
				for(var i=0; i<element.length; i++) {
					new YAHOO.util.DD(element[i]);
					Globals.Dragables.push(element[i]);
				}
			} else {
				new YAHOO.util.DD(element);
				Globals.Dragables.push(element);
			}
		},
		DragableList: function(element, rows, cols) {		
			YAHOO.util.Event.onDOMReady(YAHOO.DDApp.init, YAHOO.DDApp, true);
		},
		DragInRegion: function(elements, regions) {
			var dragInRegion = [];
			for(var i=0;i<elements.length;i++) {
				if($(elements[i]) !== null) {
					dragInRegion[i] = new YAHOO.DDRegion(elements[i], '', { cont: regions[i] });	
					Globals.DDRelements.push(elements[i]);
				}
			}
			return dragInRegion[0];
		},
		DragToSlot: function(elementsList, slotsList, groupsList, bounderies) {
			var slots = [];
			var elements = [];
			
			for(var i=0;i<elementsList.length; i++) {
				slots.push(new YAHOO.util.DDTarget(slotsList[i], groupsList[slotsList[i]]));
				var bound = (bounderies[elementsList[i]] !== null || bounderies[elementsList[i]] !== undefined) ? bounderies[elementsList[i]]: null;
				elements.push(new YAHOO.DDPlayer(elementsList[i],groupsList[elementsList[i]], {cont: bound}, slots[i]));
			}
			YAHOO.util.YAHOO.util.DragDropMgr.mode = 0;
		},
		replaceHTML: function(args) {
			if($(args[0]) !== null) {
				$(args[0]).innerHTML = args[1];
			}
		},
		changeBG: function(ele, style) {
			if(YAHOO.lang.isObject(ele)) {
				ele.setStyle(style);
			} else {
				if($(ele)) {
					$(ele).setStyle(style);	
				}
			}
		},
		floatWith: function(ele, target) {
			var tRight = Math.round(YAHOO.util.Dom.getStyle(target, 'right'));
			var tTop = Math.round(YAHOO.util.Dom.getStyle(target, 'top'));
			
			$(ele).setStyle({left: tRight+"px", top: tTop+"px"});
		},
		Base64: {
			_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
		
			encode : function (input) {
				var output = "";
				var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
				var i = 0;
		
				input = Globals.Base64._utf8_encode(input);
		
				while (i < input.length) {
		
					chr1 = input.charCodeAt(i++);
					chr2 = input.charCodeAt(i++);
					chr3 = input.charCodeAt(i++);
		
					enc1 = chr1 >> 2;
					enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
					enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
					enc4 = chr3 & 63;
		
					if (isNaN(chr2)) {
						enc3 = enc4 = 64;
					} else if (isNaN(chr3)) {
						enc4 = 64;
					}
		
					output = output +
					this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
					this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
		
				}
		
				return output;
			},
			decode : function (input) {
				var output = "";
				var chr1, chr2, chr3;
				var enc1, enc2, enc3, enc4;
				var i = 0;
		
				input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
		
				while (i < input.length) {
		
					enc1 = this._keyStr.indexOf(input.charAt(i++));
					enc2 = this._keyStr.indexOf(input.charAt(i++));
					enc3 = this._keyStr.indexOf(input.charAt(i++));
					enc4 = this._keyStr.indexOf(input.charAt(i++));
		
					chr1 = (enc1 << 2) | (enc2 >> 4);
					chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
					chr3 = ((enc3 & 3) << 6) | enc4;
		
					output = output + String.fromCharCode(chr1);
		
					if (enc3 != 64) {
						output = output + String.fromCharCode(chr2);
					}
					if (enc4 != 64) {
						output = output + String.fromCharCode(chr3);
					}
		
				}
		
				output = Globals.Base64._utf8_decode(output);
		
				return output;
		
			},
			_utf8_encode : function (string) {
				string = string.replace(/\r\n/g,"\n");
				var utftext = "";
		
				for (var n = 0; n < string.length; n++) {
		
					var c = string.charCodeAt(n);
		
					if (c < 128) {
						utftext += String.fromCharCode(c);
					}
					else if((c > 127) && (c < 2048)) {
						utftext += String.fromCharCode((c >> 6) | 192);
						utftext += String.fromCharCode((c & 63) | 128);
					}
					else {
						utftext += String.fromCharCode((c >> 12) | 224);
						utftext += String.fromCharCode(((c >> 6) & 63) | 128);
						utftext += String.fromCharCode((c & 63) | 128);
					}
		
				}
		
				return utftext;
			},
			_utf8_decode : function (utftext) {
				var string = "";
				var i = 0;
				var c = c1 = c2 = 0;
		
				while ( i < utftext.length ) {
		
					c = utftext.charCodeAt(i);
		
					if (c < 128) {
						string += String.fromCharCode(c);
						i++;
					}
					else if((c > 191) && (c < 224)) {
						c2 = utftext.charCodeAt(i+1);
						string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
						i += 2;
					}
					else {
						c2 = utftext.charCodeAt(i+1);
						c3 = utftext.charCodeAt(i+2);
						string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
						i += 3;
					}
		
				}
		
				return string;
			}
		},
		JavaScriptStringEncode: function(sString) {
			return (sString+"").replace(/[\0-\x1F\"\\\x7F-\xA0\u0100-\uFFFF]/g, function (sChar) {
				switch (sChar) {
					case "\b": return "\\b";
					case "\t": return "\\t";
					case "\n": return "\\n";
					case "\f": return "\\f";
					case "\r": return "\\r";
					case "\\": return "\\\\";
					case "\"": return "\\\"";
				}
				var iChar = sChar.charCodeAt(0);
				if (iChar < 0x10) return "\\x0" + iChar.toString(16);
				if (iChar < 0x100) return "\\x" + iChar.toString(16);
				if (iChar < 0x1000) return "\\u0" + iChar.toString(16);
				return "\\u" + iChar.toString(16);
			});
		},
		serialize: function(xValue) {
			switch (typeof(xValue)) {
				case "undefined": return "void(0)";
				case "boolean":   return xValue.toString();
				case "number":    return xValue.toString();
				case "string":    return "\"" + Globals.JavaScriptStringEncode(xValue) + "\"";
				case "function":  return "eval(\"" + Globals.JavaScriptStringEncode(xValue.toString()) + "\")";
				case "object":
					if (xValue == null) return "null";
					var bArray = true;
					var asObjectValues = [], asArrayValues = [], iCounter = 0, iLength = null;
					for (var i in xValue) {
						if (bArray) switch (i) {
							case "length":
								break;
							case iCounter.toString():
								iCounter++;
								asArrayValues.push(Globals.serialize(xValue[i]));
								break;
							default:
								bArray = false;
						}
						asObjectValues.push(Globals.serialize(i) + ":" + Globals.serialize(xValue[i]));
					}
					if (bArray) {
						try {
							bArray &= (xValue.length == iCounter);
						} catch (e) {
							bArray = false;
						}
					}
					return (bArray ?
						"[" + asArrayValues.join(",") + "]":
						"{" + asObjectValues.join(",") + "}"
					);
				default:
					throw new Error("Objects of type " + typeof(xValue) + " cannot be serialized.");
			}
		},
		visualize: function(xValue, sPadding, iDepth) {
			if (typeof(sPadding) !== "string") sPadding = "";
			if (typeof(iDepth) !== "number") iDepth = 2;
			switch (typeof(xValue)) {
				case "undefined": return "undefined";
				case "boolean":   return xValue.toString();
				case "string":    return "\"" + Globals.JavaScriptStringEncode(xValue) + "\"";
				case "number":
					if (!isFinite(xValue) || isNaN(xValue) || xValue != parseInt(xValue) || xValue < 10) {
						return xValue.toString();
					}
					return xValue.toString() + "  (0x" + xValue.toString(16).toUpperCase() + ")";
				case "function":
					var sFunction = xValue.toString();
					if (iDepth == 2) return sFunction.replace(/\r?\n/g, "$&" + sPadding);
					else return sFunction.replace(/\{[\s\S]*$/, "{ \u2026 }");
				case "object":
					if (xValue == null) return "null";
					var sConstructor = null;
					try { sConstructor = xValue.constructor.toString(); }
					catch (e) { return "object unknown"; }
					var sHeader = "Unknown{", sFooter = "}";
					var oName = sConstructor.match(/^\r?\n?function\s+(\w+)\s*\([\s\S]*$/);
					if (oName) switch (oName[1]) {
						case "Boolean": return "Boolean(" + Globals.visualize(xValue.valueOf(), sPadding, iDepth) + ")";
						case "Date":    return "Date(" + Globals.visualize(xValue.toString(), sPadding, iDepth) + ")";
						case "Number":  return "Number(" + Globals.visualize(xValue.valueOf(), sPadding, iDepth) + ")";
						case "String":  return "String(" + Globals.visualize(xValue.valueOf(), sPadding, iDepth) + ")";
						case "RegExp":
							var sFlags = "";
							if (xValue.global) sFlags += "g";
							if (xValue.ignoreCase) sFlags += "i";
							if (xValue.multiline) sFlags += "m";
							return "RegExp(/" + xValue.source + "/" + sFlags + ")";
						case "Array":
							sHeader = "Array [", sFooter = "]";
							break;
						default:
							sHeader = "Object " + oName[1] + " {";
					} else try {
						oName = xValue.toString().match(/^\[(?:object )?(.*)\]$/);
						if (oName) sHeader = "Object [" + oName[1] + "] {";
					} catch (e) { }
					if (iDepth == 0) return sHeader + " \u2026 " + sFooter;
					var asValues = [];
					try {
						for (var i in xValue) {
							var sIndex = parseInt(i).toString() == i ?
								i:
								Globals.visualize(i);
							var sValue = xValue[i] === xValue ?
								"\u21D2 self":
								Globals.visualize(xValue[i], sPadding + "\xB7   ", iDepth - 1);
							asValues.push(sPadding + "\xB7   " + sIndex + ": " + sValue);
						}
					} catch (e) {
						return "object unknown";
					}
					return sHeader + "\r\n" +
						asValues.join("\r\n") + "\r\n" +
						sPadding + sFooter;
				default:
					try { return typeof(xValue) + " " + new String(xValue); }
					catch(e) { return "unknown"; }
			}
		},
		stackDump: function(iLevel, bArguments) {
			var asStack = [];
			var iCalls = 0;
			for (var oCaller = arguments.callee.caller; oCaller != null; oCaller = oCaller.caller) {
				if (typeof(iLevel) == "number" && iLevel-- > 0) continue;
				iCalls++;
				var bLastCall = !(oCaller.caller);
				sCaller = (oCaller+"").replace(/function\s*|\s*{[\s\S]*/g, "");
				var asCaller = sCaller.match(/(\w*\s*)\(([^\)]*)\)/);
				var sCallHeadHeader = " " + (bLastCall ? "\u2514":"\u251C") + "\u2500 ";
				var sCallBodyHeader = " " + (bLastCall ? " " : "\u2502") + "  ";
				if (asCaller == null) {
					asStack.push(sCallHeadHeader + Globals.visualize(sCaller));
					if (bArguments) asStack.push(sCallBodyHeader + "    Argument info unavailable.");
				} else {
					var sName = asCaller[1];
					var asArgumentNames = asCaller[2].match(/^\s*$/) ?
						[]: asCaller[2].split(",");
					asStack.push(sCallHeadHeader + sName + " (" + asArgumentNames.join(", ") + ")");
					if (bArguments) {
						for (var i = 0; i < asArgumentNames.length || i < oCaller.arguments.length; i++) {
							var sArgumentName = "arguments[" + i + "]";
							if (i < asArgumentNames.length) {
								asArgumentNames[i] = asArgumentNames[i].replace(/^\s*|\s*$/g, "");
								sArgumentName = asArgumentNames[i];
							}
							var bLastArgument = (i + 1 >= asArgumentNames.length && i + 1 >= oCaller.arguments.length);
							var sArgumentHeadHeader = " " + (bLastArgument ? "\u2514":"\u251C") + "\u2500 ";
							var sArgumentBodyHeader = " " + (bLastArgument ? " " : "\u2502") + "  ";
							asStack.push(
								sCallBodyHeader +
								sArgumentHeadHeader +
								sArgumentName + "=" +
								Globals.visualize(oCaller.arguments[i], sCallBodyHeader + sArgumentBodyHeader)
							);
						}
					}
				}
			}
			if (iCalls == 0) return "Call stack info unavailable.";
			return "Call stack (" + iCalls + " calls):\r\n" + asStack.join("\r\n");
		},
		isDefined: function(Obj, responseContainer, ObjTitle, ref) {
			var returnval = false;
			if(YAHOO.lang.isArray(Obj)) {
				Obj.each(function(x) {
					Globals.isDefined(x, responseContainer, ObjTitle, x.id);				  
				});
			} else {
				if(YAHOO.lang.isObject(Obj)) {
					if(Globals.isDefined(Obj.value, responseContainer, ObjTitle, ref)) {
						returnval = true;
					} 
				} else if(YAHOO.lang.isString(Obj)) {
					if(Obj.length > 0 && Obj != "") {
						returnval = true;
					} else {
						if($(responseContainer)) {
							$(responseContainer).innerHTML += "Please check the "+ObjTitle[ref]+" field.<br />";
						} else {
							alert("Please check the "+ObjTitle[ref]+" field.");
						}
					}
				} else if(Globals.isNumeric(Obj)) {
					if(Obj && Obj.length > 0) {
						returnval = true;
					}
				} else {
					if($(responseContainer)) {
						$(responseContainer).innerHTML += "Please check the "+ObjTitle[ref]+" field.<br />";
					} else {
						alert("Please check the "+ObjTitle[ref]+" field.");
					}
				}
			}
			return returnval;
		},
		URLDecode: function(encodedString) {
			var output = encodedString;
			var binVal, thisString;
			var myregexp = /(%[^%]{2})/;
			while ((match = myregexp.exec(output)) != null && match.length > 1 && match[1] != '') {
				binVal = parseInt(match[1].substr(1),16);
				thisString = String.fromCharCode(binVal);
				output = output.replace(match[1], thisString);
			}
			return output;
		},
		in_array: function(needle, haystack, strict) {
			var found = false, key, strict = !!strict;
			for (key in haystack) {
				if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
					found = true;
					break;
				}
			}
			return found;
		},
		format_currency: function(field) {
			if(/^\d+$/.test(field.value))
				field.value=field.value.split("").reverse().join("").replace(/(\d{3})\B/g,"$1,").split("").reverse().join("");
		}
	};
}