PageRenderTime 59ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/uicore.js

https://bitbucket.org/iridl/uicore
JavaScript | 7673 lines | 7012 code | 160 blank | 501 comment | 1687 complexity | 1f0bb185a9c9979085d4493dc3b31445 MD5 | raw file
  1. /*
  2. uicore implementation in javascript
  3. primarily used for maprooms */
  4. /* uicoreConfig ( -- ) possible parameters and settings. Can be set
  5. in different files, so a bit careful in coding.
  6. */
  7. var uicoreConfig = uicoreConfig || {};
  8. /* resolutionQueryServers ( -- ) server used to resolve resolution
  9. queries for a particular uri -- normally starts empty */
  10. if(!uicoreConfig.resolutionQueryServers){
  11. uicoreConfig.resolutionQueryServers = {};
  12. }
  13. /* to change the GoogleAnalyticsId, redefine this after uicore.js */
  14. /* uicoreConfig.GoogleAnalyticsId='UA-xxxxx-xx'; */
  15. /* to set the help e-mail, redefine this after uicore.js
  16. uicoreConfig.helpemail='help@iri.columbia.edu'; */
  17. uicoreConfig.helpemail='';
  18. /* DL site name */
  19. uicoreConfig.SiteName="Data Library";
  20. /* to add a server for a new resolution, run something like the following */
  21. uicoreConfig.resolutionQueryServers["irids:SOURCES:Ethiopia:Features:Forecast:kiremt_2013:ds"] = "http://www.ethiometmaprooms.gov.et:8082/";
  22. /* additional default uicoreConfig settings */
  23. uicoreConfig.resolutionQueryServers["default"]= "https://iridl.ldeo.columbia.edu/";
  24. uicoreConfig.resolutionQueryServers["irids:SOURCES:TMA:Features:Forecast:vuli_2013:ds"]= "http://maproom.meteo.go.tz/";
  25. /* to change json used for setting preferred language on multi-language pages, reset this */
  26. uicoreConfig.languageSettingDocument="/uicore/toolinfo/buttoninfo.json";
  27. /*
  28. Multiple File Load (.js and .css)
  29. This is the basic check that all the needed js files are loaded
  30. asynchrously before executing.
  31. jsAllLoading() is run at the end if all the files are loaded,
  32. otherwise it waits for the missing files.
  33. $.ready runs a function at DOMContentLoaded if possible, otherwise onload
  34. runs immediately if already loaded. It is invoked at the end of this file.
  35. */
  36. window.$ = {};
  37. $.ready = function(fn) {
  38. if (jsAllLoaded()){
  39. return fn();
  40. }
  41. jsAllLoadedFn = fn;
  42. if (!(document.readyState == "complete" )){
  43. if (window.addEventListener) {
  44. window.addEventListener("DOMContentLoaded", jsAllLoadedRun, false);
  45. window.addEventListener("load", jsAllLoadedRun, false);
  46. }
  47. else if (window.attachEvent){
  48. window.attachEvent("onload", jsAllLoadedRun);
  49. }
  50. else{
  51. window.onload = jsAllLoadedRun;
  52. }
  53. }
  54. if (jsAllLoaded()){
  55. return fn();
  56. }
  57. }
  58. var FBloaded=false;
  59. var jsDependsOnList = new Array();
  60. var jsAllLoadedFn = null;
  61. jsDependsOnList.push(document);
  62. /*
  63. jsDependsOn ( srcfile -- ) adds to the list of files that must be
  64. loaded before execution.
  65. */
  66. function jsDependsOn(srcfile){
  67. var s=document.getElementsByTagName('script')[0];
  68. var po = document.createElement('script');
  69. po.type = 'text/javascript';
  70. if(typeof srcfile == "object"){
  71. for(var key in srcfile){
  72. po.setAttribute(key,srcfile[key]);
  73. }
  74. }
  75. else {
  76. po.src = srcfile;
  77. }
  78. po.onload = jsLoaded;
  79. po.onreadystatechange = jsLoaded;
  80. po.myevtfn = jsLoaded;
  81. if(! po.readyState) po.readyState = "loadingScript";
  82. jsDependsOnList.push(po);
  83. s.parentNode.insertBefore(po,s);
  84. }
  85. /* jsAllLoaded ( -- boolean ) returns true if all files have been
  86. loaded.
  87. */
  88. function jsAllLoaded() {
  89. var ans = true;
  90. for (var i=0; i<jsDependsOnList.length; i++){
  91. if(jsDependsOnList[i].readyState && (!(jsDependsOnList[i].readyState === 'interactive' && !!document.getElementsByTagName('body')[0])) && jsDependsOnList[i].readyState != 'loaded' && jsDependsOnList[i].readyState != 'complete'){ans=false;}
  92. }
  93. return ans;
  94. }
  95. function jsLoaded (evt) {
  96. var evt = (evt) ? evt : ((event) ? event : null );
  97. var it = (evt.currentTarget) ? evt.currentTarget : this;
  98. if(it && it.readyState == 'loadingScript'){
  99. it.readyState="complete";
  100. }
  101. jsAllLoadedRun();
  102. }
  103. var jsAllLoadedNotRun = true;
  104. function jsAllLoadedRun(){
  105. if(jsAllLoadedNotRun && jsAllLoaded()){
  106. if(!!jsAllLoadedFn){
  107. jsAllLoadedNotRun = false;
  108. jsAllLoadedFn();
  109. }
  110. }
  111. }
  112. /*
  113. To simplify writing maproom documents, and accessing them locally,
  114. from test locations, and from the server, urls that start /maproom/
  115. are prepending with the document root, as long as the urls are processed
  116. by the maproom javascript code.
  117. maproomroot: holds the document root
  118. localHrefOf: converts a /maproom/ reference to be relative to the current document
  119. */
  120. var IE8=(navigator.appVersion.indexOf('MSIE 8')>=0);
  121. var slist=document.getElementsByTagName('script');
  122. var scriptsrc='';
  123. for (var i=0; i<slist.length; i++){
  124. var shref=slist[i].src;
  125. if(shref.substr(shref.length-9,9) == 'uicore.js'){
  126. scriptsrc=shref;
  127. break;
  128. }
  129. }
  130. var scriptroot;
  131. if(scriptsrc){
  132. scriptroot = scriptsrc.substr(0,scriptsrc.indexOf('uicore.js'));
  133. }
  134. /* google api (gdrive) */
  135. jsDependsOn({"src": "https://apis.google.com/js/platform.js",
  136. "async": "",
  137. "defer": ""});
  138. /* loads pure javascript */
  139. var puredir = scriptroot.substr(0,scriptroot.length-7) + 'pure/libs/';
  140. jsDependsOn(puredir + 'pure.js');
  141. jsDependsOn(puredir + 'jquery.js');
  142. /* loads jsonld javascript */
  143. jsDependsOn(scriptroot.substr(0,scriptroot.length-7) + 'jsonld/jsonld.js');
  144. var ifmaproomroot = document.location.href.lastIndexOf('/maproom/');
  145. var maproomroot = document.location.href.substr(0,document.location.href.lastIndexOf('/maproom/')+9);
  146. function localHrefOf(ghref){
  147. var lhref;
  148. var ifmap=-1;
  149. var ifscript=-1;
  150. if(ghref){
  151. ifmap = ghref.lastIndexOf('/maproom/');
  152. ifscript = ghref.lastIndexOf('/uicore/');
  153. }
  154. if(ifmaproomroot > -1 && ifmap > -1){
  155. var maproomurl = ghref.substr(0,ifmap+9);
  156. lhref = maproomroot + ghref.substr(maproomurl.length);
  157. }
  158. else if(ifscript > -1){
  159. var scripturl = ghref.substr(0,ifscript+8);
  160. lhref = scriptroot + ghref.substr(scripturl.length);
  161. }
  162. else {
  163. lhref= ghref;
  164. }
  165. if(lhref && lhref.substr(0,1) == '/'){
  166. lhref = location.protocol + '//' + location.host + lhref;
  167. }
  168. return lhref;
  169. }
  170. /* some javascript functions might be missing */
  171. /* replacement for getElementsByClassName when missing */
  172. if (typeof document.getElementsByClassName!='function') {
  173. document.getElementsByClassName = function() {
  174. var elms = this.getElementsByTagName('*');
  175. var ei = new Array();
  176. for (i=0;i<elms.length;i++) {
  177. if (elms[i].getAttribute('class')) {
  178. ecl = elms[i].getAttribute('class').split(' ');
  179. for (j=0;j<ecl.length;j++) {
  180. if (ecl[j].toLowerCase() == arguments[0].toLowerCase()) {
  181. ei.push(elms[i]);
  182. }
  183. }
  184. } else if (elms[i].className) {
  185. ecl = elms[i].className.split(' ');
  186. for (j=0;j<ecl.length;j++) {
  187. if (ecl[j].toLowerCase() == arguments[0].toLowerCase()) {
  188. ei.push(elms[i]);
  189. }
  190. }
  191. }
  192. }
  193. return ei;
  194. }
  195. Element.prototype.getElementsByClassName=document.getElementsByClassName;
  196. }
  197. /* IE 8 is missing hasOwnProperty for Elements */
  198. if(!Element.prototype.hasOwnProperty){
  199. Element.prototype.hasOwnProperty=Object.prototype.hasOwnProperty;
  200. }
  201. if(typeof [].indexOf != 'function'){
  202. Array.prototype.indexOf = function(obj, start) {
  203. for (var i = (start || 0), j = this.length; i < j; i++) {
  204. if (this[i] === obj) { return i; }
  205. }
  206. return -1;
  207. }
  208. }
  209. // Add ECMA262-5 Array methods if not supported natively
  210. //
  211. if (!('indexOf' in Array.prototype)) {
  212. Array.prototype.indexOf= function(find, i /*opt*/) {
  213. if (i===undefined) i= 0;
  214. if (i<0) i+= this.length;
  215. if (i<0) i= 0;
  216. for (var n= this.length; i<n; i++)
  217. if (i in this && this[i]===find)
  218. return i;
  219. return -1;
  220. };
  221. }
  222. if (!('lastIndexOf' in Array.prototype)) {
  223. Array.prototype.lastIndexOf= function(find, i /*opt*/) {
  224. if (i===undefined) i= this.length-1;
  225. if (i<0) i+= this.length;
  226. if (i>this.length-1) i= this.length-1;
  227. for (i++; i-->0;) /* i++ because from-argument is sadly inclusive */
  228. if (i in this && this[i]===find)
  229. return i;
  230. return -1;
  231. };
  232. }
  233. if (!('forEach' in Array.prototype)) {
  234. Array.prototype.forEach= function(action, that /*opt*/) {
  235. for (var i= 0, n= this.length; i<n; i++)
  236. if (i in this)
  237. action.call(that, this[i], i, this);
  238. };
  239. }
  240. if (!('map' in Array.prototype)) {
  241. Array.prototype.map= function(mapper, that /*opt*/) {
  242. var other= new Array(this.length);
  243. for (var i= 0, n= this.length; i<n; i++)
  244. if (i in this)
  245. other[i]= mapper.call(that, this[i], i, this);
  246. return other;
  247. };
  248. }
  249. if (!('filter' in Array.prototype)) {
  250. Array.prototype.filter= function(filter, that /*opt*/) {
  251. var other= [], v;
  252. for (var i=0, n= this.length; i<n; i++)
  253. if (i in this && filter.call(that, v= this[i], i, this))
  254. other.push(v);
  255. return other;
  256. };
  257. }
  258. if (!('every' in Array.prototype)) {
  259. Array.prototype.every= function(tester, that /*opt*/) {
  260. for (var i= 0, n= this.length; i<n; i++)
  261. if (i in this && !tester.call(that, this[i], i, this))
  262. return false;
  263. return true;
  264. };
  265. }
  266. if (!('some' in Array.prototype)) {
  267. Array.prototype.some= function(tester, that /*opt*/) {
  268. for (var i= 0, n= this.length; i<n; i++)
  269. if (i in this && tester.call(that, this[i], i, this))
  270. return true;
  271. return false;
  272. };
  273. }
  274. /* dohomesel ( evt -- ) event function to handle home menu select.*/
  275. function dohomesel(evt){
  276. var evt = (evt) ? evt : ((event) ? event : null );
  277. var it = (evt.currentTarget) ? evt.currentTarget : this;
  278. var opt=it.options[it.selectedIndex];
  279. var fullpathname = document.location.href;
  280. var optvalue = opt.value;
  281. var optpath = optvalue.replace(/\?.*/,'');
  282. if(optpath == location.pathname){
  283. var optclass = "share carryLanguage";
  284. }
  285. else {
  286. var optclass = "carryup carryLanguage";
  287. }
  288. if(optvalue){
  289. /* _gaq.push(['_trackSocial', 'HomeMenu', opt.innerHTML]); */
  290. ga('send','social', 'HomeMenu', opt.innerHTML,location.href);
  291. var url = appendPageForm(optvalue,optclass,false,true);
  292. document.location.href=url;
  293. }
  294. }
  295. /* dosectionsel ( -- ) function to handle mapselect menu */
  296. function dosectionsel(){
  297. it=document.getElementById('mapselect');
  298. if(it.options[it.selectedIndex].parentNode.label){
  299. it.parentNode.getElementsByTagName('legend')[0].innerHTML=it.options[it.selectedIndex].parentNode.label;}
  300. it.previousSibling.innerHTML=it.options[it.selectedIndex].innerHTML;
  301. var opt=it.options[it.selectedIndex];
  302. var fullpathname = document.location.href;
  303. var optvalue = opt.value;
  304. var optclass="carry";
  305. if(optvalue.indexOf('@')>0){
  306. optclass = optvalue.split('@')[1];
  307. optvalue = optvalue.split('@')[0];
  308. }
  309. if(optvalue.substring(0,5)!='http:'){
  310. if(fullpathname.indexOf("?")>= 0){
  311. fullpathname = fullpathname.substring(0,fullpathname.indexOf("?"));
  312. }
  313. if(fullpathname.indexOf("#")>= 0){
  314. fullpathname = fullpathname.substring(0,fullpathname.indexOf("#"));
  315. }
  316. if (it.hrefroot + optvalue != fullpathname){
  317. submitPageForm(it.hrefroot + optvalue,optclass);
  318. }
  319. } else {
  320. submitPageForm(optvalue,optclass);
  321. }
  322. }
  323. /* functions for handling events needed for the grid controls */
  324. /* limitclickevent ( evt -- ) handles first/last limit click for grid
  325. controls. */
  326. function limitclickevent(evt){
  327. var evt = (evt) ? evt : ((event) ? event : null );
  328. var it = (evt.currentTarget) ? evt.currentTarget : this;
  329. var myinput = it.parentNode.getElementsByTagName('input')[0];
  330. var last = it.parentNode.info['iridl:gridvalues']['iridl:valuelist'].length-1;
  331. myinput.value=it.innerHTML;
  332. var c0 = it.parentNode.info['iridl:gridvalues']['iridl:valuelist'].indexOf(myinput.value);
  333. if(c0 == 0){
  334. myinput.guessvalue=it.parentNode.info['iridl:gridvalues']['iridl:valuelist'][1];
  335. }
  336. if(c0 == last){
  337. myinput.guessvalue=it.parentNode.info['iridl:gridvalues']['iridl:valuelist'][last-1];
  338. }
  339. if(!evt.currentTarget){
  340. evt.currentTarget=this;
  341. }
  342. imageinputvaluechange(evt);
  343. }
  344. /* stepupclickevent ( evt -- ) handles step up click for grid
  345. controls. */
  346. function stepupclickevent(evt){
  347. var evt = (evt) ? evt : ((event) ? event : null );
  348. var it = (evt.currentTarget) ? evt.currentTarget : this;
  349. var myinput = it.parentNode.getElementsByTagName('input')[0];
  350. var cin = it.parentNode.info['iridl:gridvalues']['iridl:valuelist'].indexOf(myinput.value);
  351. if(cin > -1 && cin < it.parentNode.info['iridl:gridvalues']['iridl:valuelist'].length-1) {
  352. myinput.value = it.parentNode.info['iridl:gridvalues']['iridl:valuelist'][cin+1];
  353. if(cin < it.parentNode.info['iridl:gridvalues']['iridl:valuelist'].length-2) {
  354. myinput.guessvalue = it.parentNode.info['iridl:gridvalues']['iridl:valuelist'][cin+2];
  355. }
  356. if(!evt.currentTarget){
  357. evt.currentTarget=this;
  358. }
  359. imageinputvaluechange(evt);
  360. }
  361. }
  362. /* stepdownclickevent ( evt -- ) handles step down click for grid
  363. controls. */
  364. function stepdownclickevent(evt){
  365. var evt = (evt) ? evt : ((event) ? event : null );
  366. var it = (evt.currentTarget) ? evt.currentTarget : this;
  367. var myinput = it.parentNode.getElementsByTagName('input')[0];
  368. var cin = it.parentNode.info['iridl:gridvalues']['iridl:valuelist'].indexOf(myinput.value);
  369. if(cin >0) {
  370. myinput.value = it.parentNode.info['iridl:gridvalues']['iridl:valuelist'][cin-1];
  371. if(cin > 1) {
  372. myinput.guessvalue = it.parentNode.info['iridl:gridvalues']['iridl:valuelist'][cin-2];
  373. }
  374. if(!evt.currentTarget){
  375. evt.currentTarget=this;
  376. }
  377. imageinputvaluechange(evt);
  378. }
  379. }
  380. /* imageimputvaluechange ( evt -- ) handles explicit value change for grid
  381. controls. */
  382. function imageinputvaluechange(evt){
  383. var evt = (evt) ? evt : ((event) ? event : null );
  384. var it = (evt.currentTarget) ? evt.currentTarget : this;
  385. var myinput = it.parentNode.getElementsByTagName('input')[0];
  386. var myimage = it.parentNode.mylink.figureimage;
  387. // copy value(s) to page form and get url
  388. var pform=document.getElementById('pageform');
  389. var guess='';
  390. if(myinput.guessvalue){
  391. pform.elements[myinput.name].value = myinput.guessvalue;
  392. // guess = appendPageForm(myimage.src,myimage.className);
  393. guess = myinput.guessvalue;
  394. myinput.guessvalue='';
  395. }
  396. updatePageForm(pform.elements[myinput.name],myinput.value,guess);
  397. // pform.elements[myinput.name].value = myinput.value;
  398. // myimage.src = appendPageForm(myimage.src,myimage.className);
  399. // if(guess){
  400. // preload(guess);
  401. // }
  402. }
  403. /* tab events */
  404. /* tabclickevent ( evt -- ) click on tab (select tab) and shift click
  405. on tab (multiple active tabs if screen is large) . */
  406. function tabclickevent(evt){
  407. var evt = (evt) ? evt : ((event) ? event : null );
  408. var it = (evt.currentTarget) ? evt.currentTarget : this;
  409. if (!it) {it = evt.srcElement.parentNode;}
  410. if(evt.shiftKey){
  411. toggleClass(it,'toggle');
  412. if(it.children[0] && it.children[0].hash){
  413. if(it.className.indexOf('toggle')<0){
  414. var tlists = decodeURIComponent(getCookie('toggletabs'));
  415. var tlist = tlists.split(' ');
  416. tlists='';
  417. var delim='';
  418. for(var i=0; i<tlist.length; i++){
  419. if(tlist[i] != it.children[0].hash){
  420. tlists = tlists + delim + tlist[i];
  421. delim=' ';
  422. }
  423. }
  424. document.cookie='toggletabs' + '=' + encodeURIComponent(tlists) + "; path=/";
  425. }
  426. else {
  427. var tlist = decodeURIComponent(getCookie('toggletabs'));
  428. tlist = tlist + ' ' + it.children[0].hash;
  429. document.cookie='toggletabs' + '=' + encodeURIComponent(tlist) + "; path=/";
  430. }
  431. }
  432. }
  433. if(makeTabActive(it,true)){
  434. if(history && history.pushState && it.children[0].pathname == location.pathname){
  435. var url = it.children[0].hash;
  436. if(it.className.indexOf("ui-state-active") < 0){
  437. var mylist=it.parentNode.getElementsByClassName("ui-state-active");
  438. if(mylist.length > 0){
  439. url = mylist[0].children[0].hash;
  440. }
  441. }
  442. if(url){
  443. var mylabel = it.children[0].innerText;
  444. var mytitle = document.title;
  445. if(mylabel){
  446. mytitle=addTabToTitle(mylabel);
  447. }
  448. else {
  449. mylabel = url.substr(1);
  450. }
  451. history.pushState(url,mytitle,url);
  452. document.title=mytitle;
  453. ga('send','social', 'Tabs', mylabel, window.location.href);
  454. }
  455. }
  456. refreshConnectedGraphs();
  457. }
  458. return false;
  459. }
  460. function makeSubTabActive(tab,ifclick){
  461. var iftoggle=ifclick && ($(tab).css('float') == 'right');
  462. var ifchange=iftoggle || (tab.className.indexOf("ui-state-active") <0);
  463. if(iftoggle){
  464. var sid="";
  465. if(tab.children[0].pathname==location.pathname && tab.children[0].hash){
  466. sid = tab.children[0].hash.substr(1);
  467. }
  468. else {
  469. location.href = tab.children[0].href;
  470. }
  471. if(tab.className.indexOf("ui-state-active") >=0){
  472. changeClass(tab,"ui-state-active","ui-state-default");
  473. if(sid && document.getElementById(sid)){
  474. document.getElementById(sid).className="ui-tabs-panel-hidden";
  475. }
  476. }
  477. else {
  478. changeClass(tab,"ui-state-default","ui-state-active");
  479. if(sid && document.getElementById(sid)){
  480. document.getElementById(sid).className="ui-tabs-panel-float";
  481. var mypanel = document.getElementById(sid);
  482. var myset = mypanel.parentNode;
  483. var togglelist = tab.parentNode.getElementsByClassName("toggle");
  484. var insertAfter=myset.firstElementChild;
  485. for(var j=0; j<togglelist.length ; j++){
  486. var tsid = togglelist[j].firstElementChild.hash.substr(1);
  487. var tpanel = document.getElementById(tsid);
  488. if(tpanel){
  489. myset.insertBefore(tpanel,insertAfter.nextElementSibling);
  490. insertAfter=tpanel;
  491. }
  492. }
  493. }
  494. }
  495. }
  496. else {
  497. var mylist=tab.parentNode.getElementsByClassName("ui-state-active");
  498. for (var i= 0; i<mylist.length; i++){
  499. var sid;
  500. if(!(ifclick && $(mylist[i]).css('float') == 'right')){
  501. if(mylist[i].children[0].hash){
  502. sid = mylist[i].children[0].hash.substr(1);
  503. }
  504. if(sid && document.getElementById(sid)){
  505. document.getElementById(sid).className="ui-tabs-panel-hidden";
  506. }
  507. changeClass(mylist[i],"ui-state-active","ui-state-default");
  508. }
  509. }
  510. changeClass(tab,"ui-state-default","ui-state-active");
  511. var sid="";
  512. if(tab.children[0].pathname==location.pathname && tab.children[0].hash){
  513. sid = tab.children[0].hash.substr(1);
  514. }
  515. if(sid && document.getElementById(sid)){
  516. document.getElementById(sid).className="ui-tabs-panel";
  517. }
  518. else {
  519. location.href= tab.children[0].href;
  520. }
  521. if(document.width < 750){
  522. location.href= tab.children[0].href;
  523. }
  524. }
  525. return ifchange;
  526. }
  527. function makeTabActive(tab,ifclick){
  528. var ifchange=makeSubTabActive(tab,ifclick);
  529. makeTabParentActive(tab.parentNode);
  530. return ifchange;
  531. };
  532. function addTabToTitle(myadd){
  533. var newtitle = document.title.replace(/:.*$/,"") + ": " + myadd;
  534. return(newtitle);
  535. }
  536. function makeTabParentActive(tabnode){
  537. if(tabnode.className=="ui-tabs-panel-hidden"){
  538. var myid = tabnode.id;
  539. if(myid){
  540. var myhash = '#' + myid;
  541. makeTabActiveFromHash(myhash,true);
  542. }
  543. }
  544. else {
  545. if(tabnode.parentNode){
  546. makeTabParentActive(tabnode.parentNode);
  547. }
  548. }
  549. }
  550. /* getTabParent -- gets first object or parent that is a tab -- starts with the object */
  551. function getTabParent(tabnode){
  552. if(tabnode.className=="ui-tabs-panel-hidden" || tabnode.className=="ui-tabs-panel"){
  553. return(tabnode);
  554. }
  555. else {
  556. if(tabnode.parentNode){
  557. return(getTabParent(tabnode.parentNode));
  558. }
  559. }
  560. }
  561. function tabtarget(evt){
  562. var ret = (document.width < 750);
  563. evt = (evt) ? evt : ((event) ? event : null );
  564. if (evt) {
  565. if(ret){
  566. if(evt.returnValue){
  567. evt.returnValue="false";
  568. }
  569. }
  570. }
  571. return(ret);
  572. }
  573. /* tabsSetup ( -- ) set up tabs. */
  574. function tabsSetup(){
  575. var mylist=document.getElementsByClassName("ui-tabs");
  576. var togglelist=decodeURIComponent(getCookie('toggletabs')).split(' ');
  577. var togglehash={};
  578. for(var i=0;i<togglelist.length; i++){
  579. togglehash[togglelist[i]]=true;
  580. }
  581. for (var i= 0; i<mylist.length; i++){
  582. var tabset=mylist[i];
  583. var tablist;
  584. if(tabset.getElementsByClassName("ui-tabs-nav")[0]){
  585. tablist=tabset.getElementsByClassName("ui-tabs-nav")[0].getElementsByTagName("li");
  586. }
  587. else {
  588. tablist=[];
  589. }
  590. var activetab=0;
  591. for (var j=0; j<tablist.length; j++){
  592. if(tablist[j].className.indexOf('ui-state-active')>=0)activetab=j
  593. }
  594. for (var j=0; j<tablist.length; j++){
  595. var atab=tablist[j];
  596. if(atab.children[0] && atab.children[0].hash && togglehash[atab.children[0].hash]){
  597. appendMissingClass(atab,'toggle');
  598. }
  599. if(!atab.children[0].onclick) {
  600. atab.onclick=tabclickevent;
  601. atab.myonclick=tabclickevent;
  602. if(j != activetab){
  603. appendMissingClass(atab,'ui-state-default');
  604. var sid = atab.children[0].hash.substr(1);
  605. if(!!sid){
  606. if(document.getElementById(sid)){
  607. document.getElementById(sid).className="ui-tabs-panel-hidden";
  608. }
  609. }
  610. }
  611. else {
  612. appendMissingClass(atab,'ui-state-active');
  613. var sid = atab.children[0].hash.substr(1);
  614. if(!!sid){
  615. if(document.getElementById(sid))
  616. {document.getElementById(sid).className="ui-tabs-panel";}
  617. }
  618. }
  619. atab.children[0].onclick=tabtarget;
  620. }
  621. }
  622. }
  623. if(window.location.hash){
  624. makeTabActiveFromHash(window.location.hash);
  625. }
  626. }
  627. /* makeTabActiveFromHash ( hash flag -- ) makes tab active using the
  628. hash from the url */
  629. function makeTabActiveFromHash (myhash,dontClearChildren){
  630. var mytab="";
  631. if(myhash){
  632. var myid = myhash.substr(1);
  633. var myobject = document.getElementById(myid);
  634. if(!dontClearChildren){
  635. if(myobject){
  636. clearTabActive(myobject.getElementsByClassName('ui-tabs-nav'));
  637. }
  638. }
  639. if(myobject){
  640. var mypanel=getTabParent(myobject);
  641. if(mypanel){
  642. var myphash = '#' + mypanel.id;
  643. mytabsets = document.getElementsByClassName('ui-tabs-nav');
  644. for(var i=mytabsets.length;i--;){
  645. var mytabset=mytabsets[i];
  646. var mytabs=mytabset.getElementsByTagName('li');
  647. for(var j=mytabs.length;j--;){
  648. if(mytabs[j].children[0].hash == myphash){
  649. makeTabActive(mytabs[j],true);
  650. mytab = mytabs[j];
  651. }
  652. }
  653. }
  654. }
  655. }
  656. }
  657. return(mytab);
  658. }
  659. /* clearTabActive ( tabsets -- ) clears active tabs. */
  660. function clearTabActive (mytabsets){
  661. if(!mytabsets){
  662. mytabsets = document.getElementsByClassName('ui-tabs-nav');
  663. }
  664. for(var i=mytabsets.length;i--;){
  665. var mytabset=mytabsets[i];
  666. var mytabs=mytabset.getElementsByTagName('li');
  667. if(mytabs.length && mytabs[0].children[0].hash){
  668. makeSubTabActive(mytabs[0],false);
  669. }
  670. }
  671. }
  672. /* insertcontactus ( -- ) insert contactus element. */
  673. function insertcontactus(){
  674. var s = document.getElementById('contactus');
  675. if(s){
  676. var sl = s.getElementsByTagName('legend');
  677. if(!sl.length){
  678. var lls=document.createElement('legend');
  679. appendMissingClass(lls,'langgroup');
  680. s.insertBefore(lls,s.firstChild);
  681. ls=document.createElement('span');
  682. ls.setAttribute('lang','es');
  683. ls.appendChild(document.createTextNode('Contáctenos'));
  684. lls.insertBefore(ls,lls.firstChild);
  685. ls=document.createElement('span');
  686. ls.setAttribute('lang','fr');
  687. ls.appendChild(document.createTextNode('Contactez Nous'));
  688. lls.insertBefore(ls,lls.firstChild);
  689. ls=document.createElement('span');
  690. ls.setAttribute('lang','ru');
  691. ls.appendChild(document.createTextNode('Контактная информация'));
  692. lls.insertBefore(ls,lls.firstChild);
  693. ls=document.createElement('span');
  694. ls.setAttribute('lang','en');
  695. ls.appendChild(document.createTextNode('Contact Us'));
  696. lls.insertBefore(ls,lls.firstChild);
  697. updateLangGroups(s);
  698. }
  699. sl = document.getElementById('googleplus');
  700. if(!sl){
  701. var tumblr_button;
  702. if(uicoreConfig.helpemail){
  703. /* code to add Mail-help buttons */
  704. gb= document.createElement('div');
  705. gb.className='sharebutton';
  706. gb.id='helpmailbutton';
  707. tumblr_button = document.createElement("a");
  708. tumblr_button.onclick=doHelpMail;
  709. tumblr_button.setAttribute("title", uicoreConfig.helpemail);
  710. gb.appendChild(tumblr_button);
  711. s.appendChild(gb);
  712. }
  713. }
  714. }
  715. }
  716. function insertshare(){
  717. insertcontactus();
  718. var s = document.getElementById('share');
  719. if(s){
  720. var sl = s.getElementsByTagName('legend');
  721. if(!sl.length){
  722. var ls=document.createElement('legend');
  723. ls.appendChild(document.createTextNode('Share'));
  724. s.insertBefore(ls,s.firstChild);
  725. }
  726. sl = document.getElementById('googleplus');
  727. if(!sl){
  728. var tumblr_button;
  729. /* twitter */
  730. gb= document.createElement('div');
  731. gb.className='sharebutton';
  732. gb.id='custom-tweet-button';
  733. var gba = document.createElement('a');
  734. gba.setAttribute("title","Tweet");
  735. gba.onclick=doTwitter;
  736. gb.appendChild(gba);
  737. s.appendChild(gb);
  738. /* evernote */
  739. var gb= document.createElement('div');
  740. gb.className='sharebutton';
  741. gb.id='evernote';
  742. gba = document.createElement('a');
  743. gba.setAttribute("title","Save to Evernote with link back");
  744. gba.onclick=doEvernoteClip;
  745. gb.appendChild(gba);
  746. s.appendChild(gb);
  747. /* Pinterest */
  748. gb= document.createElement('div');
  749. gb.className='sharebutton pinterest';
  750. gb.onclick=doPinterestClip;
  751. /* s.appendChild(gb); */
  752. /* tumblr */
  753. gb= document.createElement('div');
  754. gb.className='sharebutton';
  755. gb.id='tumblr';
  756. tumblr_button = document.createElement("a");
  757. tumblr_button.onclick=doTumblrClip;
  758. tumblr_button.setAttribute("title", "Share on Tumblr with link back");
  759. gb.appendChild(tumblr_button);
  760. s.appendChild(gb);
  761. /* CSP Forum */
  762. gb= document.createElement('div');
  763. gb.className='sharebutton';
  764. gb.id='csp';
  765. tumblr_button = document.createElement("a");
  766. tumblr_button.onclick=doIRIFClipElement;
  767. tumblr_button.setAttribute("title", "Share with Climate Services Partnership Forums");
  768. gb.appendChild(tumblr_button);
  769. s.appendChild(gb);
  770. /* code to add Mail buttons */
  771. gb= document.createElement('div');
  772. gb.className='sharebutton';
  773. gb.id='mailbutton';
  774. tumblr_button = document.createElement("a");
  775. tumblr_button.onclick=doMail;
  776. tumblr_button.setAttribute("title", "Share with e-mail");
  777. gb.appendChild(tumblr_button);
  778. s.appendChild(gb);
  779. /* facebook */
  780. gb=document.createElement('div');
  781. // FB with url following share variables
  782. // gb.className="fb-like share";
  783. // var url = appendPageForm(location.href,'share');
  784. // FB with parameters stripped from url
  785. gb.className="fb-like";
  786. var url = location.href.replace(/[?].*/,'');
  787. // End of Choice
  788. url = url.replace(/[?]/,"/QS/");
  789. gb.setAttribute("data-href",url);
  790. gb.setAttribute("data-send","false");
  791. gb.setAttribute("data-layout","button_count");
  792. gb.setAttribute("data-width","24");
  793. gb.setAttribute("data-show-faces","true");
  794. var s = document.getElementById('custom-tweet-button').parentNode;
  795. /* s.insertBefore(gb,document.getElementById('custom-tweet-button')); */
  796. s.appendChild(gb);
  797. loadFB();
  798. /* code to add GMail buttons
  799. gb= document.createElement('div');
  800. gb.className='sharebutton';
  801. gb.id='gmailbutton';
  802. tumblr_button = document.createElement("a");
  803. tumblr_button.onclick=doGMail;
  804. tumblr_button.setAttribute("title", "Share on GMail");
  805. gb.appendChild(tumblr_button);
  806. s.appendChild(gb);
  807. */
  808. var gb= document.createElement('div');
  809. gb.className='sharebutton';
  810. gb.id='googleplusbutton';
  811. var annote = "inline";
  812. if(window.innerWidth < 480)annote="bubble";
  813. gb.innerHTML='<div class="g-plusone" data-annotation="' + annote + '" ></div>';
  814. s.appendChild(gb);
  815. }
  816. // adds scripts to share to activate buttons
  817. var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
  818. po.src = 'https://apis.google.com/js/plusone.js';
  819. s.appendChild(po);
  820. var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  821. ga.src = "//static.evernote.com/noteit.js";
  822. s.appendChild(ga);
  823. /* var pi = document.createElement('script'); pi.type = 'text/javascript'; pi.async = true;
  824. pi.src = "//assets.pinterest.com/js/pinit.js";
  825. s.appendChild(pi);
  826. */
  827. }
  828. }
  829. function loadFB(){
  830. var js, id = 'facebook-jssdk', ref = document.getElementsByTagName('script')[0];
  831. if (document.getElementById(id)) {return;}
  832. js = document.createElement('div');
  833. js.id='fb-root';
  834. var b= document.getElementsByTagName('body')[0];
  835. b.insertBefore(js, b.firstChild);
  836. window.fbAsyncInit = function() {
  837. /* FB.init({
  838. appId : 'myId', // App ID
  839. channelUrl : '', // Channel File
  840. status : true, // check login status
  841. cookie : true, // enable cookies to allow the server to access the session
  842. xfbml : true // parse XFBML
  843. }); */
  844. FB.Event.subscribe('edge.create', function(targetUrl) {
  845. /* _gaq.push(['_trackSocial', 'facebook', 'like', targetUrl]);*/
  846. ga('send','social', 'facebook','like', targetUrl);
  847. });
  848. };
  849. js = document.createElement('script'); js.id = id; js.async = true;
  850. js.onload=finishFB();
  851. js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
  852. ref.parentNode.insertBefore(js, ref);
  853. }
  854. function finishFB(){
  855. /* fb followup FB.XFBML.parse() to rerender */
  856. FBloaded=true;
  857. }
  858. function doTwitter(){
  859. var url = appendPageForm(location.href,'share');
  860. var tpar = getElementsByAttribute(document,'*','property','term:title');
  861. var dpar = getElementsByAttribute(document,'*','property','term:description');
  862. var title="";
  863. if(tpar.length>0){
  864. title=tpar[0].innerHTML;
  865. }
  866. if(!title)title=document.title;
  867. var twitter_url = "https://twitter.com/share?via=iridl&hashtags=dataviz&url=" + encodeURIComponent(url) + "&text=" + encodeURIComponent(title);
  868. /* _gaq.push(['_trackSocial', 'twitter', 'tweet', url]);*/
  869. ga('send','social', 'twitter','tweet', url);
  870. window.open(twitter_url);
  871. }
  872. function doGMail(){
  873. var url = appendPageForm(location.href,'share');
  874. var tpar = getElementsByAttribute(document,'*','property','term:title');
  875. var title="";
  876. if(tpar.length>0){
  877. title=tpar[0].innerHTML;
  878. }
  879. if(!title)title=document.title;
  880. var m='http://mail.google.com/mail/?ui=1&view=cm&fs=1&tf=1&to=&su='+encodeURIComponent(title)+'&body='+encodeURIComponent(url);
  881. window.open(m);
  882. }
  883. function doMail(){
  884. var url = appendPageForm(location.href,'share');
  885. var tpar = getElementsByAttribute(document,'*','property','term:title');
  886. var title="";
  887. if(tpar.length>0){
  888. title=tpar[0].innerHTML;
  889. }
  890. if(!title)title=document.title;
  891. var m='mailto:?subject='+encodeURIComponent(title)+'&body='+encodeURIComponent(url);
  892. /* _gaq.push(['_trackSocial', 'mail', 'mail', url]);*/
  893. ga('send','social', 'mail','mail', url);
  894. window.open(m);
  895. }
  896. function doHelpMail(){
  897. var url = appendPageForm(location.href,'share');
  898. var tpar = getElementsByAttribute(document,'*','property','term:title');
  899. var title="";
  900. if(tpar.length>0){
  901. title=tpar[0].innerHTML;
  902. }
  903. if(!title)title=document.title;
  904. var m='mailto:' + uicoreConfig.helpemail +'?subject='+encodeURIComponent(title)+'&body='+encodeURIComponent(url);
  905. /* _gaq.push(['_trackSocial', 'mail', 'mail', url]);*/
  906. ga('send','social', 'mail','help', url);
  907. window.open(m);
  908. }
  909. function doTumblrClip(){
  910. var content = document.getElementById("content");
  911. var tpar = getElementsByAttribute(document,'h2','property','term:title');
  912. var dpar = getElementsByAttribute(document,'p','property','term:description');
  913. var url = appendPageForm(location.href,'share');
  914. var ttype='';
  915. var title="";
  916. if(tpar.length>0){
  917. title=tpar[0].innerHTML;
  918. }
  919. if(!title)title=document.title;
  920. var description="";
  921. if(dpar.length>0){
  922. description=dpar[0].innerHTML;
  923. }
  924. var tumblr_url;
  925. var tumblr_photo_source = "";
  926. var tumblr_photo_caption = "";
  927. if(description){
  928. tumblr_photo_caption = description;
  929. }
  930. else {
  931. tumblr_photo_caption = title;
  932. }
  933. if(content){
  934. if(content.getElementsByTagName('link').length>0){
  935. tumblr_photo_source = content.getElementsByTagName('link')[0].figureimage.src;
  936. }
  937. }
  938. else {
  939. var figimg = getFigureImage(document);
  940. if(figimg)tumblr_photo_source = figimg.src;
  941. }
  942. var tumblr_photo_click_thru = url;
  943. if(tumblr_photo_source){
  944. ttype='photo';
  945. tumblr_url = "//www.tumblr.com/share/photo?source=" + encodeURIComponent(tumblr_photo_source) + "&caption=" + encodeURIComponent(tumblr_photo_caption) + "&clickthru=" + encodeURIComponent(tumblr_photo_click_thru);
  946. }
  947. else {
  948. ttype='link';
  949. var tumblr_link_url = url;
  950. var tumblr_link_name = title;
  951. var tumblr_link_description = description;
  952. tumblr_url = "//www.tumblr.com/share/link?url=" + encodeURIComponent(tumblr_link_url) + "&name=" + encodeURIComponent(tumblr_link_name) + "&description=" + encodeURIComponent(tumblr_link_description);
  953. }
  954. /* _gaq.push(['_trackSocial', 'tumblr', ttype , url]);*/
  955. ga('send','social', 'tumblr',ttype, url);
  956. window.open(tumblr_url);
  957. }
  958. function doTumblrClipElement(evt){
  959. var evt = (evt) ? evt : ((event) ? event : null );
  960. var it = (evt.currentTarget) ? evt.currentTarget : this;
  961. var figimg = getFigureImage(it.clipthis);
  962. var content = document.getElementById("content");
  963. var tpar = getElementsByAttribute(document,'h2','property','term:title');
  964. var dpar = getElementsByAttribute(document,'p','property','term:description');
  965. var url = appendPageForm(location.href,'share');
  966. var ttype='';
  967. var title="";
  968. if(tpar.length>0){
  969. title=tpar[0].innerHTML;
  970. }
  971. if(!title)title=document.title;
  972. var description="";
  973. if(dpar.length>0){
  974. description=dpar[0].innerHTML;
  975. }
  976. var tumblr_url;
  977. var tumblr_photo_source = "";
  978. var tumblr_photo_caption = "";
  979. if(description){
  980. tumblr_photo_caption = description;
  981. }
  982. else {
  983. tumblr_photo_caption = title;
  984. }
  985. if(figimg && figimg.src){
  986. tumblr_photo_source = figimg.src
  987. }
  988. var tumblr_photo_click_thru = url;
  989. if(tumblr_photo_source){
  990. ttype='photo';
  991. tumblr_url = "//www.tumblr.com/share/photo?source=" + encodeURIComponent(tumblr_photo_source) + "&caption=" + encodeURIComponent(tumblr_photo_caption) + "&clickthru=" + encodeURIComponent(tumblr_photo_click_thru);
  992. }
  993. else {
  994. ttype='link';
  995. var tumblr_link_url = url;
  996. var tumblr_link_name = title;
  997. var tumblr_link_description = description;
  998. tumblr_url = "//www.tumblr.com/share/link?url=" + encodeURIComponent(tumblr_link_url) + "&name=" + encodeURIComponent(tumblr_link_name) + "&description=" + encodeURIComponent(tumblr_link_description);
  999. }
  1000. /* _gaq.push(['_trackSocial', 'tumblr', ttype , url]);*/
  1001. ga('send','social', 'tumblr',ttype, url);
  1002. window.open(tumblr_url);
  1003. }
  1004. function homelinkclick(evt){
  1005. var evt = (evt) ? evt : ((event) ? event : null );
  1006. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1007. var myurl;
  1008. var homelinks=getElementsByAttribute(document,'link','rel','home');
  1009. if(homelinks.length == 1){
  1010. myurl=homelinks[0].href;
  1011. document.location.href=myurl;
  1012. }
  1013. else if(homelinks.length == 0){
  1014. myurl="http://iri.columbia.edu/";
  1015. document.location.href=myurl;
  1016. }
  1017. }
  1018. function doEvernoteClip(){
  1019. var clipargs = {};
  1020. clipargs.contentId = 'content';
  1021. clipargs.url = appendPageForm(location,'share');
  1022. clipargs.filter= function (arg){
  1023. if(!(arg.className == 'imagecontrols' || arg.className.indexOf('dlcontrol')>=0 || arg.style.visibility=='hidden')){
  1024. return arg;
  1025. }
  1026. };
  1027. /* _gaq.push(['_trackSocial', 'evernote', 'clip', clipargs.url]);*/
  1028. ga('send','social', 'evernote','clip', clipargs.url);
  1029. Evernote.doClip(clipargs);
  1030. }
  1031. function doPinterestClip(){
  1032. var tpar = getElementsByAttribute(document,'h2','property','term:title');
  1033. var dpar = getElementsByAttribute(document,'p','property','term:description');
  1034. var url = appendPageForm(location.href,'share');
  1035. var ttype='';
  1036. var title="";
  1037. if(tpar.length>0){
  1038. title=tpar[0].innerHTML;
  1039. }
  1040. if(!title)title=document.title;
  1041. var description="";
  1042. if(dpar.length>0){
  1043. description=dpar[0].innerHTML;
  1044. }
  1045. /* _gaq.push(['_trackSocial', 'Pinterest', 'clipPage']); */
  1046. ga('send','social', 'Pinterest','clipPage',location.href);
  1047. var pinterest_link_url = url;
  1048. var pinterest_link_description = title + ": " +description;
  1049. pinterest_url = "//pinterest.com/pin/create/button/?url=" + encodeURIComponent(pinterest_link_url) + "&description=" + encodeURIComponent(pinterest_link_description);
  1050. window.open(pinterest_url)
  1051. }
  1052. function doEvernoteClipElement(evt){
  1053. var evt = (evt) ? evt : ((event) ? event : null );
  1054. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1055. var clipargs = {};
  1056. clipargs.content = it.clipthis;
  1057. clipargs.url = appendPageForm(location.href,'share');
  1058. clipargs.filter= function (arg){
  1059. if(!(arg.className == 'imagecontrols' || arg.className.indexOf('dlcontrol')>=0|| arg.style.visibility=='hidden')){
  1060. return arg;
  1061. }
  1062. };
  1063. /* _gaq.push(['_trackSocial', 'evernote', 'clipelement']);*/
  1064. ga('send','social', 'evernote','clipelement',location.href);
  1065. Evernote.doClip(clipargs);
  1066. }
  1067. function doGoogleEarthClick(evt){
  1068. var evt = (evt) ? evt : ((event) ? event : null );
  1069. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1070. var sfigs=getElementsByAttribute(it.clipthis,'*','rel','iridl:hasFigure');
  1071. if(sfigs.length){
  1072. var kmlurl=sfigs[0].info['iridl:hasKML'];
  1073. var kmlclass = sfigs[0].figureimage.className.split(' ')[0];
  1074. if(kmlurl){
  1075. var linkurl = appendPageForm(location.href,'share');
  1076. var pform=document.getElementById('pageform');
  1077. pform.elements['linkurl'].value=linkurl;
  1078. submitPageForm(kmlurl,kmlclass+' linkurl','POST');
  1079. /* _gaq.push(['_trackSocial', 'googleearth', 'asKML']);*/
  1080. ga('send','social', 'googleearth','asKML',location.href);
  1081. }
  1082. }
  1083. }
  1084. function doWMSClick(evt){
  1085. var evt = (evt) ? evt : ((event) ? event : null );
  1086. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1087. var sfigs=getElementsByAttribute(it.clipthis,'*','rel','iridl:hasFigure');
  1088. if(sfigs.length){
  1089. var kmlurl=sfigs[0].info['iridl:hasWMS'];
  1090. var kmlclass = sfigs[0].figureimage.className.split(' ')[0];
  1091. if(kmlurl){
  1092. var myurl = appendPageForm(kmlurl,kmlclass);
  1093. var msga=it.parentNode.parentNode.getElementsByClassName('messagearea');
  1094. if(msga.length>0){
  1095. msga[0].innerHTML="<p>To open using WMS, enter this URL for the WMSserver</p><textarea style='width:100%;' rows=20>" + myurl + '</textarea>';
  1096. toggleClass(msga[0],'show');
  1097. }
  1098. else {
  1099. alert(myurl);
  1100. }
  1101. /* location.href=myurl; */
  1102. /* _gaq.push(['_trackSocial', 'WMS', 'asWMS']);*/
  1103. ga('send','social', 'WMS','asWMS',location.href);
  1104. }
  1105. }
  1106. }
  1107. function doGeoTiffClick(evt){
  1108. var evt = (evt) ? evt : ((event) ? event : null );
  1109. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1110. var sfigs=getElementsByAttribute(it.clipthis,'*','rel','iridl:hasFigure');
  1111. if(sfigs.length){
  1112. var kmlurl=sfigs[0].info['iridl:hasGeoTiff'];
  1113. var kmlclass = sfigs[0].figureimage.className.split(' ')[0];
  1114. if(kmlurl){
  1115. var myurl = appendPageForm(kmlurl,kmlclass);
  1116. location.href=myurl;
  1117. /* _gaq.push(['_trackSocial', 'DataDownload', 'asGeoTiff']);*/
  1118. ga('send','social', 'DataDownload','asGeoTiff',location.href);
  1119. }
  1120. }
  1121. }
  1122. function doGeoTiffPCClick(evt){
  1123. var evt = (evt) ? evt : ((event) ? event : null );
  1124. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1125. var sfigs=getElementsByAttribute(it.clipthis,'*','rel','iridl:hasFigure');
  1126. if(sfigs.length){
  1127. var kmlurl=sfigs[0].info['iridl:hasGeoTiffPaletteColor'];
  1128. var kmlclass = sfigs[0].figureimage.className.split(' ')[0];
  1129. if(kmlurl){
  1130. var myurl = appendPageForm(kmlurl,kmlclass);
  1131. location.href=myurl;
  1132. /* _gaq.push(['_trackSocial', 'DataDownload', 'asGeoTiffPC']);*/
  1133. ga('send','social', 'DataDownload','asGeoTiffPC',location.href);
  1134. }
  1135. }
  1136. }
  1137. function getFigureImage(clipthis){
  1138. var figimg;
  1139. if(!clipthis){
  1140. clipthis = document.getElementById("content");
  1141. }
  1142. if(!clipthis){
  1143. clipthis=document;
  1144. }
  1145. var sfigimgs=getElementsByAttribute(clipthis,'*','rel','iridl:hasFigureImage');
  1146. var sfigs=getElementsByAttribute(clipthis,'*','rel','iridl:hasFigure');
  1147. if(sfigimgs.length){
  1148. figimg=sfigimgs[0];
  1149. for(var i=sfigimgs.length;i--;){
  1150. if(sfigimgs[i].className.indexOf("selectedImage") >= 0){
  1151. figimg=sfigimgs[i];
  1152. }
  1153. }
  1154. }
  1155. else if(sfigs.length){
  1156. figimg=sfigs[0].figureimage;
  1157. }
  1158. else {
  1159. var sfigimgs = clipthis.getElementsByTagName('img');
  1160. var maxsize = 0;
  1161. var imax = -1;
  1162. for(var i=sfigimgs.length;i--;){
  1163. var isize = sfigimgs[i].width * sfigimgs[i].height;
  1164. if( isize >= imax){
  1165. imax = isize;
  1166. imax = i;
  1167. }
  1168. }
  1169. if(imax >= 0){
  1170. figimg = sfigimgs[imax];
  1171. }
  1172. }
  1173. return(figimg);
  1174. }
  1175. function getOnlyFigureImage(clipthis){
  1176. var figimg;
  1177. if(!clipthis){
  1178. clipthis = document.getElementById("content");
  1179. }
  1180. if(!clipthis){
  1181. clipthis=document;
  1182. }
  1183. var sfigimgs=getElementsByAttribute(clipthis,'*','rel','iridl:hasFigureImage');
  1184. var sfigs=getElementsByAttribute(clipthis,'*','rel','iridl:hasFigure');
  1185. if(sfigimgs.length){
  1186. figimg=sfigimgs[0];
  1187. for(var i=sfigimgs.length;i--;){
  1188. if(sfigimgs[i].className.indexOf("selectedImage") >= 0){
  1189. figimg=sfigimgs[i];
  1190. }
  1191. }
  1192. }
  1193. else if(sfigs.length){
  1194. figimg=sfigs[0].figureimage;
  1195. }
  1196. return(figimg);
  1197. }
  1198. function getPDFImage(clipthis){
  1199. var sfigimgs=getElementsByAttribute(clipthis,'*','rel','iridl:hasPDFImage');
  1200. var figimg;
  1201. if(sfigimgs.length){
  1202. figimg=sfigimgs[0];
  1203. for(var i=sfigimgs.length;i--;){
  1204. if(sfigimgs[i].className.indexOf("selectedImage") >= 0){
  1205. figimg=sfigimgs[i];
  1206. }
  1207. }
  1208. }
  1209. return(figimg);
  1210. }
  1211. function getPNGImage(clipthis){
  1212. var sfigimgs=getElementsByAttribute(clipthis,'*','rel','iridl:hasPNGImage');
  1213. var figimg;
  1214. if(sfigimgs.length){
  1215. figimg=sfigimgs[0];
  1216. for(var i=sfigimgs.length;i--;){
  1217. if(sfigimgs[i].className.indexOf("selectedImage") >= 0){
  1218. figimg=sfigimgs[i];
  1219. }
  1220. }
  1221. }
  1222. return(figimg);
  1223. }
  1224. function getTable(clipthis){
  1225. var sfigimgs=getElementsByAttribute(clipthis,'*','rel','iridl:hasTable');
  1226. var figimg;
  1227. if(sfigimgs.length){
  1228. figimg=sfigimgs[0];
  1229. for(var i=sfigimgs.length;i--;){
  1230. if(sfigimgs[i].parentNode.getElementsByClassName("selectedImage").length > 0){
  1231. figimg=sfigimgs[i];
  1232. }
  1233. }
  1234. }
  1235. return(figimg);
  1236. }
  1237. function doTSVClick(evt){
  1238. var evt = (evt) ? evt : ((event) ? event : null );
  1239. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1240. var figimg = getTable(it.clipthis);
  1241. if(figimg && figimg.href){
  1242. var pdfurl=figimg.href;
  1243. var pdfclass=figimg.className;
  1244. pdfurl = pdfurl.replace(/[?].*/,'') + '.tsv';
  1245. submitPageForm(pdfurl,pdfclass,'GET');
  1246. /* _gaq.push(['_trackSocial', 'DataDownload', 'asTSV']);*/
  1247. ga('send','social', 'DataDownload','asTSV',location.href);
  1248. }
  1249. }
  1250. function doHTMLClick(evt){
  1251. var evt = (evt) ? evt : ((event) ? event : null );
  1252. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1253. var figimg = getTable(it.clipthis);
  1254. if(figimg && figimg.href){
  1255. var pdfurl=figimg.href;
  1256. var pdfclass=figimg.className;
  1257. pdfurl = pdfurl.replace(/[?].*/,'') + '.html';
  1258. submitPageForm(pdfurl,pdfclass,'GET');
  1259. /* _gaq.push(['_trackSocial', 'DataDownload', 'asHTML']);*/
  1260. ga('send','social', 'DataDownload','asHTML',location.href);
  1261. }
  1262. }
  1263. function doPDFClick(evt){
  1264. var evt = (evt) ? evt : ((event) ? event : null );
  1265. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1266. var figimg = getFigureImage(it.clipthis);
  1267. if(figimg && figimg.src){
  1268. var pdfurl=figimg.src;
  1269. var pdfclass=figimg.className;
  1270. pdfurl = pdfurl.replace(/\.(gif|png|jpg)/,'.pdf');
  1271. var linkurl = appendPageForm(location.href,'share');
  1272. var pform=document.getElementById('pageform');
  1273. pform.elements['linkurl'].value=linkurl;
  1274. submitPageForm(pdfurl,pdfclass+' linkurl','POST');
  1275. ga('send','social', 'ImageDownload','asPDF',location.href);
  1276. }
  1277. }
  1278. function doPDFClickGET(evt){
  1279. var evt = (evt) ? evt : ((event) ? event : null );
  1280. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1281. var figimg = getFigureImage(it.clipthis);
  1282. if(figimg && figimg.src){
  1283. var pdfurl=figimg.src;
  1284. var pdfclass=figimg.className;
  1285. pdfurl = pdfurl.replace(/\.(gif|png|jpg)/,'.pdf');
  1286. var linkurl = appendPageForm(location.href,'share');
  1287. var pform=document.getElementById('pageform');
  1288. pform.elements['linkurl'].value=linkurl;
  1289. submitPageForm(pdfurl,pdfclass+' linkurl','GET');
  1290. }
  1291. }
  1292. function doPDFgDriveClick(evt){
  1293. var evt = (evt) ? evt : ((event) ? event : null );
  1294. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1295. var figimg = getFigureImage(it.clipthis);
  1296. if(figimg && figimg.src){
  1297. var pdfurl=figimg.src;
  1298. var pdfclass=figimg.className;
  1299. pdfurl = pdfurl.replace(/\.(gif|png|jpg)/,'.pdf');
  1300. var linkurl = appendPageForm(location.pathname,'share');
  1301. var pform=document.getElementById('pageform');
  1302. pform.elements['linkurl'].value=linkurl;
  1303. /* gapi.savetodrive.render */
  1304. var urlxml=appendPageForm(pdfurl,pdfclass+' linkurl');
  1305. gapi.savetodrive.render(it,{"src": urlxml,
  1306. "filename":document.title,
  1307. "sitename": uicoreConfig.SiteName});
  1308. }
  1309. }
  1310. function doPDFgDriveRender(it){
  1311. var figimg = getFigureImage(it.clipthis) || getTable(it.clipthis);
  1312. if(figimg && figimg.src){
  1313. var pdfurl=figimg.src;
  1314. var pdfclass=figimg.className;
  1315. pdfurl = pdfurl.replace(/\.(gif|png|jpg)/,'.pdf');
  1316. var linkurl = appendPageForm(location.pathname,'share');
  1317. var pform=document.getElementById('pageform');
  1318. pform.elements['linkurl'].value=linkurl;
  1319. /* gapi.savetodrive.render */
  1320. var urlxml=appendPageForm(pdfurl,pdfclass+' linkurl');
  1321. /* remove protocol */
  1322. /* urlxml=urlxml.replace(/^(https?:\/\/)/,'//'); */
  1323. var gDriveBlist=it.getElementsByClassName('gDriveSubButton');
  1324. var ucheck=false;
  1325. if (gDriveBlist.length){
  1326. for (var idrive=gDriveBlist.length; idrive--;){
  1327. if(gDriveBlist[idrive].getAttribute("rUrl",urlxml) == urlxml)
  1328. {ucheck=true;
  1329. gDriveBlist[idrive].setAttribute("gDriveUrl","active");
  1330. }
  1331. else
  1332. {gDriveBlist[idrive].setAttribute("gDriveUrl","standby");
  1333. }
  1334. }
  1335. }
  1336. if(!ucheck){
  1337. var gdrivespan=document.createElement('span');
  1338. gdrivespan.className="gDriveSubButton";
  1339. it.appendChild(gdrivespan);
  1340. gdrivespan.renderedUrl=urlxml;
  1341. gdrivespan.filename=document.title;
  1342. gdrivespan.sitename=uicoreConfig.SiteName;
  1343. gdrivespan.setAttribute("rUrl",urlxml);
  1344. gdrivespan.setAttribute("gDriveUrl","active");
  1345. gdrivespan.setAttribute("rendered",false);
  1346. /* gapi.savetodrive.render(gdrivespan,{"src": urlxml,
  1347. "filename":document.title,
  1348. "sitename": uicoreConfig.SiteName});
  1349. */ }
  1350. }
  1351. }
  1352. function doPDFImageClick(evt){
  1353. var evt = (evt) ? evt : ((event) ? event : null );
  1354. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1355. var figimg = getPDFImage(it.clipthis);
  1356. if(figimg && figimg.href){
  1357. var pdfurl=figimg.href;
  1358. var pdfclass=figimg.className;
  1359. var pform=document.getElementById('pageform');
  1360. submitPageForm(pdfurl,pdfclass,'GET');
  1361. ga('send','social', 'ImageDownload','asPDF',location.href);
  1362. }
  1363. }
  1364. function doPSImageClick(evt){
  1365. var evt = (evt) ? evt : ((event) ? event : null );
  1366. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1367. var figimg = getPSImage(it.clipthis);
  1368. if(figimg && figimg.href){
  1369. var pdfurl=figimg.href;
  1370. var pdfclass=figimg.className;
  1371. var pform=document.getElementById('pageform');
  1372. submitPageForm(pdfurl,pdfclass,'GET');
  1373. ga('send','social', 'ImageDownload','asPS',location.href);
  1374. }
  1375. }
  1376. function doPNGImageClick(evt){
  1377. var evt = (evt) ? evt : ((event) ? event : null );
  1378. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1379. var figimg = getPNGImage(it.clipthis);
  1380. if(figimg && figimg.href){
  1381. var pdfurl=figimg.href;
  1382. var pdfclass=figimg.className;
  1383. var pform=document.getElementById('pageform');
  1384. submitPageForm(pdfurl,pdfclass,'GET');
  1385. ga('send','social', 'ImageDownload','asPNG',location.href);
  1386. }
  1387. }
  1388. function doPinterestClipElement(evt){
  1389. var evt = (evt) ? evt : ((event) ? event : null );
  1390. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1391. var figimg = getFigureImage(it.clipthis);
  1392. if(figimg && figimg.src){
  1393. var pinurl=figimg.src;
  1394. var pinclass=figimg.className;
  1395. var linkurl = appendPageForm(location.href,'share');
  1396. pinrul = pinurl.replace(/[/]expert[/]/,'/');
  1397. pinurl = pinurl.substr(0,8) + pinurl.substring(8).replace(/[/][/]([^/+]+)/g,function(match){
  1398. return '(' + match.substring(2,match.length) + ')cvn';
  1399. });
  1400. var tpar = getElementsByAttribute(document,'h2','property','term:title');
  1401. var dpar = getElementsByAttribute(document,'p','property','term:description')
  1402. var title="";
  1403. if(tpar.length>0){
  1404. title=tpar[0].innerHTML;
  1405. }
  1406. if(!title)title=document.title;
  1407. var description="";
  1408. if(dpar.length>0){
  1409. description=dpar[0].innerHTML;
  1410. }
  1411. var pinterest_link_description = title + ": " +description;
  1412. /* _gaq.push(['_trackSocial', 'Pinterest', 'clipelement']);*/
  1413. ga('send','social', 'Pinterest','clipelement',location.href);
  1414. pinterest_url = "//pinterest.com/pin/create/button/?url=" + encodeURIComponent(linkurl) + "&media=" + encodeURIComponent(pinurl) + "&description=" + encodeURIComponent(pinterest_link_description);
  1415. window.open(pinterest_url);
  1416. }
  1417. }
  1418. function doIRIFClipElement(evt){
  1419. var evt = (evt) ? evt : ((event) ? event : null );
  1420. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1421. var figimg = getFigureImage(it.clipthis);
  1422. var pinurl;
  1423. var pinclass;
  1424. if(figimg && figimg.src){
  1425. pinurl=figimg.src;
  1426. pinclass=figimg.className;
  1427. }
  1428. var linkurl = appendPageForm(location.href,'share');
  1429. var tpar = getElementsByAttribute(document,'h2','property','term:title');
  1430. var dpar = getElementsByAttribute(document,'p','property','term:description')
  1431. var title="";
  1432. if(tpar.length>0){
  1433. title=tpar[0].innerHTML;
  1434. }
  1435. if(!title)title=document.title;
  1436. var description="";
  1437. if(dpar.length>0){
  1438. description=dpar[0].innerHTML;
  1439. }
  1440. var pinterest_link_description = title + ": " +description;
  1441. /* _gaq.push(['_trackSocial', 'Pinterest', 'clipelement']);*/
  1442. ga('send','social', 'IRIForum','clipelement',location.href);
  1443. pinterest_url = "http://forums.climate-services.org/RemotePosts/post_dl.php?link=" + encodeURIComponent(linkurl);
  1444. if(pinurl){
  1445. pinterest_url = pinterest_url + "&image=" + encodeURIComponent(pinurl);
  1446. }
  1447. pinterest_url = pinterest_url + "&title=" + encodeURIComponent(pinterest_link_description) + "&start=true";
  1448. window.open(pinterest_url);
  1449. }
  1450. function doFigureImageClick(evt){
  1451. var evt = (evt) ? evt : ((event) ? event : null );
  1452. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1453. var figimg = it;
  1454. toggleClass(figimg,'selectedImage');
  1455. var mydlimage = figimg.mydlimage;
  1456. var sfigs = getElementsByAttribute(mydlimage,'*','rel','iridl:hasFigureImage');
  1457. if(sfigs.length){
  1458. for(var i= sfigs.length;i--;){
  1459. if(sfigs[i] != figimg){
  1460. removeClass(sfigs[i],'selectedImage');
  1461. }
  1462. }
  1463. }
  1464. }
  1465. function doGifClick(evt){
  1466. var evt = (evt) ? evt : ((event) ? event : null );
  1467. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1468. var figimg = getFigureImage(it.clipthis);
  1469. if(figimg && figimg.src){
  1470. var pdfurl=figimg.src;
  1471. var pdfclass=figimg.className;
  1472. submitPageForm(pdfurl,pdfclass,'GET');
  1473. /* _gaq.push(['_trackSocial', 'ImageDownload', 'asGIF']);*/
  1474. ga('send','social', 'ImageDownload', 'asGIF',location.href);
  1475. }
  1476. }
  1477. function doPngClick(evt){
  1478. var evt = (evt) ? evt : ((event) ? event : null );
  1479. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1480. var figimg = getFigureImage(it.clipthis);
  1481. if(figimg && figimg.src){
  1482. var pdfurl=figimg.src;
  1483. var pdfurl = figimg.src.replace(/.gif/,'.png');
  1484. var pdfclass=figimg.className;
  1485. submitPageForm(pdfurl,pdfclass,'GET');
  1486. ga('send','social', 'ImageDownload', 'asPNG',location.href);
  1487. }
  1488. }
  1489. function doJpgClick(evt){
  1490. var evt = (evt) ? evt : ((event) ? event : null );
  1491. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1492. var figimg = getFigureImage(it.clipthis);
  1493. if(figimg && figimg.src){
  1494. var pdfurl = figimg.src.replace(/.gif/,'.jpg');
  1495. var pdfclass = figimg.className;
  1496. submitPageForm(pdfurl,pdfclass,'GET');
  1497. /* _gaq.push(['_trackSocial', 'ImageDownload', 'asJPG']);*/
  1498. ga('send','social', 'ImageDownload', 'asJPG',location.href);
  1499. }
  1500. }
  1501. function doarcgisClick(evt){
  1502. var evt = (evt) ? evt : ((event) ? event : null );
  1503. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1504. var sfigs=getElementsByAttribute(it.clipthis,'*','rel','iridl:hasFigure');
  1505. if(sfigs.length){
  1506. var kmlurl=sfigs[0].info['iridl:hasWMS'];
  1507. var kmlclass = sfigs[0].figureimage.className.split(' ')[0];
  1508. if(kmlurl){
  1509. var myurl = appendPageForm(kmlurl,kmlclass);
  1510. var msga=it.parentNode.parentNode.getElementsByClassName('messagearea');
  1511. if(msga.length>0){
  1512. msga[0].innerHTML="<p>To open directly in ArcGIS using WMS, use menus Add Data -> Add GISserver -> WMSserver, and enter this URL</p><textarea style='width:100%;' rows=20>" + myurl + '</textarea><p>Alternatively, choose a GeoTiff option under the download button <span class="dlimagecontrol download" title="Download"></span> to download an image ArcGIS can read';
  1513. toggleClass(msga[0],'show');
  1514. }
  1515. else {
  1516. alert("To open in ArcGIS, use menus Add Data -> Add GISserver -> WMSserver, and enter this URL\n\n" + myurl);
  1517. }
  1518. /* location.href=myurl; */
  1519. /* _gaq.push(['_trackSocial', 'arcgis', 'asWMS']);*/
  1520. ga('send','social', 'arcgis', 'asWMS',location.href);
  1521. }
  1522. }
  1523. }
  1524. /* short url -- remove https? and server -- also remove /expert if not needed
  1525. */
  1526. function shorturl(url){
  1527. var nohttpmach = new RegExp("^(https?://[^/]+)?(.*)$");
  1528. var noneedexpert = new RegExp("^(/expert/[^/])");
  1529. var myurl;
  1530. myurl=url.match (nohttpmach)[2];
  1531. if(myurl.match (noneedexpert)){
  1532. myurl=myurl.substr(7);
  1533. }
  1534. return myurl;
  1535. }
  1536. function docutandpasteClick(evt){
  1537. var evt = (evt) ? evt : ((event) ? event : null );
  1538. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1539. var sfigs=getElementsByAttribute(it.clipthis,'*','rel','iridl:hasFigure');
  1540. var nohttp = new RegExp("^(https?:)?(.*)$");
  1541. if(sfigs.length){
  1542. var myurl = sfigs[0].href;
  1543. var iconurl=sfigs[0].info['iridl:icon'];
  1544. var msga=it.parentNode.parentNode.getElementsByClassName('messagearea');
  1545. if(msga.length>0){
  1546. var mymsg="<p>To add this widget to a web page, cut-and-paste this code</p><textarea style='width:100%;' rows=20><script type=\"text/javascript\" src=\"" + scriptroot.match (nohttp)[2] + 'insertui.js\"></script>\n';
  1547. if(iconurl){
  1548. mymsg = mymsg + '<link rel="term:icon" href="' + iconurl + '" />\n';
  1549. }
  1550. mymsg=mymsg + "<fieldset class=\"dlimage\">\n<a rel=\"iridl:hasFigure\" href=\"" + shorturl(myurl) + '\">visit site</a>\n';
  1551. var figs = sfigs[0].parentNode.getElementsByTagName('img');
  1552. for (var i=0 ; i < figs.length ; i++){
  1553. if(figs[i].parentNode == sfigs[0].parentNode){
  1554. var figclass = figs[i].className.split(' ')[0];
  1555. var myfigurl = appendPageForm(figs[i].src,figclass + '&share')
  1556. mymsg = mymsg + '<img class=\"' + figclass + '\" src=\"' + shorturl(myfigurl) + '\" />\n';
  1557. }
  1558. }
  1559. mymsg = mymsg + '</fieldset></textarea>';
  1560. mymsg = mymsg + '<p>The script line insures that the needed css and javascript files are included and should be omitted if they are already there. The term:icon link is purely informative and is used as metadata in building a collection of map room pages. The fieldset element is the actual widget.';
  1561. msga[0].innerHTML=mymsg;
  1562. toggleClass(msga[0],'show');
  1563. }
  1564. /* location.href=myurl; */
  1565. /* _gaq.push(['_trackSocial', 'arcgis', 'asWMS']);*/
  1566. ga('send','social', 'ImageDownload', 'asWidget',location.href);
  1567. }
  1568. }
  1569. function readwithiframe(slhref,s,readfn){
  1570. var iframe=document.getElementById('sectioniframe');
  1571. if(!iframe) {
  1572. iframe = document.createElement('iframe');
  1573. iframe.id='sectioniframe';
  1574. iframe.style.display="none";
  1575. iframe.onload = readfn;
  1576. s.appendChild(iframe);
  1577. }
  1578. iframe.src=slhref;
  1579. }
  1580. function getXMLhttp(){
  1581. var xmlhttp;
  1582. if (window.XMLHttpRequest)
  1583. {// code for IE7+, Firefox, Chrome, Opera, Safari
  1584. xmlhttp=new XMLHttpRequest();
  1585. }
  1586. else
  1587. {// code for IE6, IE5
  1588. xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  1589. }
  1590. return xmlhttp;
  1591. }
  1592. function preload(href){
  1593. var xmlhttp=getXMLhttp();
  1594. xmlhttp.onreadystatechange=function(evt) {
  1595. var evt = (evt) ? evt : ((event) ? event : null );
  1596. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1597. if (it.readyState==4) {
  1598. }
  1599. }
  1600. xmlhttp.myevtfn=xmlhttp.onreadystatechange;
  1601. xmlhttp.open("GET",href,true);
  1602. xmlhttp.send();
  1603. }
  1604. function getLanguageFrom(href){
  1605. var xmlhttp=getXMLhttp();
  1606. xmlhttp.onreadystatechange=function(evt) {
  1607. var evt = (evt) ? evt : ((event) ? event : null );
  1608. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1609. if(it.readyState == 4){
  1610. if(it.status == 200){
  1611. var jsontxt = it.responseText;
  1612. var info=JSON.parse(jsontxt);
  1613. var plang = info['uicore:lang'];
  1614. if(plang){
  1615. var myform=document.getElementById('pageform');
  1616. if(myform){
  1617. var lang=myform.elements['lang'];
  1618. var slang=myform.elements['Set-Language'];
  1619. if(lang.value != plang && ( !slang || (slang && !slang.value))){
  1620. var s=document.getElementById('chooseLanguage');
  1621. var sel=s.getElementsByTagName('select')[0];
  1622. sel.value = plang;
  1623. if(sel.selectedIndex<0){
  1624. sel.value=lang.value;
  1625. }
  1626. lang.value=sel.options[sel.selectedIndex].value;
  1627. }
  1628. }
  1629. }
  1630. }
  1631. }
  1632. };
  1633. xmlhttp.myevtfn=xmlhttp.onreadystatechange;
  1634. xmlhttp.open("GET",localHrefOf(href),true);
  1635. xmlhttp.send();
  1636. }
  1637. function readwithxmlhttp(slhref,sel){
  1638. var xmlhttp=getXMLhttp();
  1639. xmlhttp.mysel=sel;
  1640. xmlhttp.onreadystatechange = function(evt) {
  1641. var evt = (evt) ? evt : ((event) ? event : null );
  1642. var xmlhttp = (evt.currentTarget) ? evt.currentTarget : this;
  1643. if(xmlhttp.readyState == 4){
  1644. var xmlDoc;
  1645. // used to test on xmlDoc, but explorer did not work, so now I parse
  1646. if(true){
  1647. if(window.DOMParser){
  1648. parser= new DOMParser();
  1649. xmlDoc=parser.parseFromString(xmlhttp.responseText,"text/xml");
  1650. }
  1651. else {
  1652. xmlDoc= new ActiveXObject("Microsoft.XMLDOM");
  1653. xmlDoc.async=false;
  1654. /* IE8 gets confused by either the doctype or the ?xml, so we skip it */
  1655. xmlDoc.loadXML(xmlhttp.responseText.substr(xmlhttp.responseText.indexOf('<html')));
  1656. if(xmlDoc.parseError.reason){
  1657. alert(xmlDoc.parseError.reason + ' on ' + xmlDoc.parseError.line);
  1658. alert(xmlhttp.responseText);
  1659. }
  1660. }
  1661. }
  1662. dofinishchooseSection(xmlhttp.mysel,xmlDoc);
  1663. }
  1664. };
  1665. xmlhttp.myevtfn=xmlhttp.onreadystatechange;
  1666. xmlhttp.open("GET",slhref,true);
  1667. xmlhttp.send();
  1668. }
  1669. function getElementsByAttribute(oElm, strTagName, strAttributeName, strAttributeValue){
  1670. var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
  1671. var arrReturnElements = new Array();
  1672. var oAttributeValue = (typeof strAttributeValue != "undefined")? new RegExp("(^|\\s)" + strAttributeValue + "(\\s|$)", "i") : null;
  1673. var oCurrent;
  1674. var oAttribute;
  1675. for(var i=0; i<arrElements.length; i++){
  1676. oCurrent = arrElements[i];
  1677. oAttribute = oCurrent.getAttribute && oCurrent.getAttribute(strAttributeName);
  1678. if(typeof oAttribute == "string" && oAttribute.length > 0){
  1679. if(typeof strAttributeValue == "undefined" || (oAttributeValue && oAttributeValue.test(oAttribute))){
  1680. arrReturnElements.push(oCurrent);
  1681. }
  1682. }
  1683. }
  1684. return arrReturnElements;
  1685. }
  1686. function insertchooseSection(){
  1687. var s=document.getElementById('chooseSection');
  1688. var sl=document.getElementById('toSectionList');
  1689. var titleobj=getElementsByAttribute(document,'*','property','term:title')[0];
  1690. if (s && sl && titleobj){
  1691. var sels=s.getElementsByTagName('select');
  1692. if(sels.length < 1){
  1693. var sel=document.createElement('span');
  1694. sel.className='selectvalue';
  1695. sel.onclick=selectvalueclick;
  1696. sel.onclickFn=selectvalueclick;
  1697. sel.innerHTML=titleobj.innerHTML;
  1698. sel.setAttribute('value',titleobj.innerHTML);
  1699. s.appendChild(sel);
  1700. sel=document.createElement('select');
  1701. sel.name="mapsel";
  1702. sel.onchange=dosectionsel;
  1703. sel.id='mapselect';
  1704. var slhref=sl.getElementsByTagName('a')[0].href;
  1705. slhref=addLanguageVar(localHrefOf(slhref));
  1706. s.appendChild(sel);
  1707. if(slhref){
  1708. var lin = slhref.lastIndexOf('/');
  1709. if(lin){
  1710. sel.hrefroot=slhref.substr(0,lin+1);
  1711. }else {
  1712. sel.hrefroot=slhref;
  1713. }
  1714. if(slhref.substring(0,4) == "http"){
  1715. readwithxmlhttp(slhref,sel);
  1716. }
  1717. else {
  1718. // otherwise permissions prevent us from reading the file
  1719. /* faking select when read from a file */
  1720. var stitle=getElementsByAttribute(document,'*','property','term:title');
  1721. if(stitle.length > 0){
  1722. var opt = document.createElement('option');
  1723. opt.innerHTML=stitle[0].innerHTML;
  1724. opt.value="";
  1725. sel.appendChild(opt);
  1726. }
  1727. }
  1728. }
  1729. }
  1730. }
  1731. }
  1732. function updateHasSectionList(selectlink){
  1733. var s=document.getElementById('chooseSection');
  1734. var sl=document.getElementById('toSectionList');
  1735. var titleobj=getElementsByAttribute(document,'*','property','term:title')[0];
  1736. if (s && sl && titleobj){
  1737. var sels=s.getElementsByTagName('select');
  1738. if(sels.length > 0){
  1739. var sel=sels[0];
  1740. var slhref=selectlink.href;
  1741. if(slhref){
  1742. var lin = slhref.lastIndexOf('/');
  1743. if(lin){
  1744. sel.hrefroot=slhref.substr(0,lin+1);
  1745. }else {
  1746. sel.hrefroot=slhref;
  1747. }
  1748. if(slhref.substring(0,4) == "http"){
  1749. readwithxmlhttp(slhref,sel);
  1750. }
  1751. }
  1752. }
  1753. }
  1754. }
  1755. function previousElement(mynode){
  1756. if(mynode.previousSibling && mynode.previousSibling.nodeType == 3){
  1757. return previousElement(mynode.previousSibling);
  1758. }
  1759. else {
  1760. return mynode.previousSibling;
  1761. }
  1762. }
  1763. function finishchooseSectioniframe(){
  1764. var iframe=document.getElementById('sectioniframe');
  1765. var sel=document.getElementById('mapselect');
  1766. var xmlDoc = iframe.contentDocument;
  1767. dofinishchooseSection(sel,xmlDoc);
  1768. }
  1769. function dofinishchooseSection(sel,xmlDoc){
  1770. var opts = sel.options;
  1771. for (var i=opts.length; i>0 ; i--){
  1772. sel.remove(opts[i]);
  1773. }
  1774. //removes sections as well if needed
  1775. while (sel.firstChild) {
  1776. sel.removeChild(sel.firstChild);
  1777. }
  1778. if(xmlDoc){
  1779. var itemlist;
  1780. if(xmlDoc.getElementsByClassName){
  1781. itemlist=xmlDoc.getElementsByClassName('item');
  1782. }
  1783. else {
  1784. var mynodes = xmlDoc.documentElement.getElementsByTagName('div');
  1785. var oAttributeValue = 'item';
  1786. itemlist=new Array;
  1787. for (var i = 0; i<mynodes.length ; i++){
  1788. var oCurrent = mynodes[i];
  1789. var oAttribute = oCurrent.getAttribute('class');
  1790. if(typeof oAttribute == "string" && oAttribute.length > 0){
  1791. if(oAttributeValue.indexOf(oAttribute)>=0){
  1792. itemlist.push(oCurrent);
  1793. }
  1794. }
  1795. }
  1796. }
  1797. var og=sel;
  1798. if(itemlist.length>0){
  1799. for (var i = 0; i<itemlist.length ; i++){
  1800. var item=itemlist[i];
  1801. if(previousElement(item) && previousElement(item).getAttribute('class') == 'itemGroup'){
  1802. og=document.createElement('optgroup');
  1803. var petext = previousElement(item).innerHTML ? previousElement(item).innerHTML : previousElement(item).text;
  1804. og.label=petext;
  1805. sel.appendChild(og);
  1806. }
  1807. var anc =item.getElementsByTagName('div')[0].getElementsByTagName('a')[0];
  1808. var anctext = anc.innerHTML? anc.innerHTML : anc.text;
  1809. var ancclass = anc.getAttribute('class');
  1810. var anchref = anc.getAttribute('href');
  1811. if(ancclass){optValue=anchref + '@' + ancclass;}
  1812. else {
  1813. optValue = anchref;
  1814. }
  1815. var opt= new Option(anctext,optValue,false,false);
  1816. var fullpathname = document.location.href;
  1817. if(fullpathname.indexOf("?") >=0){
  1818. fullpathname = fullpathname.substring(0,fullpathname.indexOf("?"));
  1819. }
  1820. if(fullpathname.indexOf("#") >= 0){
  1821. fullpathname = fullpathname.substring(0,fullpathname.indexOf("#"));
  1822. }
  1823. var altpathname = fullpathname + 'index.html';
  1824. if (sel.hrefroot + anchref == fullpathname || sel.hrefroot + anchref == altpathname){
  1825. opt.selected=true;
  1826. }
  1827. /* IE8 has strange optgroup behavior */
  1828. if(!IE8){
  1829. og.appendChild(opt);
  1830. }else
  1831. sel.add(opt);
  1832. }
  1833. if(typeof(sel.selectedIndex) === 'number'){
  1834. if(sel.options[sel.selectedIndex].parentNode.label){
  1835. sel.parentNode.getElementsByTagName('legend')[0].innerHTML=sel.options[sel.selectedIndex].parentNode.label;
  1836. }
  1837. sel.previousSibling.innerHTML=sel.options[sel.selectedIndex].innerHTML;
  1838. }
  1839. }
  1840. }
  1841. else alert("cannot parse")
  1842. }
  1843. function insertRegion(){
  1844. var theregion=document.getElementById("chooseRegion");
  1845. if(theregion){
  1846. var sel=theregion.getElementsByTagName('select');
  1847. if (sel.length != 0){
  1848. sel=sel[0];
  1849. sel.onchange=regiononchange;
  1850. }
  1851. else {
  1852. sel=document.createElement('span');
  1853. sel.className='selectvalue';
  1854. sel.onclick=selectvalueclick;
  1855. sel.onclickFn=selectvalueclick;
  1856. sel.innerHTML='Global';
  1857. sel.setAttribute('value','Global');
  1858. theregion.appendChild(sel);
  1859. sel=document.createElement('select');
  1860. sel.size=1;
  1861. sel.name="bbox";
  1862. sel.className='pageformcopy';
  1863. sel.onchange=regiononchange;
  1864. var optgrp=document.createElement('optgroup');
  1865. optgrp.label="Region";
  1866. var opt = document.createElement('option');
  1867. opt.value="bb:-20:-40:55:40:bb";
  1868. opt.innerHTML="Africa";
  1869. optgrp.appendChild(opt);
  1870. opt = document.createElement('option');
  1871. opt.value="bb:40:-10:170:75:bb";
  1872. opt.innerHTML="Asia";
  1873. optgrp.appendChild(opt);
  1874. opt = document.createElement('option');
  1875. opt.value="bb:100:-55:180:0:bb";
  1876. opt.innerHTML="Australia";
  1877. optgrp.appendChild(opt);
  1878. opt = document.createElement('option');
  1879. opt.value="bb:-20:35:40:75:bb";
  1880. opt.innerHTML="Europe";
  1881. optgrp.appendChild(opt);
  1882. opt = document.createElement('option');
  1883. opt.value="bb:10:15:75:45:bb";
  1884. opt.innerHTML="Middle East";
  1885. optgrp.appendChild(opt);
  1886. opt = document.createElement('option');
  1887. opt.value="bb:-170:15:-40:75:bb";
  1888. opt.innerHTML="North America";
  1889. optgrp.appendChild(opt);
  1890. opt = document.createElement('option');
  1891. opt.value="bb:-100:0:-70:35:bb";
  1892. opt.innerHTML="Central America";
  1893. optgrp.appendChild(opt);
  1894. opt = document.createElement('option');
  1895. opt.value="bb:-90:-60:-30:15:bb";
  1896. opt.innerHTML="South America";
  1897. optgrp.appendChild(opt);
  1898. opt = document.createElement('option');
  1899. opt.value="bb:100:-60:300:60:bb";
  1900. opt.innerHTML="Pacific";
  1901. optgrp.appendChild(opt);
  1902. opt = document.createElement('option');
  1903. opt.value="";
  1904. opt.selected="selected";
  1905. opt.innerHTML="Global";
  1906. optgrp.appendChild(opt);
  1907. sel.appendChild(optgrp);
  1908. theregion.appendChild(sel);
  1909. }
  1910. }
  1911. }
  1912. var regionIsWithinBbox = false;
  1913. function setregionwithinbbox(mydisplay,doflags){
  1914. var thebody = document.getElementsByTagName('body')[0];
  1915. if(!mydisplay){
  1916. if(doflags){
  1917. regionIsWithinBbox = false;
  1918. }
  1919. else {
  1920. removeClass(thebody,'regioniswithinbbox');
  1921. }
  1922. }
  1923. else {
  1924. if(doflags){
  1925. regionIsWithinBbox = true;
  1926. }
  1927. else {
  1928. appendMissingClass(thebody,'regioniswithinbbox');
  1929. }
  1930. }
  1931. }
  1932. function regiononchange(evt){
  1933. var evt = (evt) ? evt : ((event) ? event : null );
  1934. var it = (evt.currentTarget) ? evt.currentTarget : evt.srcElement;
  1935. /* updates selectvalue element*/
  1936. it.previousSibling.innerHTML=it.options[it.selectedIndex].innerHTML;
  1937. it.previousSibling.setAttribute('value',it.options[it.selectedIndex].value);
  1938. var pform=document.getElementById('pageform');
  1939. if(pform){
  1940. if(it.name == 'bbox'){
  1941. var myin = pform.elements['region'];
  1942. if(myin){
  1943. if(it.options[it.selectedIndex].value){
  1944. myin.value = it.options[it.selectedIndex].value
  1945. }
  1946. else {
  1947. myin.value="";
  1948. }
  1949. }
  1950. var myin = pform.elements['clickpt'];
  1951. if(myin){
  1952. myin.value="";
  1953. }
  1954. }
  1955. if(pform.elements[it.name]){
  1956. pform.elements[it.name].value=it.options[it.selectedIndex].value;
  1957. updatePageForm();
  1958. }
  1959. }
  1960. }
  1961. function pageformcopyonchange(evt){
  1962. var evt = (evt) ? evt : ((event) ? event : null );
  1963. var it = (evt.currentTarget) ? evt.currentTarget : this;
  1964. var pform=document.getElementById('pageform');
  1965. if(pform){
  1966. var elbyname = pform.elements[it.name];
  1967. if(elbyname){
  1968. var changed = "";
  1969. if(it.options){
  1970. changed = pform.elements[it.name];
  1971. if(changed.length){
  1972. /* multivalued but not checkbox -- copy first
  1973. unless data-nameindex is set */
  1974. var ind = 0;
  1975. var myind = it.getAttribute('data-nameindex');
  1976. if(myind){ind = myind};
  1977. changed[ind].value=it.options[it.selectedIndex].value;
  1978. }
  1979. else {
  1980. changed.value=it.options[it.selectedIndex].value;
  1981. }
  1982. }
  1983. /* no options, not a select */
  1984. else if(elbyname.length) {
  1985. /* multivalued copy -- hopefully checkbox */
  1986. if(elbyname[0].type == 'checkbox'){
  1987. /* multivalued copy -- checkbox */
  1988. for(var j = elbyname.length; j-- ;){
  1989. if(elbyname[j].value == it.value){
  1990. elbyname[j].checked = it.checked;
  1991. changed = elbyname[j];
  1992. }
  1993. }
  1994. }
  1995. else {
  1996. /* multivalued but not pageform not a checkbox
  1997. if it is a checkbox, looks for match or unset*/
  1998. if(it.type == 'checkbox'){
  1999. /* sets first unset element */
  2000. if(it.checked){
  2001. for(var j = 0 ; j< elbyname.length; j++){
  2002. if(elbyname[j].value == ''){
  2003. elbyname[j].value = it.value;
  2004. changed = elbyname[j];
  2005. break;
  2006. }
  2007. }
  2008. }
  2009. else {
  2010. /* unchecked checkbox -- unsets matching element */
  2011. for(var j = 0 ; j< elbyname.length; j++){
  2012. if(elbyname[j].value == it.value){
  2013. for(var k=j ; k< elbyname.length-1 ; k++){
  2014. elbyname[k].value=elbyname[k+1].value;
  2015. }
  2016. elbyname[elbyname.length-1].value = '';
  2017. changed = elbyname[j];
  2018. break;
  2019. }
  2020. }
  2021. }
  2022. }
  2023. else {
  2024. /* punts by setting first one unless data-nameindex is set */
  2025. var ind=0;
  2026. var myind = it.getAttribute('data-nameindex');
  2027. if(myind){ind = myind};
  2028. changed = pform.elements[it.name][ind];
  2029. changed.value=it.value;
  2030. }
  2031. }
  2032. }
  2033. else {
  2034. changed = pform.elements[it.name];
  2035. changed.value=it.value;
  2036. }
  2037. updatePageForm(changed);
  2038. }
  2039. }
  2040. if (it.className && it.className.indexOf('scrollToTop')){
  2041. scrollTo(0,0);
  2042. }
  2043. }
  2044. function loadHasRqlEndpoint(){
  2045. var sfigs=getElementsByAttribute(document,'*','rel','iridl:hasSparqlEndpoint');
  2046. for (var i=0 ; i<sfigs.length ; i++){
  2047. if(!sfigs[i].parentNode.parsedJSON){updateHasRqlEndpoint(sfigs[i])};
  2048. }
  2049. }
  2050. /*
  2051. The parent of the link object we call the Context.
  2052. when file is returned, if the url retrieved is still the url that the
  2053. link object points to, stores parsedJSON in the Context,
  2054. and calls runPureOnContext.
  2055. Here we call all the queries associated with a particular SparqlEndpoint
  2056. We do both iridl:hasSerqlQuery and iridl:hasSparqlQuery
  2057. */
  2058. function updateHasRqlEndpoint(myLink){
  2059. var queries=getElementsByAttribute(myLink.parentNode,'*','property','iridl:hasSerqlQuery');
  2060. for (var i=0 ; i<queries.length ; i++){
  2061. updateHasRqlQuery(myLink,queries[i],'serql');
  2062. }
  2063. var queries=getElementsByAttribute(myLink.parentNode,'*','property','iridl:hasSparqlQuery');
  2064. for (var i=0 ; i<queries.length ; i++){
  2065. updateHasRqlQuery(myLink,queries[i],'sparql');
  2066. }
  2067. }
  2068. /* RqlEndpointUrl ( endpoint query querylang varclasses varmap -- )
  2069. builds url from endpoint and Rql query. varclasses controls the
  2070. variables that can be using for single bindings -- multiple-valued
  2071. variables have to be inserted in the query. varmap allows variable
  2072. renaming in the case where the pageform variable and the query
  2073. variable cannot have precisely the same name.
  2074. querylang is serql or sparql for sesame */
  2075. function rqlEndpointUrl(endpoint,query,querylang,varclasses,varmap){
  2076. var appendurl = appendPageForm("",varclasses,true);
  2077. var myquery = query;
  2078. var myform=document.getElementById('pageform');
  2079. /* finds multivalued variables, if any */
  2080. var inlist = myform.getElementsByClassName(varclasses.replace(/loading/,''));
  2081. var multi = {};
  2082. for (var i = 0 ; i < inlist.length ; i++){
  2083. var myin = inlist[i];
  2084. if(myin.tagName == 'INPUT' && myform[myin.name].length){
  2085. if(!multi[myin.name]){multi[myin.name]=[];}
  2086. if(myin.value){multi[myin.name].push(myin.value)}
  2087. }
  2088. }
  2089. for (var key in multi){
  2090. var mylist = multi[key];
  2091. var replacewith = mylist.join(',');
  2092. var myregexp;
  2093. var newquery
  2094. if(querylang == 'serql'){
  2095. if(replacewith){
  2096. myregexp = new RegExp('([\{\,]) *' + key + ' *([\}\,])','g');
  2097. newquery = myquery.replace(myregexp,"$1" + replacewith + "$2");
  2098. }
  2099. else {
  2100. myregexp = new RegExp('((\{)|(\,)) *' + key + ' *((\})|(\,))','g');
  2101. newquery = myquery.replace(myregexp,"$2" + replacewith + "$5");
  2102. }
  2103. }
  2104. else {
  2105. /* sparql -- simple comma-separated list of values to replace ?key */
  2106. myregexp = new RegExp('[?]' + key + '([ ,.;])','g');
  2107. newquery = myquery.replace(myregexp,replacewith+ "$1");
  2108. }
  2109. myquery=newquery;
  2110. }
  2111. var localurl = endpoint + '?query=' + encodeURIComponent(myquery) + '&queryLn=' + querylang;
  2112. if(appendurl){
  2113. var vars = appendurl.substring(1).split("&");
  2114. var pair;
  2115. for (var i = 0 ; i < vars.length ; i++){
  2116. pair = vars[i].split("=");
  2117. var newvalue;
  2118. var ifid=false;
  2119. var mys = false;
  2120. if(myform[pair[0]].length) {
  2121. /* skips multi as currently no way to bind */
  2122. }
  2123. else {
  2124. /* single valued -- use variable binding */
  2125. if(myform.jsonldContext && myform.jsonldContext['@context']){
  2126. mys = myform.jsonldContext['@context'][pair[0]];
  2127. if(mys){
  2128. ifid=(mys['@type'] == '@id');
  2129. }
  2130. }
  2131. if(ifid){
  2132. newvalue = "<" + expandNS(unescape(pair[1]),myform.nsContext['@context']) + '>';
  2133. }
  2134. else {
  2135. newvalue = '"' + unescape(pair[1]) + '"';
  2136. }
  2137. var varname = pair[0];
  2138. if(varmap && varmap[varname]){
  2139. varname=varmap[varname];
  2140. }
  2141. localurl = localurl + "&" + encodeURIComponent("$" + varname ) + "=" + encodeURIComponent(newvalue);
  2142. }
  2143. }
  2144. }
  2145. return localurl;
  2146. }
  2147. var escaped_one_to_xml_special_map = {
  2148. '&amp;': '&',
  2149. '&lt;': '<',
  2150. '&gt;': '>'
  2151. };
  2152. function decodeXML(string) {
  2153. return string.replace(/(&lt;|&gt;|&amp;)/g,
  2154. function(str, item) {
  2155. return escaped_one_to_xml_special_map[item];
  2156. });
  2157. }
  2158. /* updateHasRqlQuery ( endpoint query querylang -- ) builds url
  2159. from endpoint and query and retrieves from server if necessary */
  2160. function updateHasRqlQuery(myLink,myQuery,querylang){
  2161. var xmlhttp= getXMLhttp();
  2162. var varmap = myQuery.getAttribute('data-varmap');
  2163. if(varmap){
  2164. varmap = JSON.parse(varmap);
  2165. }
  2166. if(!myQuery.cleantxt){
  2167. myQuery.cleantxt = decodeXML(myQuery.text);
  2168. }
  2169. var localurl = rqlEndpointUrl(myLink.href, myQuery.cleantxt,
  2170. querylang, myQuery.className,varmap);
  2171. /* possibly restricted use of query */
  2172. var restrictif = myQuery.getAttribute('data-if');
  2173. /* possibly restricted use of query (not) */
  2174. var restrictnotif = myQuery.getAttribute('data-notif');
  2175. /* possibly unchanged query */
  2176. var ifneeded = (myQuery.localurl != localurl);
  2177. /* check tests for query use */
  2178. if(restrictif){
  2179. if($(restrictif).length == 0){
  2180. ifneeded=false;
  2181. myQuery.localurl='';
  2182. }
  2183. }
  2184. if(restrictnotif){
  2185. if($(restrictnotif).length > 0){
  2186. ifneeded=false;
  2187. myQuery.localurl='';
  2188. }
  2189. }
  2190. /* if query is needed */
  2191. if(ifneeded){
  2192. relStartLoading(myQuery);
  2193. clearFailed(myQuery);
  2194. myQuery.localurl = localurl;
  2195. /* iridl:QueryAsText -- setup for dump of query needed */
  2196. var dumpelement=getElementsByAttribute(myLink.parentNode,'*','property','iridl:QueryAsText');
  2197. if(dumpelement.length > 0 ){
  2198. if(myLink.parentNode.loading == 1){
  2199. dumpelement[0].innerHTML='';
  2200. }
  2201. var qid = (myQuery.id) ? myQuery.id : myQuery.getAttribute('data-id');
  2202. if(qid){
  2203. dumpelement[0].innerHTML+='<p>' + qid + '</p>';
  2204. }
  2205. dumpelement[0].innerHTML+= '<pre>' + myQuery.text+'</pre>';
  2206. var appendurl = appendPageForm("",myQuery.className,true);
  2207. if(appendurl){
  2208. dumpelement[0].innerHTML=dumpelement[0].innerHTML + ' with variable bindings ' +unescape(appendurl.substring(1).replace(/&/g,' '));
  2209. }
  2210. }
  2211. dumpelement=getElementsByAttribute(myLink.parentNode,'*','property','iridl:JsonAsText');
  2212. if(dumpelement.length > 0 ){dumpelement[0].innerHTML=''}
  2213. /* setup callback for server request for query result
  2214. xmlhttp ( -- ) object containing callback
  2215. infourl ( -- ) the infourl that matches the callback when it
  2216. is returned
  2217. myContext ( -- context ) parentNode of the link i.e. the context
  2218. myLink ( -- endpoint ) the link iridl:hasSparqlEndpoint
  2219. myQuery ( -- query) the query */
  2220. xmlhttp.infourl = localurl;
  2221. xmlhttp.myContext = myLink.parentNode;
  2222. xmlhttp.myLink=myLink;
  2223. xmlhttp.myQuery=myQuery;
  2224. /* marks Context invalid */
  2225. changeClassWithin(xmlhttp.myContext,'valid','invalid');
  2226. /* sets callback function for query return */
  2227. xmlhttp.onreadystatechange = function(evt) {
  2228. var evt = (evt) ? evt : ((event) ? event : null );
  2229. var it = (evt.currentTarget) ? evt.currentTarget : this;
  2230. if(it.readyState == 4){
  2231. if(it.status == 200){
  2232. var jsontxt = it.responseText;
  2233. var parsedJSON = JSON.parse(jsontxt);
  2234. if(it.myQuery.localurl == it.infourl){
  2235. var qid = (myQuery.id) ? myQuery.id : myQuery.getAttribute('data-id');
  2236. if(qid){
  2237. if(!it.myContext.parsedJSON){
  2238. it.myContext.parsedJSON = {};
  2239. }
  2240. it.myContext.parsedJSON[qid]=parsedJSON;
  2241. }
  2242. else {
  2243. it.myContext.parsedJSON=parsedJSON;
  2244. }
  2245. var dumpelement=getElementsByAttribute(it.myContext,'*','property','iridl:JsonAsText');
  2246. /* iridl:hasJsondlFrame -- uses jsonld.frame callback to frame raw JSON */
  2247. if(it.myQuery.nextElementSibling &&
  2248. it.myQuery.nextElementSibling.getAttribute('property') ==
  2249. 'iridl:hasJsonldFrame'){
  2250. /* using jsonld.frame to process raw RDF JSON */
  2251. var frame = JSON.parse(it.myQuery.nextElementSibling.text);
  2252. var framedforPure;
  2253. jsonld.frame(parsedJSON,frame,function(err,framed){
  2254. if(err){
  2255. alert('frame returned ' + JSON.stringify(err,null,3));
  2256. }
  2257. else {
  2258. framedforPure=framed;
  2259. }
  2260. var myquery=it.myQuery;
  2261. var qid = (it.myQuery.id) ? it.myQuery.id : it.myQuery.getAttribute('data-id');
  2262. if(qid){
  2263. if(!myquery.parentNode.parsedJSON){
  2264. myquery.parentNode.parsedJSON = {};
  2265. }
  2266. myquery.parentNode.parsedJSON[qid]=framedforPure;
  2267. }
  2268. else {
  2269. myquery.parentNode.parsedJSON=framedforPure;
  2270. }
  2271. /* finish inside frame */
  2272. var dumpelement=getElementsByAttribute(myquery.parentNode,'*','property','iridl:JsonAsText');
  2273. if(dumpelement.length > 0 ){
  2274. dumpelement[0].innerHTML=JSON.stringify(myquery.parentNode.parsedJSON,null,3);}
  2275. relStopLoading(myquery);
  2276. runPureOnContext(myquery.parentNode);
  2277. updatePageFormCopies(myquery.parentNode);
  2278. validateAndCorrectPageForm(myquery.parentNode);
  2279. }
  2280. /* finishes jsonld.frame callback */
  2281. );
  2282. }
  2283. else {
  2284. /* finish without frame */
  2285. if(dumpelement.length > 0 ){
  2286. dumpelement[0].innerHTML=JSON.stringify(it.myContext.parsedJSON,null,3)}
  2287. relStopLoading(it.myQuery);
  2288. runPureOnContext(it.myContext);
  2289. updatePageFormCopies(it.myContext);
  2290. validateAndCorrectPageForm(it.myContext);
  2291. }
  2292. }
  2293. }
  2294. else {
  2295. /*failed -- stop loading */
  2296. relStopLoading(it.myQuery);
  2297. setFailed(it.myQuery, it.status, it.statusText + it.responseText);
  2298. var dumpelement=getElementsByAttribute(it.myQuery.parentNode,'*','property','iridl:JsonAsText');
  2299. if(dumpelement.length > 0 ){
  2300. dumpelement[0].innerHTML=it.statusText + it.responseText}
  2301. }
  2302. }
  2303. };
  2304. /* sets up query callback and sends async */
  2305. xmlhttp.myevtfn=xmlhttp.onreadystatechange;
  2306. xmlhttp.open("GET",xmlhttp.infourl,true);
  2307. xmlhttp.setRequestHeader("Accept","application/ld+json,application/sparql-results+json");
  2308. xmlhttp.send();
  2309. }
  2310. }
  2311. function loadHasJSON(){
  2312. var sfigs=getElementsByAttribute(document,'*','rel','iridl:hasJSON');
  2313. for (var i=0 ; i<sfigs.length ; i++){
  2314. if(!sfigs[i].parentNode.parsedJSON){updateHasJSON(sfigs[i])};
  2315. }
  2316. sfigs=getElementsByAttribute(document,'*','property','iridl:hasJSON');
  2317. for (var i=0 ; i<sfigs.length ; i++){
  2318. if(!sfigs[i].parentNode.parsedJSON){readHasJSON(sfigs[i])};
  2319. }
  2320. }
  2321. function readfileinto(url,inputelement){
  2322. var xmlhttp= getXMLhttp();
  2323. xmlhttp.infourl=url;
  2324. xmlhttp.inputelement=inputelement;
  2325. xmlhttp.onreadystatechange = function(evt) {
  2326. var evt = (evt) ? evt : ((event) ? event : null );
  2327. var it = (evt.currentTarget) ? evt.currentTarget : this;
  2328. if(it.readyState == 4){
  2329. if(it.status == 200){
  2330. var jsontxt = it.responseText;
  2331. it.inputelement.value=jsontxt;
  2332. }
  2333. else {
  2334. /* failed */
  2335. setFailed(it.inputelement, it.status, it.statusText + it.responseText);
  2336. }
  2337. }
  2338. };
  2339. xmlhttp.myevtfn=xmlhttp.onreadystatechange;
  2340. xmlhttp.open("GET",xmlhttp.infourl,true);
  2341. xmlhttp.send();
  2342. }
  2343. function readHasJSON(myScript){
  2344. var myContext=myScript.parentNode;
  2345. var jsontxt = myScript.text;
  2346. var qid = (myScript.id) ? myScript.id : myScript.getAttribute('data-id');
  2347. if(qid){
  2348. if(!myContext.parsedJSON){
  2349. myContext.parsedJSON = {};
  2350. }
  2351. myContext.parsedJSON[qid]=JSON.parse(jsontxt);
  2352. }
  2353. else {
  2354. myContext.parsedJSON=JSON.parse(jsontxt);
  2355. }
  2356. runPureOnContext(myContext);
  2357. updatePageFormCopies(myContext);
  2358. validateAndCorrectPageForm(myContext);
  2359. /* experimental connected graph support */
  2360. refreshConnectedGraphs();
  2361. }
  2362. function refreshConnectedGraphs(evt){
  2363. var graphs = document.getElementsByClassName('connectedgraph');
  2364. for (var i=0;i<graphs.length; i++){
  2365. var graph = graphs[i];
  2366. var objs = graph.getElementsByClassName('graphobject');
  2367. if(objs.length){
  2368. var tobj = objs[0];
  2369. if(!tobj.getAttribute('glevel')){
  2370. tobj.setAttribute('glevel',0);
  2371. graph.setAttribute('glevelmax',0);
  2372. }
  2373. }
  2374. //initialization loop
  2375. for (var iob=0; iob < objs.length ; iob++){
  2376. var tobj = objs[iob];
  2377. if(!tobj.getAttribute('glevel')){
  2378. var lsobj = tobj.parentNode.parentNode.parentNode;
  2379. var pgobj = $(lsobj.parentNode).children(".graphobject");
  2380. if(pgobj.length && pgobj[0].getAttribute('glevel')){
  2381. var olevel = parseInt(pgobj[0].getAttribute('glevel'));
  2382. var nlevel = ++olevel;
  2383. tobj.setAttribute('glevel',nlevel);
  2384. tobj.parentNode.setAttribute('glevel',nlevel);
  2385. olevel = parseInt(graph.getAttribute('glevelmax'));
  2386. if(nlevel > olevel){
  2387. graph.setAttribute('glevelmax',nlevel);
  2388. }
  2389. }
  2390. }
  2391. if(typeof(tobj.onmouseover) != 'function'){
  2392. tobj.onmouseover=highlightConnectedGraphs;
  2393. tobj.onmouseout=refreshConnectedGraphs;
  2394. }
  2395. }
  2396. // button setup
  2397. var canvas = graph.getElementsByTagName('canvas')[0];
  2398. var ifbut=graph.getElementsByClassName('moreglevelbutton').length;
  2399. var tlevel = graph.getAttribute('data-glevel');
  2400. var clevel = parseInt(graph.getAttribute('glevelmax'));
  2401. if(tlevel){
  2402. if(clevel>=parseInt(tlevel)){
  2403. appendMissingClass(graph,'aboveLower');
  2404. }
  2405. if(clevel>0){
  2406. appendMissingClass(graph,'belowUpper');
  2407. }
  2408. }
  2409. if(tlevel && !ifbut){
  2410. if(clevel<parseInt(tlevel)){
  2411. tlevel = clevel+1;
  2412. }
  2413. var glevelstyle = document.getElementById('glevellimit');
  2414. if(!glevelstyle){
  2415. glevelstyle = document.createElement('style');
  2416. glevelstyle.id = 'glevellimit';
  2417. var ref=document.getElementsByTagName('head')[0];
  2418. ref.appendChild(glevelstyle);
  2419. if(IE8){
  2420. document.styleSheets['glevellimit'].addRule('.var[glevel="' + tlevel + '"]',"display:none");
  2421. }
  2422. else {
  2423. glevelstyle.innerHTML = '.var[glevel="' + tlevel + '"]' + "{display:none}\n";
  2424. }
  2425. }
  2426. var gbut = document.createElement('div');
  2427. gbut.className='moreglevelbutton oneStep leftarrow';
  2428. gbut.onclick =moreglevelclick;
  2429. gbut.onclickfn=moreglevelclick;
  2430. graph.insertBefore(gbut,canvas);
  2431. gbut = document.createElement('div');
  2432. gbut.className='moreglevelbutton oneStep rightarrow';
  2433. gbut.onclick =moreglevelclick;
  2434. gbut.onclickfn=moreglevelclick;
  2435. graph.insertBefore(gbut,canvas);
  2436. }
  2437. var forcereflow=graph.offsetHeight;
  2438. // drawing setup
  2439. if(canvas.getContext){
  2440. canvas.width=canvas.clientWidth;
  2441. canvas.height=canvas.clientHeight;
  2442. var ctx;
  2443. if(canvas.ctx){
  2444. ctx=canvas.ctx;
  2445. }
  2446. else {
  2447. ctx = canvas.getContext("2d");
  2448. canvas.ctx=ctx;
  2449. }
  2450. ctx.clearRect(0, 0, canvas.width, canvas.height);
  2451. // drawing loop
  2452. for (var iob=0; iob < objs.length ; iob++){
  2453. var tobj = objs[iob];
  2454. var llist = $(tobj.parentNode).children(".lineset").children("[linefrom]");
  2455. for (var iline = 0 ; iline < llist.length ; iline++){
  2456. var lfrom = llist[iline].getAttribute('linefrom');
  2457. if(lfrom){
  2458. var fobj = document.getElementById(lfrom);
  2459. gconnect(canvas,fobj,tobj);
  2460. }
  2461. }
  2462. }
  2463. }
  2464. }
  2465. }
  2466. function highlightConnectedGraphs(evt){
  2467. var evt = (evt) ? evt : ((event) ? event : null );
  2468. var it = (evt.currentTarget) ? evt.currentTarget : this;
  2469. var graphs = document.getElementsByClassName('connectedgraph');
  2470. for (var i=0;i<graphs.length; i++){
  2471. var graph = graphs[i];
  2472. var canvas = graph.getElementsByTagName('canvas')[0];
  2473. if(canvas.getContext){
  2474. var ctx = canvas.ctx;
  2475. var tobj = it;
  2476. ctx.lineWidth=3;
  2477. var llist = $(tobj.parentNode).children(".lineset").children("[linefrom]");
  2478. for (var iline = 0 ; iline < llist.length ; iline++){
  2479. var lfrom = llist[iline].getAttribute('linefrom');
  2480. if(lfrom){
  2481. var fobj = document.getElementById(lfrom);
  2482. gconnect(canvas,fobj,tobj);
  2483. }
  2484. }
  2485. }
  2486. }
  2487. }
  2488. function gconnect(canvas,fobj,tobj){
  2489. var rLeft = absLeft(canvas);
  2490. var rTop = absTop(canvas);
  2491. var ctx = canvas.getContext("2d");
  2492. var fx = absLeft(fobj)-rLeft+fobj.clientWidth;
  2493. var fy = absTop(fobj)-rTop+fobj.clientHeight/2;
  2494. var tx = absLeft(tobj)-rLeft;
  2495. var ty = absTop(tobj)+tobj.clientHeight/2-rTop;
  2496. ctx.beginPath();
  2497. ctx.moveTo(fx, fy);
  2498. if(tx < fx){
  2499. var mx = (tx+fx)/2;
  2500. var my;
  2501. if(ty<fy){
  2502. my = (ty + fy)/2;
  2503. }
  2504. else {
  2505. my = (ty + fy + 4)/2;
  2506. }
  2507. var toff = 15;
  2508. var foff = 8;
  2509. ctx.bezierCurveTo(fx+foff,(fy+my)/2,fx+foff,my,mx,my);
  2510. ctx.bezierCurveTo(tx-toff,my,tx-toff,(2*my+ty)/3,tx,ty);
  2511. }
  2512. else {
  2513. if(Math.abs(ty-fy)>15){
  2514. var mx = (tx+fx)/2;
  2515. var my;
  2516. my = (ty + fy)/2;
  2517. var toff = 15;
  2518. var foff = 15;
  2519. ctx.bezierCurveTo(mx,fy,mx,my,mx,my);
  2520. ctx.bezierCurveTo(mx,my,mx,ty,tx,ty);
  2521. }
  2522. else {
  2523. ctx.lineTo(tx,ty);
  2524. }
  2525. }
  2526. ctx.stroke();
  2527. }
  2528. function moreglevelclick(evt){
  2529. var evt = (evt) ? evt : ((event) ? event : null );
  2530. var it = (evt.currentTarget) ? evt.currentTarget : this;
  2531. var leftarrow = (it.className.indexOf('leftarrow') >= 0);
  2532. if(leftarrow){
  2533. var tlist = $('.toggle.ui-state-active').click();
  2534. }
  2535. var gmax = parseInt(it.parentNode.getAttribute('glevelmax'));
  2536. var grule;
  2537. var glevelstyle = document.getElementById('glevellimit').sheet;
  2538. if(glevelstyle){
  2539. if(IE8){
  2540. grule = glevelstyle.rules[0];
  2541. }
  2542. else {
  2543. grule = glevelstyle.cssRules[0];
  2544. }
  2545. var glimit = parseInt(grule.selectorText.replace(/.*glevel="(.*)".*/i,"$1"));
  2546. var newlimit;
  2547. if(leftarrow){
  2548. newlimit = glimit + 1;
  2549. }
  2550. else {
  2551. newlimit = glimit - 1;
  2552. }
  2553. if(newlimit <= gmax + 1 && newlimit > 0) {
  2554. var old = grule.selectorText;
  2555. grule.selectorText='.var[glevel="' + newlimit + '"]';
  2556. if(old == grule.selectorText){
  2557. document.getElementById('glevellimit').innerHTML='.var[glevel="' + newlimit + '"]{display: none}' + "\n";
  2558. }
  2559. }
  2560. if(newlimit > gmax) {
  2561. removeClass(it.parentNode,'aboveLower');
  2562. }else {
  2563. appendMissingClass(it.parentNode,'aboveLower');
  2564. }
  2565. if(newlimit <= 1) {
  2566. removeClass(it.parentNode,'belowUpper');
  2567. } else {
  2568. appendMissingClass(it.parentNode,'belowUpper');
  2569. }
  2570. }
  2571. refreshConnectedGraphs();
  2572. }
  2573. /* reads JSON file referred to by a link object
  2574. The parent of the link object we call the Context.
  2575. when file is returned, if the url retrieved is still the url that the
  2576. link object points to, stores parsedJSON in the Context,
  2577. and calls runPureOnContext.
  2578. */
  2579. function updateHasJSON(myLink){
  2580. var xmlhttp= getXMLhttp();
  2581. var localurl = localHrefOf(myLink.href);
  2582. if(myLink.href && myLink.localurl != localurl){
  2583. relStartLoading(myLink);
  2584. clearFailed(myLink);
  2585. myLink.localurl = localurl;
  2586. xmlhttp.infourl = localurl;
  2587. xmlhttp.myContext = myLink.parentNode;
  2588. xmlhttp.myLink=myLink;
  2589. changeClassWithin(myLink.parentNode,'valid','invalid');
  2590. xmlhttp.onreadystatechange = function(evt) {
  2591. var evt = (evt) ? evt : ((event) ? event : null );
  2592. var it = (evt.currentTarget) ? evt.currentTarget : this;
  2593. if(it.readyState == 4){
  2594. if(it.status == 200){
  2595. var jsontxt = it.responseText;
  2596. var jsonparser=it.myLink.getAttribute('data-parser');
  2597. if(jsonparser){
  2598. var expr = jsonparser + '(jsontxt);';
  2599. jsontxt=eval(expr);
  2600. }
  2601. if(it.myLink.localurl == it.infourl){
  2602. var dumpelement=getElementsByAttribute(it.myContext,'*','property','iridl:JsonAsText');
  2603. if(dumpelement.length > 0){dumpelement[0].innerHTML=jsontxt;}
  2604. var qid = (it.myLink.id) ? it.myLink.id : it.myLink.getAttribute('data-id');
  2605. if(qid){
  2606. if(!it.myContext.parsedJSON){
  2607. it.myContext.parsedJSON = {};
  2608. }
  2609. it.myContext.parsedJSON[qid]=JSON.parse(jsontxt);
  2610. }
  2611. else {
  2612. it.myContext.parsedJSON=JSON.parse(jsontxt);
  2613. }
  2614. relStopLoading(it.myLink);
  2615. runPureOnContext(it.myContext);
  2616. updatePageFormCopies(it.myContext);
  2617. validateAndCorrectPageForm(it.myContext);
  2618. }
  2619. }
  2620. else {
  2621. /* failed */
  2622. relStopLoading(it.myLink);
  2623. setFailed(it.myLink, it.status, it.statusText + it.responseText);
  2624. }
  2625. }
  2626. };
  2627. xmlhttp.myevtfn=xmlhttp.onreadystatechange;
  2628. xmlhttp.open("GET",xmlhttp.infourl,true);
  2629. xmlhttp.send();
  2630. }
  2631. }
  2632. /*
  2633. runs pure on what I am calling a context. It only runs on elements
  2634. within the context which have a class that matches the directive element (default value "template" if no directive element).
  2635. Because this can be called more than once, I use the compile/render
  2636. form of pure.
  2637. Note that you can now explicitly set the template, called a 'directive' by PURE,
  2638. by using a script type="application/json" property="iridl:hasPUREdirective" in your context.
  2639. */
  2640. var contextcount=0;
  2641. function runPureOnContext(myContext){
  2642. if(!myContext.byDirective){
  2643. /* run for the first time -- needs to survey iridl:hasPUREdirective(s) for directives and templateClasses */
  2644. /* stores context directives in an array so there can be multiple templates with multiple structures*/
  2645. myContext.byDirective=[];
  2646. myContext.contextcount=contextcount;
  2647. contextcount=contextcount+1;
  2648. /* loops over script iridl:hasPUREdirective elements for directives */
  2649. var myscripts = getElementsByAttribute(myContext,'script','property','iridl:hasPUREdirective');
  2650. var doDefaultScript=true;
  2651. if(myscripts.length > 0){
  2652. for (var iscript = 0 ; iscript<myscripts.length ; iscript++){
  2653. var myscript = myscripts[iscript];
  2654. if(myscript.parentNode == myContext){
  2655. doDefaultScript=false;
  2656. var holdtxt = myscript.text;
  2657. var mystuff = {};
  2658. mystuff.pureDirective="";
  2659. if(holdtxt){
  2660. var directive;
  2661. try {
  2662. directive = enhancedPureDirective(holdtxt,mystuff);
  2663. if(holdtxt.indexOf('.sort')>0 || holdtxt.indexOf('iridl:firstLetter')>0){
  2664. appendMissingClass(myContext,'PureDependsOnLang');
  2665. }
  2666. } catch(e){
  2667. alert('JSON parse error in ' + holdtxt);
  2668. }
  2669. if(!directive){
  2670. alert('probable parse error in ' + holdtxt);
  2671. }
  2672. mystuff.pureDirective=directive;
  2673. }
  2674. if(myscript.className){
  2675. mystuff.pureTemplateClass=myscript.className;
  2676. }
  2677. else {
  2678. mystuff.pureTemplateClass='template';
  2679. }
  2680. myContext.byDirective.push(mystuff);
  2681. }
  2682. }
  2683. }
  2684. if(doDefaultScript){
  2685. /* does default single directive or not*/
  2686. myContext.byDirective[0]={};
  2687. myContext.byDirective[0].pureDirective=myContext.pureDirective;
  2688. if(myContext.pureTemplateClass){
  2689. myContext.byDirective[0].pureTemplateClass=myContext.pureTemplateClass;
  2690. }
  2691. else if(myContext.getAttribute('data-hasTemplate')){
  2692. myContext.byDirective[0].pureTemplateClass=myContext.getAttribute('data-hasTemplate');
  2693. }
  2694. else {
  2695. myContext.byDirective[0].pureTemplateClass='template';
  2696. }
  2697. }
  2698. /* finds templates for each directive */
  2699. var mydirs = myContext.byDirective;
  2700. for (var iscript = 0 ; iscript<mydirs.length ; iscript++){
  2701. var myscript = mydirs[iscript];
  2702. var mytclass = myscript.pureTemplateClass + 'isAPureTemplateFor' + myContext.contextcount;
  2703. var mytems0 = myContext.getElementsByClassName(myscript.pureTemplateClass);
  2704. for (var i=0 ; i< mytems0.length;i++){
  2705. if(mytems0[i].tagName != 'SCRIPT'){
  2706. appendMissingClass(mytems0[i],mytclass);
  2707. }
  2708. }
  2709. myscript.pureTemplates=myContext.getElementsByClassName(mytclass);
  2710. myscript.pureTClass='.' + mytclass;
  2711. }
  2712. }
  2713. /* we have a directives list */
  2714. var mydirs = myContext.byDirective;
  2715. for (var iscript = 0 ; iscript<mydirs.length ; iscript++){
  2716. var myscript = mydirs[iscript];
  2717. var mytems = myscript.pureTemplates;
  2718. var mytclass = myscript.pureTClass;
  2719. if(mytems.length>0){
  2720. var i=0;
  2721. var holdonchange = mytems[i].onchange;
  2722. if(myscript.pureDirective){
  2723. if(!myscript.pureFunction){
  2724. myscript.pureFunction = $p(mytclass).compile(myscript.pureDirective);
  2725. }
  2726. $p(mytclass).render(myContext.parsedJSON,myscript.pureFunction);
  2727. }
  2728. else {
  2729. $p(mytclass).autoRender(myContext.parsedJSON);
  2730. }
  2731. if(typeof(holdonchange)=='function' ){
  2732. mytems[i].onchange=holdonchange;
  2733. mytems[i].myonchange=holdonchange;
  2734. }
  2735. }
  2736. }
  2737. setupPageFormLinks(myContext);
  2738. changeClassWithin(myContext,'invalid','valid');
  2739. updateLangGroups(myContext);
  2740. var forcereflow=myContext.offsetHeight;
  2741. }
  2742. function enhancedPureDirective(directivestring,myDirective){
  2743. var cleanstring = decodeXML(directivestring);
  2744. var directive = betterEval(cleanstring);
  2745. var newdirective = transformObject(directive,mapObject,myDirective);
  2746. directive=newdirective;
  2747. return directive;
  2748. }
  2749. function betterEval(statements) {
  2750. // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#Never_use_eval
  2751. return Function('"use strict"; return (' + statements + ')')();
  2752. }
  2753. function transformObject(object,func,myDirective){
  2754. var newobj = {};
  2755. for (var key in object ){
  2756. var newval = func(object[key],key,myDirective);
  2757. newobj[key]=newval;
  2758. }
  2759. return newobj;
  2760. }
  2761. function mapObject (obj,key,myDirective){
  2762. var newobj = obj;
  2763. var findlg=new RegExp('([^"]*).iridl:asLangGroup');
  2764. var findrc=new RegExp('([^".]*)[.]([^".]*).iridl:recurse');
  2765. var findfl=new RegExp('([^"]*).iridl:firstLetter');
  2766. var findcnt=new RegExp('([^"]*).iridl:length');
  2767. if(typeof(obj) == 'object'){
  2768. newobj = transformObject(obj,mapObject,myDirective);
  2769. }
  2770. if(key=='sort'){
  2771. var sortvar = obj;
  2772. newobj = function(a,b){
  2773. var mysortvar = sortvar;
  2774. var ret;
  2775. var sa,sb;
  2776. if(sortvar == '.'){
  2777. sa = a;
  2778. sb = b;
  2779. }
  2780. else {
  2781. sa = a[sortvar];
  2782. if(typeof(sa) == 'object' && sa.length){
  2783. /* sa is an array -- could be strings or objects */
  2784. if(typeof(sa[sa.length-1]) == 'object' && sa.length > 1){
  2785. var sanew = sa[0];
  2786. /* array of objects -- look for current language if possible*/
  2787. var clang=document.getElementsByTagName('body')[0].getAttribute("lang");
  2788. if(clang){
  2789. for(var ilang=0; ilang < sa.length; ilang++){
  2790. if(sa[ilang]['@language'] == clang){
  2791. sanew = sa[ilang];
  2792. break;
  2793. }
  2794. }
  2795. }
  2796. sa = sanew;
  2797. }
  2798. else {
  2799. sa = sa[0];
  2800. }
  2801. }
  2802. /* if sa is an object, look for a @value attribute */
  2803. if (typeof(sa) == 'object' && sa['@value']){
  2804. sa = sa['@value'];
  2805. }
  2806. /* same processing for sb */
  2807. sb = b[sortvar];
  2808. if(typeof(sb) == 'object' && sb.length){
  2809. if(typeof(sb[sb.length-1]) == 'object' && sb.length > 1){
  2810. var sbnew = sb[0];
  2811. /* array of objects -- look for current language if possible*/
  2812. var clang=document.getElementsByTagName('body')[0].getAttribute("lang");
  2813. if(clang){
  2814. for(var ilang=0; ilang < sb.length; ilang++){
  2815. if(sb[ilang]['@language'] == clang){
  2816. sbnew = sb[ilang];
  2817. break;
  2818. }
  2819. }
  2820. }
  2821. sb = sbnew;
  2822. }
  2823. else {
  2824. sb = sb[0];
  2825. }
  2826. }
  2827. if (typeof(sb) == 'object' && sb['@value']){
  2828. sb = sb['@value'];
  2829. }
  2830. }
  2831. if(!sa){
  2832. return -1
  2833. }
  2834. else if (!sb){
  2835. return 1}
  2836. else {
  2837. return removeDiacritics(sa.toLowerCase()) > removeDiacritics(sb.toLowerCase()) ? 1 : -1;
  2838. }
  2839. };
  2840. }
  2841. else if(typeof(obj) == 'string'){
  2842. var res = findlg.exec(obj);
  2843. if(res){
  2844. var localref=res[1];
  2845. newobj = function(arg){
  2846. var local=localref;
  2847. var ret;
  2848. var mycontid = local.substr(1+local.indexOf('.'));
  2849. var contidlist = mycontid.split(".");
  2850. var mycont = arg.item;
  2851. for (var i=0 ; i < contidlist.length ; i++) {
  2852. if (mycont) {
  2853. mycont = mycont[contidlist[i]];
  2854. }
  2855. }
  2856. if(mycont && mycont.sort){
  2857. mycont.sort(function(a,b){
  2858. if(typeof(a) == 'string' || !a['@language']){
  2859. return 1;
  2860. }
  2861. else if(typeof(b) == 'string'|| !b['@language']){
  2862. return -1;
  2863. }
  2864. else {
  2865. if(a['@language'] > b['@language']){
  2866. return 1;
  2867. }
  2868. else {
  2869. return -1;
  2870. }
  2871. }
  2872. });
  2873. };
  2874. if(!mycont){
  2875. ret='';
  2876. }
  2877. else if(typeof(mycont)=='string' || mycont['@value']){
  2878. var entry=mycont;
  2879. if(typeof(entry)=='object'){
  2880. ret = '<span lang="' + entry['@language'] + '">' + entry['@value'] + '</span>';
  2881. }
  2882. else {
  2883. ret= '<span lang="">' + entry + '</span>' ;
  2884. }
  2885. }
  2886. else {
  2887. ret='';
  2888. if(mycont.length > 1){
  2889. ret = '<span class="langgroup">';
  2890. }
  2891. for (var i = 0 ; i < mycont.length ; i++){
  2892. var entry = mycont[i];
  2893. if(typeof(entry)=='object'){
  2894. ret += '<span lang="' + entry['@language'] + '">' + entry['@value'] + '</span>';
  2895. }
  2896. else {
  2897. ret+= '<span lang="">' + entry + '</span>' ;
  2898. }
  2899. }
  2900. if(mycont.length > 1){
  2901. ret += '</span>';
  2902. }
  2903. }
  2904. return ret};
  2905. }
  2906. if(res = findcnt.exec(obj)){
  2907. var localref=res[1];
  2908. newobj = function(arg){
  2909. var local=localref;
  2910. var ret;
  2911. var mycontid = local.substr(1+local.indexOf('.'));
  2912. var contidlist = mycontid.split(".");
  2913. var mycont = arg.context;
  2914. if(arg.item){mycont=arg.item};
  2915. for (var i=0 ; i < contidlist.length ; i++) {
  2916. if (mycont) {
  2917. mycont = mycont[contidlist[i]];
  2918. }
  2919. }
  2920. if(mycont){
  2921. ret = mycont.length;
  2922. }
  2923. return ret;
  2924. }
  2925. }
  2926. if(res = findfl.exec(obj)){
  2927. var localref=res[1];
  2928. newobj = function(arg){
  2929. var local=localref;
  2930. var ret;
  2931. var mycontid = local.substr(1+local.indexOf('.'));
  2932. var contidlist = mycontid.split(".");
  2933. var mycont = arg.item;
  2934. for (var i=0 ; i < contidlist.length ; i++) {
  2935. if (mycont) {
  2936. mycont = mycont[contidlist[i]];
  2937. }
  2938. }
  2939. if(mycont && mycont.sort){
  2940. mycont.sort(function(a,b){
  2941. if(typeof(a) == 'string' || !a['@language']){
  2942. return 1;
  2943. }
  2944. else if(typeof(b) == 'string'|| !b['@language']){
  2945. return -1;
  2946. }
  2947. else {
  2948. if(a['@language'] > b['@language']){
  2949. return 1;
  2950. }
  2951. else {
  2952. return -1;
  2953. }
  2954. }
  2955. });
  2956. };
  2957. if(!mycont){
  2958. ret='';
  2959. }
  2960. else{
  2961. var entry;
  2962. if(!mycont.length){
  2963. entry=mycont;
  2964. }
  2965. else {
  2966. entry=mycont[0];
  2967. if(typeof(mycont[mycont.length-1]) == 'object' && mycont.length > 1){
  2968. /* array of objects -- look for current language if possible*/
  2969. var clang=document.getElementsByTagName('body')[0].getAttribute("lang");
  2970. if(clang){
  2971. for(var ilang=0; ilang < mycont.length; ilang++){
  2972. if(mycont[ilang]['@language'] == clang){
  2973. entry = mycont[ilang];
  2974. break;
  2975. }
  2976. }
  2977. }
  2978. }
  2979. }
  2980. if(typeof(entry)=='object'){
  2981. ret = removeDiacritics(entry['@value'].substr(0,1).toLowerCase());
  2982. }
  2983. else {
  2984. ret= removeDiacritics(entry.substr(0,1).toLowerCase());
  2985. }
  2986. }
  2987. return ret;
  2988. };
  2989. }
  2990. if (res = findrc.exec(obj)){
  2991. var localref=res[1];
  2992. var localloopon=res[2];
  2993. var myd = myDirective;
  2994. newobj = function(arg){
  2995. var local=localref;
  2996. var loopon=localloopon;
  2997. var context=myd;
  2998. var ret='';
  2999. if(context.pureFunction){
  3000. var myfunc = context.pureFunction;
  3001. if(arg[local] && arg[local].item && arg[local].item[loopon]){
  3002. ret = myfunc(arg[local].item);
  3003. var el = document.createElement('div');
  3004. el.innerHTML=ret;
  3005. ret=el.firstChild.innerHTML;
  3006. }
  3007. }
  3008. return ret;
  3009. };
  3010. }
  3011. }
  3012. return newobj;
  3013. }
  3014. function validate(context,vid){
  3015. }
  3016. function invalidate(context,vid){
  3017. }
  3018. /* set/clear failed class on object, maintain failed attribute on body */
  3019. function clearFailed(cmem){
  3020. removeClass(cmem,'failed');
  3021. cmem.removeAttribute('failcode');
  3022. cmem.removeAttribute('failmsg');
  3023. var mybody = document.getElementsByTagName('body')[0];
  3024. var cnt = parseInt(mybody.getAttribute('failed'));
  3025. cnt += -1;
  3026. if (cnt > 0){
  3027. mybody.setAttribute('failed',cnt);
  3028. }
  3029. else {
  3030. mybody.removeAttribute('failed');
  3031. }
  3032. }
  3033. function setFailed(cmem,scode,msg){
  3034. if(scode){
  3035. cmem.setAttribute('failcode',scode);
  3036. cmem.setAttribute('failmsg',msg);
  3037. }
  3038. if(appendMissingClass(cmem,'failed')){
  3039. var mybody = document.getElementsByTagName('body')[0];
  3040. var cnt = parseInt(mybody.getAttribute('failed'));
  3041. if(cnt){
  3042. cnt += 1;
  3043. }
  3044. else {
  3045. cnt = 1;
  3046. }
  3047. mybody.setAttribute('failed',cnt);
  3048. }
  3049. }
  3050. /* uses currenturl loadingCount, and Loading class to track loading state for links and their context */
  3051. function relStartLoading(link){
  3052. myContext = link.parentNode;
  3053. if(appendMissingClass(link,'loading')){
  3054. /* set loading in context */
  3055. if(myContext.loading && myContext.loading > 0){
  3056. myContext.loading = myContext.loading + 1;
  3057. }
  3058. else {
  3059. myContext.loading = 1;
  3060. appendMissingClass(myContext,'loading');
  3061. }
  3062. /* set loading on body */
  3063. var mybody = document.getElementsByTagName('body')[0];
  3064. var cnt = parseInt(mybody.getAttribute('loading'));
  3065. if(cnt){
  3066. cnt += 1;
  3067. }
  3068. else {
  3069. cnt = 1;
  3070. }
  3071. mybody.setAttribute('loading',cnt);
  3072. removeClass(mybody,'slowly');
  3073. if(mybody.loadTimer){
  3074. clearTimeout(mybody.loadTimer);
  3075. }
  3076. mybody.loadTimer = setTimeout(function () {
  3077. if(mybody.getAttribute('loading')){appendMissingClass(mybody,'slowly')};},5000);
  3078. }
  3079. }
  3080. function relStopLoading(link){
  3081. myContext = link.parentNode;
  3082. removeClass(link,'loading');
  3083. var mybody = document.getElementsByTagName('body')[0];
  3084. var cnt = parseInt(mybody.getAttribute('loading'));
  3085. cnt += -1;
  3086. if (cnt > 0){
  3087. mybody.setAttribute('loading',cnt);
  3088. }
  3089. else {
  3090. mybody.removeAttribute('loading');
  3091. removeClass(mybody,'slowly');
  3092. }
  3093. myContext.loading = myContext.loading - 1;
  3094. if(myContext.loading == 0){
  3095. removeClass(myContext,'loading');
  3096. }
  3097. }
  3098. function initializeDLimage(){
  3099. var mylist=document.getElementsByClassName("dlimage");
  3100. for( var idlimage=0 ; idlimage < mylist.length ; idlimage++){
  3101. var hasGMap = (mylist[idlimage].getElementsByClassName("dlimgGMap").length > 0);
  3102. var s = mylist[idlimage];
  3103. var sl = s.getElementsByTagName('legend');
  3104. var leg;
  3105. var ctl;
  3106. var sfigs=getElementsByAttribute(s,'*','rel','iridl:hasFigure');
  3107. if(sfigs.length){
  3108. appendMissingClass(s,'hasFigure');
  3109. }
  3110. if(!sl.length){
  3111. leg=document.createElement('legend');
  3112. leg.className='imagecontrols';
  3113. /* zoom info settings layers only if hasFigure */
  3114. if(sfigs.length){
  3115. ctl=document.createElement('div');
  3116. ctl.className="dlimagecontrol zoomout";
  3117. ctl.title="Zoom Out";
  3118. ctl.onclick=dozoomout;
  3119. ctl.myonclick=dozoomout;
  3120. leg.appendChild(ctl);
  3121. ctl=document.createElement('div');
  3122. ctl.className="dlimagecontrol info";
  3123. ctl.title="More Information";
  3124. ctl.onclick=doinfobutton;
  3125. ctl.myonclick=doinfobutton;
  3126. leg.appendChild(ctl);
  3127. ctl=document.createElement('div');
  3128. ctl.className="dlimagecontrol settings ivarswitch";
  3129. ctl.title="Independent Variables";
  3130. ctl.onclick=dosettingsbutton;
  3131. ctl.myonclick=dosettingsbutton;
  3132. leg.appendChild(ctl);
  3133. ctl=document.createElement('div');
  3134. ctl.className="dlimagecontrol layers";
  3135. ctl.title="Layers";
  3136. ctl.onclick=dolayersbutton;
  3137. ctl.myonclick=dolayersbutton;
  3138. leg.appendChild(ctl);
  3139. if(s.className.indexOf('NoDefaultIvars')<0){
  3140. appendMissingClass(s,'ShowControlIvars');
  3141. }
  3142. }
  3143. /* share download buttons always appear */
  3144. ctl=document.createElement('div');
  3145. ctl.className="dlimagecontrol share";
  3146. ctl.title="Share";
  3147. ctl.onclick=dosharebutton;
  3148. ctl.myonclick=dosharebutton;
  3149. leg.appendChild(ctl);
  3150. ctl=document.createElement('div');
  3151. ctl.className="dlimagecontrol download";
  3152. ctl.title="Download";
  3153. ctl.onclick=dodownloadbutton;
  3154. ctl.myonclick=dodownloadbutton;
  3155. leg.appendChild(ctl);
  3156. ctl=document.createElement('div');
  3157. ctl.className="dlimageswitch";
  3158. ctl.title="Control Lock";
  3159. ctl.onclick=docontrollockbutton;
  3160. ctl.myonclick=docontrollockbutton;
  3161. leg.appendChild(ctl);
  3162. s.insertBefore(leg,s.firstChild);
  3163. }
  3164. else {
  3165. leg=sl[0];
  3166. }
  3167. var sfigs=getElementsByAttribute(s,'*','rel','iridl:hasFigure');
  3168. if(sfigs.length){
  3169. updateHasFigure(sfigs[0]);
  3170. }
  3171. else {
  3172. DLimageBuildControls(s);
  3173. }
  3174. }
  3175. }
  3176. function updateHasFigure(myfig){
  3177. var newinfourl = myfig.href;
  3178. var lastslashindex = newinfourl.lastIndexOf('/');
  3179. newinfourl = newinfourl.substr(0,lastslashindex+1);
  3180. newinfourl = newinfourl +'info.json';
  3181. if(myfig.href.indexOf('?')>0){
  3182. newinfourl=myfig.href.substr(0,myfig.href.indexOf('?')) + 'info.json' + myfig.href.substr(myfig.href.indexOf('?'));
  3183. }
  3184. if(!myfig.info || myfig.infourl != newinfourl){
  3185. if(myfig.info){
  3186. DLimageRemoveControls(myfig);
  3187. }
  3188. myfig.info="seeking";
  3189. var s=myfig.parentNode;
  3190. var figurl=myfig.href;
  3191. var infourl=newinfourl;
  3192. var xmlhttp= getXMLhttp();
  3193. xmlhttp.mylink=myfig;
  3194. xmlhttp.infourl=infourl;
  3195. var imglist=s.getElementsByTagName('img');
  3196. for (var i = 0; i<imglist.length; i++){
  3197. if(imglist[i].className.indexOf('dlimg')>-1){
  3198. myfig.figureimage=imglist[i];
  3199. myfig.figureimage.mylink=xmlhttp.mylink;
  3200. /* sets the infourl so that we know what we are "seeking" */
  3201. myfig.infourl=infourl;
  3202. break;
  3203. }
  3204. }
  3205. xmlhttp.onreadystatechange= function(evt) {
  3206. var evt = (evt) ? evt : ((event) ? event : null );
  3207. var it = (evt.currentTarget) ? evt.currentTarget : this;
  3208. if(it.readyState == 4){
  3209. var jsontxt = it.responseText;
  3210. /* checks the infourl so that we know we have the current json */
  3211. if(it.mylink.infourl==it.infourl){
  3212. it.mylink.info=JSON.parse(jsontxt);
  3213. /* info now has figure information */
  3214. DLimageBuildControls(it.mylink.parentNode,it.mylink);
  3215. DLimageBuildZoom(it.mylink);
  3216. }
  3217. }
  3218. };
  3219. xmlhttp.myfn=xmlhttp.onreadystatechange;
  3220. xmlhttp.open("GET",infourl,true);
  3221. xmlhttp.send();
  3222. DLimageResizeImage(xmlhttp.mylink);
  3223. }
  3224. }
  3225. function dozoomout (evt) {
  3226. var evt = (evt) ? evt : ((event) ? event : null );
  3227. var it = (evt.currentTarget) ? evt.currentTarget : evt.srcElement.parentNode;
  3228. var mylink = getElementsByAttribute(it.parentNode.parentNode,'*','rel','iridl:hasFigure');
  3229. var myclasses = mylink[0].figureimage.className;
  3230. var myform=document.getElementById('pageform');
  3231. if(myform){
  3232. var gs = it.parentNode.parentNode.getElementsByClassName('dlimgGMap');
  3233. if (gs && gs.length==1) {
  3234. resetGMap(gmaps[ gs[0].id ]);
  3235. }
  3236. var myin = myform.elements['region'];
  3237. if(myin){
  3238. myin.value='';
  3239. }
  3240. myin = myform.elements['clickpt'];
  3241. if(myin){
  3242. myin.value='';
  3243. }
  3244. myin = myform.elements['bbox'];
  3245. if(myin){
  3246. if(myin.length){
  3247. for (var i = 0;i < myin.length;i++){
  3248. if(matchToken(myin[i].className,myclasses)){
  3249. myin[i].value='';
  3250. break;
  3251. }
  3252. }
  3253. }
  3254. else {
  3255. myin.value='';
  3256. }
  3257. updatePageForm();
  3258. }
  3259. }
  3260. }
  3261. function matchToken(astring,bstring){
  3262. var alist = astring.split(' ');
  3263. var blist = bstring.split(' ');
  3264. for (var j=0;j<alist.length;j++){
  3265. for (var k=0; k<blist.length;k++){
  3266. if(blist[k] == alist[j]){
  3267. return true;
  3268. }
  3269. }
  3270. }
  3271. return false;
  3272. }
  3273. function clearregionwithin () {
  3274. var myform=document.getElementById('pageform');
  3275. if(myform){
  3276. var myin;
  3277. myin = myform.elements['clickpt'];
  3278. if(myin){
  3279. myin.value='';
  3280. }
  3281. myin = myform.elements['region'];
  3282. var mybbox = myform.elements['bbox'];
  3283. if(myin && mybbox){
  3284. if(mybbox.length){
  3285. myin.value=mybbox[0].value;
  3286. }
  3287. else {
  3288. myin.value=mybbox.value;
  3289. }
  3290. updatePageForm();
  3291. }
  3292. }
  3293. }
  3294. function setbbox (newbbox,myinfo,myclasses) {
  3295. var update=false;
  3296. var within=false;
  3297. var crs = myinfo["wms:CRS"];
  3298. var myform=document.getElementById('pageform');
  3299. if(myform){
  3300. var ifCRS = "";
  3301. if(crs && crs != "EPSG:4326"){
  3302. if(crs == "CRS:1"){
  3303. var abname, abunits,orname,orunits;
  3304. if(myinfo["iridl:hasAbscissa"]){
  3305. abname=myinfo["iridl:hasAbscissa"]["cfatt:standard_name"];
  3306. abunits=myinfo["iridl:hasAbscissa"]["cfatt:units"];
  3307. var abcal = myinfo["iridl:hasAbscissa"]["cfatt:calendar"];
  3308. if(abcal && abcal != "standard"){
  3309. abunits = abunits + "/" + abcal;
  3310. }
  3311. }
  3312. if(myinfo["iridl:hasOrdinate"]){
  3313. orname=myinfo["iridl:hasOrdinate"]["cfatt:standard_name"];
  3314. orunits=myinfo["iridl:hasOrdinate"]["cfatt:units"];
  3315. var orcal = myinfo["iridl:hasOrdinate"]["cfatt:calendar"];
  3316. if(orcal && orcal != "standard"){
  3317. orunits = orunits + "/" + orcal;
  3318. }
  3319. }
  3320. if(abname && abunits && orname && orunits){
  3321. crs = "cfsn:" + abname + ":" + abunits + ":" + orname + ":" + orunits ;
  3322. }
  3323. }
  3324. ifCRS = ":" + crs;
  3325. }
  3326. if(newbbox[0] != newbbox[2]){
  3327. var myin = myform.elements['bbox'];
  3328. if(myin){
  3329. /* myin.value=JSON.stringify(newbbox); */
  3330. var newbb = 'bb:' + newbbox.slice(0,4).join(':') + ifCRS + ':bb';
  3331. if(myin.length){
  3332. for (var i = 0;i < myin.length;i++){
  3333. if(matchToken(myin[i].className,myclasses)){
  3334. myin[i].value=newbb;
  3335. break;
  3336. }
  3337. }
  3338. }
  3339. else {
  3340. myin.value= newbb;
  3341. }
  3342. update=true;
  3343. }
  3344. }
  3345. /* sets clickpt */
  3346. var clickpt = myform.elements['clickpt'];
  3347. var historyid;
  3348. if(newbbox[0] == newbbox[2] && newbbox[1] == newbbox[3]){
  3349. // click -- return depends on resolution res
  3350. within=true;
  3351. clickpt.value="pt:" + newbbox.slice(0,2).join(':') + ifCRS + ":pt";
  3352. historyid = clickpt.value;
  3353. }
  3354. /* sets region */
  3355. var myin = myform.elements['region'];
  3356. var res = myform.elements['resolution'];
  3357. var resf = myform.elements['resolutionFilter'];
  3358. var ress,resfs,myins;
  3359. if(myin){
  3360. var myins;
  3361. if(myin.length) {
  3362. myins=myin;
  3363. }
  3364. else {
  3365. myins=[myin];
  3366. }
  3367. if(res && res.length) {
  3368. ress=res;
  3369. }
  3370. else {
  3371. ress=[res];
  3372. }
  3373. if(resf && resf.length) {
  3374. resfs=resf;
  3375. }
  3376. else {
  3377. resfs=[resf];
  3378. }
  3379. if(newbbox[0] == newbbox[2] && newbbox[1] == newbbox[3]){
  3380. // click -- return depends on resolution res
  3381. for (iin=0 ; iin < myins.length ; iin++){
  3382. myin = myins[iin];
  3383. res = ress[iin];
  3384. resf = resfs[iin];
  3385. // none -- return pt:[x,y]
  3386. // number -- return bbox of that size bb:[x,y,x+res,y+res]
  3387. // uri -- returns geoobject of that class/type
  3388. if(res.value && res.value.substr(0,6) == 'irids:'){
  3389. invalidatePageInput(myin);
  3390. var queryserver=uicoreConfig.resolutionQueryServers[res.value];
  3391. if(!queryserver){
  3392. queryserver=uicoreConfig.resolutionQueryServers['default'];
  3393. }
  3394. if(!queryserver){
  3395. queryserver="https://iridl.ldeo.columbia.edu/";
  3396. }
  3397. var resurl = queryserver + "expert/%28irids:SOURCES:Features:Political:Africa:Districts:ds%29//resolution/parameter/%28pt:4:10:pt%29//clickpt/parameter/" + encodeURIComponent('{}')+"//resolutionFilter/parameter/geoselect//string/as.json";
  3398. resclasses="";
  3399. if(resf && resf.className){
  3400. resclasses = resclasses + ' ' + resf.className;
  3401. }
  3402. resurl = appendPageForm(resurl,resclasses);
  3403. var delim = '?';
  3404. if(resurl.indexOf('?')>0){
  3405. delim="&";
  3406. }
  3407. resurl = resurl + delim + 'clickpt=' + encodeURIComponent(clickpt.value);
  3408. resurl = resurl + '&resolution=' + encodeURIComponent(res.value);
  3409. if(resf){
  3410. if(resf.value.indexOf('{')<0){
  3411. resurl=resurl + '&resolutionFilter=' + encodeURIComponent('{' + resf.value + '}');
  3412. }
  3413. else{
  3414. resurl=resurl + '&resolutionFilter=' + encodeURIComponent(resf.value);
  3415. }
  3416. }
  3417. var xmlhttp= getXMLhttp();
  3418. xmlhttp.myurl=resurl;
  3419. xmlhttp.myin=myin;
  3420. xmlhttp.historyid=historyid;
  3421. xmlhttp.onreadystatechange= function(evt) {
  3422. var evt = (evt) ? evt : ((event) ? event : null );
  3423. var it = (evt.currentTarget) ? evt.currentTarget : this;
  3424. if(it.readyState == 4){
  3425. var jsontxt = it.responseText;
  3426. var result;
  3427. try{result=JSON.parse(jsontxt)}
  3428. catch(err){alert(err + ' in parsing from ' + resurl + ' parsing ' + jsontxt)}
  3429. /* info now has figure information */
  3430. if(result["value"]){
  3431. var myin = it.myin;
  3432. if(myin.value == result["value"]){
  3433. validatePageInput(myin);
  3434. }
  3435. else {
  3436. myin.value=result["value"];
  3437. updatePageForm(undefined,undefined,undefined,it.historyid);
  3438. }
  3439. }
  3440. }
  3441. };
  3442. xmlhttp.myfn=xmlhttp.onreadystatechange;
  3443. xmlhttp.open("GET",resurl,true);
  3444. xmlhttp.send();
  3445. }
  3446. else if(typeof(res) != 'undefined' && parseFloat(res.value) != 'NaN'){
  3447. /* edited by R. Cousin on 20180418 */
  3448. /* previous code was covering only case where gridboxes edges were a multiple of delta */
  3449. /* introducing an offset correction to cover as well all other cases */
  3450. var x,y,delta,xoffset,yoffset;
  3451. delta = parseFloat(res.value);
  3452. if ( ("iridl:hasAbscissa" in myinfo) && ("iridl:hasOrdinate" in myinfo) ) {
  3453. xoffset = myinfo["iridl:hasAbscissa"]["iridl:gridvalues"]["iridl:first"];
  3454. yoffset = myinfo["iridl:hasOrdinate"]["iridl:gridvalues"]["iridl:first"];
  3455. } else {
  3456. xoffset = 0.0;
  3457. yoffset = 0.0;
  3458. }
  3459. x = delta*Math.floor(parseFloat(newbbox[0]-xoffset)/delta)+xoffset;
  3460. y = delta*Math.floor(parseFloat(newbbox[1]-yoffset)/delta)+yoffset;
  3461. var roundbox=new Array();
  3462. roundbox[0]=x;
  3463. roundbox[1]=y;
  3464. roundbox[2]=x+delta;
  3465. roundbox[3]=y+delta;
  3466. myin.value="bb:" + roundbox.join(':') + ifCRS + ":bb";
  3467. }
  3468. else {
  3469. myin.value="pt:" + newbbox.slice(0,2).join(':') + ifCRS + ":pt";
  3470. }
  3471. } /* end of loop on iin */
  3472. } /* end of resolution-dependent click */
  3473. else {
  3474. clickpt.value='';
  3475. myin.value="bb:" + newbbox.slice(0,4).join(':') + ifCRS + ":bb";
  3476. }
  3477. update=true;
  3478. }
  3479. /* Sets corresponding form variables for Abscissa and Ordinate */
  3480. var abscissa = myinfo["iridl:hasAbscissa"];
  3481. var ordinate = myinfo["iridl:hasOrdinate"];
  3482. var myvars = [];
  3483. if(abscissa && myform[abscissa["iridl:name"]]){
  3484. myvars[0]=abscissa;
  3485. }
  3486. if(ordinate && myform[ordinate["iridl:name"]]){
  3487. myvars[1]=ordinate;
  3488. }
  3489. if(within && myvars.length){
  3490. for(var idim=0;idim<myvars.length;idim++){
  3491. var mygrid=myvars[idim];
  3492. if(mygrid){
  3493. var myname=mygrid["iridl:name"];
  3494. var myout=myform.elements[myname];
  3495. var gridvalues =mygrid["iridl:gridvalues"];
  3496. var g0,g1,ginc;
  3497. var cval;
  3498. var cval0 = newbbox[idim];
  3499. gare = gridvalues["@type"];
  3500. if(gare == 'iridl:EvenGrid'){
  3501. g0 = parseFloat(gridvalues["iridl:first"]);
  3502. g1 = parseFloat(gridvalues["iridl:last"]);
  3503. ginc = parseFloat(gridvalues["iridl:step"]);
  3504. var nval = Math.round((Math.abs(g1-g0)/ginc));
  3505. var ival = Math.round(nval*(cval0-g0)/(g1-g0));
  3506. cval = g0 + ival*ginc;
  3507. }
  3508. if(gare == 'iridl:EvenGridEdges'){
  3509. g0 = parseFloat(gridvalues["iridl:first"]);
  3510. g1 = parseFloat(gridvalues["iridl:last"]);
  3511. ginc = parseFloat(gridvalues["iridl:step"]);
  3512. var pw;
  3513. if(typeof(gridvalues["iridl:pointwidth"]) != 'undefined'){
  3514. pw = gridvalues["iridl:pointwidth"];
  3515. }
  3516. else {
  3517. pw = ginc;
  3518. }
  3519. var g0c = g0 + pw/2;
  3520. var nval = Math.round((Math.abs(g1-g0)/ginc))-1;
  3521. var ival = Math.round(nval*(cval0-g0c)/(g1-g0-ginc));
  3522. cval = g0c + ival*ginc;
  3523. }
  3524. if(gare == 'iridl:CenterValues'){
  3525. g0 = parseFloat(mygrid["iridl:plotfirst"]);
  3526. g1 = parseFloat(mygrid["iridl:plotlast"]);
  3527. var glist=gridvalues['iridl:valuelist'];
  3528. var nval = glist.length-1;
  3529. var ival = Math.round(nval*(cval0-g0)/(g1-g0));
  3530. cval = glist[ival];
  3531. }
  3532. /* uses units to convert */
  3533. var units = mygrid['cfatt:units'];
  3534. if(units.substr(0,10) =='days since'){
  3535. var refdate = new Date(units.substr(11).replace('-1-1','-01-01'));
  3536. var cdate = new Date(Math.round(cval*1000*3600*24) + refdate.getTime());
  3537. var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
  3538. myform[myname].value = cdate.getDate() + ' ' + months[cdate.getMonth()] + ' ' + cdate.getFullYear();
  3539. }
  3540. else {
  3541. myform[myname].value=cval;
  3542. }
  3543. update=true;
  3544. }
  3545. }
  3546. }
  3547. if(update){
  3548. updatePageForm(undefined,undefined,undefined,historyid);
  3549. }
  3550. }
  3551. }
  3552. function parseBbox(bboxstr){
  3553. var mybbox;
  3554. if(bboxstr.slice(0,3)=='bb:'){
  3555. mybbox=bboxstr.split(':').slice(1,5);
  3556. mybbox[0] = parseFloat(mybbox[0]);
  3557. mybbox[1] = parseFloat(mybbox[1]);
  3558. mybbox[2] = parseFloat(mybbox[2]);
  3559. mybbox[3] = parseFloat(mybbox[3]);
  3560. }
  3561. else {
  3562. mybbox=JSON.parse(bboxstr);
  3563. }
  3564. return mybbox;
  3565. }
  3566. function getbbox (myinfo,myclasses) {
  3567. var mybbox;
  3568. var myform=document.getElementById('pageform');
  3569. if(myform){
  3570. var myin = myform.elements['bbox'];
  3571. /* parses a non-blank bounding box */
  3572. if(myin){
  3573. if(myin.length){
  3574. for (var i = 0;i < myin.length;i++){
  3575. if(matchToken(myin[i].className,myclasses)){
  3576. if(myin[i].value){
  3577. mybbox=parseBbox(myin[i].value);
  3578. }
  3579. break;
  3580. }
  3581. }
  3582. }
  3583. else {
  3584. if(myin.value){
  3585. mybbox=parseBbox(myin.value);
  3586. }
  3587. }
  3588. }
  3589. }
  3590. if(!mybbox){
  3591. var X0,X1,Y0,Y1;
  3592. if(typeof(myinfo["iridl:hasAbscissa"]["iridl:gridvalues"]) != 'undefined'){
  3593. var Xare = myinfo["iridl:hasAbscissa"]["iridl:gridvalues"]["@type"];
  3594. var Yare = myinfo["iridl:hasOrdinate"]["iridl:gridvalues"]["@type"];
  3595. if(Xare == 'iridl:EvenGridEdges'){
  3596. X0 = myinfo["iridl:hasAbscissa"]["iridl:gridvalues"]["iridl:first"];
  3597. X1 = myinfo["iridl:hasAbscissa"]["iridl:gridvalues"]["iridl:last"];
  3598. }
  3599. if(Xare == 'iridl:CenterValues'){
  3600. X0 = myinfo["iridl:hasAbscissa"]["iridl:plotfirst"];
  3601. X1 = myinfo["iridl:hasAbscissa"]["iridl:plotlast"];
  3602. }
  3603. if(Yare == 'iridl:EvenGridEdges'){
  3604. Y0 = myinfo["iridl:hasOrdinate"]["iridl:gridvalues"]["iridl:first"];
  3605. Y1 = myinfo["iridl:hasOrdinate"]["iridl:gridvalues"]["iridl:last"];
  3606. }
  3607. if(Yare == 'iridl:CenterValues'){
  3608. Y0 = myinfo["iridl:hasOrdinate"]["iridl:plotfirst"];
  3609. Y1 = myinfo["iridl:hasOrdinate"]["iridl:plotlast"];
  3610. }
  3611. }
  3612. else {
  3613. X0 = myinfo["iridl:hasAbscissa"]["iridl:plotfirst"];
  3614. X1 = myinfo["iridl:hasAbscissa"]["iridl:plotlast"];
  3615. Y0 = myinfo["iridl:hasOrdinate"]["iridl:plotfirst"];
  3616. Y1 = myinfo["iridl:hasOrdinate"]["iridl:plotlast"];
  3617. }
  3618. mybbox=[X0,Y0,X1,Y1,true];
  3619. }
  3620. return mybbox;
  3621. }
  3622. function doredrawbutton () {
  3623. var myform=document.getElementById('pageform');
  3624. if(myform){
  3625. updatePageForm();
  3626. }
  3627. }
  3628. function dolayersbutton(evt){
  3629. var evt = (evt) ? evt : ((event) ? event : null );
  3630. var it = (evt.currentTarget) ? evt.currentTarget : this;
  3631. var mycontainer = it.parentNode.parentNode;
  3632. removeClass(mycontainer,'ShowControlIvars ShowControlShare ShowControlDownload');
  3633. toggleClass(mycontainer,'ShowControlLayers');
  3634. }
  3635. function dosettingsbutton(evt){
  3636. var evt = (evt) ? evt : ((event) ? event : null );
  3637. var it = (evt.currentTarget) ? evt.currentTarget : this;
  3638. var mylink = getElementsByAttribute(it.parentNode.parentNode,'*','rel','iridl:hasFigure');
  3639. var mycontainer = it.parentNode.parentNode;
  3640. removeClass(mycontainer,'ShowControlLayers ShowControlShare ShowControlDownload');
  3641. toggleClass(mycontainer,'ShowControlIvars');
  3642. }
  3643. function docontrollockbutton(evt){
  3644. var evt = (evt) ? evt : ((event) ? event : null );
  3645. var it = (evt.currentTarget) ? evt.currentTarget : this;
  3646. var mylink = getElementsByAttribute(it.parentNode.parentNode,'*','rel','iridl:hasFigure');
  3647. var mycontainer = it.parentNode.parentNode;
  3648. toggleClass(mycontainer,'ControlLock');
  3649. if(mycontainer.className.indexOf('ControlLock')<0){
  3650. it.blur();
  3651. mycontainer.blur();
  3652. }
  3653. }
  3654. function dosharebutton(evt){
  3655. var evt = (evt) ? evt : ((event) ? event : null );
  3656. var it = (evt.currentTarget) ? evt.currentTarget : this;
  3657. var mylink = getElementsByAttribute(it.parentNode.parentNode,'*','rel','iridl:hasFigure');
  3658. var mycontainer = it.parentNode.parentNode;
  3659. removeClass(mycontainer,'ShowControlIvars ShowControlLayers ShowControlDownload');
  3660. toggleClass(mycontainer,'ShowControlShare');
  3661. }
  3662. function dodownloadbutton(evt){
  3663. var evt = (evt) ? evt : ((event) ? event : null );
  3664. var it = (evt.currentTarget) ? evt.currentTarget : this;
  3665. var mylink = getElementsByAttribute(it.parentNode.parentNode,'*','rel','iridl:hasFigure');
  3666. var mycontainer = it.parentNode.parentNode;
  3667. removeClass(mycontainer,'ShowControlIvars ShowControlLayers ShowControlShare');
  3668. toggleClass(mycontainer,'ShowControlDownload');
  3669. }
  3670. function doinfobutton (evt) {
  3671. var evt = (evt) ? evt : ((event) ? event : null );
  3672. var it = (evt.currentTarget) ? evt.currentTarget : evt.srcElement.parentNode;
  3673. var mylink = getElementsByAttribute(it.parentNode.parentNode,'*','rel','iridl:hasFigure');
  3674. var newloc = mylink[0].href;
  3675. if(location.host == mylink[0].host){
  3676. newloc = mylink[0].pathname;
  3677. }
  3678. else {
  3679. newloc = mylink[0].href;
  3680. }
  3681. var lastslashindex = newloc.lastIndexOf('/');
  3682. newloc = newloc.substr(0,lastslashindex+1);
  3683. location.href=appendPageForm(newloc+'index.html',mylink[0].figureimage.className);
  3684. }
  3685. function DLimageResizeImage(mylink){
  3686. if(mylink.figureimage){
  3687. var imagesrc=mylink.figureimage.src;
  3688. var patt = new RegExp('//plotaxislength.([0-9]*).psdef');
  3689. var csize = imagesrc.match(patt);
  3690. if (!csize || csize.length<2){
  3691. csize=432;
  3692. }
  3693. else {
  3694. csize=csize[1];
  3695. }
  3696. var pform=document.getElementById('pageform');
  3697. var ckres=pform.elements['resolution'];
  3698. var ipt=pform.elements['clickpt'];
  3699. if(!ipt){
  3700. ipt= document.createElement('input');
  3701. ipt.className = 'transformRegion';
  3702. ipt.name = 'clickpt';
  3703. ipt.type='hidden';
  3704. ipt.initialValue='';
  3705. pform.appendChild(ipt);
  3706. }
  3707. ipt=pform.elements['plotaxislength'];
  3708. if(!ipt){
  3709. ipt= document.createElement('input');
  3710. ipt.className = mylink.figureimage.className.split(' ')[0];
  3711. appendMissingClass(pform,ipt.className);
  3712. appendMissingClass(ipt,'dlauximg');
  3713. appendMissingClass(pform,'dlauximg');
  3714. ipt.name = 'plotaxislength';
  3715. ipt.type='hidden';
  3716. pform.appendChild(ipt);
  3717. }
  3718. var clientsize = Math.max(mylink.parentNode.clientWidth,mylink.parentNode.clientHeight);
  3719. var targetsize = 20*Math.round((clientsize - 20 - 72 + 9)/20,0);
  3720. if(targetsize > csize){
  3721. ipt.value=targetsize;
  3722. var newsrc=appendPageForm(mylink.figureimage.src,mylink.figureimage.className);
  3723. mylink.figureimage.src=newsrc;
  3724. }
  3725. }
  3726. }
  3727. function DLimageRemoveControls(mylink){
  3728. var myimage = mylink.figureimage;
  3729. var maybecontrol=mylink.nextSibling;
  3730. while(maybecontrol && maybecontrol != myimage){
  3731. var nextcontrol=maybecontrol.nextSibling;
  3732. if(maybecontrol.className && maybecontrol.className.indexOf('dlcontrol') >= 0){
  3733. mylink.parentNode.removeChild(maybecontrol);
  3734. }
  3735. maybecontrol=nextcontrol;
  3736. }
  3737. }
  3738. /* handles building of image controls from info.json information
  3739. invoked when load of info.json completes
  3740. */
  3741. function DLimageBuildControls(mydlimage,mylink){
  3742. /* builds image choice controls and places them immediately after the link if it exists, otherwise the legend
  3743. */
  3744. var currentObj;
  3745. if(mylink){
  3746. currentObj=mylink;
  3747. }
  3748. else {
  3749. var llist = mydlimage.getElementsByTagName('legend');
  3750. if(llist.length > 0){
  3751. currentObj=llist[0];
  3752. }
  3753. }
  3754. var pform=document.getElementById('pageform');
  3755. if(!currentObj.nextSibling.className || currentObj.nextSibling.className.indexOf('dlcontrol') < 0){
  3756. var pformchanged = false;
  3757. var kmlurl;
  3758. var wmsurl;
  3759. var sdataurl;
  3760. var tiffurl;
  3761. var tiffpcurl;
  3762. if(mylink && mylink.info){
  3763. kmlurl=mylink.info['iridl:hasKML'];
  3764. wmsurl=mylink.info['iridl:hasWMS'];
  3765. sdataurl=mylink.info['iridl:hasSelectedData'];
  3766. tiffurl=mylink.info['iridl:hasGeoTiff'];
  3767. tiffpcurl=mylink.info['iridl:hasGeoTiffPaletteColor'];
  3768. }
  3769. if(kmlurl){
  3770. appendMissingClass(mydlimage,'hasKML');
  3771. }
  3772. else {
  3773. removeClass(mydlimage,'hasKML');
  3774. }
  3775. if(wmsurl){
  3776. appendMissingClass(mydlimage,'hasWMS');
  3777. }
  3778. else {
  3779. removeClass(mydlimage,'hasWMS');
  3780. }
  3781. if(sdataurl){
  3782. appendMissingClass(mydlimage,'hasSelectedData');
  3783. }
  3784. else {
  3785. removeClass(mydlimage,'hasSelectedData');
  3786. }
  3787. if(tiffurl){
  3788. appendMissingClass(mydlimage,'hasGeoTiff');
  3789. }
  3790. else {
  3791. removeClass(mydlimage,'hasGeoTiff');
  3792. }
  3793. if(tiffpcurl){
  3794. appendMissingClass(mydlimage,'hasGeoTiffPaletteColor');
  3795. }
  3796. else {
  3797. removeClass(mydlimage,'hasGeoTiffPaletteColor');
  3798. }
  3799. /* builds layer controls */
  3800. var layerlist;
  3801. if(mylink && mylink.info){
  3802. layerlist=mylink.info["iridl:hasLayers"];
  3803. }
  3804. if(layerlist){
  3805. var ctl=document.createElement('div');
  3806. var pform=document.getElementById('pageform');
  3807. var formlayers;
  3808. if(pform){
  3809. formlayers = pform.elements['layers'];
  3810. if(formlayers && formlayers.length){
  3811. var arr = [];
  3812. for (var i = formlayers.length; i-- ; arr.unshift(formlayers[i]));
  3813. formlayers=arr;
  3814. }
  3815. }
  3816. ctl.className='dlcontrol ' + 'layers';
  3817. var ipt = document.createElement('span');
  3818. ipt.className='controlLabel';
  3819. ipt.innerHTML='Layers' + ' ';
  3820. ctl.appendChild(ipt);
  3821. for (var i = 0; i<layerlist.length; i++) {
  3822. var layer=layerlist[i];
  3823. var layername=layer["iridl:name"];
  3824. addGMapParam('layers',layername,null);
  3825. var style=layer["iridl:style"];
  3826. var iptsp = document.createElement('label');
  3827. if(style.join){
  3828. iptsp.className="layeroption " + style.join(" ");
  3829. }
  3830. else {
  3831. iptsp.className="layeroption " + style;
  3832. }
  3833. var ipt = document.createElement('input');
  3834. ipt.name='layers';
  3835. ipt.value=layername;
  3836. ipt.type='checkbox';
  3837. ipt.className='pageformcopy';
  3838. ipt.onchange=pageformcopyonchange;
  3839. ipt.myonchange=pageformcopyonchange;
  3840. if(formlayers && formlayers.value==layername){
  3841. ipt.checked=formlayers.checked;
  3842. }
  3843. else if(formlayers && formlayers.length && formlayers.some(function (ele){return (ele.value==this)},layername)){
  3844. var myfl = formlayers.filter(function (ele){return ele.value==this},layername)[0];
  3845. ipt.checked=myfl.checked;
  3846. }
  3847. else {
  3848. ipt.checked=true;
  3849. if(location.href.indexOf('layers=')>0 && location.href.indexOf('layers='+layername)<0 ) {
  3850. ipt.checked=false;
  3851. }
  3852. ipt.initialChecked=ipt.checked;
  3853. iptsp.className += " disabled";
  3854. var newlay = document.createElement('input');
  3855. newlay.type = 'checkbox';
  3856. newlay.name = 'layers';
  3857. newlay.value = layername;
  3858. newlay.checked=ipt.checked;
  3859. newlay.defaultChecked=ipt.checked;
  3860. newlay.className = mylink.figureimage.className.split(' ')[0] + ' share';
  3861. pform.appendChild(newlay);
  3862. pformchanged=true;
  3863. }
  3864. iptsp.appendChild(ipt);
  3865. ipt=document.createElement('span');
  3866. ipt.appendChild(document.createTextNode(layername));
  3867. iptsp.appendChild(ipt);
  3868. ctl.appendChild(iptsp);
  3869. }
  3870. currentObj.parentNode.insertBefore(ctl,currentObj.nextSibling);
  3871. currentObj=ctl;
  3872. }
  3873. /* creates share control */
  3874. var ctl=document.createElement('div');
  3875. ctl.className='dlcontrol ' + 'share';
  3876. var ipt = document.createElement('span');
  3877. ipt.className='controlLabel';
  3878. ipt.innerHTML='Open in' + ' ';
  3879. ctl.appendChild(ipt);
  3880. /* evernote */
  3881. var gb= document.createElement('div');
  3882. gb.className='sharebutton evernote';
  3883. gb.setAttribute("title","Save to Evernote with link back");
  3884. gb.onclick=doEvernoteClipElement;
  3885. gb.myonclick=doEvernoteClipElement;
  3886. gb.clipthis = currentObj.parentNode;
  3887. ctl.appendChild(gb);
  3888. /* tumblr */
  3889. var gb= document.createElement('div');
  3890. gb.className='sharebutton tumblr';
  3891. gb.setAttribute("title","Save to Tumblr with link back");
  3892. gb.onclick=doTumblrClipElement;
  3893. gb.myonclick=doTumblrClipElement;
  3894. gb.clipthis = currentObj.parentNode;
  3895. ctl.appendChild(gb);
  3896. /* CSPF */
  3897. var gb= document.createElement('div');
  3898. gb.className='sharebutton iriforum';
  3899. gb.setAttribute("title","Share image and link using the Climate Services Partnership Forums");
  3900. gb.onclick=doIRIFClipElement;
  3901. gb.myonclick=doIRIFClipElement;
  3902. gb.clipthis = currentObj.parentNode;
  3903. ctl.appendChild(gb);
  3904. /* pinterest */
  3905. var gb= document.createElement('div');
  3906. gb.className='sharebutton pinterest';
  3907. gb.setAttribute("title","Save to Pinterest with link back");
  3908. gb.onclick=doPinterestClipElement;
  3909. gb.myonclick=doPinterestClipElement;
  3910. gb.clipthis = currentObj.parentNode;
  3911. ctl.appendChild(gb);
  3912. /* Google Earth */
  3913. if(mylink){
  3914. gb= document.createElement('div');
  3915. gb.className='sharebutton googleearth';
  3916. gb.setAttribute("title","View in Google Earth");
  3917. gb.onclick=doGoogleEarthClick;
  3918. gb.myonclick=doGoogleEarthClick;
  3919. gb.clipthis = currentObj.parentNode;
  3920. ctl.appendChild(gb);
  3921. /* ArcGIS */
  3922. gb= document.createElement('div');
  3923. gb.className='sharebutton arcgis';
  3924. gb.setAttribute("title","View in ArcGIS");
  3925. gb.onclick=doarcgisClick;
  3926. gb.myonclick=doarcgisClick;
  3927. gb.clipthis = currentObj.parentNode;
  3928. ctl.appendChild(gb);
  3929. }
  3930. currentObj.parentNode.insertBefore(ctl,currentObj.nextSibling);
  3931. currentObj=ctl;
  3932. /* Download Control */
  3933. var ctl=document.createElement('div');
  3934. ctl.className='dlcontrol ' + 'download';
  3935. var ipt = document.createElement('span');
  3936. ipt.className='controlLabel';
  3937. ipt.innerHTML='Download as' + ' ';
  3938. ctl.appendChild(ipt);
  3939. if(mylink||getTable(mydlimage)){
  3940. /* google drive */
  3941. var gb= document.createElement('div');
  3942. gb.className='sharebutton asGDrive';
  3943. gb.setAttribute("title","GDrive with link back");
  3944. /* uses gDriveRender */
  3945. gb.clipthis = currentObj.parentNode;
  3946. ctl.appendChild(gb);
  3947. }
  3948. /* KML */
  3949. if(mylink){
  3950. var gb= document.createElement('div');
  3951. gb.className='sharebutton asKML';
  3952. gb.setAttribute("title","KML with link back");
  3953. gb.onclick=doGoogleEarthClick;
  3954. gb.myonclick=doGoogleEarthClick;
  3955. gb.clipthis = currentObj.parentNode;
  3956. ctl.appendChild(gb);
  3957. /* WMS */
  3958. gb= document.createElement('div');
  3959. gb.className='sharebutton asWMS';
  3960. gb.setAttribute("title","WMS");
  3961. gb.onclick=doWMSClick;
  3962. gb.myonclick=doWMSClick;
  3963. gb.clipthis = currentObj.parentNode;
  3964. ctl.appendChild(gb);
  3965. /* GeoTiffPC */
  3966. gb= document.createElement('div');
  3967. gb.className='sharebutton asGeoTiffPaletteColor';
  3968. gb.setAttribute("title","GeoTiff");
  3969. gb.onclick=doGeoTiffPCClick;
  3970. gb.myonclick=doGeoTiffPCClick;
  3971. gb.clipthis = currentObj.parentNode;
  3972. ctl.appendChild(gb);
  3973. /* GeoTiff */
  3974. gb= document.createElement('div');
  3975. gb.className='sharebutton asGeoTiff';
  3976. gb.setAttribute("title","data GeoTiff");
  3977. gb.onclick=doGeoTiffClick;
  3978. gb.myonclick=doGeoTiffClick;
  3979. gb.clipthis = currentObj.parentNode;
  3980. ctl.appendChild(gb);
  3981. appendMissingClass(mydlimage,'hasDownload');
  3982. }
  3983. if(getTable(mydlimage)){
  3984. /* tsv */
  3985. gb= document.createElement('div');
  3986. gb.className='sharebutton asHTML';
  3987. gb.setAttribute("title","HTML");
  3988. gb.onclick=doHTMLClick;
  3989. gb.myonclick=doHTMLClick;
  3990. gb.clipthis = currentObj.parentNode;
  3991. ctl.appendChild(gb);
  3992. gb= document.createElement('div');
  3993. gb.className='sharebutton asTSV';
  3994. gb.setAttribute("title","TSV");
  3995. gb.onclick=doTSVClick;
  3996. gb.myonclick=doTSVClick;
  3997. gb.clipthis = currentObj.parentNode;
  3998. ctl.appendChild(gb);
  3999. appendMissingClass(mydlimage,'hasDownload');
  4000. }
  4001. if(getPNGImage(mydlimage)){
  4002. /* PNG */
  4003. gb= document.createElement('div');
  4004. gb.className='sharebutton asPNG';
  4005. gb.setAttribute("title","PNG image");
  4006. gb.onclick=doPNGImageClick;
  4007. gb.myonclick=doPNGImageClick;
  4008. gb.clipthis = currentObj.parentNode;
  4009. ctl.appendChild(gb);
  4010. appendMissingClass(mydlimage,'hasDownload');
  4011. }
  4012. if(getPDFImage(mydlimage)){
  4013. /* PDF */
  4014. gb= document.createElement('div');
  4015. gb.className='sharebutton asPDF';
  4016. gb.setAttribute("title","PDF image");
  4017. gb.onclick=doPDFImageClick;
  4018. gb.myonclick=doPDFImageClick;
  4019. gb.clipthis = currentObj.parentNode;
  4020. ctl.appendChild(gb);
  4021. appendMissingClass(mydlimage,'hasDownload');
  4022. }
  4023. if(getOnlyFigureImage(mydlimage)){
  4024. /* PDF */
  4025. gb= document.createElement('div');
  4026. gb.className='sharebutton asPDF';
  4027. gb.setAttribute("title","PDF image with link back");
  4028. gb.onclick=doPDFClick;
  4029. gb.myonclick=doPDFClick;
  4030. gb.clipthis = currentObj.parentNode;
  4031. if(pform && !pform.elements['linkurl']){
  4032. var ipt= document.createElement('input');
  4033. ipt.type='hidden';
  4034. ipt.name='linkurl';
  4035. ipt.className='linkurl';
  4036. pform.appendChild(ipt);
  4037. }
  4038. ctl.appendChild(gb);
  4039. /* PDFget test version using GET instead of POST to make sure both
  4040. work equally well */
  4041. /* gb= document.createElement('div');
  4042. gb.className='sharebutton asPDFget';
  4043. gb.setAttribute("title","PDF image with link back");
  4044. gb.onclick=doPDFClickGET;
  4045. gb.myonclick=doPDFClickGET;
  4046. gb.clipthis = currentObj.parentNode;
  4047. if(pform && !pform.elements['linkurl']){
  4048. var ipt= document.createElement('input');
  4049. ipt.type='hidden';
  4050. ipt.name='linkurl';
  4051. ipt.className='linkurl';
  4052. pform.appendChild(ipt);
  4053. }
  4054. ctl.appendChild(gb);
  4055. */
  4056. /* PS */
  4057. gb= document.createElement('div');
  4058. gb.className='sharebutton asPS';
  4059. gb.setAttribute("title","PS image");
  4060. gb.onclick=doPSImageClick;
  4061. gb.myonclick=doPSImageClick;
  4062. gb.clipthis = currentObj.parentNode;
  4063. ctl.appendChild(gb);
  4064. appendMissingClass(mydlimage,'hasDownload');
  4065. /* GIF */
  4066. gb= document.createElement('div');
  4067. gb.className='sharebutton asGIF';
  4068. gb.setAttribute("title","GIF image");
  4069. gb.onclick=doGifClick;
  4070. gb.myonclick=doGifClick;
  4071. gb.clipthis = currentObj.parentNode;
  4072. ctl.appendChild(gb);
  4073. /* PNG */
  4074. gb= document.createElement('div');
  4075. gb.className='sharebutton asPNG';
  4076. gb.setAttribute("title","PNG");
  4077. gb.onclick=doPngClick;
  4078. gb.myonclick=doPngClick;
  4079. gb.clipthis = currentObj.parentNode;
  4080. ctl.appendChild(gb);
  4081. /* JPG */
  4082. gb= document.createElement('div');
  4083. gb.className='sharebutton asJPG';
  4084. gb.setAttribute("title","JPG");
  4085. gb.onclick=doJpgClick;
  4086. gb.myonclick=doJpgClick;
  4087. gb.clipthis = currentObj.parentNode;
  4088. ctl.appendChild(gb);
  4089. /* cut and paste */
  4090. gb= document.createElement('div');
  4091. gb.className='sharebutton asCutAndPaste';
  4092. gb.setAttribute("title","copy to html");
  4093. gb.onclick=docutandpasteClick;
  4094. gb.myonclick=docutandpasteClick;
  4095. gb.clipthis = currentObj.parentNode;
  4096. ctl.appendChild(gb);
  4097. appendMissingClass(mydlimage,'hasDownload');
  4098. var sfigs = getElementsByAttribute(mydlimage,'*','rel','iridl:hasFigureImage');
  4099. if(sfigs.length){
  4100. for(var i= sfigs.length;i--;){
  4101. sfigs[i].onclick=doFigureImageClick;
  4102. sfigs[i].onclickfn=doFigureImageClick;
  4103. sfigs[i].mydlimage = mydlimage;
  4104. }
  4105. if(sfigs.length>1){appendMissingClass(sfigs[0],'selectedImage')}
  4106. }
  4107. }
  4108. /* add download control area to parent */
  4109. currentObj.parentNode.insertBefore(ctl,currentObj.nextSibling);
  4110. /* do render loop */
  4111. renderAsGDrive();
  4112. secondRenderAsGDrive();
  4113. /* ctl becomes current */
  4114. currentObj=ctl;
  4115. /* adds message area for download controls e.g. ArcGIS */
  4116. var msga = document.createElement('div');
  4117. msga.className='messagearea';
  4118. currentObj.parentNode.insertBefore(msga,currentObj.nextSibling);
  4119. currentObj=msga;
  4120. /* builds fig dimension controls */
  4121. if(mylink) {
  4122. var dimlist=mylink.info["iridl:hasDimensions"];
  4123. if(dimlist){
  4124. for (var i = 0; i<dimlist.length; i++) {
  4125. var glist=dimlist[i]['iridl:gridvalues']['iridl:valuelist'];
  4126. if(glist && (glist.length > 1)){
  4127. var ctl = document.createElement('div');
  4128. ctl.className='dlcontrol ivar ' + dimlist[i]['iridl:name'];
  4129. var ipt = document.createElement('span');
  4130. ipt.className='controlLabel';
  4131. ctl.longName=dimlist[i]['cfatt:long_name'];
  4132. ipt.innerHTML=dimlist[i]['cfatt:long_name'] + ' ';
  4133. ctl.appendChild(ipt);
  4134. var iptset = document.createElement('span');
  4135. iptset.className='controlSet';
  4136. iptset.info=dimlist[i];
  4137. iptset.mylink=mylink;
  4138. ctl.appendChild(iptset);
  4139. ipt = document.createElement('span');
  4140. ipt.className='lowerLimit';
  4141. ipt.onclick=limitclickevent;
  4142. ipt.myevtfn=limitclickevent;
  4143. ipt.innerHTML=glist[0];
  4144. iptset.appendChild(ipt);
  4145. ipt = document.createElement('div');
  4146. ipt.className='oneStep leftarrow';
  4147. ipt.onclick=stepdownclickevent;
  4148. ipt.myclickfn=stepdownclickevent;
  4149. /*ipt.innerHTML='&lt;';*/
  4150. iptset.appendChild(ipt);
  4151. ipt = document.createElement('input');
  4152. ipt.className=mylink.figureimage.className.split(' ')[0] + ' pageformcopy';
  4153. ipt.name=dimlist[i]['iridl:name'];
  4154. ipt.value=dimlist[i]['iridl:defaultvalue'];
  4155. ipt.onchange=imageinputvaluechange;
  4156. ipt.mychangeevtfn=imageinputvaluechange;
  4157. ipt.size=16;
  4158. iptset.appendChild(ipt);
  4159. /* resets class of iptset to reflect whether the defaultvalue
  4160. corresponds to singleValue (in list of values) or multiValue (not
  4161. in list of values and presumably a range) */
  4162. var cin = dimlist[i]['iridl:gridvalues']['iridl:valuelist'].indexOf(ipt.value);
  4163. var cmax = dimlist[i]['iridl:gridvalues']['iridl:valuelist'].length-1;
  4164. var controlClass;
  4165. appendMissingClass(ipt,'hasValueList');
  4166. if(cin > -1){
  4167. controlClass="singleValue";
  4168. }
  4169. else {
  4170. controlClass="multiValue";
  4171. }
  4172. appendMissingClass(iptset,controlClass);
  4173. if(cin > 0){
  4174. controlClass= 'aboveLower';
  4175. }
  4176. else if(cin == 0){
  4177. controlClass='atLower';
  4178. }
  4179. appendMissingClass(iptset,controlClass);
  4180. if(cin >= 0 && cin < cmax){
  4181. controlClass='belowUpper';
  4182. }
  4183. else if(cin == cmax){
  4184. controlClass='atUpper';
  4185. }
  4186. appendMissingClass(iptset,controlClass);
  4187. if(document.getElementById('pageform')){
  4188. var pform=document.getElementById('pageform');
  4189. if(!pform.elements[ipt.name]){
  4190. var iptcpy= document.createElement('input');
  4191. iptcpy.className = ipt.className;
  4192. appendMissingClass(pform,ipt.className);
  4193. appendMissingClass(iptcpy,'dlauximg');
  4194. appendMissingClass(iptcpy,'share');
  4195. iptcpy.name = ipt.name;
  4196. iptcpy.value='';
  4197. iptcpy.type='hidden';
  4198. pform.appendChild(iptcpy);
  4199. updatePageFormFromUrl(iptcpy);
  4200. }
  4201. if(pform.elements[ipt.name].value != ''){
  4202. ipt.value=pform.elements[ipt.name].value;
  4203. }
  4204. }
  4205. ipt = document.createElement('span');
  4206. ipt.onclick=stepupclickevent;
  4207. ipt.className='oneStep rightarrow';
  4208. /*ipt.innerHTML='>';*/
  4209. iptset.appendChild(ipt);
  4210. ipt = document.createElement('span');
  4211. ipt.className='upperLimit';
  4212. ipt.onclick=limitclickevent;
  4213. ipt.innerHTML=glist[glist.length-1];
  4214. iptset.appendChild(ipt);
  4215. currentObj.parentNode.insertBefore(ctl,currentObj.nextSibling);
  4216. currentObj=ctl;
  4217. }
  4218. }
  4219. }
  4220. var ivarlist = mylink.parentNode.getElementsByClassName('ivar');
  4221. if(ivarlist.length > 0){
  4222. appendMissingClass(mylink.parentNode,'hasIvars');
  4223. var ivars = [];
  4224. for (var i=ivarlist.length; i--; ivars.unshift(ivarlist[i].longName));
  4225. var ivarswitch = mylink.parentNode.getElementsByClassName('ivarswitch')[0];
  4226. ivarswitch.setAttribute('title',ivars.join(', '));
  4227. }
  4228. else {
  4229. removeClass(mylink.parentNode,'hasIvars');
  4230. }
  4231. var layerlist =mylink.info["iridl:hasLayers"];
  4232. if(layerlist){
  4233. appendMissingClass(mylink.parentNode,'hasLayers');
  4234. }
  4235. else {
  4236. removeClass(mylink.parentNode,'hasLayers');
  4237. }
  4238. if(pformchanged){
  4239. updatePageFormNoHistory();
  4240. }
  4241. }
  4242. } // end of image (dimension) control builds
  4243. }
  4244. function DLimageBuildZoom(mylink){
  4245. var myfigure = mylink.figureimage;
  4246. if(!myfigure.myoverlay){
  4247. //if(false){
  4248. var myimgdiv = document.createElement('div');
  4249. myfigure.myoverlay=myimgdiv;
  4250. myimgdiv.className="imageOverlayDiv inactive imageoverlaypart";
  4251. myimgdiv.style.position='absolute';
  4252. // myimgdiv.style.width=myfigure.width + 'px';
  4253. // myimgdiv.style.height=myfigure.height + 'px';
  4254. // image is not necessarily loaded yet, so cannot be sure of the image size.
  4255. myimgdiv.style.width=myfigure.clientWidth + 'px';
  4256. myimgdiv.style.height=myfigure.clientHeight + 'px';
  4257. myimgdiv.style.padding='0px';
  4258. // events on div for almost everybody
  4259. myimgdiv.onmousedown=startdrag;
  4260. myimgdiv.onmouseup=stopdrag;
  4261. myimgdiv.onmousemove=followdrag;
  4262. myimgdiv.evtfnonmousedown=startdrag;
  4263. myimgdiv.evtfnonmouseup=stopdrag;
  4264. myimgdiv.evtfnonmousemove=followdrag;
  4265. /* myimgdiv.onmouseover=hello; */
  4266. myimgdiv.onmouseout=goodbye;
  4267. // hello for everybody -- turns on overlays
  4268. myfigure.onmouseover=hello;
  4269. // events on figure for IE9
  4270. myfigure.onmousedown=startdrag;
  4271. myfigure.onmouseup=stopdrag;
  4272. myfigure.onmousemove=followdrag;
  4273. myfigure.onmouseout=goodbye;
  4274. myfigure.onclick=skipme;
  4275. myimgdiv.mycontainer=myfigure.parentNode;
  4276. myimgdiv.zoomstatus=document.createElement('div');
  4277. myimgdiv.zoomstatus.className='zoomStatus imageoverlaypart';
  4278. myimgdiv.zoomstatus.style.position='absolute';
  4279. myimgdiv.zoomstatus.style.visibility='hidden';
  4280. myimgdiv.appendChild(myimgdiv.zoomstatus);
  4281. myimgdiv.outline=document.createElement('div');
  4282. myimgdiv.outline.className='imageoverlaypart clipper';
  4283. myimgdiv.outline.style.visibility='hidden';
  4284. myimgdiv.outline.style.position='absolute';
  4285. myimgdiv.outline.style.width='85px';
  4286. myimgdiv.outline.style.height='54px';
  4287. myimgdiv.outline.style.left='102px';
  4288. myimgdiv.outline.style.top='50px';
  4289. myimgdiv.outline.style.zindex='5';
  4290. myimgdiv.outline.style.backgroundColor='#E00000';
  4291. myimgdiv.outline.style.color='#ffff99';
  4292. myimgdiv.outline.onclick=skipme;
  4293. myimgdiv.outline.onmousemove=skipme;
  4294. myimgdiv.appendChild(myimgdiv.outline);
  4295. myimgdiv.outlineimage=document.createElement('div');
  4296. myimgdiv.outlineimage.className='imageoverlaypart';
  4297. myimgdiv.outlineimage.style.position='absolute';
  4298. myimgdiv.outlineimage.style.left='-102px';
  4299. myimgdiv.outlineimage.style.top='-50px';
  4300. myimgdiv.outlineimage.style.clip='rect(52px 184px 102px 104px)';
  4301. myimgdiv.outline.appendChild(myimgdiv.outlineimage);
  4302. myimgdiv.outlineimage.onclick=skipme;
  4303. myimgdiv.outlineimage.onmousemove=skipme;
  4304. myimgdiv.inputimage=myfigure;
  4305. var newimg=document.createElement("img");
  4306. newimg.width=myimgdiv.inputimage.width;
  4307. newimg.height=myimgdiv.inputimage.height;
  4308. newimg.src=myimgdiv.inputimage.src;
  4309. myimgdiv.outlineimage.appendChild(newimg);
  4310. myfigure.parentNode.insertBefore(myimgdiv,myfigure);
  4311. // myimgdiv.appendChild(myfigure);
  4312. var pform=document.getElementById('pageform');
  4313. if(pform){
  4314. var bbox = pform.elements['bbox'];
  4315. if(!bbox){
  4316. bbox = document.createElement('input');
  4317. bbox.name='bbox';
  4318. bbox.type='hidden';
  4319. bbox.className = myfigure.className.split(' ')[0] + ' share';
  4320. pform.appendChild(bbox);
  4321. }
  4322. }
  4323. }
  4324. }
  4325. function hideImageOverlay(myfigure){
  4326. if(myfigure.myoverlay){
  4327. var myimgdiv=myfigure.myoverlay;
  4328. myimgdiv.outline.style.visibility='hidden';
  4329. myimgdiv.inputimage.style.visibility='visible';
  4330. }
  4331. }
  4332. function resetImageOverlay(myfigure){
  4333. if(myfigure.myoverlay){
  4334. var myimgdiv = myfigure.myoverlay;
  4335. myimgdiv.style.width=myfigure.clientWidth + 'px';
  4336. myimgdiv.style.height=myfigure.clientHeight + 'px';
  4337. myimgdiv.outlineimage.children[0].width=myfigure.width;
  4338. myimgdiv.outlineimage.children[0].height=myfigure.height;
  4339. myimgdiv.outlineimage.children[0].src=myfigure.src;
  4340. }
  4341. }
  4342. function getcurrentTarget(evt) {
  4343. evt = (evt) ? evt : event;
  4344. if(evt){
  4345. var elem = (evt.currentTarget) ? evt.currentTarget : null;
  4346. if(elem){
  4347. return elem;
  4348. }
  4349. }
  4350. return null;
  4351. }
  4352. var myobj=null;
  4353. function clearmyobj(){
  4354. myobj=null;
  4355. }
  4356. function hello(evt){
  4357. var myimgdiv;
  4358. var newentrance=false;
  4359. var mytarget=getcurrentTarget(evt);
  4360. if(!mytarget){mytarget=this};
  4361. if(mytarget.myoverlay){
  4362. myimgdiv = mytarget.myoverlay;
  4363. if(myimgdiv.className.indexOf('inactive')>=0){
  4364. newentrance='true';
  4365. changeClass(myimgdiv,'inactive','active');
  4366. }
  4367. }
  4368. else {
  4369. myimgdiv = mytarget;
  4370. }
  4371. if(newentrance){
  4372. var myform=document.getElementById('pageform');
  4373. var myinfo = myimgdiv.inputimage.mylink.info;
  4374. var checkobj;
  4375. sizeto(myimgdiv.outline,0,0);
  4376. clearmyobj();
  4377. if(myform){
  4378. checkobj = myform.elements['region'];
  4379. }
  4380. var mypar=myimgdiv.zoomstatus;
  4381. if(mypar){
  4382. if(checkobj){
  4383. var res = myform.elements['resolution'];
  4384. if(res && res.length){
  4385. /* if multiple resolutions, uses first */
  4386. res = res[0];
  4387. }
  4388. var resclass="point";
  4389. /* if there is a resolution select menu, uses its labels */
  4390. var resselect = document.getElementsByClassName('pageformcopy');
  4391. if(resselect.length>0){
  4392. for(var i=resselect.length;i--;){
  4393. if(resselect[i].name=='resolution'){
  4394. for (var j=resselect[i].options.length;j--;){
  4395. if(resselect[i].options[j].value==res.value){
  4396. resclass=resselect[i].options[j].text;
  4397. }
  4398. }
  4399. }
  4400. }
  4401. }
  4402. if(res && resclass=='point'){
  4403. if(res.value.substring && res.value.substring(0,6)=='irids:'){
  4404. var parts = res.value.split(':');
  4405. resclass = parts[parts.length-2];
  4406. }
  4407. else {
  4408. if(myinfo['wms:CRS'] == 'EPSG:4326'){
  4409. resclass = res.value + "&deg; box";
  4410. }
  4411. else {
  4412. resclass = res.value + "m box";
  4413. }
  4414. }
  4415. }
  4416. // adds pickRegion if necessary to indicate that we could pick a point or choose an area
  4417. appendMissingClass(myimgdiv,'pickRegion');
  4418. mypar.innerHTML="click for " + resclass +"<br /> click-drag-release for larger or to zoom in";
  4419. }
  4420. else {
  4421. mypar.innerHTML="click-drag-release to zoom in";
  4422. }
  4423. mypar.style.visibility="visible";
  4424. mypar.timeoutId=setTimeout(function () {mypar.style.visibility='hidden'},3000);
  4425. }
  4426. }
  4427. return true;
  4428. }
  4429. function goodbye(evt){
  4430. var myimgdiv;
  4431. var mytarget=getcurrentTarget(evt);
  4432. if(!mytarget){mytarget=this};
  4433. evt = (evt) ? evt : event;
  4434. if(mytarget.myoverlay){
  4435. myimgdiv = mytarget.myoverlay;
  4436. }
  4437. else {
  4438. myimgdiv = mytarget;
  4439. }
  4440. if(myimgdiv){
  4441. if(!evt.relatedTarget || (evt.relatedTarget.className.indexOf('imageoverlaypart') == -1 && evt.relatedTarget != myimgdiv.inputimage && evt.relatedTarget.parentNode != myimgdiv.outlineimage )){
  4442. changeClass(myimgdiv,'active','inactive');
  4443. if(myimgdiv.zoomstatus){
  4444. myimgdiv.zoomstatus.style.visibility="hidden";
  4445. if(myimgdiv.zoomstatus.timeoutId){
  4446. clearTimeout(myimgdiv.zoomstatus.timeoutId);
  4447. myimgdiv.zoomstatus.timeoutID=null;
  4448. }
  4449. }
  4450. }
  4451. }
  4452. return true;
  4453. }
  4454. /* drag zoom routines */
  4455. var myx,myy;
  4456. function doit(state){
  4457. myit=document.getElementById("outline");
  4458. myit.style.visibility=state;
  4459. return false;
  4460. }
  4461. function stopdrag(evt){
  4462. evt = (evt) ? evt : event;
  4463. var myimgdiv;
  4464. var mytarget=getcurrentTarget(evt);
  4465. if(!mytarget){mytarget=this};
  4466. if(mytarget.myoverlay){
  4467. myimgdiv = mytarget.myoverlay;
  4468. }
  4469. else {
  4470. myimgdiv = mytarget;
  4471. }
  4472. var myinfo = myimgdiv.inputimage.mylink.info;
  4473. var myclasses = myimgdiv.inputimage.className;
  4474. removeClass(myimgdiv,'zoomArea');
  4475. var myvals;
  4476. if(myobj != null && myinfo){
  4477. if(myobj.style.visibility == 'visible'){
  4478. myvals=lonlat(myinfo,myimgdiv.inputimage.className,myimgdiv.inputimage.clientWidth,parseInt(myobj.style.left),parseInt(myobj.style.top),parseInt(myobj.style.width),parseInt(myobj.style.height));
  4479. changeClass(myimgdiv.inputimage,'valid','invalid-zooming');
  4480. }
  4481. else {
  4482. var dx,dy;
  4483. /* using inputimage as coordinate reference because firefox performs better with it -- I think because it is a visible object unlike myimgdiv, so it is positioned more reliably. Also helps keep the overlay and the image aligned. */
  4484. dx=evt.clientX + window.pageXOffset - absLeft(myimgdiv.inputimage);
  4485. dy=evt.clientY + window.pageYOffset - absTop(myimgdiv.inputimage);
  4486. myvals=lonlat(myinfo,myimgdiv.inputimage.className,myimgdiv.inputimage.clientWidth,dx,dy,0,0);
  4487. }
  4488. setbbox(myvals,myinfo,myclasses);
  4489. }
  4490. if(myobj != null && myobj.style.visibility == 'visible'){
  4491. evt.cancelBubble = true;
  4492. myobj=null;
  4493. mypar=myimgdiv.zoomstatus;
  4494. // mypar.innerHTML="zooming " + JSON.stringify(myvals);
  4495. mypar.innerHTML="zooming... ";
  4496. // mypar.style.visibility="visible";
  4497. return false;
  4498. }
  4499. else {
  4500. myobj=null;
  4501. return true;
  4502. }
  4503. }
  4504. function absLeft(obj){
  4505. var myval=0;
  4506. if(obj){
  4507. if(obj.offsetParent){
  4508. myval=obj.offsetLeft + absLeft(obj.offsetParent);
  4509. }
  4510. else {
  4511. myval=obj.offsetLeft;
  4512. }
  4513. }
  4514. return myval;
  4515. }
  4516. function absTop(obj){
  4517. var myval=0;
  4518. if(obj){
  4519. if(obj.offsetParent){
  4520. myval=obj.offsetTop + absTop(obj.offsetParent);
  4521. }
  4522. else {
  4523. myval=obj.offsetTop;
  4524. }
  4525. }
  4526. return myval;
  4527. }
  4528. function startdrag(evt){
  4529. evt = (evt) ? evt : event;
  4530. var myimgdiv;
  4531. var mytarget=getcurrentTarget(evt);
  4532. if(!mytarget){mytarget=this};
  4533. if(mytarget.myoverlay){
  4534. myimgdiv = mytarget.myoverlay;
  4535. }
  4536. else {
  4537. myimgdiv = mytarget;
  4538. }
  4539. /* makes sure myimgdiv is active, otherwise will not have valid position */
  4540. changeClass(myimgdiv,'inactive','active');
  4541. var myworld = myimgdiv.mycontainer;
  4542. if(myworld){
  4543. var myinfo = myimgdiv.inputimage.mylink.info;
  4544. var plotborderleft = myinfo["iridl:plotborderleft"];
  4545. var plotbordertop = myinfo["iridl:plotbordertop"];
  4546. var plotborderright = myinfo["iridl:plotborderright"];
  4547. var plotborderbottom = myinfo["iridl:plotborderbottom"];
  4548. // alert(evt.layerX + ' ' + evt.x + ' ' + evt.pageX + ' ' + absLeft(myimgdiv));
  4549. myx=evt.clientX + window.pageXOffset - absLeft(myimgdiv.inputimage);
  4550. myy=evt.clientY + window.pageYOffset - absTop(myimgdiv.inputimage);
  4551. if(myobj == null){
  4552. myobj = myimgdiv.outline;
  4553. sizeto(myobj,0,0);
  4554. // added zoomArea class to imgdiv to indicate that we are now choosing an area
  4555. appendMissingClass(myimgdiv,'zoomArea');
  4556. return false;
  4557. }else
  4558. {return true;
  4559. }
  4560. }
  4561. }
  4562. function followdrag(evt){
  4563. evt = (evt) ? evt : event;
  4564. var myimgdiv;
  4565. var mytarget=getcurrentTarget(evt);
  4566. if(!mytarget){mytarget=this};
  4567. if(mytarget.myoverlay){
  4568. myimgdiv = mytarget.myoverlay;
  4569. }
  4570. else {
  4571. myimgdiv = mytarget;
  4572. }
  4573. var myworld = myimgdiv.mycontainer;
  4574. if(myworld){
  4575. var myinfo = myimgdiv.inputimage.mylink.info;
  4576. var plotborderleft = myinfo["iridl:plotborderleft"];
  4577. var plotbordertop = myinfo["iridl:plotbordertop"];
  4578. var plotborderright = myinfo["iridl:plotborderright"];
  4579. var plotborderbottom = myinfo["iridl:plotborderbottom"];
  4580. var Xaxislength = myinfo["iridl:Xaxislength"];
  4581. var Yaxislength = myinfo["iridl:Yaxislength"];
  4582. var px,py;
  4583. if(myobj != null){
  4584. px=evt.clientX + window.pageXOffset;
  4585. py=evt.clientY + window.pageYOffset;
  4586. dx = px - absLeft(myimgdiv.inputimage);
  4587. dy = py - absTop(myimgdiv.inputimage);
  4588. cw=parseInt(myobj.style.width);
  4589. ch=parseInt(myobj.style.height);
  4590. newx=Math.min(dx,myx);
  4591. newy=Math.min(dy,myy);
  4592. neww=Math.max(dx,myx)-newx;
  4593. newh=Math.max(dy,myy)-newy;
  4594. //if(newx >plotborderleft && newy>plotborderright&& newx+neww<Xaxislength+plotborderleft && newy+newh < Yaxislength+plotbordertop)
  4595. if(true){
  4596. sizeto(myimgdiv.outline,neww,newh);
  4597. if(cw*ch > 0){
  4598. myimgdiv.outline.style.visibility='visible';
  4599. }
  4600. shiftto(myimgdiv.outline,newx,newy);
  4601. }
  4602. evt.cancelBubble = true;
  4603. }
  4604. }
  4605. return false;
  4606. }
  4607. function skipme(evt){
  4608. return false;
  4609. }
  4610. function stopevent(evt){
  4611. evt = (evt) ? evt : event;
  4612. evt.cancelBubble = true;
  4613. return true;
  4614. }
  4615. function classMatch (clists, clists2){
  4616. var clist = clists.split(' ');
  4617. var clist2 = clists2.split(' ');
  4618. for ( var i = 0; i < clist.length; i++ ){
  4619. for (var j = 0 ; j < clist2.length; j++){
  4620. if(clist[i] == clist2[j]){
  4621. return true;
  4622. }
  4623. }
  4624. }
  4625. return false;
  4626. }
  4627. function plotaxislengthfn(myinfo,imageclass){
  4628. var plotaxislength;
  4629. var Xaxislength = myinfo["iridl:Xaxislength"];
  4630. var Yaxislength = myinfo["iridl:Yaxislength"];
  4631. var pform=document.getElementById('pageform');
  4632. if(pform && pform.elements['plotaxislength'] && classMatch(imageclass,pform.elements['plotaxislength'].className) && pform.elements['plotaxislength'].value){
  4633. plotaxislength = pform.elements['plotaxislength'].value;
  4634. }
  4635. else {
  4636. if(Xaxislength >= Yaxislength){
  4637. plotaxislength = Xaxislength;
  4638. }
  4639. else {
  4640. plotaxislength = Yaxislength;
  4641. }
  4642. }
  4643. return(plotaxislength);
  4644. }
  4645. lonlatA=new Array();
  4646. function lonlat(myinfo,myclass,imagewidth,left,top,width,height){
  4647. myA=lonlatA;
  4648. var plotborderleft = myinfo["iridl:plotborderleft"];
  4649. var plotbordertop = myinfo["iridl:plotbordertop"];
  4650. var plotborderright = myinfo["iridl:plotborderright"];
  4651. var plotborderbottom = myinfo["iridl:plotborderbottom"];
  4652. var plotaxislength = plotaxislengthfn(myinfo,myclass);
  4653. var Xaxislength = myinfo["iridl:Xaxislength"];
  4654. var Yaxislength = myinfo["iridl:Yaxislength"];
  4655. myA = getbbox(myinfo,myclass);
  4656. var X0,X1,Y0,Y1,DX,DY;
  4657. X0 = myA[0];
  4658. Y0 = myA[1];
  4659. X1 = myA[2];
  4660. Y1 = myA[3];
  4661. ifdefault = myA[4];
  4662. if(X1>X0) {
  4663. DX = X1-X0;
  4664. } else {
  4665. DX = X0 - X1;
  4666. }
  4667. if(Y1>Y0) {
  4668. DY = Y1-Y0;
  4669. } else {
  4670. DY = Y0 - Y1;
  4671. }
  4672. /* needs to use bbox limits to modify if not full range */
  4673. if(ifdefault){
  4674. if(Xaxislength >= Yaxislength) {
  4675. Yaxislength = Math.round((plotaxislength * Yaxislength)/Xaxislength);
  4676. Xaxislength = plotaxislength;
  4677. }
  4678. else {
  4679. Xaxislength = Math.round((plotaxislength * Xaxislength)/Yaxislength);
  4680. Yaxislength = plotaxislength;
  4681. }
  4682. }
  4683. else {
  4684. if(DX >= DY) {
  4685. Yaxislength = Math.round((plotaxislength * DY)/DX);
  4686. Xaxislength = plotaxislength;
  4687. }
  4688. else {
  4689. Xaxislength = Math.round((plotaxislength * DX)/DY);
  4690. Yaxislength = plotaxislength;
  4691. }
  4692. }
  4693. frac = imagewidth/(parseFloat(plotborderleft) + parseFloat(Xaxislength) + parseFloat(plotborderright));
  4694. nxl = X0 + (X1-X0)*(left-frac*plotborderleft)/(frac*Xaxislength);
  4695. nxr = X0 + (X1-X0)*(left+width-frac*plotborderleft)/(frac*Xaxislength);
  4696. nyt = Y1 - (Y1-Y0)*(top-frac*plotbordertop)/(frac*Yaxislength);
  4697. nyb = Y1 - (Y1-Y0)*(top+height-frac*plotbordertop)/(frac*Yaxislength);
  4698. var scale = Math.max(0,4 - Math.floor(Math.log(Math.abs(X1-X0))/Math.log(10.)));
  4699. nxl = nxl.toFixed(scale);
  4700. nxr = nxr.toFixed(scale);
  4701. scale = Math.max(0,4 - Math.floor(Math.log(Math.abs(Y1-Y0))/Math.log(10.)));
  4702. nyt = nyt.toFixed(scale);
  4703. nyb = nyb.toFixed(scale);
  4704. myA[0]=nxl;
  4705. myA[1]=nyb;
  4706. myA[2]=nxr;
  4707. myA[3]=nyt;
  4708. return myA;
  4709. }
  4710. function grow(myit,dx,dy){
  4711. myit.style.width=parseInt(myit.style.width)+dx+'px';
  4712. myit.style.height=parseInt(myit.style.height)+dy+'px';
  4713. myitt=myit.childNodes[0];
  4714. var re=/(\d+)px,?\s*(\d+)px,?\s*(\d+)px,?\s*(\d+)px/;
  4715. var results = re.exec(myitt.style.clip);
  4716. myitt.style.clip="rect(" + results[1] + "px " + (parseInt(results[2])+dx) + "px " +
  4717. (parseInt(results[3])+dy) + "px " + results[4] + "px)";
  4718. return false;
  4719. }
  4720. function sizeto(myit,dx,dy){
  4721. cw=parseInt(myit.style.width);
  4722. ch=parseInt(myit.style.height);
  4723. grow(myit,dx-cw,dy-ch);
  4724. }
  4725. function shiftby(myit,dx,dy){
  4726. myit.style.left=parseInt(myit.style.left)+dx+'px';
  4727. myit.style.top=parseInt(myit.style.top)+dy+'px';
  4728. myitt=myit.childNodes[0];
  4729. var re=/(\d+)px,?\s*(\d+)px,?\s*(\d+)px,?\s*(\d+)px/;
  4730. var results = re.exec(myitt.style.clip);
  4731. myitt.style.clip="rect(" + (parseInt(results[1])+dy) + "px " + (parseInt(results[2])+dx) + "px " +
  4732. (parseInt(results[3])+dy) + "px " + (parseInt(results[4])+dx) + "px)";
  4733. myitt.style.left=parseInt(myitt.style.left)-dx+'px';
  4734. myitt.style.top=parseInt(myitt.style.top)-dy+'px';
  4735. return false;
  4736. }
  4737. function shiftto(myit,newx,newy){
  4738. cleft=parseInt(myit.style.left);
  4739. ctop=parseInt(myit.style.top);
  4740. shiftby(myit,newx-cleft,newy-ctop);
  4741. }
  4742. /* end of drag zoom routines */
  4743. function insertInstructions(){
  4744. var mylist=document.getElementsByClassName("buttonInstructions");
  4745. if(mylist.length>0){
  4746. /* make sure Set-Language has carryLanguage */
  4747. var myform=document.getElementById('pageform');
  4748. if(myform){
  4749. var slang=myform.elements['Set-Language'];
  4750. if(slang){
  4751. appendMissingClass(slang,'carryLanguage');
  4752. appendMissingClass(myform,'carryLanguage');
  4753. }
  4754. }
  4755. var cont=mylist[0];
  4756. if(typeof(cont.filledOut)=='undefined'){
  4757. cont.filledOut=true;
  4758. var el = document.createElement('a');
  4759. el.rel="iridl:hasJSON";
  4760. el.className="carryLanguage";
  4761. el.href="/uicore/toolinfo/buttoninfo.json";
  4762. cont.appendChild(el);
  4763. el = document.createElement('script');
  4764. el.type = "application/json";
  4765. el.setAttribute('property','iridl:hasPUREdirective');
  4766. el.className="instructionsTemplate";
  4767. el.text='{".button" : {"button<-uicore:buttonList":{".icon@class+": "button.uicore:icon",".label": "button.term:label",".description": "button.term:description"}}}';
  4768. cont.appendChild(el);
  4769. el=document.createElement('div');
  4770. el.className="instructionsTemplate";
  4771. cont.appendChild(el);
  4772. var el2=document.createElement('div');
  4773. el2.className="button";
  4774. el.appendChild(el2);
  4775. el=document.createElement('div');
  4776. el.className="dlimagecontrol icon ";
  4777. el2.appendChild(el);
  4778. el=document.createTextNode(' ');
  4779. el2.appendChild(el);
  4780. el=document.createElement('span');
  4781. el.className="label";
  4782. el2.appendChild(el);
  4783. el=document.createTextNode(' ');
  4784. el2.appendChild(el);
  4785. el=document.createElement('span');
  4786. el.className="description";
  4787. el2.appendChild(el);
  4788. }
  4789. }
  4790. }
  4791. function insertcontrolBar(){
  4792. var s=document.getElementById('homelink');
  4793. if(!s){
  4794. var mylist=document.getElementsByClassName("controlBar");
  4795. if(mylist.length>0){
  4796. var cont=mylist[0];
  4797. var gb= document.createElement('div');
  4798. gb.id='homelink';
  4799. var homelinks=getElementsByAttribute(document,'link','rel','home');
  4800. var homelinkjson=getElementsByAttribute(document,'link','rel','home alternate');
  4801. gb.inout='out';
  4802. gb.onclick=homelinkclick;
  4803. gb.myonclick=homelinkclick;
  4804. if(homelinkjson.length == 1
  4805. && navigator.appVersion.indexOf('MSIE 8')<0) {
  4806. // menu from json
  4807. appendMissingClass(gb,'HomeSelect');
  4808. var mylink = document.createElement('a');
  4809. mylink.setAttribute('rel','iridl:hasJSON');
  4810. mylink.className=homelinkjson[0].className;
  4811. mylink.href=homelinkjson[0].href;
  4812. gb.appendChild(mylink);
  4813. gb.pureTemplateClass = 'homeTemplate';
  4814. gb.pureDirective = {
  4815. 'option.toplist' : {
  4816. 'opt<-options':{
  4817. '.': 'opt.title',
  4818. '.@value': 'opt.href',
  4819. }
  4820. },
  4821. 'optgroup' : {
  4822. 'grp<-groups':{
  4823. '.@label': 'grp.title',
  4824. 'option' : {
  4825. 'oopt<-grp.links':{
  4826. '.': 'oopt.title',
  4827. '.@value': 'oopt.href',
  4828. }
  4829. }
  4830. }
  4831. }
  4832. }
  4833. var sel = document.createElement('select');
  4834. sel.name = 'homelinksel';
  4835. sel.id = 'homelinksel';
  4836. sel.onchange=dohomesel;
  4837. sel.myonchange=dohomesel;
  4838. sel.className='homeTemplate homeselect pageformcopy';
  4839. var opt;
  4840. opt=document.createElement('option');
  4841. opt.innerHTML=' ';
  4842. opt.value='';
  4843. opt.className='toplist';
  4844. sel.appendChild(opt);
  4845. opt=document.createElement('optgroup');
  4846. opt.innerHTML=' ';
  4847. opt.value='';
  4848. var oopt=document.createElement('option');
  4849. oopt.innerHTML=' ';
  4850. oopt.value='';
  4851. opt.appendChild(oopt);
  4852. sel.appendChild(opt);
  4853. opt=document.createElement('option');
  4854. opt.innerHTML=' ';
  4855. opt.value='';
  4856. opt.className='emptyOption';
  4857. sel.appendChild(opt);
  4858. gb.appendChild(sel);
  4859. var myform=document.getElementById('pageform');
  4860. if(myform){
  4861. var ipt = document.createElement('input');
  4862. ipt.name='homelinksel';
  4863. ipt.id = 'homelinksel';
  4864. ipt.type='hidden';
  4865. ipt.value='unseturl';
  4866. myform.appendChild(ipt);
  4867. }
  4868. }
  4869. else if(homelinks.length > 1) {
  4870. // menu from flat list of links
  4871. var sel = document.createElement('select');
  4872. appendMissingClass(gb,'HomeSelect');
  4873. sel.name = 'homelinksel';
  4874. sel.name = 'homelinksel';
  4875. sel.onchange=dohomesel;
  4876. sel.myonchange=dohomesel;
  4877. var opt=document.createElement('option');
  4878. opt.innerHTML=' ';
  4879. opt.value='';
  4880. sel.appendChild(opt);
  4881. var cnt=1;
  4882. for(var i = 0; i < homelinks.length ; i++){
  4883. var title = homelinks[i].title;
  4884. if(title){
  4885. var opt=document.createElement('option');
  4886. opt.innerHTML=title;
  4887. opt.value=homelinks[i].href;
  4888. sel.appendChild(opt);
  4889. cnt = cnt + 1;
  4890. }
  4891. }
  4892. sel.selectedIndex=-1;
  4893. gb.appendChild(sel);
  4894. }
  4895. /* skips over text nodes, links, and scripts to get homelink next to other displayed elements */
  4896. var cfirst = cont.firstChild;
  4897. while (cfirst && (!cfirst.tagName || cfirst.tagName=='A' || cfirst.tagName=='SCRIPT')){
  4898. cfirst = cfirst.nextSibling;
  4899. }
  4900. cont.insertBefore(gb,cfirst);
  4901. var slist = cont.getElementsByTagName('select');
  4902. for (var i=0; i<slist.length ; i++){
  4903. var mysel = slist[i];
  4904. if(mysel.name != 'homelinksel' && mysel.previousSibling && mysel.previousSibling.className != "selectvalue"){
  4905. var sv = document.createElement('span');
  4906. sv.className='selectvalue';
  4907. sv.onclick=selectvalueclick;
  4908. sv.onclickFn=selectvalueclick;
  4909. if(mysel.selectedIndex >=0){
  4910. sv.innerHTML=mysel.options[mysel.selectedIndex].innerHTML;
  4911. sv.setAttribute('value',sv.innerHTML);
  4912. }
  4913. mysel.parentNode.insertBefore(sv,mysel);
  4914. }
  4915. }
  4916. }
  4917. }
  4918. insertlang();
  4919. }
  4920. /* this exists to convince ios to send events to selectvalue for CSS */
  4921. function selectvalueclick (evt) {
  4922. evt = (evt) ? evt : ((event) ? event : null );
  4923. it = (evt.currentTarget) ? evt.currentTarget : this;
  4924. if(it.nextSibling && it.nextSibling.dispatchEvent){
  4925. it.nextSibling.dispatchEvent(evt);
  4926. }
  4927. return true;
  4928. }
  4929. var Languages = new Array();
  4930. Languages["en"]="english";
  4931. Languages["es"]="espa&#241;ol";
  4932. Languages["in"]="bahasa";
  4933. Languages["fr"]="fran&ccedil;ais";
  4934. Languages["id"]="bahasa";
  4935. Languages["ru"]="русский";
  4936. Languages["sw"]="swahili";
  4937. Languages["mg"]="malagasy";
  4938. Languages["ar"]="العَرَبِية";
  4939. Languages["rw"]="kinyarwanda";
  4940. Languages["vi"]="Ti&#x1EBF;ng Vi&#x1EC7;t";
  4941. var LanguageTitle = new Array();
  4942. LanguageTitle["en"]="Language";
  4943. LanguageTitle["es"]="Idioma";
  4944. LanguageTitle["in"]="Bahasa";
  4945. LanguageTitle["fr"]="Langue";
  4946. LanguageTitle["id"]="Bahasa";
  4947. LanguageTitle["ru"]="Язык";
  4948. LanguageTitle["sw"]="Lugha";
  4949. LanguageTitle["mg"]="Teny";
  4950. LanguageTitle["ar"]="لغة";
  4951. LanguageTitle["rw"]="Ururimi";
  4952. LanguageTitle["vi"]="Ng&ocirc;n ng&#x1EEF;";
  4953. function languageChange(){
  4954. var s=document.getElementById('chooseLanguage');
  4955. var sel=s.getElementsByTagName('select')[0];
  4956. var myform=document.getElementById('pageform');
  4957. var lang;
  4958. var reloadOnLanguageChange=false;
  4959. if(document.getElementsByTagName('body')[0].className.indexOf('reloadOnLanguageChange') >= 0){reloadOnLanguageChange=true;}
  4960. if(myform){
  4961. lang=myform.elements['lang'];
  4962. }
  4963. if(!lang){reloadOnLanguageChange=true;}
  4964. var newvalue;
  4965. var newlang=sel.options[sel.selectedIndex].value;
  4966. if(newlang){
  4967. if(!lang && location.href.substr(0,5)=='file:'){
  4968. var locq = location.href.lastIndexOf('.');
  4969. if(locq>0){
  4970. newvalue = location.href.substr(0,locq) + '.' + newlang;
  4971. }
  4972. location.href=newvalue;
  4973. }
  4974. else {
  4975. if(myform){
  4976. var slang=myform.elements['Set-Language'];
  4977. if(slang && slang.className && slang.className.indexOf('carryLanguage')<0){
  4978. appendMissingClass(slang,'carryLanguage');
  4979. appendMissingClass(myform,'carryLanguage');
  4980. }
  4981. if(lang && lang.className && lang.className.indexOf('bodyAttribute')<0){
  4982. appendMissingClass(slang,'bodyAttribute');
  4983. appendMissingClass(myform,'bodyAttribute');
  4984. }
  4985. if(sel.parentNode.firstChild.tagName == 'LEGEND'){
  4986. sel.parentNode.firstChild.innerHTML=LanguageTitle[newlang];
  4987. }
  4988. if(slang){
  4989. slang.value=newlang;
  4990. }
  4991. if(!reloadOnLanguageChange){
  4992. lang.value=newlang;
  4993. updatePageForm();
  4994. var rerun = document.getElementsByClassName('PureDependsOnLang');
  4995. for (ip = 0 ; ip < rerun.length ; ip++){
  4996. runPureOnContext(rerun[ip]);
  4997. }
  4998. }
  4999. else {
  5000. var newloc = appendPageForm('',myform.className);
  5001. location.search=newloc;
  5002. }
  5003. }
  5004. }
  5005. }
  5006. }
  5007. /* builds language menu -- note that default language is different than choosing a language */
  5008. function insertlang(){
  5009. var s=document.getElementById('chooseLanguage');
  5010. var langList=document.getElementsByClassName('altLanguage');
  5011. if(!s && langList.length>0){
  5012. fs = document.createElement('fieldset');
  5013. fs.className='lang';
  5014. fs.id='chooseLanguage';
  5015. var leg=document.createElement('legend');
  5016. leg.innerHTML='Language';
  5017. fs.appendChild(leg);
  5018. var sel=document.createElement('select');
  5019. sel.name="Set-Language";
  5020. sel.onchange=languageChange;
  5021. sel.onchangefn=languageChange;
  5022. var dopt=false;
  5023. var opt;
  5024. if(document.getElementsByTagName('html')[0].hasAttribute("xml:lang")){
  5025. dopt=true;
  5026. document.getElementsByTagName('body')[0].setAttribute("lang",
  5027. document.getElementsByTagName('html')[0].getAttribute("xml:lang"));
  5028. opt =document.createElement('option');
  5029. opt.value=document.getElementsByTagName('html')[0].getAttribute("xml:lang");
  5030. }
  5031. else if(document.getElementsByTagName('body')[0].getAttribute("xml:lang")){
  5032. dopt=true;
  5033. document.getElementsByTagName('body')[0].setAttribute("lang",
  5034. document.getElementsByTagName('body')[0].getAttribute("xml:lang"));
  5035. opt=document.createElement('option');
  5036. opt.value=document.getElementsByTagName('body')[0].getAttribute("xml:lang");
  5037. }
  5038. if(opt){
  5039. opt.innerHTML=Languages[opt.value];
  5040. //opt.value="";
  5041. sel.appendChild(opt);
  5042. }
  5043. for( var i=0 ; i < langList.length ; i++){
  5044. opt=document.createElement('option');
  5045. opt.value=langList[i].hreflang;
  5046. opt.innerHTML=Languages[langList[i].hreflang];
  5047. if(!opt.innerHTML)opt.innerHTML=langList[i].hreflang;
  5048. sel.appendChild(opt);
  5049. }
  5050. if(!dopt){
  5051. var myform=document.getElementById('pageform');
  5052. if(myform){
  5053. var lang=myform.elements['lang'];
  5054. var slang=myform.elements['Set-Language'];
  5055. if(slang && slang.value && lang && !lang.value){
  5056. lang.value = slang.value;
  5057. }
  5058. if(lang && lang.value){
  5059. sel.value=lang.value;
  5060. if(sel.selectedIndex<0)sel.selectedIndex=1;
  5061. }
  5062. if(lang && !lang.value){
  5063. lang.value=sel.options[sel.selectedIndex].value
  5064. /* reads user language preference by getting tool documentation */
  5065. getLanguageFrom(uicoreConfig.languageSettingDocument);
  5066. }
  5067. }
  5068. }
  5069. leg.innerHTML=LanguageTitle[sel.options[sel.selectedIndex].value];
  5070. fs.appendChild(sel);
  5071. var mylist=document.getElementsByClassName("controlBar");
  5072. if(mylist.length>0){
  5073. var cont=mylist[0];
  5074. cont.insertBefore(fs,cont.firstChild);
  5075. }
  5076. }
  5077. }
  5078. /* set up old style Google Analytics */
  5079. /*var _gaq = _gaq || [];
  5080. function setupGA() {
  5081. var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  5082. ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  5083. var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  5084. } */
  5085. /* set up Google Universal Analytics */
  5086. (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  5087. (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  5088. m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  5089. })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
  5090. function getQueryVariable(variable) {
  5091. var query = window.location.search.substring(1);
  5092. var vars = query.split("&");
  5093. var pair;
  5094. for (var i = 0; i < vars.length; i++) {
  5095. pair = vars[i].split("=");
  5096. if (pair[0] == variable) {
  5097. return unescape(pair[1]);
  5098. }
  5099. }
  5100. return undefined;
  5101. }
  5102. function setPageFormVariable(name,newvalue){
  5103. var myform=document.getElementById('pageform');
  5104. if(myform){
  5105. if(myform.elements[name]){
  5106. myform.elements[name].value=newvalue;
  5107. updatePageForm(myform.elements[name]);
  5108. }
  5109. }
  5110. return true;
  5111. }
  5112. function setPageForm(){
  5113. var myform=document.getElementById('pageform');
  5114. if(!myform){
  5115. var body = document.getElementsByTagName('body')[0];
  5116. myform = document.createElement('form');
  5117. myform.id = 'pageform';
  5118. myform.className='share';
  5119. body.insertBefore(myform,body.firstChild);
  5120. }
  5121. if(myform){
  5122. window.onpopstate=updatePageFormFromUrlEvt;
  5123. /* makes sure lang element is class bodyAttribute */
  5124. var langgroups = document.getElementsByClassName('langgroup');
  5125. if(langgroups.length > 0) {
  5126. var mylang = myform.elements['lang'];
  5127. if(!mylang){
  5128. mylang = document.createElement('input');
  5129. mylang.className='bodyAttribute';
  5130. mylang.name='lang';
  5131. mylang.type='hidden';
  5132. myform.appendChild(mylang);
  5133. mybody = document.getElementsByTagName('body')[0];
  5134. appendMissingClass(mybody,'reloadOnLanguageChange');
  5135. }
  5136. appendMissingClass(mylang,'bodyAttribute');
  5137. }
  5138. /* initializes pageform classes */
  5139. var inputs = myform.children;
  5140. var pfclasses = [];
  5141. var clist = myform.className.split(' ');
  5142. for (var i = 0 ; i < clist.length ; i++){
  5143. pfclasses[clist[i]] = true;
  5144. }
  5145. for (var i = 0; i < inputs.length ; i++){
  5146. var inp = inputs[i];
  5147. if(typeof(inp.initialValue) == 'undefined'){
  5148. inp.initialValue = inp.getAttribute('data-default');
  5149. if(inp.initialValue && !inp.value){
  5150. inp.value=inp.initialValue;
  5151. }
  5152. if(inp.initialValue && inp.type == 'checkbox'){
  5153. inp.initialChecked = inp.checked;
  5154. }
  5155. }
  5156. clist = inp.className.split(' ');
  5157. for (var j=0; j< clist.length; j++){
  5158. if(!pfclasses[clist[j]]){
  5159. pfclasses[clist[j]] = true;
  5160. myform.className = myform.className + ' ' + clist[j];
  5161. }
  5162. }
  5163. }
  5164. /* sets form jsonldContext
  5165. jsonldContext == context as written
  5166. nsContext == just the namespace declarations
  5167. structContext == just the structure declarations -- expanded to not depend on nsContext,
  5168. but not changed in meaning: nsContext + structContext is still jsonldContext
  5169. */
  5170. if(myform.nextElementSibling && myform.nextElementSibling.getAttribute('property') == 'iridl:hasJsonldContext'){
  5171. myform.jsonldContext = JSON.parse(myform.nextElementSibling.text);
  5172. var mysplitContext=splitContext(myform.jsonldContext);
  5173. myform.nsContext=mysplitContext[0];
  5174. myform.structContext=mysplitContext[1];
  5175. }
  5176. /* updates values from page url */
  5177. var achange=false;
  5178. var inputs=myform.elements;
  5179. var varcnts = {};
  5180. var query = window.location.search.substring(1);
  5181. var vars = query.split("&");
  5182. var pair;
  5183. for (var i = 0; i < vars.length; i++) {
  5184. pair = vars[i].split("=");
  5185. var iname=pair[0];
  5186. if (inputs[iname]) {
  5187. achange=true;
  5188. // decode and encode do not properly invert each other w.r.t. space to + conversion
  5189. var hold = pair[1].replace(/[+]/g," ");
  5190. if(!varcnts[iname]){
  5191. varcnts[iname]=0;
  5192. }
  5193. var ipos=varcnts[iname];
  5194. var refvalue = decodeURIComponent(hold);
  5195. addGMapParam(iname,refvalue,true);
  5196. if(inputs[iname].length){
  5197. if(inputs[iname][ipos].type == 'checkbox'){
  5198. for (var ick = 0 ; ick < inputs[iname].length; ick++){
  5199. if(inputs[iname][ick].value == refvalue){
  5200. inputs[iname][ick].checked = true;
  5201. }
  5202. else if(ipos == 0){
  5203. inputs[iname][ick].checked = false;
  5204. }
  5205. }
  5206. }
  5207. else {
  5208. inputs[iname][ipos].value=refvalue;
  5209. }
  5210. }
  5211. else {
  5212. inputs[iname].value=refvalue;
  5213. }
  5214. varcnts[iname] = varcnts[iname] + 1;
  5215. }
  5216. }
  5217. updatePageFormCopies(document);
  5218. }
  5219. if(history && history.pushState){
  5220. var url = location.href;
  5221. history.replaceState(url,'initial',url);
  5222. }
  5223. }
  5224. function splitContext(icontext){
  5225. var ns={},struct={};
  5226. ns['@context']={};
  5227. struct['@context']={};
  5228. var mycontext=icontext['@context'];
  5229. /* extracts namespace declarations */
  5230. for (var key in mycontext){
  5231. if(typeof(mycontext[key]) == "string"){
  5232. ns['@context'][key] = expandNS(mycontext[key],mycontext);
  5233. }
  5234. }
  5235. /* extracts structures, expanding ns */
  5236. var myns=ns['@context']
  5237. for (var key in mycontext){
  5238. if(typeof(mycontext[key]) != "string"){
  5239. myhash = mycontext[key];
  5240. var newhash={};
  5241. for (var pkey in myhash){
  5242. var curr = expandNS(myhash[pkey],myns);
  5243. newhash[expandNS(pkey,myns)]=curr;
  5244. }
  5245. struct['@context'][key] = newhash;
  5246. }
  5247. }
  5248. return [ns,struct];
  5249. }
  5250. function expandNS(curi,ns){
  5251. var rstr = curi;
  5252. if(typeof(curi) == "string"){
  5253. var cat = curi.indexOf(':');
  5254. if (cat > 0){
  5255. var abbr = curi.substring(0,cat);
  5256. var nsexp = ns[abbr];
  5257. if(nsexp){
  5258. rstr = nsexp + curi.substring(cat+1);
  5259. }
  5260. }
  5261. }
  5262. return rstr;
  5263. }
  5264. /* onpopstate handler */
  5265. function updatePageFormFromUrlEvt(evt){
  5266. updatePageFormFromUrl();
  5267. refreshConnectedGraphs();
  5268. }
  5269. function updatePageFormFromUrl(elementtocheck){
  5270. /* updates values from page url */
  5271. var myform=document.getElementById('pageform');
  5272. if(myform){
  5273. var achange=false;
  5274. var inputs;
  5275. if(elementtocheck){
  5276. inputs=[];
  5277. inputs[elementtocheck.name]=elementtocheck;
  5278. inputs[0]=elementtocheck;
  5279. }
  5280. else {
  5281. inputs=myform.elements;
  5282. }
  5283. var varcnts = {};
  5284. for(var i=0; i < inputs.length; i++){
  5285. var inp=inputs[i];
  5286. if(typeof(inp.initialValue) != 'undefined' && inp.value != inp.initialValue){
  5287. achange=true;
  5288. inp.value = inp.initialValue;
  5289. }
  5290. else if(inp.type == 'checkbox'){
  5291. if(typeof(inp.initialChecked)=='undefined'){
  5292. inp.initialChecked=true;
  5293. }
  5294. if(inp.checked != inp.initialChecked){
  5295. achange=true;
  5296. inp.checked = inp.initialChecked;
  5297. }
  5298. }
  5299. }
  5300. var query = window.location.search.substring(1);
  5301. var vars = query.split("&");
  5302. var pair;
  5303. for (var i = 0; i < vars.length; i++) {
  5304. pair = vars[i].split("=");
  5305. var iname=pair[0];
  5306. if (inputs[iname]) {
  5307. achange=true;
  5308. // decode and encode do not properly invert each other w.r.t. space to + conversion
  5309. var hold = pair[1].replace(/[+]/g," ");
  5310. if(!varcnts[iname]){
  5311. varcnts[iname]=0;
  5312. }
  5313. var ipos=varcnts[iname];
  5314. if(inputs[iname].length){
  5315. if(inputs[iname][ipos].type == 'checkbox'){
  5316. var newvalue = decodeURIComponent(hold);
  5317. for (var j = ipos; j < inputs[iname].length; j++){
  5318. if(varcnts[iname] == 0){
  5319. inputs[iname][j].checked = false;
  5320. }
  5321. if(inputs[iname][j].value == newvalue){
  5322. inputs[iname][j].checked = true;
  5323. }
  5324. }
  5325. }
  5326. else {
  5327. inputs[iname][ipos].value=decodeURIComponent(hold);
  5328. achange=true;
  5329. }
  5330. }
  5331. else {
  5332. var newvalue=decodeURIComponent(hold);
  5333. inputs[iname].value=newvalue;
  5334. if(iname=='Set-Language' && inputs['lang'])inputs['lang'].value=newvalue;
  5335. achange=true;
  5336. }
  5337. varcnts[iname] = varcnts[iname] + 1;
  5338. }
  5339. }
  5340. if(achange){updatePageFormNoHistory()};
  5341. }
  5342. if(window.location.hash){
  5343. var mytab = makeTabActiveFromHash(window.location.hash);
  5344. if(mytab){
  5345. var mylabel = mytab.children[0].innerText;
  5346. if(mylabel){
  5347. document.title=addTabToTitle(mylabel);
  5348. }
  5349. }
  5350. }
  5351. else {
  5352. clearTabActive();
  5353. }
  5354. }
  5355. function disableNullInputs(){
  5356. var myform=document.getElementById('pageform');
  5357. if(myform){
  5358. var inputs=myform.elements;
  5359. for (var i = 0; i < inputs.length; i++) {
  5360. if(inputs[i].length){
  5361. /* multiple inputs with one name -- switch together */
  5362. var allq=true;
  5363. var myl=inputs[i];
  5364. if(myl.type='checkbox'){
  5365. for(var j=myl.length;j--;){
  5366. /* i.e. all disabled if all defaultChecked */
  5367. if(myl[j].checked != myl[j].defaultChecked) {allq=false}
  5368. };
  5369. if(!allq){
  5370. var myl=inputs[i];
  5371. for(var j=myl.length;j--;myl[j].disabled=true);
  5372. }
  5373. }
  5374. else {
  5375. for(var j=myl.length;j--;){
  5376. if(myl[j].value != myl[j].initialValue) {allq=false}
  5377. };
  5378. if(!allq){
  5379. var myl=inputs[i];
  5380. for(var j=myl.length;j--;myl[j].disabled=true);
  5381. }
  5382. }
  5383. }
  5384. else {
  5385. /* single input with name */
  5386. if(!inputs[i].value){
  5387. inputs[i].disabled=true;
  5388. }
  5389. }
  5390. }
  5391. }
  5392. }
  5393. function addLanguageVar(url){
  5394. var myform=document.getElementById('pageform');
  5395. if(myform){
  5396. var lang=myform.elements['Set-Language'];
  5397. if(lang && lang.value){
  5398. var newurl = url;
  5399. if(newurl.charAt(newurl.length-1) == '/'){
  5400. newurl=newurl+'index.html';
  5401. }
  5402. newurl= newurl + "?Set-Language=" + lang.value;
  5403. return newurl;
  5404. }
  5405. }
  5406. return url;
  5407. }
  5408. function setupPageFormLinks(context){
  5409. var myform=document.getElementById('pageform');
  5410. if(myform){
  5411. var clist = myform.className.split(' ');
  5412. for ( var i = 0; i < clist.length; i++ )
  5413. {
  5414. var cclass=clist[i];
  5415. var members = context.getElementsByClassName(cclass);
  5416. for ( var j = 0; j < members.length; j++ ) {
  5417. if(members[j].href){
  5418. members[j].onclick=onClickPageForm;
  5419. }
  5420. if(members[j].src){
  5421. members[j].onload=imageloadedevent;
  5422. members[j].onabort=imageabortedevent;
  5423. members[j].onerror=imageerrorevent;
  5424. appendMissingClass(members[j],'valid');
  5425. }
  5426. }
  5427. }
  5428. setUIHandlers(context);
  5429. updatePageFormNoHistory();
  5430. }
  5431. }
  5432. function setUIHandlers(context){
  5433. /* pageformcopy form elements copy their values to the pageform */
  5434. var stag = context.getElementsByClassName('pageformcopy');
  5435. for (var i=0; i< stag.length ; i++){
  5436. var sel=stag[i];
  5437. if(typeof(sel.onchange) != 'function'){
  5438. sel.onchange=pageformcopyonchange;
  5439. sel.onchangefn=pageformcopyonchange;
  5440. }
  5441. }
  5442. /* like pageformcopy, but in addition to setting bbox, also sets region to match and clears clickpt */
  5443. var stag = context.getElementsByClassName('RegionMenu');
  5444. for (var i=0; i< stag.length ; i++){
  5445. var sel=stag[i];
  5446. appendMissingClass(sel,'pageformcopy');
  5447. if(typeof(sel.onchange) != 'function'){
  5448. sel.onchange=regiononchange;
  5449. sel.onchangefn=regiononchange;
  5450. }
  5451. }
  5452. /* popup regionwithinbbox: sets region to match bbox and clears clickpt */
  5453. var stag = context.getElementsByClassName('popup regionwithinbbox');
  5454. for (var i=0; i< stag.length ; i++){
  5455. var sel=stag[i];
  5456. if(typeof(sel.onchange) != 'function'){
  5457. sel.onclick=clearregionwithin;
  5458. sel.onclickfn=clearregionwithin;
  5459. }
  5460. }
  5461. /* morecount/moreitem: provides more button if more moreitem's than count */
  5462. var stag = getElementsByAttribute(context,'*','data-morecount','*');
  5463. for (var i=0; i< stag.length ; i++){
  5464. var sel=stag[i];
  5465. var morecount = sel.getAttribute('data-morecount');
  5466. var morechildren = [];
  5467. for (var j=0 ; j< sel.children.length ; j++){
  5468. if (sel.children[j].className && sel.children[j].className.indexOf('moreitem')>-1){
  5469. morechildren.push(sel.children[j]);
  5470. }
  5471. }
  5472. sel.setAttribute('moreitemcount',morechildren.length);
  5473. if (morecount < morechildren.length-3){
  5474. /* morecount is restrictive */
  5475. appendMissingClass(sel,'hasMoreButton');
  5476. sel.setAttribute('morehide',morechildren.length-morecount);
  5477. sel.onclick=toggleShowAll;
  5478. sel.onclickfn=toggleShowAll;
  5479. for (var j = 0 ; j < morecount ; j++){
  5480. appendMissingClass(morechildren[j],'belowMoreCount')
  5481. }
  5482. }
  5483. morechildren=sel.getElementsByClassName('moreitem');
  5484. for (var j = 0 ; j < morechildren.length ; j++){
  5485. if(typeof morechildren[j].onclick != 'function'){
  5486. morechildren[j].onclick=stopevent;
  5487. morechildren[j].onclickfn=stopevent;
  5488. morechildren[j].onmouseover=fixglossloc;
  5489. morechildren[j].onmouseoverfn=fixglossloc;
  5490. }
  5491. }
  5492. }
  5493. /* ingrid command form */
  5494. var stag = context.getElementsByClassName('ingridcommand');
  5495. for (var i=0; i< stag.length ; i++){
  5496. var aform = stag[i];
  5497. if(typeof aform.onsubmit != 'function'){
  5498. aform.onsubmit=dopageformcommand;
  5499. aform.onsubmitfn=dopageformcommand;
  5500. }
  5501. }
  5502. /* property=wn20schema:lexicalForm and rel=wn20schema:containsWordSense */
  5503. var stag = getElementsByAttribute(context,'*','rel','wn20schema:containsWordSense');
  5504. for (var i=0; i< stag.length ; i++){
  5505. var sel=stag[i];
  5506. if(typeof sel.onclick != 'function'){
  5507. sel.onclick=handleworddef;
  5508. sel.onclickfn=handleworddef;
  5509. }
  5510. }
  5511. /* property=wn30:lexicalForm and rel=wn30:hasSense */
  5512. var stag = getElementsByAttribute(context,'*','rel','wn30:hasSense');
  5513. for (var i=0; i< stag.length ; i++){
  5514. var sel=stag[i];
  5515. if(typeof sel.onclick != 'function'){
  5516. sel.onclick=handleworddef;
  5517. sel.onclickfn=handleworddef;
  5518. }
  5519. }
  5520. var tablistb = context.getElementsByClassName("ui-tabs-nav");
  5521. if(tablistb.length>0){
  5522. var tablist = tablistb[0].getElementsByTagName("li");
  5523. for (var j=0; j<tablist.length; j++){
  5524. var atab=tablist[j];
  5525. if(!atab.children[0].onclick) {
  5526. atab.onclick=tabclickevent;
  5527. atab.myonclick=tabclickevent;
  5528. }
  5529. }
  5530. }
  5531. }
  5532. function dopageformcommand (evt){
  5533. var evt = (evt) ? evt : ((event) ? event : null );
  5534. var it = (evt.currentTarget) ? evt.currentTarget : this;
  5535. var cmd = it.elements["command"].value;
  5536. var url='';
  5537. var ipos = 0;
  5538. while (ipos < cmd.length){
  5539. var ipar= cmd.indexOf("(",ipos);
  5540. if(ipar >= ipos){
  5541. var pcnt = 1;
  5542. url = url + cmd.substring(ipos,ipar).replace(/\s+/gm,'/');
  5543. var cpos = ipar + 1;
  5544. while (pcnt > 0 && cpos < cmd.length){
  5545. var cch = cmd.substr(cpos,1);
  5546. if (cch == '('){
  5547. pcnt = pcnt + 1;
  5548. }
  5549. else if (cch == ')'){
  5550. pcnt = pcnt - 1;
  5551. }
  5552. cpos = cpos + 1;
  5553. }
  5554. url = url + cmd.substring(ipar,cpos);
  5555. ipos = cpos;
  5556. }
  5557. else {
  5558. url = url + cmd.substr(ipos).replace(/\s+/gm,'/');
  5559. ipos = cmd.length;
  5560. }
  5561. }
  5562. if(url.substr(url.length-1) != '/'){
  5563. url = url + '/';
  5564. }
  5565. var cleanurl = encodeURIComponent(url).replace(/%2F/gm,'/');
  5566. if(location.hash){
  5567. cleanurl = cleanurl + location.hash;
  5568. }
  5569. url = appendPageForm(cleanurl,'share carryLanguage');
  5570. location.href=url;
  5571. evt.returnValue=false;
  5572. return false;
  5573. }
  5574. function handleworddef(evt){
  5575. var evt = (evt) ? evt : ((event) ? event : null );
  5576. var it = (evt.currentTarget) ? evt.currentTarget : this;
  5577. var myglossary = getElementsByAttribute(document,'link','rel','iridl:hasGlossary');
  5578. if(myglossary){
  5579. var qurl = myglossary[0].getAttribute('href');
  5580. var word=it.getAttribute('resource');
  5581. if(word.substr(0,1)=='['){
  5582. word = word.substr(1,word.length-2);
  5583. }
  5584. qurl= qurl + '?word=' + encodeURIComponent(word);
  5585. document.location.href = appendPageForm(qurl,'carryLanguage');
  5586. }
  5587. }
  5588. /* this is a work around for a webkit position: absolute bug in multicolumn layout. Hopefully will be unnecessary someday, though was reported a year ago for Chromium.
  5589. Note that it assumes gloss is defined with position absolute relative to the page, an intervening position: relative will mess things up.
  5590. 2014-10-13 */
  5591. function fixglossloc(evt){
  5592. var evt = (evt) ? evt : ((event) ? event : null );
  5593. var it = (evt.currentTarget) ? evt.currentTarget : this;
  5594. var isWebkit = 'WebkitAppearance' in document.documentElement.style;
  5595. if(isWebkit){
  5596. var mylbl = it.getElementsByClassName("lbl");
  5597. var mygloss = it.getElementsByClassName("gloss");
  5598. if(mylbl.length > 0 && mygloss.length > 0){
  5599. mygloss[0].style.top=(absTop(mylbl[0])+mylbl[0].offsetHeight+5)+'px';
  5600. mygloss[0].style.left=absLeft(mylbl[0])+'px';
  5601. }
  5602. }
  5603. }
  5604. function toggleShowAll(evt){
  5605. var evt = (evt) ? evt : ((event) ? event : null );
  5606. var it = (evt.currentTarget) ? evt.currentTarget : this;
  5607. toggleClass(it,'ShowAll');
  5608. var forcereflow=it.offsetHeight;
  5609. }
  5610. function invalidatePageInput(iname){
  5611. ChangeClassPageInput(iname,'valid','invalid');
  5612. }
  5613. function validatePageInput(iname){
  5614. ChangeClassPageInput(iname,'invalid','valid');
  5615. }
  5616. function ChangeClassPageInput(iname,fromclass,toclass){
  5617. var myform=document.getElementById('pageform');
  5618. if(myform){
  5619. var myinput;
  5620. if(iname.form){
  5621. myinput = iname;
  5622. }
  5623. else {
  5624. myinput=myform.elements[iname];
  5625. }
  5626. if(myinput){
  5627. if(myinput.className){
  5628. var clist = myinput.className.split(' ');
  5629. for ( var i = 0; i < clist.length; i++ )
  5630. {
  5631. var cclass=clist[i];
  5632. var members = document.getElementsByClassName(cclass);
  5633. for ( var j = 0; j < members.length; j++ ) {
  5634. var cmem=members[j];
  5635. if(cmem.rel == 'iridl:hasJSON'){
  5636. changeClass(cmem.parentNode,fromclass,toclass);
  5637. }
  5638. else if(cmem.rel == 'iridl:hasFigure'){
  5639. changeClass(cmem.parentNode,fromclass,toclass);
  5640. }
  5641. else {
  5642. changeClass(cmem,fromclass,toclass);
  5643. }
  5644. }
  5645. }
  5646. }
  5647. }
  5648. }
  5649. }
  5650. /* support for langgroup -- attribute is maintained as list of all lang contained within, so selection can be done with css */
  5651. function updateLangGroups(context){
  5652. var langgroupstyle = document.getElementById('langgroupstyle');
  5653. if(!langgroupstyle){
  5654. langgroupstyle = document.createElement('style');
  5655. langgroupstyle.id='langgroupstyle';
  5656. var ref = document.getElementsByTagName('script')[0];
  5657. ref.parentNode.insertBefore(langgroupstyle,ref);
  5658. if(IE8){
  5659. document.styleSheets['langgroupstyle'].addRule(".langgroup [lang]","display:inline");
  5660. document.styleSheets['langgroupstyle'].addRule(".langgroup [lang] + [lang]","display:none");
  5661. }
  5662. else {
  5663. langgroupstyle.innerHTML = ".langgroup [lang] {display:inline}\n.langgroup [lang] + [lang] {display:none}\n";
  5664. }
  5665. langgroupstyle.langs={};
  5666. }
  5667. var langgroups = context.getElementsByClassName('langgroup');
  5668. for (var i = 0; i < langgroups.length ; i++){
  5669. var mygrp = langgroups[i];
  5670. var langs = {};
  5671. /* copies xml:lang attributes to lang if they exist */
  5672. var langlist = getElementsByAttribute(mygrp,'*','xml:lang','*');
  5673. for (var j=0; j < langlist.length ; j++){
  5674. if(!langlist[j].getAttribute('lang')){
  5675. langlist[j].setAttribute('lang',langlist[j].getAttribute('xml:lang'));
  5676. }
  5677. }
  5678. langlist = getElementsByAttribute(mygrp,'*','lang','*');
  5679. for (var j=0; j < langlist.length ; j++){
  5680. langs[langlist[j].getAttribute('lang')]="1";
  5681. }
  5682. var keys = new Array();
  5683. for (var key in langs){
  5684. keys.push(key);
  5685. if(!langgroupstyle.langs[key]){
  5686. langgroupstyle.langs[key]='1';
  5687. var ctarget = 'body[lang="' + key + '"] .langgroup[langgroup~="' + key + '"] [lang]';
  5688. if(IE8){
  5689. document.styleSheets['langgroupstyle'].addRule(ctarget,"display: none");
  5690. }
  5691. else {
  5692. langgroupstyle.innerHTML += ctarget + ' {display: none}\n' ;
  5693. }
  5694. ctarget = 'body[lang="' + key + '"] .langgroup[langgroup~="' + key + '"] [lang="' + key + '"]';
  5695. if(IE8){
  5696. document.styleSheets['langgroupstyle'].addRule(ctarget,"display: inline");
  5697. }
  5698. else {
  5699. langgroupstyle.innerHTML += ctarget + ' {display: inline}\n' ;
  5700. }
  5701. }
  5702. }
  5703. mygrp.setAttribute('langgroup',keys.join(' '));
  5704. }
  5705. }
  5706. /*
  5707. function to indicate an update to the pageform
  5708. updates all image urls that have classes that match the pageform
  5709. updates elements in class pageformcopy with corresponding name.
  5710. If supplied with the input element that changed,
  5711. 1) only checks the classes that correspond, and
  5712. 2) uses guessvalue to do readahead, resetting when done.
  5713. */
  5714. function updatePageFormQuietly(changedInput, newvalue, guessvalue,historyid){
  5715. var addhistory=true;
  5716. updatePageFormSub(true,changedInput, newvalue, guessvalue,historyid,addhistory);
  5717. }
  5718. function updatePageForm(changedInput, newvalue, guessvalue,historyid){
  5719. var addhistory=true;
  5720. updatePageFormSub(false,changedInput, newvalue, guessvalue,historyid,addhistory);
  5721. }
  5722. function updatePageFormNoHistory(changedInput, newvalue, guessvalue){
  5723. var addhistory=false;
  5724. updatePageFormSub(false,changedInput, newvalue, guessvalue,undefined,addhistory);
  5725. }
  5726. function updatePageFormSub(quietflag,changedInput, newvalue, guessvalue,historyid,addhistory){
  5727. updateGMaps(changedInput);
  5728. var myform=document.getElementById('pageform');
  5729. if(myform){
  5730. updatePageFormConditionalClassesAndFlags(true);
  5731. var clist;
  5732. if(changedInput){
  5733. if(changedInput.className){
  5734. clist = changedInput.className.split(' ');
  5735. }
  5736. else {
  5737. clist = [];
  5738. }
  5739. if(typeof(newvalue)!='undefined'){
  5740. changedInput.value=newvalue;
  5741. }
  5742. }
  5743. else {
  5744. clist = myform.className.split(' ');
  5745. }
  5746. for ( var i = 0; i < clist.length; i++ )
  5747. {
  5748. var cclass=clist[i];
  5749. var membersnl = document.getElementsByClassName(cclass);
  5750. var members=Array.prototype.slice.call(membersnl,0);
  5751. members.sort(function(a,b) {var ao=Math.abs(a.offsetTop-window.pageYOffset); bo=Math.abs(b.offsetTop-window.pageYOffset); return ao-bo});
  5752. for ( var j = 0; j < members.length; j++ ) {
  5753. var cmem=members[j];
  5754. /* first changes images that are on-screen */
  5755. if(cmem.offsetTop != 0 && cmem.tagName == 'IMG'){
  5756. var newsrc = appendPageForm(cmem.src,cmem.className);
  5757. if(newsrc != cmem.src){
  5758. if(!quietflag) {
  5759. changeClass(cmem,'valid','invalid');
  5760. relStartLoading(cmem);
  5761. clearFailed(cmem);
  5762. }
  5763. cmem.src = newsrc;
  5764. }
  5765. }
  5766. if(cmem.tagName == 'LINK' || cmem.tagName == 'A'){
  5767. var newsrc = appendPageForm(cmem.href,cmem.className);
  5768. if(newsrc != cmem.href){
  5769. if(!cmem.sourcehref){
  5770. cmem.sourcehref = cmem.href;
  5771. }
  5772. cmem.href = newsrc;
  5773. if(cmem.rel == 'iridl:hasJSON'){
  5774. updateHasJSON(cmem);
  5775. }
  5776. if(cmem.rel == 'iridl:hasFigure'){
  5777. updateHasFigure(cmem);
  5778. }
  5779. if(cmem.rev == 'section'){
  5780. updateHasSectionList(cmem);
  5781. }
  5782. }
  5783. }
  5784. if(cmem.tagName == 'SCRIPT'){
  5785. if(cmem.getAttribute('property') == 'iridl:hasSerqlQuery'){
  5786. var links = getElementsByAttribute(cmem.parentNode,'*','rel','iridl:hasSparqlEndpoint');
  5787. if(links.length>0)updateHasRqlQuery(links[0],cmem,'serql');
  5788. }
  5789. if(cmem.getAttribute('property') == 'iridl:hasSparqlQuery'){
  5790. var links = getElementsByAttribute(cmem.parentNode,'*','rel','iridl:hasSparqlEndpoint');
  5791. if(links.length>0)updateHasRqlQuery(links[0],cmem,'sparql');
  5792. }
  5793. }
  5794. if(cmem.tagName == 'DIV'){
  5795. if(cmem.getAttribute('data-href') && cmem.indexOf('share')>=0 ) {
  5796. var url = appendPageForm(location.href,'share');
  5797. url = url.replace(/[?]/,"/QS/");
  5798. cmem.setAttribute("data-href",url);
  5799. if(typeof(FB) != 'undefined'){
  5800. FB.XFBML.parse();
  5801. }
  5802. }
  5803. }
  5804. }
  5805. }
  5806. /* changes images that were missed above (presumably off-screen */
  5807. for ( var i = 0; i < clist.length; i++ )
  5808. {
  5809. var cclass=clist[i];
  5810. var members = document.getElementsByClassName(cclass);
  5811. for ( var j = 0; j < members.length; j++ ) {
  5812. var cmem=members[j];
  5813. if(cmem.tagName == 'IMG'){
  5814. var newsrc = appendPageForm(cmem.src,cmem.className);
  5815. if(newsrc != cmem.src){
  5816. if(!quietflag) {
  5817. changeClass(cmem,'valid','invalid');
  5818. appendMissingClass(cmem,'loading');
  5819. clearFailed(cmem);
  5820. }
  5821. /* to avoid generating unused images, if an image is marked regionwithinbbox and is not being shown, the url is not changed */
  5822. if(regionIsWithinBbox || cmem.className.indexOf('regionwithinbbox')<0){
  5823. cmem.src = newsrc;
  5824. }
  5825. }
  5826. }
  5827. }
  5828. }
  5829. /* processes guessvalue, i.e. readahead for images */
  5830. if(guessvalue){
  5831. changedInput.value=guessvalue;
  5832. for ( var i = 0; i < clist.length; i++ )
  5833. {
  5834. var cclass=clist[i];
  5835. var members = document.getElementsByClassName(cclass);
  5836. for ( var j = 0; j < members.length; j++ ) {
  5837. var cmem=members[j];
  5838. if(cmem.tagName == 'IMG'){
  5839. var newsrc = appendPageForm(cmem.src,cmem.className);
  5840. if(newsrc != cmem.src){
  5841. preload(newsrc);
  5842. }
  5843. }
  5844. }
  5845. }
  5846. changedInput.value=newvalue;
  5847. }
  5848. updatePageFormCopies(document);
  5849. updatePageFormConditionalClassesAndFlags(false);
  5850. if(addhistory && history && history.pushState){
  5851. var url = appendPageForm(location.href,'share carryLanguage');
  5852. var currentstate = history.state;
  5853. if(location.href != url){
  5854. var newstate = historyid;
  5855. if(!historyid){
  5856. newstate=url;
  5857. }
  5858. if(currentstate == historyid){
  5859. history.replaceState(newstate,'update',url);
  5860. }
  5861. else {
  5862. history.pushState(newstate,'update',url);
  5863. }
  5864. }
  5865. }
  5866. /* do render loop */
  5867. renderAsGDrive();
  5868. secondRenderAsGDrive();
  5869. }}
  5870. /* do render loop */
  5871. function renderAsGDrive(){
  5872. var gDrivelist=document.getElementsByClassName('asGDrive');
  5873. if (gDrivelist.length){
  5874. for (var idrive=gDrivelist.length; idrive--;){
  5875. doPDFgDriveRender(gDrivelist[idrive]);
  5876. }
  5877. }
  5878. }
  5879. var firstRender=true;
  5880. function firstRenderAsGDrive(){
  5881. if(!!firstRender){
  5882. var gDrivelist=document.getElementsByClassName('gDriveSubButton');
  5883. if (gDrivelist.length){
  5884. for (var idrive=gDrivelist.length; idrive--;){
  5885. var gdrivespan=gDrivelist[idrive];
  5886. var gflag=gdrivespan.getAttribute("rendered");
  5887. if((gflag == "true")){
  5888. } else {
  5889. /* alert("do first render " + idrive); */
  5890. gapi.savetodrive.render(gdrivespan,{"src": gdrivespan.renderedUrl,
  5891. "filename": gdrivespan.filename,
  5892. "sitename": gdrivespan.sitename});
  5893. gdrivespan.setAttribute("rendered",true);
  5894. }
  5895. }
  5896. }
  5897. firstRender=false;
  5898. }
  5899. }
  5900. function secondRenderAsGDrive(){
  5901. if(!!firstRender){
  5902. } else
  5903. {
  5904. var gDrivelist=document.getElementsByClassName('gDriveSubButton');
  5905. if (gDrivelist.length){
  5906. for (var idrive=gDrivelist.length; idrive--;){
  5907. var gdrivespan=gDrivelist[idrive];
  5908. var gflag=gdrivespan.getAttribute("rendered");
  5909. if((gflag == "true")){
  5910. } else if
  5911. (gdrivespan.renderedUrl.length<1024)
  5912. {
  5913. /* alert("do second render " + idrive); */
  5914. gapi.savetodrive.render(gdrivespan,{"src": gdrivespan.renderedUrl,
  5915. "filename": gdrivespan.filename,
  5916. "sitename": gdrivespan.sitename});
  5917. gdrivespan.setAttribute("rendered",true);
  5918. }
  5919. }
  5920. }
  5921. }
  5922. }
  5923. function updatePageFormConditionalClassesAndFlags(doflags){
  5924. var myform=document.getElementById('pageform');
  5925. if(myform){
  5926. /* updates regionwithinbbox */
  5927. var mybb = myform.elements['bbox'];
  5928. var myregion = myform.elements['region'];
  5929. var myclickpt = myform.elements['clickpt'];
  5930. var within = false;
  5931. if(myregion && myregion.length){
  5932. myregion=myregion[0];
  5933. }
  5934. if(myclickpt && myclickpt.value){
  5935. within = true;
  5936. }
  5937. else {
  5938. if (mybb && mybb.value && mybb.value.length>8 && myregion && myregion.value.length > 8){
  5939. var bba = parseBbox(mybb.value);
  5940. var regiona = myregion.value.split(':',8);
  5941. if(regiona[0] == 'bb' && regiona.length > 4 && regiona[1] == bba[0] && regiona[2] == bba[1] && regiona[3] == bba[2] && regiona[4] == bba[3]){
  5942. within = false;
  5943. }
  5944. else {
  5945. within = true;
  5946. }
  5947. }
  5948. else
  5949. {
  5950. if(myregion && myregion.value.length > 8){
  5951. within = true;
  5952. }
  5953. }
  5954. }
  5955. if(within){
  5956. setregionwithinbbox(true,doflags);
  5957. }
  5958. else {
  5959. setregionwithinbbox(false,doflags);
  5960. }
  5961. /* does bodyClasses */
  5962. if(myform.className.indexOf('bodyClass')>=0){
  5963. var mylist = myform.elements;
  5964. var thebody = document.getElementsByTagName('body')[0];
  5965. for (var i=0 ; i < mylist.length ; i++){
  5966. if(mylist[i].className.indexOf('bodyClass')>=0){
  5967. var value = mylist[i].name + mylist[i].value.replace(/[: .,@#]/g,'');
  5968. if(thebody.className.indexOf(value)<0 || thebody.className.substr(thebody.className.indexOf(value)).split(" ") != value){
  5969. var cclassi = thebody.className.indexOf(mylist[i].name);
  5970. if(cclassi>=0){
  5971. var oldclass = "" + thebody.className.substr(cclassi).split(" ")[0];
  5972. removeClass(thebody,oldclass);
  5973. }
  5974. appendMissingClass(thebody,value);
  5975. }
  5976. }
  5977. }
  5978. }
  5979. if(myform.className.indexOf('bodyAttribute')>=0){
  5980. var mylist = myform.elements;
  5981. var thebody = document.getElementsByTagName('body')[0];
  5982. var bodyvars = {};
  5983. for (var i=0 ; i < mylist.length ; i++){
  5984. if(mylist[i].className.indexOf('bodyAttribute')>=0){
  5985. if(!bodyvars[mylist[i].name]){
  5986. bodyvars[mylist[i].name] = myform.elements[mylist[i].name];
  5987. }
  5988. }
  5989. }
  5990. for (var key in bodyvars){
  5991. var myinputs = bodyvars[key];
  5992. if(myinputs.length){
  5993. var use = [];
  5994. for (var i=0 ; i < myinputs.length; i++){
  5995. if(myinputs[i].value && !(myinputs[i].type == 'checkbox' && !myinputs[i].checked)){
  5996. use.push(myinputs[i].value);
  5997. }
  5998. }
  5999. if(use.length){
  6000. thebody.setAttribute(key,use.join(' '));
  6001. }
  6002. else {
  6003. thebody.removeAttribute(key);
  6004. }
  6005. }
  6006. else {
  6007. if(myinputs.value){
  6008. thebody.setAttribute(key,myinputs.value);
  6009. if(key == 'lang' && thebody.getAttribute('xml:lang')){
  6010. thebody.setAttribute('xml:lang',myinputs.value);
  6011. }
  6012. }
  6013. else {
  6014. thebody.removeAttribute(key);
  6015. }
  6016. }
  6017. }
  6018. }
  6019. /* does hasValueList */
  6020. var mylist = document.getElementsByClassName('hasValueList');
  6021. for (var i=0 ; i < mylist.length ; i++)
  6022. {
  6023. var it=mylist[i];
  6024. // change class of parent whether single (value in list) or multi (value not in list)
  6025. if(it.parentNode.info && it.parentNode.info['iridl:gridvalues']){
  6026. var cin = it.parentNode.info['iridl:gridvalues']['iridl:valuelist'].indexOf(it.value);
  6027. var cmax = it.parentNode.info['iridl:gridvalues']['iridl:valuelist'].length-1;
  6028. if(cin > -1){
  6029. changeClass(it.parentNode,'multiValue','singleValue');
  6030. }
  6031. else {
  6032. changeClass(it.parentNode,'singleValue','multiValue');
  6033. }
  6034. if(cin > 0){
  6035. changeOrAppendClass(it.parentNode,'atLower','aboveLower');
  6036. }
  6037. else if(cin == 0){
  6038. changeOrAppendClass(it.parentNode,'aboveLower','atLower');
  6039. }
  6040. if(cin >= 0 && cin < cmax){
  6041. changeOrAppendClass(it.parentNode,'atUpper','belowUpper');
  6042. }
  6043. else if(cin == cmax){
  6044. changeOrAppendClass(it.parentNode,'belowUpper','atUpper');
  6045. }
  6046. }
  6047. }
  6048. }
  6049. }
  6050. /* updates class pageformcopy selects to match pageform
  6051. */
  6052. function updatePageFormCopies(context){
  6053. var mycontext=context;
  6054. if(!mycontext || !mycontext.getElementsByClassName){
  6055. mycontext=document;
  6056. }
  6057. var myform=document.getElementById('pageform');
  6058. if(myform){
  6059. var stag = mycontext.getElementsByClassName('pageformcopy');
  6060. for (var i=0; i< stag.length ; i++){
  6061. var sel=stag[i];
  6062. var cval;
  6063. var elbyname = myform.elements[sel.name];
  6064. if(typeof(elbyname) != 'undefined'){
  6065. if(elbyname.length){
  6066. /* multivalued copy -- hopefully checkbox */
  6067. if(elbyname[0].type == 'checkbox'){
  6068. /* multivalued copy -- checkbox */
  6069. for(var j = elbyname.length; j-- ;){
  6070. if(elbyname[j].value == sel.value){
  6071. sel.checked = elbyname[j].checked;
  6072. }
  6073. }
  6074. }
  6075. else {
  6076. /* multivalued but not checkbox
  6077. looks for matching values to set checkboxes
  6078. */
  6079. if(sel.type == 'checkbox') {
  6080. /* multivalued copy to checkbox */
  6081. var ifchecked = false;
  6082. for(var j = elbyname.length; j-- ;){
  6083. if(elbyname[j].value == sel.value){
  6084. ifchecked=true;
  6085. break;
  6086. }
  6087. }
  6088. sel.checked=ifchecked;
  6089. if(ifchecked){sel.disabled=false;}
  6090. }
  6091. else {
  6092. /* not a checkbox -- just copies first */
  6093. var ind = 0;
  6094. var myind = sel.getAttribute('data-nameindex');
  6095. if(myind){ind = myind};
  6096. cval = myform.elements[sel.name][ind].value;
  6097. if((typeof(sel.value) != 'undefined') && cval && sel.value != cval){
  6098. sel.value=cval;
  6099. }
  6100. }
  6101. }
  6102. }
  6103. else {
  6104. /* single valued form elements */
  6105. cval = myform.elements[sel.name].value;
  6106. if((typeof(sel.value) != 'undefined') && cval && sel.value != cval){
  6107. sel.value=cval;
  6108. }
  6109. }
  6110. }
  6111. else {
  6112. alert('no pageform input called ' + sel.name);
  6113. }
  6114. if(typeof(cval) != 'undefined' && typeof(sel.selectedIndex) === 'number'){
  6115. var options=sel.options;
  6116. sel.selectedIndex=-1;
  6117. if(sel.previousSibling.className == 'selectvalue'){
  6118. sel.previousSibling.innerHTML="";
  6119. sel.previousSibling.setAttribute('value',"");
  6120. }
  6121. for (var j=0; j < options.length ; j++){
  6122. if(options[j].value == cval){
  6123. sel.selectedIndex=j;
  6124. if(sel.previousSibling.className == 'selectvalue'){
  6125. sel.previousSibling.innerHTML=sel.options[sel.selectedIndex].innerHTML;
  6126. sel.previousSibling.setAttribute('value',sel.options[sel.selectedIndex].value);
  6127. }
  6128. break;
  6129. }
  6130. }
  6131. }
  6132. }
  6133. }
  6134. }
  6135. /* validateAndCorrectsPageForm */
  6136. function validateAndCorrectPageForm(context){
  6137. var mycontext=context;
  6138. if(!mycontext || !mycontext.getElementsByClassName){
  6139. mycontext=document;
  6140. }
  6141. var myform=document.getElementById('pageform');
  6142. if(myform){
  6143. var valid=true;
  6144. /* checks for null region and bbox not null */
  6145. var region = myform.elements['region'];
  6146. var bbox = myform.elements['bbox'];
  6147. if(region && typeof(region.value)!='undefined'){
  6148. if((!region.value) && typeof(bbox)!='undefined' && bbox.value !=''){
  6149. region.value = bbox.value;
  6150. valid=false;
  6151. }
  6152. }
  6153. /* containsAllValids
  6154. Normally a select menu allows selectedIndex=-1, i.e. a choice that is not from
  6155. the list of possible values (particularly useful for bbox anywhere and also having
  6156. a list of selected boxes).
  6157. containsAllValids is a class (so class="pageformcopy containsAllValids") so that
  6158. only values from the list are allowed, i.e. selectedIndex=-1 becomes =0).
  6159. */
  6160. var stag = mycontext.getElementsByClassName('containsAllValids');
  6161. for (var i=0; i< stag.length ; i++){
  6162. var sel=stag[i];
  6163. if(sel.selectedIndex == -1 && typeof(myform.elements[sel.name]) != 'undefined'){
  6164. valid=false;
  6165. sel.selectedIndex=0;
  6166. if(sel.selectedIndex == 0){
  6167. myform.elements[sel.name].value=sel.options[sel.selectedIndex].value;
  6168. if(sel.previousSibling.className == 'selectvalue'){
  6169. sel.previousSibling.innerHTML=sel.options[sel.selectedIndex].innerHTML;
  6170. sel.previousSibling.setAttribute('value',sel.options[sel.selectedIndex].value);
  6171. }
  6172. }
  6173. }
  6174. }
  6175. if(!valid){
  6176. var historyid;
  6177. if(history){
  6178. historyid = history.state;
  6179. }
  6180. updatePageForm(undefined,undefined,undefined,historyid);
  6181. }
  6182. }
  6183. }
  6184. function imageabortedevent(evt){
  6185. evt = (evt) ? evt : ((event) ? event : null );
  6186. var it = (evt.currentTarget) ? evt.currentTarget : evt.srcElement;
  6187. relStopLoading(it,'loading');
  6188. }
  6189. function imageerrorevent(evt){
  6190. evt = (evt) ? evt : ((event) ? event : null );
  6191. var it = (evt.currentTarget) ? evt.currentTarget : evt.srcElement;
  6192. relStopLoading(it,'loading');
  6193. setFailed(it);
  6194. }
  6195. function imageloadedevent(evt){
  6196. evt = (evt) ? evt : ((event) ? event : null );
  6197. var it = (evt.currentTarget) ? evt.currentTarget : evt.srcElement;
  6198. changeClass(it,'invalid','valid');
  6199. changeClass(it,'invalid-zooming','valid');
  6200. relStopLoading(it,'loading');
  6201. if(it.className.indexOf('dlimg') >=0){
  6202. if(it.mylink){
  6203. var mynode = it.mylink.parentNode;
  6204. /* transitions are slightly separate to avoid vibration */
  6205. if(it.height>3.1*it.width && mynode.className.indexOf('narrow')<0){
  6206. mynode.className = mynode.className + ' narrow';
  6207. }
  6208. if(it.height<2.9*it.width && mynode.className.indexOf('narrow')>0){
  6209. mynode.className = mynode.className.replace(' narrow','');
  6210. }
  6211. if(it.height<2.9*it.width && it.height>1.5*it.width && mynode.className.indexOf('tall')<0){
  6212. mynode.className = mynode.className + ' tall';
  6213. }
  6214. if((it.height<1.3*it.width || it.height>3.1*it.width)&& mynode.className.indexOf('tall')>0){
  6215. mynode.className = mynode.className.replace(' tall','');
  6216. }
  6217. if(it.height*2<it.width && mynode.className.indexOf('wide')<0){
  6218. mynode.className = mynode.className + ' wide';
  6219. }
  6220. if(it.height*1.8>it.width && mynode.className.indexOf('wide')>0){
  6221. mynode.className = mynode.className.replace(' wide','');
  6222. }
  6223. hideImageOverlay(it);
  6224. /* makes sure the image overlay is the right size if it exists */
  6225. resetImageOverlay(it);
  6226. var pform=document.getElementById('pageform');
  6227. if(pform && pform.elements['plotaxislength'] && pform.elements['plotaxislength'].value){
  6228. var clientsize = Math.max(it.width,it.height);
  6229. var targetsize = 20*Math.round((clientsize - 20 - 72 + 9)/20,0);
  6230. var plen = pform.elements['plotaxislength'].value;
  6231. var delp = targetsize - plen;
  6232. /* only makes image size changes greater than 20 */
  6233. if(delp >= 21 || delp <= -21){
  6234. pform.elements['plotaxislength'].value = targetsize;
  6235. updatePageFormQuietly(pform.elements['plotaxislength']);
  6236. }
  6237. }
  6238. }
  6239. }
  6240. return true;
  6241. }
  6242. /* if none of the classes in srcclass are in element.className,
  6243. appends the first class in srclass
  6244. */
  6245. function appendMissingClass(element,srcclass){
  6246. var targetclass=element.className;
  6247. var slist = srcclass.split(' ');
  6248. var match = false;
  6249. for (var i = 0 ; i < slist.length; i++){
  6250. if(targetclass && targetclass.indexOf(slist[i]) >=0){
  6251. match = true;
  6252. }
  6253. }
  6254. if(!match){
  6255. if(!element.className){
  6256. element.className = slist[0];
  6257. }
  6258. else {
  6259. element.className = targetclass + ' ' + slist[0];
  6260. }
  6261. }
  6262. return !match;
  6263. }
  6264. function removeClass(element,srcclass){
  6265. var targetclass=element.className;
  6266. var slist = srcclass.split(' ');
  6267. var match = false;
  6268. for (var i = 0 ; i < slist.length; i++){
  6269. var ind =targetclass.indexOf(slist[i]);
  6270. if( ind>=0){
  6271. if(ind==0){
  6272. element.className=element.className.replace(slist[i],"");
  6273. }
  6274. else {
  6275. element.className=element.className.replace(" "+slist[i],"");
  6276. }
  6277. }
  6278. }
  6279. }
  6280. function toggleClass(element,toggleName){
  6281. var targetclass=element.className;
  6282. var slist = toggleName.split(' ');
  6283. var match = false;
  6284. for (var i = 0 ; i < slist.length; i++){
  6285. var ind =targetclass.indexOf(slist[i]);
  6286. if( ind>=0){
  6287. if(ind==0){
  6288. element.className=element.className.replace(slist[i],"");
  6289. }
  6290. else {
  6291. element.className=element.className.replace(" "+slist[i],"");
  6292. }
  6293. }
  6294. else {
  6295. if(element.className){
  6296. element.className= element.className + " " + slist[i];
  6297. }
  6298. else {
  6299. element.className=slist[i];
  6300. }
  6301. }
  6302. }
  6303. }
  6304. // changes class of all sublements within an element
  6305. // traverses list in reverse order because the list updates as it executes
  6306. function sameasthis(ele){return ele=this};
  6307. function changeClassWithin(pelement,fromclass,toclass){
  6308. var classlist = pelement.className.split(' ');
  6309. if(classlist.some(sameasthis,fromclass)){
  6310. var newlist = new Array;
  6311. for (var i = classlist.length-1 ; i >=0 ; i--){
  6312. if(classlist[i] == fromclass){
  6313. newlist[i] = toclass;
  6314. }
  6315. else {
  6316. newlist[i] = classlist[i];
  6317. }
  6318. }
  6319. pelement.className = newlist.join(' ');
  6320. }
  6321. var targetlist=pelement.getElementsByClassName(fromclass);
  6322. if(targetlist.length > 0){
  6323. for (var i = targetlist.length-1 ; i >= 0; i--){
  6324. var ind=targetlist[i];
  6325. var classlist = ind.className.split(' ');
  6326. var newlist = new Array;
  6327. for (var i = classlist.length-1 ; i >=0 ; i--){
  6328. if(classlist[i] == fromclass){
  6329. newlist[i] = toclass;
  6330. }
  6331. else {
  6332. newlist[i] = classlist[i];
  6333. }
  6334. }
  6335. ind.className = newlist.join(' ');
  6336. }
  6337. }
  6338. }
  6339. function changeOrAppendClass(pelement,fromclass,toclass){
  6340. changeClass(pelement,fromclass,toclass);
  6341. appendMissingClass(pelement,toclass);
  6342. }
  6343. function changeClass(pelement,fromclass,toclass){
  6344. var targetlist=pelement.parentNode.getElementsByClassName(fromclass);
  6345. for (var i = targetlist.length-1 ; i >= 0; i--){
  6346. var ind=targetlist[i];
  6347. if(ind == pelement){
  6348. ind.className=ind.className.replace(fromclass,toclass);
  6349. }
  6350. }
  6351. }
  6352. function onClickPageForm(evt){
  6353. evt = (evt) ? evt : ((event) ? event : null );
  6354. var it = (evt.currentTarget) ? evt.currentTarget : evt.srcElement;
  6355. submitPageForm(it.href,it.className);
  6356. return false;
  6357. }
  6358. /* alldisabledPageForm -- disables FormElements that are default or not in classes,
  6359. returns true if all default values or not in classes */
  6360. function alldisabledPageForm(classes,includeDefaultValues){
  6361. var myform=document.getElementById('pageform');
  6362. var alldisabled;
  6363. if(myform){
  6364. var inputs=myform.elements;
  6365. for (var i = 0; i < inputs.length; i++) {
  6366. inputs[i].disabled=true;
  6367. }
  6368. alldisabled=true;
  6369. var clist = classes.split(' ');
  6370. for ( var ic = 0; ic < clist.length; ic++ ){
  6371. var cclass=clist[ic].replace('&',' ');
  6372. var members = document.getElementsByClassName(cclass);
  6373. for ( var j = 0; j < members.length; j++ )
  6374. if(members[j].disabled) {
  6375. if(members[j].type != 'checkbox' && members[j].value){
  6376. if(includeDefaultValues || members[j].initialValue != members[j].value){
  6377. alldisabled=false;
  6378. var myname=members[j].name;
  6379. members[j].disabled=false;
  6380. for (var k=j;k--;){
  6381. if(members[k].disabled && members[k].name == myname){
  6382. members[k].disabled=false;
  6383. }
  6384. }
  6385. }
  6386. }
  6387. else if(members[j].type == 'checkbox' && members[j].checked != members[j].defaultChecked) {
  6388. var myname=members[j].name;
  6389. for (var k=members.length;k--;){
  6390. if(members[k].disabled && members[k].name == myname){
  6391. members[k].disabled=false;
  6392. }
  6393. }
  6394. alldisabled=false;
  6395. }
  6396. }
  6397. }
  6398. }
  6399. return alldisabled;
  6400. }
  6401. /*
  6402. submitPageForm -- submits pageform to href, appending inputs corresponding to class.
  6403. */
  6404. function submitPageForm(href,classes,inMethod){
  6405. if(!href){return}
  6406. /* var localhref=localHrefOf(removePageForm(href)); */
  6407. var localhref=removePageForm(href);
  6408. var theMethod='GET';
  6409. if(inMethod){
  6410. theMethod=inMethod;
  6411. }
  6412. var myform=document.getElementById('pageform');
  6413. if(myform){
  6414. var alldisabled=alldisabledPageForm(classes);
  6415. if(alldisabled && theMethod == 'GET'){
  6416. if(localhref.substring(0,5) =='file:'){
  6417. /*
  6418. if(localhref.charAt(localhref.length-1) == '/'){
  6419. localhref=localhref+'index.html';
  6420. }
  6421. */
  6422. }
  6423. document.location.href=localhref;
  6424. }
  6425. else {
  6426. /* our rewrite rules do not handle Set-Language for a directory, so we avoid doing it
  6427. if(localhref.charAt(localhref.length-1) == '/'){
  6428. localhref=localhref+'index.html';
  6429. }
  6430. */
  6431. if(localhref.indexOf('?')>0){
  6432. localhref = appendPageForm(href,classes,false);
  6433. document.location.href=localhref;
  6434. }
  6435. else {
  6436. myform.action=localhref;
  6437. myform.method=theMethod;
  6438. myform.submit();
  6439. }
  6440. }
  6441. }
  6442. else {
  6443. document.location.href=localhref;
  6444. }
  6445. }
  6446. /* removePageForm -- removes all values in url that exist in page form
  6447. */
  6448. function removePageForm(href,overridePageForm){
  6449. var newhref = href;
  6450. var myform=document.getElementById('pageform');
  6451. if(href && myform){
  6452. var action = String(href);
  6453. var thehash;
  6454. if(action.indexOf && action.indexOf("#") >= 0){
  6455. thehash = action.substring(action.indexOf('#'));
  6456. action=action.substring(0,action.indexOf('#'));
  6457. }
  6458. var inputs=myform.elements;
  6459. var hrefparts = action.split('?');
  6460. var newhref=hrefparts[0];
  6461. var query = hrefparts[1];
  6462. if(query){
  6463. var delim='?';
  6464. var vars = query.split("&");
  6465. var pair;
  6466. for (var i = 0; i < vars.length; i++) {
  6467. pair = vars[i].split("=");
  6468. var iname=pair[0];
  6469. if (!inputs[iname]) {
  6470. newhref=newhref + delim + vars[i];
  6471. delim='&';
  6472. }
  6473. else if(overridePageForm) {
  6474. inputs[iname].value = unescape(pair[1]);
  6475. }
  6476. }
  6477. }
  6478. if(thehash){
  6479. newhref=newhref+thehash;
  6480. }
  6481. }
  6482. return newhref;
  6483. }
  6484. /*
  6485. appendPageForm -- appends to href, appending pageform inputs corresponding to class.
  6486. appendPageForm
  6487. */
  6488. function appendPageForm(href,classes,includeDefaultValues,overridePageForm){
  6489. var filtered =removePageForm(href,overridePageForm);
  6490. /* var localhref=localHrefOf(filtered); */
  6491. var localhref= filtered;
  6492. var myform=document.getElementById('pageform');
  6493. if(myform){
  6494. var alldisabled=alldisabledPageForm(classes,includeDefaultValues);
  6495. if(alldisabled){
  6496. return localhref;
  6497. }
  6498. else {
  6499. var action = localhref;
  6500. var thehash;
  6501. if(action.indexOf("#") >= 0){
  6502. thehash = action.substring(action.indexOf('#'));
  6503. action=action.substring(0,action.indexOf('#'));
  6504. }
  6505. var inputs=myform.elements;
  6506. if(action.indexOf("?") >= 0){
  6507. delim='&';
  6508. }
  6509. else {
  6510. delim= '?';
  6511. }
  6512. for (var i = 0; i < inputs.length; i++) {
  6513. var myinput=inputs[i];
  6514. if(!myinput.disabled){
  6515. if(myinput.type != 'checkbox' || myinput.checked){
  6516. action = action + delim + myinput.name + '=' + encodeURIComponent(myinput.value);
  6517. delim='&'
  6518. }
  6519. }
  6520. }
  6521. if(thehash){
  6522. action = action + thehash;
  6523. }
  6524. return action;
  6525. }
  6526. }
  6527. else {
  6528. return localhref;
  6529. }
  6530. }
  6531. /* special character remapper until localCompare with language argument is fully supported on browsers */
  6532. var defaultDiacriticsRemovalap = [
  6533. {'base':'A', 'letters':'\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F'},
  6534. {'base':'AA','letters':'\uA732'},
  6535. {'base':'AE','letters':'\u00C6\u01FC\u01E2'},
  6536. {'base':'AO','letters':'\uA734'},
  6537. {'base':'AU','letters':'\uA736'},
  6538. {'base':'AV','letters':'\uA738\uA73A'},
  6539. {'base':'AY','letters':'\uA73C'},
  6540. {'base':'B', 'letters':'\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181'},
  6541. {'base':'C', 'letters':'\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E'},
  6542. {'base':'D', 'letters':'\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779'},
  6543. {'base':'DZ','letters':'\u01F1\u01C4'},
  6544. {'base':'Dz','letters':'\u01F2\u01C5'},
  6545. {'base':'E', 'letters':'\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E'},
  6546. {'base':'F', 'letters':'\u0046\u24BB\uFF26\u1E1E\u0191\uA77B'},
  6547. {'base':'G', 'letters':'\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E'},
  6548. {'base':'H', 'letters':'\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D'},
  6549. {'base':'I', 'letters':'\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197'},
  6550. {'base':'J', 'letters':'\u004A\u24BF\uFF2A\u0134\u0248'},
  6551. {'base':'K', 'letters':'\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2'},
  6552. {'base':'L', 'letters':'\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780'},
  6553. {'base':'LJ','letters':'\u01C7'},
  6554. {'base':'Lj','letters':'\u01C8'},
  6555. {'base':'M', 'letters':'\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C'},
  6556. {'base':'N', 'letters':'\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4'},
  6557. {'base':'NJ','letters':'\u01CA'},
  6558. {'base':'Nj','letters':'\u01CB'},
  6559. {'base':'O', 'letters':'\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C'},
  6560. {'base':'OI','letters':'\u01A2'},
  6561. {'base':'OO','letters':'\uA74E'},
  6562. {'base':'OU','letters':'\u0222'},
  6563. {'base':'OE','letters':'\u008C\u0152'},
  6564. {'base':'oe','letters':'\u009C\u0153'},
  6565. {'base':'P', 'letters':'\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754'},
  6566. {'base':'Q', 'letters':'\u0051\u24C6\uFF31\uA756\uA758\u024A'},
  6567. {'base':'R', 'letters':'\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782'},
  6568. {'base':'S', 'letters':'\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784'},
  6569. {'base':'T', 'letters':'\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786'},
  6570. {'base':'TZ','letters':'\uA728'},
  6571. {'base':'U', 'letters':'\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244'},
  6572. {'base':'V', 'letters':'\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245'},
  6573. {'base':'VY','letters':'\uA760'},
  6574. {'base':'W', 'letters':'\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72'},
  6575. {'base':'X', 'letters':'\u0058\u24CD\uFF38\u1E8A\u1E8C'},
  6576. {'base':'Y', 'letters':'\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE'},
  6577. {'base':'Z', 'letters':'\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762'},
  6578. {'base':'a', 'letters':'\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250'},
  6579. {'base':'aa','letters':'\uA733'},
  6580. {'base':'ae','letters':'\u00E6\u01FD\u01E3'},
  6581. {'base':'ao','letters':'\uA735'},
  6582. {'base':'au','letters':'\uA737'},
  6583. {'base':'av','letters':'\uA739\uA73B'},
  6584. {'base':'ay','letters':'\uA73D'},
  6585. {'base':'b', 'letters':'\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253'},
  6586. {'base':'c', 'letters':'\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184'},
  6587. {'base':'d', 'letters':'\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A'},
  6588. {'base':'dz','letters':'\u01F3\u01C6'},
  6589. {'base':'e', 'letters':'\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD'},
  6590. {'base':'f', 'letters':'\u0066\u24D5\uFF46\u1E1F\u0192\uA77C'},
  6591. {'base':'g', 'letters':'\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F'},
  6592. {'base':'h', 'letters':'\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265'},
  6593. {'base':'hv','letters':'\u0195'},
  6594. {'base':'i', 'letters':'\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131'},
  6595. {'base':'j', 'letters':'\u006A\u24D9\uFF4A\u0135\u01F0\u0249'},
  6596. {'base':'k', 'letters':'\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3'},
  6597. {'base':'l', 'letters':'\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747'},
  6598. {'base':'lj','letters':'\u01C9'},
  6599. {'base':'m', 'letters':'\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F'},
  6600. {'base':'n', 'letters':'\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5'},
  6601. {'base':'nj','letters':'\u01CC'},
  6602. {'base':'o', 'letters':'\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275'},
  6603. {'base':'oi','letters':'\u01A3'},
  6604. {'base':'ou','letters':'\u0223'},
  6605. {'base':'oo','letters':'\uA74F'},
  6606. {'base':'p','letters':'\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755'},
  6607. {'base':'q','letters':'\u0071\u24E0\uFF51\u024B\uA757\uA759'},
  6608. {'base':'r','letters':'\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783'},
  6609. {'base':'s','letters':'\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B'},
  6610. {'base':'t','letters':'\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787'},
  6611. {'base':'tz','letters':'\uA729'},
  6612. {'base':'u','letters': '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289'},
  6613. {'base':'v','letters':'\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C'},
  6614. {'base':'vy','letters':'\uA761'},
  6615. {'base':'w','letters':'\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73'},
  6616. {'base':'x','letters':'\u0078\u24E7\uFF58\u1E8B\u1E8D'},
  6617. {'base':'y','letters':'\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF'},
  6618. {'base':'z','letters':'\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763'}
  6619. ];
  6620. var diacriticsMap = {};
  6621. for (var i=0; i < defaultDiacriticsRemovalap.length; i++){
  6622. var letters = defaultDiacriticsRemovalap[i].letters.split("");
  6623. for (var j=0; j < letters.length ; j++){
  6624. diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;
  6625. }
  6626. }
  6627. // "what?" version ... http://jsperf.com/diacritics/12
  6628. function removeDiacritics (str) {
  6629. return str.replace(/[^\u0000-\u007E]/g, function(a){
  6630. return diacriticsMap[a] || a;
  6631. });
  6632. }
  6633. // GitHub setup
  6634. function githubSetup(){
  6635. var githubform=document.getElementsByClassName('githubconnect');
  6636. if(githubform[0]){
  6637. githubform[0].onsubmit=dogithub;
  6638. githubform[0].onsubmitfn=dogithub;
  6639. githubform[0].elements["github"].onchange=dogithubjson;
  6640. githubform[0].elements["github"].onchangefn=dogithubjson;
  6641. var gid = getCookie('githubid');
  6642. if(gid){
  6643. githubform[0].elements["github"].value=gid;
  6644. setgithubjson(gid);
  6645. }
  6646. }
  6647. }
  6648. function dogithub(evt){
  6649. var evt = (evt) ? evt : ((event) ? event : null );
  6650. var it = (evt.currentTarget) ? evt.currentTarget : this;
  6651. document.cookie="githubid=" + it.elements["github"].value + "; path=/";
  6652. return false;
  6653. }
  6654. function dogithubjson(evt){
  6655. var evt = (evt) ? evt : ((event) ? event : null );
  6656. var it = (evt.currentTarget) ? evt.currentTarget : this;
  6657. setgithubjson(it.value);
  6658. }
  6659. function getCookie(wantid){
  6660. var cookies=document.cookie;
  6661. var cookielist=cookies.split(';')
  6662. for(var i=0; i<cookielist.length ; i++){
  6663. var apair=cookielist[i].split("=");
  6664. var cname=apair[0];
  6665. while(cname.charAt(0)==' ')cname = cname.substring(1);
  6666. if(cname.indexOf(wantid) == 0)return apair[1];
  6667. }
  6668. return "";
  6669. }
  6670. function setgithubjson(newname){
  6671. var githubjson=document.getElementById('githubjson');
  6672. if(githubjson){
  6673. githubjson.href='https://api.github.com/users/' + newname;
  6674. updateHasJSON(githubjson);
  6675. }
  6676. var githubgistjson=document.getElementById('githubgistjson');
  6677. if(githubgistjson){
  6678. githubgistjson.href='https://api.github.com/users/' + newname + '/gists';
  6679. updateHasJSON(githubgistjson);
  6680. }
  6681. }
  6682. var gmaps = {};
  6683. function createGMapDLImage(options) {
  6684. gmaps[options.id] = options;
  6685. }
  6686. function X(x,z) {
  6687. return (x/Math.pow(2,z)*360-180);
  6688. }
  6689. function Y(y,z) {
  6690. return (y/Math.pow(2,z)*180-90);
  6691. }
  6692. function Y3857(y,z) {
  6693. var n=Math.PI-2*Math.PI*y/Math.pow(2,z);
  6694. return (180/Math.PI*Math.atan(0.5*(Math.exp(n)-Math.exp(-n))));
  6695. }
  6696. function plotrangeX(x,z) {
  6697. r1 = X(x,z);
  6698. r2 = X(x+1,z);
  6699. if (r2%360 == -180) {
  6700. r1 = r1%360 + 360;
  6701. r2 = r2%360 + 360;
  6702. } else if (r1 == 180) {
  6703. r1 -= 360;
  6704. r2 -= 360;
  6705. } else if (r2%360 == 180 && r2 != 180) {
  6706. r1 = r1%360;
  6707. r2 = r2%360;
  6708. }
  6709. return '/X/'+r1+'/'+r2+'/plotrange';
  6710. }
  6711. function plotrangeY(y,z) {
  6712. r1 = Y(y,z);
  6713. r2 = Y(y+1,z);
  6714. return '/Y/'+r1+'/'+r2+'/plotrange';
  6715. }
  6716. function fdlurl(url,p) {
  6717. return function(cs) {
  6718. z = cs[0];
  6719. x = cs[1];
  6720. y = Math.pow(2,z) + cs[2];
  6721. u = url + "//XOVY/2/psdef//plotaxislength/512/psdef//plotborder/0/psdef" +
  6722. plotrangeX(x,z) + plotrangeY(y,z)+"/+.png" + p;
  6723. //console.log(cs, z,x,y,plotrangeX(x,z),plotrangeY(y,z),u);
  6724. return u;
  6725. };
  6726. }
  6727. function fdlurl3857(url,p) {
  6728. return function(cs) {
  6729. z = cs[0];
  6730. x = cs[1];
  6731. y = -cs[2] - 1;
  6732. u = url + "//XOVY/1/psdef//plotaxislength/256/psdef//plotborder/0/psdef//antialias/true/psdef//SRS/%28EPSG:900913%29/psdef" +
  6733. plotrangeX(x,z) + plotrangeY(y,z)+"/+.gif" + p;
  6734. return u;
  6735. };
  6736. }
  6737. function createIridlSource(url,params) {
  6738. var iridlSource = new ol.source.TileImage({
  6739. projection: 'EPSG:4326',
  6740. attributions: "© IRI, Columbia University",
  6741. wrapX: true,
  6742. tileUrlFunction: fdlurl(url,params),
  6743. tileGrid: new ol.tilegrid.TileGrid({
  6744. extent: [-180,-90,180,90],
  6745. minZoom: 0,
  6746. tileSize: [512,256],
  6747. resolutions: [0.703125,0.3515625,0.17578125,0.087890625, 0.043945313, 0.021972656, 0.010986328, 0.005493164, 0.002746582, 0.001373291, 0.000686646, 0.000343323, 0.000171661, 8.58307E-05, 4.29153E-05, 2.14577E-05, 1.07288E-05, 5.36442E-06, 2.68221E-06, 1.3411E-06, 6.70552E-07, 3.35276E-07, 1.67638E-07],
  6748. }),
  6749. });
  6750. return iridlSource;
  6751. }
  6752. function setLayerOpacity(gmapId,layerIndex,opacity) {
  6753. var gmap = gmaps[gmapId];
  6754. var layer = gmap.map.getLayers().getArray()[layerIndex];
  6755. layer.setOpacity(opacity);
  6756. if (opacity != 0.0 ) {
  6757. layer.setVisible( true );
  6758. } else {
  6759. gmap.popupOverlay.setPosition(undefined);
  6760. layer.setVisible( false );
  6761. var source = layer.getSource();
  6762. source.set('dlTileCounters',null);
  6763. source.refresh();
  6764. setStatusClassName(source);
  6765. }
  6766. }
  6767. function createOpacityControl() {
  6768. return (function (Control) {
  6769. function OpacityControl(opt_options) {
  6770. var options = opt_options || {};
  6771. var gmap = options.gmap;
  6772. var layers = gmap.layers;
  6773. var el = document.createElement('div');
  6774. el.className = 'dl-opacity-control ol-unselectable ol-control';
  6775. for (var i in layers) {
  6776. var layer = layers[i];
  6777. if (layer.showOpacityControl) {
  6778. var p = document.createElement('div');
  6779. p.className = 'dl-opacity-slider';
  6780. var s = document.createElement('div');
  6781. s.innerHTML = layer.name;
  6782. layer.layer.getSource().set('dlStatusEl',s);
  6783. var r = document.createElement('div');
  6784. r.innerHTML = '<input type="range" class="dl-opacity-input-range" value="'+layer.opacity*100.0+'" oninput="setLayerOpacity(\''+gmap.id+'\','+i+',this.value/100.0);" />';
  6785. p.appendChild(s);
  6786. p.appendChild(r);
  6787. el.appendChild(p)
  6788. } else {
  6789. layer.layer.getSource().set('dlStatusEl',null);
  6790. }
  6791. }
  6792. Control.call(this, {
  6793. element: el,
  6794. target: options.target
  6795. });
  6796. }
  6797. if ( Control ) OpacityControl.__proto__ = Control;
  6798. OpacityControl.prototype = Object.create( Control && Control.prototype );
  6799. OpacityControl.prototype.constructor = OpacityControl;
  6800. return OpacityControl;
  6801. }(ol.control.Control));
  6802. }
  6803. function createProgressControl() {
  6804. return (function (Control) {
  6805. function ProgressControl(opt_options) {
  6806. var options = opt_options || {};
  6807. var gmap = options.gmap;
  6808. var layers = gmap.layers;
  6809. var el = document.createElement('div');
  6810. el.className = 'dl-progress-control ol-unselectable ol-control';
  6811. el.style.width = "0%";
  6812. gmap.progressBarEl2 = el;
  6813. Control.call(this, {
  6814. element: el,
  6815. target: options.target
  6816. });
  6817. }
  6818. if ( Control ) ProgressControl.__proto__ = Control;
  6819. ProgressControl.prototype = Object.create( Control && Control.prototype );
  6820. ProgressControl.prototype.constructor = ProgressControl;
  6821. return ProgressControl;
  6822. }(ol.control.Control));
  6823. }
  6824. function resetGMap(gmap) {
  6825. var map = gmap.map;
  6826. var view = map.getView();
  6827. var xy = ol.proj.fromLonLat(gmap.init.center,view.getProjection());
  6828. view.setCenter(xy);
  6829. view.setZoom(gmap.init.zoom);
  6830. viewSetBounds(view);
  6831. }
  6832. function setGMapRectVar(ex) {
  6833. var f = document.getElementById('pageform');
  6834. if (f) {
  6835. var bb = [ex[0], ex[1], ex[2], ex[3], true];
  6836. var val = 'bb:' + bb.slice(0,4).join(':') + ':bb';
  6837. setPageFormVariable('gmapRect',val);
  6838. }
  6839. }
  6840. function parseGMapLoc(gmapValStr) {
  6841. var vs = JSON.parse(gmapValStr);
  6842. var x = {center: [vs[0],vs[1]], zoom: vs[2]};
  6843. return x;
  6844. }
  6845. function stringifyGMapLoc(gmapVal) {
  6846. var s = JSON.stringify([gmapVal.center[0],gmapVal.center[1],gmapVal.zoom]);
  6847. return s;
  6848. }
  6849. function setGMapCenterZoom(map,gmapVarVal) {
  6850. var view = map.getView();
  6851. var x = parseGMapLoc(gmapVarVal);
  6852. var xy = ol.proj.fromLonLat(x.center,view.getProjection());
  6853. view.setCenter(xy);
  6854. view.setZoom(x.zoom);
  6855. viewSetBounds(view);
  6856. }
  6857. function setGMapBbox(map,bboxVarVal) {
  6858. var view = map.getView();
  6859. var x = parseBbox(bboxVarVal);
  6860. if (x) {
  6861. var dx = (x[2] - x[0]) * 0.01;
  6862. var dy = (x[1] - x[3]) * 0.01;
  6863. var bounds = [x[0]+dx, x[3]+dy, x[2]-dx, x[1]-dy];
  6864. view.fit(bounds);
  6865. viewSetBounds(view);
  6866. }
  6867. }
  6868. function setGMap(gmap) {
  6869. var map = gmap.map;
  6870. var view = map.getView();
  6871. gmap.init = {center: ol.proj.toLonLat(view.getCenter(),view.getProjection()), zoom: view.getZoom()};
  6872. var f = document.getElementById('pageform');
  6873. if (f) {
  6874. var gmapVar = f.elements['gmap'];
  6875. var bboxVar = f.elements['bbox'];
  6876. if (gmapVar && gmapVar.value) {
  6877. setGMapCenterZoom(map,gmapVar.value);
  6878. } else if (bboxVar && bboxVar.value) {
  6879. setGMapBbox(map,bboxVar.value);
  6880. }
  6881. gmap.init.center = ol.proj.toLonLat(view.getCenter(),view.getProjection());
  6882. gmap.init.zoom = view.getZoom();
  6883. setPageFormVariable('gmap',stringifyGMapLoc(gmap.init));
  6884. }
  6885. }
  6886. var gmapParams = {layers: {}};
  6887. var GMAP_EXCLUDED_PARAMS = {bbox:1, region:1, gmap:1, gmapRect:1, plotaxislength:1};
  6888. function addGMapParam(name,val,flag) {
  6889. //console.log('addGMapParam:', name,val,flag);
  6890. if (!(name in GMAP_EXCLUDED_PARAMS)) {
  6891. if (gmapParams[name] instanceof Object) {
  6892. gmapParams[name][val] = flag;
  6893. } else {
  6894. gmapParams[name] = val;
  6895. }
  6896. }
  6897. }
  6898. function flatArrayEq(a,b) {
  6899. if ( !(a instanceof Array) || !(b instanceof Array) || (a.length != b.length)) {
  6900. return false;
  6901. }
  6902. for (var i in a) {
  6903. if (a[i] != b[i]) {
  6904. return false;
  6905. }
  6906. }
  6907. return true;
  6908. }
  6909. function viewSetBounds(view) {
  6910. newBounds = view.calculateExtent();
  6911. oldBounds = view.get('dlBounds') || null;
  6912. if (!flatArrayEq(oldBounds,newBounds)) {
  6913. view.set('dlBounds', newBounds);
  6914. }
  6915. }
  6916. function setStatusClassName(source) {
  6917. var counters = source.get('dlTileCounters') || [0,0,0];
  6918. var cs = [];
  6919. if (counters[0] > counters[1]) {
  6920. cs.push('dl-layer-loading');
  6921. }
  6922. if (counters[2]) {
  6923. cs.push('dl-layer-error');
  6924. }
  6925. var el = source.get('dlStatusEl');
  6926. if (el) {
  6927. el.className = cs.join(' ');
  6928. }
  6929. }
  6930. function setProgressBar (gmap) {
  6931. var gcounters = gmap.dlTileCounters || [0,0,0];
  6932. var oldProgressBarValue = gmap.progressBarValue || 0;
  6933. var loading = gcounters[0];
  6934. var loaded = gcounters[1];
  6935. var inerror = gcounters[2];
  6936. if (loading != 0) {
  6937. var newProgressBarValue = loaded/loading * 100;
  6938. if (true || newProgressBarValue > oldProgressBarValue) {
  6939. gmap.progressBarValue = newProgressBarValue;
  6940. var width = newProgressBarValue.toFixed(1) + '%';
  6941. var el = gmap.progressBarEl2;
  6942. if (el) {
  6943. el.style.width = width;
  6944. }
  6945. }
  6946. if (loading == loaded) {
  6947. gmap.progressBarValue = 0;
  6948. gmap.dlTileCounters = [0,0,inerror];
  6949. setTimeout(function() {
  6950. if (el) {
  6951. el.style.width = "0%";
  6952. }
  6953. }, 750);
  6954. }
  6955. }
  6956. }
  6957. var OpacityControl = null;
  6958. var ProgressControl = null;
  6959. function initializeGMap(gmap) {
  6960. if (!OpacityControl) {
  6961. OpacityControl = createOpacityControl();
  6962. }
  6963. if (!ProgressControl) {
  6964. ProgressControl = createProgressControl();
  6965. }
  6966. if (!('id' in gmap)) {
  6967. throw "uicore: id undefined in gmap";
  6968. }
  6969. gmap.progressBarEl = document.getElementById(gmap.id + ".progress");
  6970. if (!('debug' in gmap)) {
  6971. gmap.debug = false;
  6972. }
  6973. if (!('mapOptions' in gmap)) {
  6974. gmap.mapOptions = {};
  6975. }
  6976. if (!('target' in gmap.mapOptions)) {
  6977. gmap.mapOptions.target = gmap.id;
  6978. }
  6979. if (!('viewOptions' in gmap)) {
  6980. gmap.viewOptions = {};
  6981. }
  6982. if (!('zoom' in gmap.viewOptions)) {
  6983. gmap.viewOptions.zoom = 3;
  6984. }
  6985. if (!('projection' in gmap.viewOptions)) {
  6986. gmap.viewOptions.projection = 'EPSG:4326';
  6987. }
  6988. if (!('center' in gmap.viewOptions)) {
  6989. gmap.viewOptions.center = ol.proj.fromLonLat([0,0],gmap.viewOptions.projection);
  6990. } else {
  6991. gmap.viewOptions.center = ol.proj.fromLonLat(gmap.viewOptions.center,gmap.viewOptions.projection);
  6992. }
  6993. if (!('rotation' in gmap.viewOptions)) {
  6994. gmap.viewOptions.rotation = 0.0;
  6995. } else {
  6996. gmap.viewOptions.rotation = gmap.viewOptions.rotation * Math.PI / 180.0;;
  6997. }
  6998. if (!('mapClick' in gmap)) {
  6999. gmap.mapClick = {};
  7000. }
  7001. if (!('type' in gmap.mapClick)) {
  7002. gmap.mapClick.type = 'none';
  7003. }
  7004. if (!('showFeature' in gmap.mapClick)) {
  7005. gmap.mapClick.showFeature = true;
  7006. }
  7007. if (!('moveOnClick' in gmap.mapClick)) {
  7008. gmap.mapClick.moveOnClick = true;
  7009. }
  7010. if (!('setBounds' in gmap.mapClick)) {
  7011. gmap.mapClick.setBounds = false;
  7012. }
  7013. if (!('marker' in gmap.mapClick)) {
  7014. gmap.mapClick.marker = {};
  7015. }
  7016. if (!('position' in gmap.mapClick.marker)) {
  7017. gmap.mapClick.marker.position = ol.proj.fromLonLat([0.0,0.0],gmap.viewOptions.projection);
  7018. } else {
  7019. gmap.mapClick.marker.position = ol.proj.fromLonLat(gmap.mapClick.marker.position,gmap.viewOptions.projection);
  7020. }
  7021. if (!('draggable' in gmap.mapClick.marker)) {
  7022. gmap.mapClick.marker.draggable = true;
  7023. }
  7024. if (!('rectangle' in gmap.mapClick)) {
  7025. gmap.mapClick.rectangle = {};
  7026. }
  7027. if (!('bounds' in gmap.mapClick.rectangle)) {
  7028. gmap.mapClick.rectangle.bounds = ol.proj.transformExtent([0.0,0.0,1.0,1.0],'EPSG:4326',gmap.viewOptions.projection);
  7029. } else {
  7030. gmap.mapClick.rectangle.bounds = ol.proj.transformExtent(gmap.mapClick.rectangle.bounds,'EPSG:4326',gmap.viewOptions.projection);
  7031. }
  7032. if (!('draggable' in gmap.mapClick.rectangle)) {
  7033. gmap.mapClick.rectangle.draggable = true;
  7034. }
  7035. if (!('editable' in gmap.mapClick.rectangle)) {
  7036. gmap.mapClick.rectangle.editable = true;
  7037. }
  7038. if (!('featureClick' in gmap)) {
  7039. gmap.featureClick = {};
  7040. }
  7041. if (!('type' in gmap.featureClick)) {
  7042. gmap.featureClick.type = 'click';
  7043. }
  7044. if (!('makeInfoWindow' in gmap.featureClick)) {
  7045. gmap.featureClick.makeInfoWindow = function(feature, layer) {
  7046. return layer.get('dlname');
  7047. };
  7048. }
  7049. var view = new ol.View(gmap.viewOptions);
  7050. gmap.mapOptions.view = view;
  7051. if (!('layers' in gmap)) {
  7052. gmap.layers = [];
  7053. }
  7054. var params = makeParams(gmapParams);
  7055. var layers = [];
  7056. for (var i in gmap.layers) {
  7057. var x = gmap.layers[i];
  7058. if (!('type' in x)) {
  7059. throw "uicore: layer type undefined";
  7060. }
  7061. if (!('name' in x)) {
  7062. throw "uicore: layer name undefined";
  7063. }
  7064. if (!('opacity' in x)) {
  7065. x.opacity = 1.0;
  7066. }
  7067. if (!('showOpacityControl' in x)) {
  7068. x.showOpacityControl = true;
  7069. }
  7070. if (x.type == "ol") {
  7071. if (!('layer' in x)) {
  7072. throw "uicore: layer undefined in 'ol' layer";
  7073. }
  7074. x.layer.setOpacity(x.opacity);
  7075. x.layer.setVisible(x.opacity != 0.0);
  7076. layers.push( x.layer );
  7077. } else if (x.type == "iridl") {
  7078. if (!('url' in x)) {
  7079. throw "uicore: url undefined in 'iridl' layer";
  7080. }
  7081. var iridlLayer = new ol.layer.Tile({
  7082. opacity: x.opacity,
  7083. source: createIridlSource(x.url,params),
  7084. });
  7085. x.layer = iridlLayer;
  7086. x.layer.setVisible(x.opacity != 0.0);
  7087. layers.push( x.layer );
  7088. } else {
  7089. throw "uicore: layer type '" + x.type + "' is not supported";
  7090. }
  7091. x.layer.set('dlname', x.name);
  7092. var source = x.layer.getSource();
  7093. var tlevents = ['tileloadstart','tileloadend','tileloaderror'];
  7094. for (i in tlevents) {
  7095. (function(){
  7096. var index = i;
  7097. var _gmap = gmap;
  7098. var _layer = x;
  7099. source.on(tlevents[index], function(evt) {
  7100. var source = evt.target;
  7101. var gcounters = _gmap.dlTileCounters || [0,0,0];
  7102. gcounters[index] ++;
  7103. _gmap.dlTileCounters = gcounters;
  7104. var counters = source.get('dlTileCounters') || [0,0,0];
  7105. counters[index] ++;
  7106. source.set('dlTileCounters', counters);
  7107. setStatusClassName(source);
  7108. setProgressBar(_gmap);
  7109. });
  7110. })();
  7111. }
  7112. }
  7113. // ---
  7114. var markerFeature = new ol.Feature(new ol.geom.Point([gmap.mapClick.marker.position[0], gmap.mapClick.marker.position[1]]));
  7115. markerFeature.setStyle( new ol.style.Style({
  7116. image: new ol.style.Icon({
  7117. anchor: [0.5, 46],
  7118. anchorXUnits: 'fraction',
  7119. anchorYUnits: 'pixels',
  7120. opacity: 0.95,
  7121. src: '/uicore/ol/markerBlack32x48.png',
  7122. }),
  7123. }));
  7124. var ex = gmap.mapClick.rectangle.bounds;
  7125. var rectFeature = new ol.Feature(new ol.geom.Polygon([[[ex[0],ex[1]],[ex[0],ex[3]],[ex[2],ex[3]],[ex[2],ex[1]]]]));
  7126. rectFeature.setStyle( new ol.style.Style({
  7127. stroke: new ol.style.Stroke({
  7128. width: 3,
  7129. color: [0, 0, 0, 1]
  7130. }),
  7131. fill: new ol.style.Fill({
  7132. color: [0, 0, 0, 0.3]
  7133. }),
  7134. }));
  7135. var interactionSource = new ol.source.Vector({
  7136. features: [],
  7137. });
  7138. var interactionLayer = new ol.layer.Vector({
  7139. source: interactionSource,
  7140. });
  7141. interactionLayer.set('dlname', 'Interaction');
  7142. gmap.layers.push({type: 'ol', layer: interactionLayer, name: 'Interaction', opacity: 0.8, showOpacityControl: false});
  7143. if (gmap.mapClick.type == 'marker') {
  7144. interactionSource.addFeature(markerFeature);
  7145. interactionLayer.setVisible(gmap.mapClick.showFeature);
  7146. } else if (gmap.mapClick.type == 'rectangle') {
  7147. interactionSource.addFeature(rectFeature);
  7148. interactionLayer.setVisible(gmap.mapClick.showFeature);
  7149. }
  7150. layers.push( interactionLayer );
  7151. // ---
  7152. gmap.mapOptions.layers = layers;
  7153. var translateInteraction = new ol.interaction.Translate({layers: [interactionLayer]});
  7154. /*
  7155. gmap.mapOptions.interactions = ol.interaction.defaults().extend([
  7156. //new ol.interaction.DragBox({condition: ol.events.condition.shiftKeyOnly,}),
  7157. //new ol.interaction.Extent(),
  7158. ]);
  7159. */
  7160. if (!('controls' in gmap.mapOptions)) {
  7161. gmap.mapOptions.controls = [
  7162. new ol.control.ScaleLine({
  7163. units: 'degrees',
  7164. }),
  7165. new ol.control.FullScreen(),
  7166. new ol.control.Attribution({collapsible: true}),
  7167. new ol.control.Rotate({duration: 250}),
  7168. new ol.control.Zoom(),
  7169. new OpacityControl({gmap: gmap}),
  7170. new ProgressControl({gmap: gmap}),
  7171. ];
  7172. }
  7173. var map = new ol.Map(gmap.mapOptions);
  7174. gmap.map = map;
  7175. if (gmap.mapClick.type == 'marker' && gmap.mapClick.marker.draggable || gmap.mapClick.type == 'rectangle' && gmap.mapClick.rectangle.draggable) {
  7176. map.addInteraction(translateInteraction);
  7177. }
  7178. view.set('dlBounds',view.calculateExtent());
  7179. map.on('change:size', function (evt) {
  7180. viewSetBounds(view);
  7181. });
  7182. view.on('change', function (evt) {
  7183. viewSetBounds(view);
  7184. });
  7185. view.on('propertychange', function (evt) {
  7186. if (evt.key == 'dlBounds') {
  7187. var z = {center: view.getCenter(), zoom: view.getZoom() };
  7188. setPageFormVariable('gmap',stringifyGMapLoc(z));
  7189. if (gmap.mapClick.setBounds) {
  7190. var ex = ol.proj.transformExtent(view.get('dlBounds'),map.getView().getProjection(),'EPSG:4326');
  7191. var bb = [ ex[0], ex[1], ex[2], ex[3], true];
  7192. setbbox(bb,{},null);
  7193. }
  7194. }
  7195. });
  7196. setGMap(gmap);
  7197. var popup = document.createElement('div');
  7198. popup.className = "ol-popup";
  7199. //popup.title = "Popup Title";
  7200. var popupCloser = document.createElement('a');
  7201. popupCloser.className = "ol-popup-closer";
  7202. var popupContent = document.createElement('div');
  7203. popupContent.className = "ol-popup-content";
  7204. popup.appendChild(popupCloser);
  7205. popup.appendChild(popupContent);
  7206. var popupOverlay = new ol.Overlay({
  7207. element: popup,
  7208. autoPan: true,
  7209. autoPanAnimation: {
  7210. duration: 250
  7211. }
  7212. });
  7213. map.addOverlay( popupOverlay );
  7214. popupCloser.onclick = function() {
  7215. popupOverlay.setPosition(undefined);
  7216. popupCloser.blur();
  7217. return false;
  7218. };
  7219. gmap.popupOverlay = popupOverlay;
  7220. translateInteraction.on('translateend', function (evt) {
  7221. if (gmap.mapClick.type == 'marker') {
  7222. var ex = ol.proj.transformExtent(markerFeature.getGeometry().getExtent(),map.getView().getProjection(),'EPSG:4326');
  7223. var bb = [ ex[0], ex[1], ex[2], ex[3], true ];
  7224. //console.log('uicore: marker (move):', ex);
  7225. setbbox(bb,{},null);
  7226. } else if (gmap.mapClick.type == 'rectangle') {
  7227. var ex = ol.proj.transformExtent(rectFeature.getGeometry().getExtent(),map.getView().getProjection(),'EPSG:4326');
  7228. //console.log('uicore: rectangle (move):', ex);
  7229. setGMapRectVar(ex);
  7230. }
  7231. });
  7232. map.on('singleclick', function(evt) {
  7233. var res = null;
  7234. if (gmap.featureClick.type != 'none') {
  7235. res = map.forEachFeatureAtPixel(evt.pixel, function (feature, layer) {
  7236. if (layer == interactionLayer) {
  7237. return null;
  7238. }
  7239. var features = feature.get('features');
  7240. if (features) {
  7241. return (features.length > 1 ? null : [features[0],layer]);
  7242. } else {
  7243. return [feature,layer];
  7244. }
  7245. });
  7246. }
  7247. if (res) {
  7248. var feature = res[0];
  7249. var layer = res[1];
  7250. if (gmap.featureClick.type == 'click') {
  7251. var ex = ol.proj.transformExtent(feature.getGeometry().getExtent(),map.getView().getProjection(),'EPSG:4326');
  7252. var bb = [ ex[0], ex[1], ex[2], ex[3], true ];
  7253. //console.log('uicore: feature click:', feature.getProperties(), ex);
  7254. setbbox(bb,{},null);
  7255. } else if (gmap.featureClick.type == 'infoWindow') {
  7256. var ex = feature.getGeometry().getExtent();
  7257. popupContent.innerHTML = gmap.featureClick.makeInfoWindow(feature, layer);
  7258. popupOverlay.setPosition([(ex[0]+ex[2])/2.0,(ex[1]+ex[3])/2.0]);
  7259. }
  7260. } else {
  7261. if (gmap.mapClick.type != 'none') {
  7262. var xy = ol.proj.toLonLat(evt.coordinate,map.getView().getProjection());
  7263. var bb = [ xy[0], xy[1], xy[0], xy[1], true ];
  7264. if (gmap.mapClick.type == 'click') {
  7265. //console.log('uicore: click:', xy);
  7266. setbbox(bb,{},null);
  7267. } else if (gmap.mapClick.type == 'marker' && gmap.mapClick.moveOnClick) {
  7268. markerFeature.setGeometry(new ol.geom.Point(xy));
  7269. if (!interactionLayer.getVisible()) {
  7270. interactionLayer.setVisible(true);
  7271. }
  7272. //console.log('uicore: marker (click):', xy);
  7273. setbbox(bb,{},null);
  7274. } else if (gmap.mapClick.type == 'rectangle' && gmap.mapClick.moveOnClick) {
  7275. var geom = rectFeature.getGeometry();
  7276. var ex = ol.proj.transformExtent(geom.getExtent(),map.getView().getProjection(),'EPSG:4326');
  7277. var dxy = [xy[0]-ex[0]-(ex[2]-ex[0])/2.0,xy[1]-ex[1]-(ex[3]-ex[1])/2.0];
  7278. geom.translate(dxy[0],dxy[1]);
  7279. ex = ol.proj.transformExtent(geom.getExtent(),map.getView().getProjection(),'EPSG:4326');
  7280. if (!interactionLayer.getVisible()) {
  7281. interactionLayer.setVisible(true);
  7282. }
  7283. //console.log('uicore: rectangle (click):', ex);
  7284. setGMapRectVar(ex);
  7285. }
  7286. }
  7287. }
  7288. });
  7289. if (typeof ResizeObserver !== 'undefined') { // this only works in Chrome
  7290. var mapEl = document.getElementById(gmap.id);
  7291. if (mapEl) {
  7292. new ResizeObserver(function(x){
  7293. map.updateSize();
  7294. //console.log('observeMapSizeChange:',x)
  7295. }).observe(mapEl);
  7296. }
  7297. }
  7298. }
  7299. function initializeGMaps() {
  7300. $(window).load( function(event) {
  7301. for (id in gmaps) {
  7302. initializeGMap(gmaps[id]);
  7303. }
  7304. });
  7305. }
  7306. function makeParams(ps) {
  7307. var s = '';
  7308. for (var name in ps) {
  7309. if (ps[name] instanceof Object) {
  7310. var allNulls = true;
  7311. for (var val in ps[name]) {
  7312. allNulls = allNulls && (ps[name][val]==null);
  7313. }
  7314. for (var val in ps[name]) {
  7315. if (ps[name][val]==null) {
  7316. ps[name][val] = (allNulls ? true : false);;
  7317. }
  7318. }
  7319. var s2 = '';
  7320. var allIn = true;
  7321. for (var val in ps[name]) {
  7322. if (ps[name][val]) {
  7323. s2 += '&' + name + '=' + val;
  7324. } else {
  7325. allIn = false;
  7326. }
  7327. }
  7328. if (!allIn) {
  7329. s += s2;
  7330. }
  7331. } else {
  7332. s += '&' + name + '=' + encodeURIComponent(ps[name]);
  7333. }
  7334. }
  7335. if (s != '') {
  7336. s = '?' + s.slice(1,s.length);
  7337. }
  7338. return s;
  7339. }
  7340. function updateGMapLayers(gmap) {
  7341. if ('map' in gmap) {
  7342. var params = makeParams(gmapParams);
  7343. for (var i in gmap.layers) {
  7344. var x = gmap.layers[i];
  7345. if (x.type == "iridl") {
  7346. var source = x.layer.getSource();
  7347. source.setTileUrlFunction(fdlurl(x.url,params));
  7348. source.refresh();
  7349. }
  7350. }
  7351. }
  7352. }
  7353. function inArray(needle,haystack) {
  7354. var count=haystack.length;
  7355. for (var i=0;i<count;i++) {
  7356. if (haystack[i]===needle){
  7357. return true;
  7358. }
  7359. }
  7360. return false;
  7361. }
  7362. function updateGMaps(changedInput) {
  7363. if(changedInput) {
  7364. var name = changedInput.name;
  7365. var value = changedInput.value;
  7366. addGMapParam(name,value,changedInput.checked);
  7367. var cs = changedInput.className ? changedInput.className.split(' ') : [];
  7368. var es = document.getElementsByClassName('dlimgGMap');
  7369. if (inArray('dlimg',cs)) {
  7370. for (var i=0;i!=es.length;i++) {
  7371. var gmap = gmaps[ es[i].id ]
  7372. if (gmap.map) {
  7373. var map = gmap.map;
  7374. var view = map.getView();
  7375. if (name == 'gmap' && value) {
  7376. setGMapCenterZoom(map,value);
  7377. } else if (name == 'gmap' && !value) {
  7378. view.setCenter( ol.proj.fromLonLat(gmap.viewOptions.center, view.getProjection()) );
  7379. view.setZoom( gmap.viewOptions.zoom );
  7380. viewSetBounds(view);
  7381. } else if (name == 'bbox' && value) {
  7382. setGMapBbox(map,value);
  7383. } else if (name == 'bbox' && !value) {
  7384. view.setCenter( ol.proj.fromLonLat(gmap.viewOptions.center, view.getProjection()) );
  7385. view.setZoom( gmap.viewOptions.zoom );
  7386. viewSetBounds(view);
  7387. } else if (!(name in GMAP_EXCLUDED_PARAMS)) {
  7388. updateGMapLayers(gmap);
  7389. }
  7390. }
  7391. }
  7392. }
  7393. }
  7394. }
  7395. /*
  7396. function loadGMapGeoJson(map, format, url, makeFeature) {
  7397. if (format == 'tsv') {
  7398. var r = getXMLhttp();
  7399. r.open('GET', url, false);
  7400. r.send(null);
  7401. if (r.status == 200) {
  7402. lines = r.responseText.split(/\r?\n/);
  7403. var features = [];
  7404. var ns = lines[0].split(/\t/);
  7405. for (var i=1; i<lines.length; i++) {
  7406. if (lines[i] != "") {
  7407. var x = lines[i].split(/\t/);
  7408. var fi = {};
  7409. for (var j=0; j!=ns.length; j++) {
  7410. fi[ns[j]] = x[j];
  7411. }
  7412. var fo = makeFeature(fi);
  7413. for (var j=0; j!=fo.length; j++) {
  7414. features.push(fo[j]);
  7415. }
  7416. }
  7417. }
  7418. fcoll = {type: "FeatureCollection", features: features};
  7419. map.data.addGeoJson(fcoll);
  7420. }
  7421. } else if (format == 'geojson') {
  7422. map.data.loadGeoJson(url);
  7423. }
  7424. }
  7425. */
  7426. // loadmaproom is run once (at DOMContentLoaded if possible, or onload).
  7427. var loadmaproomneeded=true;
  7428. $.ready(
  7429. function loadmaproom(){
  7430. if(loadmaproomneeded){
  7431. loadmaproomneeded=false;
  7432. var mybody = document.getElementsByTagName('body')[0];
  7433. if(window.name){
  7434. mybody.setAttribute('within',window.name);
  7435. }
  7436. setPageForm();
  7437. tabsSetup();
  7438. insertcontrolBar();
  7439. initializeDLimage();
  7440. initializeGMaps();
  7441. insertchooseSection();
  7442. insertRegion();
  7443. insertshare();
  7444. insertInstructions();
  7445. setupPageFormLinks(document);
  7446. updateLangGroups(document);
  7447. loadHasJSON();
  7448. loadHasRqlEndpoint();
  7449. githubSetup();
  7450. $(window).resize(refreshConnectedGraphs);
  7451. firstRenderAsGDrive();
  7452. if(uicoreConfig.GoogleAnalyticsId){
  7453. // _gaq.push(['_setAccount', uicoreConfig.GoogleAnalyticsId]);
  7454. // _gaq.push(['_trackPageview']);
  7455. // _gaq.push(['_trackPageLoadTime']);
  7456. // setupGA();
  7457. if (window.matchMedia) {
  7458. var mediaQueryList = window.matchMedia('print');
  7459. mediaQueryList.addListener(function(mql) {
  7460. if (mql.matches) {
  7461. refreshConnectedGraphs();
  7462. } else {
  7463. refreshConnectedGraphs();
  7464. }
  7465. });
  7466. }
  7467. window.onbeforeprint = refreshConnectedGraphs;
  7468. window.onafterprint = refreshConnectedGraphs;
  7469. ga('create', uicoreConfig.GoogleAnalyticsId, 'columbia.edu');
  7470. ga('send', 'pageview');
  7471. }
  7472. if(uicoreConfig.GoogleSearchCX){
  7473. var mynav=document.getElementById('GoogleSearch');
  7474. if(mynav){
  7475. var sb = document.createElement('div');
  7476. var sbb = document.createElement('gcse:searchbox-only');
  7477. sb.appendChild(sbb);
  7478. mynav.appendChild(sbb);
  7479. (function() {
  7480. var cx = uicoreConfig.GoogleSearchCX;
  7481. var gcse = document.createElement('script');
  7482. gcse.type = 'text/javascript';
  7483. gcse.async = true;
  7484. gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
  7485. '//www.google.com/cse/cse.js?cx=' + cx;
  7486. var s = document.getElementsByTagName('script')[0];
  7487. s.parentNode.insertBefore(gcse, s);
  7488. })();
  7489. }
  7490. }
  7491. }
  7492. }
  7493. );