//
// added support for flickrgrps
// fixed bug with picasa thumbnail extract
// added forceUp Parameter to force largersize photos
//
var gbIO;
function bIO(baseCBs,iSize,tSize){
//only designed to have one instance
if (gbIO == undefined)
gbIO = this;
this.baseCB = baseCBs;
// default sizes to search .. specific results are stored this.fl_tSize;
this.iSize = iSize || 400;
this.tSize = tSize || 70;
this.forceUp = true;
this.picSizes = [32,48,64,72,144,160,200,288,320,400,512,576,640,720,800];
this.flickSizes = [100,240,500,1024];
this.flickString = ["_t","_m","","_b"];
// value is used to map to rssout
this.blurbKeys = {"s_key":undefined,"s_llz":"georss:point>","s_date":"pubDate>","s_label":"title>","s_lUrl":"link>","s_text":"description>","s_iUrl":undefined,"s_addline":undefined,"s_lla":undefined};
this.argList = ["blogger","bloggerid","picasa","picall","picfeat","picalbums","flickr","flickrgeo","flickrgrp","flickrggeo","flickrfriends","flickrfavs","winlink","xfile","file","gfeed","jblurbs","gss"];
this.months = {"01":"Jan","02":"Feb","03":"Mar","04":"Apr","05":"May","06":"Jun","07":"Jul","08":"Aug","09":"Sep","10":"Oct","11":"Nov","12":"Dec"};
this.revmon = {"Jan":"01","Feb":"02","Mar":"03","Apr":"04","May":"05","Jun":"06","Jul":"07","Aug":"08","Sep":"09","Oct":"10","Nov":"11","Dec":"12"};
// 2DO add zoom and staticMarker to Types
this.blurbTypes={"?":{key: "?", iUrl: "def:images/bline.png", header: "", label: "Unknown:"},
"V":{key: "V", iUrl: "def:images/bvideo.png", header: "See Video: ", label: "Video:"},
"J":{key: "J", iUrl: "def:images/bjournal.png", header: "See Journal: ", label: "Journal:"},
"B":{key: "B", iUrl: "def:images/bblog.png", header: "See Blog: ", label: "Blog:"},
"A":{key: "A", iUrl: "def:images/bpalbum.png", header: "See Photos: ", label: "Album:"},
"P":{key: "P", iUrl: "def:images/bline.png", header: "View Photo: ", label: "Photo:"},
"R":{key: "R", iUrl: "def:images/bposition.png", header: "Location: ", label: "Location:"},
"X":{key: "X", iUrl: "def:images/bline.png", header: "", label: "Point:"},
"K":{key: "K", iUrl: "def:images/bline.png", header: "KML File:", label: "KML file:"},
"T":{key: "T", iUrl: "def:images/bline.png", header: "Trip:", label: "Trip:"},
"L":{key: "L", iUrl: "def:images/bline.png", header: "Travel Route:", label: "Route:"},
"L+":{key: "L+", iUrl: "def:images/bline.png", header: "Travel Route:", label: "Route:"},
"L-":{key: "L-", iUrl: "def:images/bline.png", header: "Travel Route:", label: "Route:"}};
this.defaults = {ipage:undefined,usertitle:undefined,usersummary:undefined,userlinks:undefined,userbody:undefined,
useImg:true,
defSize:24,
defSImg:32,
image:"images/bposition.png",
skipExtra:{"K":1,"X":1,"T":1,"L":1,"L+":1,"L-":1},
skipOL:{"X":1},
skipTPoly:{"L-":1,"L+":1},
zoomType:"overview",
mapType:"hybrid",
mapStyle:"markers",
poly:"red,2,1",
ll:undefined,
zoom:8,
time:"2000-01-01 12:00",
type:"R"};
this.prec = 5;
this.bArgs = ["TYPE","LLZ","DATE","LABEL","URL","DESC","IMAGE","TRIP","EXTRA","LINEPTS","BLURBBIT"];
this.bArgMap = {"TYPE":"s_key","LLZ":"s_llz","DATE":"s_date","LABEL":"s_label","URL":"s_lUrl","DESC":"s_text","IMAGE":"s_iUrl","TRIP":"s_addline","EXURL":"s_eUrl","SSURL":"s_sUrl","EXTRA":"s_extra","LINEPTS":"s_linePts","LAT":"s_lat","LNG":"s_lng","ZOOM":"s_zoom","PHOTO":"s_image","BLURBBIT":"s_blurbbit","ICAPTION":"s_caption"};
this.bUT = {"key":"?","iUrl":undefined,"header":"","label":"unknown","size":"-defsize-"};
this.gUserUrlList=[];
this.debug="";
this.MAXIMUM_WAITING_TIME=30000;
this.working = false;
this.commands = [];
// store map props
// the map..
// map bounds for markers
//
}
bIO.prototype.init = function (options){
this.zacMode = 0;
this.error = undefined;
this.loaded = false;
this.pBlurbs=null;
this.pBlurbs=[];
this.pBlurbsCnt=0;
this.bBlurbs=null;
this.bBlurbs=[];
this.bBlurbsCnt=0;
this.opts = {
iSize : this.iSize,
tSize : this.tSize,
fUrl : undefined,
fType : "unknown",
fNum : undefined,
dStop : undefined,
cbInit : undefined,
cbLoad : undefined,
bsort : undefined,
xrev : true,
picType: "photo",
sepImg : false
};
if (options) {
for (o in this.opts) {
if (typeof options[o] != "undefined") {
this.opts[o] = options[o];
}
}
}
}
bIO.prototype.clearJSONTimer = function (){
clearTimeout(this.JSONTimer);
}
bIO.prototype.setJSONTimer = function (){
var that=this;
this.JSONTimer = setTimeout(function() {
that.error = "Timeout exceeded waiting for remote data.. Aborting!!\nCheck your request or try again later\n"+that.opts.fUrl;
that.loaded = false;
if (that.opts.cbLoad)
that.opts.cbLoad(that);
that.done();
}, this.MAXIMUM_WAITING_TIME);
}
bIO.prototype.load = function (options){
// 2DO build stack based system for handling multiple requests
// release must be called after resulting data is copied elsewhere is ready for next load
if (options){
if (options.fType != undefined && this.baseCB[options.fType] != undefined){
for (f in this.baseCB[options.fType]){
if (typeof options[f] == "undefined"){
options[f] = this.baseCB[options.fType][f];
}
}
}
if (this.baseCB["default"] != undefined){
for (f in this.baseCB["default"]){
if (typeof options[f] == "undefined")
options[f] = this.baseCB["default"][f];
}
}
}
this.init(options);
this.loaded = false;
this.working = true;
this.hasPhoto = false;
if (this.opts.fUrl == undefined)
return;
if (this.opts.fType == "blogger")
this.getBloggerJSON(this.opts.fUrl);
else if (this.opts.fType == "gfeed")
this.initFeed(this.opts.fUrl);
else if (this.opts.fType == "xfile")
this.getXFile(this.opts.fUrl);
else if (this.opts.fType == "file")
this.getFile(this.opts.fUrl);
else if (this.opts.fType == "picasa"){
if (this.opts.fUrl.indexOf("kind=album") > -1)
this.opts.picType = "album";
this.getPicasaJSON(this.opts.fUrl);
}else if (this.opts.fType == "flickr")
this.getFlickrJSON(this.opts.fUrl);
else if (this.opts.fType == "jblurbs")
this.getBlurbJSON(this.opts.fUrl);
else if (this.opts.fType == "jsonstr")
this.procBlurbJSON(this.opts.fUrl);
else if (this.opts.fType == "gss")
this.getGSSJSON(this.opts.fUrl);
else
alert("unknown type <" + this.opts.fUrl + ">");
}
bIO.prototype.getBlurbs = function(){
if (this.bBlurbs.length > 0)
return this.bBlurbs;
else if (this.pBlurbs.length > 0)
return this.pBlurbs;
return undefined;
}
bIO.prototype.done = function(){
this.working = false;
//Called by all callbacks after passing args to external function
}
// 2DO need method to store control stack strings and globals
// to save to JSON and File
bIO.prototype.cmdCopyOut = function(){
this.cbDoneCmd = this.opts.cbLoad;
//this.wbBlurbs = this.copyBlurbs("base");
//this.wpBlurbs = this.copyBlurbs("photo");
this.wbBlurbs = this.bBlurbs;
this.wpBlurbs = this.pBlurbs;
this.cmdfNum = this.opts.fNum;
this.cmdErrors = this.error;
this.cmdSort = undefined;
this.cmdOut = true;
this.cmdfType = this.opts.fType;
}
bIO.prototype.cmdCopyBack = function(){
if (this.cmdOut){
// 2do what about errors in subs .. contine (issue warning)
this.error = this.cmdErrors;
this.opts.cbLoad = this.cbDoneCmd;
this.cbDoneCmd = undefined;
this.bBlurbs = this.wbBlurbs;
this.pBlurbs = this.wpBlurbs;
this.cmdOut = undefined;
this.opts.fType = this.cmdfType;
}
}
bIO.prototype.cmdAddError=function(error){
if (error != undefined){
if (this.cmdErrors == undefined)
this.cmdErrors = error;
else
this.cmdErrors += "\n" + error;
}
}
bIO.prototype.finished = function(arg){
if (this.commands.length > 0){
// if you have commands and it is you first time here
// we need to copy out the original data and callback
// and start the command loop
if (this.cmdOut == undefined){
this.cmdCopyOut();
this.processCmds();
// each command loop will have a callback function
}else if (this.opts.cbLoad)
this.opts.cbLoad(this);
}else{
// you maybe finalizing your command loop as well here
if (this.opts.bsort != undefined){
this.cmdSort = this.opts.bsort;
if (this.bBlurbs != undefined && this.bBlurbs.length > 2){
this.bBlurbs.sort(gbIOsortByDate);
}
if (this.pBlurbs != undefined && this.pBlurbs.length > 2){
this.pBlurbs.sort(gbIOsortByDate);
}
}
this.loaded = true;
if (this.opts.cbLoad)
this.opts.cbLoad(this);
this.done();
}
}
bIO.prototype.release = function(){
this.pBlurbs=null;
this.bBlurbs=null;
this.done();
}
bIO.prototype.copyBlurbs = function(which){
var ret;
var todo
if (which == "base") todo = this.bBlurbs;
else if (which == "photo") todo = this.pBlurbs;
if (todo != undefined){
if (todo != undefined && todo.length > 0){
ret = todo.slice();
delete todo;
}
}
return ret;
}
bIO.prototype.bind = function(method) {
var self = this;
var opt_args = [].slice.call(arguments, 1);
return function() {
var args = opt_args.concat([].slice.call(arguments));
return method.apply(self, args);
}
}
function blurb(key){
if (key == undefined){
if (gbIO != undefined && gbIO.defaults.type != undefined)
key = gbIO.defaults.type;
else
key = "U";
}
this.s_key = key;
this.s_llz = undefined;
this.s_date = undefined;
this.s_label = undefined;
this.s_lUrl = undefined;
this.s_text = undefined;
this.s_iUrl = undefined;
this.s_addline = undefined; // undefined means use global.. 1 mean track 0 means skip
this.image=undefined;
this.item=undefined;
this.entry=undefined;
}
blurb.prototype.setDate=function(){
if (this.s_date != undefined)
this.date = gbIO.getUTCms(this.s_date)
if (isNaN(this.date) || this.date == undefined)
this.date = 949363200000; // 2000-01-01
}
blurb.prototype.getLLStr=function(){
// need to check editted flags and return changed values
var llza;
var lat;
var lng;
if (this.sll == undefined){
if (this.s_llz != undefined){
llza = this.s_llz.split(",");
}else if (this.s_lat != undefined && this.s_lng != undefined){
lat = this.s_lat;
lng = this.s_lng;
}else if (this.s_ll != undefined){
llza = this.s_ll.split(",");
}
if (llza != undefined && llza.length > 0){
lat = llza[0];
if (llza.length > 1)
lng = llza[1];
if (llza.length > 2){
this.zoom = isNaN(tmp = parseInt(llza[2]))? undefined: tmp;
this._zoomFrom = "s_llz";
}
}
// if both are set also get the zoom
if (lat != undefined && lng != undefined){
this.sll = lat + "," + lng;
this.getZoom();
}
}
return this.sll;
}
blurb.prototype.getLL=function(){
// get from s_llz, s_ll, s_lat, s_lng, s_zoom
// get zoom from above or key or default
if (this._setll == undefined){
if (this.sll == undefined)
this.getLLStr();
if (this.sll != undefined){
var lla = this.sll.split(",");
var lat = isNaN(tmp = parseFloat(lla[0]))? undefined: tmp;
var lng = isNaN(tmp = parseFloat(lla[1]))? undefined: tmp;
if (lat != undefined && lng != undefined)
this.ll = [lat,lng];
}
this._setll=true;
}
return this.ll;
}
blurb.prototype.getZoom=function(){
if (this.zoom == undefined){
// if not set from llz string try s_zoom
if (this.s_zoom != undefined){
this.zoom = parseInt(this.s_zoom);
this._zoomFrom = "s_zoom";
}
// or from type or finally defaults
if (this.zoom == undefined || isNaN(this.zoom)){
var bType = gbIO.getBlurbType(this.s_key);
if (bType != undefined)
this.zoom = bType.zoom;
if (this.zoom == undefined)
this.zoom = gbIO.defaults.zoom;
}
}
return this.zoom;
}
blurb.prototype.skipOL=function(){
if (gbIO.defaults.skipOL[this.s_key] != undefined)
return true;
else
return false;
}
blurb.prototype.skipExtra= function(){
if (gbIO.defaults.skipExtra[this.s_key] != undefined)
return true;
else
return false;
}
blurb.prototype.skipPoly= function(){
if (gbIO.defaults.mapStyle == "travel" && gbIO.defaults.skipTPoly[this.s_key] != undefined)
return true;
else
return false;
}
blurb.prototype.definedZoom=function(){
return (this._zoomFrom != undefined)?true:false;
}
blurb.prototype.lat=function(){
if (this._setll == undefined)
this.getLL();
if (this.ll != undefined)
return this.ll[0];
else
return undefined;
}
blurb.prototype.lng=function(){
if (this._setll == undefined)
this.getLL();
if (this.ll != undefined)
return this.ll[1];
else
return undefined;
}
// add configuration for which img blurbimg
// also allow to skip images
// use loop
bIO.prototype.contentGetImgStr = function (content){
// faster than regExp
var iIndex;
if ((iIndex = content.indexOf("
-1){
//prune it at the end
var eIndex = content.indexOf(">",iIndex+4);
var img = content.substring(iIndex+4,eIndex);
iIndex = img.indexOf("src")+4;
tVal = "\""
tIndex = img.indexOf(tVal,iIndex);
if (tIndex == -1){
tVal = "\'"
tIndex = img.indexOf(tVal,iIndex);
}
iIndex = tIndex;
tIndex = img.indexOf(tVal,tIndex+1)
var src = img.substring(iIndex+1,tIndex);
if (src != undefined)
return src;
else
return "";
}
return "";
}
bIO.prototype.cleanStr = function(str){
str = str.replace(/\\n/gi," ")
return str;
}
bIO.prototype.stripTags = function(text,clbr){
if (clbr)
text=text.replace(/
/gi," ");
text = text.replace(/[\n\r\f\t]/gi," ");
return text.replace(/<\/?[^>]+>/gi, '');
}
// 2DO strip tags for JSON?? .replace(/\\n/gi," ");
bIO.prototype.getLLZ = function(iChk,content){
var ret = undefined;
var tmp;
var llza = unescape(content.substr(iChk+4,40)).split(",");
if (llza[0] != undefined && llza[0].length > 0 &&
llza[1] != undefined && llza[1].length > 0){
ret = parseFloat(llza[0]) + "," + parseFloat(llza[1]); //.split("&")[0]
}
if (llza[2] != undefined && llza[2].length > 0){
zoom = parseInt(llza[2].split("&")[0]);
if (!isNaN(zoom))
ret += "," + zoom;
}
return(ret);
}
bIO.prototype.getLL = function(iChk,content){
// find indexOf(/' or "/
var ll,ret,z;
var args = unescape(content.substr(iChk,250)).replace(/&/g,"&").split("&");
for (var a=0; a< args.length; a++){
if (args[a].indexOf("ll=")==0){
ll=args[a].substr(3);
}else if (args[a].indexOf("z=")==0){
z = args[a].substr(2);
}
if (args[a].indexOf('"') != -1 || args[a].indexOf("'") != -1)
break;
}
if (ll != undefined){
ret = ll;
if (z != undefined)
ret +="," + z;
}
return(ret);
}
bIO.prototype.updateImgLinks = function(pblurbObj){
var tUrl = this.findImgSize(pblurbObj.s_iUrl,1);
if (tUrl != undefined)
pblurbObj.s_iUrl = tUrl;
var tUrl = this.findThumb(pblurbObj.s_iUrl);
if (tUrl != undefined){
pblurbObj.s_tUrl = tUrl;
pblurbObj.s_sFactor = this.tmp_sFactor
}
}
bIO.prototype.extPhotos = function(blurbs){
if (blurbs == this.pBlurbs)
return;
for (var i = 0; i < blurbs.length; i++){
var blurbObj = blurbs[i];
if (blurbObj.s_iUrl != undefined){
var iula = blurbObj.s_iUrl.split(",")
blurbObj.s_iUrl = iula[0];
if (iula.length > 1 && iula[1].length > 0){
blurbObj.s_text = blurbObj.s_label + "
" + blurbObj.s_text;
blurbObj.s_label = iula[1];
}
this.pBlurbsCnt = this.pBlurbs.push(blurbObj);
this.updateImgLinks(blurbObj);
if (blurbObj.s_llz != undefined)
this.geoPhoto = true;
}
}
}
var crap;
bIO.prototype.loadBloggerJSON = function(json){
this.clearJSONTimer();
if ((json.error != undefined) && (json.error)){
this.error = "Blogger Load failed.." + json.error.message;
}else if (json.feed == undefined || json.feed.entry == undefined){
this.error = "Blogger Load Nothing Found";
}else{
this.geoPhoto = false;
for (var i = 0; i < json.feed.entry.length ; i++) {
var entry = json.feed.entry[i];
var content;
if (entry.content != undefined){
content = entry.content.$t;
var dIndex = content.indexOf("blogger-post-footer");
if (dIndex > 0)
content = content.substring(0,dIndex-12);
}
else if (entry.summary != undefined)
content = entry.summary.$t;
else
continue;
var s_date = undefined;
if (entry.published != undefined){
s_date = this.getUserDate(entry.published.$t,1);
//if (this.opts.dStop != undefined && this.tmp_Date < this.opts.dStop){
// break;
//}
}
var llz = undefined;
// update to handle other lat/long types
if ((iChk = content.indexOf("llz="))> -1){
llz = this.getLLZ(iChk,content);
}
if (llz == undefined && entry.georss$point != undefined && entry.georss$point.$t != undefined){
var lla=entry.georss$point.$t.split(" ");
llz = parseFloat(lla[0]).toFixed(this.prec) + "," + parseFloat(lla[1]).toFixed(this.prec) ;
}
if (llz == undefined && (iChk = content.search(/[\s\u003e;(]\d+[\d\.]*[\s'\u00b0\u00ba]?[\d\."'\s]*[NS]+[\s\/\,]*\d+[\d\.]*[\s\u00b0'\u00ba]?[\d\."'\s]*[EW]+/)) > -1){
llz = this.getLatLng(iChk,content);
}
pblurbObj = undefined;
var feedImg = this.contentGetImgStr(content);
if (this.opts.sepImg && feedImg.length > 0){
pblurbObj = new blurb("B");
pblurbObj.s_iUrl = feedImg;
this.updateImgLinks(pblurbObj);
if (0){
var tUrl = this.findImgSize(feedImg,1);
if (tUrl != undefined)
pblurbObj.s_iUrl = tUrl;
var tUrl = this.findThumb(pblurbObj.s_iUrl);
if (tUrl != undefined){
pblurbObj.s_tUrl = tUrl;
pblurbObj.s_sFactor = this.tmp_sFactor
}
}
pblurbObj.image=undefined;
this.hasPhoto = true;
}
var blurbObj = new blurb();
blurbObj.s_key = "B";
if (s_date != undefined){
blurbObj.s_date = s_date;
// blurbObj.o_date = entry.published.$t + " " + (new Date(parseInt(this.tmp_Date))).toUTCString()
blurbObj.date = this.tmp_Date;
}
if ((entry.title != undefined) && (entry.title.$t.length > 1))
blurbObj.s_label = entry.title.$t;
else if (blurbObj.s_date != undefined)
blurbObj.s_label = blurbObj.s_date.split(" ")[0] + " Untitled";
else
blurbObj.s_label = "Untitled";
if (feedImg.length > 0)
blurbObj.s_iUrl = feedImg;
if (content.length > 2){
blurbObj.s_text = this.stripTags(content,1);
if (blurbObj.s_text.length > 450)
blurbObj.s_text = blurbObj.s_text.substr(0,450) + "...";
}
var alturl;
for (var k = 0; k < entry.link.length; ++k) {
if (entry.link[k].rel == "alternate") {
alturl = entry.link[k].href;
break;
}
}
if ((alturl != undefined) && (alturl.length > 0))
blurbObj.s_lUrl = alturl;
if (llz != undefined && llz.length > 3){
blurbObj.s_llz = llz;
}
blurbObj.entry = entry;
this.bBlurbsCnt = this.bBlurbs.push(blurbObj);
if (pblurbObj != undefined){
pblurbObj.s_label = blurbObj.s_label;
if (blurbObj.s_llz != undefined){
this.geoPhoto = true;
pblurbObj.s_llz = blurbObj.s_llz;
//pblurbObj.s_ll = blurbObj.s_llz;
}
pblurbObj.s_lUrl = blurbObj.s_lUrl;
pblurbObj.s_date = blurbObj.s_date;
pblurbObj.date = blurbObj.date;
pblurbObj.s_text = blurbObj.s_text;
this.pBlurbsCnt = this.pBlurbs.push(pblurbObj);
}
}
}
this.finished();
}
bIO.prototype.getBloggerJSON = function (bloggerUrl){
if (this.opts.cbInit)
this.opts.cbInit();
// Retrieve the JSON feed.
var script = document.createElement('script');
script.setAttribute('src', bloggerUrl +
'&alt=json-in-script&callback=gbIO.loadBloggerJSON');
script.setAttribute('id', 'jsonBloggerScript');
script.setAttribute('type', 'text/javascript');
document.documentElement.firstChild.appendChild(script);
this.setJSONTimer();
}
bIO.prototype.procBlurbJSON = function(json){
this.clearJSONTimer();
if (json.blurbs != undefined){
for (var i = 0; i < json.blurbs.length; i++){
var jblurbObj = json.blurbs[i];
var blurbObj = new blurb();
var p;
for (p in jblurbObj){
blurbObj[p] = jblurbObj[p];
}
this.bBlurbsCnt = this.bBlurbs.push(blurbObj);
}
//this.bBlurbs = json.blurbs;
//this.bBlurbsCnt = json.blurbs.length;
}else{
alert("NOTHING");
}
this.finished();
}
bIO.prototype.getBlurbJSON = function (Url){
if (this.opts.cbInit)
this.opts.cbInit();
// Retrieve the JSON feed.
var script = document.createElement('script');
script.setAttribute('src', Url);
script.setAttribute('id', 'jsonBlurbScript');
script.setAttribute('type', 'text/javascript');
document.documentElement.firstChild.appendChild(script);
this.setJSONTimer();
}
bIO.prototype.initFeed = function(){
if (typeof(google) == "undefined" || typeof(google.load) == "undefined"){
initLoader();
}else if (google.feeds == undefined){
google.load("feeds", "1", {"callback" : this.bind(this.getFeed)});
//alert("This option is not currently supported in this utility");
}else
this.getFeed();
}
bIO.prototype.getFeed = function (){
if (this.opts.fUrl == undefined)
return;
this.feed = new google.feeds.Feed(this.opts.fUrl);
if (this.opts.fNum != undefined)
this.feed.setNumEntries(this.opts.fNum);
else
this.feed.setNumEntries(100);
this.feed.setResultFormat(google.feeds.Feed.MIXED_FORMAT);
this.feed.load(this.bind(this.loadFeed));
}
bIO.prototype.strToPos = function(posStr){
// accepts [+-]dd.dd or dd.dd[N|S]
// [+-]dd mm.mm or dd mm.mm [N|S]
// also accepts +- (must be part of dd)
// or NS EW can have leading or following spaces
var upStr = posStr.toUpperCase();
var dma = posStr.split(" ");
if (dma.length > 1){
// handle minutes
min = parseFloat(dma[1]);
// handles bad minutes or extra characters
if (isNaN(min))
min = 0.0;
// add to degrees
pos = parseFloat(dma[0]) + min/60;
// resolve to accuracy of minutes could be minutes - 1 if .
pos = pos.toFixed(dma[1].length)
}else if (dma.length > 0){
// just degrees
pos = parseFloat(dma[0]);
}else
// just degrees
pos = parseFloat(dma);
if (upStr.indexOf("S") > 0 || upStr.indexOf("W") > 0)
pos = 0-pos;
return(pos);
}
bIO.prototype.extLatLng = function (content){
// check for blurbbits.html? extract parameters
// check for geo >[-]n.nn;[-]n.nn< or "[-]n.nn;[-]n.nn"
// extract from text
}
bIO.prototype.getLatLng = function (iChk,content){
var llstr = content.substr(iChk,40).replace(/[\"\'\/\,\u00b0\u00ba(-]/g,' ').toUpperCase();
llstr = llstr.replace(/\s+/g," ");
//if (llstr.indexOf(" ") == 0 || llstr.indexOf("\u003e") == 0 || llstr.indexOf(";") == 0)
var c0 = llstr.charAt(0);
if (c0 == " " || c0 == "\u003e" || c0 == ";")
llstr = llstr.substring(1);
var lat = "0.0";
var lng = "0.0";
var iEnd = llstr.search(/[NS]/);
if (iEnd > 0){
// split it at NS
lat = llstr.substr(0,iEnd+1);
lng = llstr.substring(iEnd+1);
// try and cleanup lng (strip leading spaces and finish at [EW]
iStart = lng.search(/\d/);
iEnd = lng.search(/[EW]/);
if (iEnd > 0)
lng = lng.substr(iStart,iEnd+1);
}
return (this.strToPos(lat) + "," + this.strToPos(lng));
}
// convert a Blurb date to ms
// used for sorting and comparision .. set to defaults
bIO.prototype.getUTCms = function(sDate){
if (sDate == undefined)
return undefined;
var da = sDate.split(/[-+T\s:.]/);
if ((mnum = this.revmon[da[1]]) != undefined)
da[1] = mnum;
// CJM FIX IE problem
if (da[2] != undefined){
if (da[2].length == 1)
da[2] = 0+da[2];
}else
da[2] = "01";
if (da[3] == undefined || da[3].length == 0)
da[3]= "12"
if (da[4] == undefined || da[4].length == 0)
da[4]= "00"
if ((iEnd = da[4].indexOf("Z")) != -1)
da[4] = da[4].substr(0,iEnd);
return Date.UTC(da[0],(da[1]-1),da[2],da[3],da[4]);
}
// convert a Blurb Date String to a Blogger Query String
bIO.prototype.getUTCqStr = function(sDate,ms){
if (sDate == undefined)
return undefined;
var da = sDate.split(/[-+T\s:.]/);
if ((mnum = this.revmon[da[1]]) != undefined)
da[1] = mnum;
if (da[2].length == 1)
da[2] = 0+da[2];
if (da[3] == undefined || da[3].length == 0)
da[3]= "12"
if (da[4] == undefined || da[4].length == 0)
da[4]= "00"
if ((iEnd = da[4].indexOf("Z")) != -1)
da[4] = da[4].substr(0,iEnd);
var tz;
if (ms)
tz = ":00Z"
else
tz = "Z"
return da[0] + "-" + da[1] + "-" + da[2] + "T" + da[3] + ":" + da[4] + tz;
}
bIO.prototype.getUserDate = function(sDate,type){
var date;
if (type == 0)
date = new Date(parseInt(sDate));
else if (sDate.indexOf("T") > 0){
// 2008-08-21T21:48:00.000-07:00
// 2007-08-30T09:52:48-08:00
// 2007-08-30T09:52:48Z
// returns 2007-08-30 09:52Z
var iTZ = 19;
if ((iDot = sDate.indexOf(".")) > 0)
iTZ = 23;
var da = sDate.substring(0,iTZ).split(/[-+T:.]/)
var ms = Date.UTC(da[0],(da[1]-1),da[2],da[3],da[4],da[5]);
var tz = sDate.substring(iTZ+1);
var tzpom = sDate.substr(iTZ,1);
if (tzpom == "+" || tzpom == "-"){
tza = tz.split(":");
tzd = (tza[0] * 3600000) + (tza[1] * 60000);
if (tzpom == "-")
ms += tzd;
else
ms -= tzd;
}
date = new Date(ms);
} else{
date = new Date(sDate);
}
var year = date.getUTCFullYear();
var month = date.getUTCMonth();
var day = date.getUTCDate();
month += 1;
if (month < 10)
month = "0" + month;
if (day < 10)
day = "0" + day;
var sNormal = year.toString() + "-" + this.months[month] + "-" + day;
var sHours = (date.getUTCHours()).toString();
if (sHours.length < 2)
sHours = "0" + sHours;
var sMinutes = (date.getUTCMinutes()).toString();
if (sMinutes.length < 2)
sMinutes = "0" + sMinutes;
var sTime = " " + sHours + ":" + sMinutes + "Z";
this.tmp_Date = date.getTime();
return (sNormal + sTime);
}
bIO.prototype.winExtPos = function(str){
var llz="";
// format is: 36-15.68N / 029-22.21E
var ll;
if ((iChk = str.search(/\d+[\d\.]*[-]?[\d\.]*[NS]+[\s\/\,]*\d+[\d\.]*[-]?[\d\.]*[EW]+/)) > -1)
ll = str.substring(iChk).replace(/-/g," ").split(" / ");
if (ll != undefined)
llz += this.strToPos(ll[0])+ "," + this.strToPos(ll[1]);
return llz;
}
bIO.prototype.getXFile = function(){
try //Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
}
catch(e)
{
try //Firefox, Mozilla, Opera, etc.
{
xmlDoc=document.implementation.createDocument("","",null);
}
catch(e) {this.error = e.message}
}
try
{
xmlDoc.async=false;
xmlDoc.load(this.opts.fUrl);
this.loadXFile(xmlDoc);
}
catch(e) {this.error = e.message}
if (this.error != undefined && this.opts.cbLoad)
this.opts.cbLoad();
}
/* intergrate loadString .. handle array of strings
function loadXMLString(txt)
{
try //Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(txt);
return(xmlDoc);
}
catch(e)
{
try //Firefox, Mozilla, Opera, etc.
{
parser=new DOMParser();
xmlDoc=parser.parseFromString(txt,"text/xml");
return(xmlDoc);
}
catch(e) {alert(e.message)}
}
return(null);
}
*/
bIO.prototype.loadXFile = function(xmlDoc){
var markers = xmlDoc.documentElement.getElementsByTagName("marker");
if (this.opts.xrev){
var start=markers.length-1;
var end = 0;
var inc = -1;
}else {
var start=0;
var end = markers.length-1;
var inc = 1;
}
var done=0;
var i = start;
var cnt = 0;
while (!done){
// obtain the attribues of each marker
if (cnt == this.opts.fNum)
break;
cnt++;
var blurbObj = new blurb();
blurbObj.s_llz = parseFloat(markers[i].getAttribute("lat")).toFixed(5) + "," +
parseFloat(markers[i].getAttribute("lng")).toFixed(5);
blurbObj.s_date = markers[i].getAttribute("date");
blurbObj.s_label = "Report " + blurbObj.s_date;
blurbObj.s_text = markers[i].getAttribute("comment");
this.bBlurbsCnt = this.bBlurbs.push(blurbObj);
if (i == end)
done = 1;
i+= inc;
}
this.finished();
}
bIO.prototype.extGeo = function(xmlNode){
var sRet = "";
if (typeof(google) != "undefined"){
// try geo:point
var geoElement = google.feeds.getElementsByTagNameNS(xmlNode,"http://www.georss.org/georss", "point")[0];
if (geoElement != undefined){
sRet = geoElement.firstChild.nodeValue;
}
if (sRet.length < 1){
// try geo:lat and geo:long
var geoElement = google.feeds.getElementsByTagNameNS(xmlNode,"http://www.w3.org/2003/01/geo/wgs84_pos#", "lat")[0];
var geoElement2 = google.feeds.getElementsByTagNameNS(xmlNode,"http://www.w3.org/2003/01/geo/wgs84_pos#", "long")[0];
if (geoElement != undefined && geoElement2 != undefined){
sRet = geoElement.firstChild.nodeValue + " " + geoElement2.firstChild.nodeValue;
}
}
if (sRet.length < 1){
// try georss$where
var geoElement = google.feeds.getElementsByTagNameNS(xmlNode,"http://www.opengis.net/gml", "pos")[0];
if (geoElement != undefined){
sRet = geoElement.firstChild.nodeValue;
}
}
}
return sRet;
}
bIO.prototype.grabThumbUrl = function(xmlNode) {
var node = xmlNode[0];
var thumb = null;
var thumb = node.getAttribute("url");
if (!thumb)
thumb = node.firstChild.nodeValue;
if (!thumb)
thumb = undefined;
return thumb;
};
bIO.prototype.grabImgUrl = function(xmlNode,type) {
var ti = 0;
var len = xmlNode.length;
if (len > 1) {
if (type == "ut")
ti = len - 1;
else
ti = Math.floor(len / 2);
}
var node = xmlNode[ti];
var thumb = null;
var thumb = node.getAttribute("url");
if (!thumb)
thumb = node.firstChild.nodeValue;
if (!thumb)
thumb = undefined;
return thumb;
};
bIO.prototype.loadFeed = function (result){
if (!result.error && result.feed != undefined &&
result.feed.entries != undefined && result.feed.entries.length > 0) {
if (result.feed.title != undefined && result.feed.title.indexOf("Winlink 2000") == 0)
type="winlink";
else
type="other";
var skipImg = -1;
// hmm getting some strange things in a word press feed extra \n's
for (var i = 0; i < result.feed.entries.length; i++) {
var entry = result.feed.entries[i];
// 2Do add switch based on Type
// add photo option.. extract from geo feed
//
var content = entry.content;
var llz = undefined;
if (type == "other"){
if ((iChk = content.indexOf("llz="))> -1){
llz = this.getLLZ(iChk,content);
}
}else if (type == "winlink"){
if (this.opts.fNum != undefined && this.bBlurbsCnt == this.opts.fNum)
break;
llz = this.winExtPos(entry.title);
}
if (llz == undefined && entry.xmlNode != undefined){
// Extract the LATLONG if possible
var sll = this.extGeo(entry.xmlNode);
if (sll.length > 0){
var ll = sll.split(" ");
iLat = parseInt(ll[0]);
if (iLat < 90 && iLat > -90)
llz = ll[0] + "," + ll[1];
}
}
if (type == "other"){
if (llz == undefined && (iChk = content.search(/[\s\u003e;]\d+[\d\.]*[\s'\u00b0\u00ba]?[\d\."'\s]*[NS]+[\s\/\,]*\d+[\d\.]*[\s\u00b0'\u00ba]?[\d\."'\s]*[EW]+/)) > -1){
llz = this.getLatLng(iChk,content);
}
if (llz == undefined && (iChk = content.indexOf("ll="))> -1){
llz = this.getLL(iChk,content);
}
}
var blurbObj = new blurb();
if ((entry.publishedDate != undefined) && (entry.publishedDate.length > 1)){
blurbObj.s_date = this.getUserDate(entry.publishedDate,1);
blurbObj.date = this.tmp_Date;
}
if ((entry.title != undefined) && (entry.title.length > 1))
blurbObj.s_label = entry.title;
if (blurbObj.s_date != undefined && (type == "winlink" || blurbObj.s_label == undefined))
blurbObj.s_label = blurbObj.s_date;
if ((entry.link != undefined) && (entry.link.length > 1))
blurbObj.s_lUrl = entry.link + "," + blurbObj.s_label;
if ((entry.content != undefined) && (entry.content.length > 1)){
blurbObj.s_text = this.stripTags(entry.content,1); //replace(/[\n\r\f\t]/g," ");
if (blurbObj.s_text.length > 450)
blurbObj.s_text = blurbObj.s_text.substr(0,450) + "...";
}
if (blurbObj.s_text == undefined && entry.contentSnippet != undefined && entry.contentSnippet.length > 1)
blurbObj.s_text = entry.contentSnippet.replace(/[\n\r\f\t]/g," ");
if (blurbObj.s_text == undefined && (entry.description != undefined) && (entry.description.length > 1)){
blurbObj.s_text = entry.description.replace(/[\n\r\f\t]/g," ");
}
if (entry.xmlNode != undefined){
var thumbNodes = google.feeds.getElementsByTagNameNS(
entry.xmlNode,
"http://search.yahoo.com/mrss/",
"thumbnail");
if (thumbNodes && thumbNodes.length > 0) {
blurbObj.s_tUrl = this.grabThumbUrl(thumbNodes);
var itype;
if (blurbObj.s_tUrl != undefined && blurbObj.s_tUrl.indexOf("ytimg.com") > 0)
itype = "ut";
blurbObj.s_iUrl = this.grabImgUrl(thumbNodes,itype);
if (blurbObj.s_iUrl == undefined)
blurbObj.s_iUrl = blurbObj.s_tUrl;
if (blurbObj.s_iUrl != undefined){
//this.updateImgLinks(blurbObj);
blurbObj.s_tUrl = undefined;
this.hasPhoto = true;
}
}
}
if (blurbObj.s_iUrl == undefined && skipImg < 0){
if ((entry.content != undefined) && (entry.content.length > 1)){
var feedImg = this.contentGetImgStr(content);
if (feedImg.length > 0 && feedImg.indexOf("feeds.wordpress.com/") < 0 &&
feedImg.indexOf("blogger.googleusercontent.com/") < 0 &&
feedImg.indexOf("feeds.feedburner.com/") < 0){
blurbObj.s_iUrl = feedImg+",";
this.hasPhoto = true;
}
}
}
if (llz != undefined && llz.length > 0)
blurbObj.s_llz = llz;
this.bBlurbsCnt = this.bBlurbs.push(blurbObj);
}
}
else{
if (result.error)
this.error = "Feed " + this.opts.fUrl + " could not be read: " + result.error.message;
}
//GLog.write(this.debug);
this.finished();
}
bIO.prototype.toHtml = function (myString){
var htmlString = myString.split("<").join("<");
htmlString = htmlString.split(">").join(">");
htmlString = htmlString.split(""").join("\"");
htmlString = htmlString.split("'").join("\'");
htmlString = htmlString.split("&").join("\&");
htmlString = htmlString.split("&").join("\&");
return htmlString;
}
bIO.prototype.getPicasaJSON = function (albumUrl){
if (this.opts.cbInit)
this.opts.cbInit();
// Retrieve the JSON feed.
var script = document.createElement('script');
script.setAttribute('src', albumUrl +
'&alt=json-in-script&callback=gbIO.loadPicasaJSON');
script.setAttribute('id', 'jsonPicasaScript');
script.setAttribute('type', 'text/javascript');
document.documentElement.firstChild.appendChild(script);
this.setJSONTimer();
}
bIO.prototype.loadPicasaJSON = function (json){
this.clearJSONTimer();
if ((json.error != undefined) && (json.error)){
this.error = "Picasa Load failed.." + json.error.message;
}else if (json.feed == undefined || json.feed.entry == undefined){
this.error = "Picasa Load Nothing Found";
}else{
var albumtitle = "General"
if (json.feed.title != undefined)
albumtitle = json.feed.title.$t;
var albumUrl = "";
var mainUrl = "";
this.geoPhoto = false;
if (json.feed.author != undefined && json.feed.author.length >0)
mainUrl = json.feed.author[0].uri.$t + "," + json.feed.author[0].name.$t;
// 2do add slide show feed for album? for Picasa Only
// add this to the description
var photocnt = json.feed.openSearch$totalResults.$t;
// get the album Url
for (var k = 0; k < json.feed.link.length; k++) {
if (json.feed.link[k].rel == 'alternate') {
albumUrl = json.feed.link[k].href;
break;
}
}
for (var i = 0; i < json.feed.entry.length ; i++) {
var entry = json.feed.entry[i];
var thumb = entry.media$group.media$thumbnail;
var photoUrl = "";
for (var k = 0; k < entry.link.length; k++) {
if (entry.link[k].rel == 'alternate') {
photoUrl = entry.link[k].href;
break;
}
}
// original image
//if (entry.content != undefined && entry.content.type != undefined && entry.content.type == "image/jpeg"){
// photoUrl = entry.content.src;
//}
var blurbObj = new blurb("P");
// extract a blurb
this.pBlurbsCnt = this.pBlurbs.push(blurbObj);
// entry.updated.$t
if (entry.gphoto$timestamp != undefined){
blurbObj.s_date = this.getUserDate(entry.gphoto$timestamp.$t,0);
blurbObj.date = this.tmp_Date;
}
blurbObj.s_iUrl = entry.media$group.media$content[0].url;
blurbObj.s_tUrl = entry.media$group.media$thumbnail[0].url;
blurbObj.s_sFactor = this.p_ifSize/this.p_tfSize;
this.hasPhoto = true;
if (this.opts.picType == "photo"){
// Get album name type etc
blurbObj.s_label = entry.summary.$t
//blurbObj.s_label = entry.media$group.media$description.$t;
blurbObj.s_text = ''; //' + blurbObj.s_label + '';
if (blurbObj.s_date != undefined)
blurbObj.s_text += "
Taken On: " + blurbObj.s_date;
if (entry.author != undefined){
blurbObj.s_text += "
By: ";
var auri = entry.author[0].uri;
if (auri != undefined)
blurbObj.s_text += ''
blurbObj.s_text += entry.author[0].name.$t;
if (auri != undefined)
blurbObj.s_text += ''
}
if (albumUrl.length > 1)
blurbObj.s_text += '
From: ' + albumtitle + '';
if (entry.exif$tags != undefined){
blurbObj.s_text += "
Camera Details:
";
if (entry.exif$tags.exif$make != undefined)
blurbObj.s_text += entry.exif$tags.exif$make.$t;
if (entry.exif$tags.exif$model != undefined)
blurbObj.s_text += " " + entry.exif$tags.exif$model.$t;
if (entry.exif$tags.exif$fstop != undefined)
blurbObj.s_text += "
FStop: " + entry.exif$tags.exif$fstop.$t;
if (entry.exif$tags.exif$exposure != undefined)
blurbObj.s_text += "
Exposure: " + entry.exif$tags.exif$exposure.$t;
if (entry.exif$tags.exif$iso != undefined)
blurbObj.s_text += "
ISO: " + entry.exif$tags.exif$iso.$t;
if (entry.exif$tags.exif$focallength != undefined)
blurbObj.s_text += "
Focal Length: " + entry.exif$tags.exif$focallength.$t;
if (entry.exif$tags.exif$flash != undefined)
blurbObj.s_text += "
Flash: " + entry.exif$tags.exif$flash.$t;
}
}
else if (this.opts.picType == "album"){
blurbObj.s_key = "A";
blurbObj.s_label = entry.title.$t;
blurbObj.s_text = "";//'' + blurbObj.s_label + '';
if (entry.gphoto$numphotos != undefined)
blurbObj.s_text += "
" + entry.gphoto$numphotos.$t + " Photos";
if (entry.author != undefined)
blurbObj.s_text += "
By: " + entry.author[0].name.$t;
if (entry.published != undefined){
blurbObj.s_date = this.getUserDate(entry.published.$t,1)
blurbObj.date = this.tmp_Date;
}
blurbObj.s_text += "
"+ entry.summary.$t.replace(/[\n\r\f\t]/g," ");
//blurbObj.s_label = entry.media$group.media$title.$t;
}
if (entry.georss$where) {
var pos = entry.georss$where.gml$Point.gml$pos.$t;
blurbObj.s_llz = pos.split(" ")[0] + "," + pos.split(" ")[1];
//blurbObj.s_ll = blurbObj.s_llz;
this.geoPhoto = true;
}
blurbObj.s_lUrl = photoUrl;
blurbObj.image=undefined;
}
}
this.finished();
}
bIO.prototype.getFlickrJSON = function (albumUrl){
if (this.opts.cbInit)
this.opts.cbInit();
// Retrieve the JSON feed.
var script = document.createElement('script');
script.setAttribute('src', albumUrl +
'&format=json&jsoncallback=gbIO.loadFlickrJSON');
script.setAttribute('id', 'jsonScript');
script.setAttribute('type', 'text/javascript');
document.documentElement.firstChild.appendChild(script);
this.setJSONTimer();
}
bIO.prototype.loadFlickrJSON = function (json){
this.clearJSONTimer();
if ((json.error != undefined) && (json.error)){
this.error = "Flickr Load failed.." + json.error.message;
}else if (json.items == undefined){
this.error = "Flickr Load Nothing Found";
}else{
this.getFlickrSizes();
this.geoPhoto = false;
for (var i = 0; i < json.items.length; i++) {
var item = json.items[i];
var blurbObj = new blurb("P");
this.pBlurbsCnt = this.pBlurbs.push(blurbObj);
if (item.date_taken){
blurbObj.s_date = this.getUserDate(item.date_taken,1);
blurbObj.date = this.tmp_Date;
}
blurbObj.s_iUrl = item.media.m;
if (1){
var ibase = blurbObj.s_iUrl.substr(0,blurbObj.s_iUrl.lastIndexOf("_"));
blurbObj.s_iUrl = ibase +this.fl_ifStr+".jpg";
blurbObj.s_tUrl = ibase +this.fl_tfStr+".jpg";
blurbObj.s_sFactor = this.fl_ifSize/this.fl_tfSize;
}
blurbObj.s_label = item.title;
var author = item.author.replace("nobody@flickr.com ","");
author = author.substring(1,author.length-1);
blurbObj.s_text = 'By: ' + author;
var realdesc = this.toHtml(item.description.substr(item.description.indexOf("height=")));
realdesc = realdesc.substr(realdesc.indexOf("") + 9);
if (realdesc.length > 2)
blurbObj.s_text += " " + realdesc;
else
blurbObj.s_text += "
";
blurbObj.s_text += "Taken On: " + blurbObj.s_date.substr(0,blurbObj.s_date.indexOf(" "));
blurbObj.s_text += "
By: " + author + " " + item.author_id;
blurbObj.s_text += "
From: " + json.title;
blurbObj.s_lUrl = item.link;
blurbObj.image=undefined;
blurbObj.item=item;
if (item.latitude) {
blurbObj.s_llz = item.latitude + "," + item.longitude;
//blurbObj.s_ll = blurbObj.s_llz;
this.geoPhoto = true;
}
}
}
this.finished();
}
bIO.prototype.getGSSJSON = function (url){
// Retrieve the JSON feed.
var script = document.createElement('script');
var pre = "?";
if (url.indexOf("?") > 0)
pre = "&";
script.setAttribute('src', url + pre +
'alt=json-in-script&callback=gbIO.loadGSSJSON');
script.setAttribute('id', 'jsonScript');
script.setAttribute('type', 'text/javascript');
document.documentElement.firstChild.appendChild(script);
this.setJSONTimer();
}
bIO.prototype.loadGSSJSON=function(json) {
this.clearJSONTimer();
if ((json.error != undefined) && (json.error)){
this.error = "Google Spreadsheet Load failed.." + json.error.message;
}else if (json.feed == undefined || json.feed.entry == undefined){
this.error = "Google Spreadsheet Nothing Found";
}else{
var sDoc = "";
var entry = json.feed.entry[0];
var i = 0;
var aArgs = [];
for (var obj in entry){
if ((typeof entry[obj] == "object") && (obj.indexOf("gsx$") == 0)){
var tArg = obj.substring(4);
aArgs[i++]=tArg;
sDoc += tArg.toUpperCase() + "|";
}
}
if (sDoc.length > 0)
sDoc += "\n";
for (var i = 0; i < json.feed.entry.length; i++) {
entry = json.feed.entry[i];
// use a pad to hold all the extra field seperaters
// they will only get added if needed (ie. there is something else "down the road"
var sPad = "";
for (var c = 0; c < aArgs.length; c++){
var col = "gsx$" + aArgs[c];
if ((entry[col]) && (entry[col].$t.length > 0)){
sDoc += sPad + entry[col].$t;
sPad="";
}
sPad += "|";
}
sDoc += "\n";
}
this.parseBlurbs(sDoc,"\n","|",true);
}
this.finished();
}
String.prototype.unescHtml = function(){
var i,e={'<':'<','>':'>','&':'&','"':'"'},t=this;
for(i in e)
t=t.replace(new RegExp(i,'g'),e[i]);
return t
}
String.prototype.escHtml = function(){
var i,e={'&':'&','<':'<','>':'>','"':'"'},t=this;
for(i in e)
t=t.replace(new RegExp(i,'g'),e[i]);
return t
}
String.prototype.toJSON = function(){
var i,e={'&':'\\u0026','<':'\\u003c','>':'\\u003e','"':'\\"','=':'\\u003d'},t=this;
for(i in e)
t=t.replace(new RegExp(i,'g'),e[i]);
return ('"' + t + '"');
}
Array.prototype.toJSON = function(){
var result = [];
for (var i = 0; i < this.length; i++){
var val = this[i];
if (val != undefined && val.length > 0){
result.push(val.toJSON());
}
}
return '[' + result.join(',') + ']';
}
// 2Do need to write of array of points for polys
// need style
// need commands for obj type
// need commands for expansion of userurl
bIO.prototype.toJSON = function (blurbs){
var el = "\n";
var result = "gbIO.procBlurbJSON({" + el;
result += '"blurbs":[';
var be = "";
for (i = 0; i < blurbs.length; i++){
var blurbObj = blurbs[i];
result += be + el + '{';
var fl = "";
for (k in this.blurbKeys){
if (blurbObj[k] != undefined){
result += fl +'"' + k + '":' + blurbObj[k].toJSON() ;
fl = ',' + el;
}
}
result += el + '}';
be = ",";
}
result += "]})";
return result;
}
bIO.prototype.getFlickrSizes = function(){
var tSize=0;
var iSize=0;
var tI,iI;
for (var i = 0; i < this.flickSizes.length; i++){
if (this.flickSizes[i] < this.tSize)
tI = i;
else if (this.flickSizes[i] == this.tSize){
tSize = this.tSize;
tI=i;
}
if (this.flickSizes[i] < this.iSize)
iI = i;
else if (this.flickSizes[i] == this.iSize){
iSize = this.iSize;
iI = i;
}
}
if (tI == undefined)
tI = 0;
else if (tSize == 0){
if (tI < this.flickSizes.length -1){
var delp = this.flickSizes[tI+1] - this.tSize;
var delm = this.tSize - this.flickSizes[tI];
if (delp < this.iSize*0.3 || delp < delm){
tI++;
}
}else{
tI = this.flickSizes.length-1;
}
}
if (iI == undefined)
iI = 0;
else if (iSize == 0){
// didn't find exact match.. now look at deltas
if (iI < this.flickSizes.length -1){
var delp = this.flickSizes[iI+1] - this.iSize;
var delm = this.iSize - this.flickSizes[iI];
if (this.forceUp == true && delm > this.iSize*0.1 || delp < delm){
iI++;
}
}else{
iI = this.flickSizes.length-1;
}
}
this.fl_tfSize=this.flickSizes[tI];
this.fl_ifSize=this.flickSizes[iI];
this.fl_tfStr=this.flickString[tI];
this.fl_ifStr=this.flickString[iI];
}
bIO.prototype.flickrStrToSize=function(key){
for (var i in this.flickString)
if (this.flickString[i] == key)
return this.flickSizes[i];
return undefined;
}
bIO.prototype.findSqThumb=function(url){
var retUrl = undefined;
if (url.indexOf("flickr.com") > -1){
//http://farm3.static.flickr.com/2163/2405806642_55589acffd_m.jpg
var urla = url.substring(7).split("/");
// process the file name
if (urla.length >2 && urla[2] != undefined && urla[2].length > 0){
// split it into parts
var pNamea = urla[2].split(/_|\./);
if (pNamea.length > 2){
retUrl = "http://" +urla[0]+ "/" + urla[1] + "/" + pNamea[0] + "_" + pNamea[1] + "_s.jpg";
}
}
}else if (url.indexOf("ggpht.com") > -1 ||
url.indexOf(".blogger.com") > -1 ||
url.indexOf("bp.blogspot.com") > -1){
var urla = url.substring(7).split("/");
var pName = urla[urla.length-1];
if (urla.length > 6 && pName != undefined && pName.length > 0){
var fOS = urla[5].substring(1);
retUrl = "http://"
for (i = 0 ;i < 5; i++)
retUrl += urla[i] + "/"
retUrl += "s72-c/" + pName;
}
}
return retUrl;
}
bIO.prototype.findMainImg=function(url){
return this.findImgSize(url,1);
}
bIO.prototype.findThumb=function(url){
return this.findImgSize(url,0);
}
var crap2=0;
bIO.prototype.findImgSize=function(url,type){
var retUrl = undefined;
if (url.indexOf("flickr.com") > -1){
// build the list of correct thumb and image sizes
if (this.fl_tfStr == undefined)
this.getFlickrSizes();
var iSize = this.fl_tfSize;
var iStr = this.fl_tfStr;
if (type == 1){
iSize = this.fl_ifSize;
iStr = this.fl_ifStr;
}
var urla = url.substring(7).split("/");
if (urla.length >2 && urla[2] != undefined && urla[2].length > 0){
var pNamea = urla[2].split(/_|\./);
if (pNamea.length > 2){
var fOS;
var os = (pNamea[2] != "jpg") ? pNamea[2]:"";
if ((fOS = this.flickrStrToSize(os)) != undefined){
this.tmp_sFactor = parseInt(fOS)/iSize;
if (!isNaN(this.tmp_sFactor))
retUrl = "http://" +urla[0]+ "/" + urla[1] + "/" + pNamea[0] + "_" + pNamea[1] + iStr + ".jpg";
}
}
}
}else if (url.indexOf("ggpht.com") > -1 ||
url.indexOf(".blogger.com") > -1 ||
url.indexOf("bp.blogspot.com") > -1){
if (url.indexOf("photos1.blogger.com") > -1)
return retUrl;
if (this.p_tfSize == undefined)
this.getPicasaSizes();
var iSize = this.p_tfSize;
if (type == 1)
iSize = this.p_ifSize;
var urla = url.substring(7).split("/");
var pName = urla[urla.length-1];
if (urla.length > 6 && pName != undefined && pName.length > 0){
var fOS = urla[5].substring(1);
var sExt = "";
if (url.indexOf("bp.blogspot.com") > -1 && fOS.indexOf("-R") != -1)
sExt = "-R";
retUrl = "http://"
for (i = 0 ;i < 5; i++)
retUrl += urla[i] + "/"
this.tmp_sFactor = parseInt(fOS)/iSize;
if (!isNaN(this.tmp_sFactor))
retUrl += "s" + iSize + sExt + "/" + pName;
else{
retUrl = undefined;
this.tmp_sFactor = undefined;
}
}
}
return retUrl;
}
bIO.prototype.getPicasaSizes = function(){
var tSize=0;
var iSize=0;
for (var i = 0; i < this.picSizes.length; i++){
if (this.picSizes[i] < this.tSize)
tI = i;
else if (this.picSizes[i] == this.tSize)
tSize = this.tSize;
if (this.picSizes[i] < this.iSize)
iI = i;
else if (this.picSizes[i] == this.iSize){
iSize = this.iSize;
}
}
if (tSize == 0){
// didn't find exact match.. now look at deltas
if (tI < this.picSizes.length -1){
var delp = this.picSizes[tI+1] - this.tSize;
var delm = this.tSize - this.picSizes[tI];
if (delp < this.tSize*.30 || delp < delm)
tSize = this.picSizes[tI+1];
else
tSize = this.picSizes[tI];
}
}
if (iSize == 0){
// didn't find exact match.. now look at deltas
if (iI < this.picSizes.length -1){
var delp = this.picSizes[iI+1] - this.iSize;
var delm = this.iSize - this.picSizes[iI];
if (this.forceUp == true && delm > this.iSize*0.1 || delp < delm)
iSize = this.picSizes[iI+1];
else
iSize = this.picSizes[iI];
}else
iSize = this.picSizes[this.picSizes.length-1]
}
// 2DO if iSize < XXX then make them the same
this.p_tfSize=tSize;
this.p_ifSize=iSize;
}
bIO.prototype.toRSS = function (blurbs){
var el = "\n";
var result = '' + el;
result += '' + el;
result += '' + el;
result += 'Blurb Bits Feed' + el;
result += 'http://www.xyz.com/' + el;
result += 'BlurbBits extraction of XYZ' + el;
result += '' + new Date().toUTCString()+ '' + el;
result += 'en-us' + el;
var be = "";
for (i = 0; i < blurbs.length; i++){
var blurbObj = blurbs[i];
result += "- " + el;
//0.142381 -132.911594\n\n
for (k in this.blurbKeys){
if (blurbObj[k] != undefined && this.blurbKeys[k] != undefined){
var out = blurbObj[k];
if (k == "s_llz"){
llza = blurbObj[k].split(",");
out = llza[0] + " " + llza[1];
}else if (k == "s_text"){
bb = "";
out = "";
if (blurbObj.s_llz != undefined)
bb = "?llz=" + blurbObj.s_llz;
if (blurbObj.s_extras != undefined)
bb += (bb.length >0) ? "&" + extras : "?" + extras;
if (bb.length > 0)
out += 'BlurbBits for this Entry
' + el;
if (blurbObj.s_iUrl != undefined)
out += '
' + el;
out = out.escHtml();
out += blurbObj[k];
}else if (k == "s_date"){
out = new Date(this.getUTCms(blurbObj[k])).toUTCString();
}else if (k == "s_lUrl")
result += "" + blurbObj[k] + "";
result += "<" + this.blurbKeys[k] + out + ""+ this.blurbKeys[k] + el;
}
}
result += " " + el;
}
result += "" + el;
result += "" + el;
return result;
}
bIO.prototype.blurbToStr = function(blurb,ofs){
var op = "";
var retStr = "";
for (var i=0; i 0){
retStr += op + blurb[arg]
op = "";
}
op += ofs;
}
}
return retStr;
}
bIO.prototype.blurbsToStr = function(blurbs,ors,ofs){
var retStr="";
/* var lines = g.Body.split("
");
for (var i = 0; i < lines.length; i++){
// also handle cases where the line ends and we want a new line
var lists = lines[i].split("");
if (lists.length > 1){
for (j = 0; j < lists.length-1; j++){
retStr += lists[j] + ""+ors;
}
retStr += lists[j] + ors;
}else
retStr += lines[i] + ors;
}
*/
// dump the globals
// dump the header arg
for (var i = 0; i < this.bArgs.length-1; i++){
var arg = this.bArgMap[this.bArgs[i]];
//make sure we have a map
if (arg != undefined)
retStr += this.bArgs[i] + ofs;
}
// dump the blurbs
retStr += this.bArgs[i] + ors;
for (var i = 0; i < blurbs.length; i++){
retStr += this.blurbToStr(blurbs[i],ofs) + ors;
}
return retStr;
}
bIO.prototype.argsToFUrl = function(sArgs){
kva = sArgs.split("=");
if (kva.length < 2)
alert("Bad input description " + sArgs);
// roll the extras back in
for (i = 2; i < kva.length; i++)
kva[1] += "=" + kva[i];
var fType = kva[0];
if (kva[0] == "blogger" ||
kva[0]== "bloggerid"){
// key:num || date:category=
fType = "blogger";
argA = kva[1].split(":");
var fNum = 10;
var args = "?max-results=" + fNum;
var alen = argA.length;
if (alen > 0){
var base = argA[0];
if (alen > 1 && argA[1] != undefined && argA[1].length > 0){
fNum = argA[1];
args = "?max-results="+argA[1];
}
if (alen > 2 && argA[2] != undefined && argA[2].length > 0){
if (argA[2].indexOf("&") == -1)
args += "&" + argA[2];
else
args += argA[2];
}
if (alen > 3){
for (var a=3; a < alen; a++)
args += ":" + argA[a];
}
} else
base = kva[1];
if (kva[0]== "bloggerid")
fUrl = "http://www.blogger.com/feeds/" + base + "/posts/default" + args;
else
fUrl = "http://" + base + ".blogspot.com/feeds/posts/default" + args;
}else if (kva[0] == "picasa"){
// id: album (or empty): tags comma separated(or empty)
var argA = kva[1].split(":");
var album = undefined;
var tags = undefined;
var alen = argA.length;
if (alen > 0){
base = argA[0];
if (alen > 1 && argA[1] != undefined && argA[1].length > 0)
album = argA[1];
if (alen > 2 && argA[2] != undefined && argA[2].length > 0)
tags = argA[2];
}else base = kva[1];
fUrl = "http://picasaweb.google.com/data/feed/api/user/" + base;
if (album != undefined){
var aNum = parseInt(album);
if (!isNaN(aNum) && aNum == album){
tags += "&max-results=" + aNum;
}else
fUrl += "/album/" + album;
}
fUrl += "?kind=photo";
if (tags != undefined){
if (tags.indexOf("=") == -1){
var aNum = parseInt(tags);
if (!isNaN(aNum) && aNum == tags)
fUrl += "&max-results=" + aNum;
else
fUrl += "&tag=" + tags;
}
else if (tags.charAt(0) != "&")
fUrl += "&" + tags;
else
fUrl += tags;
if (alen > 3){
for (var a=3; a < alen; a++)
fUrl += ":" + argA[a];
}
}
// get the PhotoSizes and pass in Feed
this.getPicasaSizes();
fUrl += "&imgmax=" + this.p_ifSize + "u&thumbsize=" + this.p_tfSize + "u";
}else if (kva[0] == "picalbums"){
fType = "picasa";
// id: album (or empty): tags comma separated(or empty)
var argA = kva[1].split(":");
var tags = undefined;
var alen=argA.length;
if (alen > 0){
base = argA[0];
if (alen > 1 && argA[1] != undefined && argA[1].length > 0)
tags = argA[1];
}else base = kva[1];
fUrl = "http://picasaweb.google.com/data/feed/api/user/" + base;
fUrl += "?kind=album";
if (tags != undefined){
if (tags.charAt(0) != "&")
fUrl += "&" + tags;
else
fUrl += tags;
if (alen > 3){
for (var a=3; a < alen; a++)
fUrl += ":" + argA[a];
}
}
// get the PhotoSizes and pass in Feed
this.getPicasaSizes();
fUrl += "&imgmax=" + this.p_ifSize + "u&thumbsize=" + this.p_tfSize + "u";
}else if ((kva[0] == "picall") || (kva[0] == "picfeat")) {
fType = "picasa";
var argA = kva[1].split(":");
var fNum = "25";
var type = (kva[0] == "picall") ? "all" : "featured";
fUrl = "http://picasaweb.google.com/data/feed/api/" + type + "?kind=photo"
var alen = argA.length;
if (alen > 0){
if (argA[0].indexOf("=") == -1)
fUrl += "&tag=" + argA[0];
else if (argA[0].charAt(0) != "&")
fUrl += "&" + argA[0];
else
fUrl += argA[0];
if (alen > 1 && argA[1] != undefined && argA[1].length > 0)
fNum = argA[1];
}else
fUrl += arg;
fUrl += "&max-results=" + fNum;
this.getPicasaSizes();
fUrl += "&imgmax=" + this.p_ifSize + "u&thumbsize=" + this.p_tfSize + "u";
}else if (kva[0] == "flickr" ||
kva[0]== "flickrgeo" || kva[0]== "flickrgrp" || kva[0]== "flickrggeo" || kva[0]== "flickrfavs"|| kva[0]=="flickrfriends"){
fType = "flickr";
var argA = kva[1].split(":");
var alen = argA.length;
if (alen > 0){
base = argA[0];
if (alen > 1 && argA[1] != undefined && argA[1].length > 0)
tags = argA[1];
}else base = kva[1];
fUrl = "http://api.flickr.com/services/feeds/";
if (tags != undefined && tags.indexOf("set=") > -1){
fUrl += "photoset.gne?nsid=" + base;
}else if (kva[0]== "flickrgeo"){ //added this to fix using with&georss=1 no
fUrl += "geo/?id=" + base;
}else if (kva[0]== "flickrgrp"){
fUrl += "groups_pool.gne?id=" + base;
}else if (kva[0]== "flickrggeo"){
fUrl += "geo/?g=" + base;
}else if (kva[0]== "flickrfavs"){
fUrl += "photos_faves.gne?nsid=" + base;
}else if (kva[0]== "flickrfriends"){
fUrl += "photos_friends.gne?user_id=" + base;
if (tags != undefined && tags == "all"){
fUrl += "&display_all=1";
tags = undefined;
}
}else{
fUrl += "photos_public.gne?id=" + base;
}
if (tags != undefined){
fUrl += "&" + tags;
if (alen > 3){
for (var a=3; a < alen; a++)
fUrl += ":" + argA[a];
}
}
if (kva[0] == "flickrgeo")
fUrl += "&georss=true";
}else if (kva[0] == "winlink"){
fType = "gfeed";
var argA = kva[1].split(":");
var callsign = kva[1];
if (argA.length > 0){
callsign = argA[0];
if (argA.length > 1 && argA[1] != undefined && argA[1].length > 0){
fNum = argA[1];
}
}
fUrl = "http://www.winlink.org/dotnet/maps/RSSPositionReports.aspx?callsign=" + callsign;
}else if (kva[0] == "xfile"){
var argA = kva[1].split(":");
var fUrl = kva[1];
if (argA.length > 0){
fUrl = argA[0];
if (argA.length > 1 && argA[1] != undefined && argA[1].length > 0){
fNum = argA[1];
}
}
}else if (kva[0] == "file"){
var argA = kva[1].split(":");
var fUrl = kva[1];
if (argA.length > 0){
fUrl = argA[0];
if (argA.length > 1 && argA[1] != undefined && argA[1].length > 0){
fNum = argA[1];
}
}
}else if (kva[0] == "gfeed"){
var argA = kva[1].split(":");
var fUrl = kva[1];
var len = argA.length;
if (len > 0){
fUrl = argA[0];
// rebuild except for last arg
for (var a=1; a < len-1;a++)
fUrl = fUrl + ":" + argA[a];
//check it for limiting number
if (argA[a] != undefined && argA[a].length > 0){
fNum = parseInt(argA[a]);
// if not a number then add revert and add to Url
if (isNaN(fNum)){
fNum = undefined;
fUrl = fUrl + ":" + argA[a];
}
}
}
}else if (kva[0] == "gss"){
var argA = kva[1].split(":");
var sid = kva[1];
var fNum = undefined;
if (argA.length > 0){
sid = argA[0];
if (argA.length > 1 && argA[1] != undefined && argA[1].length > 0){
fNum = argA[1];
}
}
var fUrl = "http://spreadsheets.google.com/feeds/list/" + sid + "/od6/public/values";
if (fNum != undefined)
fUrl += "?max-results=" + fNum;
}else if (kva[0] == "jblurbs"){
var fUrl = kva[1];
}
// need to pass out fSize for size of photo .. or pass in at setup time and guess
return { fType: fType,fUrl:fUrl,fNum:fNum }
}
function qArgs(){
// if you haven't processed the args yet.. do it and store them
if ((window.location.search != undefined) && (window.location.search.length > 0)){
var args = window.location.search.substring(1);
var kva = args.split("&");
this.args = [];
for(var i=0; i < kva.length; i++) {
var keyval = kva[i].split("=");
var val = keyval[1];
// re-add any extras back into val
for (j=2; j < keyval.length; j++)
val += "=" + keyval[j];
if (this.args[keyval[0]] == undefined)
this.args[keyval[0]] = unescape(val);
else
this.args[keyval[0]] += "&" + keyval[0] + "=" + unescape(val);
}
}
}
qArgs.prototype.q = function(arg){
if (this.args != undefined)
return this.args[arg];
else
return undefined;
}
bIO.prototype.getFile = function(url) {
var xhReq;
xhReq =null;
var that = this;
that.error = undefined;
if (location.protocol=="file:"){
if (xhReq == null) try{ xhReq=new ActiveXObject("MSXML2.XMLHTTP"); }catch(e){xhReq=null;}
if (xhReq == null) try{ xhReq=new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){xhReq=null;}
}
if (xhReq == null) try{ xhReq=new XMLHttpRequest(); }catch(e){xhReq=null;}
if(typeof ActiveXObject != "undefined"){
if(xhReq==null)try{ xhReq=new ActiveXObject("MSXML2.XMLHTTP"); }catch(e){xhReq=false;}
if(xhReq==null)try{ xhReq=new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){xhReq=false;}
}
//xhReq = window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP")
if (xhReq!=null){
xhReq.onreadystatechange = function() {
if (xhReq.readyState != 4) { return; }
clearTimeout(tooLong);
if (xhReq.status==200 || xhReq.status==0 ){
that.loadFile(xhReq.responseText);
}else {
that.error = "Problem retrieving data:" + xhReq.status + "-" + xhReq.statusText;
if (that.opts.cbLoad)
that.opts.cbLoad(that);
return;
}
};
xhReq.open("get", url, true);
var tooLong = setTimeout(function() {
xhReq.abort();
that.error = "Timeout exceeded waiting for file load.. Aborting!!";
if (that.opts.cbLoad)
that.opts.cbLoad(that);
}, this.MAXIMUM_WAITING_TIME);
try {xhReq.send(null);}
catch(e){that.error="File Load Failed: " + e.message}
}else{
that.error = "Your browser doesn't support XMLHTTP.. Sorry!!";
}
if (that.error != undefined){
clearTimeout(tooLong);
if (that.opts.cbLoad)
that.opts.cbLoad(that);
}
}
bIO.prototype.loadFile = function(text) {
this.parseBlurbs(text,"\n","|");
}
bIO.prototype.handleCmd=function(bLoad){
if (bLoad.error != undefined){
this.cmdAddError(bLoad.error);
}else if (this.cmd != undefined){
var blurbs = this.getBlurbs();
if (this.cmd.key == "afeed" || this.cmd.key == "afile" || this.cmd.key == "extbb+" || this.cmd.key == "file+"){
if (blurbs.length> 0){
// add new blurbs first
if (this.wbBlurbs != undefined){
this.wbBlurbs = blurbs.concat(this.wbBlurbs);
}else
this.wbBlurbs = blurbs;
}
} else if (this.cmd.key == "file" || this.cmd.key == "feed" || this.cmd.key == "extbb"){
if (blurbs.length > 0){
// add in order
if (this.wbBlurbs != undefined){
this.wbBlurbs = this.wbBlurbs.concat(blurbs);
}else
this.wbBlurbs = blurbs;
}
}
}
this.processCmds();
}
function gbIOsortByDate(blurbA,blurbB){
if (blurbA.date == undefined || blurbB.date == undefined)
return(-1);
if (gbIO.cmdSort == "journal")
return(blurbA.date - blurbB.date)
else
return(blurbB.date - blurbA.date);
}
function splitStaticMarker(str){
// format size tiny,small,mid,emtpy
// color black, brown, green, purple, yellow, blue, gray, orange, red, white
// leter or number
var sizes = {mid:"mid",small:"small",tiny:"tiny"};
var colors = {red:"red", yellow:"yellow", blue:"blue", orange:"orange", green:"green", purple:"purple", black:"black", white:"white", gray:"gray", brown:"brown"};
var size="normal";
var color="red";
var char = "";
for (i in sizes){
if (str.indexOf(i) == 0){
size = i;
str = str.substr(sizes[i].length);
break;
}
}
for (i in colors){
if (str.indexOf(i) == 0){
color = i;
str = str.substr(colors[i].length);
break;
}
}
if (str.length == 1)
char = str[0];
}
bIO.prototype.processCmds=function(){
if (this.commands.length > 0){
this.cmd = this.commands.shift();
if (this.cmd.key == "afeed"){
var options = {
fUrl : this.cmd.fUrl,
fType : "blogger",
fNum : this.cmdfNum,
cbLoad : this.bind(this.handleCmd)
};
this.load(options);
// should we allow extra options here.. what if main func had date or fNum
}else if (this.cmd.key.indexOf("extbb") == 0){
///expand fUrl into commands
var fLoad = this.argsToFUrl(this.cmd.fUrl);
fLoad.cbLoad = this.bind(this.handleCmd);
this.load(fLoad);
}else if (this.cmd.key.indexOf("file") == 0){
this.load({fUrl:this.cmd.fUrl,fType:"file",cbLoad : this.bind(this.handleCmd)});
}else if (this.cmd.key == "sort"){
this.cmdSort=this.cmd.fUrl;
this.processCmds();
}
}else{
// handle any final cleanup here .. sorting etc
// return to original state and call finish;
if (this.cmdOut){
this.cmdCopyBack();
}
// sort it if need be
if (this.cmdSort != undefined){
if (this.bBlurbs != undefined && this.bBlurbs.length > 2){
this.bBlurbs.sort(gbIOsortByDate);
}
if (this.pBlurbs != undefined && this.pBlurbs.length > 2){
this.pBlurbs.sort(gbIOsortByDate);
}
}
// make sure we are not returning too much
if (this.cmdfNum != undefined){
if (this.bBlurbs != undefined && this.bBlurbs.length > this.cmdfNum){
this.bBlurbs = this.bBlurbs.slice(0,this.cmdfNum)
}
if (this.pBlurbs != undefined && this.pBlurbs.length > this.cmdfNum){
this.pBlurbs = this.pBlurbs.slice(0,this.cmdfNum)
}
}
this.finished();
}
//{cmd: keyword; args: parts[1] + "," + parts[2]});
}
bIO.prototype.aVal=function(aArray,str){
for (var i = 0; i < aArray.length; i++){
if (aArray[i] == str)
return i;
}
return -1;
}
bIO.prototype.parseBlurbs=function(sContent,fSep,lSep,ret){
var lines = sContent.split(fSep);
for (var i=0; i 0) {
this.parseLine(lines[i],lSep);
if (this.bBlurbsCnt == this.opts.fNum)
break;
}
}
if (this.bArgsMaster != undefined){
// make sure we have the basic content
for (var i=0; i < this.bArgsMaster.length; i++){
if (this.aVal(this.bArgs,this.bArgsMaster[i]) == -1)
this.bArgs.push(this.bArgsMaster[i]);
}
}
if (ret == undefined || ret == false)
this.finished();
}
bIO.prototype.strTrim=function(str, chars) {
return this.ltrim(this.rtrim(str, chars), chars);
}
bIO.prototype.ltrim=function(str, chars) {
chars = chars || "\\s";
return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
bIO.prototype.rtrim=function(str, chars) {
chars = chars || "\\s";
return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}
bIO.prototype.parseLine=function(line,lSep){
line = this.strTrim(line);
var parts = line.split(lSep);
// cleanup the extra microsoft crap
if (lSep == "\t"){
for (var p = 0; p < parts.length; p++)
parts[p] = this.strTrim(parts[p],"\"");
}
var keyword = parts[0];
var arg;
if (keyword.charAt(0) == "#")
return
else if (keyword == "TYPE"){
// get the defintions
var tArgs = [];
for (var p = 0; p < parts.length; p++){
var val = parts[p].toUpperCase();
//tArgs[val] = 1;
tArgs.push(val);
}
this.bArgsMaster = this.bArgs;
this.bArgs = tArgs;
}else if (this.blurbTypes[keyword] != undefined){
if (parts.length < 1)
return;
var blurbObj = new blurb();
this.bBlurbsCnt = this.bBlurbs.push(blurbObj);
for (var p = 0; p < parts.length; p++){
if (parts[p] != undefined && parts[p].length > 0){
arg = this.bArgs[p];
if (arg != undefined && this.bArgMap[arg] != undefined)
blurbObj[this.bArgMap[arg]]=parts[p];
}
if (blurbObj.s_iUrl != undefined)
this.hasPhoto = true;
}
// fix old style points if there are any
if (blurbObj.s_linePts != undefined && blurbObj.s_linePts.length > 3){
if (blurbObj.s_linePts.indexOf("+") == -1){
var points = blurbObj.s_linePts.split(",");
blurbObj.s_lla = [];
for (var p=0; p < points.length; p++){
if ((points[p].length > 0) && (points[p+1] != undefined) && (points[p+1].length > 0))
blurbObj.s_lla.push(points[p] + "," + points[p+1]);
p++;
}
}else{
blurbObj.s_lla = blurbObj.s_linePts.split("+");
}
}
if (blurbObj.s_date != undefined)
blurbObj.date = this.getUTCms(blurbObj.s_date);
} else if (keyword == "usertype"){
this.addUserTypeFromLine(line,lSep);
} else if (keyword == "tt"){
this.defaults.tt = parts[1];
} else if (keyword == "afeed"){
this.commands.push({key: "afeed", fUrl: parts[1], opt: parts[2]});
} else if ( keyword == "sort" || keyword.indexOf("file") == 0 || keyword.indexOf("extbb") == 0){
this.commands.push({key: keyword, fUrl: parts[1], opt: parts[2]});
}
}
bIO.prototype.getBlurbType=function(type){
var ret;
if (type != undefined)
ret = this.blurbTypes[type];
if (ret == undefined)
ret = this.blurbTypes[this.defaults.type];
return ret;
}
bIO.prototype.addUserTypeFromLine= function(line,lSep){
// === split the line into parts ===
// usertype"key": "?", "icon": imagename, "header": "", label: "Unknown"
// usertype|key|icon image|header|label|size
var parts = line.split(lSep);
if (parts[0] != "usertype"){
return;
}
var uT = {};
var j = 1;
for (var p in this.bUT){
var prop = parts[j];
if (prop != undefined && prop.length > 0)
uT[p]=prop;
else
uT[p]=this.bUT[p];
j++;
}
uT.user = 1;
this.blurbTypes[uT.key] = uT;
}
if (typeof bIOLoadCB == "function")
bIOLoadCB();