if (!activeHelpBubbles) var activeHelpBubbles = Array();

var App = 
{
	interval: 0,
	params: null, 
	
	init: function(section)
	{
		this.params = [];
		Page.init(section);
	},

    getCDN: function()
    {
        return ((document.location.protocol === 'https:') ? 'https://s3.amazonaws.com/s3.sutn.com' : 'http://cdn.sutn.com');
    },

	setParam: function(key, val)
	{
		this.params[key] = val;
	},
	
	getComponent: function()
	{
		return this.params['component'];
	},
	
	load: function(url, target, params)
	{
		if (!params) params = {};
		return this.request(url, 'GET', params, target);
	},

	send: function(id, target, params)
	{
		if ($(id)) var form = $(id);
		else return false;
		if (!params) params = {};
		params = Object.extend(params, form.serialize(true));
		return this.request(form.action, form.method, params, target);
	},
	
	request: function(url, method, params, target)
	{
		var success = false;
		params.AJAX = '1';
		
		if (target && $(target)) {
			var loader = (this.params['ajax_loader'] != null) ? this.params['ajax_loader'] : $('ajax_loader').innerHTML;
			$(target).update(loader);
			this.params['ajax_loader'] = null;
		}
		
		var _this = this;
		
		var req = new Ajax.Request(url,
		{
			method: method,
			parameters: params,
			evalScripts:true,
			onSuccess: function(transport)
			{
				if (transport.responseText.isJSON())
				{
					var response = transport.responseText.evalJSON(true);
					
					if (response.success) _this.onFailure = null;
					else _this.onSuccess = null;
					
					$A(response.actions).each(function(e)
					{
						if (!e.vars) e.vars = {};
						
						if(e.success === false) _this.onSuccess = null;
						
						switch (e.action)
						{
							case 'alert': alert(Page.getMsg(e.alert, e.vars)); break;
							case 'redirect': window.parent.location = e.redirect; break;
							case 'reload': window.parent.location.reload(); break;
							case 'error': Component.showError(Page.getMsg(e.error, e.vars)); break;
							case 'notice': Component.showNotice(Page.getMsg(e.notice, e.vars)); break;
							case 'success': Component.showSuccess(Page.getMsg(e.success, e.vars)); break;
						}
						
					});
				}
				else
				{
					if ($(target)) $(target).update(transport.responseText);
				}
				
				if (_this.onSuccess)
				{
					_this.onSuccess(transport.responseText);
					_this.onSuccess = null;
				}
				else if (App.onFailure)
				{
					_this.onFailure(transport.responseText);
					_this.onFailure = null;
				}
				
				success = true;
			},
			onFailure: function()
			{
				alert(Page.getMsg('msg_default_error'));
			}
		});
		
		return success;
	},
	
	getURLParam: function(name)
	{
		var found = false;
		var strReturn = "";
		
		if (window.location.href.substrCount("#") > 0) { var href = window.location.href.split("#")[0]; } else { var href = window.location.href; }
		if (href.indexOf("?") > -1 ) {
			var strQueryString = href.substr(href.indexOf("?") + 1);
			var aQueryString = strQueryString.split("&");
			
			for (var iParam = 0; iParam < aQueryString.length; iParam++ ) {
				var paramParts = aQueryString[iParam].split("=");
				
				if (paramParts[0] == name) {
					strReturn = paramParts[1];
					found = true;
				}
			}
		}
		
		if (found == true) return unescape(strReturn);
		else return false;
	},

	urlParamExists: function(name)
	{
		var found = false;
		
		if (window.location.href.substrCount("#") > 0) { var href = window.location.href.split("#")[0]; } else { var href = window.location.href; }
		if (href.indexOf("?") > -1 ) {
			var strQueryString = href.substr(href.indexOf("?") + 1);
			var aQueryString = strQueryString.split("&");
			
			for (var iParam = 0; iParam < aQueryString.length; iParam++ ) {
				var paramParts = aQueryString[iParam].split("=");
				if (paramParts[0] == name) { found = true; }
			}
		}
		
		if (found == true) return true;
		else return false;
	},
	
	classExists: function(c)
	{
		if (typeof(c) == "object") return true;
		else return false;
	},
	
	getMouse: function(e)
	{
		return (e && e.pageX) ? {"x":e.pageX, "y":e.pageY} : {"x":event.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft), "y":event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop)};
	},
	
	getBrowser: function()
	{
		var browser = "unknown";
		var agent = navigator.userAgent.toLowerCase();
		var possibles = new Array('safari','msie 6','msie','firefox','netscape','omniweb','avantbrowser','msn','konqueror','camino','chrome');
		
		for (var i=0;i<possibles.length;i++)
		{
			if (agent.indexOf(possibles[i]) > -1)
			{
				browser = possibles[i];
				break;
			}
		}
		
		return browser;
	},
	
	autoload: function(url, target, params)
	{
		if (this.interval > -1) this.load(url, target, params);
	},
	
	initAutoload:function(url, target, params)
	{
		this.interval--;
		this.resetAutoload.delay(0.7);
		this.autoload.delay(0.73, url, target, params);
	},
	
	resetAutoload: function ()
	{
		this.interval++;
	},
	
	__void__: function()
	{
		// see, nothing at all
	}
};

var Page = 
{
	win: null,
	actionBoxCloser: null,
	actionBoxLoader: null,
	lightBoxCloser: null,
	
	init: function(section)
	{
		this.registerComponents();
		this.registerToggleElements();
		
		if ($('nav_' + section))
		{
			var e = $('nav_' + section);
			e.className = "active";
			if (e.up('li') && e.up('li').id == "nav_more") e.up('li').addClassName("active");
		}
	},
	
	absPos: function(el)
	{
		var pos = {"x":el.offsetLeft,"y":el.offsetTop,"width":el.offsetWidth,"height":el.offsetHeight};
		
		while(el && el.offsetParent)
		{
			while (el.parentNode!=el.offsetParent && (el.parentNode.scrollLeft || el.parentNode.scrollTop))
			{
				el=el.parentNode;
				pos['x'] -= el.scrollLeft ? el.scrollLeft : 0;
				pos['y'] -= el.scrollTop ? el.scrollTop : 0;
			}
			
			pos['x'] += el.offsetParent.offsetLeft;
			pos['y'] += el.offsetParent.offsetTop;
			
			el = el.offsetParent;
		}
		
		pos['n'] = pos['y'];
		pos['w'] = pos['x'];
		pos['s'] = pos['y']+pos['height'];
		pos['e'] = pos['x']+pos['width'];
		
		return pos;
	},
	
	getPoint: function(el, dir, buffer)
	{
		var pos = Page.absPos(el);
		
		switch(dir)
		{
			case 'nw': return {'x':pos.w-buffer, 			'y':pos.n-buffer};
			case 'n':  return {'x':pos.w+(pos.e-pos.w)/2, 	'y':pos.n-buffer};
			case 'ne': return {'x':pos.e+buffer, 			'y':pos.n-buffer};
			case 'e':  return {'x':pos.e+buffer, 			'y':pos.n+(pos.s-pos.n)/2};
			case 'se': return {'x':pos.e+buffer, 			'y':pos.s+buffer};
			case 's':  return {'x':pos.w+(pos.e-pos.w)/2, 	'y':pos.s+buffer};
			case 'sw': return {'x':pos.w-buffer, 			'y':pos.s+buffer};
			case 'w':  return {'x':pos.w-buffer, 			'y':pos.n+(pos.s-pos.n)/2};
		}
	},
	
	registerComponents: function()
	{
		$$(".component").each(function(e)
		{
			Object.extend(e, Component);
			e.registerTabs();
			e.registerInlineTabs();
			e.init();
		});
	},
	
	registerToggleElements: function()
	{
		$$(".toggle").each(function(e)
		{
			e.observe('click', function(event)
			{
				var el = Event.element(event);
				el.toggleClassName("plus");
				el.up('div').down(".toggle-content").toggle();
				el.title = (el.className.include("plus")) ? $('str_expand').innerHTML : $('str_collapse').innerHTML;
 			});
		});
	},
	
	showHelperBubble: function(text, option)
	{
		Page.showHelpBubble(text, option);
	},
		
	showHelp: function(e, id, target)
	{
		if (!e || !$(id)) return;
		e.down('.help-icon').toggleClassName("help-icon-bg");
		if (target) e = target;
		
		if (!e.down('.help-body'))
		{
			var tpl = new Template($('help_template').innerHTML);
			e.insert(tpl.evaluate({content: $(id).innerHTML}));
		}
		
		e.down('.help-body').toggle();
	},
	
	showHelpBubble: function(text, options, fade_time)
	{
		if (!fade_time) var fade_time = false;
		
		var helperContainer = "bubble_loader";
		
		if (text) {
			if (typeof(text) != "string") helperContainer = text.id;
			else if ($(text)) helperContainer = text;
			else $('bubble_loader').innerHTML = text;
		}
		
		helpBubble.show(helperContainer, options, fade_time);
	},
	
	hideHelpBubble: function(text)
	{
		var helperContainer = "bubble_loader";
		
		if (text) {
			if (typeof(text) != "string") helperContainer = text.id;
			else if ($(text)) helperContainer = text;
			else $('bubble_loader').innerHTML = text;
		}
		
		helpBubble.hide(helperContainer);
	},
	
	getMsg: function(id, vars)
	{
		if (!vars) vars = {};
		var tmpl = new Template($(id) ? $(id).innerHTML : $('msg_default_error').innerHTML);
		//var tmpl = new Template('Your challenge has been created!<br /><div style="font-size:12px; line-height:1.3; margin-top:10px;">The privacy settings for this challenge allow others to see and join your challenge. &nbsp;To change those setting <a href="/members/challenges/detail/#{record_id}/">click here</a>.</div>');
		return tmpl.evaluate(vars);
	},
	
	validateForm: function(fields)
	{
		var response = { 'valid':true };
		
		fields.each(function(e)
		{
			if ($(e) && $F(e).blank())
			{
				var msg = (e.startsWith('confirm_')) ? 'msg_confirm_' + e.substring(8) : 'msg_missing_' + e;
			}
			else if ($(e) && e.startsWith('confirm_') && $F(e) != $F(e.substring(8)))
			{
				var msg = 'msg_match_' + e.substring(8);
			}
			else if ($(e) && e.include("username"))
			{
				var valid = true;
				var username = $F(e).strip();
				
				if (username.match(" "))
				{
					valid = false;
				}
				
				if (valid == false) var msg = 'msg_invalid_' + e;
			}
			else if ($(e) && e.include("email"))
			{
				var valid = true;
				var email = $F(e).strip();
				var at = email.indexOf("@");
				var dot = email.lastIndexOf(".");
				
				if (at < 1 || dot < 3 || dot == email.length -1 || (dot - at) < 2)
				{
					valid = false;
				}
				else
				{
					var invalidCharsLocal = '()[]:;"<>';
					var invalidCharsDomain = '!#$%^*()+{}[]|/:;"\'\\>?<,';
					for (var i = 0; i < at; i++) { if (invalidCharsLocal.indexOf(email.charAt(i)) != -1) valid = false; }
					for (var i = at; i < email.length; i++) { if (invalidCharsDomain.indexOf(email.charAt(i)) != -1) valid = false; }
				}
				
				if (valid == false) var msg = 'msg_invalid_' + e;
			}
			else if ($(e) && e.include("phone"))
			{
				var valid = true;
				var phone = $F(e).strip();
				phone = phone.replace(/[A-Wa-w\WY-Zy-z]/g, "");
				if(phone.length<10) valid = false;
				if(valid==false) var msg = 'msg_invalid_' + e;
			}
			else if ($(e) && e.include("zip"))
			{
				var valid = true;
				var zip = $F(e).strip();
				if(!zip.match(/(^\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$)/))
					valid = false;
				if(valid==false) var msg = 'msg_invalid_' + e;
			}
			
			if (msg)
			{
				Page.highlightElement(e);
				response = { 'valid':false, 'element':e, 'msg':msg };
				throw $break;
			}
			
		});
		
		return response;
	},
	
	highlightElement: function(e, className)
	{
		if ($(e))
		{
			if (!className) var className = 'invalid';
			$(e).addClassName(className);
			new Form.Element.Observer(e, 0.2, function(el, value) { el.removeClassName(className); });
		}
	},
	
	loadActionBox: function(top,title) {
		$('action-box-container').style.visibility = 'hidden';
		$('action-box-container').style.display = 'block';
		
		if (title) {
			$('action-box-title').style.display = "block";
			$('action-box-title').innerHTML = title;
		} else $('action-box-title').style.display = "none";
		
		if (App.getBrowser() == "msie 6") {
			var selects = document.getElementsByTagName('select');
			for (i = 0; i < selects.length; i++)
			{
			    // don't hide the select if it's inside the action box container
			    if ($(selects[i]).descendantOf('action-box-container') == false)
			    {
			        selects[i].style.visibility = 'hidden';
			    }
			}
		}
		
		Page.correctActionBox(false,top);
		
		$('action-box-container').style.visibility = 'visible';
	},
	
	showActionBox: function(creator, obj) {
		if (obj.url || obj.raw) {
			if (!obj.params) obj.params = {};
			if (!obj.method) obj.method = 'GET';
			
			if (obj.title) obj.title = "'"+obj.title+"'";
			else obj.title = false;
			
			if (obj.top) obj.top = "'"+obj.top+"'";
			else obj.top = false;
			
			if (obj.url) {
				App.onSuccess = function() { 
					setTimeout("Page.loadActionBox("+obj.top+","+obj.title+")",200);
					if (Page.actionBoxLoader) Page.actionBoxLoader();
				}
				
				App.request(obj.url, obj.method, obj.params, 'action-content');
			} else if (obj.raw) {
    			if (App.getBrowser() == "msie 6")
    			{
    			    Page.loadActionBox(obj.top, obj.title);
                    $('action-content').update(obj.raw);
    			}
    			else
    			{
    				$('action-content').update(obj.raw);
    			    Page.loadActionBox(obj.top, obj.title);
    			}
			}
		}
	},
	
	hideActionBox: function(bypassCloser) {
		if (!bypassCloser) var bypassCloser = false;
		
		var allowClose = true;
		if (!bypassCloser && Page.actionBoxCloser && !Page.actionBoxCloser()) allowClose = false;
		
		if (allowClose) {
			if (App.getBrowser() == "msie 6") {
				var selects = document.getElementsByTagName('select');
				for (i = 0; i < selects.length; i++) selects[i].style.visibility = 'visible';
			}
			
			$('action-box-container').style.display = 'none';
		}
	},
	
	correctActionBox: function(noTop,top) {
		if (navigator.userAgent.toLowerCase().indexOf("msie") > -1) {

            // only do this for IE 6
            if (navigator.userAgent.toLowerCase().indexOf("msie 6") > -1)
            {
			    if ($('action-content').offsetHeight < 350)
			    {
			        $('action-content').style.height="350px";
			        $('action-content').style.width="660px";
			    }
			}

			var scrollOffsets = document.viewport.getScrollOffsets();
			if (!noTop) $('action-box-container').style.top = (scrollOffsets[1]+((document.viewport.getHeight()/2)-($('action-box').offsetHeight/2)))+"px";
			$('action-box-container').style.left = ((document.body.offsetWidth/2)-($('action-box').offsetWidth/2))+"px";

		} else {
			var scrollOffsets = document.viewport.getScrollOffsets();
			if (!noTop) $('action-box-container').style.top = (scrollOffsets[1]+((document.viewport.getHeight()/2)-($('action-box').clientHeight/2)))+"px";
			$('action-box-container').style.left = ((window.innerWidth/2)-($('action-box').clientWidth/2))+"px";
		}
		
		if (!noTop && top) {
			$('action-box-container').style.top = top+"px";
			$('action-box-backdrop').style.top = (top-103)+"px";
		}
		
		// If the reach extends beyong the viewport, shrink it
		var viewHeight = document.viewport.getHeight();
		var boxReach = $('action-box-backdrop').viewportOffset().top + parseFloat($('action-box-backdrop').style.height.strReplace("px",""));
		
		if (boxReach > viewHeight) {
			var correctedHeight = viewHeight - $('action-box-backdrop').viewportOffset().top;
			
			$('action-content').style.height = (correctedHeight-63)+"px";
			$('action-box-backdrop').style.height = (correctedHeight)+"px";
			
			if (navigator.userAgent.toLowerCase().indexOf("msie") < 0) $('action-content').style.overflow = "auto";
		} else if (navigator.userAgent.toLowerCase().indexOf("msie") < 0) $('action-content').style.overflow = "none";
	},
	
	showLightbox: function(creator, obj)
	{
		if (!obj) obj = {};
		var xPos = 0; var yPos = 0;
		
		 winHt = (window.innerHeight) ? window.innerHeight : document.documentElement.clientHeight;
		
		isIE = (navigator.userAgent.toLowerCase().indexOf("msie") + 1 > 0);
		if (isIE)
		{
			isIE6 = (navigator.userAgent.toLowerCase().indexOf("msie 6.0") + 1 > 0);
			if (self.pageYOffset) yPos = self.pageYOffset;
			else if (document.documentElement && document.documentElement.scrollTop) yPos = document.documentElement.scrollTop; 
			else if (document.body) yPos = document.body.scrollTop;
		}
		else
			isIE6 = false;
		
		bod = document.getElementsByTagName('body')[0];
		bod.style.height = '100%';
		bod.style.overflow = 'hidden';
		
		htm = document.getElementsByTagName('html')[0];
		htm.style.height = '100%';
		htm.style.overflow = 'hidden'; 
		
		var selects = document.getElementsByTagName('select');
		for (i = 0; i < selects.length; i++) selects[i].style.visibility = 'hidden';
		window.scrollTo(0, 0); 
		
		$('lightbox-overlay').show();

        if (!isIE6)
		    $('lightbox-content').setStyle({ position: 'relative' });

		var lightbox = $('lightbox');
		Object.extend(lightbox, Object);
		
		if (obj.scroll) { 
			$('lightbox-content').style.overflow = 'auto';
			$('lightbox-content').style.maxHeight = obj.scroll + 'px';
			if (isIE6)
				$('lightbox-content').style.height = obj.scroll + 'px';
		}
		else { 
			if (!isIE6) 
				$('lightbox-content').style.overflow = 'auto';
			else {
				$('lightbox-content').style.overflow = 'hidden';
				$('lightbox-content').style.height = "";
			}
			$('lightbox-content').style.maxHeight = (winHt - 150) + "px";
		}

        // enable force no horizontal scroll
        if (obj.scrollHorizontal === false)
        {
            $('lightbox-content').style.overflowX = 'hidden';
        }

		lightbox.show();
		lightbox.creator = creator;
		
		if (obj.url)
		{
			if (!obj.params) obj.params = {};
			if (!obj.method) obj.method = 'GET';
			
			new Ajax.Updater({ success:$('lightbox-content')}, obj.url,
			{
				method:obj.method, evalScripts:true, parameters:obj.params
			});
		}
		else if (obj.id)
		{
			if ($(obj.id)) $('lightbox-content').update($(obj.id).innerHTML);
			$(obj.id).innerHTML = "";
		}
		if (obj.width) {
			lightbox.style.width = obj.width + "px";
			lightbox.style.margin = "-220px 0 0 -" + (obj.width/2) + "px"; 
		}
		
		
		if (obj.header && obj.header == 'hidden')
		{
			$('lightbox-header').hide();
		}
	},
	
	hideLightbox: function()
	{
		$('lightbox-content').update(" ");
		$('lightbox').hide();
		$('lightbox-overlay').hide();
		
		bod = document.getElementsByTagName('body')[0];
		bod.style.height = 'auto';
		bod.style.overflow = 'auto';
  
		htm = document.getElementsByTagName('html')[0];
		htm.style.height = 'auto';
		htm.style.overflow = 'auto';
		
		var selects = document.getElementsByTagName('select');
		for (i = 0; i < selects.length; i++) selects[i].style.visibility = '';
		if (this.lightBoxCloser) this.lightBoxCloser();
		
		window.scrollTo(0, 0);  
	}
};

var Component = 
{
	msgDiv: null, 
	
	init: function()
	{
		this.params = [];
		
		this.observe('click', function(event)
		{
			App.setParam('component', this);
		});
		
		$$('.msg').each(function(e)
		{
			e.observe('click', function(event) { e.hide(); });
		});
	},
	
	setParam: function(key, val)
	{
		this.params[key] = val;
	},
	
	setMsg: function(id)
	{
		if ($(id))
		{
			$(id).hide();
			this.msgDiv = $(id);
		}
	},
	
	getMsg: function()
	{
		return (this.msgDiv !== null) ? this.msgDiv : App.getComponent().down(".msg");
	},
	
	showNotice: function(msg)
	{
		this.showMsg(msg, "notice");
	},
	
	showError: function(msg)
	{
		this.showMsg(msg, "error");
	},
	
	showSuccess: function(msg)
	{
		this.showMsg(msg, "success");
	},
	
	showMsg: function(msg, className)
	{
		this.clearMsg();
		var e = this.getMsg();
		if (!e) return;
		
		// e.observe('click', function(event) { this.hide(); });
		e.addClassName(className);
		e.update(msg);
		e.show();
		
		if (e.up('.scroll'))
		{
			var s = e.up('.scroll');
			// s.scrollTop = e.getOffsetParent().offsetTop;
			
		}
		if (e.viewportOffset().top < 0 || e.viewportOffset().top > document.viewport.getDimensions().height) e.scrollTo();
	},
	
	clearMsg: function()
	{
		var e = this.getMsg();
		if (!e) return;
		if (e.className == 'msg') return;
		
		e.stopObserving('click');
		e.removeClassName('notice');
		e.removeClassName('error');
		e.removeClassName('success');
		e.update("");
	},
	
	registerTabs: function()
	{
		try
		{
			$$(".component-tabs").each(function(el)
			{
				if (el.down("tr").childElements())
				{
					var tabs = [];
					
					el.down("tr").childElements().each(function(e)
					{
						if (e.className.match('component-tab')) tabs.push(e);
					});
					
					tabs.each(function(e)
					{
						e.observe('click', function(event)
						{
							tabs.each(function(el)
							{
								el.removeClassName("tab-on");
								el.down(".tab-content").removeClassName("tab-content-on");
							});
							
							this.addClassName("tab-on");
							this.down(".tab-content").addClassName("tab-content-on");
			 			});
					});
				 }
			});
		}
		catch (err)	{ }
	},
	
	activateTab: function(id)
	{
		if ($(id))
		{
			$(id).addClassName("tab-on");
			$(id).down(".tab-content").addClassName("tab-content-on");
		}
	},
	
	deactivateTab: function(id)
	{
		if ($(id))
		{
			$(id).removeClassName("tab-on");
			$(id).down(".tab-content").removeClassName("tab-content-on");
		}
	},
	
	loadTabContent: function(event, action, params)
	{
		var e = Event.element(event);
		var tab_content = e.up('.component-container').down('.component-content');
		
		App.request('/cp/' + action + '/', 'GET', params, tab_content.id);
	},

	registerInlineTabs: function()
	{
		try
		{
			$$(".inline-component-tabs").each(function(el)
			{
				if (el.down("ul").childElements())
				{
					var tabs = [];
					
					el.down("ul").childElements().each(function(e)
					{
						tabs.push(e);
					});
					
					tabs.each(function(e)
					{
						e.observe('click', function(event)
						{
							tabs.each(function(el)
							{
								el.removeClassName("active");
							});
							
							this.addClassName("active");
			 			});
					});
				 }
			});
		}
		catch (err)	{ }
	},
	
	loadInlineTabContent: function(event, action, params)
	{
		if (typeof(event) == "string") var container = event;
		else {
			var e = Event.element(event);
			var tab_content = e.up('.tab_content').down('.component-tab-content');
			var container = tab_content.id;
		}
		
		App.request('/cp/' + action + '/', 'GET', params, container);
	},
	
	toggleTabIcon: function(className, id)
	{
		$$('.' + className).each(function(e) { if (e) e.src = e.src.replace('_on', '_off'); });
		
		if ($(id))
		{
			var e = $(id);
			if (e) e.src = e.src.replace('_off', '_on');
		}	
	}
};

var Util = 
{
	getTimezoneOffset: function()
	{
		var d = new Date();
		return (d.getTimezoneOffset() / 60) * (-1);
	}
};

function displayChange(elem)
{
	if($('select_')) var junk = $('select_');
	var subs = elem.parentNode.descendants();
	
	for(j = 0; j < subs.length; j++)
	{
		if(subs[j] != elem)
		{
			if(subs[j].tagName=="SELECT") subs[j].value = "";
			if(subs[j].tagName=="DIV") subs[j].hide();
		}
	}
	if ($(elem.value) == null)
	{
	}
	else
	{
		$(elem.value).show();
	}
}

function getCheckedValue(radioObj)
{
	if(!radioObj) return "";
	var radioLength = radioObj.length;
	
	if (radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}

function hasClass(element,cls)
{
	return element.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}

function addClass(element,cls)
{
	if (!this.hasClass(element,cls)) element.className += " "+cls;
}

function removeClass(element,cls)
{
	if (hasClass(element,cls)) {
		var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
		element.className = element.className.replace(reg,' ');
	}
}

function isLetter(val)
{
	if(val.charCode) val = String.fromCharCode(val.charCode);
	return (val.toString().search(/^[a-zA-Z]+$/) == 0);
}

function isInt(val)
{
	if(val.charCode) val = String.fromCharCode(val.charCode);
	return (val.toString().search(/^-?[0-9]+$/) == 0);
}

function isNumeric(val)
{
	if(val.charCode) val = String.fromCharCode(val.charCode);
	return (val.toString().search(/^-?[0-9\.]+$/) == 0);
}

function daysInMonth(mon,year)
{
	return 32 - new Date(year,mon,32).getDate();
}

function isArray(mixed_var)
{
    return (mixed_var instanceof Array);
}

function strtotime(str,now)
{
	if (!now) var now = new Date();
	
    var i, match, s, strTmp = '', parse = '';
    
    strTmp = str;    
    strTmp = strTmp.replace(/\s{2,}|^\s|\s$/g,' ');
    strTmp = strTmp.replace(/[\t\r\n]/g, '');
 
    if (strTmp == 'now') return (new Date()).getTime()/1000;    
    else if (!isNaN(parse = Date.parse(strTmp))) return (parse/1000);
    else if (now) now = new Date(now*1000);
    else now = new Date();
    
    strTmp = strTmp.toLowerCase();
    
	var __is = {
				day: {
        			'sun': 0,
        			'mon': 1,
        			'tue': 2,
        			'wed': 3,
        			'thu': 4,
        			'fri': 5,
        			'sat': 6
    			},
    			mon: {
    				'jan': 0,
    				'feb': 1,
    				'mar': 2,
    				'apr': 3,
    				'may': 4,
    				'jun': 5,
    				'jul': 6,
    				'aug': 7,
    				'sep': 8,
    				'oct': 9,
    				'nov': 10,
    				'dec': 11
    			}
	};
		
	var process = function (m) {
		var ago = (m[2] && m[2] == 'ago');
		var num = (num = m[0] == 'last' ? -1 : 1) * (ago ? -1 : 1);
		
		switch (m[0]) {
        	case 'last':
        	case 'next':
        		switch (m[1].substring(0, 3)) {
                	case 'yea':
                		now.setFullYear(now.getFullYear() + num);
                    break;
                    
                	case 'mon':
                		now.setMonth(now.getMonth() + num);
                    break;
                
                	case 'wee':
                		now.setDate(now.getDate() + (num * 7));
                	break;
                	
                	case 'day':
                		now.setDate(now.getDate() + num);
                    break;
                	
                	case 'hou':
                		now.setHours(now.getHours() + num);
                    break;
                
                	case 'min':
                		now.setMinutes(now.getMinutes() + num);
                    break;
                    
                	case 'sec':
                		now.setSeconds(now.getSeconds() + num);
                    break;
                
                	default:
                		var day;
                		if (typeof (day = __is.day[m[1].substring(0, 3)]) != 'undefined') {
                			var diff = day - now.getDay();
                			if (diff == 0) {
                				diff = 7 * num;
                			} else if (diff > 0) {
                				if (m[0] == 'last') { diff -= 7; }
                			} else {
                				if (m[0] == 'next') { diff += 7; }
                			}
                			
                			now.setDate(now.getDate() + diff);
                		}
        		}
            break;
            
        	default:
        		if (/\d+/.test(m[0])) {
        			num *= parseInt(m[0], 10);
        			
        			switch (m[1].substring(0, 3)) {
                    	case 'yea':
                    		now.setFullYear(now.getFullYear() + num);
                        break;
                        
                    	case 'mon':
                    		now.setMonth(now.getMonth() + num);
                        break;
                        
                    	case 'wee':
                    		now.setDate(now.getDate() + (num * 7));
                        break;
                    
                    	case 'day':
                    		now.setDate(now.getDate() + num);
                    	break;
                    
                    	case 'hou':
                    		now.setHours(now.getHours() + num);
                        break;
                    
                    	case 'min':
                    		now.setMinutes(now.getMinutes() + num);
                        break;
                    
                    	case 'sec':
                    		now.setSeconds(now.getSeconds() + num);
                        break;
        			}
        		} else {
        			return false;
        		}
        	break;
		}
		
		return true;
	};
	
	match = strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/);
	if (match != null) {
		if (!match[2]) match[2] = '00:00:00';
        else if (!match[3]) match[2] += ':00';
		
        s = match[1].split(/-/g);
        
        for (i in __is.mon) {
        	if (__is.mon[i] == s[1] - 1) s[1] = i;
        }
        
        s[0] = parseInt(s[0], 10); 
        s[0] = (s[0] >= 0 && s[0] <= 69) ? '20'+(s[0] < 10 ? '0'+s[0] : s[0]+'') : (s[0] >= 70 && s[0] <= 99) ? '19'+s[0] : s[0]+'';
        
        return parseInt(this.strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2])+(match[4] ? match[4]/1000 : ''), 10);
	}
    
	var regex = '([+-]?\\d+\\s'+
        '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+
        '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday'+
        '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday)'+
        '|(last|next)\\s'+        '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+
        '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday'+
        '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday))'+
        '(\\sago)?';
	
    match = strTmp.match(new RegExp(regex, 'gi')); // Brett: seems should be case insensitive per docs, so added 'i'
    
    if (match == null) return false;
    
    for (i = 0; i < match.length; i++) {
    	if (!process(match[i].split(' '))) return false;
    }
    
    return (now.getTime()/1000);
}

function arrayMerge() {
    var args = Array.prototype.slice.call(arguments);
    var retObj = {}, k, j = 0, i = 0;
    var retArr;
    
    for (i=0, retArr=true; i < args.length; i++) {
        if (!(args[i] instanceof Array)) {
            retArr=false;            
            break;
        }
    }
    
    if (retArr) return args;
    
    var ct = 0;
    
    for (i=0, ct=0; i < args.length; i++) {        
    	if (args[i] instanceof Array) for (j=0; j < args[i].length; j++) retObj[ct++] = args[i][j];
        else {            
        	for (k in args[i]) {
                if (this.is_int(k)) retObj[ct++] = args[i][k];
                else retObj[k] = args[i][k];
            }
        }
    }
    
    return retObj;
}

Array.prototype.nsort = function(sort_flags) {
	var valArr = [], keyArr = [], k = '', i = 0, sorter = false, that = this, populateArr = [];
	
	switch (sort_flags) {
		case 'SORT_STRING':
			sorter = function (a, b) {
                return that.strnatcmp(a, b);
            };
        break;
        
        case 'SORT_NUMERIC':
            sorter = function (a, b) {
                return (a - b);
            };
        break;
            
        case 'SORT_REGULAR':
        default:
            sorter = function (a, b) {
                if (a > b) return 1;
                if (a < b) return -1;
                return 0;
            };
        break;
    }
	
    for (k in this) {
        if (this.hasOwnProperty) valArr.push(this[k]);
    } 
    
    valArr.sort(sorter);
    for (i = 0; i < valArr.length; i++) if (isNumeric(valArr[i])) populateArr[i] = valArr[i];
    return populateArr;
}

Array.prototype.rsort = function(sort_flags)
{
	var inputArr = this;
	var valArr=[], keyArr=[], k, i, ret, sorter, that = this, strictForIn = false, populateArr = [];
	 
    switch (sort_flags) {
        case 'SORT_STRING':
            sorter = function (a, b) {
            	return that.strnatcmp(b, a);
            };
        break;
        
        case 'SORT_NUMERIC':
            sorter = function (a, b) {
                return (a - b);
            };
        break;
        
        case 'SORT_REGULAR':
        default:
            sorter = function (a, b) {
        		if (a > b) return 1;
                if (a < b) return -1;
                return 0;
            };
        break;
    } 
    
    var bubbleSort = function (keyArr, inputArr) {
        var i, j, tempValue, tempKeyVal;
        for (i = inputArr.length-2; i >= 0; i--) {
            for (j = 0; j <= i; j++) {
            	ret = sorter(inputArr[j+1], inputArr[j]);
                if (ret > 0) {
                    tempValue = inputArr[j];
                    inputArr[j] = inputArr[j+1];
                    inputArr[j+1] = tempValue;
                    tempKeyVal = keyArr[j];
                    keyArr[j] = keyArr[j+1];
                    keyArr[j+1] = tempKeyVal;
                }
            }
        }
    };
    
    for (k in inputArr) {
        if (inputArr.hasOwnProperty) {
        	valArr.push(inputArr[k]);
            keyArr.push(k);
        }
    }
    
    try { bubbleSort(keyArr, valArr); } catch (e) { return false; }
    
    return valArr;
}

Array.prototype.array_unique = function()
{
	var retArr = Array();
    var chkArr = this;
	
    for (var i = 0; i < chkArr.length; i++) {
    	if (chkArr[i] != "") {
    		if (!retArr.inArray(chkArr[i])) retArr.push(chkArr[i]);
    	}
    }
    
    return retArr;
}

Array.prototype.quickSort = function(compare,left,right)
{
	left = typeof(left) != 'undefined' ? left : 0;
	right = typeof(right) != 'undefined' ? right : this.length-1;
	
	var pivot;
	var l_hold;
	var r_hold;
	
	l_hold = left;
	r_hold = right;
	pivot = this[left];
	
	while (left < right ) {
		while (compare(this[right],pivot) && (left < right)) right--;
		if (left != right) {
			this[left] = this[right];
			left++;
		}
		
		while (compare(pivot,this[left]) && (left < right)) left++;
		if (left != right) {
			this[right] = this[left];
			right--;
		}
	}
	
	this[left] = pivot;
	
	pivot = left;
	left = l_hold
	right = r_hold;

	if (left < pivot) this.quickSort(compare,left, pivot-1);
	if (right > pivot) this.quickSort(compare,pivot+1, right);
}

Array.prototype.inArray = function(p_val)
{
	for (var i = 0, l = this.length; i < l; i++) if (this[i] == p_val) return true;
	return false;
}

Array.prototype.removeItems = function(item)
{
	var i = 0;
	while (i < this.length) {
		if (this[i] == item) {
			this.splice(i, 1);
		} else {
			i++;
		}
	}
	
	return this;
}

String.prototype.capFirst = function()
{
	return this.substr(0,1).toUpperCase()+this.substr(1);
}

String.prototype.trim = function()
{
    return this.replace(/^\s+|\s+$/,"");
}

String.prototype.substrCount = function(needle,offset,length)
{
	var pos = 0, cnt = 0;
	
	if (isNaN(offset)) offset = 0;
	if (isNaN(length)) length = 0;
	
	offset--;
	while((offset = this.indexOf(needle, offset+1)) != -1) {
		if (length > 0 && (offset+needle.length) > length) return false;
		else cnt++;
	}
	
	return cnt;
}

String.prototype.isDate = function()
{
	var txt = this;
	if (txt.length > 10 && txt.substr(10,1) == " ") txt = txt.substr(0,10);
	
	var objDate, mSeconds;  
	
	if (txt.length != 10) return false;  
	
	var year = txt.substr(0,4);  
	var month = txt.substr(5,2);  
	var day = txt.substr(8,2);  
	
	if (txt.substr(4,1) != '/') return false;  
	if (txt.substr(7,1) != '/') return false;  
	
	if (year < 999 || year > 3000) return false;  
	
	mSeconds = (new Date(year,month,day)).getTime();  
	
	objDate = new Date();  
	objDate.setTime(mSeconds);  
	
	if (objDate.getFullYear() != year) return false;  
	if (objDate.getMonth() != month) return false;  
	if (objDate.getDate() != day) return false;  
	
	return mSeconds;  
};

String.prototype.pad = function(len, chr, pos)
{
	if (!len || this.length >= len || !chr) return this;
	var str = new String(this);

	switch (pos) {
		case 'right':
			while (str.length < len) { str += chr };
		break;
		
		default: // left;
			var s = new String();
			while (s.length < (len - str.length)) s += chr;
			str = s.concat(str);
		break;
	}
	return str;
};

String.prototype.substrCount = function(haystack,needle,offset,length)
{
	var pos = 0, cnt = 0;
	
	if (isNaN(offset)) offset = 0;
	if (isNaN(length)) length = 0;
	
	offset--;
	while((offset = haystack.indexOf(needle, offset+1)) != -1)
	{
		if (length > 0 && (offset+needle.length) > length) return false;
		else cnt++;
	}
	
	return cnt;
};

String.prototype.strReplace = function(search,replace,subject)
{
	if (!subject) var subject = this;
	
	var ra = isArray(replace);
    var sa = isArray(subject);
    
	var search = [].concat(search);
    var replace = [].concat(replace);
    var i = (subject = [].concat(subject)).length;
 
    while (j = 0, i--) while (subject[i] = subject[i].split(search[j]).join(ra ? replace[j] || "" : replace[0]), ++j in search){};
     
    return sa ? subject : subject[0];
};

Date.prototype.format = function(format)
{
	var returnStr = '';
	var replace = Date.replaceChars;
	for (var i = 0; i < format.length; i++) {
		var curChar = format.charAt(i);
		if (replace[curChar])
			returnStr += replace[curChar].call(this);
		else
			returnStr += curChar;
	}
	return returnStr;
};

Date.prototype.parse = function(dateStr) {

	var a = dateStr.split(" ");
	if (!a[0]) return new Date();
	var d = a[0].split("-");
	if (!d[0]) return "";
	a[0] = new Array(d[1], d[2], d[0]).join("/");
	return new Date(a.join(" "));
};

Date.replaceChars =
{
	shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
	longMonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
	shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
	longDays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
	
	// Day
	d: function() { return (this.getDate() < 10 ? '0' : '') + this.getDate(); },
	D: function() { return Date.replaceChars.shortDays[this.getDay()]; },
	j: function() { return this.getDate(); },
	l: function() { return Date.replaceChars.longDays[this.getDay()]; },
	N: function() { return this.getDay() + 1; },
	S: function() { return (this.getDate() % 10 == 1 && this.getDate() != 11 ? 'st' : (this.getDate() % 10 == 2 && this.getDate() != 12 ? 'nd' : (this.getDate() % 10 == 3 && this.getDate() != 13 ? 'rd' : 'th'))); },
	w: function() { return this.getDay(); },
	z: function() { return "Not Yet Supported"; },
	// Week
	W: function() { return "Not Yet Supported"; },
	// Month
	F: function() { return Date.replaceChars.longMonths[this.getMonth()]; },
	m: function() { return (this.getMonth() < 9 ? '0' : '') + (this.getMonth() + 1); },
	M: function() { return Date.replaceChars.shortMonths[this.getMonth()]; },
	n: function() { return this.getMonth() + 1; },
	t: function() { return "Not Yet Supported"; },
	// Year
	L: function() { return "Not Yet Supported"; },
	o: function() { return "Not Supported"; },
	Y: function() { return this.getFullYear(); },
	y: function() { return ('' + this.getFullYear()).substr(2); },
	// Time
	a: function() { return this.getHours() < 12 ? 'am' : 'pm'; },
	A: function() { return this.getHours() < 12 ? 'AM' : 'PM'; },
	B: function() { return "Not Yet Supported"; },
	g: function() { return this.getHours() == 0 ? 12 : (this.getHours() > 12 ? this.getHours() - 12 : this.getHours()); },
	G: function() { return this.getHours(); },
	h: function() { return (this.getHours() < 10 || (12 < this.getHours() < 22) ? '0' : '') + (this.getHours() < 10 ? this.getHours() + 1 : this.getHours() - 12); },
	H: function() { return (this.getHours() < 10 ? '0' : '') + this.getHours(); },
	i: function() { return (this.getMinutes() < 10 ? '0' : '') + this.getMinutes(); },
	s: function() { return (this.getSeconds() < 10 ? '0' : '') + this.getSeconds(); },
	// Timezone
	e: function() { return "Not Yet Supported"; },
	I: function() { return "Not Supported"; },
	O: function() { return (this.getTimezoneOffset() < 0 ? '-' : '+') + (this.getTimezoneOffset() / 60 < 10 ? '0' : '') + (this.getTimezoneOffset() / 60) + '00'; },
	T: function() { return "Not Yet Supported"; },
	Z: function() { return this.getTimezoneOffset() * 60; },
	// Full Date/Time
	c: function() { return "Not Yet Supported"; },
	r: function() { return this.toString(); },
	U: function() { return this.getTime() / 1000; }
}

function Embedder(ref, clear, isText) {

	this.keys = {};
	this.keyLocs = [];
	this.statics = [];
	
	this.ref = (isText) ? ref : document.getElementById(ref).innerHTML;
	if (clear && !isText) this.ref.innerHTML = "";

	var cpat = /(\x40\x7b.+?\x7d)|(\x40\x257B.+\x257D)/g;
	var text = new String(this.ref);
	var splits = text.match(cpat);

	var start = 0;
	var loc;
	for (var i = 0; i < splits.length; i++) {
		loc = text.indexOf(splits[i], start);
		if (loc == 0) this.statics[0] = "";

		this.statics[i] = text.substring(start, loc);
		start = loc + splits[i].length;

		var key;
		if (splits[i].substring(0, 2) == '@{')
			key = splits[i].substring(2, splits[i].length - 1);
		else
			key = splits[i].substring(4, splits[i].length - 3);

		if (!this.keys[key]) this.keys[key] = {'__type' : "text", '__value' : ""};

		this.keyLocs[i] = key;
	}
	this.statics[this.statics.length] = text.substring(start);
}

Embedder.prototype.set = function(key, value, tag, attributes) {

	if (this.keys[key]) {
		var keyData = this.keys[key];
		keyData.__value = value;
		if (tag) {
			tag = tag.toLowerCase().trim();
			keyData.__type = (tag == 'text' || tag == 'none' || tag == '') ? 'text' : tag;
		}
		else keyData.__type = 'text';
		if (attributes) {
			for(var att in attributes) {
				keyData[att] = attributes[att];
			}
		}
	}
};

Embedder.prototype.get = function(key, formatted) {

	var keyData = this.keys[key];
	if (!formatted || keyData.__type == 'text') return keyData.__value;

	var pText = "<" + keyData.__type;
	for(var att in keyData) {
		if (att.substr(0,2) != '__') {
			pText += ' ' + att + '="' + keyData[att] + '"';
		}
	}
	pText += '>' + keyData.__value + '</' + keyData.__type + '>';
	return pText;
};

Embedder.prototype.keys = function() {

	var keys = [];
	for (var key in this.keys) keys[keys.length] = key;

	return keys;
};

Embedder.prototype.setAll = function(params, id) {

	id = (id) ? id + '_' : "";
	if (Object.isArray(params)) {
		for (var i = 0; i < params.length; i++)
			this.set(id + i, params[i]);

	}
	else if (typeof(params) == 'object') {
		for (var key in params) {
			var val = params[key];
			if (val instanceof Array || typeof(val) == 'object') 
				this.setAll(val, id + key);
			else
				this.set(key, id + val);
		}
	}
};

Embedder.prototype.render = function() {

	var txt = "";
	for (var i = 0; i < this.keyLocs.length; i++) {
		txt += this.statics[i];
		txt += this.get(this.keyLocs[i], true);
	}
	txt += this.statics[this.keyLocs.length];

	return txt;
};


var DatePicker = 
{
	d: new Array(),
	data: new Array(),
	dayArrayShort: new Array('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'),
	dayArrayMed: new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'),
	dayArrayLong: new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'),
	monthArrayShort: new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'),
	monthArrayMed: new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'),
	monthArrayLong: new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'),
	params: { format:'Y-m-d H:i:s', showTime:true, minuteIncrement:5 },
	
	init: function(event, fieldName, dateString, params)
	{
		event.cancelBubble = true;
		var e = (event.srcElement) ? event.srcElement : event.target;
		
		if ($('lang_text'))
		{
			this.monthArrayLong = [$('lang_January').innerHTML, $('lang_February').innerHTML, $('lang_March').innerHTML, $('lang_April').innerHTML, $('lang_May').innerHTML, $('lang_June').innerHTML, $('lang_July').innerHTML, $('lang_August').innerHTML, $('lang_September').innerHTML, $('lang_October').innerHTML, $('lang_November').innerHTML, $('lang_December').innerHTML];
			this.dayArrayMed = [$('lang_Sun').innerHTML, $('lang_Mon').innerHTML, $('lang_Tue').innerHTML, $('lang_Wed').innerHTML, $('lang_Thu').innerHTML, $('lang_Fri').innerHTML, $('lang_Sat').innerHTML];
		}
		
		if (params) for (var i in params) { this.params[i] = params[i]; }
		
		if (!this.data[fieldName]) this.data[fieldName] = (dateString) ? new Date(this.parseDate(dateString)) : new Date();
		this.d[fieldName] = new Date(this.data[fieldName].getTime());
		
		if (document.getElementById("dp_" + fieldName))
		{
			this.exit(fieldName);
		}
		else this.display(fieldName, e);
	},
	
	parseDate: function(dateStr)
	{
		var a = dateStr.split(" ");
		if (!a[0]) return "";
		var d = a[0].split("-");
		if (!d[0]) return "";
		a[0] = new Array(this.monthArrayShort[d[1] - 1], parseInt(d[2]), parseInt(d[0])).join(" ");
		return a.join(" ");
	},
	
	display: function(fieldName, parent)
	{
		var x = parent.offsetLeft;
		var y = parent.offsetTop + parent.offsetHeight;
		
		while (parent.offsetParent)
		{
			parent = parent.offsetParent;
			x += parent.offsetLeft;
			y += parent.offsetTop;
		}
		
		var node = document.createElement("div");
		node.setAttribute("id", "dp_" + fieldName);
		node.setAttribute("class", "dp_div");
		node.setAttribute("className", "dp_div");
		document.body.appendChild(node);
		
		var div = document.getElementById("dp_" + fieldName);
			
		with (div)
		{
			style.position = "absolute";
			style.left = x + "px";
			style.top = y + "px";
			style.zIndex = 1000000;
		}
		
		div.innerHTML = this.build(fieldName);
		
		if (navigator.userAgent.toLowerCase().indexOf("opera") != -1) return;
		
		try
		{
			if (!document.getElementById("dp_iframe_" + fieldName))
			{
				var newNode = document.createElement("iframe");
				newNode.setAttribute("id", "dp_iframe_" + fieldName);
				newNode.setAttribute("src", "javascript:false;");
				newNode.setAttribute("scrolling", "no");
				newNode.setAttribute ("frameborder", "0");
				document.body.appendChild(newNode);
			}
			
			var iframe = document.getElementById("dp_iframe_" + fieldName);

			try
			{
				with (iframe.style)
				{
					position = "absolute";
					width = div.offsetWidth;
					height = div.offsetHeight;
					top = div.style.top;
					left = div.style.left;
					zIndex = div.style.zIndex - 1;
					visibility = div.style.visibility;
					display = div.style.display;
				}
			} 
			catch(e) {}
		}
		catch (ee) {}
	},
	
	build: function(fieldName)
	{
		var d = this.d[fieldName];
		
		var crlf = "\r\n";
		var html = '<table class="dp_table">' + crlf;
		html += '<tbody>' + crlf;
		
		// header
		html += '<tr>' + crlf;
		html += '<td class="dp_btn" onclick="DatePicker.showHelp();" title="Help">?</td>' + crlf;
		html += '<td class="dp_month" colspan="5">' + this.monthArrayLong[d.getMonth()] +  '</td>' + crlf;
		html += '<td class="dp_btn" onclick="DatePicker.exit(\'' + fieldName + '\');" title="Close">x</td>' + crlf;
		html += '</tr>' + crlf;
		
		// next/prev month/year buttons
		html += '<tr>' + crlf;
		html += '<td class="dp_btn" onclick="DatePicker.setYear(event, -1);" title="Previous Year">&laquo;</td>' + crlf;
		html += '<td class="dp_btn" onclick="DatePicker.setMonth(event, -1);" title="Previous Month">&lt;</td>' + crlf;
		html += '<td class="dp_year" colspan="3">' + d.getFullYear() + '</td>' + crlf;
		html += '<td class="dp_btn" onclick="DatePicker.setMonth(event, 1);" title="Next Month">&gt;</td>' + crlf;
		html += '<td class="dp_btn" onclick="DatePicker.setYear(event, 1);" title="Next Year">&raquo;</td>' + crlf;
		html += '</tr>' + crlf;
		
		// spacer
		html += '<tr height="5" />' + crlf;
		
		// days of week
		html += '<tr>' + crlf;
		for (var i = 0; i < this.dayArrayMed.length; i++) {	html += '<td class="dp_wkdy">' + this.dayArrayMed[i] + '</td>' + crlf; }
		html += '</tr>' + crlf;
		
		html += '<tr id="dp_days">' + this.buildMonth(fieldName) + '</tr>' + crlf;
		
		// spacer
		html += '<tr height="5" />' + crlf;
		
		if (this.params.showTime)
		{
			// time
			html += '<tr>' + crlf;
			html += '<td colspan="7">';
			
			// ::hour
			html += '<select class="dp_select" onchange="DatePicker.setHour(event, this.selectedIndex);">' + crlf;
			
			var setVal = d.getHours();
			
			if (setVal > 11) setVal -= 12;
			
			for (var i = 0; i < 12; i++)
			{
				var selected = (setVal == i) ? " selected" : "";
				var txt = (i == 0) ? "12" : i.toString();
				if (txt.length < 2) txt = "0" + txt;
				
				html += '<option class="dp_select" value="' + i + '"' + selected + '>' + txt + '</option>' + crlf;
			}
			html += "</select>&nbsp;<b>:</b>&nbsp;" 
			
			// ::minute
			html += '<select class="dp_select" onchange="DatePicker.setMinute(event, this.options[this.selectedIndex].value);">' + crlf;
			
			var setVal = d.getMinutes();
			var inc = this.params.minuteIncrement;
			if (d.getMinutes() % inc > 0) setVal += (inc - (d.getMinutes() % inc));
			
			for (var i = 0; i < 60; i += inc)
			{
				var selected = (setVal == i) ? " selected" : "";
				var val = (i < 10) ? "0" + i.toString() : i.toString();
				html += '<option class="dp_select"' + selected + ' value="' + parseInt(val) + '">' + val + '</option>' + crlf;
			}
			html += '</select>&nbsp;';
			
			// ::meridian
			html += '<select class="dp_select" onchange="DatePicker.setMeridian(event, this.selectedIndex);">' + crlf;
			
			var meridianOptions = new Array("AM", "PM");
			var setVal = (d.getHours() < 12) ? 0 : 1;
				
			for (var i = 0; i < meridianOptions.length; i++)
			{
				var selected = (i == setVal) ? " selected" : "";
				html += '<option class="dp_select"' + selected + '>' + meridianOptions[i] + '</option>' + crlf;
			}
			html += '</select>';
			
			html += '</td>' + crlf;
			html += '</tr>' + crlf;
		}
		
		html += '</tbody>' + crlf;
		html += '</table>';
		
		return html;
	},
	
	buildMonth: function(fieldName)
	{
		var d = new Date(this.d[fieldName].getTime());
		d.setDate(1);
		
		var cols = 0;
		var html = "";
		
		var m = new Date(d.getTime());
		m.setMonth(m.getMonth() - 1);
		var daysInPrevMonth = 32 - new Date(m.getFullYear(), m.getMonth(), 32).getDate();
		
		for (var i = 0; i < d.getDay(); i++)
		{
			cols++;
			m.setDate(daysInPrevMonth - (d.getDay() - i) + 1);
	  		html += '<td class="dp_day">' + m.getDate() + '</td>';
		}
		
		do {
			cols++;
			var className = this.match(d, this.data[fieldName]) ? "dp_day_on" : "dp_day_off";
			var onClick = ' onclick="DatePicker.setDate(event, \'' + d.getDate() +  '\');DatePicker.exit(\'' + fieldName + '\');"';
			html += '<td class="' + className + '"' + onClick + '>' + d.getDate() + '</td>';
			if (d.getDay() == 6) html += '</tr><tr>';
			d.setDate(d.getDate() + 1);
		}
		while (d.getDate() > 1);
		
		if (cols < 42)
		{
			m = new Date(d.getTime());
			m.setMonth(d.getMonth());
			m.setDate(1);
			
			for (var i = cols; i < 42; i++)
			{
		  		html += '<td class="dp_day">' + m.getDate() + '</td>';
				if (m.getDay() == 6) html += '</tr><tr>';
				m.setDate(m.getDate() + 1);
			}
		}
		
		return html;
	},
	
	match: function(d1, d2)
	{
		return (d1.getFullYear() == d2.getFullYear() && d1.getMonth() == d2.getMonth() && d1.getDate() == d2.getDate());
	},
	
	setYear: function(event, val)
	{
		this.set(event, 'year', val);
	},
	
	setMonth: function(event, val)
	{
		this.set(event, 'month', val);
	},
	
	setDate: function(event, val)
	{
		this.set(event, 'date', val);
	},
	
	setHour: function(event, val)
	{
		this.set(event, 'hour', val);
	},
	
	setMinute: function(event, val)
	{
		this.set(event, 'minute', val);
	},
	
	setMeridian: function(event, val)
	{
		this.set(event, 'meridian', val);
	},
	
	set: function(event, key, val)
	{
		event.cancelBubble = true;
		var e = (event.srcElement) ? event.srcElement : event.target;
		
		var fieldName = this.getFieldName(event);
		var d = this.d[fieldName];
		var save = false;
		
		switch (key.toLowerCase())
		{
			case 'date':
				d.setDate(val);
				save = true;
			break;
			
			case 'month':
				d.setMonth(d.getMonth() + val);
				var arr = this.getElementsByClassName(e.parentNode.parentNode, "dp_month");
				if (arr[0]) arr[0].innerHTML = this.monthArrayLong[d.getMonth()];
				
				if (d.getMonth() == 0 && val > 0) { key = 'year'; val = 0; }
				else if (d.getMonth() == 11 && val < 0) { key = 'year'; val = 0; }
				else break;
			
			case 'year':
				d.setFullYear(d.getFullYear() + val);
				var arr = this.getElementsByClassName(e.parentNode.parentNode, "dp_year");
				if (arr[0]) arr[0].innerHTML = d.getFullYear();
			break;
			
			case 'minute':
				d.setMinutes(val);
				save = true;
			break;
			
			case 'hour':
				var childNodes = e.parentNode.childNodes;
				if (childNodes[childNodes.length - 1].selectedIndex == 1) val += 12; // adjust for meridian
				d.setHours(val);
				save = true;
			break;
			
			case 'meridian':
				if (val == 0 && d.getHours() > 11) d.setHours(d.getHours() - 12);
				else if (val == 1 && d.getHours() < 12) d.setHours(d.getHours() + 12);
				save = true;
			break;
		}
		
		if (save) this.data[fieldName] = new Date(d.getTime());
		
		var div = document.getElementById("dp_" + fieldName);
		div.innerHTML = this.build(fieldName);
	},
	
	getContainer: function(e, className)
	{
		var parent = e.parentNode;
		
		while (parent.nodeName.toLowerCase() != "body")
		{
			if (parent.className == className) break;
			parent = parent.parentNode;
		}
		
		return parent;
	},
	
	getFieldName: function(event)
	{
		event.cancelBubble = true;
		var e = (event.srcElement) ? event.srcElement : event.target;
		var parent = this.getContainer(e, "dp_div");
		return (parent.id) ? parent.id.substr(3) : "";
	},
	
	getElementsByClassName: function(parent, className)
	{
		if (!parent) var parent = document;
		var arr = new Array(); 
		var elements = parent.getElementsByTagName("*");
		
		for (var cls, i = 0; (e = elements[i]); i++)
		{
			if (e.className == className) arr[arr.length] = e;
		}
		return arr;
	},
	
	showHelp: function()
	{
		var crlf = "\r\n";
		var str = "Date Selection:" + crlf;
		str += "- Use the &laquo; and &raquo; buttons to change the year." + crlf;
		str += "- Use the &lt; and &gt; buttons to change the month." + crlf;
		
		var html_entity_decode = function(s)
		{
			var ta = document.createElement("textarea");
  			ta.innerHTML = s.replace(/</g, "&lt;").replace(/>/g, "&gt;");
  			return ta.value;
		};
		
		alert(html_entity_decode(str));
	},
	
	update: function(fieldName)
	{
		var d = this.data[fieldName];
		$(fieldName).value = d.format(this.params.format);

        // fire change event
        if (document.createEventObject){
            // dispatch for IE
            var evt = document.createEventObject();
            $(fieldName).fireEvent('onchange', evt);
        }
        else
        {
            // dispatch for firefox + others
            var evt = document.createEvent("HTMLEvents");
            evt.initEvent('change', true, true ); // event type,bubbling,cancelable
            $(fieldName).dispatchEvent(evt);
        }
	},

	exit: function(fieldName)
	{
		this.update(fieldName);
		
		var div = document.getElementById("dp_" + fieldName);
		if (div) div.parentNode.removeChild(div);
		
		var iframe = document.getElementById("dp_iframe_" + fieldName);
		if (iframe) iframe.parentNode.removeChild(iframe);

	}
};


__RDatePickers = {};

RDatePicker.prototype.dayList = {
	short : ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
	medium : ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
	long : ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
};

RDatePicker.prototype.monthList = {
	short : ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
	medium : ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'],
	long: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
};

RDatePicker.prototype.options = { 
	format : 'Y-m-d H:i:s', 
	showTime : true, 
	minuteIncrement : 5,
	multiselect : false,
	allowPast : false,
	forwardLimit : new Date('Jan 1, 2020'),
	backLimit : new Date('Jan 1, 1998'),
	minDate: new Date(),
	fButtonsDisabled : "",
	bButtonsDisabled : "",
	callback: null,
	
	choose_message : "Choose a Day & Time",
	prev_year : "Previous Year",
	prev_month : "Previous Month",
	next_month : "Next Month",
	next_year : "Next Year",
	all_day : "All day",
	cancel : "Cancel",
	save : "Save",
	dow : RDatePicker.prototype.dayList['medium']
};

/*
 * month_long
 * full_year
 */
RDatePicker.prototype.source = new Embedder(
	'<div class=" border" id="calendar" style="width:280px; position:relative;"><div class="popup">'+
	'<table class="dpt_table">' + 
	'<tbody><tr><td colspan="7" style="border:none; text-align:left;"><h2 style="margin-bottom:0px; width:250px;">@{choose_message}</h2><a onclick="RDatePicker.prototype.cancel(\'@{id}\');"><img src="' + App.getCDN() + '/core/images/hide.png" class="closepopup" alt="hide" /></a></td></tr>' +
	
	// next/prev month/year buttons
	//'<!--tr class="dpt_month"><td><button id="@{id}_back12" class="dpt_btn" @{bButtonsDisabled} onclick="RDatePicker.prototype.move(\'@{id}\', -12)" title="@{prev_year}">&lt;&lt;</button></td-->' +
	'<td colspan="7" style="border:none;"><div class="month" style="width:250px;"><a id="@{id}_back1" @{bButtonsDisabled} onclick="RDatePicker.prototype.move(\'@{id}\', -1)" title="@{prev_month}"><img src="' + App.getCDN() + '/core/images/arrow-left.png" alt="arrow" /></a><span>@{month_long} @{year_long}</span><a id="@{id}_forward1" @{fButtonsDisabled} onclick="RDatePicker.prototype.move(\'@{id}\', 1)" title="@{next_month}"><img src="' + App.getCDN() + '/core/images/arrow-right.png" alt="arrow" /></a></div></td>' + 
	//'<!--td><button id="@{id}_forward12" class="dpt_btn" @{fButtonsDisabled} onclick="RDatePicker.prototype.move(\'@{id}\', 12)" title="@{next_year}">&gt;&gt;</button></td--></tr>' + 

	// days of week
	'<tr><td class="day">@{dow_0}</td><td class="day">@{dow_1}</td>' + 
	'<td class="day">@{dow_2}</td><td class="day">@{dow_3}</td>' +
	'<td class="day">@{dow_4}</td><td class="day">@{dow_5}</td>' +
	'<td class="day">@{dow_6}</td></tr>' +
	
	'@{monthdata}' +
	
	// spacer
	'<tr>@{timepicker}</tr>' +
	//'<!--tr><td colspan="7" style="text-align: center"><input type="button" value="Save" style="margin-top:15px;" onclick="RDatePicker.prototype.save(\'@{id}\');"/>&nbsp;' +
	//'<input type="button" value="Cancel" onclick="RDatePicker.prototype.cancel(\'@{id}\');"/></td></tr-->' +
	'<tr><td colspan="7" style="border:none;"><input id="calcancel" type="button" class="big-btn cancel-btn" value="@{cancel}" onclick="RDatePicker.prototype.cancel(\'@{id}\');"/> <input id="calsave" type="button" class="big-btn submit-btn" value="@{save}" onclick="RDatePicker.prototype.save(\'@{id}\');"/></td></tr>' + 
	'</table></div></div>', false, true);


RDatePicker.prototype.cleanDate = function(dt, truncToDay) {

	var tgt;
	if (dt instanceof Date) tgt = new Date(dt.getTime());
	else if (dt instanceof String) tgt = new Date(dt);
	else if (!isNaN(dt)) tgt = new Date(dt);
	else tgt = new Date();

	if (truncToDay) tgt.setHours(0, 0, 0, 0);
	return tgt; 
};

RDatePicker.prototype.getTimePicker = function() {

	var t = '<tr><td colspan="7" style="height:5px; border:none;"></td></tr><tr><td colspan="7" style="border:none;"><span style="float:left;"><input type="checkbox" name="allday" value="All day" id="allday" class="checkbox" onclick="if($(this).checked) { $(\'@{id}_span\').hide(); } else { $(\'@{id}_span\').show(); }" /> <label for="allday" style="font-size:12px; font-weight:normal;">@{all_day}</label></span><span id="@{id}_span" style="float:right;">';
	t += '<select id="@{id}_hour" class="dpt_select" onchange="if(this.value!=\'x\') RDatePicker.prototype.setTime(\'@{id}\', this.value, \'hour\', true);">';
	
	t += '<option value="x"></option>';
	for (var i = 1; i <= 12; i++)
	{
		//var txt = (i == 0) ? "12" : i.toString();
		var txt = i.toString();
		//if (txt.length < 2) txt = "0" + txt;
		var val = (i==12) ? 0 : i;
		t += '<option value="' + val + '">' + txt + '</option>';
	}
	t += "</select>&nbsp;<b>:</b>&nbsp;";
	
	// ::minute
	t += '<select id="@{id}_minute" class="dpt_select" onchange="if(this.value!=\'x\') RDatePicker.prototype.setTime(\'@{id}\', this.options[this.selectedIndex].value, \'minute\', true);">';
	
	t += '<option value="x"></option>';
	var inc = this.options.minuteIncrement;
	for (var i = 0; i < 60; i += inc)
	{
		var val = (i < 10) ? "0" + i.toString() : i.toString();
		t += '<option value="' + parseInt(val) + '">' + val + '</option>';
	}
	t += '</select>&nbsp;';
	
	// ::meridian
	t += '<select id="@{id}_meridian" class="dpt_select" onchange="if(this.value!=\'x\') RDatePicker.prototype.setTime(\'@{id}\', this.value, \'meridian\', true);">';
	t += '<option value="x"></option>';
	t += '<option value="0">AM</option><option value="1">PM</option></select></span></td></tr>';
	return new Embedder(t, false, true); 
};


RDatePicker.prototype.move = function(ref, distance) {

	if (!(ref instanceof RDatePicker)) ref = __RDatePickers[ref];
	if (!(ref instanceof RDatePicker)) return;

	var newDt = ref.dispDate;
	newDt.setHours(0, 0, 0, 0);
	newDt.setMonth(ref.dispDate.getMonth() + distance);
	newDt.setDate(1);
	if (this.options['forwardLimit'] && distance > 0) {
		var ldt = this.cleanDate(this.options['forwardLimit'], true);
		ldt.setDate(1);
	//	if (newDt.getTime() > ldt.getTime()) {
	//		newDt = ldt;
	//		this.options.fButtonsDisabled = "disabled";
	//	}
	}
	else {
		this.options.fButtonsDisabled = "";
	}

	if (this.options['backLimit'] && distance < 0) {
		var ldt = this.cleanDate(this.options['backLimit'], true);
		ldt.setDate(1);
	//	if (newDt.getTime() < ldt.getTime()) {
	//		this.options.bButtonsDisabled = "disabled";
	//		newDt = ldt;
	//	}
	}
	else {
		this.options.bButtonsDisabled = "";
	}
	
	today = new Date();
	if(newDt < today && !this.options['allowPast']) newDt = today;
	ref.dispDate = newDt;
	ref.selectDates[0] = newDt;
	ref.render(ref.selectDates[0], ref.dispDate);
	//$('allday').click();
	if ($('sug_date_hour')) $('sug_date_hour').value="x";
	if ($('sug_date_minute')) $('sug_date_minute').value="x";
	if ($('sug_date_meridian')) $('sug_date_meridian').value="x";
};

RDatePicker.prototype.save = function(ref) {

	if (!(ref instanceof RDatePicker)) ref = __RDatePickers[ref];
	if (!(ref instanceof RDatePicker)) return;
	
	if($('allday'))
	{
		if($('allday').checked)
		{
			ref.selectDates[0].setHours(0, 0, 0, 0);
		}
	}
	
	if($('sug_date_hour') && $('sug_date_minute') && $('sug_date_meridian'))
	{
		if($('sug_date_hour').value=="x" && $('sug_date_minute').value=="x" && $('sug_date_meridian').value=="x")
		{
			ref.selectDates[0].setHours(0, 0, 0, 0);
		}
	}
	
	if(this.options['target']) {
		$(ref.options['target']).value = ref.selectDates[0].format(ref.options.format);
	}
	ref.startDate = ref.selectDates[0];
	ref.node.style.display = "none";
	//document.body.removeChild(ref.node);
	ref.node.hide();
	if (ref.options['callback']) ref.options.callback(ref.selectDates[0], 'save');
	__RDatePickers[ref.id] = null;
};


RDatePicker.prototype.cancel = function(ref) {

	if (!(ref instanceof RDatePicker)) ref = __RDatePickers[ref];
	if (!(ref instanceof RDatePicker)) return;
	//document.body.removeChild(ref.node);
	ref.node.hide();
	__RDatePickers[ref.id] = null;
	ref.selectDates[0] = ref.startDate;
	if (ref.options['callback']) ref.options.callback(ref.selectDates[0], 'cancel');
};


RDatePicker.prototype.parse = function(dateStr) {

	var a = dateStr.split(" ");
	if (!a[0]) return "";
	var d = a[0].split("-");
	if (!d[0]) return "";
	a[0] = new Array(this.monthList.short[d[1] - 1], Number(d[2]), Number(d[0])).join(" ");
	return a.join(" ");
};

RDatePicker.prototype.pickDate = function(ref, newDate) {

	if (!(ref instanceof RDatePicker)) ref = __RDatePickers[ref];
	if (!(ref instanceof RDatePicker)) return;

	newDate = this.cleanDate(newDate, true);
	var oldDate = this.cleanDate(ref.selectDates[0].getTime(), true);

	if ($(ref.id + "_" + oldDate.getTime())) {
		if (oldDate.getFullYear() != ref.dispDate.getFullYear() || 
				oldDate.getMonth() != ref.dispDate.getMonth())
			$(ref.id + "_" + oldDate.getTime()).className = "dpt_offmonthday";
		else
			$(ref.id + "_" + oldDate.getTime()).className = "dpt_day";
	}
	newDate.setHours(ref.selectDates[0].getHours(), ref.selectDates[0].getMinutes());
	ref.selectDates[0] = newDate;

	today = new Date();
	if(ref.selectDates[0] < today && !this.options['allowPast'])
	{
		ref.selectDates[0] = today;
		if (this.options['showTime']) {
		$('sug_date_hour').value=ref.selectDates[0].getHours();
			$('sug_date_minute').value=ref.selectDates[0].getMinutes();
			if(ref.selectDates[0].getHours()>11)
				$('sug_date_meridian').value=0;
			else
				$('sug_date_meridian').value=1;
		}
	}
	
	var chk = this.cleanDate(newDate, true);
	if ($(ref.id + "_" + chk.getTime())) $(ref.id + "_" + chk.getTime()).className = "today";
	if (ref.options['callback']) ref.options.callback(ref.selectDates[0], 'pickdate');
	
};


RDatePicker.prototype.setTime = function(ref, val, type, isuser) {

	if (!(ref instanceof RDatePicker))
		ref = __RDatePickers[ref];
	if (!(ref instanceof RDatePicker)) return;
	
	type = (type) ? new String(type).toLowerCase() : 'full';
	switch(type) {
	case 'full':
		if (!(val instanceof Date)) val = new Date(val);
		var mVal = val.getMinutes();
		while(mVal%5!=0)
			mVal++;
		ref.selectDates[0].setHours(val.getHours(), mVal);//val.getMinutes(), val.getSeconds());
		break;
	case 'hour':
		val = new Number(val);
		ref.selectDates[0].setHours((ref.selectDates[0].getHours() > 12) ? val + 12 : val);
		break;
	case 'minute':
		val = new Number(val);
		ref.selectDates[0].setMinutes(val);
		break;
	case 'meridian':
		val = new Number(val);
		if (val == 1) {
			if (ref.selectDates[0].getHours() < 12) 
				ref.selectDates[0].setHours(ref.selectDates[0].getHours() + 12);
		}
		else {
			if (ref.selectDates[0].getHours() > 11) 	
				ref.selectDates[0].setHours(ref.selectDates[0].getHours() - 12);
		}
		break;
	}

	today = new Date();
	//alert(ref.selectDates[0]);
	if(ref.selectDates[0]<today) ref.selectDates[0] = today;
	
	if (this.options.showTime) {
		var hr = ref.selectDates[0].getHours();
		if(hr>=12) hr = hr - 12;
		$(ref.id + '_hour').value = hr;
		
		var mVal = ref.selectDates[0].getMinutes();
		for (var i = 0; i < $(ref.id + '_minute').options.length; i++) {
			var v = new Number($(ref.id + '_minute').options[i].value);
			if (new Number($(ref.id + '_minute').options[i].value) >= mVal || 
					i == $(ref.id + '_minute').options.length - 1) {
				$(ref.id + '_minute').selectedIndex = i;
				break;
			}
		}
		$(ref.id + '_meridian').value = (ref.selectDates[0].getHours() > 11) ? 1 : 0;
		if (ref.options['callback'] && isuser) 
			ref.options.callback(ref.selectDates[0], 'picktime');
	}
};

RDatePicker.prototype.render = function(dt, dispDate)
{
	if ($('lang_text'))
	{
		this.monthList.long = [$('lang_January').innerHTML, $('lang_February').innerHTML, $('lang_March').innerHTML, $('lang_April').innerHTML, $('lang_May').innerHTML, $('lang_June').innerHTML, $('lang_July').innerHTML, $('lang_August').innerHTML, $('lang_September').innerHTML, $('lang_October').innerHTML, $('lang_November').innerHTML, $('lang_December').innerHTML];
		this.dayList.medium = [$('lang_Sun').innerHTML, $('lang_Mon').innerHTML, $('lang_Tue').innerHTML, $('lang_Wed').innerHTML, $('lang_Thu').innerHTML, $('lang_Fri').innerHTML, $('lang_Sat').innerHTML];
		
		this.options.choose_message = $('lang_choose_message').innerHTML;
		this.options.prev_year = $('lang_prev_year').innerHTML;
		this.options.prev_month = $('lang_prev_month').innerHTML;
		this.options.next_month = $('lang_next_month').innerHTML;
		this.options.next_year = $('lang_next_year').innerHTML;
		this.options.all_day = $('lang_all_day').innerHTML;
		this.options.cancel = $('lang_cancel').innerHTML;
		this.options.save = $('lang_save').innerHTML;
		this.options.dow = this.dayList.medium;
	}
	
	if (!dt) dt = this.selectDates[0];
	else if (!(dt instanceof Date)) dt = new Date(dt);
	if (!dispDate) dispDate = new Date(dt.getTime());

	this.dispDate = dispDate;
	this.source.setAll(this.options);
	this.source.set('monthdata', this.buildMonth(dispDate, dt));
	this.source.set('month_long', this.monthList['long'][dispDate.getMonth()]);
	this.source.set('year_long', dispDate.getFullYear());
	this.source.set('id', this.id);

	if (this.options.showTime) {
		var tp = this.getTimePicker();
		tp.set('id', this.id);
		tp.set('all_day', $('lang_all_day').innerHTML);
		this.source.set('timepicker', tp.render());
	}
	this.node.innerHTML = this.source.render();
	this.node.style.display = "block";
	if (this.options.showTime) this.setTime(this, dt);
};

RDatePicker.prototype.buildMonth = function(dispDate, dt) {

	var today = this.cleanDate(dispDate, true);;

	dt = (dt instanceof Date) ? new Date(dt.getTime()) : new Date(dispDate.getTime());
	dt.setHours(0, 0, 0, 0);
	
	var d = this.cleanDate(dispDate, true);
	if (d.getDay() != 0) {
		d.setDate(0);
		d.setDate(d.getDate() - d.getDay());
	}
		
	var cols = 0;
	var t = "";
	var minDate = (this.options['minDate']) ? 
			this.cleanDate(this.options['minDate'], true) : this.cleanDate(new Date(), true);

	while ((d.getFullYear() == today.getFullYear() &&
			d.getMonth() <= today.getMonth()) || d.getFullYear() < today.getFullYear()) {
		t += "<tr>";
		for (var i = 0; i < 7; i++) {
			
			var cellId = this.id + "_" + d.getTime(); 
			var disabled = (d.getTime() < minDate && !this.options['allowPast']) ? "_disabled" : "";
			t += "<td id='" + cellId + "' class="; 
			
			if (d.toDateString() == dt.toDateString())
				t += "'today'";
			else if (d.getMonth() != today.getMonth())
			{
				disabled = "_disabled";
				t += "'dpt_offmonthday" + disabled + "'";
			}
			else 
				t += "'dpt_day" + disabled + "'";  

			if (!disabled) t += " onmousedown='RDatePicker.prototype.pickDate(\"" + this.id + "\", " + d.getTime() + ")'"; 
			t += ">" + d.getDate() + "</td>";		
			d.setDate(d.getDate() + 1);
		}
		t += "</tr>";
	}
	return t;
};

RDatePicker.prototype.getDate = function(ind) {
	return this.selectDates[0];
};

function RDatePicker(id, parent, selectDates, target, options) {

	this.parent = (parent) ? $(parent) : document;
	if (options) {
		for (op in options)
			this.options[op] = options[op];
	}

	if ($(target)) this.options['target'] = target;
	this.id = id;
	
	// Generate container
//	this.node = document.createElement('DIV');
//	this.node.setAttribute("id", "dtp_" + id);
//	this.node.setAttribute("className", "dpt_div");
//	this.node.setAttribute("style", "position:absolute; display:none; z-index:98;");
//	if(window.innerWidth) var w = window.innerWidth;
//	else var w = document.documentElement.clientWidth;
//	this.node.style.left = ((w/2)-(320/2))+"px";//options['left']+"px";//"0px";//((document.body.clientWidth - 210) / 2  + document.body.scrollLeft) + "px";
//	var scrollOffsets = document.viewport.getScrollOffsets();
//	this.node.style.top = (scrollOffsets[1]+((document.viewport.getHeight()/2)-(500/2)))+"px";//options['top']+"px";//"0px";//((document.body.clientHeight - 300) / 2 + document.body.scrollTop) + "px";
//	//document.body.appendChild(this.node);
//	$('body').insertBefore(this.node,$('body').childNodes[0]);

	this.node = $('dtp_sug_date');
	//if(window.innerWidth) var w = window.innerWidth;
	//else var w = document.documentElement.clientWidth;alert(w);
	//var w = this.node.parentNode.style.width; alert(w);
	this.node.style.left = "300px";//((w/2)-140)+"px";//options['left']+"px";//"0px";//((document.body.clientWidth - 210) / 2  + document.body.scrollLeft) + "px";
	var scrollOffsets = document.viewport.getScrollOffsets();
	this.node.style.top = "-100px"//(scrollOffsets[1]+((document.viewport.getHeight()/2)-(500/2)))+"px";//options['top']+"px";//"0px";//((document.body.clientHeight - 300) / 2 + document.body.scrollTop) + "px";
	
	if (__RDatePickers[id]) {
		__RDatePickers[id].cancel(id);
	}
	__RDatePickers[id] = this;
	
	if (selectDates) {
		this.selectDates = selectDates;
	}
	else if ($(target)) {
		this.selectDates = [new Date(this.parse(String($(target).value)))];
	}
	else
		this.selectDates = [new Date()];

	if(this.selectDates[0] == "Invalid Date" || isNaN(this.selectDates[0])) 
		this.selectDates = [new Date()];
	this.startDate = this.selectDates[0];
	this.dispDate = new Date(this.selectDates[0].getTime());
	
	this.options['backLimit'] = this.dispDate;
}


var ChallengeDatePicker = 
{
	d: new Array(),
	data: new Array(),
	dayArrayShort: new Array('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'),
	dayArrayMed: new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'),
	dayArrayLong: new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'),
	monthArrayShort: new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'),
	monthArrayMed: new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'),
	monthArrayLong: new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'),
	params: { format:'Y-m-d H:i:s', showTime:true, minuteIncrement:5 },
	reporting: new Array(),
	needed: new Array(),
	customer_support_user_id: '',
	
	init: function(e, fieldName, dateString, params, dateDiv, dropdown, dateField)
	{
		this.dateDiv = dateDiv;
		this.dropdown = dropdown;
		this.dateField = dateField;
		//this.reporting = reporting;
		//this.needed = needed;
		//this.customer_support_user_id = customer_support_user_id;
		//this.user_id = user_id;
		//event.cancelBubble = true;
		//var e = (event.srcElement) ? event.srcElement : event.target;
		
		if($('challenge_hour'))
			$('challenge_hour').value = '';
		
		if($('challenge_minutes'))
			$('challenge_minutes').value = '';
		
		if($('am_pm'))
			$('am_pm').value = 'AM';
		
		if (params) for (var i in params) { this.params[i] = params[i]; }

		this.data[fieldName] = new Date();
//		if (!this.data[fieldName]) this.data[fieldName] = (dateString) ? new Date(this.parseDate(dateString)) : new Date();
		this.d[fieldName] = new Date(this.data[fieldName].getTime());
		//ChallengeDatePicker.setDate('', this.d[fieldName].getDate());
		//ChallengeDatePicker.trackingDateSelected(this.d[fieldName].getDate(), (this.d[fieldName].getMonth()+1), this.d[fieldName].getFullYear());
//
//		mysql_date = getRealDate(this.d[fieldName], true);
//		
//		var today = new Date();
//		today.setSeconds(0);
//		today.setMinutes(0);
//		today.setHours(0);
//		var temp = this.d[fieldName];
//		temp.setSeconds(0);
//		temp.setMinutes(0);
//		temp.setHours(0);
//		var difference = temp - today;
//		var diff_days = Math.round(difference/(1000*60*60*24));
//		if(diff_days>0)
//		{
//			//alert("no dice!");
//			$('tracking_right_side').hide();
//			$('no_tracking').show();
//		}
//		else
//		{
//			$('no_tracking').hide();
//			$('tracking_right_side').show();
//		}
		
		//load the tracking data via ajax
//		App.onSuccess = function(response) {
//                        $('save_reported_data').style.display = "block";
//
//			responses = response.split('~');
//			responses.each(function(e)
//			{
//                            var parts = e.split('::');
//                            if (parts.length > 0) {
//                                if (parts[0].indexOf("ch") > -1) {
//                                    if ($(parts[0]+'_yes') || $(parts[0]+'_no')) {
//                                        if(parts[1]==1) $(parts[0]+'_yes').checked = true;
//                                        else $(parts[0]+'_no').checked = true;
//                                    } else if ($(parts[0]+"_txt")) {
//                                        if (parts[1] > 0) $(parts[0]+"_txt").innerHTML = "<strong>You have already tracked your "+$(parts[0]+"_sub").innerHTML+"!</strong>";
//                                        else $(parts[0]+"_txt").innerHTML = "Click here to track your "+$(parts[0]+"_sub").innerHTML+"...";
//                                        //$('save_reported_data').style.display = "none";
//                                    }
//                                } else if ($(parts[0])) $(parts[0]).value = parts[1];
//                                if(parts[2])
//                                {
//                                	var ps = parts[0].split('|');
//                                	if($('scdi_'+ps[1]))
//                                		$('scdi_'+ps[1]).innerHTML = parts[2];
//                                }
//                            }
//			});
//		}
		
//		App.request('/cp/TrackData', 'POST', {'do':'get_data', 'data_date':mysql_date, 'user_id':this.user_id, 'customer_support_user_id':this.customer_support_user_id});
		
//		$('big_date').innerHTML = this.getBigDate(this.d[fieldName]);
//		$('data_date').value = mysql_date;
		
//		if (document.getElementById("dp_" + fieldName))
//		{
//			//this.exit(fieldName);
//		}
//		else
		this.display(fieldName, e);
	},
	
	parseDate: function(dateStr)
	{
		var a = dateStr.split(" ");
		if (!a[0]) return "";
		var d = a[0].split("-");
		if (!d[0]) return "";
		a[0] = new Array(this.monthArrayShort[d[1] - 1], parseInt(d[2]), parseInt(d[0])).join(" ");
		return a.join(" ");
	},
	
	display: function(fieldName, parent)
	{
		var x = parent.offsetLeft;
		var y = parent.offsetTop + parent.offsetHeight;
		
		while (parent.offsetParent)
		{
			parent = parent.offsetParent;
			x += parent.offsetLeft;
			y += parent.offsetTop;
		}
		
		//alert(parent.id);
		//var node = document.createElement("input");
		//$('calendar_div').appendChild(node);
		
		var node = document.createElement("div");
		node.setAttribute("id", "dp_" + fieldName);
		node.setAttribute("class", "dp_div");
		node.setAttribute("className", "dp_div");
		$('calendar_div').appendChild(node);
		
		var div = document.getElementById("dp_" + fieldName);
			
//		with (div)
//		{
//			style.border = "1px solid blue";
//			style.position = "absolute";
//			//style.left = x + "px";
//			//style.top = y + "px";
//			//style.zIndex = 999;
//		}
		
		div.innerHTML = this.build(fieldName);
		
		if (navigator.userAgent.toLowerCase().indexOf("opera") != -1) return;
		
		try
		{
//			if (!document.getElementById("dp_iframe_" + fieldName))
//			{
//				var newNode = document.createElement("iframe");
//				newNode.setAttribute("id", "dp_iframe_" + fieldName);
//				newNode.setAttribute("src", "javascript:false;");
//				newNode.setAttribute("scrolling", "no");
//				newNode.setAttribute ("frameborder", "0");
//				document.body.appendChild(newNode);
//			}
//			
//			var iframe = document.getElementById("dp_iframe_" + fieldName);
//
//			try
//			{
//				with (iframe.style)
//				{
//					position = "absolute";
//					width = div.offsetWidth;
//					height = div.offsetHeight;
//					top = div.style.top;
//					left = div.style.left;
//					zIndex = div.style.zIndex - 1;
//					visibility = div.style.visibility;
//					display = div.style.display;
//				}
//			} 
//			catch(e) {}
		}
		catch (ee) {}
	},
	
	build: function(fieldName)
	{
		var d = this.d[fieldName];
		
		var crlf = "\r\n";
		var html = '<table class="dpc_table" style="width:270px; font-size:14px;">' + crlf;
		html += '<tbody>' + crlf;
		html += '<tr><td colspan="7" style="font-size:16px; font-weight:bold;">Choose a Day</td></tr>' + crlf;
		
		// header
		html += '<tr>' + crlf;
		html += '' + crlf;
		html += '<td class="dp_month" colspan="7" style="padding-left:8px;">' + this.monthArrayLong[d.getMonth()] +  '</td>' + crlf;
		html += '' + crlf;
		html += '</tr>' + crlf;
		
		// next/prev month/year buttons
		html += '<tr>' + crlf;
		html += '<td class="dp_btn" style="border-right:none; width:40px;" onclick="ChallengeDatePicker.setYear(event, -1);" title="Previous Year">&laquo;</td>' + crlf;
		html += '<td class="dp_btn" style="width:40px;" onclick="ChallengeDatePicker.setMonth(event, -1);" title="Previous Month">&lt;</td>' + crlf;
		html += '<td class="dp_year" colspan="3">' + d.getFullYear() + '</td>' + crlf;
		html += '<td class="dp_btn" style="width:40px;" onclick="ChallengeDatePicker.setMonth(event, 1);" title="Next Month">&gt;</td>' + crlf;
		html += '<td class="dp_btn" style="border-left:none; width:40px;" onclick="ChallengeDatePicker.setYear(event, 1);" title="Next Year">&raquo;</td>' + crlf;
		html += '</tr>' + crlf;
		
		// spacer
		html += '<tr height="5" />' + crlf;
		
		// days of week
		html += '<tr>' + crlf;
		for (var i = 0; i < this.dayArrayMed.length; i++)
		{
			if(i>0)
				html += '<td class="dp_wkdy" style="border-left:none; width:40px;">' + this.dayArrayMed[i] + '</td>' + crlf;
			else
				html += '<td class="dp_wkdy" style="width:40px;">' + this.dayArrayMed[i] + '</td>' + crlf;
		}
		html += '</tr>' + crlf;
		
		html += '<tr id="dp_days">' + this.buildMonth(fieldName) + '</tr>' + crlf;
		
		// spacer
		html += '<tr height="5" />' + crlf;
		
		if (this.params.showTime)
		{
			// time
			html += '<tr>' + crlf;
			html += '<td colspan="7">';
			
			// ::hour
			html += '<select class="dp_select" onchange="DatePicker.setHour(event, this.selectedIndex);">' + crlf;
			
			var setVal = d.getHours();
			
			if (setVal > 11) setVal -= 12;
			
			for (var i = 0; i < 12; i++)
			{
				var selected = (setVal == i) ? " selected" : "";
				var txt = (i == 0) ? "12" : i.toString();
				if (txt.length < 2) txt = "0" + txt;
				
				html += '<option class="dp_select" value="' + i + '"' + selected + '>' + txt + '</option>' + crlf;
			}
			html += "</select>&nbsp;<b>:</b>&nbsp;" 
			
			// ::minute
			html += '<select class="dp_select" onchange="DatePicker.setMinute(event, this.options[this.selectedIndex].value);">' + crlf;
			
			var setVal = d.getMinutes();
			var inc = this.params.minuteIncrement;
			if (d.getMinutes() % inc > 0) setVal += (inc - (d.getMinutes() % inc));
			
			for (var i = 0; i < 60; i += inc)
			{
				var selected = (setVal == i) ? " selected" : "";
				var val = (i < 10) ? "0" + i.toString() : i.toString();
				html += '<option class="dp_select"' + selected + ' value="' + parseInt(val) + '">' + val + '</option>' + crlf;
			}
			html += '</select>&nbsp;';
			
			// ::meridian
			html += '<select class="dp_select" onchange="DatePicker.setMeridian(event, this.selectedIndex);">' + crlf;
			
			var meridianOptions = new Array("AM", "PM");
			var setVal = (d.getHours() < 12) ? 0 : 1;
				
			for (var i = 0; i < meridianOptions.length; i++)
			{
				var selected = (i == setVal) ? " selected" : "";
				html += '<option class="dp_select"' + selected + '>' + meridianOptions[i] + '</option>' + crlf;
			}
			html += '</select>';
			
			html += '</td>' + crlf;
			html += '</tr>' + crlf;
		}
		
		html += '</tbody>' + crlf;
		html += '<tr><td colspan="7" style="font-size:12px; text-align:left;"><b>Time<b> <input id="challenge_hour" type="text" style="margin-left:5px; font-size:12px; width:18px;" size="2" maxlength="2"/> : <input id="challenge_minutes" type="text" style="font-size:12px; width:18px;" size="2" maxlength="2"> <select id="am_pm" style="font-size:12px;"><option value="AM" style="font-size:12px;">AM</option><option value="PM" style="font-size:12px;">PM</option></select> <span style="color:#999; font-weight:normal; font-size:10px;">(optional)</span></td></tr>';
		html += '<tr><td colspan="7"><input type="button" value="Save" style="margin-top:15px;" onclick="ChallengeDatePicker.doneDate();"/> <input type="button" value="Cancel" onclick="ChallengeDatePicker.closeDropdown();"/></td></tr>';
		html += '</table>';
		
		return html;
	},
	
	closeDropdown: function()
	{
		$(this.dropdown).hide();
	},
	
	doneDate: function()
	{
		var has_time;
		var today = new Date();
		
		if($('challenge_hour').value.blank())
		{
			this.d['tracking'].setHours(0);
			this.d['tracking'].setMinutes(0);
			this.d['tracking'].setSeconds(0);
			has_time = '';
		}
		else
		{
			if($('am_pm').value=="PM")
				var add_on = 12;
			else
				var add_on = 0;
			
			var hour_val = add_on + parseInt($('challenge_hour').value);
			
			this.d['tracking'].setHours(hour_val);
			this.d['tracking'].setMinutes($('challenge_minutes').value);
			this.d['tracking'].setSeconds(0);
			
			if(this.d['tracking'].format("Y-m-d H:i:s")<today.format("Y-m-d H:i:s"))
			{
				this.d['tracking'].setHours(today.getHours());
				this.d['tracking'].setMinutes(today.getMinutes());
				this.d['tracking'].setSeconds(0);
			}
			
			has_time = ' at ' + this.d['tracking'].format("g:ia");
		}
		$(this.dateDiv).innerHTML = this.d['tracking'].format("M dS") + has_time;
		$(this.dropdown).hide();
		$(this.dateField).value = this.d['tracking'].format("Y-m-d H:i:s");
	},
	
	buildMonth: function(fieldName)
	{
		var today = new Date();
		
		var d = new Date(this.d[fieldName].getTime());
		d.setDate(1);
		
		var cols = 0;
		var html = "";
		
		var m = new Date(d.getTime());
		m.setMonth(m.getMonth() - 1);
		var daysInPrevMonth = 32 - new Date(m.getFullYear(), m.getMonth(), 32).getDate();
		
		for (var i = 0; i < d.getDay(); i++)
		{
			cols++;
			m.setDate(daysInPrevMonth - (d.getDay() - i) + 1);
			if(i==0)
				html += '<td class="dp_day" style="border:none; height:28px; border-bottom:1px solid #cccccc; border-left:1px solid #cccccc; border-right:1px solid #cccccc;">' + m.getDate() + '</td>';
			else if(i==d.getDay()-1)
				html += '<td class="dp_day" style="border:none; height:28px; border-bottom:1px solid #cccccc; border-right:1px solid #cccccc;">' + m.getDate() + '</td>';
			else
				html += '<td class="dp_day" style="border:none; height:28px; border-bottom:1px solid #cccccc; border-right:1px solid #cccccc;">' + m.getDate() + '</td>';
		}
		
		do {
			cols++;
			
			var realDate = getRealDate(d);
			if(this.needed.indexOf(realDate)>-1 && d.getTime()!=this.d[fieldName].getTime()) 
				var backColor = "background-color:#fce1e7;";
			else if(this.reporting.indexOf(realDate)>-1 && d.getTime()!=this.d[fieldName].getTime())
				var backColor = "background-color:#e1fce4;";
			else var backColor="";
			
			var className = this.match(d, this.data[fieldName]) ? "dp_day_on_track_c" : "dp_day_off_track_c";
			var leftSide = (d.getDay() == 0) ? " border-left:1px solid #ccc;" : "";
			var borderInfo = this.match(d, this.data[fieldName]) ? " border-right:1px solid #ccc; border-bottom:1px solid #ccc;"+leftSide : "";
			var onClick = ' onclick="ChallengeDatePicker.setDate(event, \'' + d.getDate() +  '\'); ChallengeDatePicker.trackingDateSelected(\''+d.getDate()+'\', \''+(d.getMonth()+1)+'\', \''+d.getFullYear()+'\');"';
			if(d.getDay() == 0)
			{
				if(d.format("Y-m-d")<today.format("Y-m-d"))
					html += '<td class="' + className + '" style="color:#ccc; cursor:auto; border-top:none; height:28px;'+ borderInfo + backColor +'">' + d.getDate() + '</td>';
				else
					html += '<td class="' + className + '" style="border-top:none; height:28px;'+ borderInfo + backColor +'"' + onClick + '>' + d.getDate() + '</td>';
			}
			else
			{	//alert(d.getDate());
				if(d.format("Y-m-d")<today.format("Y-m-d"))
					html += '<td class="' + className + '" style="color:#ccc; cursor:auto; border-top:none; border-left:none; height:28px;'+ borderInfo + backColor +'">' + d.getDate() + '</td>';
				else
					html += '<td class="' + className + '" style="border-top:none; border-left:none; height:28px;'+ borderInfo + backColor +'"' + onClick + '>' + d.getDate() + '</td>';
			}
			if (d.getDay() == 6) html += '</tr><tr>';
			d.setDate(d.getDate() + 1);
		}
		while (d.getDate() > 1);
		
		if (cols < 42)
		{
			m = new Date(d.getTime());
			m.setMonth(d.getMonth());
			m.setDate(1);
			
			for (var i = cols; i < 42; i++)
			{
				if(m.getDay() == 0)
					html += '<td class="dp_day" style="border-bottom:1px solid #cccccc; border-right:1px solid #cccccc; border-left:1px solid #cccccc; height:28px;">' + m.getDate() + '</td>';
				else
					html += '<td class="dp_day" style="border-bottom:1px solid #cccccc; border-right:1px solid #cccccc; height:28px;">' + m.getDate() + '</td>';
				if (m.getDay() == 6) html += '</tr><tr>';
				m.setDate(m.getDate() + 1);
			}
		}
		
		return html;
	},
	
	match: function(d1, d2)
	{
		return (d1.getFullYear() == d2.getFullYear() && d1.getMonth() == d2.getMonth() && d1.getDate() == d2.getDate());
	},
	
	setYear: function(event, val)
	{
		this.set(event, 'year', val);
	},
	
	setMonth: function(event, val)
	{
		this.set(event, 'month', val);
	},
	
	setDate: function(event, val)
	{
		this.set(event, 'date', val);
	},
	
	setHour: function(event, val)
	{
		this.set(event, 'hour', val);
	},
	
	setMinute: function(event, val)
	{
		this.set(event, 'minute', val);
	},
	
	setMeridian: function(event, val)
	{
		this.set(event, 'meridian', val);
	},
	
	set: function(event, key, val)
	{
		event.cancelBubble = true;
		var e = (event.srcElement) ? event.srcElement : event.target;
		
		var fieldName = this.getFieldName(event);
		var d = this.d[fieldName];
		var save = false;
		
		switch (key.toLowerCase())
		{
			case 'date':
				d.setDate(val);
				save = true;
			break;
			
			case 'month':
				d.setMonth(d.getMonth() + val);
				var arr = this.getElementsByClassName(e.parentNode.parentNode, "dp_month");
				if (arr[0]) arr[0].innerHTML = this.monthArrayLong[d.getMonth()];
				
				if (d.getMonth() == 0 && val > 0) { key = 'year'; val = 0; }
				else if (d.getMonth() == 11 && val < 0) { key = 'year'; val = 0; }
				else break;
			
			case 'year':
				d.setFullYear(d.getFullYear() + val);
				var arr = this.getElementsByClassName(e.parentNode.parentNode, "dp_year");
				if (arr[0]) arr[0].innerHTML = d.getFullYear();
			break;
			 
			case 'minute':
				d.setMinutes(val);
				save = true;
			break;
			
			case 'hour':
				var childNodes = e.parentNode.childNodes;
				if (childNodes[childNodes.length - 1].selectedIndex == 1) val += 12; // adjust for meridian
				d.setHours(val);
				save = true;
			break;
			
			case 'meridian':
				if (val == 0 && d.getHours() > 11) d.setHours(d.getHours() - 12);
				else if (val == 1 && d.getHours() < 12) d.setHours(d.getHours() + 12);
				save = true;
			break;
		}
		
		if (save) this.data[fieldName] = new Date(d.getTime());
		
		var div = document.getElementById("dp_" + fieldName);
		div.innerHTML = this.build(fieldName);
	},
	
	setNextDay: function(day, month, year)
	{
		var fieldName = 'tracking';
		var d = this.d[fieldName];
		var save = false;
		
		d.setDate(day);
		d.setMonth(month);
		d.setFullYear(year);
		save = true;

		if (save) this.data[fieldName] = new Date(d.getTime());
			
		var div = document.getElementById("dp_" + fieldName);
		div.innerHTML = this.build(fieldName);
		
	},
	
	getContainer: function(e, className)
	{
		var parent = e.parentNode;
		
		while (parent.nodeName.toLowerCase() != "body")
		{
			if (parent.className == className) break;
			parent = parent.parentNode;
		}
		
		return parent;
	},
	
	getFieldName: function(event)
	{
		event.cancelBubble = true;
		var e = (event.srcElement) ? event.srcElement : event.target;
		var parent = this.getContainer(e, "dp_div");
		return (parent.id) ? parent.id.substr(3) : "";
	},
	
	getElementsByClassName: function(parent, className)
	{
		if (!parent) var parent = document;
		var arr = new Array(); 
		var elements = parent.getElementsByTagName("*");
		
		for (var cls, i = 0; (e = elements[i]); i++)
		{
			if (e.className == className) arr[arr.length] = e;
		}
		return arr;
	},
	
	showHelp: function()
	{
		var crlf = "\r\n";
		var str = "Date Selection:" + crlf;
		str += "- Use the &laquo; and &raquo; buttons to change the year." + crlf;
		str += "- Use the &lt; and &gt; buttons to change the month." + crlf;
		
		var html_entity_decode = function(s)
		{
			var ta = document.createElement("textarea");
  			ta.innerHTML = s.replace(/</g, "&lt;").replace(/>/g, "&gt;");
  			return ta.value;
		};
		
		alert(html_entity_decode(str));
	},
	
	update: function(fieldName)
	{
		var d = this.data[fieldName];
		$(fieldName).value = d.format(this.params.format);
	},
	
	exit: function(fieldName)
	{
		this.update(fieldName);
		
		var div = document.getElementById("dp_" + fieldName);
		if (div) div.parentNode.removeChild(div);
		
		var iframe = document.getElementById("dp_iframe_" + fieldName);
		if (iframe) iframe.parentNode.removeChild(iframe);

	},
	
	getBigDate: function(d)
	{
		return this.dayArrayLong[d.getDay()] + ", " + this.monthArrayLong[d.getMonth()] + " " + d.getDate() + ", " + d.getFullYear();
	},
	
	trackingDateSelected: function(tracking_day, tracking_month, tracking_year)
	{
		mysql_date = getRealDate(new Date(tracking_year, tracking_month-1, tracking_day), true);
		
		//clear the tracking fields
//		$$('.tracking_inputs').each(function(e)
//		{
//			if(e.type=="radio")
//			{
//				e.checked = false;
//			}
//			else
//			{
//				e.value='';
//			}
//		});
		
		var new_date = new Date(tracking_year, tracking_month-1, tracking_day);
		var today = new Date();
		today.setSeconds(0);
		today.setMinutes(0);
		today.setHours(0);
		var difference = new_date - today;
		var diff_days = Math.round(difference/(1000*60*60*24));
		
		//$(this.dateDiv).innerHTML = new_date.format("D, M dS");
		//$(this.dropdown).hide();
		//$(this.dateField).value = new_date.format("Y-m-d");
//		if(diff_days>0)
//		{
//			//alert("no dice!");
//			$('tracking_right_side').hide();
//			$('no_tracking').show();
//		}
//		else
//		{
//			$('no_tracking').hide();
//			$('tracking_right_side').show();
//		}
		
		//load the tracking data via ajax
//		App.onSuccess = function(response) {
//                        $('save_reported_data').style.display = "block";
//
//			responses = response.split('~');
//			responses.each(function(e)
//			{
//                            var parts = e.split('::');
//                            if (parts.length > 0) {
//                                if (parts[0].indexOf("ch") > -1) {
//                                    if ($(parts[0]+'_yes') || $(parts[0]+'_no')) {
//                                        if(parts[1]==1) $(parts[0]+'_yes').checked = true;
//                                        else $(parts[0]+'_no').checked = true;
//                                    } else if ($(parts[0]+"_txt")) {
//                                        if (parts[1] > 0) $(parts[0]+"_txt").innerHTML = "<strong>You have already tracked your "+$(parts[0]+"_sub").innerHTML+"!</strong>";
//                                        else $(parts[0]+"_txt").innerHTML = "Click here to track your "+$(parts[0]+"_sub").innerHTML+"...";
//                                        //$('save_reported_data').style.display = "none";
//                                    }
//                                    if(parts[2])
//                                    {
//                                    	var ps = parts[0].split('|');
//                                    	if($('scdi_'+ps[1]))
//                                    		$('scdi_'+ps[1]).innerHTML = parts[2];
//                                    }
//                                } else if ($(parts[0])) $(parts[0]).value = parts[1];
//                            }
//			});
//		}
		
//		App.request('/cp/TrackData', 'POST', {'do':'get_data', 'data_date':mysql_date, 'user_id':this.user_id, 'customer_support_user_id':this.customer_support_user_id});
		//App.load('/cp/TrackData', 'tracking_right_side', {'do':'get_data', 'data_date':mysql_date, 'user_id':this.user_id, 'customer_support_user_id':this.customer_support_user_id, 'id':$('record_id').value})
		
//		$('big_date').innerHTML = this.getBigDate(new Date(tracking_year, tracking_month-1, tracking_day));
//		$('data_date').value = mysql_date;
	}
	
};

var TrackingDatePicker = 
{
	d: new Array(),
	data: new Array(),
	dayArrayShort: new Array('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'),
	dayArrayMed: new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'),
	dayArrayLong: new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'),
	monthArrayShort: new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'),
	monthArrayMed: new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'),
	monthArrayLong: new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'),
	params: { format:'Y-m-d H:i:s', showTime:true, minuteIncrement:5 },
	reporting: new Array(),
	needed: new Array(),
	customer_support_user_id: '',
	current_date: '',
	
	init: function(e, fieldName, dateString, params, user_id, customer_support_user_id, reporting, needed)
	{
		this.reporting = reporting;
		this.needed = needed;
		this.customer_support_user_id = customer_support_user_id;
		this.user_id = user_id;
		
		if ($('lang_text'))
		{
			this.monthArrayLong = [$('lang_January').innerHTML, $('lang_February').innerHTML, $('lang_March').innerHTML, $('lang_April').innerHTML, $('lang_May').innerHTML, $('lang_June').innerHTML, $('lang_July').innerHTML, $('lang_August').innerHTML, $('lang_September').innerHTML, $('lang_October').innerHTML, $('lang_November').innerHTML, $('lang_December').innerHTML];
			this.dayArrayMed = [$('lang_Sun').innerHTML, $('lang_Mon').innerHTML, $('lang_Tue').innerHTML, $('lang_Wed').innerHTML, $('lang_Thu').innerHTML, $('lang_Fri').innerHTML, $('lang_Sat').innerHTML];
		}
		
		//event.cancelBubble = true;
		//var e = (event.srcElement) ? event.srcElement : event.target;
		
		if (params) for (var i in params) { this.params[i] = params[i]; }

		this.data[fieldName] = new Date();
//		if (!this.data[fieldName]) this.data[fieldName] = (dateString) ? new Date(this.parseDate(dateString)) : new Date();
		this.d[fieldName] = new Date(this.data[fieldName].getTime());
//
//		mysql_date = getRealDate(this.d[fieldName], true);
//		
//		var today = new Date();
//		today.setSeconds(0);
//		today.setMinutes(0);
//		today.setHours(0);
//		var temp = this.d[fieldName];
//		temp.setSeconds(0);
//		temp.setMinutes(0);
//		temp.setHours(0);
//		var difference = temp - today;
//		var diff_days = Math.round(difference/(1000*60*60*24));
//		if(diff_days>0)
//		{
//			//alert("no dice!");
//			$('tracking_right_side').hide();
//			$('no_tracking').show();
//		}
//		else
//		{
//			$('no_tracking').hide();
//			$('tracking_right_side').show();
//		}
		
		//load the tracking data via ajax
//		App.onSuccess = function(response) {
//                        $('save_reported_data').style.display = "block";
//
//			responses = response.split('~');
//			responses.each(function(e)
//			{
//                            var parts = e.split('::');
//                            if (parts.length > 0) {
//                                if (parts[0].indexOf("ch") > -1) {
//                                    if ($(parts[0]+'_yes') || $(parts[0]+'_no')) {
//                                        if(parts[1]==1) $(parts[0]+'_yes').checked = true;
//                                        else $(parts[0]+'_no').checked = true;
//                                    } else if ($(parts[0]+"_txt")) {
//                                        if (parts[1] > 0) $(parts[0]+"_txt").innerHTML = "<strong>You have already tracked your "+$(parts[0]+"_sub").innerHTML+"!</strong>";
//                                        else $(parts[0]+"_txt").innerHTML = "Click here to track your "+$(parts[0]+"_sub").innerHTML+"...";
//                                        //$('save_reported_data').style.display = "none";
//                                    }
//                                } else if ($(parts[0])) $(parts[0]).value = parts[1];
//                                if(parts[2])
//                                {
//                                	var ps = parts[0].split('|');
//                                	if($('scdi_'+ps[1]))
//                                		$('scdi_'+ps[1]).innerHTML = parts[2];
//                                }
//                            }
//			});
//		}
		
//		App.request('/cp/TrackData', 'POST', {'do':'get_data', 'data_date':mysql_date, 'user_id':this.user_id, 'customer_support_user_id':this.customer_support_user_id});
		
//		$('big_date').innerHTML = this.getBigDate(this.d[fieldName]);
//		$('data_date').value = mysql_date;
		
		if (document.getElementById("dp_" + fieldName))
		{
			//this.exit(fieldName);
		}
		else this.display(fieldName, e);
	},
	
	parseDate: function(dateStr)
	{
		var a = dateStr.split(" ");
		if (!a[0]) return "";
		var d = a[0].split("-");
		if (!d[0]) return "";
		a[0] = new Array(this.monthArrayShort[d[1] - 1], parseInt(d[2]), parseInt(d[0])).join(" ");
		return a.join(" ");
	},
	
	display: function(fieldName, parent)
	{
		var x = parent.offsetLeft;
		var y = parent.offsetTop + parent.offsetHeight;
		
		while (parent.offsetParent)
		{
			parent = parent.offsetParent;
			x += parent.offsetLeft;
			y += parent.offsetTop;
		}
		
		//alert(parent.id);
		//var node = document.createElement("input");
		//$('calendar_div').appendChild(node);
		
		var node = document.createElement("div");
		node.setAttribute("id", "dp_" + fieldName);
		node.setAttribute("class", "dp_div");
		node.setAttribute("className", "dp_div");
		$('calendar_div').appendChild(node);
		
		var div = document.getElementById("dp_" + fieldName);
			
//		with (div)
//		{
//			style.border = "1px solid blue";
//			style.position = "absolute";
//			//style.left = x + "px";
//			//style.top = y + "px";
//			//style.zIndex = 999;
//		}
		
		div.innerHTML = this.build(fieldName);
		
		if (navigator.userAgent.toLowerCase().indexOf("opera") != -1) return;
		
		try
		{
//			if (!document.getElementById("dp_iframe_" + fieldName))
//			{
//				var newNode = document.createElement("iframe");
//				newNode.setAttribute("id", "dp_iframe_" + fieldName);
//				newNode.setAttribute("src", "javascript:false;");
//				newNode.setAttribute("scrolling", "no");
//				newNode.setAttribute ("frameborder", "0");
//				document.body.appendChild(newNode);
//			}
//			
//			var iframe = document.getElementById("dp_iframe_" + fieldName);
//
//			try
//			{
//				with (iframe.style)
//				{
//					position = "absolute";
//					width = div.offsetWidth;
//					height = div.offsetHeight;
//					top = div.style.top;
//					left = div.style.left;
//					zIndex = div.style.zIndex - 1;
//					visibility = div.style.visibility;
//					display = div.style.display;
//				}
//			} 
//			catch(e) {}
		}
		catch (ee) {}
	},
	
	build: function(fieldName)
	{
		var d = this.d[fieldName];
		
		var crlf = "\r\n";
		var html = '<table class="dp_table" style="width:300px; font-size:18px;">' + crlf;
		html += '<tbody>' + crlf;
		
		// header
		html += '<tr>' + crlf;
		html += '' + crlf;
		html += '<td class="dp_month" colspan="7" style="padding-left:8px;">' + this.monthArrayLong[d.getMonth()] +  '</td>' + crlf;
		html += '' + crlf;
		html += '</tr>' + crlf;
		
		// next/prev month/year buttons
		html += '<tr>' + crlf;
		html += '<td class="dp_btn" style="border-right:none; width:40px;" onclick="TrackingDatePicker.setYear(event, -1);" title="Previous Year">&laquo;</td>' + crlf;
		html += '<td class="dp_btn" style="width:40px;" onclick="TrackingDatePicker.setMonth(event, -1);" title="Previous Month">&lt;</td>' + crlf;
		html += '<td class="dp_year" colspan="3">' + d.getFullYear() + '</td>' + crlf;
		html += '<td class="dp_btn" style="width:40px;" onclick="TrackingDatePicker.setMonth(event, 1);" title="Next Month">&gt;</td>' + crlf;
		html += '<td class="dp_btn" style="border-left:none; width:40px;" onclick="TrackingDatePicker.setYear(event, 1);" title="Next Year">&raquo;</td>' + crlf;
		html += '</tr>' + crlf;
		
		// spacer
		html += '<tr height="5" />' + crlf;
		
		// days of week
		html += '<tr>' + crlf;
		for (var i = 0; i < this.dayArrayMed.length; i++)
		{
			if(i>0)
				html += '<td class="dp_wkdy" style="border-left:none; width:40px;">' + this.dayArrayMed[i] + '</td>' + crlf;
			else
				html += '<td class="dp_wkdy" style="width:40px;">' + this.dayArrayMed[i] + '</td>' + crlf;
		}
		html += '</tr>' + crlf;
		
		html += '<tr id="dp_days">' + this.buildMonth(fieldName) + '</tr>' + crlf;
		
		// spacer
		html += '<tr height="5" />' + crlf;
		
		if (this.params.showTime)
		{
			// time
			html += '<tr>' + crlf;
			html += '<td colspan="7">';
			
			// ::hour
			html += '<select class="dp_select" onchange="DatePicker.setHour(event, this.selectedIndex);">' + crlf;
			
			var setVal = d.getHours();
			
			if (setVal > 11) setVal -= 12;
			
			for (var i = 0; i < 12; i++)
			{
				var selected = (setVal == i) ? " selected" : "";
				var txt = (i == 0) ? "12" : i.toString();
				if (txt.length < 2) txt = "0" + txt;
				
				html += '<option class="dp_select" value="' + i + '"' + selected + '>' + txt + '</option>' + crlf;
			}
			html += "</select>&nbsp;<b>:</b>&nbsp;" 
			
			// ::minute
			html += '<select class="dp_select" onchange="DatePicker.setMinute(event, this.options[this.selectedIndex].value);">' + crlf;
			
			var setVal = d.getMinutes();
			var inc = this.params.minuteIncrement;
			if (d.getMinutes() % inc > 0) setVal += (inc - (d.getMinutes() % inc));
			
			for (var i = 0; i < 60; i += inc)
			{
				var selected = (setVal == i) ? " selected" : "";
				var val = (i < 10) ? "0" + i.toString() : i.toString();
				html += '<option class="dp_select"' + selected + ' value="' + parseInt(val) + '">' + val + '</option>' + crlf;
			}
			html += '</select>&nbsp;';
			
			// ::meridian
			html += '<select class="dp_select" onchange="DatePicker.setMeridian(event, this.selectedIndex);">' + crlf;
			
			var meridianOptions = new Array("AM", "PM");
			var setVal = (d.getHours() < 12) ? 0 : 1;
				
			for (var i = 0; i < meridianOptions.length; i++)
			{
				var selected = (i == setVal) ? " selected" : "";
				html += '<option class="dp_select"' + selected + '>' + meridianOptions[i] + '</option>' + crlf;
			}
			html += '</select>';
			
			html += '</td>' + crlf;
			html += '</tr>' + crlf;
		}
		
		html += '</tbody>' + crlf;
		html += '</table>';
		
		return html;
	},
	
	buildMonth: function(fieldName)
	{
		var d = new Date(this.d[fieldName].getTime());
		d.setDate(1);
		
		var cols = 0;
		var html = "";
		
		var m = new Date(d.getTime());
		m.setMonth(m.getMonth() - 1);
		var daysInPrevMonth = 32 - new Date(m.getFullYear(), m.getMonth(), 32).getDate();
		
		for (var i = 0; i < d.getDay(); i++)
		{
			cols++;
			m.setDate(daysInPrevMonth - (d.getDay() - i) + 1);
			if(i==0)
				html += '<td class="dp_day" style="border:none; height:30px; border-bottom:1px solid #cccccc; border-left:1px solid #cccccc; border-right:1px solid #cccccc;">' + m.getDate() + '</td>';
			else if(i==d.getDay()-1)
				html += '<td class="dp_day" style="border:none; height:30px; border-bottom:1px solid #cccccc; border-right:1px solid #cccccc;">' + m.getDate() + '</td>';
			else
				html += '<td class="dp_day" style="border:none; height:30px; border-bottom:1px solid #cccccc; border-right:1px solid #cccccc;">' + m.getDate() + '</td>';
		}
		
		do {
			cols++;
			
			var realDate = getRealDate(d);
//			if(this.needed.indexOf(realDate)>-1 && d.getTime()!=this.d[fieldName].getTime()) 
			if(this.needed.indexOf(realDate)>-1)
				var backColor = "background-color:#fce1e7;";
//			else if(this.reporting.indexOf(realDate)>-1 && d.getTime()!=this.d[fieldName].getTime())
			else if(this.reporting.indexOf(realDate)>-1)
				var backColor = "background-color:#e1fce4;";
			else var backColor="";
			
			var className = this.match(d, this.data[fieldName]) ? "dp_day_on_track" : "dp_day_off_track";
			if(className == "dp_day_on_track")
				backColor = "";
			var leftSide = (d.getDay() == 0) ? " border-left:1px solid #ccc;" : "";
			var borderInfo = this.match(d, this.data[fieldName]) ? " border-right:1px solid #ccc; border-bottom:1px solid #ccc;"+leftSide : "";
			var onClick = ' onclick="TrackingDatePicker.setDate(event, \'' + d.getDate() +  '\'); TrackingDatePicker.trackingDateSelected(\''+d.getDate()+'\', \''+(d.getMonth()+1)+'\', \''+d.getFullYear()+'\');"';
			if(d.getDay() == 0)
				html += '<td class="' + className + '" style="border-top:none; height:30px;'+ borderInfo + backColor +'"' + onClick + '>' + d.getDate() + '</td>';
			else
				html += '<td class="' + className + '" style="border-top:none; border-left:none; height:30px;'+ borderInfo + backColor +'"' + onClick + '>' + d.getDate() + '</td>';
			if (d.getDay() == 6) html += '</tr><tr>';
			d.setDate(d.getDate() + 1);
		}
		while (d.getDate() > 1);
		
		if (cols < 42)
		{
			m = new Date(d.getTime());
			m.setMonth(d.getMonth());
			m.setDate(1);
			
			for (var i = cols; i < 42; i++)
			{
				if(m.getDay() == 0)
					html += '<td class="dp_day" style="border-bottom:1px solid #cccccc; border-right:1px solid #cccccc; border-left:1px solid #cccccc; height:30px;">' + m.getDate() + '</td>';
				else
					html += '<td class="dp_day" style="border-bottom:1px solid #cccccc; border-right:1px solid #cccccc; height:30px;">' + m.getDate() + '</td>';
				if (m.getDay() == 6) html += '</tr><tr>';
				m.setDate(m.getDate() + 1);
			}
		}
		
		return html;
	},
	
	match: function(d1, d2)
	{
		return (d1.getFullYear() == d2.getFullYear() && d1.getMonth() == d2.getMonth() && d1.getDate() == d2.getDate());
	},
	
	setYear: function(event, val)
	{
		this.set(event, 'year', val);
	},
	
	setMonth: function(event, val)
	{
		this.set(event, 'month', val);
	},
	
	setDate: function(event, val)
	{
		this.set(event, 'date', val);
	},
	
	setHour: function(event, val)
	{
		this.set(event, 'hour', val);
	},
	
	setMinute: function(event, val)
	{
		this.set(event, 'minute', val);
	},
	
	setMeridian: function(event, val)
	{
		this.set(event, 'meridian', val);
	},
	
	set: function(event, key, val)
	{
		event.cancelBubble = true;
		var e = (event.srcElement) ? event.srcElement : event.target;
		
		var fieldName = this.getFieldName(event);
		var d = this.d[fieldName];
		var save = false;
		
		switch (key.toLowerCase())
		{
			case 'date':
				d.setDate(val);
				save = true;
			break;
			
			case 'month':
				d.setMonth(d.getMonth() + val);
				var arr = this.getElementsByClassName(e.parentNode.parentNode, "dp_month");
				if (arr[0]) arr[0].innerHTML = this.monthArrayLong[d.getMonth()];
				
				if (d.getMonth() == 0 && val > 0) { key = 'year'; val = 0; }
				else if (d.getMonth() == 11 && val < 0) { key = 'year'; val = 0; }
				else break;
			
			case 'year':
				d.setFullYear(d.getFullYear() + val);
				var arr = this.getElementsByClassName(e.parentNode.parentNode, "dp_year");
				if (arr[0]) arr[0].innerHTML = d.getFullYear();
			break;
			
			case 'minute':
				d.setMinutes(val);
				save = true;
			break;
			
			case 'hour':
				var childNodes = e.parentNode.childNodes;
				if (childNodes[childNodes.length - 1].selectedIndex == 1) val += 12; // adjust for meridian
				d.setHours(val);
				save = true;
			break;
			
			case 'meridian':
				if (val == 0 && d.getHours() > 11) d.setHours(d.getHours() - 12);
				else if (val == 1 && d.getHours() < 12) d.setHours(d.getHours() + 12);
				save = true;
			break;
		}
		
		if (save) this.data[fieldName] = new Date(d.getTime());
		
		var div = document.getElementById("dp_" + fieldName);
		div.innerHTML = this.build(fieldName);
	},
	
	setNextDay: function(day, month, year)
	{
		var fieldName = 'tracking';
		var d = this.d[fieldName];
		var save = false;
		
		d.setDate(day);
		d.setMonth(month);
		d.setFullYear(year);
		save = true;

		if (save) this.data[fieldName] = new Date(d.getTime());
			
		var div = document.getElementById("dp_" + fieldName);
		div.innerHTML = this.build(fieldName);
		
	},
	
	getContainer: function(e, className)
	{
		var parent = e.parentNode;
		
		while (parent.nodeName.toLowerCase() != "body")
		{
			if (parent.className == className) break;
			parent = parent.parentNode;
		}
		
		return parent;
	},
	
	getFieldName: function(event)
	{
		event.cancelBubble = true;
		var e = (event.srcElement) ? event.srcElement : event.target;
		var parent = this.getContainer(e, "dp_div");
		return (parent.id) ? parent.id.substr(3) : "";
	},
	
	getElementsByClassName: function(parent, className)
	{
		if (!parent) var parent = document;
		var arr = new Array(); 
		var elements = parent.getElementsByTagName("*");
		
		for (var cls, i = 0; (e = elements[i]); i++)
		{
			if (e.className == className) arr[arr.length] = e;
		}
		return arr;
	},
	
	showHelp: function()
	{
		var crlf = "\r\n";
		var str = "Date Selection:" + crlf;
		str += "- Use the &laquo; and &raquo; buttons to change the year." + crlf;
		str += "- Use the &lt; and &gt; buttons to change the month." + crlf;
		
		var html_entity_decode = function(s)
		{
			var ta = document.createElement("textarea");
  			ta.innerHTML = s.replace(/</g, "&lt;").replace(/>/g, "&gt;");
  			return ta.value;
		};
		
		alert(html_entity_decode(str));
	},
	
	update: function(fieldName)
	{
		var d = this.data[fieldName];
		$(fieldName).value = d.format(this.params.format);
	},
	
	exit: function(fieldName)
	{
		this.update(fieldName);
		
		var div = document.getElementById("dp_" + fieldName);
		if (div) div.parentNode.removeChild(div);
		
		var iframe = document.getElementById("dp_iframe_" + fieldName);
		if (iframe) iframe.parentNode.removeChild(iframe);

	},
	
	getBigDate: function(d)
	{
		return this.dayArrayLong[d.getDay()] + ", " + this.monthArrayLong[d.getMonth()] + " " + d.getDate() + ", " + d.getFullYear();
	},
	
	trackingDateSelected: function(tracking_day, tracking_month, tracking_year)
	{
		mysql_date = getRealDate(new Date(tracking_year, tracking_month-1, tracking_day), true);
		
		//clear the tracking fields
//		$$('.tracking_inputs').each(function(e)
//		{
//			if(e.type=="radio")
//			{
//				e.checked = false;
//			}
//			else
//			{
//				e.value='';
//			}
//		});
		
		var new_date = new Date(tracking_year, tracking_month-1, tracking_day);
		var today = new Date();
		today.setSeconds(0);
		today.setMinutes(0);
		today.setHours(0);
		var difference = new_date - today;
		var diff_days = Math.round(difference/(1000*60*60*24));
//		if(diff_days>0)
//		{
//			//alert("no dice!");
//			$('tracking_right_side').hide();
//			$('no_tracking').show();
//		}
//		else
//		{
//			$('no_tracking').hide();
//			$('tracking_right_side').show();
//		}
		
		//load the tracking data via ajax
//		App.onSuccess = function(response) {
//                        $('save_reported_data').style.display = "block";
//
//			responses = response.split('~');
//			responses.each(function(e)
//			{
//                            var parts = e.split('::');
//                            if (parts.length > 0) {
//                                if (parts[0].indexOf("ch") > -1) {
//                                    if ($(parts[0]+'_yes') || $(parts[0]+'_no')) {
//                                        if(parts[1]==1) $(parts[0]+'_yes').checked = true;
//                                        else $(parts[0]+'_no').checked = true;
//                                    } else if ($(parts[0]+"_txt")) {
//                                        if (parts[1] > 0) $(parts[0]+"_txt").innerHTML = "<strong>You have already tracked your "+$(parts[0]+"_sub").innerHTML+"!</strong>";
//                                        else $(parts[0]+"_txt").innerHTML = "Click here to track your "+$(parts[0]+"_sub").innerHTML+"...";
//                                        //$('save_reported_data').style.display = "none";
//                                    }
//                                    if(parts[2])
//                                    {
//                                    	var ps = parts[0].split('|');
//                                    	if($('scdi_'+ps[1]))
//                                    		$('scdi_'+ps[1]).innerHTML = parts[2];
//                                    }
//                                } else if ($(parts[0])) $(parts[0]).value = parts[1];
//                            }
//			});
//		}
		
//		App.request('/cp/TrackData', 'POST', {'do':'get_data', 'data_date':mysql_date, 'user_id':this.user_id, 'customer_support_user_id':this.customer_support_user_id});
		App.load('/cp/TrackData', 'tracking_right_side', {'do':'get_data', 'data_date':mysql_date, 'user_id':this.user_id, 'customer_support_user_id':this.customer_support_user_id, 'id':$('record_id').value})
		
//		$('big_date').innerHTML = this.getBigDate(new Date(tracking_year, tracking_month-1, tracking_day));
//		$('data_date').value = mysql_date;
	},
	
	trackingDateRefresh: function()
	{
		App.load('/cp/TrackData', 'tracking_right_side', {'do':'get_data', 'data_date':this.current_date, 'user_id':this.user_id, 'customer_support_user_id':this.customer_support_user_id, 'id':$('record_id').value});
	}
	
};

function getRoundData(comp_id, round, customer_support_user_id, user_id)
{
	//clear the tracking fields
//	$$('.tracking_inputs').each(function(e)
//	{
//		if(e.type=="radio")
//		{
//			e.checked = false;
//		}
//		else
//		{
//			e.value='';
//		}
//	});

	//load the tracking data via ajax
//	App.onSuccess = function(response) {
//		responses = response.split('~');
//		responses.each(function(e)
//		{
//			parts = e.split('::');
//			if($(parts[0]=="initial"))
//			{
//				$('initial_weight_input').value = parts[1];
//			}
//			else
//			{
//                            if ($(parts[0]+"_rnd")) $(parts[0]+"_rnd").value = (parts[1] ? parts[1] : 0);
//                            else if ($(parts[0])) $(parts[0]).value = (parts[1] ? parts[1] : 0);
//                            
//                            if(parts[2])
//                            {
//                            	var ps = parts[0].split('___');
//                            	if($('scdi_'+ps[1]))
//                            		$('scdi_'+ps[1]).innerHTML = parts[2];
//                            }
//
//			}
//		});
//	}
	
	//App.request('/cp/TrackData', 'POST', {'do':'get_round_data', 'comp_id':comp_id, 'round':round, 'customer_support_user_id':customer_support_user_id, 'user_id':user_id});
	App.load('/cp/TrackData', 'tracking_right_side', {'do':'get_round_data', 'id':comp_id, 'round':round, 'customer_support_user_id':customer_support_user_id, 'user_id':user_id});
	
}

var GoalDatePicker = 
{
	d: new Array(),
	data: new Array(),
	dayArrayShort: new Array('Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'),
	dayArrayMed: new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'),
	dayArrayLong: new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'),
	monthArrayShort: new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'),
	monthArrayMed: new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'),
	monthArrayLong: new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'),
	params: { format:'Y-m-d H:i:s', showTime:true, minuteIncrement:5 },
	reporting: new Array(),
	needed: new Array(),
	customer_support_user_id: '',
	current_date: '',
	
	init: function(e, fieldName, dateString, params, user_id, customer_support_user_id, reporting, needed)
	{
		this.reporting = reporting;
		this.needed = needed;
		this.customer_support_user_id = customer_support_user_id;
		this.user_id = user_id;
		//event.cancelBubble = true;
		//var e = (event.srcElement) ? event.srcElement : event.target;
		
		if ($('lang_text'))
		{
			this.monthArrayLong = [$('lang_January').innerHTML, $('lang_February').innerHTML, $('lang_March').innerHTML, $('lang_April').innerHTML, $('lang_May').innerHTML, $('lang_June').innerHTML, $('lang_July').innerHTML, $('lang_August').innerHTML, $('lang_September').innerHTML, $('lang_October').innerHTML, $('lang_November').innerHTML, $('lang_December').innerHTML];
			this.dayArrayMed = [$('lang_Sun').innerHTML, $('lang_Mon').innerHTML, $('lang_Tue').innerHTML, $('lang_Wed').innerHTML, $('lang_Thu').innerHTML, $('lang_Fri').innerHTML, $('lang_Sat').innerHTML];
		}
		
		if (params) for (var i in params) { this.params[i] = params[i]; }
		
		this.data[fieldName] = new Date();
//		if (!this.data[fieldName]) this.data[fieldName] = (dateString) ? new Date(this.parseDate(dateString)) : new Date();
		this.d[fieldName] = new Date(this.data[fieldName].getTime());

//		mysql_date = getRealDate(this.d[fieldName], true);
//		
//		var today = new Date();
//		today.setSeconds(0);
//		today.setMinutes(0);
//		today.setHours(0);
//		var temp = this.d[fieldName];
//		temp.setSeconds(0);
//		temp.setMinutes(0);
//		temp.setHours(0);
//		var difference = temp - today;
//		var diff_days = Math.round(difference/(1000*60*60*24));
	//	if(diff_days<0)
	//	{
	//		//alert("no dice!");
	//		$('tracking_right_side').hide();
	//		$('no_tracking').show();
	//	}
	//	else
//		{
//			$('no_tracking').hide();
//			$('tracking_right_side').show();
//		}
		
		//load the goal data via ajax
//		App.onSuccess = function(response) {
//                        $('save_reported_data').style.display = "block";

//			responses = response.split('~');
//			responses.each(function(e)
//			{
//                            var parts = e.split('::');
//                            if (parts.length > 0) {
//                                if (parts[0].indexOf("ch") > -1) {
//                                    if ($(parts[0]+'_yes') || $(parts[0]+'_no')) {
//                                        if(parts[1]==1) $(parts[0]+'_yes').checked = true;
//                                        else $(parts[0]+'_no').checked = true;
//                                    } else if ($(parts[0]+"_txt")) {
//                                       if (parts[1] > 0) $(parts[0]+"_txt").innerHTML = "<strong>You have already tracked your "+$(parts[0]+"_sub").innerHTML+"!</strong>";
//                                        else $(parts[0]+"_txt").innerHTML = "Click here to track your "+$(parts[0]+"_sub").innerHTML+"...";
//                                        //$('save_reported_data').style.display = "none";
//                                    }
//                                } else if ($(parts[0])) $(parts[0]).value = parts[1];
//                                if(parts[2])
//                                {
//                                	var ps = parts[0].split('|');
//                                	if($('scdi_'+ps[1]))
//                                		$('scdi_'+ps[1]).innerHTML = parts[2];
//                                }
//                            }
//                        });
//		}
		
//		App.request('/cp/TrackGoals', 'POST', {'do':'get_data', 'data_date':mysql_date, 'user_id':this.user_id, 'customer_support_user_id':this.customer_support_user_id});
		
//		$('big_date').innerHTML = this.getBigDate(this.d[fieldName]);
//		$('data_date').value = mysql_date;
		
		if (document.getElementById("dp_" + fieldName))
		{
			//this.exit(fieldName);
		}
		else this.display(fieldName, e);
	},
	
	parseDate: function(dateStr)
	{
		var a = dateStr.split(" ");
		if (!a[0]) return "";
		var d = a[0].split("-");
		if (!d[0]) return "";
		a[0] = new Array(this.monthArrayShort[d[1] - 1], parseInt(d[2]), parseInt(d[0])).join(" ");
		return a.join(" ");
	},
	
	display: function(fieldName, parent)
	{
		var x = parent.offsetLeft;
		var y = parent.offsetTop + parent.offsetHeight;
		
		while (parent.offsetParent)
		{
			parent = parent.offsetParent;
			x += parent.offsetLeft;
			y += parent.offsetTop;
		}
		
		//alert(parent.id);
		//var node = document.createElement("input");
		//$('calendar_div').appendChild(node);
		
		var node = document.createElement("div");
		node.setAttribute("id", "dp_" + fieldName);
		node.setAttribute("class", "dp_div");
		node.setAttribute("className", "dp_div");
		$('calendar_div').appendChild(node);
		
		var div = document.getElementById("dp_" + fieldName);
			
//		with (div)
//		{
//			style.border = "1px solid blue";
//			style.position = "absolute";
//			//style.left = x + "px";
//			//style.top = y + "px";
//			//style.zIndex = 999;
//		}
		
		div.innerHTML = this.build(fieldName);
		
		if (navigator.userAgent.toLowerCase().indexOf("opera") != -1) return;
		
		try
		{
//			if (!document.getElementById("dp_iframe_" + fieldName))
//			{
//				var newNode = document.createElement("iframe");
//				newNode.setAttribute("id", "dp_iframe_" + fieldName);
//				newNode.setAttribute("src", "javascript:false;");
//				newNode.setAttribute("scrolling", "no");
//				newNode.setAttribute ("frameborder", "0");
//				document.body.appendChild(newNode);
//			}
//			
//			var iframe = document.getElementById("dp_iframe_" + fieldName);
//
//			try
//			{
//				with (iframe.style)
//				{
//					position = "absolute";
//					width = div.offsetWidth;
//					height = div.offsetHeight;
//					top = div.style.top;
//					left = div.style.left;
//					zIndex = div.style.zIndex - 1;
//					visibility = div.style.visibility;
//					display = div.style.display;
//				}
//			} 
//			catch(e) {}
		}
		catch (ee) {}
	},
	
	build: function(fieldName)
	{
		var d = this.d[fieldName];
		
		var crlf = "\r\n";
		var html = '<table class="dp_table" style="width:300px; font-size:18px;">' + crlf;
		html += '<tbody>' + crlf;
		
		// header
		html += '<tr>' + crlf;
		html += '' + crlf;
		html += '<td class="dp_month" colspan="7" style="padding-left:8px;">' + this.monthArrayLong[d.getMonth()] +  '</td>' + crlf;
		html += '' + crlf;
		html += '</tr>' + crlf;
		
		// next/prev month/year buttons
		html += '<tr>' + crlf;
		html += '<td class="dp_btn" style="border-right:none; width:40px;" onclick="GoalDatePicker.setYear(event, -1);" title="Previous Year">&laquo;</td>' + crlf;
		html += '<td class="dp_btn" style="width:40px;" onclick="GoalDatePicker.setMonth(event, -1);" title="Previous Month">&lt;</td>' + crlf;
		html += '<td class="dp_year" colspan="3">' + d.getFullYear() + '</td>' + crlf;
		html += '<td class="dp_btn" style="width:40px;" onclick="GoalDatePicker.setMonth(event, 1);" title="Next Month">&gt;</td>' + crlf;
		html += '<td class="dp_btn" style="border-left:none; width:40px;" onclick="GoalDatePicker.setYear(event, 1);" title="Next Year">&raquo;</td>' + crlf;
		html += '</tr>' + crlf;
		
		// spacer
		html += '<tr height="5" />' + crlf;
		
		// days of week
		html += '<tr>' + crlf;
		for (var i = 0; i < this.dayArrayMed.length; i++)
		{
			if(i>0)
				html += '<td class="dp_wkdy" style="border-left:none; width:40px;">' + this.dayArrayMed[i] + '</td>' + crlf;
			else
				html += '<td class="dp_wkdy" style="width:40px;">' + this.dayArrayMed[i] + '</td>' + crlf;
		}
		html += '</tr>' + crlf;
		
		html += '<tr id="dp_days">' + this.buildMonth(fieldName) + '</tr>' + crlf;
		
		// spacer
		html += '<tr height="5" />' + crlf;
		
		if (this.params.showTime)
		{
			// time
			html += '<tr>' + crlf;
			html += '<td colspan="7">';
			
			// ::hour
			html += '<select class="dp_select" onchange="DatePicker.setHour(event, this.selectedIndex);">' + crlf;
			
			var setVal = d.getHours();
			
			if (setVal > 11) setVal -= 12;
			
			for (var i = 0; i < 12; i++)
			{
				var selected = (setVal == i) ? " selected" : "";
				var txt = (i == 0) ? "12" : i.toString();
				if (txt.length < 2) txt = "0" + txt;
				
				html += '<option class="dp_select" value="' + i + '"' + selected + '>' + txt + '</option>' + crlf;
			}
			html += "</select>&nbsp;<b>:</b>&nbsp;" 
			
			// ::minute
			html += '<select class="dp_select" onchange="DatePicker.setMinute(event, this.options[this.selectedIndex].value);">' + crlf;
			
			var setVal = d.getMinutes();
			var inc = this.params.minuteIncrement;
			if (d.getMinutes() % inc > 0) setVal += (inc - (d.getMinutes() % inc));
			
			for (var i = 0; i < 60; i += inc)
			{
				var selected = (setVal == i) ? " selected" : "";
				var val = (i < 10) ? "0" + i.toString() : i.toString();
				html += '<option class="dp_select"' + selected + ' value="' + parseInt(val) + '">' + val + '</option>' + crlf;
			}
			html += '</select>&nbsp;';
			
			// ::meridian
			html += '<select class="dp_select" onchange="DatePicker.setMeridian(event, this.selectedIndex);">' + crlf;
			
			var meridianOptions = new Array("AM", "PM");
			var setVal = (d.getHours() < 12) ? 0 : 1;
				
			for (var i = 0; i < meridianOptions.length; i++)
			{
				var selected = (i == setVal) ? " selected" : "";
				html += '<option class="dp_select"' + selected + '>' + meridianOptions[i] + '</option>' + crlf;
			}
			html += '</select>';
			
			html += '</td>' + crlf;
			html += '</tr>' + crlf;
		}
		
		html += '</tbody>' + crlf;
		html += '</table>';
		
		return html;
	},
	
	buildMonth: function(fieldName)
	{
		var d = new Date(this.d[fieldName].getTime());
		d.setDate(1);
		
		var cols = 0;
		var html = "";
		
		var m = new Date(d.getTime());
		m.setMonth(m.getMonth() - 1);
		var daysInPrevMonth = 32 - new Date(m.getFullYear(), m.getMonth(), 32).getDate();
		
		for (var i = 0; i < d.getDay(); i++)
		{
			cols++;
			m.setDate(daysInPrevMonth - (d.getDay() - i) + 1);
			if(i==0)
				html += '<td class="dp_day" style="border:none; height:30px; border-bottom:1px solid #cccccc; border-left:1px solid #cccccc; border-right:1px solid #cccccc;">' + m.getDate() + '</td>';
			else if(i==d.getDay()-1)
				html += '<td class="dp_day" style="border:none; height:30px; border-bottom:1px solid #cccccc; border-right:1px solid #cccccc;">' + m.getDate() + '</td>';
			else
				html += '<td class="dp_day" style="border:none; height:30px; border-bottom:1px solid #cccccc; border-right:1px solid #cccccc;">' + m.getDate() + '</td>';
		}
		
		do {
			cols++;
			
			var realDate = getRealDate(d);
			if(this.needed.indexOf(realDate)>-1) 
				var backColor = "background-color:#fce1e7;";
			else if(this.reporting.indexOf(realDate)>-1)
				var backColor = "background-color:#e1fce4;";
			else var backColor="";
			
			var className = this.match(d, this.data[fieldName]) ? "dp_day_on_track" : "dp_day_off_track";
			var leftSide = (d.getDay() == 0) ? " border-left:1px solid #ccc;" : "";
			var borderInfo = this.match(d, this.data[fieldName]) ? " border-right:1px solid #ccc; border-bottom:1px solid #ccc;"+leftSide : "";
			var onClick = ' onclick="GoalDatePicker.setDate(event, \'' + d.getDate() +  '\'); GoalDatePicker.trackingDateSelected(\''+d.getDate()+'\', \''+(d.getMonth()+1)+'\', \''+d.getFullYear()+'\');"';
			if(d.getDay() == 0)
				html += '<td class="' + className + '" style="border-top:none; height:30px;'+ borderInfo + backColor +'"' + onClick + '>' + d.getDate() + '</td>';
			else
				html += '<td class="' + className + '" style="border-top:none; border-left:none; height:30px;'+ borderInfo + backColor +'"' + onClick + '>' + d.getDate() + '</td>';
			if (d.getDay() == 6) html += '</tr><tr>';
			d.setDate(d.getDate() + 1);
		}
		while (d.getDate() > 1);
		
		if (cols < 42)
		{
			m = new Date(d.getTime());
			m.setMonth(d.getMonth());
			m.setDate(1);
			
			for (var i = cols; i < 42; i++)
			{
				if(m.getDay() == 0)
					html += '<td class="dp_day" style="border-bottom:1px solid #cccccc; border-right:1px solid #cccccc; border-left:1px solid #cccccc; height:30px;">' + m.getDate() + '</td>';
				else
					html += '<td class="dp_day" style="border-bottom:1px solid #cccccc; border-right:1px solid #cccccc; height:30px;">' + m.getDate() + '</td>';
				if (m.getDay() == 6) html += '</tr><tr>';
				m.setDate(m.getDate() + 1);
			}
		}
		
		return html;
	},
	
	match: function(d1, d2)
	{
		return (d1.getFullYear() == d2.getFullYear() && d1.getMonth() == d2.getMonth() && d1.getDate() == d2.getDate());
	},
	
	setYear: function(event, val)
	{
		this.set(event, 'year', val);
	},
	
	setMonth: function(event, val)
	{
		this.set(event, 'month', val);
	},
	
	setDate: function(event, val)
	{
		this.set(event, 'date', val);
	},
	
	setHour: function(event, val)
	{
		this.set(event, 'hour', val);
	},
	
	setMinute: function(event, val)
	{
		this.set(event, 'minute', val);
	},
	
	setMeridian: function(event, val)
	{
		this.set(event, 'meridian', val);
	},
	
	set: function(event, key, val)
	{
		event.cancelBubble = true;
		var e = (event.srcElement) ? event.srcElement : event.target;
		
		var fieldName = this.getFieldName(event);
		var d = this.d[fieldName];
		var save = false;
		
		switch (key.toLowerCase())
		{
			case 'date':
				d.setDate(val);
				save = true;
			break;
			
			case 'month':
				d.setMonth(d.getMonth() + val);
				var arr = this.getElementsByClassName(e.parentNode.parentNode, "dp_month");
				if (arr[0]) arr[0].innerHTML = this.monthArrayLong[d.getMonth()];
				
				if (d.getMonth() == 0 && val > 0) { key = 'year'; val = 0; }
				else if (d.getMonth() == 11 && val < 0) { key = 'year'; val = 0; }
				else break;
			
			case 'year':
				d.setFullYear(d.getFullYear() + val);
				var arr = this.getElementsByClassName(e.parentNode.parentNode, "dp_year");
				if (arr[0]) arr[0].innerHTML = d.getFullYear();
			break;
			
			case 'minute':
				d.setMinutes(val);
				save = true;
			break;
			
			case 'hour':
				var childNodes = e.parentNode.childNodes;
				if (childNodes[childNodes.length - 1].selectedIndex == 1) val += 12; // adjust for meridian
				d.setHours(val);
				save = true;
			break;
			
			case 'meridian':
				if (val == 0 && d.getHours() > 11) d.setHours(d.getHours() - 12);
				else if (val == 1 && d.getHours() < 12) d.setHours(d.getHours() + 12);
				save = true;
			break;
		}
		
		if (save) this.data[fieldName] = new Date(d.getTime());
		
		var div = document.getElementById("dp_" + fieldName);
		div.innerHTML = this.build(fieldName);
	},
	
	setNextDay: function(day, month, year)
	{
		var fieldName = 'tracking';
		var d = this.d[fieldName];
		var save = false;
		
		d.setDate(day);
		d.setMonth(month);
		d.setFullYear(year);
		save = true;

		if (save) this.data[fieldName] = new Date(d.getTime());
			
		var div = document.getElementById("dp_" + fieldName);
		div.innerHTML = this.build(fieldName);
		
	},
	
	getContainer: function(e, className)
	{
		var parent = e.parentNode;
		
		while (parent.nodeName.toLowerCase() != "body")
		{
			if (parent.className == className) break;
			parent = parent.parentNode;
		}
		
		return parent;
	},
	
	getFieldName: function(event)
	{
		event.cancelBubble = true;
		var e = (event.srcElement) ? event.srcElement : event.target;
		var parent = this.getContainer(e, "dp_div");
		return (parent.id) ? parent.id.substr(3) : "";
	},
	
	getElementsByClassName: function(parent, className)
	{
		if (!parent) var parent = document;
		var arr = new Array(); 
		var elements = parent.getElementsByTagName("*");
		
		for (var cls, i = 0; (e = elements[i]); i++)
		{
			if (e.className == className) arr[arr.length] = e;
		}
		return arr;
	},
	
	showHelp: function()
	{
		var crlf = "\r\n";
		var str = "Date Selection:" + crlf;
		str += "- Use the &laquo; and &raquo; buttons to change the year." + crlf;
		str += "- Use the &lt; and &gt; buttons to change the month." + crlf;
		
		var html_entity_decode = function(s)
		{
			var ta = document.createElement("textarea");
  			ta.innerHTML = s.replace(/</g, "&lt;").replace(/>/g, "&gt;");
  			return ta.value;
		};
		
		alert(html_entity_decode(str));
	},
	
	update: function(fieldName)
	{
		var d = this.data[fieldName];
		$(fieldName).value = d.format(this.params.format);
	},
	
	exit: function(fieldName)
	{
		this.update(fieldName);
		
		var div = document.getElementById("dp_" + fieldName);
		if (div) div.parentNode.removeChild(div);
		
		var iframe = document.getElementById("dp_iframe_" + fieldName);
		if (iframe) iframe.parentNode.removeChild(iframe);

	},
	
	getBigDate: function(d)
	{
		return this.dayArrayLong[d.getDay()] + ", " + this.monthArrayLong[d.getMonth()] + " " + d.getDate() + ", " + d.getFullYear();
	},
	
	trackingDateSelected: function(tracking_day, tracking_month, tracking_year)
	{
		mysql_date = getRealDate(new Date(tracking_year, tracking_month-1, tracking_day), true);
		this.current_date = mysql_date;
		
		//clear the tracking fields
//		$$('.tracking_inputs').each(function(e)
//		{
//			if(e.type=="radio")
//			{
//				e.checked = false;
//			}
//			else
//			{
//				e.value='';
//			}
//		});
		
		var new_date = new Date(tracking_year, tracking_month-1, tracking_day);
		var today = new Date();
		today.setSeconds(0);
		today.setMinutes(0);
		today.setHours(0);
		var difference = new_date - today;
		var diff_days = Math.round(difference/(1000*60*60*24));
//		if(diff_days<0)
//		{
//			//alert("no dice!");
//			$('tracking_right_side').hide();
//			$('no_tracking').show();
//		}
//		else
//		{
//			$('no_tracking').hide();
//			$('tracking_right_side').show();
//		}
		
		//load the tracking data via ajax
//		App.onSuccess = function(response) {
//                        $('save_reported_data').style.display = "block";

//			responses = response.split('~');
//			responses.each(function(e)
//			{
//                            var parts = e.split('::');
//                            if (parts.length > 0) {
//                                if (parts[0].indexOf("ch") > -1) {
//                                    if ($(parts[0]+'_yes') || $(parts[0]+'_no')) {
//                                        if(parts[1]==1) $(parts[0]+'_yes').checked = true;
//                                        else $(parts[0]+'_no').checked = true;
//                                    } else if ($(parts[0]+"_txt")) {
//                                        if (parts[1] > 0) $(parts[0]+"_txt").innerHTML = "<strong>You have already tracked your "+$(parts[0]+"_sub").innerHTML+"!</strong>";
//                                        else $(parts[0]+"_txt").innerHTML = "Click here to track your "+$(parts[0]+"_sub").innerHTML+"...";
//                                        //$('save_reported_data').style.display = "none";
//                                    }
//                                } else if ($(parts[0])) $(parts[0]).value = parts[1];
//                                if(parts[2])
//                                {
//                                	var ps = parts[0].split('|');
//                                	if($('scdi_'+ps[1]))
//                                		$('scdi_'+ps[1]).innerHTML = parts[2];
//                                }
//                            }
//			});
//		}
		
		//App.request('/cp/TrackGoals', 'POST', {'do':'get_data', 'data_date':mysql_date, 'user_id':this.user_id, 'customer_support_user_id':this.customer_support_user_id});
		App.load('/cp/TrackGoals', 'tracking_right_side', {'do':'get_data', 'data_date':mysql_date, 'user_id':this.user_id, 'customer_support_user_id':this.customer_support_user_id, 'id':$('record_id').value})
		
//		$('big_date').innerHTML = this.getBigDate(new Date(tracking_year, tracking_month-1, tracking_day));
//		$('data_date').value = mysql_date;
	},
	
	trackingDateRefresh: function()
	{
		App.load('/cp/TrackGoals', 'tracking_right_side', {'do':'get_data', 'data_date':this.current_date, 'user_id':this.user_id, 'customer_support_user_id':this.customer_support_user_id, 'id':$('record_id').value});
	}
	
};

function getRoundGoals(comp_id, round, customer_support_user_id, user_id)
{
	//clear the tracking fields
//	$$('.tracking_inputs').each(function(e)
//	{
//		if(e.type=="radio")
//		{
//			e.checked = false;
//		}
//		else
//		{
//			e.value='';
//		}
//	});
//
//	//load the tracking data via ajax
//	App.onSuccess = function(response) {
//		responses = response.split('~');
//		responses.each(function(e)
//		{
//			var parts = e.split('::');
//                        if ($(parts[0]+"_rnd")) $(parts[0]+"_rnd").value = (parts[1] ? parts[1] : '');
//                        else if ($(parts[0])) $(parts[0]).value = (parts[1] ? parts[1] : '');
//                        
//		});
//	}
//	
//	App.request('/cp/TrackGoals', 'POST', {'do':'get_round_data', 'comp_id':comp_id, 'round':round, 'customer_support_user_id':customer_support_user_id, 'user_id':user_id});
	App.load('/cp/TrackGoals', 'tracking_right_side', {'do':'get_round_data', 'id':comp_id, 'round':round, 'customer_support_user_id':customer_support_user_id, 'user_id':user_id});

}

function getMeasureUnits(item_id, goals)
{
	if(goals)
		App.request('/cp/TrackGoals', 'POST', {'do':'get_measure_units', 'item_id':item_id}, 'measure_units');
	else
		App.request('/cp/TrackData', 'POST', {'do':'get_measure_units', 'item_id':item_id}, 'measure_units');
}

function addNewCategory(item_id, unit_id, goals)
{
	if($('generic_tracking_top')) $('generic_tracking_top').show();
	if($('generic_tracking_bottom')) $('generic_tracking_bottom').show();
	if($('no_categories_div')) $('no_categories_div').hide();
	
	if(item_id==0) return;
	
	//check that it has not already been added
	var already = false;
	$$('.tracking_inputs').each(function(e)
	{
		parts = e.id.split('_');
		if(parts[1]==item_id && parts[2]==unit_id)
		{
			already = true;
		}
	});
	
	if(already)
	{
		App.request('/cp/TrackData/', 'POST', {'do':'get_new_category', 'item_id':item_id, 'unit_id':unit_id});
		return;
	}
	
	//use ajax to get the measurement word, unit word and the input
	App.onSuccess = function(response)
	{
	
		if(goals)
		{
			GoalDatePicker.trackingDateRefresh();
			return;
		}
		else
		{
			TrackingDatePicker.trackingDateRefresh();
			return;
		}
		
		var parts = response.split('~~');
		
		var table = $('tracking_categories_table');
        var rowCount = table.rows.length;
        var row = table.insertRow(rowCount);

        if(parts[4]=='1')
        {
            var cell2 = row.insertCell(0);
            cell2.setAttribute("style", "text-align:right; font-weight:bold;");
            cell2.setAttribute("colspan", "2");
        	cell2.innerHTML = parts[2] + '? <input type="radio" class="tracking_inputs" name="data_value['+parts[0]+'|'+parts[1]+']" id="measurement_'+parts[0]+'_'+parts[1]+'_yes" value="bool1" style="font-size:16px;"/><label for="measurement_'+parts[0]+'_'+parts[1]+'_yes">Yes</label> <input type="radio" class="tracking_inputs" name="data_value['+parts[0]+'|'+parts[1]+']" id="measurement_'+parts[0]+'_'+parts[1]+'_no" value="bool0" style="font-size:16px;"/><label for="measurement_'+parts[0]+'_'+parts[1]+'_no">No</label>';
        	var cell3 = row.insertCell(1);
        }
        else
        {
            var cell1 = row.insertCell(0);
            cell1.innerHTML = parts[2];
            cell1.setAttribute("style", "text-align:right; font-weight:bold;");

            var cell2 = row.insertCell(1);
        	cell2.innerHTML = '<input type="text" class="tracking_inputs" size="8" name="data_value['+parts[0]+'|'+parts[1]+']" id="measurement_'+parts[0]+'_'+parts[1]+'" style="font-size:16px;"/>';
            
        	var cell3 = row.insertCell(2);
            cell3.innerHTML = parts[3];
            cell3.setAttribute("style", "text-align:left;");
        }
	};
	
	if(goals)
		App.request('/cp/TrackGoals', 'POST', {'do':'get_new_category', 'item_id':item_id, 'unit_id':unit_id});
	else	
		App.request('/cp/TrackData', 'POST', {'do':'get_new_category', 'item_id':item_id, 'unit_id':unit_id});
}

function getRealDate(d, mysql)
{
	if(mysql == undefined)
		mysql = false;
	
	var month = d.getMonth()+1;
	if(month.toString().length==1) month = "x0" + month; else month = "x" + month;
	var year = d.getFullYear();
	var day = d.getDate();
	if(day.toString().length==1) day = "x0" + day; else day = "x" + day;
	
	if(mysql)
	{
		var fdate = year + "-" + month + "-" + day;
	}
	else
	{	
		var fdate = year + month + day;
	}
	return fdate.replace(/x/g, '');
}

var Forum = 
{
	load: function(forum_id, page)
	{
		var params = { 'forum_id':forum_id };
		if (page) params.page = page;
		
		$('forum').update($('ajax_loader').innerHTML);
		
		App.load('/cp/ForumComponent/', 'forum', params);
	}
};

var ForumTopic = 
{
	loadPosts: function(forum_id, topic_id)
	{
		if ($('topic_posts_' + topic_id))
		{
			var e = $('topic_posts_' + topic_id);
			
			if (e.innerHTML.blank())
			{
				e.show();
				
				var params = { 'do':'get_posts', 'forum_id':forum_id, 'topic_id':topic_id };
				
				App.load('/cp/ForumComponent/', 'topic_posts_' + topic_id, params);
			}
			else e.toggle();
		}
	},
	
	save: function(event, forum_id)
	{
		App.send('create_topic_form', 'forum');
	}
};

var ForumPost =
{
	toggle: function(event)
	{
		var e = Event.element(event);
		e.up('li').down('.forum_post_abrv').toggle();
		e.up('li').down('.forum_post_full').toggle();
	},
	
	showReply: function(event)
	{
		var e = Event.element(event);
		e.up(1).down('.forum_post_reply').show();
	},
	
	discardReply: function(event)
	{
		var e = Event.element(event);
		e.up('form').reset();
		e.up(3).down('.forum_post_reply').hide();
	},
	
	save: function(event, forum_id, topic_id, post_id)
	{
		App.onSuccess = function()
		{
			$('topic_posts_' + topic_id).update(' ');
			ForumTopic.loadPosts(forum_id, topic_id);
		};
		
		App.send('save_post_form_' + post_id);
	}
};

var DHTMLWin = 
{
	load: function(event, template, params, parent)
	{
		if ($('dhtml_win')) $('dhtml_win').remove();
		if (!params) params = {};
		if (!parent) parent = document.body;
	
		var e = Event.element(event);
		
		var tpl = new Template($(template).innerHTML);
		var div = new Element('div', { id:'dhtml_win' }).update(tpl.evaluate(params));
		div.style.display = 'none';
		parent.appendChild(div);
		
		if (Element.viewportOffset(e).top > div.getHeight()) var offset_top = 0 - div.getHeight();
		else if ((document.viewport.getHeight() - Element.viewportOffset(e).top)  > (div.getHeight() + e.getHeight())) var offset_top = e.getHeight();
		
		if ((document.viewport.getWidth() - Element.viewportOffset(e).left)  > div.getWidth()) var offset_left = 0;
		else var offset_left = 2 - (div.getWidth() - e.getWidth());
		
		offset_left += e.getWidth();
		
		Element.absolutize(div);
		try { Element.clonePosition(div, e, {offsetLeft:offset_left, offsetTop:offset_top}); }
		catch (ee) { Element.clonePosition(div, e, {offsetLeft:offset_left, offsetTop:offset_top}); }
		
		div.style.zIndex = 999;
		div.show();
		
		if (params.url)
		{
			if (!params.params) params.params = {};
			params.params.AJAX = '1';
			div.down('.dhtml_win_content').id = 'dhtml_win_content';
			
			App.load(params.url, $('dhtml_win_content'), params.params);
		}
	}
};

var Standings = 
{
	user_id: null,
	record_id: null,
	team_id: null,
	standings_round: null,
	challenge_id: null,
	entity_type: null,
	entity_id: null,
	pe: null,
	
	init: function(params, tabs)
	{
		Object.keys(params).each(function(e) { Standings[e] = params[e]; });
		
		var a = [$('entity_' + tabs[0]), $('challenge_' + tabs[1])];
		a.each(function(e) { if (e) e.src = e.src.replace('_off', '_on'); });
	},
	
	load: function(type, id, col)
	{
		switch (type)
		{
			case 'entity':
				this.entity_type = col;
				this.entity_id = id;
			break;
			
			case 'challenge':
				this.challenge_id = id;
			break;
		}

		Component.toggleTabIcon('standings_' + type, type + '_' + col + '_' + id);

		var params =
		{
				'do':'build',
				'id':this.record_id,
				'entity_type':this.entity_type,
				'entity_id':this.entity_id,
				'challenge_id':this.challenge_id
		};
		
		App.load('/cp/Standings/', 'standings_content', params);
	},
	
	addRival: function(event, rival_id)
	{
		var obj =
		{
			'do':'add_rival',
			'id':this.record_id,
			'rival_id':rival_id
		};
		
		var el = Event.element(event);
		App.onSuccess = function() { el.hide();	};
		App.request('/cp/Rivals/', 'POST', obj);
	},
	
	delRival: function(event, rival_id)
	{
		var obj =
		{
			'do':'del_rival',
			'id':this.record_id,
			'rival_id':rival_id
		};
		
		var el = Event.element(event);
		App.onSuccess = function() { el.up('tr').hide(); };
		App.request('/cp/Rivals/', 'POST', obj);
	},
	
	updateScroll: function(event)
	{
		if (this.team_id == null) return;
		
		if (event)
		{
			event.cancelBubble = true;
			window.detachEvent("onload", Standings.updateScroll);
		}
		
		var s = $('standings_scroll');
		var e = $("team_" + this.team_id.toString());
		var r = $("rival_" + this.team_id.toString());
		
		if (r) r.update("&nbsp;");
		
		if (s && e)
		{
			s.scrollTop = e.offsetTop - (s.offsetHeight / 2) + e.offsetHeight;
			e.className = "standings_row_team";
		}
	}
};

var CalorieCalc = 
{
	target: null,
	calories: 0,
	
	setTarget: function(target)
	{
		CalorieCalc.target = target;
	},
	
	getTarget: function(target)
	{
		return CalorieCalc.target;
	},
	
	init: function(val)
	{
		if (isNaN(parseInt(val))) return;
		CalorieCalc.calories = parseInt(val);
		$(CalorieCalc.getTarget().id).value = CalorieCalc.calories;
		if ($('total_calories')) $('total_calories').value = CalorieCalc.calories;
	},
	
	incQty: function(id)
	{
		if ($('qty_' + id))
		{
			$('qty_' + id).value++;
			$('qty_' + id).onchange();
			$('calories_' + id).onchange();
		}
	},
	
	decQty: function(id)
	{
		if ($('qty_' + id))
		{
			if ($('qty_' + id).value < 2) $('qty_' + id).value="";
			else $('qty_' + id).value--;
			$('qty_' + id).onchange();
			$('calories_' + id).onchange();
		}
	},
	
	updateCalories: function(id)
	{
		var qty = $('qty_' + id).value;
		var gms = $('gms_' + id).value;
		var cals = $('cals_' + id).value;
		
		if (qty.blank() || qty < 1) var calories = "";
		else calories = qty * (gms * cals);
		
		$('calories_' + id).value = Math.round(calories);
		if (calories < 1) calories = "";
		
		CalorieCalc.calories += parseInt($('calories_' + id).value);
	},
	
	updateTotal: function()
	{
		var total = 0;
		$$('.calories_input').each(function(e) { total += parseInt(e.value); });
		if (!isNaN(total)) CalorieCalc.init(total);
	}
};

var InfoBox =
{
	show: function(record_id) {
		if ($(record_id+"_info_hover")) {
			$(record_id+"_info_hover").style.display = "inline";
			$(record_id+"_info_backdrop").style.display = "block";
		}
		
		InfoBox.correct(record_id);
	},
	
	correct: function(record_id) {
		var el = $(record_id+"_info_box");
		if (el) {
			var abs = Page.absPos(el);
			
			if (App.getBrowser() == "msie 6") {
				$(record_id+"_info_hover").style.left = (abs['w']-354)+"px";
				if ($(record_id+"_info_box_content") && $(record_id+"_info_box_content").innerHTML != "") $(record_id+"_info_hover").style.width = "30em";
			} else if (App.getBrowser() == "msie") {
				if ($(record_id+"_info_box_content") && $(record_id+"_info_box_content").innerHTML != "") $(record_id+"_info_hover").style.width = "30em";
			}
			
			var abs = Page.absPos($(record_id+"_info"));
			
			if ($(record_id+"_info_hover")) {
				$(record_id+"_info_backdrop").style.width = ($(record_id+"_info_hover").clientWidth+21.5)+"px";
				$(record_id+"_info_backdrop").style.height = ($(record_id+"_info_hover").clientHeight+21.5)+"px";
				
				$(record_id+"_info_hover").style.left = abs['w']+"px";
				$(record_id+"_info_backdrop").style.left = (abs['w']-4)+"px";
				
				if (App.getBrowser() != "msie" && App.getBrowser() != "msie 6") {
					$(record_id+"_info_hover").style.top = (abs['n']-18)+"px";
					$(record_id+"_info_backdrop").style.top = (abs['n']-3)+"px";
				} else {
					$(record_id+"_info_hover").style.top = (abs['n']+6)+"px";
					$(record_id+"_info_backdrop").style.top = (abs['n']+20)+"px";
				}
			}
		}
	},

	hide: function(record_id)
	{
		if ($(record_id+"_info_hover"))
		{
			$(record_id+"_info_hover").style.display = "none";
			$(record_id+"_info_backdrop").style.display = "none";
		}
	}
};

var UserBox = 
{
	show: function(user_id)
	{
		if ($(user_id+"_user_hover")) {
			$(user_id+"_user_hover").style.display = "block";
			$(user_id+"_user_backdrop").style.display = "block";
		}
		
		UserBox.correct(user_id);
	},
	
	correct: function(user_id) {
		var el = $(user_id+"_user_box");
		var abs = Page.absPos(el);
		
		if (App.getBrowser() == "msie 6") {
			$(user_id+"_user_hover").style.left = (abs['w']-354)+"px";
			if ($(user_id+"_user_box_content") && $(user_id+"_user_box_content").innerHTML != "") $(user_id+"_user_hover").style.width = "30em";
		} else if (App.getBrowser() == "msie") {
			if ($(user_id+"_user_box_content") && $(user_id+"_user_box_content").innerHTML != "") $(user_id+"_user_hover").style.width = "30em";
		}
		
		var abs = Page.absPos($(user_id+"_user"));
		
		if ($(user_id+"_user_hover")) {
//			$(user_id+"_user_backdrop").style.width = ($(user_id+"_user_hover").clientWidth+21.5)+"px";
//			$(user_id+"_user_backdrop").style.height = ($(user_id+"_user_hover").clientHeight+21.5)+"px";
			
//			$(user_id+"_user_hover").style.left = abs['w']+"px";
//			$(user_id+"_user_backdrop").style.left = (abs['w']-4)+"px";
			
			if (App.getBrowser() != "msie" && App.getBrowser() != "msie 6") {
//				$(user_id+"_user_hover").style.top = (abs['n']-18)+"px";
//				$(user_id+"_user_backdrop").style.top = (abs['n']-3)+"px";
			} else {
//				$(user_id+"_user_hover").style.top = (abs['n']+6)+"px";
//				$(user_id+"_user_backdrop").style.top = (abs['n']+20)+"px";
			}
			
		}
	},

	hide: function(user_id)
	{
		if ($(user_id+"_user_hover"))
		{
			$(user_id+"_user_hover").style.display = "none";
			$(user_id+"_user_backdrop").style.display = "none";
		}
	}
};

var Plans = 
{
	category_mapping: { 'Weight loss':'6',
						'Physical Activity':'7',
						'Nutrition':'8',
						'Mental Well-Being':'9',
						'Smoking Cessation':'10' },
	
	confirmPlan: function(record_id,user_ids,schedule,date) {
		var params = { 'do':'decide-plan-date', 'id':record_id, 'user_ids':user_ids, 'schedule':schedule, 'date':date };
		App.onSuccess = function() {}
		App.request('/cp/PlanOverview/', 'POST', params);
	},
	
	parseRecurring: function(text) {
		text = text.toLowerCase();
		var dNow = new Date();
		
		if ((text == "this week" || text == "next week") ||
			(text.indexOf("sometime") > -1 && (text.indexOf("this week") > -1 || text.indexOf("next week")))) return Array("0","1","2","3","4","5","6");
		else if ((text == "this month" || text == "next month") ||
				(text.indexOf("sometime") > -1 && (text.indexOf("this month") > -1 || text.indexOf("next month")))) return Array("0","1","2","3","4","5","6");
		else if (text.indexOf("every") > -1) {
			if (text.indexOf("except") < 0) {
				if (text.indexOf("sun") > -1) return Array("0");
				else if (text.indexOf("mon") > -1) return Array("1");
				else if (text.indexOf("tue") > -1) return Array("2");
				else if (text.indexOf("wed") > -1) return Array("3");
				else if (text.indexOf("thu") > -1) return Array("4");
				else if (text.indexOf("fri") > -1) return Array("5");
				else if (text.indexOf("sat") > -1) return Array("6");
				else if (text.indexOf(" day") > -1) return Array("0","1","2","3","4","5","6");
				else if (text.indexOf(" week") > -1) return Array(dNow.getDay().toString());
			} else if (text.indexOf("except") > -1 && text.indexOf(" day") > -1) {
				if (text.indexOf("sun") > -1) return Array("1","2","3","4","5","6");
				else if (text.indexOf("mon") > -1) return Array("0","2","3","4","5","6");
				else if (text.indexOf("tue") > -1) return Array("0","1","3","4","5","6");
				else if (text.indexOf("wed") > -1) return Array("0","1","2","4","5","6");
				else if (text.indexOf("thu") > -1) return Array("0","1","2","3","5","6");
				else if (text.indexOf("fri") > -1) return Array("0","1","2","3","4","6");
				else if (text.indexOf("sat") > -1) return Array("0","1","2","3","4","5");
			}
		}
		
		return false;
	},
	
	guessTentative: function(text) {
		text = text.toLowerCase();
		
		if (text.indexOf("sometime") > -1 ||
			text.indexOf("maybe") > -1 ||
			text.indexOf("perhaps") > -1) return true;
		
		return false;
	},
	
	guessEndDate: function(text) {
		text = text.toLowerCase();
		
		var guess = false;
		var dNow = new Date();
		
		if (text.indexOf("this week") > -1) dNow.setDate(dNow.getDate() + 7);
		else if (text.indexOf("next week") > -1) dNow.setDate(dNow.getDate() + 14);
		else if (text.indexOf("this month") > -1) dNow.setDate(daysInMonth(dNow.getMonth(),dNow.getYear()));
		else if (text.indexOf("next month") > -1) { dNow.setMonth(dNow.getMonth() + 1); dNow.setDate(daysInMonth(dNow.getMonth(),dNow.getYear())); }
		else return false;
		
		var dateString = (dNow.getMonth()+1)+"/"+dNow.getDate()+"/"+dNow.getFullYear();
		return dateString;
	},
	
	guessActivity: function(text) {
		text = text.toLowerCase();
		var guess = false;
		
		if (text.indexOf("gym") > -1) guess = "Go to the gym";
		else if (text.indexOf("run") > -1) guess = "Go running";
		else if (text.indexOf("walk") > -1) guess = "Go walking";
		else if (text.indexOf("yoga") > -1) guess = "Go to yoga";
		else if (text.indexOf("dinner") > -1) guess = "Make dinner at home";
		else if (text.indexOf("supper") > -1) guess = "Make dinner at home";
		else if (text.indexOf("lunch") > -1) guess = "Eat a healthy lunch";
		
		return guess;
	},
	
	guessCategory: function(text) {
		text = text.toLowerCase();
		var guess = false;
		
		if ((text.indexOf("gym") > -1 ||
			 text.indexOf("run") > -1 ||
			 text.indexOf("walk") > -1 ||
			 text.indexOf("basketball") > -1 ||
			 text.indexOf("yoga") > -1) && 
			Plans.category_mapping["Physical Activity"]) guess = Plans.category_mapping["Physical Activity"];
		else if ((text.indexOf("dinner") > -1 ||
				  text.indexOf("supper") > -1 ||
				  text.indexOf("lunch") > -1) && 
				 Plans.category_mapping["Nutrition"]) guess = Plans.category_mapping["Nutrition"];
		
		return guess;
	},
	
	findInvitees: function(search,target) {
		var params = { 'do':'find-invitees', 'search':search };
		App.request('/cp/PlanCreate/', 'POST', params, target);
	}
};

var Language = 
{
	textToDateString: function(text) {
		text = text.toLowerCase();
		var dateCheck = text.isDate();
		if (dateCheck) {
			objDate = new Date();  
			objDate.setTime(dateCheck);
			
			return text;
		}
				
		guess = "";
		
		var dNow = new Date();
		var showDate = false;
		
		if (text == "this week") guess = "This week";
		else if (text == "next week") guess = "Next week";
		else if (text.indexOf("sometime") > -1 && text.indexOf("this week") > -1) guess = "Sometime this week";
		else if (text.indexOf("sometime") > -1 && text.indexOf("next week") > -1) guess = "Sometime next week";
		else if (text == "this month") guess = "This month";
		else if (text == "next month") guess = "Next month";
		else if (text.indexOf("sometime") > -1 && text.indexOf("this month") > -1) guess = "Sometime this month";
		else if (text.indexOf("sometime") > -1 && text.indexOf("next month") > -1) guess = "Sometime next month";
		else if (text.indexOf("every") > -1) {
			var doy = false;
			var everyText = text;
			var exceptText = text;
			
			if (text.indexOf("except") > -1) {
				var splitText = text.split("except");
				everyText = splitText[0];
				exceptText = splitText[1];
			}
			
			if (everyText.indexOf("mon") > -1) { guess += "Every Mon"; doy = "1"; }
			else if (everyText.indexOf("tue") > -1) { guess += "Every Tue"; doy = "2"; }
			else if (everyText.indexOf("wed") > -1) { guess += "Every Wed"; doy = "3"; }
			else if (everyText.indexOf("thu") > -1) { guess += "Every Thu"; doy = "4"; }
			else if (everyText.indexOf("fri") > -1) { guess += "Every Fri"; doy = "5"; }
			else if (everyText.indexOf("sat") > -1) { guess += "Every Sat"; doy = "6"; }
			else if (everyText.indexOf("sun") > -1) { guess += "Every Sun"; doy = "0"; }
			else if (everyText.indexOf(" day") > -1) guess += "Every day";
			else if (everyText.indexOf(" week") > -1) guess += "Every week";
			
			if (text.indexOf("except") > -1 && text.indexOf(" day") > -1) {
				if (exceptText.indexOf("mon") > -1) guess += "except Mon";
				else if (exceptText.indexOf("tue") > -1) guess += "except Tue";
				else if (exceptText.indexOf("wed") > -1) guess += "except Wed";
				else if (exceptText.indexOf("thu") > -1) guess += "except Thu";
				else if (exceptText.indexOf("fri") > -1) guess += "except Fri";
				else if (exceptText.indexOf("sat") > -1) guess += "except Sat";
				else if (exceptText.indexOf("sun") > -1) guess += "except Sun";
			}
			
			if (doy) {
				guess += " starting";
				
				var increment = parseInt(doy) - dNow.getDay();
				var dTemp = new Date();
				dTemp.setDate(dTemp.getDate()+increment);
				
				guess += " "+dTemp.format("M j");
			}
		} else if (text.indexOf("next") > -1) {
			var doy = false;
			
			if (text.indexOf("mon") > -1) { guess += "Next Monday"; doy = 1; }
			else if (text.indexOf("tue") > -1) { guess += "Next Tuesday"; doy = 2; }
			else if (text.indexOf("wed") > -1) { guess += "Next Wednesday"; doy = 3; }
			else if (text.indexOf("thu") > -1) { guess += "Next Thursday"; doy = 4; }
			else if (text.indexOf("fri") > -1) { guess += "Next Friday"; doy = 5; }
			else if (text.indexOf("sat") > -1) { guess += "Next Saturday"; doy = 6; }
			else if (text.indexOf("sun") > -1) { guess += "Next Sunday"; doy = 0; }
			else if (text.indexOf(" day") > -1) guess += "Next day";
			else if (text.indexOf(" week") > -1) guess += "Next day";
		} else {
			if (text.indexOf("today") > -1 ||
				text.indexOf("this morning") > -1 ||
				text.indexOf("this afternoon") > -1) guess += "Today";
			else if (text.indexOf("tonight") > -1 ||
					 text.indexOf("this evening") > -1 ||
					 text.indexOf("tonight") > -1) guess += "Tonight";
			else if (text.indexOf("tomorrow") > -1 &&
					 text.indexOf("day after tomorrow") < 0) guess += "Tomorrow";
		}
		
		if (showDate) guess += " "
		
		if (text.indexOf("morning") > -1) guess += " at 8:00 AM";
		else if (text.indexOf("afternoon") > -1) guess += " at 1:00 PM";
		else if (text.indexOf("after work") > -1 ||
				 text.indexOf("following work") > -1 ||
				 text.indexOf("this evening") > -1 ||
				 text.indexOf("tonight") > -1) guess += " at 5:00 PM";
		else if (text.indexOf("today") > -1 ||
				 text.indexOf("during lunch") > -1 ||
				 text.indexOf("after lunch") > -1) guess += " at 12:00 PM";
		//else guess += " at "+dNow.getHours()+":"+dNow.getMinutes()+" "+(dNow.getHours() > 11 ? "PM" : "AM");
		
		if (guess != "") return guess;
		else return false;
	},
	
	textToDate: function(text) {
		text = text.toLowerCase();
		if (text.isDate()) return text;
		
		var dateString = "";
		
		var dNow = new Date();
		var dNext = new Date();
		
		if (text.indexOf("every") > -1) {
			var doy = false;
			var everyText = text;
			var exceptText = text;
			
			if (text.indexOf("except") > -1) {
				var splitText = text.split("except");
				everyText = splitText[0];
				exceptText = splitText[1];
			}
			
			if (everyText.indexOf("mon") > -1) doy = "1";
			else if (everyText.indexOf("tue") > -1) doy = "2";
			else if (everyText.indexOf("wed") > -1) doy = "3";
			else if (everyText.indexOf("thu") > -1) doy = "4";
			else if (everyText.indexOf("fri") > -1) doy = "5";
			else if (everyText.indexOf("sat") > -1) doy = "6";
			else if (everyText.indexOf("sun") > -1) doy = "0";
			
			if (doy) {
				var increment = parseInt(doy) - dNow.getDay();
				dNext.setDate(dNow.getDate() + increment);
			}
		} else if (text.indexOf("next") > -1) {
			var doy = false;
			
			if (text.indexOf("mon") > -1) doy = 1;
			else if (text.indexOf("tue") > -1) doy = 2;
			else if (text.indexOf("wed") > -1) doy = 3;
			else if (text.indexOf("thu") > -1) doy = 4;
			else if (text.indexOf("fri") > -1) doy = 5;
			else if (text.indexOf("sat") > -1) doy = 6;
			else if (text.indexOf("sun") > -1) doy = 0;
			else if (text.indexOf("week") > -1) dNext.setDate(dNow.getDate() + 7);
			else if (text.indexOf("month") > -1) dNext.setDate(dNow.getMonth() + 1);
			else if (text.indexOf("year") > -1) dNext.setDate(dNow.getYear() + 1);
			
			if (doy) {
				var increment = parseInt(doy) - dNow.getDay();
				dNext.setDate(dNow.getDate() + increment);
			}
		} else if (text.indexOf("tomorrow") > -1 &&
				   text.indexOf("day after tomorrow") < 0) { dNext.setDate(dNow.getDate() + 1); }
		else if (text.indexOf("day after tomorrow") > -1) dNext.setDate(dNow.getDate() + 2);
		
		var parts = text.toLowerCase().split(" ");
		for(var i = 0; i < parts.length; i++) {
			if (parts[i] == "at" && isNumeric(parts[i+1])) {
				if (parts[i+2] == "PM" && parts[i+1] < 12) dNext.setHours(parts[i+1]+12);
				else dNext.setHours(parts[i+1]);
			}
		}
		
		dNext.setMinutes(0);
		
		dateString = dNext.getFullYear()+"/"+(dNext.getMonth()+1)+"/"+dNext.getDate()+" "+dNext.getHours()+":"+(dNext.getMinutes().length == 1 ? dNext.getMinutes() : "0"+dNext.getMinutes());
		dateString += ":00";
		
		if (dateString != "") return dateString;
		else return false;
	}
};

var PeopleHtml = 
{
	htmlOptions: { 'via_email' : "generateViaEmail",
				   'browse' : "generateBrowsing",
				   'lists' : "generateLists",
				   'teams' : "generateTeams",
				   'network' : "generateNetwork"},
	
	generateNetwork: function() {
	    var html = document.createElement('div');
	    html.style.maxWidth = "30em";
		html.style.textAlign = "center";
		html.style.margin = "auto auto";
		//html.innerHTML = "Your network is made up of trusted people that are fellow members in one of your groups, teams, or plans.  Once someone is in your network, you can communicate with them and view their public profile information.<br /><br />Currently there is no one in your network. You can add people to your network by joining a team, plan, or group.";
		html.innerHTML = Page.getMsg('msg_generateNetwork');
		
		html.style.textAlign = "center";
		html.style.paddingTop = "1em";
		
		return html;
	},
				   
	generateViaEmail: function() {
		var html = document.createElement('div');
		html.style.maxWidth = "30em";
		html.style.textAlign = "center";
		html.style.margin = "auto auto";
		//html.innerHTML = "Enter the e-mail address of the person you are looking for. When you click &quot;find&quot;, the system will attempt to find that person.";
		html.innerHTML = Page.getMsg('msg_generateViaEmail');
		
		html.style.textAlign = "center";
		html.style.paddingTop = "1em";
		
		return html;
	},
	
	generateBrowsing: function() {
		var html = document.createElement('div');
		html.style.maxWidth = "30em";
		html.style.textAlign = "center";
		html.style.margin = "auto auto";
		//html.innerHTML = "To find someone, simply enter text in the search box above, or select key attributes about the user(s) using the advanced features and click &quot;Find People&quot;";
		html.innerHTML = Page.getMsg('msg_generateBrowsing');
		
		html.style.textAlign = "center";
		html.style.paddingTop = "1em";
		
		return html;
	},

	generateLists:  function() {
		var html = document.createElement('div');
		html.style.maxWidth = "30em";
		html.style.textAlign = "center";
		html.style.margin = "auto auto";
		//html.innerHTML = "Lists are simple; they are reusable lists of people that you create to make it more convenient for you to invite the same people to do something. No one else sees your lists.";
		html.innerHTML = Page.getMsg('msg_generateLists');
		
		html.style.textAlign = "center";
		html.style.paddingTop = "1em";
		
		return html;
	},

	generateTeams: function() {
		var html = document.createElement('div');
		html.style.maxWidth = "30em";
		html.style.textAlign = "center";
		html.style.margin = "auto auto";
		//html.innerHTML = "Above is a list of all teams you are a member of, both inactive and completed competitions. In order to join a team, you need to be part of a team competition.";
		html.innerHTML = Page.getMsg('msg_generateTeams');
		
		html.style.textAlign = "center";
		html.style.paddingTop = "1em";
		
		return html;
	},
	
	setHtml: function(el,opt) {
		var opt = PeopleHtml[PeopleHtml.htmlOptions[opt]]();
		$(el).innerHTML = "";
		$(el).appendChild(opt);
	}
};

var People = 
{
	defaultSearch: "Search by name, e-mail or location...",
	peopleType: "invite",
        autoExpandGroupings: true,
        
	currentView: "network",
	passback: false,
	passbackStr: false,
	popped: false,
	finishBtn: "Send Invites",
	
	finished: false,
	
	invited: Array(),
	stagedInvitees: Array(),
	invitees2name: {},
	
	stagedLists: Array(),
	lists2invitees: {},
	lists2name: {},

	stagedTeams: Array(),
	teams2invitees: {},
	teams2name: {},
	
	clearInviter: function() {
		People.currentView = "network";
		People.passback = false;
		People.passbackStr = false;
		People.popped = false;
		People.finishBtn = "Send Invites";
		
		People.finished = false;
		
		People.invited = Array();
		People.stagedInvitees = Array();
		People.invitees2name = {};
		
		People.stagedLists = Array();
		People.lists2invitees = {};
		People.lists2name = {};
		
		People.stagedTeams = Array();
		People.teams2invitees = {};
		People.teams2name = {};
	},
	
	fireSearch: function(params) {
            if ($('peopleSearchInput')) {
		if ($('peopleSearchInput').value !== People.defaultSearch && $('peopleSearchInput').value !== "") {
			People.clearActives();

                        /*
			$('extrasToggle').innerHTML = "";
			$('extrasToggle').style.display = "none";
			*/
                        
			App.onSuccess = function() {
				People.currentView = "search";
				Page.correctActionBox(true);
				$('peopleSearchInput').style.border = "1px solid #0087CB";
			}
			
			App.load('/cp/PeopleComponent/', 'peopleList', params);
		}
            }
	},
	
	generateReadableInvites: function() {
		var invs = Array();
		
		for(var a in People.stagedInvitees) {
			if (isNumeric(a) && !invs.inArray(People.stagedInvitees[a])) invs.push(People.stagedInvitees[a]);
		}

		for(var b in People.stagedLists) {
			if (isNumeric(b)) {
				for(var c in People.lists2invitees[People.stagedLists[b]]) {
					if (isNumeric(c) && !invs.inArray(People.lists2invitees[People.stagedLists[b]][c])) invs.push(People.lists2invitees[People.stagedLists[b]][c]);
				}
			}
		}

		for(var b in People.stagedTeams) {
			if (isNumeric(b)) {
				for(var c in People.teams2invitees[People.stagedTeams[b]]) {
					if (isNumeric(c) && !invs.inArray(People.teams2invitees[People.stagedTeams[b]][c])) invs.push(People.teams2invitees[People.stagedTeams[b]][c]);
				}
			}
		}
		
		if (!People.passbackStr) {
			var txt = "You have invited ";
			if (invs.length == 1) txt += People.invitees2name[invs[0]];//"1 person";
			else txt += invs.length+" people";
		} else {
			var txt = People.passbackStr;
			if (txt.indexOf("%CNT%") > -1) txt = txt.strReplace("%CNT%",invs.length);
			if (txt.indexOf("%NOUN%") > -1) {
				if (invs.length == 1) txt = People.invitees2name[invs[0]];//txt.strReplace("%NOUN%","person");
				else txt = txt.strReplace("%NOUN%","people");
			}
		}
		
		return txt;
	},
	
	finishInvites: function() {
		if (!People.passback && People.stagedInvitees.length == 0) alert("You must select someone to invite");
		else {
			if (!People.passback) var chk = confirm("Are you sure you are ready to send your invites?");
			else var chk = true;
			
			if (chk) {
				People.finished = true; 
				People.chkMakeList();
				
				if ($('record_id').value) {
					App.onSuccess = function() { window.location.reload(); alert("Invitations successfully sent!"); }
					App.onFailure = function() { alert("An error has occured"); }
					App.request('/cp/PeopleComponent/', 'POST', { 'do':'make-invites', 'record_id':$('record_id').value, 'invites':People.generateInviteString() });
				} else if (People.passback) {
					$(People.passback.invites).value = People.generateInviteString();
					$(People.passback.readable).innerHTML = People.generateReadableInvites();
					Page.hideActionBox(true);
				}
			}
		}
	},
	
	chkMakeList: function() {
		if ($('makeList').value !== "Enter a list name here..." && $('makeList').value !== "") {
			App.onSuccess = function() {}
			App.request('/cp/PeopleComponent/', 'POST', { 'do':'make-list', 'list':$('makeList').value, 'enroll':People.generateInviteString() });
		} else {
			//var chk = prompt("Before completing, would you like to make this set of invitees into a list?","e.g. Basketball team");
			//if (chk) People.makeList(chk);
		}
	},
	
	makeList: function(name) {
		$('makeList').value = name;
		People.chkMakeList();
	},
	
	loadAsInvite: function(params) {
		var pass = "";
		var title = "Add Invites";
		
		if (params.finishBtn) People.finishBtn = params.finishBtn;
		else People.finishBtn = "Send Invites";
		
		if (params.title) title = params.title;
		if (params.record_id) pass += "&record_id="+params.record_id;
		if (params.passbackStr) People.passbackStr = params.passbackStr;
		if (params.passback) {
			People.passback = { 'invites' : params.passback.invites,
								'readable' : params.passback.readable };
		}
		if (params.autoExpand) People.autoExpandGroupings = params.autoExpand;
                
		Page.actionBoxCloser = function() {
			if (People.generateInviteString() !== "" && !People.finished) {
				var chk = confirm("Are you sure you want to exit without sending your invites?");
				if (chk) {
					People.clearInviter();
					return true;
				} else return false;
			} else {
				if (People.passback.invites && People.passback.readable) {
					$(People.passback.invites).value = People.generateInviteString();
					$(People.passback.readable).innerHTML = People.generateReadableInvites();
				}
				
				return true;
			}
		}
		
		Page.actionBoxLoader = function() {
			if (People.stagedInvitees.length > 0 ||
				People.stagedLists.length > 0 ||
				People.stagedTeams.length > 0) {
					People.checkPeople();
					People.buildInviteStaging();
					
					$('network').addClassName("active");
			}
			
			if ($('finishInvites')) $('finishInvites').value = People.finishBtn;
		}
		
		People.popped = true;
		var params = { 'url':'/cp/PeopleComponent/?type=invite'+pass, 'title':title }
		Page.showActionBox(false,params);
	},
	
	checkPeople: function() {
		var objects = $('peopleList').down('div');
		while(objects) {
			if (objects.down()) {
				var incrementer = objects.down().id.strReplace("_inviter_btn","");
				if ($(incrementer+"_invitee_id")) {
					var invitee_id = $(incrementer+"_invitee_id").value;
					
					if (People.invited.inArray(invitee_id)) {
						$(incrementer+"_inviter_btn").style.display = "none";
						$(incrementer+"_inviter_btn").stopObserving("click");
						$(incrementer+"_inviter_btn").style.color = "gray";
						$(incrementer+"_inviter_btn").innerHTML = "Invited";
						$('check'+invitee_id).innerHTML = "<img style='height:15px; padding:0 0.5em 0 0;' src='" + App.getCDN() + "/core/images/success_checkmark.gif' />";
					} else {
						People.invitees2name[invitee_id] = $(incrementer+"_invitee_name").value;
						
						var alreadyInvited = false;
						if (People.stagedInvitees.inArray(invitee_id)) alreadyInvited = true;
						else {
							for(var l in People.stagedLists) {
								if (isNumeric(l)) {
									if (People.lists2invitees[People.stagedLists[l]].inArray(invitee_id)) alreadyInvited = true;
								}
							}
							
							for(var l in People.stagedTeams) {
								if (isNumeric(l)) {
									if (People.teams2invitees[People.stagedTeams[l]].inArray(invitee_id)) alreadyInvited = true;
								}
							}
						}
						
						if (alreadyInvited) {
							$(incrementer+"_inviter_btn").innerHTML = "Remove";
							$(incrementer+"_inviter_btn").style.color = "gray";
						} else {
							$(incrementer+"_inviter_btn").innerHTML = "Invite";
							$(incrementer+"_inviter_btn").style.color = "black";
						}
						
						$(incrementer+"_inviter_btn").stopObserving("click");
						$(incrementer+"_inviter_btn").observe("click", function(event) {
							var inc = this.id.strReplace("_inviter_btn","");
							
							if (this.innerHTML == "Remove") {
								People.removeInvitee($(inc+"_invitee_id").value);
								this.innerHTML = "Invite";
								this.style.color = "black";
							} else {
								People.addInvitee($(inc+"_invitee_id").value);
								this.innerHTML = "Remove";
								this.style.color = "gray";
							}
						});
					}
				}
			}
			
			objects = objects.next('div');
		}
	},

	expandTeam: function(team_id,noConfirm) {
		if (!noConfirm) var check = confirm("Are you sure you want to expand this team?\n\nThis cannot be undone.");
                else var check = true;
                
		if (check) {
			var teamPeople = People.teams2invitees[team_id];
			for(var i in teamPeople) {
				if (isNumeric(i)) {
					if (!People.stagedInvitees.inArray(teamPeople[i]) &&
						!People.invited.inArray(teamPeople[i])) People.stagedInvitees.push(teamPeople[i]);
				}
			}
			
			People.removeTeam(team_id);
                        People.buildInviteStaging();
		}
	},
	
	expandList: function(list_id,noConfirm) {
                if (!noConfirm) var check = confirm("Are you sure you want to expand this list?\n\nThis cannot be undone.");
                else var check = true;
                
		if (check) {
			var listPeople = People.lists2invitees[list_id];
			for(var i in listPeople) {
				if (isNumeric(i)) {
					if (!People.stagedInvitees.inArray(listPeople[i]) &&
						!People.invited.inArray(listPeople[i])) People.stagedInvitees.push(listPeople[i]);
				}
			}
			
			People.removeList(list_id);
                        People.buildInviteStaging();
		}
	},
	
	buildInviteStaging: function() {
		var el = $('inviteStaging');
		el.innerHTML = "";
		
		if (People.stagedInvitees.length > 0) {
			for(var i in People.stagedInvitees) {
				if (isNumeric(i) && People.stagedInvitees[i]) {
					var invitee_id = People.stagedInvitees[i];
					
					if (isNumeric(invitee_id) && People.invitees2name[invitee_id]) {
						var disp = People.invitees2name[invitee_id];
						if (disp.length > 20) disp = disp.substr(0,20)+"...";
						
						el.innerHTML += "<div title='"+People.invitees2name[invitee_id]+"' style='padding:0.3em; text-align:left;'><img style='cursor:pointer;' onclick=People.removeInvitee("+invitee_id+"); src='" + App.getCDN() + "/core/images/remove.gif' /> "+disp+"</div>";
					} else if (!isNumeric(invitee_id)) {
						var disp = invitee_id;
						if (disp.length > 20) disp = disp.substr(0,20)+"...";
						el.innerHTML += "<div title='"+invitee_id+"' style='padding:0.3em; text-align:left;'><img style='cursor:pointer;' onclick=People.removeInvitee('"+invitee_id+"'); src='" + App.getCDN() + "/core/images/remove.gif' /> "+disp+"</div>";
					}
				}
			}
		}

		if (People.stagedLists.length > 0) {
			for(var i in People.stagedLists) {
				if (isNumeric(i) && People.stagedLists[i]) {
					var list_id = People.stagedLists[i];
					
					var disp = People.lists2name[list_id];
					if (disp.length > 18) disp = disp.substr(0,18)+"...";
					
					if (isNumeric(list_id) && People.lists2name[list_id]) el.innerHTML += "<div title='"+People.lists2name[list_id]+"' style='padding:0.3em; text-align:left;'><img style='cursor:pointer;' onclick=People.removeList("+list_id+"); src='" + App.getCDN() + "/core/images/remove.gif' /> "+disp+"&nbsp;&nbsp;<img style='cursor:pointer; height:24px;' onclick=People.expandList("+list_id+"); src='" + App.getCDN() + "/core/images/list_1.gif' /></div>";
				}
			}
		}

		if (People.stagedTeams.length > 0) {
			for(var i in People.stagedTeams) {
				if (isNumeric(i) && People.stagedTeams[i]) {
					var team_id = People.stagedTeams[i];

					var disp = People.teams2name[team_id];
					if (disp.length > 18) disp = disp.substr(0,18)+"...";
					
					if (isNumeric(team_id) && People.teams2name[team_id]) el.innerHTML += "<div title='"+People.teams2name[team_id]+"' style='padding:0.3em; text-align:left;'><img style='cursor:pointer;' onclick=People.removeTeam("+team_id+"); src='" + App.getCDN() + "/core/images/remove.gif' /> "+disp+"&nbsp;&nbsp;<img style='cursor:pointer; height:24px;' onclick=People.expandTeam("+team_id+"); src='" + App.getCDN() + "/core/images/icons/16x16/action_center_groups.gif' /></div>";
				}
			}
		}
		
		if (People.stagedInvitees.length == 0 &&
			People.stagedLists.length == 0 &&
			People.stagedTeams.length == 0) {
				el.innerHTML = "No invitees";
		}

                if (el.innerHTML == "") el.innerHTML = "No invitees";
	},

        validateEmail: function(chk) {
            var filter = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
            if (filter.test(chk)) return true;
            return false;
        },
        
        checkManualEmail: function(manual) {
            if (People.validateEmail(manual)) {
                App.onSuccess = function(e) {
                    var listData = e.evalJSON(true);

                    if (listData.length > 0) {
                        $('email_invitee_id').value = listData[0];
                        $('email_invitee_name').value = listData[1];
                        $('emailInviteeEmail').innerHTML = listData[2];
                        $('emailInviteeImg').style.background = "url('"+listData[3]+"') no-repeat";

                        $('emailInviteeManualSpan').style.display = "none";
                        $('emailInviteeManualFoundSpan').innerHTML = "<a href='/members/profile/"+listData[0]+"/'>"+listData[1]+"</a>";
                        $('emailInviteeManualFoundSpan').style.display = "inline";
                    }
		}

		App.request('/cp/PeopleComponent/', 'POST', { 'get':'check-manual', 'manual':manual });
            }
        },

	manualInvitee: function(manual) {
		App.onSuccess = function(e) {
			var listData = e.evalJSON(true);
			
			if (listData.length == 0) People.addInvitee(manual);
			else {
				People.invitees2name[listData[0]] = listData[1];
				People.addInvitee(listData[0]);
			}
		}
		
		App.request('/cp/PeopleComponent/', 'POST', { 'get':'check-manual', 'manual':manual });
	},
	
	generateInviteString: function() {
		var invStr = Array();
		
		for(var a in People.stagedInvitees) {
			if (isNumeric(a) && !invStr.inArray(People.stagedInvitees[a])) invStr.push(People.stagedInvitees[a]);
		}

		for(var b in People.stagedLists) {
			if (isNumeric(b)) {
				for(var c in People.lists2invitees[People.stagedLists[b]]) {
					if (isNumeric(c) && !invStr.inArray(People.lists2invitees[People.stagedLists[b]][c])) invStr.push(People.lists2invitees[People.stagedLists[b]][c]);
				}
			}
		}

		for(var b in People.stagedTeams) {
			if (isNumeric(b)) {
				for(var c in People.teams2invitees[People.stagedTeams[b]]) {
					if (isNumeric(c) && !invStr.inArray(People.teams2invitees[People.stagedTeams[b]][c])) invStr.push(People.teams2invitees[People.stagedTeams[b]][c]);
				}
			}
		}
		
		return invStr.toString();
	},
	
	removeInvitee: function(invitee_id) {
		if (People.stagedInvitees.inArray(invitee_id)) People.stagedInvitees.removeItems(invitee_id);
		People.checkPeople();
		People.buildInviteStaging();
	},

	addInvitee: function(invitee_id) {
		if (!People.stagedInvitees.inArray(invitee_id)) People.stagedInvitees.push(invitee_id);
		People.checkPeople();
		People.buildInviteStaging();
	},

	removeList: function(list_id) {
		if (People.stagedLists.inArray(list_id)) People.stagedLists.removeItems(list_id);
		People.checkPeople();
		People.buildInviteStaging();
	},
	
	addList: function(list_id) {
		if (People.lists2invitees[list_id]) {
			var inviteesReady = false;
			
			for(var i in People.lists2invitees[list_id]) {
				if (isNumeric(i)) {
					if (!People.invited.inArray(People.lists2invitees[list_id][i]) &&
						!People.stagedInvitees.inArray(People.lists2invitees[list_id][i])) inviteesReady = true;
				}
			}
			
			if (inviteesReady) {
				if (!People.stagedLists.inArray(list_id)) People.stagedLists.push(list_id);
				People.checkPeople();
				People.buildInviteStaging();
			}

                        if (People.autoExpandGroupings == true) People.expandList(list_id,true);
		}
	},

	removeTeam: function(team_id) {
		if (People.stagedTeams.inArray(team_id)) People.stagedTeams.removeItems(team_id);
		People.checkPeople();
		People.buildInviteStaging();
	},
	
	addTeam: function(team_id) {
		if (People.teams2invitees[team_id]) {
			var inviteesReady = false;
			
			for(var i in People.teams2invitees[team_id]) {
				if (isNumeric(i)) {
					if (!People.invited.inArray(People.teams2invitees[team_id][i]) &&
						!People.stagedInvitees.inArray(People.teams2invitees[team_id][i])) inviteesReady = true;
				}
			}
			
			if (inviteesReady) {
				if (!People.stagedTeams.inArray(team_id)) People.stagedTeams.push(team_id);
				People.checkPeople();
				People.buildInviteStaging();
			}

                        if (People.autoExpandGroupings == true) People.expandTeam(team_id,true);
		}
	},
	
	hideOpt: function(increment,opt,container) {
		var el = increment+"_"+opt;
		
		if ($(el)) {
			$(el).up('div').style.background = "white";
			$(el).up('div').style.borderTop = "1px solid white";
			$(el).up('div').style.borderLeft = "1px solid white";
			$(el).up('div').style.borderRight = "1px solid white";
			
			if (container) $(increment+"_"+container).style.display = "none";
		}
	},
	
	clearOpts: function(increment) {
		if ($(increment+'_list_remove')) People.hideOpt(increment,'list_remove','remove_from_list_details');
		if ($(increment+'_list_add')) People.hideOpt(increment,'list_add','add_to_list_details');
		if ($(increment+'_remove')) People.hideOpt(increment,'remove',false);
		if ($(increment+'_hifive')) People.hideOpt(increment,'hifive',false);
		if ($(increment+'_invite')) People.hideOpt(increment,'invite','invite_details');
		if ($(increment+'_msg')) People.hideOpt(increment,'msg','msg_details');
	},
	
	toggleOpt: function(increment,container,opt) {
		if ($(increment+"_"+container) && $(increment+"_"+container).style.display !== "block") {
			People.clearOpts(increment);
			
			$(increment+"_"+opt).up('div').style.background = "#eeeeee";
			$(increment+"_"+opt).up('div').style.borderTop = "1px dotted silver";
			$(increment+"_"+opt).up('div').style.borderLeft = "1px dotted silver";
			$(increment+"_"+opt).up('div').style.borderRight = "1px dotted silver";
			
			var abs = Page.absPos($(increment+"_"+opt));
			
			$(increment+"_"+container).style.left = (abs['w']-10)+"px";
			$(increment+"_"+container).style.top = (abs['n']+18)+"px";
			
			$(increment+"_"+container).style.display = "block";
		} else People.hideOpt(increment,opt,container);
	},
	
	clearSearch: function() {
            if ($('peopleSearchInput')) {
		$('peopleSearchInput').value = People.defaultSearch;
		$('peopleSearchInput').style.color = "gray";
		$('peopleSearchInput').style.border = "1px solid silver";
            }
	},

	clearActives: function() {
		$('network').removeClassName("active");
		$('lists').removeClassName("active");
		$('searching').removeClassName("active");
		$('teams').removeClassName("active");
		if ($('via_email')) $('via_email').removeClassName("active");
	},

        browseOrgs: Array(),
        
        toggleOrgSearchOther: function() {
            if ($('browse_org_other_input').style.display !== "none") {
                $('browse_org_other').removeClassName("active");
                $('browse_org_other_input').style.display = "none";
            } else {
                $('browse_org_other').addClassName("active");
                $('browse_org_other_input').style.display = "inline";
            }
        },

        toggleOrgSearch: function(org_id) {
            if (People.browseOrgs.inArray(org_id)) {
                $("browse_org_"+org_id).removeClassName("active");
                People.browseOrgs.removeItems(org_id);
            } else {
                $("browse_org_"+org_id).addClassName("active");
                People.browseOrgs.push(org_id);
            }

            if ($('browse_orgs')) $('browse_orgs').value = People.browseOrgs.toString();
        }
};

var Mapping = 
{
	currentLatLong: false,
	sendCanvas: false,
	
	getMapAndMarkers: function(canvas,markers,center) {
		if (GBrowserIsCompatible()) {
			var map = new GMap2(document.getElementById(canvas));
			map.setCenter(new GLatLng(center.lat, center.long), 13);
			
        	for (var i = 0; i < markers.length; i++) {
        		var point = new GLatLng(markers[i].lat,
        								markers[i].long);
        		
        		map.addOverlay(new GMarker(point));
        	}
		}
	},
	
	parseLocation: function(response) {
		if (response) {
			var place = response.Placemark[0];
			Mapping.currentLatLong = { 'lat':place.Point.coordinates[1], 'long':place.Point.coordinates[0] };
		} else Mapping.currentLatLong = false;
		
		Mapping.getMapAndMarkers(Mapping.sendCanvas,Array(Mapping.currentLatLong),Mapping.currentLatLong);
	},
	
	getAddress: function(search) {
		var geocoder = new GClientGeocoder();
		geocoder.getLocations(search,Mapping.parseLocation);
	},
	
	buildMapByAddress: function(addr,canvas,textTarget) {
		Mapping.sendCanvas = canvas;
		Mapping.getAddress(addr);
		Mapping.grabAndSendAddress(addr,textTarget);
	},
	
	getLatLong: function(search) {
		App.onSuccess = function(latlong) { return latlong; };
		var params = { 'do':'get-latlong', 'search':search };
		App.request("/cp/Maps/", "POST", params);
	},
	
	grabAndSendAddress: function(search,target) {
		App.onSuccess = function(addr) { $(target).innerHTML = addr; };
		var params = { 'do':'get-address', 'search':search };
		App.request("/cp/Maps/", "POST", params);
	}
};

/**
 * Sets a tooltip to appear when the specified object is moused over.
 * @param	mixed	obj		Either a prototype-extended element, or the id of the target element as a string
 * @param	object	params	An object that specifies the parameters for the tooltip with the following options:
 * 							content			(string)		The content of the tooltip
 * 							onClickContent	(string)		The content to show in the tooltip if you click the object
 * 							position		(string)		Where the tooltip should appear relative to the object that generates it:
 * 																Current options: bottomCenter (default), bottom, top, topCenter, rightCenter
 * 							persist			(boolean)		Whether or not the tooltip should remain visible when it gets moused over
 * 							moveHorizontal	(integer)		Distance to move horizontally as the tooltip appears
 * 							moveVertical	(integer)		Distance to move vertically as the tooltip appears
 * 							moveDuration	(float)			How long the tooltip should take to move into place
 * 							fadeIn			(object)		Scriptaculous parameters for an Appear effect
 * 							innerClass		(array|string)	One class or many classes to assign to the container of the tooltip content
 * 							outerClass		(array|string)	One class of many classes to assign to the wrapper of the tooltip (stuff that happens outside the content like tails)
 * @author 	JB
 * @version	1.0
 */
var ToolTip = Class.create({
	
	initialize: function(obj, params)
	{
		this.obj = typeof(obj) == 'string' ? $(obj) : obj;

		this.params = params;
		
		this.enabled = true;

		this.acceptablePositions = ['bottomCenter', 'bottom', 'top', 'topCenter', 'rightCenter'];
		
		this.position = this.params.position != undefined && this.acceptablePositions.indexOf(this.params.position) > -1 ? this.params.position : 'bottomCenter';

		this.unique_id = 'tooltip_' + Math.floor(Math.random()*100000);

		this.persist = params.persist != undefined ? params.persist : false;

		this.obj.observe('mouseover', this.showToolTip.bind(this));
		this.obj.observe('mouseout', this.hideToolTip.bind(this));
		this.obj.observe('click', this.clickToolTip.bind(this));
		
		//From Bob: I moved all of the code below into the top of the showToolTip function ... the rendered variable is so that the stuff only happens the first time you mouseover
		
		this.rendered = false;

		//this.template = new Template('#{id}');

//		this.tooltip = new Element('div', {'id': this.unique_id});
//		//this.tooltip.innerHTML = this.template.evaluate({'id': this.unique_id});
//		//this.tooltip.innerHTML = this.params.content;
//
//		this.tooltip.setStyle({
//			'position': 'absolute',
//			'display': 'none',
//			'zIndex': '10000'
//		});
//
//		this.tooltipContent = new Element('div');
//		this.tooltipContent.innerHTML = this.params.content;
//		
//		$('body').insert(this.tooltip);
//		this.tooltip = $(this.unique_id);
//		this.tooltip.insert(this.tooltipContent);
//		this.tooltipContent = this.tooltip.firstDescendant();
//		
//		this.tooltip.observe('mouseover', this.overToolTip.bind(this));
//		this.tooltip.observe('mouseout', this.notOverToolTip.bind(this));
	},
	
	setPosition: function()
	{
		this.offset = this.obj.cumulativeOffset();

		this.adjustX = this.params.moveHorizontal != undefined ? this.params.moveHorizontal : 0;
		this.adjustY = this.params.moveVertical != undefined ? this.params.moveVertical : 0;

		this.params.horizontalOffset = this.params.horizontalOffset != undefined ? this.params.horizontalOffset : 0;
		
		switch(this.position)
		{
			case 'bottomCenter':
				this.left = this.offset[0] + (this.obj.getWidth()/2)-(this.tooltip.getWidth()/2) + this.adjustX*-1 + this.params.horizontalOffset;
				this.top = this.offset[1] + this.obj.getHeight() + this.adjustY*-1;
			break;

			case 'bottom':
				this.left = this.offset[0] + this.adjustX*-1 + this.params.horizontalOffset;
				this.top = this.offset[1] + this.obj.getHeight() + this.adjustY*-1;
			break;

			case 'top':
				this.left = this.offset[0] + this.adjustX*-1 + this.params.horizontalOffset;
				this.top = this.offset[1] - this.tooltip.getHeight() + this.adjustY*-1;
			break;

			case 'topCenter':
				this.top = this.offset[1] - this.tooltip.getHeight() + this.adjustX + this.params.horizontalOffset;
				this.left = this.offset[0] + (this.obj.getWidth()/2)-(this.tooltip.getWidth()/2) + this.adjustY*-1;
			break;
			
			case 'rightCenter':
				this.top = this.offset[1] - (this.tooltip.getHeight()/2 - this.obj.getHeight()/2);
				this.left = this.offset[0] + this.obj.getWidth() + this.params.horizontalOffset;
			break;
				
				
		}
		
		this.tooltip.setStyle({
			'top': this.top+'px',
			'left': this.left+'px'
		});
	},
	
	showToolTip: function()
	{
		if(!this.rendered)
		{
			this.tooltip = new Element('div', {'id': this.unique_id});
			//this.tooltip.innerHTML = this.template.evaluate({'id': this.unique_id});
			//this.tooltip.innerHTML = this.params.content;

			this.tooltip.setStyle({
				'position': 'absolute',
				'display': 'none',
				'zIndex': '10000'
			});

			this.tooltipContent = new Element('div');
			this.tooltipContent.innerHTML = this.params.content;
		
			$('body').insert(this.tooltip);
			this.tooltip = $(this.unique_id);
			this.tooltip.insert(this.tooltipContent);
			this.tooltipContent = this.tooltip.firstDescendant();
		
			this.tooltip.observe('mouseover', this.overToolTip.bind(this));
			this.tooltip.observe('mouseout', this.notOverToolTip.bind(this));
			this.rendered = true;
		}
		
		if(this.enabled == true)
		{
			this.overObj = true;
			this.setClass();
			this.setPosition();
			this.tooltipContent.innerHTML = this.params.content;
			new Effect.Move(this.tooltip, {x: this.adjustX, y: this.adjustY, duration: this.params.moveDuration != undefined ? this.params.moveDuration : 0, mode: 'relative'});
			if(this.params.fadeIn != undefined && typeof(this.params.fadeIn) == 'object')
			{
				new Effect.Appear(this.tooltip, this.params.fadeIn);
			}
			else
			{
				new Effect.Appear(this.tooltip, {duration: 0});
			}
		}
	},
	
	hideToolTip: function()
	{
		this.overObj = false;
		this.startTimer();
	},
	
	adjustPosition: function()
	{
		this.left = this.offset[0];
		this.top = this.offset[1] + this.obj.getHeight();
	},
	
	setClass: function()
	{
		if(this.params.innerClass != undefined)
		{
			if(typeof(this.params.innerClass) == 'object')
			{
				for(i = 0; i < this.params.innerClass.length; i++) this.tooltipContent.addClassName(this.params.innerClass[i]);
			} else this.tooltipContent.addClassName(this.params.innerClass);
		}
		
		if(this.params.outerClass != undefined)
		{
			if(typeof(this.params.outerClass) == 'object')
			{
				for(i = 0; i < this.params.outerClass.length; i++) this.tooltip.addClassName(this.params.outerClass[i]);
			} else this.tooltip.addClassName(this.params.outerClass);
		}
	},
	
	setParameters: function(params)
	{
		//Add a css class or classes
		if(params.classes != undefined)
		{
			this.tooltip.addClassName(params.classes);
		}
	},
	
	checkHide: function()
	{
		if((this.overToolTipState != true && this.overObj != true) || (this.persist == false && this.overObj != true))
		{
			new Effect.Move(this.tooltip, {x: this.adjustX*-1, y: this.adjustY*-1, duration: this.params.moveDuration != undefined ? this.params.moveDuration : 0, mode: 'relative'});
			if(this.params.fadeOut != undefined && typeof(this.params.fadeOut) == 'object')
			{
				new Effect.Fade(this.tooltip, this.params.fadeOut);
			}
			else
			{
				new Effect.Fade(this.tooltip, {duration: 0});
			}
		}
	},
	
	overToolTip: function()
	{
		this.overToolTipState = true;
	},

	clickToolTip: function()
	{
		if(this.params.onClickContent && !this.params.onClickContent.blank())
			this.tooltipContent.innerHTML = this.params.onClickContent;
	},
	
	notOverToolTip: function()
	{
		this.overToolTipState = false;
		this.startTimer();
	},

	startTimer: function()
	{
		var tt = this;
		this.timer = setTimeout(function() { tt.checkHide(); }, 50);
	},
	
	enable: function()
	{
		this.enabled = true;
	},
	
	disable: function()
	{
		this.enabled = false;
	}
	
});

/**
 * containerClass string (optional)
 * headerClass string (optional)
 * title string (optional)
 */
var PopupClass = Class.create({
	
	initialize: function()
	{
		this.container = false;
		this.header = false;
		this.title = false;
		this.closeLink = false;
		this.clearDiv = false;
		this.contentContainer = false;
	},
	
	build: function(params)
	{
		this.buildFrame(params);
		this.setDraggable(params);
		this.position(params);
	},
	
	buildFrame: function(params)
	{
		var _this = this;
		
		if($('popup-container')) $('popup-container').remove();
		
		//Build the container with the appropriate class
		this.container = new Element('div', {'id': 'popup-container', 'style': 'z-index: 1000;'});
		this.container.hide();
		if(params.containerClass != undefined && typeof(params.containerClass) == 'string')
		{
			this.container.addClassName(params.containerClass);
		} else this.container.addClassName('popup-graph');
		
		//Build the header
		this.header = new Element('div');
		if(params.headerClass != undefined && typeof(params.headerClass) == 'string')
		{
			this.header.addClassName(params.headerClass);
		} else this.header.addClassName('graph-header');
		
		//Build the title and place it in the header
		this.title = new Element('h4');
		if(params.title != undefined && typeof(params.title) == 'string') this.title.update(params.title);
		this.header.insert(this.title);
		
		//Build the close link and place it in the header
		this.closeLink = new Element('a', {href: '#', 'class': 'closegraph'});
		this.closeLink.observe('click', function(e) { e.stop(); _this.close(); });
		this.header.insert(this.closeLink);
		
		//Build clear div
		this.clearDiv = new Element('div', {'class': 'both'});
		this.header.insert(this.clearDiv);
		
		//Insert the header into the container
		this.container.insert(this.header);
		
		//Build the content container
		this.contentContainer = new Element('div');
		if(params.contentClass != undefined && typeof(params.contentClass) == 'string')
		{
			this.contentContainer.addClassName(params.contentClass);
		} else this.contentContainer.addClassName('graph-container');
		this.contentContainer.setStyle({'backgroundColor': '#FFFFFF'});
		
		//Insert the content container into the whole container
		this.container.insert(this.contentContainer);
		
		//Insert the whole container into the body of the page
		$(document.body).insert(this.container);
	},
	
	setDraggable: function(params)
	{
		var d = new Draggable(this.container, {handle: this.header});
	},
	
	buildFromURL: function(url, method, vars, params)
	{
		if(url == undefined || typeof(url) != 'string') return false;
	
		var _this = this;
		
		this.buildFrame(params);
		
		if(method != 'POST') method = 'GET';
		
		App.onSuccess = function(response)
		{
			_this.completeBuild(params);
		}
		
		App.request(url, method, vars, this.contentContainer);
	},
	
	buildFromText: function(params)
	{
		//
	},
	
	completeBuild: function(params)
	{
		this.position(params);
		this.setDraggable(params);
		this.container.show();
	},
	
	position: function(params)
	{
		if(params.relativeTo != undefined)
		{
			//Place the popup relative to the given element
			return true;
		}
		
		var x1 = document.viewport.getDimensions().width;
		var y1 = document.viewport.getDimensions().height;
		
		var x2 = this.container.getDimensions().width;
		var y2 = this.container.getDimensions().height;
		
		var x3 = document.viewport.getScrollOffsets().left;
		var y3 = document.viewport.getScrollOffsets().top;
		
		var left = (x1/2) - (x2/2) + x3;
		var top = (y1/2) - (y2/2) + y3;
		
		left = left+'px';
		top = top+'px';
		
		this.container.setStyle({'position': 'absolute', 'left': left, 'top': top, 'display':'block'});
	},
	
	close: function()
	{
		this.container.hide();
	}

});

var Popup = new PopupClass();


/**
 * Format number with a comma
 */
Number.prototype.formatWithComma = function()
{
    if (isNaN(this))
    {
        return this;
    }

    var asString = (this % 1000).toString();
    var x = parseInt(this / 1000, 10);

    while (x > 0)
    {
        asString = (x % 1000) + ',' + '0'.times(3 - asString.length) + asString;
        x = parseInt(x / 1000, 10);
    }

    return asString;
};


//var Validator = Class.create({
//	
//	initialize: function()
//	{
//		this.rules = [];
//	},
//	
//	addRule: function(type, params)
//	{
//		this.rules.push({'type':type, 'params':params});
//	},
//	
//	addEmptyCheck: function(element, params)
//	{
//		params.element = element;
//		this.addRule('empty', params);
//	},
//	
//	addEitherOrCheck: function(firstSet, secondSet, params)
//	{
//		params.firstSet = firstSet;
//		params.secondSet = secondSet;
//		this.addRule('eitherOr', params);
//	},
//	
//	addLaterDateCheck: function(firstElement, secondSet, equal, params)
//	{
//		params.firstElement = firstElement;
//		params.secondSet = secondSet;
//		params.equal = equal;
//		params.timing = 'later';
//		this.addRule('dateTiming', params);
//	},
//	
//	addEarlierDateCheck: function(firstElement, secondSet, equal, params)
//	{
//		params.firstElement = firstElement;
//		params.secondSet = secondSet;
//		params.equal = equal;
//		params.timing = 'earlier';
//		this.addRule('dateTiming', params);
//	},
//	
//	process: function(debug)
//	{
//		this.pass = true;
//		this.messages = [];
//		this.codes = [];
//		
//		var _this = this;
//		
//		this.rules.each(function(rule)
//		{
//			var check = {};
//			
//			switch(rule.type)
//			{
//				case 'empty':
//					check = _this.processEmptyCheck(rule.params);
//					break;
//					
//				case 'eitherOr':
//					check = _this.processEitherOrCheck(rule.params);
//					break;
//				
//				case 'dateTiming':
//					check = _this.processDateCheck(rule.params);
//					break;
//			}
//			
//			if(check == false)
//			{
//				_this.processFailure(rule.params);
//				_this.pass = false;
//				
//				if(rule.params.message) _this.messages.push(rule.params.message);
//				if(rule.params.code !== false) _this.codes.push(rule.params.code);
//			}
//		});
//		
//		var results = {
//			pass: this.pass,
//			messages: this.messages,
//			codes: this.codes
//		}
//		
//		if(debug === true) alert(Object.toJSON(results));
//		
//		return results;
//	},
//	
//	processFailure: function(params)
//	{
//		if(params.addClasses)
//		{
//			params.addClasses.each(function(obj)
//			{
//				if(typeof(obj.element) == 'object')
//				{
//					obj.element.each(function(elem)
//					{
//						var el = $(elem);
//						obj.classes.each(function(cl)
//						{
//							el.addClassName(cl);
//						});
//					});
//				}
//				else
//				{
//					var el = $(obj.element)
//					if(typeof(obj.classes) == 'string') obj.classes = [obj.classes];
//					
//					obj.classes.each(function(cl)
//					{
//						el.addClassName(cl);
//					});
//				}
//			});
//		}
//	},
//
//	processEmptyCheck: function(params)
//	{
//		var pass = true;
//		
//		var el = $(params.element);
//		
//		if(el)
//		{
//			switch(el.tagName)
//			{
//				case 'INPUT':
//					switch(el.type)
//					{
//						case 'text':
//							if(el.value.blank()) pass = false;
//							break;
//							
//						case 'checkbox':
//							if(el.checked == false) pass = false;
//							break;
//					}
//					break;
//					
//				case 'TEXTAREA':
//					if(el.value.blank()) pass = false;
//					break;
//			}
//		} else pass = false;
//		
//		return pass;
//	},
//	
//	processEitherOrCheck: function(params)
//	{
//		var pass = true;
//		
//		var _this = this;
//		
//		if(typeof(params.firstSet) == 'object')
//		{
//			params.firstSet.each(function(el)
//			{
//				if(!_this.processEmptyCheck({element: el})) pass = false;
//			});
//		} else if(!_this.processEmptyCheck({element: params.firstSet})) pass = false;
//		
//		if(pass) return true;
//		
//		pass = true;
//		
//		if(typeof(params.secondSet) == 'object')
//		{
//			params.secondSet.each(function(el)
//			{
//				if(!_this.processEmptyCheck({element: el})) pass = false;
//			});
//		} else if(!_this.processEmptyCheck({element: params.firstSet})) pass = false;
//		
//		return pass;
//	},
//	
//	processDateCheck: function(params)
//	{
//		var pass = true;
//		
//		var _this = this;
//		
//		var hasValue = _this.processEmptyCheck({element: params.firstElement});
//		
//		
//		//Check each value of the secondSet, if it has a value, make sure that the original element has a value, and check the dates
//		if(typeof(params.secondSet) == 'object')
//		{
//			params.secondSet.each(function(el)
//			{
//				if(_this.processEmptyCheck({element: el}))
//				{
//					if(hasValue)
//					{
//						if(_this.dateCheck(params.firstElement, el, params.timing, params.equal)) pass = false;
//					} else pass = false;
//				}
//			});
//		}
//		else
//		{
//			if(_this.processEmptyCheck({element: params.secondSet}))
//			{
//				if(hasValue)
//				{
//					if(_this.dateCheck(params.firstElement, params.secondSet, params.timing, params.equal)) pass = false;
//				} else pass = false;
//			}
//		}
//		
//		return pass;
//	},
//	
//	dateCheck: function(first, second, timing, equal)
//	{
//		var dt_first = new Date($(first).value);
//		var dt_second = new Date($(second).value);
//		
//		switch(timing)
//		{
//			case 'later':
//				return ((equal == true && dt_first > dt_second) || (equal == false && dt_first >= dt_second)) ? true : false;
//				break;
//			
//			case 'earlier':
//				return ((equal == true && dt_first < dt_second) || (equal == false && dt_first <= dt_second)) ? true : false;
//				break;
//		}
//	},
//	
//	processClasses: function(classes)
//	{
//		var _this = this;
//		
//		classes.each(function(cl)
//		{
//			_this.processFailure({addClasses: [cl]});
//		});
//	}
//	
//});

