// validate we're the top most frame

ReloadAsTop();

function ReloadAsTop() {
	try {
		if (top != self) {
			if (top.location.replace)
				top.location.replace(self.location.href);
			else
				top.location.href = self.location.href;
		}
	} catch (e) {
		if (top.location.replace)
			top.location.replace(self.location.href);
		else
			top.location.href = self.location.href;			
	}
}

function isArray(testObject) {   
    return testObject && !(testObject.propertyIsEnumerable('length')) && typeof testObject === 'object' && typeof testObject.length === 'number';
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
	}
	return [curleft,curtop];
}

function insertAtCursor(textCtrl, textString) {
	if (document.selection) {
		//IE support
		textCtrl.focus();
		sel = document.selection.createRange();
		sel.text = textString;
		sel.moveStart("character", -textString.length);
		sel.moveEnd("character", 0);
		sel.select();
	} else if (textCtrl.selectionStart || textCtrl.selectionStart == '0') {
		//MOZILLA/NETSCAPE support
		var startPos = textCtrl.selectionStart;
		var endPos = textCtrl.selectionEnd;
		textCtrl.value = textCtrl.value.substring(0, startPos) + textString + textCtrl.value.substring(endPos, textCtrl.value.length);
		textCtrl.setSelectionRange(startPos, startPos + textString.length);
		textCtrl.focus();
	} else {
		textCtrl.value += textString;
	}
}

function FormFieldGetFirst(FormElement) {
	var i, retValue = '', sType;
	var FormElement;

		sType = FormElement.type;
		switch (sType) {
			case 'checkbox':
			case 'radio':
				if (FormElement.checked) {
					retValue = FormElement.value;
				}
				break;
			case 'select':
			case 'select-one':
				if (FormElement.selectedIndex >= 0) {
					retValue = FormElement[FormElement.selectedIndex].value
				}
				break;
			default:
				if (FormElement.length > 0) {
					sType = FormElement[0].type;
					switch (sType) {
						case 'checkbox':
						case 'radio':
							for (i = 0; i < FormElement.length; i++) {
								if (FormElement[i].checked) {
									retValue = FormElement[i].value;
									break;
								}
							}
							break;
						case 'select':
						case 'select-one':
							if (FormElement.selectedIndex >= 0) {
								retValue = FormElement[FormElement.selectedIndex].value;
							}
							break;
						default:
							retValue = FormElement[0].value;
					}
				} else {
					retValue = FormElement.value;
				}
		}

	return(retValue);
}

function EmailCheck (emailStr) {
	var emailPat=/^(.+)@(.+)$/
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
	var validChars="\[^\\s" + specialChars + "\]"
	var quotedUser="(\"[^\"]*\")"
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
	var atom=validChars + '+'
	var word="(" + atom + "|" + quotedUser + ")"
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")

	var matchArray=emailStr.match(emailPat)

	if (matchArray==null) {
		return "Email address seems incorrect (check @ and .'s)\n"
	}
	var user=matchArray[1]
	var domain=matchArray[2]

	if (user.match(userPat)==null) {
		return "The username doesn't seem to be valid.\n"
	}

	var IPArray=domain.match(ipDomainPat)
	if (IPArray!=null) {
		  for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				return "Destination IP address is invalid!\n"
			}
		}
		return true
	}

	var domainArray=domain.match(domainPat)
	if (domainArray==null) {
		return "The domain name doesn't seem to be valid.\n"
	}

	var atomPat=new RegExp(atom,"g")
	var domArr=domain.match(atomPat)
	var len=domArr.length
	if (domArr[domArr.length-1].length<2 ||
		domArr[domArr.length-1].length>3) {
		return "The address must end in a three-letter domain, or two letter country.\n"
	}

	if (len<2) {
		return "This address is missing a hostname!"
	}

	return "";
}

function addEvent(obj, evType, fn) {
	if (obj.addEventListener) {
		obj.addEventListener(evType, fn, false);
		return true;
	} else if (obj.attachEvent) {
		var r = obj.attachEvent("on"+evType, fn); // this is for internet explorer events are Onload , Onclick etc. 
		return r;
	} else {
		return false;
	}
}

function ISODate(dateString) {
	var parts = dateString.match(/\d+/g);
	return new Date(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);
}

function Select_Set(ctrlName, Value) {
	var ctrl = document.getElementById(ctrlName);
	
	for (var i = 0; i < ctrl.length; i++) {
		if (ctrl[i].value == Value) {
			ctrl[i].selected = true;
		}
	}
}

function ValidateTime(timeString, message, maxHour) {
	var timeregex=/^(\d{1,2})(:(\d{1,2}))?(:(\d{1,2}))?(\s?(AM|am|PM|pm))?$/;

	var matchArray = timeString.match(timeregex);
	var bRet = true;
	var mh;
	
	if (maxHour) {
		mh = maxHour;
	} else {
		mh = 12;
	}

	if (matchArray == null) {
		bRet = false;
	} else {
		var hour = parseInt(matchArray[1], 10);
		var minute = parseInt(matchArray[3], 10);
		
		if (hour > mh)
			bRet = false;
		
		minute = (minute?minute:0);
		if (minute > 59)
			bRet = false;
	}
	
	if (message && !bRet)
		alert(message);
	
	return bRet;
}

function TimeStringTo24(timeString) {
	var timeregex=/^(\d{1,2})(:(\d{1,2}))?(:(\d{1,2}))?(\s?(AM|am|PM|pm))?$/;

	var matchArray = timeString.match(timeregex);
	var ret = '';
	
	if (matchArray != null) {
		var hour = parseInt(matchArray[1], 10);
		var minute = parseInt(matchArray[3], 10);
		var second = parseInt(matchArray[5], 10);
		var ampm = matchArray[7];
		
		var xm = '';
		
		if (ampm)
			xm = ampm.toLowerCase();
		
		if (ampm && xm == 'pm' && hour < 12)
			hour = hour + 12;
		
		if (ampm && xm == 'am' && hour == 12)
			hour = 0;

		minute = (minute?minute:0);
		if (hour < 24 && minute < 60)
			ret = hour + ':' + minute + ':' + (second?second:0);
	}

	return ret;
}

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}

/* 
 * Date Format 1.2.3
 * (c) 2007-2009 Steven Levithan <stevenlevithan.com>
 * MIT license
 *
 * Includes enhancements by Scott Trenda <scott.trenda.net>
 * and Kris Kowal <cixar.com/~kris.kowal/>
 *
 * Accepts a date, a mask, or a date and a mask.
 * Returns a formatted version of the given date.
 * The date defaults to the current date/time.
 * The mask defaults to dateFormat.masks.default.
 */

var dateFormat = function () {
	var	token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
		timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
		timezoneClip = /[^-+\dA-Z]/g,
		pad = function (val, len) {
			val = String(val);
			len = len || 2;
			while (val.length < len) val = "0" + val;
			return val;
		};

	// Regexes and supporting functions are cached through closure
	return function (date, mask, utc) {
		var dF = dateFormat;

		// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
		if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
			mask = date;
			date = undefined;
		}
		
		mask = mask.replace("AM/PM", "TT").replace("am/pm", "tt").replace(":mm", ":MM");

		// Passing date through Date applies Date.parse, if necessary
		date = date ? new Date(date) : new Date;
		if (isNaN(date)) throw SyntaxError("invalid date");

		mask = String(dF.masks[mask] || mask || dF.masks["default"]);

		// Allow setting the utc argument via the mask
		if (mask.slice(0, 4) == "UTC:") {
			mask = mask.slice(4);
			utc = true;
		}

		var	_ = utc ? "getUTC" : "get",
			d = date[_ + "Date"](),
			D = date[_ + "Day"](),
			m = date[_ + "Month"](),
			y = date[_ + "FullYear"](),
			H = date[_ + "Hours"](),
			M = date[_ + "Minutes"](),
			s = date[_ + "Seconds"](),
			L = date[_ + "Milliseconds"](),
			o = utc ? 0 : date.getTimezoneOffset(),
			flags = {
				d:    d,
				dd:   pad(d),
				ddd:  dF.i18n.dayNames[D],
				dddd: dF.i18n.dayNames[D + 7],
				m:    m + 1,
				mm:   pad(m + 1),
				mmm:  dF.i18n.monthNames[m],
				mmmm: dF.i18n.monthNames[m + 12],
				yy:   String(y).slice(2),
				yyyy: y,
				h:    H % 12 || 12,
				hh:   pad(H % 12 || 12),
				H:    H,
				HH:   pad(H),
				M:    M,
				MM:   pad(M),
				s:    s,
				ss:   pad(s),
				l:    pad(L, 3),
				L:    pad(L > 99 ? Math.round(L / 10) : L),
				t:    H < 12 ? "a"  : "p",
				tt:   H < 12 ? "am" : "pm",
				T:    H < 12 ? "A"  : "P",
				TT:   H < 12 ? "AM" : "PM",
				Z:    utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
				o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
				S:    ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
			};

		return mask.replace(token, function ($0) {
			return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
		});
	};
}();

// Some common format strings
dateFormat.masks = {
	"default":      "ddd mmm dd yyyy HH:MM:ss",
	shortDate:      "m/d/yy",
	mediumDate:     "mmm d, yyyy",
	longDate:       "mmmm d, yyyy",
	fullDate:       "dddd, mmmm d, yyyy",
	shortTime:      "h:MM TT",
	mediumTime:     "h:MM:ss TT",
	longTime:       "h:MM:ss TT Z",
	isoDate:        "yyyy-mm-dd",
	isoTime:        "HH:MM:ss",
	isoDateTime:    "yyyy-mm-dd'T'HH:MM:ss",
	isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
};

// Internationalization strings
dateFormat.i18n = {
	dayNames: [
		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
		"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
	],
	monthNames: [
		"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
		"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
	]
};

// For convenience...
Date.prototype.format = function (mask, utc) {
	return dateFormat(this, mask, utc);
};

