function setCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function getCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return "";
}

function deleteCookie(name) {
	createCookie(name,"",-1);
}

function initializeArray(){
	aryErrors = new Array();
}
function addErr(e2add){
	nextIndex = aryErrors.length;
	aryErrors[nextIndex] = e2add;
}
function cancelIt(fn,yp,np){
//fn = "form name"
//yp = "yes page" (page to go after they save info)
//np = "no page" (page to go to if they do not want to save info)
yespage = yp;
nopage = np;
cmd = "f = document." + fn
eval(cmd)
//f.act.value = np;
var w = 480, h = 340;
if (document.all || document.layers) {
   w = screen.availWidth;
   h = screen.availHeight;}
var popW = 320, popH = 200;
var leftPos = (w-popW)/2, topPos = (h-popH)/2;
theurl = "/help/messages/confirm_cancel.htm?" + fn;
confirmCancel = window.open(theurl, "popWin", "width=" + popW + ",height=" + popH + ",scroll=0,history=0,status=0,top=" + topPos + ",left=" + leftPos);
if(!confirmCancel.opener) confirmCancel.opener = self;
}

function trim(str){ 
    var whiteSpaces = new Array(' ', '\t', '\n'); //array of space, tab and new line 
    for(var i=0; i<whiteSpaces.length; i++){ 
        str = str.split(whiteSpaces[i]); // remove white spaces 
        str = str.join(''); 
    } 
    return str; 
}

function isEmail(eml) {
	// make sure search function is available
	if(eml.search){
		if (eml.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1) {return true;}
		else {return false;}
		}
	else{return true;}
}

function hasSpecChar(fld){
	arySpecChars = "<>%*#";
	for(i = 0; i < fld.length; i++){
		for(j = 0; j < arySpecChars.length; j++){
			if(fld.indexOf(arySpecChars.charAt(j)) != -1){
				return true;
				break;
			}
		}
	}
	return false;
}

function hasErrors(){
	var i = 0;
	if(aryErrors.length < 1){
		return false;
	}
	else{
		errStringHeader = GetLocalizedResource(0) + ":\n\n";// + "\r" + "-----------------------------------------------";//\n\n";
		errString = "";
		for(i = 0; i < aryErrors.length; i++){
			listNum = i + 1;
			errString = [errString, listNum.toString(), ".  ", aryErrors[i].toString(), "\n"].join("");
		}
		alert(errStringHeader + errString);
		return true;
	}
}

function fixPhone(phn){
	_out = "()-. "; // replace this
	_in = ""; // with this
	_temp = "" + phn; // temporary holder
	
	for(i = 0; i < _out.length; i++){
		while (_temp.indexOf(_out.charAt(i))>-1) {
			_pos= _temp.indexOf(_out.charAt(i));
			_temp = "" + (_temp.substring(0, _pos) + _in + _temp.substring((_pos + _out.charAt(i).length), _temp.length));
		}
	}
	//_temp = trim(_temp);
return _temp;
}

function isValidPhoneNumber(s)
{  
	digitsInUSPhoneNumber = 10;
    return (isInteger(s) && s.length == digitsInUSPhoneNumber)
}

function isInteger(s)

{   var i;

    if (!isEmpty(s)){

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);

        if (!isDigit(c)) return false;
    }

    // All characters are numbers.
    return true;}
}

function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}

function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

function reformat (s)

{   var arg;
    var sPos = 0;
    var resultString = "";

    for (var i = 1; i < reformat.arguments.length; i++) {
       arg = reformat.arguments[i];
       if (i % 2 == 1) resultString += arg;
       else {
           resultString += s.substring(sPos, sPos + arg);
           sPos += arg;
       }
    }
    return resultString;
}

function popHelp(pageUrl){
	winHandle = window.open(pageUrl, "helpWin", "width=500,height=425,border=0,status=0,location=0,scrollbars=1");
}

function isFloat (s){
	var i;
    var seenDecimalPoint = false;

    if(isEmpty(s)){
		return false;}

    if (s == ".") return false;

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);

        if ((c == ".") && !seenDecimalPoint) seenDecimalPoint = true;
        else if (!isDigit(c)) return false;
    }
    // All characters are numbers.
    return true;
}

function isDollar(s){
	if(!isFloat(s)){
		return false;}
		
	s_length = s.length;
	if(s_length < 4 || s.charAt(s_length - 3) != "."){
		return false;}
	return true;
}

function jsDateDiff(f_start, f_end, f_interval, f_rounding ) {

    var iOut = 0;
    
    // Create 2 error messages, 1 for each argument. 
    var f_startMsg = GetLocalizedResource(1);		
    var f_intervalMsg = GetLocalizedResource(2);

    var bufferA = Date.parse( f_start ) ;
    var bufferB = Date.parse( f_end ) ;
    	
    // check that the f_start parameter is a valid Date. 
    if ( isNaN (bufferA) || isNaN (bufferB) ) {
        alert( f_startMsg ) ;
        return null ;
    }
	
    // check that an f_interval parameter was not numeric. 
    if ( f_interval.charAt == 'undefined' ) {
        // the user specified an incorrect f_interval, handle the error. 
        alert( f_intervalMsg ) ;
        return null ;
    }
    
    var number = bufferB-bufferA ;
    
    // what kind of add to do? 
    switch (f_interval.charAt(0))
    {
        case 'd': case 'D': 
            iOut = parseInt(number / 86400000) ;
            if(f_rounding) iOut += parseInt((number % 86400000)/43200001) ;
            break ;
        case 'h': case 'H':
            iOut = parseInt(number / 3600000 ) ;
            if(f_rounding) iOut += parseInt((number % 3600000)/1800001) ;
            break ;
        case 'm': case 'M':
            iOut = parseInt(number / 60000 ) ;
            if(f_rounding) iOut += parseInt((number % 60000)/30001) ;
            break ;
        case 's': case 'S':
            iOut = parseInt(number / 1000 ) ;
            if(f_rounding) iOut += parseInt((number % 1000)/501) ;
            break ;
        default:
        // If we get to here then the f_interval parameter
        // didn't meet the d,h,m,s criteria.  Handle
        // the error. 		
        alert(f_intervalMsg) ;
        return null ;
    }    
    return iOut ;
}
function isValidTicketNumber(fNum,fCity){
	fCity = fCity.toLowerCase();
	if(fCity == "ny"){
		var fNum = new String(fNum);
		fNum = trim(fNum);
		if(fNum == ''){return false;}
		else if(fNum <= 0){return false;}
		else if((fNum.charAt(9) != "-") && (isNaN(fNum))){return false;}
		else if((fNum.length == 11) && (fNum.charAt(9) != "-")){return false;}
		else if(fNum.length < 10){return false;}
		else if(fNum.charAt(0) != "3" && fNum.charAt(0) != "7" && fNum.charAt(0) != "1"){return false;}
		else{
			var count = 0;
			var mult  = 10;
			var total = 0;
			
			while(count <= 8){
				var digit = fNum.charAt(count);
				result    = digit * mult;
				mult      = mult - 1;
				total     = total + result;
				count     = count + 1;}
			mod = total % 11;
			if(mod == 10){mod = 0;}
			if(fNum.charAt(9) == "-"){lastnum = fNum.charAt(10);}
			else{lastnum = fNum.charAt(9);}			
			if(mod == lastnum){return true;}
			else{return false;}
		}
	}
	else if(fCity == "dc"){
		var fNum = new String(fNum);
		fNum = trim(fNum);
		if(fNum == ""){return false;}
		else if(fNum <= 0){return false;}
		else if(fNum.length < 9){return false;}
		else{return true;}
	}
	else if(fCity == "sf"){
		var fNum = new String(fNum);
		fNum = trim(fNum);
		if(fNum == ""){return false;}
		else if(fNum <= 0){return false;}
		else if(fNum.length < 6){return false;}
		else{return true;}
	}
	else if(fCity == "bo"){
		var fNum = new String(fNum);
		fNum = trim(fNum);
		if(fNum == ""){return false;}
		else if(fNum <= 0){return false;}
		else if(fNum.length != 9){return false;}
		else{return true;}
	}
	else if(fCity == "ph"){
		var fNum = new String(fNum);
		fNum = trim(fNum);
		if(fNum == ""){return false;}
		else if(fNum <= 0){return false;}
		else if(fNum.length != 9){return false;}
		else{return true;}
	}
	else if(fCity == "la"){
		var fNum = new String(fNum);
		fNum = trim(fNum);
		if(fNum == ""){return false;}
		else if(fNum <= 0){return false;}
		else if(fNum.length < 6){return false;}
		else{return true;}
	}
	else if(fCity == "ch") {
		var fNum = new String(fNum);
		fNum = trim(fNum);
		
		if (fNum == "") {
			return false
		} else {
			if (isNaN(fNum)) {
				return false
			} else {
				var ticketstring = fNum
				if (ticketstring != null) {
					if (ticketstring.length < 10 && ticketstring.length > 0) {
						return false
					}
					if ((ticketstring < '9000000000') && (ticketstring > '0099999999') && (ticketstring < '7000000000') && (ticketstring < '6000000000')) {
						return false
					} else {
						return true
					}
				}
			}
		}	
	}
	else if(fCity == "ot"){
		var fNum = new String(fNum);
		fNum = trim(fNum);
		if(fNum == ""){return false;}
		else if(fNum <= 2){return false;}
		else{return true;}
	}
	else if(fCity == ""){
		return false;
	}
	else{return true;}
}
function LaunchExternalWin(fUrl,fWidth,fHeight,fParams,fName){
	if(fWidth == "") {fWidth = 600;}
	if(fHeight == "") {fHeight = 400;}
	if(fParams == ''){fParams = ',scrollbars=1';}
	if(fName == ""){fName = "winLoad" + Math.round(Math.random()*1000);}
	
	fWinL = (screen.availWidth - fWidth) / 2;
	fWinT = (screen.availHeight - fHeight) / 2;
	fParams += ",top="+fWinT+",left="+fWinL;
	
	window.open(fUrl, fName, 'width='+fWidth+',height='+fHeight+fParams);
}

function updateCalendarSelection(fSourceField, fTargetFieldM, fTargetFieldD, fTargetFieldY) {
	SourceDateSplit = fSourceField.value.split("/");

	for (a=0; a < fTargetFieldM.length; a++) {
		if (fTargetFieldM[a].value == SourceDateSplit[0]) {
			fTargetFieldM.selectedIndex = a;
			break;
		}
	}
	for (a=0; a < fTargetFieldD.length; a++) {
		if (fTargetFieldD[a].value == SourceDateSplit[1]) {
			fTargetFieldD.selectedIndex = a;
			break;
		}
	}
	for (a=0; a < fTargetFieldY.length; a++) {
		if (fTargetFieldY[a].value == SourceDateSplit[2]) {
			fTargetFieldY.selectedIndex = a;
			break;
		}
	}
}

function updateCalendarSelectionText(fSourceField, fTargetFieldM, fTargetFieldD, fTargetFieldY) {
	if(fSourceField.value != ""){
		SourceDateSplit = fSourceField.value.split("/");		
		fTargetFieldM.value = SourceDateSplit[0];
		fTargetFieldD.value = SourceDateSplit[1];
		fTargetFieldY.value = SourceDateSplit[2];
	}
}

function GetEmailFromCellPhone(n,p){
	p = p.toLowerCase();	
	switch(p){
		case "verizon":
			e = n + "@vtext.com";
			break;
		case "t-mobile":
			e = n + "@tmomail.net";
			break;
		case "at&t":
			e = n + "@mmode.com";
			break;
		case "cingular":
			e = n + "@mycingular.com";
			break;
		case "nextel":
			e = n + "@messaging.nextel.com";
			break;
		case "sprint":
			e = n + "@messaging.sprintpcs.com";
			break;
		case "virgin":
			e = n + "@vmobl.com";
			break;
	}
	return e;
}

function ToggleDisplay(sObj, s1, s2){
	o = document.getElementById(sObj);
	if(o.style.display == s1){
		o.style.display = s2;}
	else{
		o.style.display = s1;
	}
}

function SetDisplay(sObj,sVal){
	o = document.getElementById(sObj);
	if(o){
		o.style.display = sVal;
	}
}

function GetRadioValue(fField){
	rVal = "";
	if(fField.length){
		for(i=0; i<fField.length; i++){
			if(fField[i].checked){
				rVal = fField[i].value;
				break;}
		}
	}
	else if(fField.checked) rVal = fField.value;
	else rVal = "";
	return rVal;
}

function SetRadioValue(fField, fValue){
	if(fField.length){
		for(i=0; i<fField.length; i++){
			if(fField[i].value == fValue) fField[i].checked = true;
			else fField[i].checked = false;
		}
	} 
	else if(fField.value == fValue) fField.checked = true;
	else fField.checked = false;
}

/*function SetRadioValue(fField, fValue){
	fField[2].checked = fCk;
	for(i=0; i<fField.length - 1; i++){
		fField[i].disabled = fCk;
	}
	if(fField.length){
		for(i=0; i<fField.length; i++){
			if(fField[i].value == fValue) fField[i].checked = true;
			else fField[i].checked = false;
		}
	} 
	else if(fField.value == fValue) fField.checked = true;
	else fField.checked = false;
}*/

function GetSelectValue(fField){
	return fField[fField.selectedIndex].value;
}

function SetSelectValue(fField,fValue){
	for(i=0; i<fField.options.length; i++){
		if(fField[i].value == fValue){
			fField.selectedIndex = i;
			break;
		}
	}
}

// date generating function
function GenerateDateFromTimestamp(dt_datetime) {
	return (
		(dt_datetime.getMonth() < 9 ? '0' : '') + (dt_datetime.getMonth() + 1) + "/"
		+ (dt_datetime.getDate() < 10 ? '0' : '') + dt_datetime.getDate() + "/"
		+ dt_datetime.getFullYear()
	);
}
// time generating function
function GenerateTimeFromTimestamp(dt_datetime) {
	return (
		(dt_datetime.getHours() < 10 ? '0' : '') + dt_datetime.getHours() + ":"
		+ (dt_datetime.getMinutes() < 10 ? '0' : '') + (dt_datetime.getMinutes()) + ":"
		+ (dt_datetime.getSeconds() < 10 ? '0' : '') + (dt_datetime.getSeconds())
	);
}
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}
function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}
function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}
function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

//[P46:start]
/*********************************************************************************************************
	START DATE FUNCTIONS
*********************************************************************************************************/	

// ===================================================================
// Author: Matt Kruse <matt@mattkruse.com>
// WWW: http://www.mattkruse.com/
// ===================================================================

// HISTORY
// ------------------------------------------------------------------
// May 17, 2003: Fixed bug in parseDate() for dates <1970
// March 11, 2003: Added parseDate() function
// March 11, 2003: Added "NNN" formatting option. Doesn't match up
//                 perfectly with SimpleDateFormat formats, but 
//                 backwards-compatability was required.

// ------------------------------------------------------------------
// These functions use the same 'format' strings as the 
// java.text.SimpleDateFormat class, with minor exceptions.
// The format string consists of the following abbreviations:
// 
// Field        | Full Form          | Short Form
// -------------+--------------------+-----------------------
// Year         | yyyy (4 digits)    | yy (2 digits), y (2 or 4 digits)
// Month        | MMM (name or abbr.)| MM (2 digits), M (1 or 2 digits)
//              | NNN (abbr.)        |
// Day of Month | dd (2 digits)      | d (1 or 2 digits)
// Day of Week  | EE (name)          | E (abbr)
// Hour (1-12)  | hh (2 digits)      | h (1 or 2 digits)
// Hour (0-23)  | HH (2 digits)      | H (1 or 2 digits)
// Hour (0-11)  | KK (2 digits)      | K (1 or 2 digits)
// Hour (1-24)  | kk (2 digits)      | k (1 or 2 digits)
// Minute       | mm (2 digits)      | m (1 or 2 digits)
// Second       | ss (2 digits)      | s (1 or 2 digits)
// AM/PM        | a                  |
//
// NOTE THE DIFFERENCE BETWEEN MM and mm! Month=MM, not mm!
// Examples:
//  "MMM d, y" matches: January 01, 2000
//                      Dec 1, 1900
//                      Nov 20, 00
//  "M/d/yy"   matches: 01/20/00
//                      9/2/00
//  "MMM dd, yyyy hh:mm:ssa" matches: "January 01, 2000 12:30:45AM"
// ------------------------------------------------------------------

var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x) {return(x<0||x>9?"":"0")+x}

// ------------------------------------------------------------------
// isDate ( date_string, format_string )
// Returns true if date string matches format of format string and
// is a valid date. Else returns false.
// It is recommended that you trim whitespace around the value before
// passing it to this function, as whitespace is NOT ignored!
// ------------------------------------------------------------------
function isDate(val,format) {
	var date=getDateFromFormat(val,format);
	if (date==0) { return false; }
	return true;
	}

// -------------------------------------------------------------------
// compareDates(date1,date1format,date2,date2format)
//   Compare two date strings to see which is greater.
//   Returns:
//   1 if date1 is greater than date2
//   0 if date2 is greater than date1 of if they are the same
//  -1 if either of the dates is in an invalid format
// -------------------------------------------------------------------
function compareDates(date1,dateformat1,date2,dateformat2) {
	var d1=getDateFromFormat(date1,dateformat1);
	var d2=getDateFromFormat(date2,dateformat2);
	if (d1==0 || d2==0) {
		return -1;
		}
	else if (d1 > d2) {
		return 1;
		}
	return 0;
	}

// ------------------------------------------------------------------
// PT_formatDate (date_object, format)
// Returns a date in the output format specified.
// The format string uses the same abbreviations as in getDateFromFormat()
// ------------------------------------------------------------------
function PT_formatDate(date,format) {
	format=format+"";
	var result="";
	var i_format=0;
	var c="";
	var token="";
	var y=date.getYear()+"";
	var M=date.getMonth()+1;
	var d=date.getDate();
	var E=date.getDay();
	var H=date.getHours();
	var m=date.getMinutes();
	var s=date.getSeconds();
	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
	// Convert real date parts into formatted versions
	var value=new Object();
	if (y.length < 4) {y=""+(y-0+1900);}
	value["y"]=""+y;
	value["yyyy"]=y;
	value["yy"]=y.substring(2,4);
	value["M"]=M;
	value["MM"]=LZ(M);
	value["MMM"]=MONTH_NAMES[M-1];
	value["NNN"]=MONTH_NAMES[M+11];
	value["d"]=d;
	value["dd"]=LZ(d);
	value["E"]=DAY_NAMES[E+7];
	value["EE"]=DAY_NAMES[E];
	value["H"]=H;
	value["HH"]=LZ(H);
	if (H==0){value["h"]=12;}
	else if (H>12){value["h"]=H-12;}
	else {value["h"]=H;}
	value["hh"]=LZ(value["h"]);
	if (H>11){value["K"]=H-12;} else {value["K"]=H;}
	value["k"]=H+1;
	value["KK"]=LZ(value["K"]);
	value["kk"]=LZ(value["k"]);
	if (H > 11) { value["a"]="PM"; }
	else { value["a"]="AM"; }
	value["m"]=m;
	value["mm"]=LZ(m);
	value["s"]=s;
	value["ss"]=LZ(s);
	while (i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		if (value[token] != null) { result=result + value[token]; }
		else { result=result + token; }
		}
	return result;
	}
	
// ------------------------------------------------------------------
// Utility functions for parsing in getDateFromFormat()
// ------------------------------------------------------------------
function _isInteger(val) {
	var digits="1234567890";
	for (var i=0; i < val.length; i++) {
		if (digits.indexOf(val.charAt(i))==-1) { return false; }
		}
	return true;
	}
function _getInt(str,i,minlength,maxlength) {
	for (var x=maxlength; x>=minlength; x--) {
		var token=str.substring(i,i+x);
		if (token.length < minlength) { return null; }
		if (_isInteger(token)) { return token; }
		}
	return null;
	}
	
// ------------------------------------------------------------------
// getDateFromFormat( date_string , format_string )
//
// This function takes a date string and a format string. It matches
// If the date string matches the format string, it returns the 
// getTime() of the date. If it does not match, it returns 0.
// ------------------------------------------------------------------
function getDateFromFormat(val,format) {
	val=val+"";
	format=format+"";
	var i_val=0;
	var i_format=0;
	var c="";
	var token="";
	var token2="";
	var x,y;
	var now=new Date();
	var year=now.getYear();
	var month=now.getMonth()+1;
	var date=1;
	var hh=now.getHours();
	var mm=now.getMinutes();
	var ss=now.getSeconds();
	var ampm="";
	
	while (i_format < format.length) {
		// Get next token from format string
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		// Extract contents of value based on format token
		if (token=="yyyy" || token=="yy" || token=="y") {
			if (token=="yyyy") { x=4;y=4; }
			if (token=="yy")   { x=2;y=2; }
			if (token=="y")    { x=2;y=4; }
			year=_getInt(val,i_val,x,y);
			if (year==null) { return 0; }
			i_val += year.length;
			if (year.length==2) {
				if (year > 70) { year=1900+(year-0); }
				else { year=2000+(year-0); }
				}
			}
		else if (token=="MMM"||token=="NNN"){
			month=0;
			for (var i=0; i<MONTH_NAMES.length; i++) {
				var month_name=MONTH_NAMES[i];
				if (val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()) {
					if (token=="MMM"||(token=="NNN"&&i>11)) {
						month=i+1;
						if (month>12) { month -= 12; }
						i_val += month_name.length;
						break;
						}
					}
				}
			if ((month < 1)||(month>12)){return 0;}
			}
		else if (token=="EE"||token=="E"){
			for (var i=0; i<DAY_NAMES.length; i++) {
				var day_name=DAY_NAMES[i];
				if (val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()) {
					i_val += day_name.length;
					break;
					}
				}
			}
		else if (token=="MM"||token=="M") {
			month=_getInt(val,i_val,token.length,2);
			if(month==null||(month<1)||(month>12)){return 0;}
			i_val+=month.length;}
		else if (token=="dd"||token=="d") {
			date=_getInt(val,i_val,token.length,2);
			if(date==null||(date<1)||(date>31)){return 0;}
			i_val+=date.length;}
		else if (token=="hh"||token=="h") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>12)){return 0;}
			i_val+=hh.length;}
		else if (token=="HH"||token=="H") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>23)){return 0;}
			i_val+=hh.length;}
		else if (token=="KK"||token=="K") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<0)||(hh>11)){return 0;}
			i_val+=hh.length;}
		else if (token=="kk"||token=="k") {
			hh=_getInt(val,i_val,token.length,2);
			if(hh==null||(hh<1)||(hh>24)){return 0;}
			i_val+=hh.length;hh--;}
		else if (token=="mm"||token=="m") {
			mm=_getInt(val,i_val,token.length,2);
			if(mm==null||(mm<0)||(mm>59)){return 0;}
			i_val+=mm.length;}
		else if (token=="ss"||token=="s") {
			ss=_getInt(val,i_val,token.length,2);
			if(ss==null||(ss<0)||(ss>59)){return 0;}
			i_val+=ss.length;}
		else if (token=="a") {
			if (val.substring(i_val,i_val+2).toLowerCase()=="am") {ampm="AM";}
			else if (val.substring(i_val,i_val+2).toLowerCase()=="pm") {ampm="PM";}
			else {return 0;}
			i_val+=2;}
		else {
			if (val.substring(i_val,i_val+token.length)!=token) {return 0;}
			else {i_val+=token.length;}
			}
		}
	// If there are any trailing characters left in the value, it doesn't match
	if (i_val != val.length) { return 0; }
	// Is date valid for month?
	if (month==2) {
		// Check for leap year
		if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
			if (date > 29){ return 0; }
			}
		else { if (date > 28) { return 0; } }
		}
	if ((month==4)||(month==6)||(month==9)||(month==11)) {
		if (date > 30) { return 0; }
		}
	// Correct hours value
	if (hh<12 && ampm=="PM") { hh=hh-0+12; }
	else if (hh>11 && ampm=="AM") { hh-=12; }
	var newdate=new Date(year,month-1,date,hh,mm,ss);
	return newdate.getTime();
	}

// ------------------------------------------------------------------
// parseDate( date_string [, prefer_euro_format] )
//
// This function takes a date string and tries to match it to a
// number of possible date formats to get the value. It will try to
// match against the following international formats, in this order:
// y-M-d   MMM d, y   MMM d,y   y-MMM-d   d-MMM-y  MMM d
// M/d/y   M-d-y      M.d.y     MMM-d     M/d      M-d
// d/M/y   d-M-y      d.M.y     d-MMM     d/M      d-M
// A second argument may be passed to instruct the method to search
// for formats like d/M/y (european format) before M/d/y (American).
// Returns a Date object or null if no patterns match.
// ------------------------------------------------------------------
function parseDate(val) {
	var preferEuro=(arguments.length==2)?arguments[1]:false;
	generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','MMM d');
	monthFirst=new Array('M/d/y','M-d-y','M.d.y','MMM-d','M/d','M-d');
	dateFirst =new Array('d/M/y','d-M-y','d.M.y','d-MMM','d/M','d-M');
	var checkList=new Array('generalFormats',preferEuro?'dateFirst':'monthFirst',preferEuro?'monthFirst':'dateFirst');
	var d=null;
	for (var i=0; i<checkList.length; i++) {
		var l=window[checkList[i]];
		for (var j=0; j<l.length; j++) {
			d=getDateFromFormat(val,l[j]);
			if (d!=0) { return new Date(d); }
			}
		}
	return null;
	}
/*********************************************************************************************************
	END DATE FUNCTIONS
*********************************************************************************************************/	
//[P46:end]

function isValidVin(val){
	val = val.toUpperCase();
	charSum = 0;

	var chars = new Array(
		new Array("0", 0),
		new Array("1", 1),
		new Array("2", 2),
		new Array("3", 3),
		new Array("4", 4),
		new Array("5", 5),
		new Array("6", 6),
		new Array("7", 7),
		new Array("8", 8),
		new Array("9", 9),
		new Array("A", 1),
		new Array("B", 2),
		new Array("C", 3),
		new Array("D", 4),
		new Array("E", 5),
		new Array("F", 6),
		new Array("G", 7),
		new Array("H", 8),
		new Array("J", 1),
		new Array("K", 2),
		new Array("L", 3),
		new Array("M", 4),
		new Array("N", 5),
		new Array("P", 7),
		new Array("R", 9),
		new Array("S", 2),
		new Array("T", 3),
		new Array("U", 4),
		new Array("V", 5),
		new Array("W", 6),
		new Array("X", 7),
		new Array("Y", 8),
		new Array("Z", 9) );
	var weights = new Array(8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2);
	
	//Must be 17 characters
	if(val.length != 17) return false;
	
	//Cannot contain O, I, or Q
	if(val.indexOf("O") >= 0 || val.indexOf("I") >= 0 || val.indexOf("Q") >= 0) return false;
	
	//Validate check digit
	for(i=0; i<val.length; i++){
		//don't include 9th character in calculation since it is the check digit
		if(i == 8) continue; 
		idx = getArrayIndex(chars, val.charAt(i));
		if(idx == -1) return false;
		thisCalc = parseInt(chars[idx][1]) * parseInt(weights[i]);
		charSum += thisCalc;
	}
	
	charMod = charSum % 11;
	
	if(charMod == 10) cd = "X";
	else cd = charMod;
	
	if(val.charAt(8) != cd) return false;
	
	return true;
}

function getArrayIndex(theArray, theValue){
	var arLength = theArray.length;
	for(var i=0; i<arLength; i++){
		if(theArray[i].constructor.toString().indexOf("Array") >= 0){
			if(theArray[i][0] == theValue) return i;
		}
		else{
			if (theArray[i] == theValue) return i;
		}
	}
	return -1;
}

function GetLocalizedResource(id){
	return ReplaceVars(_RES[id])
}

function GetLocalizedResource_Dummy(id, str){
	return ReplaceVars(str)
}

function ReplaceVars(text){
	var ret = text;
	//Use RegExp to populate our variables within the document
	oRE = /\[\[([^\[\]]*)\]\]/gim;	
	oMatches = oRE.exec(text);

	if(oMatches != null){
		while(oMatches != null){
			for(i=1; i<oMatches.length; i++){
				eval("if(typeof(" + oMatches[i] + ")!='undefined'){val=" + oMatches[i] + ";}else{val=''}");
				ret = ret.replace(oMatches[0], val);
			}
			if(oRE.global) 
				oMatches = oRE.exec(text);
			else 
				oMatches = null;
		}
	}
	return ret.toString();
}

function GetLanguage(){
	cklang = getCookie("lang");
	if(cklang == ""){
		lang = "en";}
	else{
		lang = cklang;
	}
	return lang;
}

function Left(str, n){
	if (n <= 0)
	    return "";
	else if (n > String(str).length)
	    return str;
	else
	    return String(str).substring(0,n);
}

function Right(str, n){
    if (n <= 0)
       return "";
    else if (n > String(str).length)
       return str;
    else {
       var iLen = String(str).length;
       return String(str).substring(iLen, iLen - n);
    }
}