// // 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("&amp;").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 + "" + 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();