// Nicola Zordan www.Zordan.net 18:53 9/3/2008
// Unisys Storm names

var UnisysURLbase='http://weather.unisys.com/hurricane';
var UnisysURLareas=['atlantic', 'e_pacific', 'w_pacific', 's_pacific', 's_indian', 'n_indian']; 
var UnisysURLarea=UnisysURLareas[0]; // atlantic

var today=new Date();
var UnisysURLyear=today.getFullYear(); 2008
var UnisysStormTrack='track.dat';



function UnisysStormNamesURL(area,year) {
  var url='';
  url=UnisysURLbase+'/'+area+'/'+year;
  return url;
};

function UnisysStormNamesData(area,year) {
  var data='';
  var url=UnisysStormNamesURL(area,year);
  data=TEXTload(url);
  return data;
};

var UnisysStormNameMatch='/'+UnisysStormTrack;
var UnisysStormNameBegin='=';
function UnisysStormNames(area,year,textDataIn) {
  var stormNames=[];
  var textData=textDataIn;
  if (textData==null) textData=UnisysStormNamesData(area,year);
  var data=textData.split('\n');
  var nameFound, line, fromChar, toChar, name, active;
  for (var i=0;i<data.length;i++) {
     active=false;
     line=data[i]
     nameFound=line.indexOf(UnisysStormNameMatch);
     if (nameFound>=0) {
       fromChar=line.lastIndexOf(UnisysStormNameBegin,nameFound);
       if (fromChar>=0) {
         toChar=nameFound;
         name=line.substring(fromChar+1,toChar);
         stormNames.push(name);
       };
     };
  };
  return stormNames;
};

function UnisysStormNamesDetailed(area,year) {
  var textData=UnisysStormNamesData(area,year);
  var names=UnisysStormNames(area,year,textData);
  var details=UnisysSormNamesDetails(area,year,textData);
  details.reverse();
//alertArray(names);
//alertArray(details);
  var storms=[]; // name, active, details
  var storm;
  for (var i=0;i<names.length;i++) {
//alert(names[i]+'\n'+details[i]);
    storm=details[i];
//if (!confirm(i+'\n'+storm)) break;
    if (storm==null) continue;
    storm=storm.slice(0);
    storm[0]=names[i]; // name
    //storm[1]=false;    // active
//if (!confirm(i+'\n['+details[i][8]+']\n'+details[i][details[i].length-1]+'\n'+details[i])) break;
    storm[1]=((''+details[i][details[i].length-1]).toUpperCase()=='ACTIVE'); 
/*
    for (var j=0;j<details[i].length;j++) {
      storm[2+j]=details[i][j];
    };
*/
    storms.push(storm);
  };
//alertArray(storms);
  return storms;
};

function alertArray(a) {
  var txt='';
  for (var i=0;i<a.length;i++) {
    txt+=i+'. '+a[i]+'\n';
  };
  return confirm(txt);
};

var UnisysBeforeTable='Individual Storm Summary';
function UnisysSormNamesDetails (area,year,textDataIn) {
  var textData=textDataIn;
  if (textData==null) textData=UnisysStormNamesData(area,year);
  var storms=[], storm;
  var data=textData.split('\n');
  var nameFound, line, fromChar, toChar, name, active;
  var beforeTable=false;afterTable=false;inTable=false;
  var iS=0, lineDataText,lineData;
  for (var i=0;i<data.length;i++) {
     active=false;
     line=data[i]
     beforeTable=(beforeTable||(line.indexOf(UnisysBeforeTable)>=0));
     if (!beforeTable) continue;
//if (!confirm('before '+i+' '+beforeTable+'\n'+line)) break;
     inTable=(inTable||(line.indexOf('<table')>=0));
     if (!inTable) continue;
     if (line.indexOf('</tr>')>1) continue;
//if (!confirm('in '+i+'\n'+line)) break;
     afterTable=(line.indexOf('</table')>=0);
     if (afterTable) break; // leave
//if (!confirm('after '+i+'\n'+line)) break;
     //if (line.substring(0,7)=='<small>') continue; // first line: # Name Date Wind Pressure Category Status
     lineDataText=removeXMLtags(line,'\t');
     lineData=lineDataText.split('\t'); // # Name Date Wind Pressure Category Status
     if (lineData.length<5) continue;
//if (!confirm('['+lineData[3]+']\n'+i+'\n'+line)) break;
     if (lineData[3]=='#') continue;
     //if (lineData.length>1 && lineData[1]=='#') continue; // # Name Date Wind Pressure Category Status
//if (!confirm(lineData.length+'\n'+lineData)) break;
     //storms.push(lineData);   
     storm=['',false, lineData[2],lineData[4],lineData[6],lineData[8],lineData[10],lineData[12],lineData[14]];
//if (!confirm(line+'\n'+lineData.length+'='+lineData+'\n['+storm[8]+']')) break;
     storms.push(storm);
  };
//alert(storms);
  return storms;
};

function removeXMLtags(xmlText,replaceWith) {
  var replaceTagWith=replaceWith;
  if (replaceTagWith==null) replaceTagWith='';
  var text=xmlText.replace(/\<[^\>]+\>/g, replaceTagWith);
  return text;
};


function UnisysStormDataURL(area,year,storm) {
  var url='';
  url=UnisysURLbase+'/'+area+'/'+year+'/'+storm+'/'+UnisysStormTrack;
  return url;
};


function UnisysStormTextData(area,year,storm) {
  url=UnisysStormDataURL(area,year,storm);
  var textData=TEXTload(url);
  //alert('['+textData+']');
  return textData;
};

//var UnisysMonths=['no month','JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'];
var UnisysMonths=['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'];
function UnisysMonthIndex(monthName) {
  var month=-1;
  for (var i=0;i<UnisysMonths.length;i++) {
    if (monthName==UnisysMonths[i]) {
      month=i;
      break;
    };
  };
//alert(monthName+'\n'+month);
  return month;
};

// 28 JUL-1 AUG 1960
function UnisysDate(uDate,uDateBase) {
  if (uDate==null) return null;
  var d, m, y, baseDate=null;
//alert(uDate+'\n'+uDateBase);
  if (uDateBase!=null) baseDate=UnisysDate(uDateBase);
  var data=uDate.split(' ');
  d=data[0];
  if (data.length>1) {
    m=UnisysMonthIndex(data[1]);
   } else {
    if (baseDate!=null) {
      m=baseDate.getMonth();
     } else {
      m=0;
    };
  };
  if (data.length>2) {
    y=parseInt(data[2]);
   } else {
    if (baseDate!=null) {
      y=baseDate.getFullYear();
     } else {
      y=0;
    };
  };
  var date=new Date(y,m,d);
  return date;
};

// 07/28/18Z   
function UnisysDateTime(uDate,dateFrom) {
  var d, m, y, t;
//alert(uDate);
  var timeDateData=uDate.split('/');
//alert('['+timeDateData+']\n'+dateFrom+'\n'+dateTo);
  m=parseInt(timeDateData[0],10);
  d=parseInt(timeDateData[1],10);
  y=dateFrom.getFullYear();
  var mm=m;
  mm--;
  if (mm<dateFrom.getUTCMonth()) y++;
  var hour=timeDateData[2];
/*
  hour=hour.substring(0,hour.length-1);
  if (hour.substring(0,1)=='0') hour=hour.substr(1);
  //h=parseInt(timeDateData[2]);
  h=parseInt(hour);
*/
  h=parseInt(hour,10);
  //var date=new Date(y,mm,d,h,0,0);
  //-var date=new Date(y,mm,d,0,0,0);
  //var date=new Date(0,0,0,0,0,0);
  var date=new Date(y,mm,d,0,0,0);
  date.setUTCFullYear(y);
  date.setUTCMonth(mm);
  date.setUTCDate(d);
//alert(uDate+'\n'+timeDateData+'\n\n'+y+'\n'+m+' - '+mm+'\n'+d+'\n'+h+'\n\n'+date);
  date.setUTCHours(h);
//alert('Hours: '+uDate+'\n'+timeDateData+'\n\n'+y+'\n'+m+' - '+mm+'\n'+d+'\n'+h+'\n\n'+date);

  return date;
};

function UnisysPointArray (line,dateFrom) {
  var adv, lat, lon, dateTime, wind, pressure, status;
  var point=[]; 
  //var dataLine=line.substr(0,40);
/*
  var dataLine=line;
  for (var i=0;i<5;i++) {
    dataLine=dataLine.replace(/  /g,' ');
  };
*/
  var dataLine=removeDoubleBlanks(line);
  if (dataLine.substring(0,1)==' ') dataLine=dataLine.substr(1);
//alert(line+'\n'+dataLine);
  //var status=line.substr(40);
  var pointData=dataLine.split(' ');
  for (var i=0;i<6;i++) {
    point[i]=pointData[i];
  };
  var status='';
  for (var i=6;i<pointData.length;i++) {
    if (i>6) status+=' ';
    status+=pointData[i];
  };
  //point=dataLine.split(' ');
  point[point.length]=status;
  //pointDateTime=UnisysDateTime(point[3],dateFrom,dateTo);
  pointDateTime=UnisysDateTime(point[3],dateFrom);
  point[3]=pointDateTime;
  point[1]=parseFloat(point[1]);
  point[2]=parseFloat(point[2]);
  //-point[4]=parseFloat(point[4]);
  //-point[5]=parseFloat(point[5]);
  point[point.length]=UnisysStormType(status);
//window.status=('['+status+'] = '+point[point.length-1]);
  return point;
};


// StormData = [name, dateFrom, dateTo, "text", [[adv, lat, lon, dateTime, wind, pressure, status], ], textData];
function UnisysStormData(area,year,storm) {
  var data=['no storm',new Date(),new Date(),'',[],''];
  var textData=UnisysStormTextData(area,year,storm);
  data[5]=textData;
//alert(data);
  var lines=textData.split('\n');
  if (lines.length<=0) return data;
  var line=lines[0];
  var dataLine=line.split(': ');
  line=dataLine[1];
  dataLine=line.split('-');
  var d;
  if (lines.length<1) return data;
  d=dataLine[0];
  var dateFrom, dateTo;
//alert(dataLine[0]+'\n'+dataLine[1]);
  dateFrom=UnisysDate(dataLine[0],dataLine[1]); 
//alert(dateFrom);
  if (dataLine.length>1) {
    dateTo=UnisysDate(dataLine[1]); 
   } else {
    dateTo=dateFrom;
  };
//alert(dateTo);
  data[1]=dateFrom;
  data[2]=dateTo;
  if (lines.length<2) return data;
  line=lines[1];
  var toName=line.lastIndexOf(' ');
  //var name=line.substr(toName+1);
  var name=line;
  name+=' '+year;
  //data=[name,dateFrom,dateTo,'',[]];
  data[0]=name;
  var text=lines[1]+'\n'+lines[0];
  data[3]=text;
//alert(data);
  var points=[];
  var point; // adv, lat, lon, dateTime, wind, pressure, status, type
  var pointDateTime;
  var year=dateFrom.getFullYear();
  if (lines.length<4) return data;
  //var dataL, status;
  for (var i=3;i<lines.length;i++) {
    line=lines[i];
    if (line.length<1) continue;
    point=UnisysPointArray(line,dateFrom);
    points[points.length]=point;
  };
  data[4]=points;
//alert(data);
  return data;
};

function UnisysStormDecodedDataText(stormData) {
  var text='';
  var name, dateFrom, dateTo, text, points, textData;
  name=stormData[0];
  dateFrom=stormData[1];
  dateTo=stormData[2];
  textStorm=stormData[3];
  points=stormData[4];
  textData=stormData[5];
  text+='Storm: \t'+name;
  text+='\n from: \t'+dateFrom;
  text+='\n to: \t'+dateTo;
  text+='\n';
  text+='\n text:';
  text+='\n'+textStorm;
  text+='\n';
  text+='\n points:';
  text+='\n n \t Adv \t Lat \t Lon \t \t dateTime \t Wind \t Pr \t Status \t Type';
  var point;
  for (var i=0;i<points.length;i++) {
    point=points[i];
    text+='\n';
    text+=(i+1)+'.\t';
    for (var j=0;j<point.length;j++) {
      text+=point[j]+'\t';
    };
  };
  text+='\n';
  text+='\n -- text data --';
  text+='\n'+textData;
  return text;
};

function UnisysStormDecodedDataHTML(stormData, noText) {
  var text='';
  var name, dateFrom, dateTo, text, points, textData;
  name=stormData[0];
  dateFrom=stormData[1];
  dateTo=stormData[2];
  textStorm=stormData[3];
  points=stormData[4];
  textData=stormData[5];
  text+='<table 0border="1">';
  text+='<tr><td>';
  text+='Storm: </td><td><b>'+name;
  text+='</td></tr>';
  text+='<tr><td>';
  text+='from: </td><td>'+StormDateString(dateFrom)+' '+StormDateDayOfWeek(dateFrom);
  text+='</td></tr>';
  text+='<tr><td>';
  text+='to: </td><td>'+StormDateString(dateTo)+' '+StormDateDayOfWeek(dateTo);
  text+='</td></tr>';
  text+='</table>';
  //text+='<br/>';
/*
  text+='\n text:';
  text+='\n'+textStorm;
  text+='\n';
*/
  //text+='\n points:';
  text+='<table 0border="1" 0width="100%">';
  text+='<tr>';
  //text+='<th> n </th><th> Adv </th><th> Lat </th><th> Lon </th><th> dateTime </th><th> Wind </th><th> Pr </th><th> Status </th><th> Type </th>';
  //text+='<th> n </th><th> Adv </th><th> Lat </th><th> Lon </th><th colspan="3"> Date Time </th><th> Wind kt </th><th> Pr mB </th><th> Status </th><th> Type </th>';
  text+='<th> n &nbsp;&nbsp;&nbsp;</th><th> Adv &nbsp;&nbsp;&nbsp;</th><th> Lat &nbsp;&nbsp;&nbsp;</th><th> Lon &nbsp;&nbsp;&nbsp;</th><th colspan="3"> Date Time </th><th> Wind kt </th><th> Pr mB </th><th> Status </th><th> Type </th>';
  text+='</tr>';
  var point;
  for (var i=0;i<points.length;i++) {
    point=points[i];
    text+='<tr>';
    text+='<td align="right">';
    text+=(i+1)+'.';
    text+='</td>';
/*
    for (var j=0;j<point.length;j++) {
      text+='<td>';
      text+=point[j];
      text+='</td>';
    };
*/
    //var j=0;
    //text+='<td>'+point[0]+'</td>'; // xxx
    //text+='<td>'+point[j++]+'</td>'; // xxx
    text+='<td 0align="right">['+point[0]+']</td>'; // adv
    text+='<td>'+point[1]+'</td>'; // lat
    text+='<td>'+point[2]+'</td>'; // lon
    text+='<td>'+StormDateDayOfWeek(point[3])+'</td><td>'+StormDateString(point[3])+'</td><td align="right">'+StormTimeString(point[3])+'</td>'; // date time
    text+='<td align="right">'+point[4]+'</td>'; // wind
    text+='<td align="right">'+point[5]+'</td>'; // pressure
    text+='<td>'+point[6]+'</td>'; // status
    text+='<td>'+point[7]+'</td>'; // type
    text+='</tr>';
  };
  text+='</table>';
  if (noText==null) {
   text+='<br/>';
   text+='<table 0border="1">';
   text+='<tr><th aling="left">';
   text+='-- text data --';
   text+='</th></tr>';
   text+='<tr>';
   text+='<td>';
   text+='<pre>';
   text+=textData;
   text+='</pre>';
   text+='</td>';
   text+='</tr>';
   text+='</table>';
  };
  return text;
};




var UnisysStormStatuses=['SUBTROPICAL DEPRESSION','SUBTROPICAL STORM','EXTRATROPICAL DEPRESSION','EXTRATROPICAL STORM','EXTRATROPICAL STORM-1', 'TROPICAL DEPRESSION', 'TROPICAL STORM', 'HURRICANE-1', 'HURRICANE-2', 'HURRICANE-3', 'HURRICANE-4', 'HURRICANE-5','TYPHOON-1','TYPHOON-2','TYPHOON-3','TYPHOON-4','TYPHOON-5'];
var UnisysStormStatysesTypes=['SD', 'ST','ED','ES','E1', 'TD', 'TS', 'H1', 'H2', 'H3', 'H4', 'H5','T1','T2','T3','T4','T5'];

function UnisysStormType (stormStatus) {
  var stormType='--';
  for (var i=0;i<UnisysStormStatuses.length;i++) {
    if (stormStatus==UnisysStormStatuses[i]) {
      stormType=UnisysStormStatysesTypes[i];
      break;
    }; 
  };
  return stormType;
};

function UnisysStormData2TripData (stormData) {
  var trip, locations, connections;
  var text
};

//--- 

function removeDoubleBlanks(str) {
  var before=str;
  var after=null, tmp;
  while (before!=after) {
    //tmp=after;
    before=before.replace(/  /g,' ');
    after=before.replace(/  /g,' ');
    //if (tmp!=null) before=tmp;
  };
//alert(str+'\n'+after)
  return after;
};

function trimblanks(str) { 
 return str.split(/\s/).join(' '); 
};

function StormDateString(d) {
  var str=(d.getMonth()+1)+'/'+d.getDate()+'/'+d.getFullYear();
  return str;
};
function StormTimeString(d) {
  var str=d.getHours()+':00';
  return str;
};
var StormDaysNames=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Sauturday'];
function StormDateDayOfWeek(d) {
  var dowN=d.getDay();
  var dayOfWeek=StormDaysNames[dowN];
  return dayOfWeek;
};

//--- Trip

var TripXMLdocument=null;
function OpenStormData2Trip (stormData) {
  var trip=StormData2Trip(stormData);
  window.open(ShowXMLtripURL);
};

function StormData2Trip (stormData) {
  var trip=StormData2Trip(stormData);
  TripXMLdocument=trip;
  return trip;
};



function StormData2Trip (stormData) {
  //var trip=null, locations=[], connections=[], description='', data,tmp;
  //var arrays=StormData2TripArrays(stormData);
  var trip=StormData2TripXML(stormData)
  return trip;
};

function StormData2TripXMLtext(stormData) {
  var arrays=StormData2TripArrays(stormData);
  var trip=arrays[0];
  var locations=arrays[1];
  var connections=arrays[2];
  var areas=[];
  TripData=trip;
  //Locations=locations;
  TLocations=locations;
  Connections=connections;
  Areas=areas;
//alert(Connections[0]);
  var tripXMLtext=Trip2XMLtext();
  return tripXMLtext;
};


function StormData2TripXML(stormData) {
  var xmlText=StormData2TripXMLtext(stormData);
  var xmlTrip=String2XML(xmlText);
  return xmlTrip;
};

function StormPoint2Location(stormPoint,ix,stormName) {
  var location=[];
  var id,name,address,tel,lon,lat,desc,url, dateStart, timeStart, dateEnd, timeEnd, image, pushpinImage;
    // Locations[Locations.length]=["id","name","address","tel",longitude,latitude, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 12a", "detailsURL", dateStart, timeStart, dateEnd, timeEnd, image, pushpinImage ];	
    // Locations[Locations.length]=["id","name","address","tel",longitude,latitude, "<a href='http://www.NicolaZordan.net' target='_blank'>www.NicolaZordan.net</a> 12a", "detailsURL", dateStart, timeStart, dateEnd, timeEnd, imageUrl ];	
  id=ix;
  //name=stormPoint[0]+' '+stormName+' '+StormDateString(stormPoint[3])+' '+StormTimeString(stormPoint[3]);
  //name='['+stormPoint[0]+'] '+StormDateString(stormPoint[3])+' '+StormTimeString(stormPoint[3]);
  name='['+stormPoint[0]+'] ';
  name+='\n'+stormPoint[6];
  //address='@'+stormPoint[1]+','+stormPoint[2];
  address='';
  tel='';
  lon=stormPoint[2];
  lat=stormPoint[1];
  desc='';
  desc+='\n'+'<b>'+stormName+'</b>';
  desc+='\n'+'Status: '+stormPoint[6];
  //desc+='\n'+stormName;
  desc+='\n['+stormPoint[0]+']';
  desc+=' '+StormDateString(stormPoint[3])+' '+StormTimeString(stormPoint[3]);
  desc+='\n'+'Wind '+stormPoint[4]+' knots';
  desc+='\n'+'Pressure '+stormPoint[5]+' mB';
  url='';
  dateStart=StormDateString(stormPoint[3]);
  timeStart=StormTimeString(stormPoint[3]);
  dateEnd='';
  timeEnd='';
  image='';
  pushpinImage='';
  if (stormPoint[0].substring(0,1)=='+')
    pushpinImage='marker-Future.png';
  dateEnd  =''; 
  timeEnd  =''; 
  location=[id,name,address,tel,lon,lat,desc,url, dateStart, timeStart, dateEnd, timeEnd, image, pushpinImage];
//alert(location);
  return location;
};

function StormData2TripData (stormData) {
  var tripData=[];
  var name, text, url, imageURL, dateStart, timeStart, dateEnd, timeEnd, tel;
    // TripData=[ name, text, (url), (imageURL), (dateStart), (timeStart), (dateEnd), (timeEnd), tel ];
  name=stormData[0];
  text=stormData[5]+'\n\n';
  url='';
  imageURL='';
  dateStart=StormDateString(stormData[1]);
  timeStart=StormTimeString(stormData[1]);
  dateEnd=StormDateString(stormData[2]);
  timeEnd=StormTimeString(stormData[2]);;
  tel='';

  tripData=[name, text, url, imageURL, dateStart, timeStart, dateEnd, timeEnd, tel];
//alert(tripData);
  return tripData;
};


function StormData2TripArrays(stormData) {
  var locations=[], connections=[], trip=[], itPre=null, c;
  var stormName=stormData[0];
  var stormPoints=stormData[4];
  for (var i=0;i<stormPoints.length;i++) {
    locations[locations.length]=StormPoint2Location(stormPoints[i],i+1, stormName);
  };
  trip=StormData2TripData(stormData);
  var r=[trip, locations, connections];
  return r;
};

