/*
	'+---------------------------------------------------------------------------------------------
	'|                                  ~~ /core/common.js ~~                                   
	'+---------------------------------------------------------------------------------------------
	'| Author: [dkindel]                                                                           
	'| Copyright Notice:                                                                           
	'|		Copyright © 2006 GamingLounge Network, All rights reserved.                            
	'|		This source code is part of the ASPblocks application and may only be used under the   
	'|		terms of a valid software license. You are free to modify this source to suit your     
	'|		needs; derivitive works based on this source however are prohibited and violate the    
	'|		terms under which your license was acquired. Removal of this notice will result in     
	'|		revocation of your license and your ability to continue to use this source code.       
	'|		http://www.aspblocks.com/                                                                            
	'+---------------------------------------------------------------------------------------------
*/

	var gHints = new Array();
	var gCounters = new Array();
	var gUseCustomDialogs = false;
	
	///Hint
	function Hint(id, title, description, targetId, oldTitle, oldDescription){
		this.Id = id;
		this.Title = title;
		this.Description = description;
		this.TargetId = targetId;
		this.OldTitle = oldTitle;
		this.OldDescription = oldDescription;
		gHints[gHints.length] = this;
		return gHints[gHints.length];
	}
	///Counter
	///object that contains a count that can be passed byRef if needed
	function Counter(name, intStartingValue){
		this.Name = name;
		this.Index = intStartingValue;
		this.Direction = 1;
		this.Active = true;
		this.Add = function(){
			if (this.Direction == 1) 
				this.Index++
			else
				this.Index--; 
			};
		this.Stop = function(){
			this.Active = false
			};
		this.Start = function(){
			this.Active = true;
			};
	}

	///ToggleSelectInput
	function ToggleSelectInput(name){
		if (name != ''){
			var sel = document.getElementById(name + 'Select');
			var txt = document.getElementById(name + 'Text');
			if (sel != null && txt != null){
				var list = sel.getElementsByTagName("select");
				var field = txt.getElementsByTagName("input");
				if (list.length > 0 && field.length > 0){
					field[0].style.width = list[0].offsetWidth;
					field[0].style.height = list[0].offsetHeight;
				}
				if (sel.style.display == 'block' || sel.style.display == ''){
					sel.style.display = 'none';
					txt.style.display = 'block';
				}
				else{
					sel.style.display = 'block';
					txt.style.display = 'none';	
				}
			}
		}
		return false;
	}

	///TabList
	function TabList(obj){
		var parent = obj.parentNode;
		if (parent != null){
			var div = parent.parentNode;
			if (div != null){
				var children = parent.childNodes;
				var count = 0;
				var current = 0;
				for(var i=0; i<children.length; i++){
					var node = children[i];
					if ((node.tagName + '').toLowerCase() == 'li'){
						count ++;
						if (node == obj){
							current = count;
						}
						else{
							node.className = 'Tab';
							var el = document.getElementById(div.id + count);
							if (el != null){ el.style.display = 'none';	}
						}
					}
				}
				obj.className = 'TabSelected';
				var el = document.getElementById(div.id + current);
				if (el != null && el.style.display != 'block') el.style.display = 'block';
			}
		}
	}
	
	///ShowData
	function ShowData(id, index){
		var el = document.getElementById(id);
		if (el != null){
			var children = el.childNodes;
			for(var i=0; i<children.length; i++){
				var node = children[i];
				if ((node.tagName + '').toLowerCase() == 'div'){
					if (node.id == (id + index)){
						node.className = 'OptionSelected';
					}
					else{
						node.className = 'Option';
					}
				}
			}
		}
	}

	///ToggleDisplayIfChecked
	function ToggleDisplayIfChecked(id, obj){
		var el = document.getElementById(id);
		if (el != null){
			if (obj.checked)
				ShowViaClassName(el);
			else
				HideViaClassName(el);
		}
	}
	
	///ToggleDisplayIfUnchecked
	function ToggleDisplayIfUnchecked(id, obj){
		var el = document.getElementById(id);
		if (el != null){
			if (obj.checked)
				HideViaClassName(el);
			else
				ShowViaClassName(el);
		}
	}

	///SelectListTextChange
	function SelectListTextChange(obj){
		if (obj != null){
			var div = obj.parentNode;
			var nodes = div.childNodes;	
			var del = null;
			for(var i=0; i<nodes.length; i++){
				var node = nodes[i];
				switch (node.nodeName.toLowerCase()){
					case 'a':
						if (node.innerHTML.toLowerCase() == 'delete')
							del = node;
						break;
				}
			}
			if (del != null){
				if(obj.selectedIndex != -1){
					if (obj.options[obj.selectedIndex].value == ''){
						HideViaClassName(del);
					}
					else{
						ShowViaClassName(del);
					}
				}
			}
		}
	}

	///SelectListTextDelete
	function SelectListTextDelete(obj, url){
		if (obj != null){
			var div = obj.parentNode;
			var nodes = div.childNodes;	
			var sel = null;
			for(var i=0; i<nodes.length; i++){
				var node = nodes[i];
				switch (node.nodeName.toLowerCase()){
					case 'select':
						if (node.className != null)
							sel = node;
						break;
				}
			}
			if (sel != null){
				var s = '';
				if (sel.multiple){
					for(var i=0; i<sel.options.length; i++){
						if (sel.options[i].selected){
							if (s != '') s += ',';
							s += sel.options[i].value;
						}
					}
				}
				else{
					if(obj.selectedIndex != -1)
						s = sel.options[sel.selectedIndex].value;
				}
				location.href = url + s;
			}
		}
	}

	///ToggleSelectListText
	function ToggleSelectListText(obj){
		if (obj != null){
			var div = obj.parentNode;
			var nodes = div.childNodes;
			var sel = null;
			var txt = null;
			var isTextarea = false;
			for(var i=0; i<nodes.length; i++){
				var node = nodes[i];
				switch (node.nodeName.toLowerCase()){
					case 'select':
						sel = node;
						break;
					case 'input':
						txt = node;
						break;
					case 'textarea':
						txt = node;
						isTextarea = true;
						break;
				}
			}
			if (obj.innerHTML == 'Add'){
				if (isTextarea) txt.style.height = (sel.offsetHeight-2) + 'px';
				obj.innerHTML = 'Choose';
				HideViaClassName(sel);
				ShowViaClassName(txt);
			}
			else{
				obj.innerHTML = 'Add';
				HideViaClassName(txt);
				ShowViaClassName(sel);
			}
		}
		return false;
	}

	///HideViaClassName
	function HideViaClassName(el){
		if (el != null){
			var name = el.className;
			if (Right(name, 6) != 'Hidden') el.className += 'Hidden';
		}
	}

	///ShowViaClassName
	function ShowViaClassName(el){
		if (el != null){
			var name = el.className;
			if (Right(name, 6) == 'Hidden') el.className = name.substr(0,(name.length-6));
		}
	}
	
	///ToggleListItem
	function ToggleListItem(obj){
		var parent = obj.parentNode;
		if(parent.nodeName.toLowerCase() == 'li'){
			var name = parent.className;
			if (Right(name, 4) == 'Open'){
				 parent.className = name.substr(0,(name.length-4));
			}
			else{
				parent.className += 'Open';
			}
		}
	}
	
	///Right
	function Right(str, length){
		var s = '';
		if (str != null){
			if (str.length >= length){
				s = str.substr((str.length - length));
			}
		}
		return s;
	}
	
/*
		///String.endsWith
	String.prototype.endsWith = function(str){
		var result = false;
		if (str != ''){
			if (this.substr((this.length - str.length), str.length) == str) result = true;
		}
		return result;
	}

	///String.left
	String.prototype.left = function(number){
		var s = this;
		if (this.length >= number){
			s = s.substr(0, number);
		}
		return s;
	}
*/
	
	
/*
	///HighlightLabel
	function HighlightLabel(obj, name){
		var el = document.getElementById('Label' + name + obj.value);
		if (el != null){
			if (obj.checked){
				el.className = 'Selected';
			}
			else{
				el.className = '';
			}
		}
	}
*/
	///HighlightLabel
	function HighlightLabel(obj){
		var el = document.getElementById('Label' + obj.id);
		if (el != null){
			if (obj.type.toLowerCase() == 'radio'){
				var form = eval('document.' + obj.form.name);
				var list = form[obj.name];
				for (var i=0; i<list.length; i++){
					if (list[i].id != obj.id){
						var label = document.getElementById('Label' + list[i].id);
						if (label != null){
							label.className = 'Radio';
						}
						list[i].checked = false;
					}
					else{
						if (obj.checked)
							el.className += 'Selected';
						else
							el.className = obj.type.substr(0, 1).toUpperCase() + obj.type.substr(1);	
					}
				}
			}
			else{
				//checkbox
				if (obj.checked)
					el.className += 'Selected';
				else
					el.className = obj.type.substr(0, 1).toUpperCase() + obj.type.substr(1);
			}
		}
	}
	
	///AddFormHighlights
	function AddFormHighlights(){
		var fields = document.getElementsByTagName('input');
		if (fields != null){
			for (var i=0; i<fields.length; i++){
				var field = fields[i];
				if (field.type == 'text' || field.type == 'password'){
					AddEvent(field, 'focus', FocusField);
					AddEvent(field, 'blur', BlurField);
				}
			}
		}
		var fields = document.getElementsByTagName('textarea');
		if (fields != null){
			for (var i=0; i<fields.length; i++){
				var field = fields[i];
				AddEvent(field, 'focus', FocusField);
				AddEvent(field, 'blur', BlurField);
			}
		}
		var fields = document.getElementsByTagName('select');
		if (fields != null){
			for (var i=0; i<fields.length; i++){
				var field = fields[i];
				AddEvent(field, 'focus', FocusField);
				AddEvent(field, 'blur', BlurField);
			}
		}
	}
		
	///FocusField
	function FocusField(e){
		var el = SourceElement(e);
		if (el != null) el.className += 'Focused';
	}
	
	///BlurField
	function BlurField(e){
		var el = SourceElement(e);
		if (el != null){
			var c = el.className;
			if (c.endsWith('Focused')) el.className = c.left(c.length - 7); 
		}
	}
	
	///AddHintsToFormElements
	function AddHintsToFormElements(){
		AddFormHints('input');
		AddFormHints('textarea');
		AddFormHints('select');
	}
	
	///AddFormHints
	function AddFormHints(tag){
		var fields = document.getElementsByTagName(tag);
		if (fields != null){
			for (var i=0; i<fields.length; i++){
				var field = fields[i];
				var fieldTitle = '' + field.title;
				if (fieldTitle != ''){
					var pos = fieldTitle.indexOf(':');
					if (pos > 0){
						var title = fieldTitle.substr(0, pos);
						var description = fieldTitle.substr(pos+1, (fieldTitle.length-pos))
						var holder = GetHintHolder(field);
						if (holder != null){
							field.title = '';

							var oldTitle = null;
							var oldDescription = null;
							var children = holder.childNodes;
							for (var n=0; n<children.length; n++){
								var child = children[n];
								switch(child.nodeName.toLowerCase()){
									case '#text':
										if (child.data != '') oldDescription = child.data;
										break;
									case 'h1':
									case 'h2':
									case 'h3':
									case 'h4':
									case 'h5':
										oldTitle = child.innerHTML;
										break;
								}
							}

							//assign id if not present
							if (!field.id){
								var rnd = Math.floor(Math.random() * 999)
								field.id = 'FormElementId_' + (i * rnd);
							}
							//register the hint
							var hint = new Hint(field.id, title, description, holder.id, oldTitle, oldDescription);

							AddEvent(field, 'focus', ShowHint);
							AddEvent(field, 'blur', HideHint);
						}	
					}
				}
			}
		}
	}

	///GetHintHolder
	function GetHintHolder(obj){
		if (obj != null){
			var el = obj.parentNode;
			if (el != null){
				if (el.className == 'Tip'){
					return el;
				}
				else{
					//check children of parent
					var holder = null;
					var children = el.childNodes;
					for (var i=0; i<children.length; i++){
						if (children[i] == obj) break;
						if (children[i].className == 'Tip') holder = children[i];
					}
					if (holder != null)
						return holder;
					else
						return GetHintHolder(el);
				}
			}
			else{
				return null;
			}
		}
		else{
			return null;
		}
	}
	
	///ShowHint
	function ShowHint(e){
		var el = SourceElement(e);
		if (el != null){
			for (var i=0; i<gHints.length; i++){
				if (gHints[i].Id == el.id){
					var hint = gHints[i];
					var target = document.getElementById(hint.TargetId);
					if (target != null) target.innerHTML = '<h4>' + hint.Title + '</h4>' + hint.Description;
				}
			}
		}
	}
	
	///HideHint
	function HideHint(e){
		var el = SourceElement(e);
		if (el != null){
			for (var i=0; i<gHints.length; i++){
				if (gHints[i].Id == el.id){
					var hint = gHints[i];
					var target = document.getElementById(hint.TargetId);
					if (target != null) target.innerHTML = '<h4>' + hint.OldTitle + '</h4>' + hint.OldDescription;
				}
			}
		}
	}

	///SourceElement
	function SourceElement(event){
		var src = null;
		if (event.target) src = event.target;
		else if (event.srcElement) src = event.srcElement;
		if (src.nodeType == 3) src = src.parentNode;
		return src;
	}
	
	///String.endsWith
	String.prototype.endsWith = function(str){
		var result = false;
		if (str != ''){
			if (this.substr((this.length - str.length), str.length) == str) result = true;
		}
		return result;
	}

	///String.left
	String.prototype.left = function(number){
		var s = this;
		if (this.length >= number){
			s = s.substr(0, number);
		}
		return s;
	}

	//following variations of AddEvent, RemoveEvent by Ismael Jurado
	//http://www.ismaelj.com/articulos/addevent-recoding-contest/

	///AddEvent
	function AddEvent(obj,evType,fn){
		var r = false;
		if (obj.addEventListener){
			obj.addEventListener(evType, fn, false);
			r = true;
		}
		else if (obj.attachEvent){
			var id = obj.sourceIndex || -1;
			if (!fn[evType + id]){
				var f = fn[evType + id] = function(e){
					var o = document.all[id] || document;
					o._f = fn;
					var s = o._f(e);
					o._f = null;
					return s;
					};
				r = obj.attachEvent('on' + evType, f);
				obj = null;
			}
		}
		return r;
	}
	///RemoveEvent
	function RemoveEvent(obj, evType, fn){
		var r = false
		if (obj.removeEventListener){
			obj.removeEventListener(evType, fn, false);
			r = true;
		}
		else if (obj.detachEvent){
			r = obj.detachEvent("on" + evType, fn[evType + (obj.sourceIndex || -1)]);
		}
		return r;
	}
	
	///GetAbsoluteTop
	function GetAbsoluteTop(obj){
		var y = 0;
		if (obj.offsetParent){
			var parent = obj;
			do {
				y += parent.offsetTop;
			} while ( parent = parent.offsetParent )
		}
		else if (obj.y){
			y = obj.y;
		}
		return y;
	}
	
	///GetAbsoluteLeft
	function GetAbsoluteLeft(obj){
		var x = 0;
		if (obj.offsetParent){
			var parent = obj;
			do {
				x += parent.offsetLeft;
			} while ( parent = parent.offsetParent )
		}
		else if (obj.x){
			x = obj.x;
		}
		return x;
	}

	///ToggleSelectListVisibility
	function HideSelectListsFromExplorer(id){
		var el = document.getElementById(id);
		if (el != null){
			var el_x = GetAbsoluteLeft(el); 
			var el_y = GetAbsoluteTop(el); 
			var el_w = el.offsetWidth;
			var el_h = el.offsetHeight;
			if (navigator.appName.indexOf("MSIE")){
				for (var i=0; i<document.forms.length; i++){
					for (var n=0; n<document.forms[i].length; n++){
						if (document.forms[i].elements[n].options){
							var sel = document.forms[i].elements[n];
							var x = GetAbsoluteLeft(sel); 
							var y = GetAbsoluteTop(sel); 
							if ((x >= el_x) && (y >= el_y) && ((x + sel.offsetWidth) <= (el_x + el_w)) && ((y + sel.offsetHeight) <= (el_y + el_h))){
								if (sel.title != ''){
									if (sel.title.substr(0, 6) == 'IEFIX-'){
										sel.title = sel.title.substring(6, sel.title.length);
									}
									sel.style.visibility = 'visible';
								}
								else{
									sel.title = 'IEFIX-' + sel.title;
									sel.style.visibility = 'hidden';
								}
							}
						}
					}
				}
			}
		}
	}

/*
	/core/form.asp Functions
*/
	///TextUrlSetValue
	function TextUrlSetValue(field){
		if (field != null){
			var hidden = null;
			var protocol = null;
			var address = null;
			var div = field.parentNode;
			var children = div.childNodes;
			for (var i=0; i<children.length; i++){
				var child = children[i];
				switch (child.nodeName.toLowerCase()){
					case 'select':
						protocol = child;
						break;
					case 'input':
						if (child.type == 'hidden')
							hidden = child;
						else
							address = child;
						break;
				}
			}
			if ((hidden != null) && (protocol != null) && (address != null)){
				if (address.value != ''){
					var s = '';
					var pos = address.value.indexOf('://');
					if (pos > -1)
						hidden.value = address.value.substr(0, pos) + '://' + address.value.substr(pos+3);
					else
						hidden.value = protocol.options[protocol.selectedIndex].value + address.value;
				}
				else{
					hidden.value = '';
				}
			}
		}
	}

/*
	DatePicker Functions
*/
	///IsValidDate
	function IsValidDate(strDate){
		var regex = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
		var result = false;
		if (!regex.test(strDate)){
		}
		else{
			var delimeter = strDate.substr(strDate.indexOf('/'), 1);
			var parts = strDate.split(delimeter);	
			var day = parseInt(parts[1], 10); 
			var month = parseInt(parts[0], 10);
			switch (month){
				case 2:
					var year = parseInt(parts[2]);
					if ((day < 29) && (day > 0)){
						 result = true;
					}
					else if (day == 29){
						if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))  result = true;
					}
					break;
				case 9:
				case 4:
				case 6:
				case 11:
					if ((day <= 30) && (day > 0)) result = true;
					break;
				default:
					if ((day <= 31) && (day > 0)) result = true;
					break;
			}
		}  
		return result;
	}
	
	///IsValidTime
	function IsValidTime(strTime){
		var regex = /^\d{1,2}(\-|\:|\.)\d{1,2}(\s)?(am|pm)?$/
		if (!regex.test((strTime + '').toLowerCase()))
			return false;
		else
			return true;
	}
	
	///DatePicker
	function DatePicker(id){
		var field = document.getElementById(id + '_Date');
		var holder = document.getElementById(id + '_Calendar');
		if (holder != null){
			var x = GetAbsoluteLeft(field); 
			var y = GetAbsoluteTop(field); 
			holder.style.position = 'absolute';
			holder.style.left = ((x-1) + 10) +  'px';
			holder.style.top = (y + field.offsetHeight +1) + 'px';
			holder.style.zIndex = 100;
			if (holder.style.visibility == 'visible'){
				holder.innerHTML = '';
				holder.style.visibility = 'hidden';
			}
			else{
				holder.style.visibility = 'visible';
				//field.select();
			}
			var strDate = field.value;
			var date = new Date();
			if (IsValidDate(field.value)){
				var delimeter = strDate.substr(strDate.indexOf('/'), 1);
				var parts = strDate.split(delimeter);
				date.setDate(parseInt(parts[1]));
				date.setMonth(parseInt(parts[0])-1);
				date.setFullYear(parseInt(parts[2]));
			}
			
			DatePickerRedraw(id, date.getFullYear(), date.getMonth()+1, date.getDay());

			var fx = function(e){
				//var src = (e) ? e.target : window.event.srcElement;
				var field = document.getElementById(id + '_Date');
				var calendar = document.getElementById(id + '_Calendar');
				var src = SourceElement(e);
				if (calendar != null && src != null){
					if (src != field){
						//DatePickerSelect(id, yyyy, mm, dd);
						HideSelectListsFromExplorer(id + '_Calendar');
						calendar.style.visibility = 'hidden';
						RemoveEvent(document, 'click', fx);
					}
				}
			};
			AddEvent(document, 'click', fx);
			HideSelectListsFromExplorer(id + '_Calendar');
		}
	}

	///DatePickerRedraw
	//todo: optimize this
	function DatePickerRedraw(id, year, month, day){
		var field = document.getElementById(id + '_Date');
		var holder = document.getElementById(id + '_Calendar');
		var s = '';	
		var dayNamesShort  = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
		var dayNamesLong  = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
		var monthNamesShort = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
		var monthNamesLong = ['January','February','March','April','May','June','July','August','September','October','November','December'];

		var selected = new Date();
		if (IsValidDate(field.value)){
			var strDate = field.value;
			var delimeter = strDate.substr(strDate.indexOf('/'), 1);
			var parts = strDate.split(delimeter);
			selected.setDate(parseInt(parts[1]));
			selected.setMonth(parseInt(parts[0])-1);
			selected.setFullYear(parseInt(parts[2]));
		}

		var s_year = selected.getFullYear();
		var s_month = selected.getMonth();
		var s_day = selected.getDate();

		var today = new Date();
		var t_year = today.getFullYear();
		var t_month = today.getMonth();
		var t_day = today.getDate();

		var dd = 1;
		var date = new Date(year, month-1, dd);
		var mm = date.getMonth();
		var yyyy = date.getFullYear();
		var prev = new Date(yyyy, mm, 1);
		var next = new Date(yyyy, mm, 32);
		prev.setDate(0);
		next.setDate(1);

		s += '<table border="0" cellpadding="0" cellspacing="1" class="DatePicker">\n';
		s += '<tr class="MonthAndYear"><td colspan="7"><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr>\n';
		s += '\t<td align="left"><div class="PreviousMonth" onmousedown="DatePickerRedraw(\'' + id + '\',' + prev.getFullYear() + ',' + (prev.getMonth()+1) + ');"></div></td>\n';
		s += '\t<td colspan="5" align="center" class="MonthYear">' + monthNamesLong[mm] + ' ' + yyyy + '</td>\n';
		s += '\t<td align="right"><div class="NextMonth" onmousedown="DatePickerRedraw(\'' + id + '\',' + next.getFullYear() + ',' + (next.getMonth()+1) + ');"></div></td>\n';
		s += '</tr></table></td></tr>\n';
		s += '<tr class="WeekDays">';
		for (var i=0; i<7; i++){
			s += '\t<td class="DayNames">' + dayNamesShort[i] + '</td>\n';
		}
		s += '</tr>\n';
		s += '<tr class="Days">\n';
		for (i=date.getDay()-1; i>=0; i--){
			s += '\t<td class="DayLastMonth" ' + DatePickerSetAttributes(id, 'DayLastMonth', prev.getFullYear(), prev.getMonth()+1, (prev.getDate()-i)) + '><div class="Number">' + (prev.getDate()-i) + '</div></td>\n';
		}

		while (date.getDate() > 0){
			var y = date.getFullYear();
			var m = date.getMonth();
			var d = date.getDate();
			var className = '';
			if (y == t_year && m == t_month &&  d == t_day)
				className = 'Today';
			else
				className = 'Day';
			if (y == selected.getFullYear() && m == selected.getMonth() && d == selected.getDate()) className += 'Selected';
			s += '\t<td class="' + className + '" ' + DatePickerSetAttributes(id, className, y, m+1, d) + '><div class="Number">' + d + '</div></td>\n';
		    if (date.getDay() == 6) s += '</tr>\n';
		    date.setDate(date.getDate() + 1);
			if (date.getDate() == 1) break; //exit loop
			if (date.getDay() == 0) s += '<tr class="Days">\n';
		}
		if (date.getDay() != 0){
			for (var i=1; i<=(7-date.getDay()); i++){
				s += '\t<td class="DayNextMonth" ' + DatePickerSetAttributes(id, 'DayNextMonth', next.getFullYear(), next.getMonth()+1, next.getDate()+(i-1)) + '><div class="Number">' + i + '</div></td>\n';
			}
		}
		s += '</tr>\n';
		s += '</table>\n';
		if (holder != null) holder.innerHTML = s;
		//document.getElementById('debug').innerHTML = s;
	}

	///DatePickerSetAttributes
	function DatePickerSetAttributes(id, className, yyyy, mm, dd){
		var s = '';
		s += 'onmouseover="this.className+=\'Active\';" ';
		s += 'onmouseout="this.className=\'' + className + '\';" ';
		s += 'onmousedown="DatePickerSelect(\'' + id + '\',' + yyyy + ',' + mm + ',' + dd + ');"';
		return s;
	}
	
	///DatePickerSelect
	function DatePickerSelect(id, yyyy, mm, dd){
		var s = '';
		var el = document.getElementById(id);
		var date = document.getElementById(id + '_Date');
		var time = document.getElementById(id + '_Time');
		var today = new Date();
		var def = today.getMonth()+1 + '/' + today.getDate() + '/' + today.getFullYear();
		var useDefault = true;
		if (el != null){
			if (date != null){
				if (IsValidDate(date.value)) useDefault = false;
			}
			if (((yyyy == null) && (mm == null) && (dd == null))){ //default		
				if (date != null){
					if (!useDefault){
						s = date.value;
					}
					else{
						if (date.value != '') s = def;
					}
				}
				if (time != null){
					if (time.value != '' && date.value == '') s = def;
				}		
			}
			else{
				s = mm + '/' + dd + '/' + yyyy;
			}
			if (date != null) date.value = s;
			if (time == null){
				if (date.value != '') s += ' 12:00:00 AM';
			}
			else{
				if ((date.value != '') && (time.value == '')) s += ' 12:00:00 AM';
			}
			el.value = s;
			if (time != null){
				if (IsValidTime(time.value)){
					s = '';
					if (s != '') s += ' ';
					var chr = '';
					var chars1 = '0123456789';
					var chars2 = 'amp';
					var m = '';
					var ap = '';
					var isAM = true;
					var strTime = time.value.toLowerCase();
					var delimeter = strTime.substr(strTime.indexOf(':'), 1);
					var parts = strTime.split(delimeter);
					var h = parseInt(parts[0]);
					for (var i=0; i<parts[1].length; i++){ 
						chr = parts[1].charAt(i); 
						if (chars1.indexOf(chr) == -1){
							ap += chr;
						}
						else{
							if (!(chars1.indexOf(chr) == -1)) m += chr;
						}
					}
					if (m.length == 1) m = '0' + m;
					if (h > 12){
						h = h - 12;
						isAM = false;
					}
					else if (h == 0) h = 12;
					if (ap == 'pm') isAM = false;
					if (h < 10) s += '0';
					s += h + ':' + m + ':00 ';
					if (isAM) 
						s+= 'AM';
					else
						s+= 'PM';
					if (useDefault)
						el.value = def + ' ' + s;
					else
						el.value = date.value + ' ' + s;
				}
				else{
					if (time.value != ''){
						time.value = '12:00 AM';
						if (useDefault)
							el.value = def + ' 12:00:00 AM';
						else
							el.value = date.value + ' 12:00:00 AM';
					}
				}
			}
			//DatePickerUpdate(obj);
			document.getElementById(id + '_Calendar').style.visibility = 'hidden';
		}
		return false;
	}

	///DatePickerTabbed
	function DatePickerTabbed(id){
		var field = document.getElementById(id + '_Date');
		if (field != null){
			var tab = function(e){
				if (!e) var e = window.event;
				if (e.keyCode) key = e.keyCode;
				else if (e.which) key = e.which;
				if (key == 9) DatePicker(id); 
			};
			AddEvent(field, 'keydown', tab);
		}
	}

	///DatePickerToggleOption
	function DatePickerToggleOption(obj, isStartDate, endDateContainerId){
		var date = null;
		var span = null;
		var time = null;
		var div = obj.parentNode;
		var children = div.childNodes;
		var firstField = false;
		for(var i=0; i<children.length; i++){
			var child = children[i];
			switch (child.nodeName.toLowerCase()){
				case 'input':
					if (child.type.toLowerCase() == 'text'){
						if (!firstField){
							firstField = true;
							date = child;
						}
						else{
							time = child;
						}
					}
					break;
				case 'span':
					span = child;
					break;
			}
		}
		HighlightLabel(obj);
		if (obj.checked){
			if (!isStartDate){
				HideViaClassName(date);
			}
			HideViaClassName(span);
			HideViaClassName(time);
		}
		else{
			if (!isStartDate){
				ShowViaClassName(date);
				ShowViaClassName(span);
			}
			ShowViaClassName(span);
			ShowViaClassName(time);
		}
		if (isStartDate) ToggleDisplayIfUnchecked(endDateContainerId, obj);
	}


/*
	DataGrid Class functions =============================================
*/

	///DeleteRow
	function DeleteRow(strId, strDefaultClass, strActiveClass, strCounterName, strUrl){
		if (document.getElementById){
			var elA = document.getElementById(strId + 'a');
			
			//bottom accent *may not* have been requested
			var elB = document.getElementById(strId + 'b');
			elA.className = strActiveClass;
			if (elB != null) elB.className = strActiveClass + "Bottom";
	
			var msg = "";
			if (gUseCustomDialogs){
				var title = "Please Proceed With Caution!";
				var description = "";
				description += "You are about to delete this item permanently!<br />";
				description += "Are you <em>absolutely</em> sure you want to continue?<br />";
				var yesScript = "location.href=\'" + strUrl + "\';";
				var noScript = "RevertRowStyle('" + strId + "','" + strDefaultClass + "','" + strCounterName + "');";
				Confirm(title, description, yesScript, noScript);
				var classes = "DataGridRowActive,DataGridRowActiveStep2,DataGridRowActiveStep3,DataGridRowActiveStep4,DataGridRowActiveStep5";
				CycleClassNames(strCounterName, strId + 'a', classes);
			}
			else{
				msg += "Please Proceed With Caution!\n";
				msg += "----------------------------------------------------------\n";
				msg += "You are about to delete this item permanently!\n\n";
				msg += "Are you absolutely sure you want to continue?\n";
				if (confirm(msg)){
					location.href = strUrl;
				}
				else{
					elA.className = strDefaultClass;
					if (elB != null) elB.className = strDefaultClass + "Bottom";
				}
			}
		}
	}

	///RevertRowStyle
	function RevertRowStyle(strId, strDefaultClass, strCounterName){
		if (document.getElementById){
			var elA = document.getElementById(strId + 'a');
			var elB = document.getElementById(strId + 'b'); 
			elA.className = strDefaultClass;
			if (elB != null) elB.className = strDefaultClass + "Bottom";
			if (gUseCustomDialogs) eval(strCounterName + '.Stop()');
		}
	}

	///CheckRow
	///changes the class of a row when it's selected in a datagrid
	function CheckRow(obj, row, color, multiple){
		var el = eval(obj.form.name + "." + obj.name);
		if (!multiple)
		{
			if (el.length == undefined){
				if (obj != el){
					if (el.checked){
						el.checked = false;
						FlagRow(el,row,color);
					}
				}
				else{
					FlagRow(obj,row,color);
				}
			}
			else{
				for (i=0; i<el.length; i++){
					if (obj != el[i]){
						if (el[i].checked){
							el[i].checked = false;
							FlagRow(el[i],'row' + i,color);
						}
					}
					else{
						FlagRow(obj,row,color);
					}
				}
			}
		}
		else{
			FlagRow(obj,row,color);
		}
	}

	///FlagRow
	///changes the row background color
	function FlagRow(obj, row, color){
		var el = document.getElementById(row);
		if (obj.checked)
			el.style.backgroundColor = "#ffd700";
		else
			el.style.backgroundColor = color;
	}
	
		///CycleClassNames
	function CycleClassNames(strCounterName, strId, strArray){
		var counter = gCounters[strCounterName];
		if (counter != undefined){
			if (counter.Active && counter.Index >= 0 && strArray != ""){
				counter.Add();
				var ary = strArray.split(',');
				if (counter.Index + 1 <= 1) counter.Direction = 1;
				if (counter.Index + 1 >= ary.length) counter.Direction = 0;
				var el = document.getElementById(strId);
				if (el != null){
					el.className = ary[counter.Index];
					setTimeout("CycleClassNames('" + counter.Name + "','" + strId + "','" + strArray + "')", 75);
				}
			}
			else{
				counter.Active = true; //reset & exit out of loop
			}
		}
	}

	///CountRemaining
	///TextAreaCore function (and wrappers) use this to display the remaining character count when a maxLength is specified
	function CountRemaining(field, maxLength){
		if (field.id != undefined){
			var chars = 0;
			var span = document.getElementById(field.id + 'CharacterCount');
			if (span != null){
				if (field.value.length > maxLength)
					field.value = field.value.substring(0, maxLength);
				else
					chars = (maxLength - field.value.length);
				span.innerHTML = '(' + chars + ' char. left)';
			}
		}
	}
	
/*
	Star Rating functions
*/

	///StarRatingInit
	function StarRatingInit(){
	alert('star');
		var spans = document.getElementsByTagName('span');
		for (var i=0; i<spans.length; i++){
			var count = 0;
			var span = spans[i];
			if (span.className.substr(0, 10) == 'StarRating'){
				for (var n=0; n<span.childNodes.length; n++){
					if (span.childNodes[n].nodeName.toLowerCase() == 'img'){
						var img = span.childNodes[n];
						img.id = span.id + 'Image';
						if (count == 0)
							img.title = 'No Rating'
						else
							img.title = count + ' Star';
						if (count > 1) img.title += 's';
						AddEvent(img, 'mouseover', StarRatingHover);
						AddEvent(img, 'mouseout', StarRatingRevert);
						AddEvent(img, 'click', StarRatingSet);
						count++;
					}
				}	
			}
		}	
	}

	///StarRatingHover
	function StarRatingHover(event){
		var img = SourceElement(event);
		if (img == null){
			return;
		}
		else{
			var count = 0;
			var ary = img.title.split(' ');
			var value;
			(img.title == 'No Rating') ? value = 0 : value = ary[0];
			var span = img.parentNode;
			var onSrc;
			var offSrc;
			if (value == 0) img = img.nextSibling;
			if (img.src.indexOf('on.') != -1){
				onSrc = img.src;
				offSrc = onSrc.replace('on.', 'off.');
			}
			else{
				offSrc = img.src;
				onSrc = offSrc.replace('off.', 'on.');
			}
			for (var i=0; i<span.childNodes.length; i++){
				if (span.childNodes[i].nodeName.toLowerCase() == 'img'){
					if (count > 0){
						if (count <= value)
							span.childNodes[i].src = onSrc;
						else
							span.childNodes[i].src = offSrc;
					}
					count++;
				}
			}
		}
	}
	
	///StarRatingSet
	function StarRatingSet(event){
		var img = SourceElement(event);
		if (img == null){
			return;
		}
		else{
			var ary = img.title.split(' ');
			var value;
			(img.title == 'No Rating') ? value = 0 : value = ary[0];
			var span = img.parentNode;
			var input = span.childNodes[0];
			input.value = value;
		}
	}
	
	///StarRatingRevert
	function StarRatingRevert(event){
		var img = SourceElement(event);
		if (img == null){
			return;
		}
		else{
			var count = 0;
			var span = img.parentNode;
			var onSrc;
			var offSrc;
			if (img.title == 'No Rating') img = img.nextSibling ;
			if (img.src.indexOf('on.') != -1){
				onSrc = img.src;
				offSrc = onSrc.replace('on.', 'off.');
			}
			else{
				offSrc = img.src;
				onSrc = offSrc.replace('off.', 'on.');
			}
			var input = span.childNodes[0];
			for (var i=0; i<span.childNodes.length; i++){
				if (span.childNodes[i].nodeName.toLowerCase() == 'img'){
					if (count > 0){
						if (count <= input.value)
							span.childNodes[i].src = onSrc;
						else
							span.childNodes[i].src = offSrc;
					}
					count ++;
				}
			}
		}
	}
	
	///TogglePasswordChange
	function TogglePasswordChange(obj){
		var p = document.getElementById('password');
		var p2 = document.getElementById('password_2');
		if ((obj.checked) && (p != null) && (p2 != null)){
			p.disabled = false;
			p2.disabled = false;
			var c = p.className;
			if (c.endsWith('Disabled')) p.className = c.left(c.length - 8);
			var c2 = p2.className;
			if (c2.endsWith('Disabled')) p2.className = c2.left(c2.length - 8);
		}
		else
		{
			p.disabled = true;
			p.className += 'Disabled';
			p2.disabled = true;
			p2.className += 'Disabled';
		}
	}
