window.tm = {
	disabled: {},
	old: {},
	session: {},
	load: {
		old: [],
		disabled: [],
		helper: []
	},
	
	'addLoad': function(action,params) {
		this.load[action].push(params);
		return true;
	},
	'addLoadArray': function(actions) {
		this.load = actions;
		return true;
	},
	
	'addHelperText': function(elementID,tmDefaultValue,formID) {
		if ( formID != undefined ) {
			if ( this.isFormDisabled(formID) ) { //  || this.isFormOld(formID)
				return false;
			}
		}
		if ( ! $(elementID) ) return false;
		$(elementID).tmDefaultValue = tmDefaultValue;
		$(elementID).addEvent('focus',function() {
			if ( this.value == this.tmDefaultValue ) {
				this.value = '';
			}
			this.addClass('realText');
		});
		$(elementID).addEvent('blur',function() {
			if ( this.value == '' || this.value == this.tmDefaultValue ) {
				this.value = this.tmDefaultValue;
				this.removeClass('realText');
			} else {
				this.addClass('realText');
			}
		});
		$(elementID).fireEvent('blur');
		//this.log('added helper text to element #'+elementID+' with value "'+tmDefaultValue+'" for form '+formID);
		return true;
	},
	'setFormDisabled': function(formID,status) {
		this.disabled[formID] = status;
		
		var f = $(formID);
		if ( !f ) {
			//alert('no such form: '+formID+' (form is: '+f+').');
			return 'no form yet';
		}
		var st = ( status ? 'disabled' : '' );
		var els = f.getElements('select,input,textarea');
		var c = 0;
		var d = 0;
		els.each( function(el) {
			d++;
			if ( !status && el.hasClass('dontEnable') ) {
				//at present, nothing
			} else {
				c++;
				el.set('disabled',st);
			}
		});
		this.log('disabled set to '+status+' for '+formID+' ('+c+' out of '+d+' elements)');
		return true;
	},
	'setFormOld': function(formID,status) {
		try {
			this.old[formID] = status;
			//this.log('old set to '+status+' for '+formID);
		} catch( e ) {
			this.log('error in tm.setFormold: '+e);
		}
		return true;
	},
	'isFormDisabled': function(formID) {
		if ( this.disabled[formID] != undefined ) {
			return this.disabled[formID];
		}
		return false;
	},
	'isFormOld': function(formID) {
		if ( this.old[formID] != undefined ) {
			return this.old[formID];
		}
		return false;
	},
	
	'changeDetailDisplay':	function(state) {
		var trs = this.getDetailElems();
		if ( state ) {
			trs.detailed.each(
				function( elem ) {
					elem.setStyles({opacity:0,display:'table-row'});
					elem.fade('in');
				}
			);
			$$('.detailsShow').each( function(elem) { elem.setStyle('display','none');});
			$$('.detailsHide').each( function(elem) { elem.setStyle('display','block');});
		} else {
			trs.detailed.each(
				function( elem ) {
					var fx = new Fx.Tween(elem,{
						'onComplete':
							function(elem) {
								elem.setStyles({display:'none'});
							}
					});
					fx.start( 'opacity',0 );
				}
			);
			$$('.detailsShow').each( function(elem) { elem.setStyle('display','block');});
			$$('.detailsHide').each( function(elem) { elem.setStyle('display','none');});
		}
		return false;
	},
	
	'getDetailElems': function() {
		var ret = {
			basic: [],
			detailed: []
		};
		

		if ( ret.basic.length == 0 && ret.detailed.length == 0 ) {
			var trs = $$('tr.input');
			trs.each(
				function( elem ) {
					if ( elem.hasClass('basic') ) {
						ret.basic.push( elem );
					} else {
						ret.detailed.push( elem );
					}
				}
			);
		}
		return ret;
	},
	
	'initDoc': function() {
		
		/* ondomready */
		
		window.addEvent('domready',function() {
			
			//handle nav highlighting
			if ( tmDocTitle === undefined ) {
				window.tm.log("Global initialization script: tmDocTitle is not defined, is there a bug in that variable's init script?");
				return false;
			}
			$$('#nav li').each( function(element) {
				if ( element.hasClass(tmDocTitle) ) {
					element.addClass('active');
				}
				//alert('element has class "active"? '+element.hasClass('active'));
			});
			
			//handle disclosure links
			$$('.disclosure').each( function(element) {
				element.addEvent('click',function(elem) {
					var flag = 0;
					this.getParent().getElements('.message').each( function(msgElem) {
						if ( flag == 0 ) {
							if ( msgElem.getStyle('display') =='block' ) {
								flag = 2;
							} else {
								flag = 1;
							}
						}
						if ( flag == 1 ) {
							msgElem.fade('hide');
							msgElem.setStyle('display','block');
							msgElem.fade('in');
						} else {
							msgElem.setStyle('display','none');
						}
					});
					
					if ( flag == 2 ) {
						element.removeClass('opened');
					} else {
						element.addClass('opened');
					}
				});
			});
			
			//handle forms with detailed fields
			var dets = $$('.input.basic');
			if ( dets.length ) {
				var fieldSets = $$('.inputs');
				fieldSets.each( function(elem) {
					var a = new Element('a',{
						'href': '#',
						'html': 'Show Details',
						'class': 'detailsBtn detailsShow',
						'events': {
							'click': function() { window.tm.changeDetailDisplay(true); }
						}
					});
					a.inject( elem , 'before' );
					var a2 = new Element('a',{
						'href': '#',
						'html': 'Hide Details',
						'class': 'detailsBtn detailsHide',
						'events': {
							'click': function() { window.tm.changeDetailDisplay(false); }
						}
					});
					a2.inject( elem , 'before' );
					window.tm.changeDetailDisplay(false); 
				});
			}
			
			$$('select.formOther').each( function(el) {
				var oEl = $(el.id+'Other');
				if ( oEl ) {
					el.addEvent('change',function() {
						var s = this.getSelected();
						var oEl1 = $(this.id+'Other');
						if ( s[0] && oEl1 ) {
							if ( s[0].value != 'other' ) {
								oEl1.disabled = true;
							} else {
								oEl1.disabled = false;
								oEl1.focus();
							}
						}
					});
					oEl.addEvent('change',function() {
						var oEl0 = $(this.id.substring(0,this.id.length-5));
						if ( this.value.length > 0 && oEl0 ) {
							oEl0.selectedIndex = oEl0.options.length-1;
						}
					});
					el.fireEvent('change');
				}
			});
			
			$$('.inputDigits').each( function(el) {
				el.addEvent('keydown',function(ev) {
					if ( !/(backspace|tab|delete|enter)/.test(ev.key) && !ev.meta ) {
						if ( ev.shift || ev.control || !/(backspace|tab|delete|enter|[0-9])/.test(ev.key) ) {
							ev.stop();
						}
					}
				});
			});
			$$('.inputPhone').each( function(el) {
				el.addEvent('keydown',function(ev) {
					if ( !/(backspace|tab|delete|enter)/.test(ev.key) && !ev.meta ) {
						if ( ev.shift || ev.control || !/(backspace|tab|delete|enter|[0-9]|-|½|—|—)/.test(ev.key) ) {
							ev.stop();
						}
					}
				});
			});
			
			//form helpers: old,disabled,helper [text]
			//alert(tmOnLoad.helper[0]);
			//alert(tmOnLoad.old);
			
			for ( k in window.tm.load.old ) {
				//alert(k);
				//alert(tmOnLoad.old[k]+': '+k);
				try {
					if ( typeof window.tm.load.old[k]=='string' ) {
						//window.tm.log('*** Setting Old Form: '+window.tm.load.old[k] );
						window.tm.setFormOld( window.tm.load.old[k], true );
					} else {
						/*
						
							THIS IS A HUGE BUG THAT HAS TO BE SQUASHED: HOW DOES THE 'OLD' PROPERTY KEEP GETTING FILLED WITH ATTRIBUTES
							LIKE FUNCTIONS, ETC??????????
							FUCK
							
							FUCK
							
							FUCK
						
						*/
						//window.tm.log('Tried to set the old status of a non-string item: '+(typeof window.tm.load.old[k]));
					}
				} catch( e ) {
					//alert( this);
					window.tm.log('Could not set old for form: '+window.tm.load.old[k] );
				}
			}
			for ( k in window.tm.load.disabled ) {
				//alert(tmOnLoad.disabled[k]+': '+k);
				window.tm.setFormDisabled( window.tm.load.disabled[k], true );
			}
			for ( k in window.tm.load.helper ) {
				window.tm.addHelperText( window.tm.load.helper[k][0],window.tm.load.helper[k][1],window.tm.load.helper[k][2] );
			}

		});
		
		return true;
		
		/* end ondomready */
		
	},
	
	'getTZO': function() {
	
		if ( this.session.tzo ) return this.session.tzo;
		try {
			
			var visitortime = new Date();
			if (visitortime) {
				this.session.tzo = -60 * visitortime.getTimezoneOffset();
			}
		} catch (myEx) {
			this.session.tzo = 0;
		}
		
		return this.session.tzo;
		
	},
	
	'log': function(text, args) {
	
		//var txt = text.substitute(args || {});
		
		if (window.console) {
			console.log(text);
		} else {
			//alert(txt);
		}
		
	},
	
	'selectedValue': function(menuElem) {
		if ( menuElem instanceof String ) {
			menuElem = $(menuElem);
		}
		try {
			var v = menuElem.options[menuElem.selectedIndex].value;
			return v;
		} catch ( e ) {}
		return '';
	}
	
}

window.tm.initDoc();




