var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var whitespace = " \t\n\r";
var decimalPointDelimiter = ".";
var phoneNumberDelimiters = "()- ";
var mPrefix = "You did not enter a value into the ";
var mSuffix = " field. This is a required field. Please enter it now.";
var sWorldLastName = "Family Name";
var sWorldFirstName = "Given Name";
var sTitle = "Title";
var sCompanyName = "Company Name";
var sWorldAddress = "Address";
var sCity = "City";
var sStateCode = "State Code";
var sWorldState = "State, Province, or Prefecture";
var sCountry = "Country";
var sZIPCode = "ZIP Code";
var sWorldPostalCode = "Postal Code";
var sPhone = "Phone Number";
var sFax = "Fax Number";
var sDateOfBirth = "Date of Birth";
var sExpirationDate = "Expiration Date";
var sEmail = "Email";
var sOtherInfo = "Other Information";


// i is an abbreviation for "invalid"

var iDay = "This field must be a day number between 1 and 31.  Please reenter it now.";
var iMonth = "This field must be a month number between 1 and 12.  Please reenter it now.";
var iYear = "This field must be a 2 or 4 digit year number.  Please reenter it now.";
var iDatePrefix = "The Day, Month, and Year for ";
var iDateSuffix = " do not form a valid date.  Please reenter them now.";



// p is an abbreviation for "prompt"

var pEntryPrompt = "Please enter a "
var pEmail = "valid email address (like foo@bar.com)."
var pCreditCard = "valid credit card number."
var pDay = "day number between 1 and 31."
var pMonth = "month number between 1 and 12."
var pYear = "2 or 4 digit year number."
var strRecord = ""


var defaultEmptyOK = false

var daysInMonth = new Array(12);
daysInMonth[1] = 31;
daysInMonth[2] = 28.25;   // must programmatically check this
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;

function makeArray(n) {
   for (var i = 1; i <= n; i++) {
      this[i] = 0;
   }
   return this;
}


function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}


function isWhitespace (s)

{   var i;

    // Is s empty?
    if (isEmpty(s)) return true;

    for (i = 0; i < s.length; i++)
    {
        // Check that current character isn't whitespace.
        var c = s.charAt(i);

        if (whitespace.indexOf(c) == -1) return false;
    }

    // All characters are whitespace.
    return true;
}


function stripCharsInBag (s, bag)

{   var i;
    var returnString = "";

    for (i = 0; i < s.length; i++)
    {
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}



function stripCharsNotInBag (s, bag)

{   var i;
    var returnString = "";


    for (i = 0; i < s.length; i++)
    {
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) != -1) returnString += c;
    }

    return returnString;
}

function stripWhitespace (s)

{   return stripCharsInBag (s, whitespace)
}

function charInString (c, s)
{   for (i = 0; i < s.length; i++)
    {   if (s.charAt(i) == c) return true;
    }
    return false
}

function stripInitialWhitespace (s)
{   var i = 0;
    while ((i < s.length) && charInString (s.charAt(i), whitespace))
       i++;
    return s.substring (i, s.length);
}

function isLetter (c)
{   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}

function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

function isLetterOrDigit (c)
{   return (isLetter(c) || isDigit(c))
}

function isInteger (s)
{   var i;
    if (isEmpty(s))
       if (isInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isInteger.arguments[1] == 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 isSignedInteger (s)
{   if (isEmpty(s))
       if (isSignedInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isSignedInteger.arguments[1] == true);
    else {
        var startPos = 0;
        var secondArg = defaultEmptyOK;

        if (isSignedInteger.arguments.length > 1)
            secondArg = isSignedInteger.arguments[1];

        // skip leading + or -
        if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;
        return (isInteger(s.substring(startPos, s.length), secondArg))
    }
}


function isPositiveInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isPositiveInteger.arguments.length > 1)
        secondArg = isPositiveInteger.arguments[1];

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) > 0) ) );
}



function isNonnegativeInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isNonnegativeInteger.arguments.length > 1)
        secondArg = isNonnegativeInteger.arguments[1];


    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
}



function isNegativeInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isNegativeInteger.arguments.length > 1)
        secondArg = isNegativeInteger.arguments[1];


    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) < 0) ) );
}



function isNonpositiveInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isNonpositiveInteger.arguments.length > 1)
        secondArg = isNonpositiveInteger.arguments[1];


    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) <= 0) ) );
}


function isFloat (s)

{   var i;
    var seenDecimalPoint = false;

    if (isEmpty(s))
       if (isFloat.arguments.length == 1) return defaultEmptyOK;
       else return (isFloat.arguments[1] == true);

    if (s == decimalPointDelimiter) return false;

    for (i = 0; i < s.length; i++)
    {
        // Check that current character is number.
        var c = s.charAt(i);

        if ((c == decimalPointDelimiter) && !seenDecimalPoint) seenDecimalPoint = true;
        else if (!isDigit(c)) return false;
    }

    // All characters are numbers.
    return true;
}


function isSignedFloat (s)

{   if (isEmpty(s))
       if (isSignedFloat.arguments.length == 1) return defaultEmptyOK;
       else return (isSignedFloat.arguments[1] == true);

    else {
        var startPos = 0;
        var secondArg = defaultEmptyOK;

        if (isSignedFloat.arguments.length > 1)
            secondArg = isSignedFloat.arguments[1];

        // skip leading + or -
        if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
           startPos = 1;
        return (isFloat(s.substring(startPos, s.length), secondArg))
    }
}


function isAlphabetic (s)

{   var i;

    if (isEmpty(s))
       if (isAlphabetic.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphabetic.arguments[1] == true);

    for (i = 0; i < s.length; i++)
    {
        // Check that current character is letter.
        var c = s.charAt(i);

        if (!isLetter(c))
        return false;
    }

    // All characters are letters.
    return true;
}


function isAlphanumeric (s)

{   var i;

    if (isEmpty(s))
       if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphanumeric.arguments[1] == true);

    for (i = 0; i < s.length; i++)
    {
        // Check that current character is number or letter.
        var c = s.charAt(i);

        if (! (isLetter(c) || isDigit(c) ) )
        return false;
    }

    // All characters are numbers or letters.
    return true;
}



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 isEmail (s)
{   if (isEmpty(s))
       if (isEmail.arguments.length == 1) return defaultEmptyOK;
       else return (isEmail.arguments[1] == true);

    // is s whitespace?
    if (isWhitespace(s)) return false;

    // there must be >= 1 character before @, so we
    // start looking at character position 1
    // (i.e. second character)
    var i = 1;
    var sLength = s.length;

    // look for @
    while ((i < sLength) && (s.charAt(i) != "@"))
    { i++
    }

    if ((i >= sLength) || (s.charAt(i) != "@")) return false;
    else i += 2;

    // look for .
    while ((i < sLength) && (s.charAt(i) != "."))
    { i++
    }

    // there must be at least one character after the .
    if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
    else return true;
}


function isYear (s)
{   if (isEmpty(s))
       if (isYear.arguments.length == 1) return defaultEmptyOK;
       else return (isYear.arguments[1] == true);
    if (!isNonnegativeInteger(s)) return false;
    return ((s.length == 2) || (s.length == 4));
}


function isIntegerInRange (s, a, b)
{   if (isEmpty(s))
       if (isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
       else return (isIntegerInRange.arguments[1] == true);

    if (!isInteger(s, false)) return false;

    var num = parseInt (s);
    return ((num >= a) && (num <= b));
}



function isMonth (s)
{   if (isEmpty(s))
       if (isMonth.arguments.length == 1) return defaultEmptyOK;
       else return (isMonth.arguments[1] == true);
    return isIntegerInRange (s, 1, 12);
}


function isDay (s)
{   if (isEmpty(s))
       if (isDay.arguments.length == 1) return defaultEmptyOK;
       else return (isDay.arguments[1] == true);
    return isIntegerInRange (s, 1, 31);
}


function daysInFebruary (year)
{   // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}

function isDate (day, month, year)
{   // catch invalid years (not 2- or 4-digit) and invalid months and days.
    if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;

    var intYear = parseInt(year);
    var intMonth = parseInt(month);
    var intDay = parseInt(day);

    // catch invalid days, except for February
    if (intDay > daysInMonth[intMonth]) return false;

    if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;

    return true;
}

function prompt (s)
{   window.status = s
}

// Display data entry prompt string s in status bar.
function promptEntry (s)
{   window.status = pEntryPrompt + s
}

function warnEmpty (theField, s)
{   theField.focus()
    alert(mPrefix + s + mSuffix)
    return false
}

function warnInvalid (theField, s)
{   theField.focus()
    theField.select()
    alert(s)
    return false
}

function checkString (theField, s, emptyOK)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
    // in equality comparison below.
    if (checkString.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (isWhitespace(theField.value))
       return warnEmpty (theField, s);
    else return true;
}

function checkEmail (theField, emptyOK)
{   if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else if (!isEmail(theField.value, false))
       return warnInvalid (theField, "please enter a valid email");
    else return true;
}


function checkYear (theField, emptyOK)
{   if (checkYear.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (!isYear(theField.value, false))
       return warnInvalid (theField, iYear);
    else return true;
}



function checkMonth (theField, emptyOK)
{   if (checkMonth.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (!isMonth(theField.value, false))
       return warnInvalid (theField, iMonth);
    else return true;
}


function checkDay (theField, emptyOK)
{   if (checkDay.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (!isDay(theField.value, false))
       return warnInvalid (theField, iDay);
    else return true;
}



function checkDate (yearField, monthField, dayField, labelString, OKtoOmitDay)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
    // in equality comparison below.
    if (checkDate.arguments.length == 4) OKtoOmitDay = false;
    if (!isYear(yearField.value)) return warnInvalid (yearField, iYear);
    if (!isMonth(monthField.value)) return warnInvalid (monthField, iMonth);
    if ( (OKtoOmitDay == true) && isEmpty(dayField.value) ) return true;
    else if (!isDay(dayField.value))
       return warnInvalid (dayField, iDay);
    if (isDate (yearField.value, monthField.value, dayField.value))
       return true;
    alert (iDatePrefix + labelString + iDateSuffix)
    return false
}



// Get checked value from radio button.

function getRadioButtonValue (radio)
{   for (var i = 0; i < radio.length; i++)
    {   if (radio[i].checked) { break }
    }
    return radio[i].value
}



//Cookies ---------------------------------------
var expdate = new Date();

FixCookieDate (expdate);
expdate.setTime (expdate.getTime() + (24*60*60*365));

function GetCookieVal (offset) {
  if (top!=self)
    {
    var endstr = top.document.cookie.indexOf (";", offset);
    if (endstr == -1)
      endstr = top.document.cookie.length;
    return unescape(top.document.cookie.substring(offset, endstr));
    }
  else
    {
    var endstr = document.cookie.indexOf (";", offset);
    if (endstr == -1)
      endstr = document.cookie.length;
    return unescape(document.cookie.substring(offset, endstr));
    }
}

function FixCookieDate (date) {
  var base = new Date(0);
  var skew = base.getTime(); // dawn of (Unix) time - should be 0
  if (skew > 0)  // Except on the Mac - ahead of its time
    date.setTime (date.getTime() - skew);
}


function SetCookie( strName, strValue, lTop )
{
  var strCookie = strName + "=" + escape( strValue )

  //50 years before expiry should be enough!
  var dtExpire = new Date()
  dtExpire.setTime( dtExpire.getTime() + (365 * 24 * 60 * 60 * 1000 ) )
  strCookie += "; expires=" + dtExpire.toUTCString();

  if (lTop==true) { top.document.cookie = strCookie; }
  else { document.cookie = strCookie; }
}

function GetCookie( strName, lTop )
{
  if (lTop==true) { var dc = top.document.cookie; }
  else {var dc = document.cookie;}

  var prefix = strName + "="
  var begin = dc.indexOf( "; " + prefix )

  if( begin == -1 )
  {
    begin = dc.indexOf( prefix )
    if( begin != 0 )
      return null
  }
  else
    begin += 2

  var end = document.cookie.indexOf( ";", begin )

  if( end == -1 )
    end = dc.length;
  //alert( dc);
  return unescape( dc.substring( begin + prefix.length, end ) )
}


function DeleteCookie (name,path,domain) {

  if (GetCookie(name)) {
    if (top!=self) {
      top.document.cookie = name + "=" +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      "; expires=Thu, 01-Jan-70 00:00:01 GMT";}
      }
    else {
      document.cookie = name + "=" +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      "; expires=Thu, 01-Jan-70 00:00:01 GMT";}
  }

/******************************************************************************
* Record functions
******************************************************************************/

var arrRecords = "";
var recCount = 0;

function loadRecords (database)
{
  //var v = GetCookie(database);
  //alert(database + " cookie  is "+v);
  //if (isEmpty(v))
  v = loadfromfile();
      //alert(database + ": " + v);
  //  }
  setRecords (database,v);

  return true;
}

function setRecords (database, a)
{
    arrRecords = a.split("|");

    if ( database=="fpssecs" ) {
      arrRecords.sort(fpssort);
    }
    if ( database=="nextsteps" ) {
      arrRecords.sort(stepsort);
    }
    recCount = 0;
    strRecord = "";
}

function currentRecord()
{
  if (arrRecords.length != "")
  {
    strRecord = arrRecords[recCount];
    currRecord = strRecord.split(",");
    return currRecord;
  }
}

function setRec (database)
{
  var strrec="";
  var strrecs="";

  for(var i = 0; i < aRec.length; i++)
   { strrec += aRec[i] + ",";
   }

  arrRecords[recCount] = strrec;

  for(i = 0; i < arrRecords.length; i++)
   { strrecs += arrRecords[i] + "|";
   }

  //SetCookie(database,strrecs);
  aRec = currentRecord();

}

function newRec(action)
{
   //strRecord = arrRecords[recCount];
   //var aRec = strRecord.split(",");
   //var str = "";
   //for(var i = 0; i < aRec.length; i++)
   // { str += " ,";
   //}
   //str=str.substr(1,str.length-1);

   //arrRecords[countRecords()] = str;

   //recCount = arrRecords.length-1;
   //alert(arrRecords[recCount]);
   //currRecord = str.split(",");
}

function countRecords()
{
  return arrRecords.length;
}

function delRec()
{
  arrRecords.splice(recCount,1);
  navigate("previous");
  setRec();
}

function navigate(control)
{
  switch (control)
  {
  case "first" :
   recCount = 0;
   break;
  case "last" :
   recCount = arrRecords.length - 1;
   break;
  case "next" :
   if (recCount < arrRecords.length - 1) {
   recCount = recCount + 1;
   }

   break;
  case "previous" :
   if (recCount > 0) {
   recCount = recCount - 1;
   //currentRecord();
   }
   //document.frm2.add.value = "  NEW  ";
   break;
  default:
  }
 }

// Splice method Protype Function
// Peter Belesis, Internet.com
// http://www.dhtmlab.com/

  if (!Array.prototype.splice)
  {
    function array_splice(ind,cnt)
    {
    if (arguments.length == 0) return ind;
    if (typeof ind != "number") ind = 0;
    if (ind < 0) ind = Math.max(0,this.length + ind);
    if (ind > this.length)
    {
      if (arguments.length > 2) ind = this.length;
      else return [];
    }
    if (arguments.length < 2) cnt = this.length-ind;
    cnt = (typeof cnt == "number") ? Math.max(0,cnt) : 0;
    removeArray = this.slice(ind,ind+cnt);
    endArray = this.slice(ind+cnt);
    this.length = ind;
    for (var i = 2; i < arguments.length; i++)
    {
      this[this.length] = arguments[i];
    }

    for(var i = 0; i < endArray.length; i++)
    {
      this[this.length] = endArray[i];
    }

    return removeArray;
  }

  Array.prototype.splice = array_splice;

}

/******************************************************************************
* FPS functions
******************************************************************************/


function resortSteps()
{
    arrRecords.sort(stepsortC);
}

function fpssort(a,b){
  var firstRec = a.split(",");
  var secondRec = b.split(",");
  var i = firstRec[7] * 100;
  var j = secondRec[7] * 100;
  var k = 0;
  var l = 0;

  if ( firstRec[10] != null) { k = firstRec[10].charCodeAt(0); }
  if ( secondRec[10] !=null) { l = secondRec[10].charCodeAt(0); }

  if ( isNaN(i) ) { i=0;}
  if ( isNaN(j) ) { j=0;}
  if ( isNaN(k) ) { k=0;}
  if ( isNaN(l) ) { l=0;}

  i= i + k ;
  j= j + l ;

  return( i-j );
}

function stepsortC(a,b){
  var firstRec = a.split(",");
  var secondRec = b.split(",");
  var i = firstRec[8] + 0 ;
  var j = secondRec[8] + 0 ;
  var k = 0;
  var l = 0;

  //k = firstRec[10];
  //l = secondRec[10];

  //if ( isNaN(k) ) { k=0;}
  //if ( isNaN(l) ) { l=0;}

  if ( firstRec[8] == null) { i=0; }
  //i= i + k;

  if ( secondRec[8] == null) { j=0; }
  //j= j + l ;

  return( i-j );
}


function stepsort(a,b){
  var firstRec = a.split(",");
  var secondRec = b.split(",");
  var i = firstRec[5] ;
  var j = secondRec[5] ;
  var k = 0;
  var l = 0;

  //k = firstRec[10];
  //l = secondRec[10];

  //if ( isNaN(k) ) { k=0;}
  //if ( isNaN(l) ) { l=0;}

  if ( firstRec[5] == null) { i=0; }
  //i= i + k;

  if ( secondRec[5] == null) { j=0; }
  //j= j + l ;

  return( i-j );
}

function roundOff(value, precision)
{
        value = "" + value //convert value to string
        precision = parseInt(precision);

        var whole = "" + Math.round(value * Math.pow(10, precision));

        var decPoint = whole.length - precision;

        if(decPoint != 0)
        {
                result = whole.substring(0, decPoint);
                result += ".";
                result += whole.substring(decPoint, whole.length);
        }
        else
        {
                result = whole;
        }
        //        alert(result.charAt(result.length));
        if (result.charAt(result.length-1) == ".") { result = result.substring(0,result.length-1) }
        return result;
}

function evalnum(numstr) {

	var i,c;
	var ret="";
	var p=false;

	for (i=numstr.length-1; i>=0; i--) {
		c=numstr.charAt(i);

		if (c == ".") {
			if (p == false) p=true;
			else c="";
		}

		if ((c < "0" || c > "9") && c != ".") c="";

		ret = c + ret;
	}

	if (ret=="") ret="0";
	return parseFloat(ret);

}



// shows a number as pounds
function evalpound(num) {

	var i,l,d;
	var nums;
	var ret;
  var sign=1;

  if (num<0) {
    sign=-1;
    num=-num;
    }

  nums = String(Math.round(num*100));

	while (nums.length <3) nums = "0" + nums;

	l = nums.length-3;
  ret = "" //"." + nums.charAt(l+1) + nums.charAt(l+2);

	d=0;
	for (i=l; i>=0; i--) {
    ret = nums.charAt(i) + ret;
		d++;
		if (d==3 && i>0) {
			ret="," + ret;
			d=0;
		}
	}

	ret = "£" + ret;
  if (sign==-1) {ret = "-" + ret;}

	return ret;

}


function isInvest(aRec) {

  var i = parseInt(aRec[7]);

  if ((i >= 110) && (i < 200)) { return true;}

  if (i == 303) { return true;}

  if ((i >= 602) && (i < 700)) {
     if ((i != 610) && (i != 609) && (i != 605)) { return true;}
  }

  if ((i >= 300) && (i < 400)) { return true;}

  if (i == 706) { return true;} // 'whole life


  return false;

}

function isLoan(aRec) {

  var i = parseInt(aRec[7]);

  if ((i >= 200) && (i < 300)) {
    if (oFPS.Premium==0) {
      oFPS.Premium=parseFloat(aRec[5])*parseInt(aRec[3]);}   // loan interest cost
    return true;}

  return false;

}

function isPension(aRec) {

  if (aRec[7]!=null) {
    if (aRec[7].charAt(0)=="6"){return true;}
  }
  return false;

}



function FPSItem(text) {
  this.text = text ? text : "not known";
  this.total = 0.00;
  this.items= new Array();
  this.AddItem = FPSAddSubItem;
}

/******************************************************************************
* Define the FPS object.                                                     *
******************************************************************************/

function FPS() {
  this.items   = new Array();
  this.AddItem = FPSAddItem;

}

function FPSAddItem(item) {
  this.items[this.items.length] = item;
}

function FPSAddSubItem(item) {
  //alert(item.Desc);
  this.items[this.items.length] = item;
}


function setFPSObject(aRec)
{
  if (aRec=="") {
    alert("PROBLEM");
    return false;
    }

  oFPS.IsInvest = isInvest(aRec);

  oFPS.Desc=aRec[0];
  oFPS.Owner=aRec[1];
  oFPS.Premium=aRec[2];
  oFPS.Amount=aRec[3];
  oFPS.Escalation=aRec[4];
  oFPS.Interest=aRec[5];
  oFPS.Assurance=aRec[6];
  oFPS.Code = parseInt(aRec[7]);
  oFPS.SCode = aRec[10];
  oFPS.Start=aRec[11];
  oFPS.End=aRec[12];
  oFPS.ContractNo = aRec[13];
  oFPS.IsManaged = (aRec[15]==1);
  if (aRec[16] != "") { oFPS.Company=aRec[16]; }
                else { oFPS.Company=aRec[8]; }
  oFPS.IsTacticSell = (aRec[17] == 1);
  oFPS.IsStrategySell = (aRec[18] == 0);
  oFPS.Comments = aRec[19];

  oFPS.Rating = aRec[23];
  oFPS.Gain = aRec[24]-aRec[3];

  oFPS.IsISA = (aRec[7]=="303");
  if (aRec[7]!=null) {oFPS.IsPension = (aRec[7].charAt(0)=="6");}
  oFPS.Assessed = "";                                // default

  if (oFPS.IsInvest) {
  if (oFPS.IsTacticSell==true) {                                  //tacticsell
      oFPS.Assessed = "<img src=\"../images/cross.gif\">";
      }
  else {
      if (oFPS.IsStrategySell == true) {                             // strategy
        oFPS.Assessed = "<img src=\"../images/sellsoon.gif\">"; }
      else {
          if ( parseInt(aRec[23]) < -5) {
             oFPS.Assessed = "<img src=\"../images/question.gif\">"; }
          else {
            if ( parseInt(aRec[23]) > 5) {
               oFPS.Assessed = "<img src=\"../images/tick.gif\">"; }
          }
      }
  }}

  if (aRec[26].indexOf(".htm",1) > 0) { oFPS.Ref = aRec[26]; }
    else { oFPS.Ref = ""; }

  if ( aRec[27] !="") { oFPS.Rate = parseFloat(aRec[27]); }
    else { oFPS.Rate = 1 ; }

  oFPS.Holding=aRec[28];

  if (isLoan(aRec)) {
    oFPS.Income=parseFloat(aRec[5]) * parseInt(aRec[3]);
    oFPS.Premium=0; }             // data fix

  if ((oFPS.IsInvest) || (isLoan(aRec))) {
    oFPS.Income=parseFloat(aRec[5]) * parseInt(aRec[24]); }
  else {
    oFPS.Income=oFPS.Amount; }

  if (aRec[2] != 0) {
        oFPS.Regularity="annual"; }
  else {
        oFPS.Regularity="single"; }

  if ((oFPS.Code==605) || (oFPS.Code==609) || (oFPS.Code==610)) {
      var j=new Date;
      j=j.toUTCString();
      j=UTCDatetoVB(j);
      if (oFPS.Start < j){
       oFPS.Income = oFPS.Amount;
       oFPS.Amount = 0;}
      else {
       oFPS.Income = 0;}                      // annuity and state pension
      }


  if ((oFPS.Code>1100)  && (oFPS.Code<1200)) {
       oFPS.Company = oFPS.Company + parseInt(aRec[2]*100) + "%";}   // will distribution

  if ((oFPS.Code>700)  && (oFPS.Code<800)) {
       oFPS.Company = oFPS.Company + " assured sum: " + evalpound(parseInt(aRec[6]));}   // assured sum

  //SELECT fpssecs.`DESC`, fpssecs.OWNER, fpssecs.PREMIUM, fpssecs.LUMP,
  //   4'fpssecs.ESCALATION, fpssecs.INTEREST, fpssecs.ASSURANCE, fpssecs.CODE, '
  //   8'fpssecs.NOTE, fpssecs.MFOLIO, fpssecs.SCODE, fpssecs.STARTPAY,
  //   12'fpssecs.FINISHPAY, fpssecs.CONTRACTNO, fpssecs.FUNDCODE, fpssecs.ISMANAGED,'
  //   16'fpssecs.COMPANY, fpssecs.TACTICSELL, fpssecs.STRATSELL, fpssecs.FPNOTE,
  //   20 fpssecs.FPSFOLIO, fpssecs.INVFOLIO, fpssecs.UPDATED, prices.AVRRET, " & _
  //   24 (inv.HOLDING * prices.NEWPRICEIN), (inv.HOLDING * inv.PRICEIN ),
  //   26 fpssecs.NOTE, inv.RATE, inv.HOLDING " & _

}

function UTCDatetoVB(dt){
  var i = dt.indexOf(" ",4)+1;   //day
  var j = dt.indexOf(" ",i)+1;   //month
  var k = dt.indexOf(" ",j)+1;   //year
  var years =  (parseFloat(dt.substring(k,k+4)) * 365.25) - (1900 * 365.25) ;
  var g = Month(dt.substring(j,j+3));
  var months=0;

  for(var f=1; f<g; f++) {
    months+=parseFloat(daysInMonth[f]);}
  var days = parseInt(dt.substring(i,i+2));

  var m = parseInt(years)+parseInt(months)+parseInt(days) + 1;

  return m;
}

function Month(strMonth)
{
  switch (strMonth)
  {
  case "Jan" :
   return 1;
   break;
  case "Feb" :
   return 2;
   break;
  case "Mar" :
   return 3;
   break;
  case "Apr" :
   return 4;
   break;
  case "May" :
   return 5;
   break;
  case "Jun" :
   return 6;
   break;
  case "July" :
   return 7;
   break;
  case "Aug" :
   return 8;
   break;
  case "Sep" :
   return 9;
   break;
  case "Oct" :
   return 10;
   break;
  case "Nov" :
   return 11;
   break;
  case "Dec" :
   return 12;
   break;
  default:
  }

}


function getFPSObject()
{

  aRec[0]=oFPS.Desc;
  aRec[1]=oFPS.Owner;
  aRec[2]=oFPS.Premium;
  aRec[3]=oFPS.Amount;

  aRec[5]=oFPS.Interest;
  aRec[6]=oFPS.Assurance;
  aRec[7]=oFPS.Code;

  aRec[10]=oFPS.SCode;
  aRec[11]=oFPS.Start;
  aRec[12]=oFPS.End;
  aRec[13]=oFPS.ContractNo;

  if (oFPS.IsManaged) {aRec[15]=1} else {aRec[15]=0};
  aRec[16]=oFPS.Company;

  aRec[19]=oFPS.Comments ;
  //aRec[23]=oFPS.Rating ;
  aRec[28]=oFPS.Holding;
}



function setStepObject(aRec)
{
  if ( isNaN(parseInt(aRec[9]))) {return};

  oStep.TaskType = aRec[8];
  oStep.Checked = "False";

  if (aRec[10] > 0) {
      setActionStepRefs(aRec);
      oStep.ActionBy = aRec[2];
      if (oStep.ActionBy.length!=0)
          {oStep.Action += " [" + oStep.ActionBy + "]";}
      }
  else {
      setHeadStepRefs(aRec);
      oStep.ActionBy = "";
      }

  oStep.Hours = aRec[12];
  oStep.Why="";
  oStep.IsStrategy = ((aRec[7] == 5003) || (aRec[7] ==0));
  oStep.IsTactic = (aRec[7] == 5002);
  oStep.IsAction = (aRec[7] == 5001);

  if (oStep.IsStrategy != true) {
  if (parseInt(aRec[12])>0)
  {
      if (oStep.Hours!=1)
      {oStep.Why = "<i> (Our budget: " + oStep.Hours + " hours.)</i>";}
      else
      {oStep.Why = "<i> (Our budget: " + oStep.Hours + " hour.)</i>";}
  }}

  oStep.Done = aRec[1];

  if (aRec[2] == "True") {
    oStep.Agreed = "";}
  else {
    oStep.Agreed = "<img src=\"../images/question.gif\"> ";
  }
  oStep.Priority = aRec[5];
  oStep.Folio = aRec[9];
  oStep.HeadStep = aRec[10];
  oStep.ActionStart = aRec[6];

  setChapter(aRec);

}

function setActionStepRefs(aRec) {
  var b = aRec[3];            // this is an action step, with a reference to its Plan
  oStep.Action = aRec[0];
  oStep.ActionRef="";

  GetHeadStepPlan(aRec);

  if (b != "") {
//   if ( b.indexOf("_private",1) > 0) {
       oStep.ActionRef = b;
//   }
  }
  if (oStep.ActionRef=="") {
      oStep.ActionRef = setPlanDir(aRec)+"Trans.htm";
  }

}

function setHeadStepRefs(aRec) {
  var b = aRec[3];              // this is a HeadStep, no action step
  oStep.Action = "";
  oStep.ActionRef="";
  oStep.Plan = aRec[0];
  oStep.PlanRef=b;
  if (b != "") {
    if ( b.indexOf("private",1) > 0) {
      oStep.PlanRef = "http://www.independencefp.co.uk/" + b;
      }
  }

}

function setPlanDir(aRec) {

  var strDir = "../";
  switch( aRec[8] )   // = oStep.TaskType
  {
    case "2":
      strDir = strDir + "review/r_";
      break;
    case "10":
      strDir = strDir + "I_cash/I";
      break;
    case "20":
      strDir = strDir + "II_reti/II";
      break;
    case "30":
      strDir = strDir + "III_port/III";
      break;
    case "40":
      strDir = strDir + "IV_tax/IV";
      break;
    case "41":
      strDir = strDir + "IV_tax/IV";
      break;
    case "50":
      strDir = strDir + "V_specia/V";
      break;
    case "60":
      strDir = strDir + "VI_pro/VI";
      break;
    case "70":
      strDir = strDir + "VII_heal/VII";
      break;
    case "80":
      strDir = strDir + "VIII_sav/VIII";
      break;
    case "90":
      strDir = strDir + "IX_estat/IX";
      break;

    }
  return (strDir);
}

function GetHeadStepPlan(aRec)
{
  var i = 0;
  var str;
  var aRec2;

  for(i = 0; i < countRecords(); i++) {
    str = arrRecords[i];
    aRec2 = str.split(",");
    if ( aRec2[9] == aRec[10] ) {
      oStep.Plan = aRec2[0];
      var b=aRec2[3];
      oStep.PlanRef=b;
      if (b != "") {
        if ( b.indexOf("private",1) > 0) {
          oStep.PlanRef = "http://www.independencefp.co.uk/" + b;
          //alert(oStep.PlanRef);
          }
      }
      //if (oStep.PlanRef=="") {
      //  oStep.PlanRef = setPlanDir(aRec)+"Plan.htm";
      //}
      aRec[8] = aRec2[8];  // data correction
    }

  }

  return "";
}

function GetStep(folio) {
  for(i = 0; i < countRecords(); i++) {
    str = arrRecords[i];
    aRec2 = str.split(",");
    if ( aRec2[9] == folio ) {
      setStepObject(aRec2);
      return}
} }



function GetHeadStepRef(HeadStep)
{
  var i = 0;
  var str;
  var aRec2;

  for(i = 0; i < countRecords(); i++) {
    str = arrRecords[i];
    aRec2 = str.split(",");
    if ( aRec2[9] == HeadStep ) { return setPlanDir(aRec2);}

  }

  return "";
}


function setChapter(aRec) {

  oStep.Chapter = "&nbsp"; // failsafe to pick up any codes not in this list

  switch( aRec[8] )   // = oStep.TaskType
  {
    case "2":
      oStep.Chapter="Data Collection";
      break;
    case "10":
      oStep.Chapter="I Cash Flow";
      break;
    case "20":
      oStep.Chapter="II Retirement";
      break;
    case "30":
      oStep.Chapter="III Portfolio";
      break;
    case "40":
      oStep.Chapter="IV Tax Mitigation";
      break;
    case "41":
      oStep.Chapter="Tax Return";
      break;
    case "50":
      oStep.Chapter="V Life Changes";
      break;
    case "60":
      oStep.Chapter="VI Protection";
      break;
    case "70":
      oStep.Chapter="VII Ill Health";
      break;
    case "80":
      oStep.Chapter="VIII Savings";
      break;
    case "90":
      oStep.Chapter="IX Estate";
      break;

    }
  return;
}


function setpageno()
{
  if (top != self) {
  top.window.frames("banner").objPages.ActivePage=(document.location);
	top.window.frames("banner").objPages.SetIndex();
  }
}

