// bw_util.js

var UNDEF = 'undefined';
var d = false;

if (typeof console == UNDEF){
 if (typeof loadFirebugConsole == 'function') loadFirebugConsole();
 else console = new Object();
}
if (typeof console.log == 'undefined'){ 
	console.log = function(){ /* noop */}
}

function initPage()
{
	// Scan for href of form bw:xxx
	//	bw:contact - relay 
	//	bw:tn/img/... - imgdb & magnify processing
	//	bw:map - embed google map
	BW_UTIL = new BW_UTILITY_FUNCTIONS();
	BW_UTIL.init_XXX();	

	// TODO - does anyone use these anymore ??
        if (typeof startDataDownload == 'function') startDataDownload();
        if (typeof adjustNav == 'function') adjustNav();
	if (typeof initPbSpec == 'function') initPbSpec();	
}


function showRightColumn(bool)
{
	if (bool) return;  // already handled by wsu style-sheet

	// modify style to hide secondary div, and expand main width

	var el=document.getElementById('secondary');
	if (el) el.style.display = 'none'

	var el=document.getElementById('main');
	if (el) el.style.width = '556px';  
}


// --------------------------------- functions to support trouble reporting

function mkSuggestion(folder,win)
{
	if (typeof win == UNDEF) win = window;
	var url='http://beachwatchers.net/' + folder + '/suggestions?'
		+ 'url=' + escape(win.location.href);

	win.open(url);
}

// --------------------------------- functions to support mailto links


function mkMT(x,txt)
{
  var htm = new Array();
  var x0 = '/BAD<4@.56CE"GFHIJKL VWdfTUhijXYZbace:mngMNOPQRSopqrst=uvz01892>3klwxy7';
  var x1 = '/ ABCDEFGH:IJKLMNOPQRST=UVWXYZ>abcdefghij"klmnopqrstuvwxyz@.0123<456789';


  if (typeof txt == 'boolean'){ 
	hcdc(htm,x0,x1,x); 
	return htm.join('');
  }

  hcdc(htm,x1,x0,'CdRXtfUwJhdY5vqg');
  hcdc(htm,x1,x0,x);
  hcdc(htm,x1,x0,'J3');
  if (typeof txt == 'undefined')  hcdc(htm,x1,x0,x);
  else 				htm.push(txt);
  hcdc(htm,x1,x0,'C/d3');
  document.write(htm.join(''));
  
	
    function hcdc(htm,from, to, str)
    {
      var arr = str.split('');
      for (i = 0; i < arr.length; i++) {
        var j = from.indexOf(arr[i]);
	if (j<0) htm.push(arr[i]);
	else htm.push(to.charAt(j));
      }
    }
}

// --------------------------------- functions to support contactRelay

function doContactRelay(indx)
{
	// island.347 :: Connie C :: topic or scope
	var arr = BW_UTIL.bwContactArr[indx].split(/ *:: */);
	var xx = arr[0].split(/\./);
	   var org = xx[0]; if (org == 'island') org = 'isle';
	   var id  = xx[1];
	var name = arr[1];
	var subj = arr[2];
console.log(org,id,name,subj);

	// having problems if try to use POST
	// not seeing anything on the bw.net end ???
	// SOLN:  URL needs to be contact/index.php

	var htm = new Array();
	htm.push('<body onLoad=document.F.submit()>',
		'<form style="display:none" name=F method=POST ',
		' action=http://beachwatchers.net/',org,'/contact/index.php>',
		'<input type=hidden name=q value="">',
		'<input type=hidden name=id value="',id,'">',
		'<input type=hidden name=nn value="',name,'">',
		'<input type=hidden name=s value="',subj,'">',
		'<input type=hidden name=fromUrl value="',window.location.href,'">',
		'<input type=submit>',
		'</form>',
		'');

	var win = window.open('','_blank','');
	var doc = win.document;
	doc.open();
	doc.write(htm.join(''));
	doc.close();
}








// -------------------------------- functions to support DW img swap 


function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

var navStyleDone = true;



// BW_setupX.js
//
// flow
//
//  1. scan for a tags w/href ~ BW:...
//	- populate bwpObjArr - list of pixIds to be retrieved
//
//  2. retrieve bwp data from bw.net/all/imgdb
//
//  6. finalPass()
//	- per el in bwpObjArr 
//		- modify el to trigger magnification
//	- call popbox initialization routines,
//	    which will do another scan ...


// Prereq:
//	Requires regional/js/console.js
//	Requires google .. map api code if using maps
//	Requires beachwatchers.net/code/css/imgTextTable.css
//	Calling program must  have line:
//		var BW_UTIL = new BW_UTILITY_FUNCTIONS();



function BW_UTILITY_FUNCTIONS()		// constructor
{

var that = this;

// -- keep this public for doContactRelay
this.bwContactArr = new Array();

// -- keep these public for firebug

this.mapElemArr = new Array();	// a-tags with bw:map specs
this.bwpElemArr = new Array();	// a-tags with bw:xxx specs
this.bwpObjArr = new Object();  // retrieved data 
this.pixArr;			// will hold returned pix objects

var bwOrgUrl = 'http://beachwatchers.net';
var imgUrl = 'http://beachwatchers.wsu.edu/images';

this.pixArr;			// will hold returned pix objects

// tmp working variables
var jsonScriptId=0;		// counter for unique script IDs
var sq = new Array();		// holds query components





// ==================================================================
//	INITIALIZATION


this.init_XXX = function () { 

//console.log('in BW.init_XXX abc');

	init_BW_XXX();

}

function initPopBox()
{
	// override some PopBox.js global settings
	popBoxRevertText = "Click anywhere on this image to shrink it.";
	popBoxWaitImage.src = imgUrl + "/spinner20.gif";
	popBoxRevertImage   = imgUrl + "/magminus.gif";
	popBoxPopImage      = imgUrl + "/magplus.gif";

ts('starting popbox pass');
	InitPbSrc(); InitPbPopBar();
ts('done with popbox pass');
	
}


this.addOnLoad = function (newFunction) { 

	// reference: http://www.javascriptworld.com/chap9-1.html

	var oldOnload = window.onload;
	
	if (typeof oldOnload == "function") {
		window.onload = function() {
			if (oldOnload) {
				oldOnload();
			}
			newFunction();
		}
	}
	else {
		window.onload = newFunction;
	} 
}




// ===================================================================
//	MISC UTILITIES

function ts(txt) 
{
	// timestamping
	var now = new Date();
	//console.log(now,txt);
}


function getWebData(x)
{

  jsonScriptId++;

  var id = 'jsonScript' + jsonScriptId;

  var script = document.createElement('script');
  script.setAttribute('src', x.url);
  script.setAttribute('id', id);
  script.setAttribute('type', 'text/javascript');

  // in Safari (Mac and Win) the doc.docEl.firstChild
  //   fails (even after 20 second timeout) on wsu template pages
  //   where the firstChild is a comment 
  // for cases like that, pick up app provided scriptDock element

ts('getWebData');

  var el = document.getElementById('scriptDock');
  if (el) el.appendChild(script);
  else document.documentElement.firstChild.appendChild(script);


}


var init_BW_XXX = function ()
{
ts('init_BW_XXX.abc');

	// -- find all bw:xxx references and handle or cache
	scanForBW_XXX();


	// -- do we need to resolve img references ?
	if (sq.length >  0){
		var x = new Object();
		var idlist = sq.join(',').replace(/,+/g,',');
		var cb = 'BW_UTIL.handlePixArr';
		x.url = bwOrgUrl + '/isle/imgdb/?q=download&cb='
			+cb+'&id=' + idlist;
		getWebData(x);
	}

	// -- do we need to resolve map references ?
	if (that.mapElemArr.length > 0){
		var cb = BW_UTIL.replace_BW_MAP; 
		google.load('maps', 2, { 'callback': cb } )
	}

}

var myScanArr1;
var myScanArr2;

function scanForBW_XXX()
{

	var myArr = new Array();
	var elArr = document.getElementsByTagName("a");
	for (var i=0; i<elArr.length; i++){

		var el = elArr[i]; if (!el.href) continue;

		var href = el.getAttribute('href');  // to avoid leading path

		// this must be case-insensitive or IE won't recognize
		if (!href.match(/^BW:/i)) continue;

		myArr.push(el);
	}


myScanArr1 = myArr;

	for (var i=0; i<myArr.length; i++)
	{
		var el = myArr[i]; 
		var href = el.getAttribute('href');  

		if (href.match(/BW:CONTACT/i)){
			mkBwContactHref(el);
		}
		else if (href.match(/BW:MAP/i)){
			mkGoogleMap(el);
		}
		else {
			bwpParseSpec(el,href);
		}
	}
}


function needBwp(el,bwpID)
{
	var xid = 'x' + bwpID;
	sq.push(bwpID);

	if (typeof that.bwpObjArr[xid] == 'undefined'){
		that.bwpObjArr[xid] = new Object();
		that.bwpObjArr[xid].elArr = new Array();
	}
	that.bwpObjArr[xid].elArr.push( el );
}


var pixArr;	// make a global

// ------------------
this.handlePixArr = function(xx,yy,arr)
// ------------------
{
ts('in pix arr');
	pixArr = arr;
	for (var x in that.bwpObjArr){
		var bwp = that.bwpObjArr[x];
//console.log(x,bwp);
		var obj = pixArr[x];
//console.log(obj);
		if (typeof obj == 'undefined'){
			// invalid reference 
			bwp.defunct = true;
			continue;
		}

		bwp.defunct = false;
		bwp.urlSm = mkPixUrl(obj,'sm');
		bwp.urlTn  = bwp.urlSm.replace(/\/sm\//g,'/tn/');
		bwp.urlMed = bwp.urlSm.replace(/\/sm\//g,'/med/');
		bwp.urlLg  = bwp.urlSm.replace(/\/sm\//g,'/lg/');

		bwp.title = obj.t;	// for now, default to title
					// TODO - store caption
		bwp.subtitle = obj.st;	// for now, default to title

//console.log('title',obj.t, 'caption',bwp.title);

		bwp.critterId = '';	// TODO

		bwp.ezBool = false;
		if (obj.ezsn != ''){
			bwp.ezBool = true;
			bwp.ezsn = obj.ezsn;
			bwp.ezcn = obj.ezcn;
			bwp.ezHref = obj.ezHref;
		}

	}

	replace_BW_XXX();
	initPopBox();
}


var url = new Array();
function mkPixUrl(obj,sz)
{
        if (typeof sz == 'undefined') sz = 'sm';      // thumbnail

        // retrieve suffix from mime type
        var imgtyp = obj.mt.replace(/image./,'');
        imgtyp = imgtyp.replace(/jpeg/,'jpg');

        var fname = obj.nn + '_' + obj.id;
        fname = fname.toLowerCase();
        fname = fname.replace(/[^a-z0-9]+/g,'_');

        url.length = 0;
	url.push(bwOrgUrl);
        url.push('/',obj.org,'/imgdb/',obj.fn,'/',sz,'/',fname,'.',imgtyp);

        var pixUrl = url.join('');
        return pixUrl;
}


// --------------------
function mkPopupCaption(bwp,spec)
// --------------------
{
	var htm = new Array();

	if (bwp.ezBool){

		var abool = false; var url='none';

		if (bwp.ezHref && bwp.ezHref.match(/htm/)){
			url = 'http://beachwatchers.wsu.edu/ezidweb/'
			+ bwp.ezHref;
			abool = true;
		}

//console.log(abool,url,bwp);
			
		if (abool) htm.push("<a target=_blank href='",url,"'>");
		htm.push(
			'<li><i>..',bwp.ezsn,'..</i>',
		   	'<br>',bwp.ezcn,'</i>'
		);
		if (abool) htm.push('</a>');
		htm.push('<hr>');
	}
	mkBwpTxt(htm,bwp,spec);

	if (bwp.subtitle !== '') htm.push('<br>',bwp.subtitle);

	return htm.join('');
}



// ------------------
function bwpParseSpec(el,href)
// ------------------
{
	var txt = el.innerHTML;
//console.log(1,txt);

	if (href.match(/(:contact)/i)){
		mkBwContactHref(el,txt);
	}

	var spec = new Object();
	spec.keyword = 'TEXT';	// default

	if (href.match(/(:tn|:thumb)/i)){
		spec.keyword = 'THUMBNAIL';
	}
	else if (href.match(/(:img|:image|:photo|:pic|:picture)/i)){
		spec.keyword = 'IMAGE';
	}
	else if (href.match(/(:contact)/i)){
		spec.keyword = 'CONTACT';
	}
	else {
		spec.keyword = 'TEXT'
		txt = txt.replace(/^.*TEXT\s+/m,'');
	}
	txt = txt.replace(/^\s*/m,'');
	txt = txt.replace(/\s*\]*\s*$/m,'');
//console.log(2,txt);

	var arr = spec.arr = new Array();


	// -- extra processing for imgdb
	var tmp = txt.split(/\s*;+\s*/m);
//console.log(tmp);
	for (var i=0; i<tmp.length; i++){

		var txt = tmp[i];
		txt = txt.replace(/[<]BR \/[>]/g,'');

		// ###.sn notes
		// ###.cn notes
		// ###.cnsn notes
		// ###.title notes
		// ###.caption notes
		// ###.asis text to be used asis, including tags
		var obj = arr[i] = new Object();
		var xx = txt.split(/\s+/m);
		var yy = xx[0].split('.');
		obj.id = yy[0].replace(/[^0-9]/g,'');

		// set default titling
		obj.dpy = 'title';
		if (spec.keyword == 'TEXT') obj.dpy = 'asis';

		// pick up any optional words in the spec
		obj.txt = '';
		
		if (yy.length > 1) obj.dpy = yy[1];
		if (xx.length > 1){ 
			delete xx[0];
			obj.txt = xx.join(' ');
		}

		needBwp(el,obj.id);
	}
//console.log('sq is ',sq);
//console.log(spec);

	that.bwpElemArr.push(el);
	el.bwpSpec = spec;
}

		

// ----------------------
function replace_BW_XXX()
// ----------------------
{
//console.log('replace BW XXX');

	// loop over bw:xxx elements,
	//	replacing them with retrieved information

	for (var i=0; i<that.bwpElemArr.length; i++){

//console.log('bwpElemArr.',i,that.bwpElemArr[i]);

		// el is an a-tag element
		var el = that.bwpElemArr[i];

		if (el.bwpSpec.keyword.match(/THUMBNAIL/)){
			// TODO - urlTN
			mkBwpImages(el,'urlSm');
		}
		else if (el.bwpSpec.keyword.match(/IMAGE/)){
			mkBwpImages(el,'urlMed');
		}
		else if (el.bwpSpec.keyword.match(/TEXT/)){
			mkBwpTxtToImg(el); continue;
		}
		else {
			//console.log('unrecognized keyword: ',
			//	el.bwSpec.keyword);
		}
	}
}



// --------------
function mkBwpImages(el,urlSiz)
// --------------
{

	// arr is list of bwpix to be shown in the table
	//    SHOULD only be one
	var arr = el.bwpSpec.arr;

	var htm = new Array();
	htm.push('<div align=center><table class="img-text-table" border=1><tr>');

	var colMax = 3; var icol=0;

	for (var i=0; i<arr.length; i++){
		var xid = 'x' + arr[i].id;
		var bwp = that.bwpObjArr[xid];

		++icol; if (icol > colMax){ 
			htm.push('</tr><tr>');
			icol = 0;
		}

		if (bwp.defunct){ 
			htm.push('<td>',xid,'?'); 
			continue;
		}

		htm.push(
		'<td valign=bottom>',
		'<p class="img-text-img">',
		'<img src=',bwp[urlSiz], 
		' onClick=Pop(this,50)',
		' pbSrcNL="',bwp.urlLg,'"',
		' pbCaption="',mkPopupCaption(bwp,arr[i]),'"',
		'>',
		'</p>',

		'<p class="img-text-caption">',
		'');

		mkBwpTxt(htm,bwp,arr[i]);

		htm.push(
		'</p>',

		'</td>',

		'');

	}

	htm.push('</tr></table></div>');

	bwSwap(el,htm);

}



var nowTS = '' + new Date().getTime();
// cannot use full digits - seem to get rounded when used as number
//  in the PopTxtImg callback - works sometime but not others
nowTS = nowTS.replace(/^......./,'');
var txtId = 1001;

// --------------
function mkBwpTxtToImg(el,arr)
// --------------
{
	// el is a hyperlink 
	// arr is list of ezid NAMES to be shown

	var arr = el.bwpSpec.arr;
//console.log('mkBwpTxtToImg',arr);

	var htm = new Array();

	for (var i=0; i<arr.length; i++){
		var xid = 'x' + arr[i].id;
		var bwp = that.bwpObjArr[xid];
//console.log(i,xid,bwp);


		// -- need unique id BUT compile-step
		//	will be independent for each post in blog
		

		++ txtId;
		id = '' + txtId + nowTS;


		if (i>0) htm.push(',  ');
		htm.push( '<img id="txtimg-',id, '"',
			' src=',imgUrl,'/dot_clear.gif width=6 height=6 ',
				' border=1 hSpace=2 vSpace=0',
				' align=base ',
				' style="padding:0px;margin;0px;"',
				' onClick=Pop(this,50)',
				' pbSrcNL="',bwp.urlLg,'"',
				' pbCaption="',mkPopupCaption(bwp,arr[i]),'"',
				'>');

		htm.push('<a id="txttxt-',id,'" class=disabledHref href=javascript:void(0)',
			' onClick=BW_UTIL.PopTxtImg(',id,');>');


		mkBwpTxt(htm,bwp,arr[i]);;
		
		htm.push('</a>');

	}
//console.log(htm);

	bwSwap(el,htm);
}

// --------------
function mkBwpTxt(htm,bwp,spec)
// --------------
{
//console.log('mkBwpTxt',spec.dpy,bwp);
	if (spec.dpy.match(/^t/)){ 
		htm.push('<i>',bwp.title,'</i>');
		return;
	}

	if (spec.dpy == 'sn'){
		htm.push('<i>',bwp.ezsn,'</i>');
		return;
	}

	if (spec.dpy.match(/^cn/)){ 
		var cn = '' + bwp.ezcn;
		var c0 = cn.charAt(0).toLowerCase();
		cn = cn.replace(/^./,c0);
		htm.push(cn);
		if (spec.dpy == 'cnsn'){
			htm.push('<i> (',bwp.ezsn,')</i>');
		}
		return;
	}

	if (spec.dpy == 'asis'){
		htm.push(spec.txt);
	}
}
		



this.PopTxtImg = function(id)
{
	// called when user clicks on text - trigger Pop on img
//console.log('PopTxtImg is=',id);
	var imgid = 'txtimg-' + id;
//console.log('imgid=',imgid);
	var el = document.getElementById(imgid);
	if (el) Pop(el,50);
	else alert('cannot find ' + imgid);
}



// ------------
function bwSwap(el,htm)
// ------------
{
        var node = document.createElement('span');
        node.innerHTML = htm.join('');

	el.parentNode.replaceChild(node,el);
}



// ---------------------
function mkBwContactHref(el)
// ---------------------
{
//console.log(el);
	var txt = el.innerHTML;
	var indx = that.bwContactArr.length;
	
	that.bwContactArr.push(txt);

	var arr = txt.split(/ *:: */);
	var xx = arr[0].split(/\./);
	   var org = xx[0]; if (org == 'island') org = 'isle';
	   var id  = xx[1];
	var name = arr[1];
	var subj = arr[2];


	var htm = new Array();
	htm.push('<a href="javascript:doContactRelay(',indx,')>',
		name,'</a>'
		);

	bwSwap(el,htm);
	
}


// --------------------
function mkGoogleMap(el)
// --------------------
{
	// el is an <a href
	var txt = el.innerHTML;
//console.log(txt);

	var obj = new Object();
	var jmin=0;
	var w = txt.split(/ +/);	// split into words
  	for (var j=0; j<w.length; j++){

          if (w[j].match(/\d+x\d+/)){
                  jmin = j;
                  var tmp = w[j].split(/x/);
                  obj.width = parseInt(tmp[0]);
                  obj.height = parseInt(tmp[1]);
          }
          if (w[j].match(/z=\d+/)){
                  obj.zoom = parseInt(w[j].replace(/z=/,''));
          }
          if (w[j].match(/,/)){
                  var tmp = w[j].split(/,/);
                  obj.lat = parseFloat(tmp[0]);
                  obj.lng = parseFloat(tmp[1]);
          }
  	}
  	w.length = jmin;
  	obj.nickname = w.join(' ');
//console.log(obj);

	var div = document.createElement('div');
	div.style.width = obj.width + 'px';
	div.style.height = obj.height + 'px';
	div.mapSpec = obj;

	el.parentNode.replaceChild(div,el);

	that.mapElemArr.push(div);

}


this.replace_BW_MAP = function ()
{
	var arr = that.mapElemArr;
	for (var i=0; i<arr.length; i++){
		var el = arr[i];
		var spec = el.mapSpec;

		var api = google.maps;
		var map =  new api.Map2(el);
		map.addControl(new api.SmallZoomControl());
		map.addControl(new api.ScaleControl());
		map.addControl(new api.MenuMapTypeControl());

		var c = new api.LatLng(spec.lat,spec.lng);
		map.setCenter(c,spec.zoom);

		map.setMapType(G_HYBRID_MAP);
	}
}
		
}	// -- end of BW_UTIL constructor



// ===============================================================
// 		CALLBACKS for PopBox.js
// ===============================================================


function PostPopProcessing(obj)
{
//console.log('PostPop - ', obj.id);
	if (obj.id.match(/txtimg/)){
		var id = obj.id.replace(/^.*txtimg-/,'');
		id = 'txttxt-'+id;
		var el = document.getElementById(id);
		if (el) el.style.visibility = 'hidden';
		else { 
			//console.log('cannot find ',id); 
		}
	}
	
}

// called after the Revert is complete
function PostRevertProcessing(obj)
{
//console.log('PostRevert - ', obj.id);
	if (obj.id.match(/txtimg/)){
		var id = obj.id.replace(/^.*txtimg-/,'');
		id = 'txttxt-'+id;
		var el = document.getElementById(id);
		if (el) el.style.visibility = 'visible';
		else { 
			//console.log('cannot find ',id);
		}
	}

}
