
if (!window.console||!window.watch){
	//cheap non-firefox compatability.
	var C = function ( ){
		this.info = function(m){};
		this.warn = function(m){};
		this.debug = function(m){};
		this.dump = function (m){};
	}
	window.console = new C();
	window.dump = window.warn = window.debug = window.info = function(m){};
	window.watch = function (x,y) {};
}

/*
 * More compatibility fun...
 */
var b64tab = [-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1,-1, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,-1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1];
function b64decode ( d ){
	var b = 0; var n = 0; var s = '';
	for (var i = 0; i < d.length; i++) {
        var c = b64tab[d.charCodeAt(i)&0x7f];var p = d[i]=='=';
        if (c==-1) continue;
        b = (b<<6)|c;n+=6;
        if(n>=8){
        	n-=8;
        	if (!p) s += String.fromCharCode((b >> n) & 0xff);
        	b&=(1<<n)-1;
        } 
	}
	if (n) throw new Error("Invalid base64 data");
	return s;
}

if (!window.atob){
	window.atob = b64decode; 
}
//ugly  
if (navigator.appName&&navigator.appName.indexOf&&navigator.appName.indexOf('Internet Explorer')>=0&&document.all){
	//standard document.getElementsByName hack, with a little optimization to 
	//let us use a getElementsByTagName call first...
	document._getElementsByName = document.getElementsByName;
	document.getElementsByName = function (name, tagNameHint){
		var tags = [];
		var result = [];
		if (tagNameHint){
			tags = document.getElementsByTagName(tagNameHint);
		}else{
			tags = document.all;
		}
		for (var i=0;i<tags.length;i++){
			if (tags[i]&&tags[i].name==name){
				result.push(tags[i]);
			}
		}
		return result;
	} 
}else{
	//In theory we don't have to do anything here, but the whole fake currying thing in js
	//always makes me nervous.
}

var geView = null;
var showingGE = false;
window.onBodyLoad = function ( ){
	if ($('geplugin')&&0){
		document.body.innerHTML = "<div width='100%' height='100%' id='geplugin'/>";
		geView = new GEView ('geplugin');
		for(var i=0;i<Sources.length;i++){
			geView.createMarker(Sources[i].id, Sources[i]);
		}
	}	
};

function toggleGEView(){
	var ge = $('geplugin');
	if(showingGE){
		ge.hide();
		$('map').show();
	}else{
		ge.show();
		$('map').hide();
	}
	showingGE = !showingGE;
}

/*
 * Plotting Functions
 */
var RADIANS = 180.0 / Math.PI;

function Point ( x, y ){
	this.x = x;
	this.y = y;
	this.translate = function (pt){
		return new Point ( this.x + pt.x, this.y + pt.y );
	}
}

function Rect ( x, y, width, height ){
	this.x = x;
	this.y = y;
	this.width = width;
	this.height = height;
	this.topLeft = new Point ( x, y );
	this.center  = new Point ( x + width * .5, y + height * .5 );
	this.localToGlobal = function ( p ){
		return this.topLetopLeft.translate ( p );
	}
	/**
	 * Helper method to convert points relative to the center to absolute.
	 */
	this.unnormalize = function ( pt ){
		return new Point (
			(pt.x + 0) * this.width * .5 + this.x ,
			(pt.y + 0) * this.height * .5 + this.y  
		);
	}
	
	this.contains = function (x,y){
		return x >= this.x && x <= this.x + this.width &&
			y >= this.y && y <= this.y + this.height;
	}	
}

/**
 * Project galactic coordinates to points in ( -1, 1 ).
 */
function project ( lat, lon ){
	lon = lon>180?lon-360:lon;
	lat /= RADIANS;
	lon /= - (2.0 * RADIANS);
	var z = Math.pow ( Math.sqrt(1.0 + Math.cos(lat)*Math.cos(lon)), 1.25 );
	var x = Math.cos(lat)*Math.sin(lon)/z;
	var y = Math.sin(lat)/z;
	return new Point(x,-y);	
}

/**
 * zoom a point without projecting.
 */
 function zoom ( lat, lon, sourceBounds ){
 	lon=lon>180?lon-360:lon;
 	//lat /= RADIANS;
 	//lon /= RADIANS;
 	return new Point(-lon / (sourceBounds.width * .5 ), -lat / (sourceBounds.height * .5));
 }
 
 function plotZoomedSources (map, sources, bounds, sourceBounds){
 	$A(sources).each(
 		function (src){
 			var lon = src.coord_gal_lon;
 			var lat = src.coord_gal_lat;
 			if ( lon > 180 ) lon = 360 - lon;
 			//console.info ( lon+","+lat );
 			if (Math.abs(lon) > 30 || Math.abs(lat) > 5 ) return;
 			//console.info ("OK"); 
 				var p = bounds.unnormalize (zoom (src.coord_gal_lat, src.coord_gal_lon,sourceBounds));
 				var sp = addSourcePoint(map, src, p);
 				sp.name = 'zpt';
 				sp.id   = 'zpt_'+src.id;
 				sp.setStyle ('visibility:hidden');
 			
 		}
 	)
 	applyFilters();
 	if(window.tab){
	 	tableRowHandler(tab.getKeyArray(tab.keyCol));	
 	}
 }
 
function plotSources( map, sources, bounds ){
	$A(sources).each  (
	function (src){
		var p = project (src.coord_gal_lat,src.coord_gal_lon);
		p = bounds.unnormalize ( p );
		var e = addSourcePoint (map, src, p);
		e.name = 'pt';
		e.id = 'pt_'+src.id;		
	}
	);
	applyFilters();
}

function addSourcePoint ( map, src, coords ){
	var a = new Element ('a', {href:'?mode=1&showsrc='+src.id});
	var im = new Element ('img', {src:src.image,
		style:new Template('position:absolute;zIndex:1000;top:#{y}px;left:#{x}px' 
			).evaluate({x:coords.x,y:coords.y})});
	Event.observe(im,'mouseout',function (e){hideTip();},true);
	var t = new Template("<a href=?mode=1&showsrc=#{id}>#{name}</a>").evaluate({id:src.id,
		name:src.canonical_name}); 
	Event.observe(im, 'mouseover', 
		function (e){
			doTooltip (e,t);
		}
	);
	a.appendChild(im);
	map.appendChild(a);
	return a;
}
var IsShowingZoom = false;

function showZoom (showit){
	var layer = $('myLayer');
	//var tab   = $('t1');
	if (showit){
		$('t1').setStyle('top','750px');
		layer.setStyle('visibility','visible'); 
		$A(document.getElementsByName('zpt')).each(function(src){
			src.setStyle('visibility','visible');
		});
		IsShowingZoom = true;
		applyFilters ();
		tableRowHandler(tab.getKeyArray(tab.keyCol));
		 
	}else{
		$('t1').setStyle('top','550px');
		layer.setStyle('visibility','hidden');
		$A(document.getElementsByName('zpt')).each(
			function(src){
				src.setStyle('visibility','hidden');
			}
		);
		IsShowingZoom = false;
	}
}

function createSourcePoints ( ){
	plotSources($('map3'), Sources, MapBounds );
	plotZoomedSources($('myLayer'), Sources, ZoomBounds, new Rect(-30,-5,60,10));	
}



/*
 * Table Building Functions 
 */
function formatSourceDate ( d ){
	if ( !d || !Object.isString(d) || d.length != 6) return "";
	
	return format ( "#{year}-#{month}-01",  
		{year:d.substring(0,4), month:d.substring(4,6)});
}

function formatDistanceColumn ( mode, dist ){
	if (mode == null) return "";
	mode=''+mode;
	if(mode.indexOf('z')!=-1){ 
		return 'z = ' + dist;
	}
	if(mode.indexOf('kpc')!=-1){
		return dist + ' kpc';
	}
	return dist;
}


function addLoadEvent(func) { 
  var oldonload = window.onload; 
  if (typeof window.onload != 'function') { 
    window.onload = func; 
  } else { 
    window.onload = function() { 
      if (oldonload) { 
        oldonload(); 
      } 
      func(); 
    } 
  } 
} 


function parseSourceDate ( date ){
  if(date == null || !Object.isString(date) || date.length != 6){
    return null;
  }
  //if(date == "200910"){
  //  alert(date.substring(4,6));
  //}
  var dateObj = new Date (date.substring(0,4)+"/"+date.substring(4,6) + "/01");
  //return formatDate(dateObj,DATE_FORMAT);
  return dateObj;
}

function buildTableRows ( data ){
	var rows =  [];
	 
	$A(data).each (
		function ( row ){ 
			rows.push ([ row.id,
			 format(  "<a href='?mode=1&showsrc=#{rowId}'>#{cname}</a>" , {rowId:row.id, cname:row.canonical_name }), 
			 row.coord_ra, row.coord_dec,
			 row.source_type_name, row.observatory_name,
			 parseSourceDate ( row.discovery_date ), formatDistanceColumn( row.distance_mod, row.distance),
			 Catalogs[row.catalog_id].name]);//formatDistance ( row.distance_mod, row.distance ) ])
		}
	)
	return rows;	
}
/*
 * Catalog selection.
 */
 var SelectedCatalogs = { };
 
 function updateSelectedCatalogs ( ){
 	var opts = $("catalogSelect").getElementsByTagName ( 'option');
 	for (var i=0;i<opts.length;i++){
 		var val = opts[i].value; 
 		if(opts[i].selected){
 			SelectedCatalogs[ val ] = true;
 		}else{
 			delete SelectedCatalogs[val];
 		}
 	}
 }
 
 function catalogFilter ( src, row ){
 	return src.catalog_id in SelectedCatalogs;
 }
 
 function buildOptions (  ){
 	var sel = $("catalogSelect");
	var opts = [];
 	for (var cid in Catalogs){
 		var opt = new Element ( "option" , {value:cid});
 		opt.innerHTML = Catalogs[cid].name;
 		opts.push(opt);
 	}
	opts = opts.sortBy(function(o){return o.value;});
	for(var i=0;i<opts.length;i++){
		sel.appendChild(opts[i]);
	}
 	Event.observe(sel, 'change', onCatalogSelectChange , true);
 }
 
 function onCatalogSelectChange (   ){
 	if ( $("catalogFilterCheck").checked ){
 		updateSelectedCatalogs();
 		applyFilters();
 	}
 }
 
/**
 * This is called when the "Filter by catalog" check is changed.
 */
function filterByCatalogClick (  ){
	var check = $("catalogFilterCheck");
	if ( !check.checked ){
		removeFilter ( catalogFilter );
		applyFilters();
	}else{
		addFilter ( catalogFilter );
		updateSelectedCatalogs ( );
		applyFilters ();
	}
	
}
/*
 * Filtering 
 */
var FilterChain = [ ];

function addFilter ( func ){
	for(var i=0;i<FilterChain.length;i++){
		if(FilterChain[i]==func){
			return;
		}
	}
	FilterChain.push (func);	
}

function removeFilter ( func ){
	for(var i=0;i<FilterChain.length;i++){
		if(FilterChain[i]==func){
			FilterChain.splice(i,1);
			return true;
		}
	} 
	return false;
}

function applyFilters ( ){ 
	if (!window.tab){
		return;
	}
	for (var i=0;i<Sources.length;i++){
		var src = Sources[i];
		var row = tab.rows[i];
		var keep = true;
		for (var j=0;j<FilterChain.length;j++){
			if (!FilterChain[j] (src,row)) {
				keep = false; 
				row.isVisible = false;
				$('pt_' + src.id).style.visibility = "hidden";
				var z = $('zpt_' + src.id);
				if(z){
					z.style.visibility = "hidden";
				}
				break;
			}
		}
		if(keep){
			row.isVisible = true;
			$('pt_' + src.id).style.visibility = "visible";
			if (IsShowingZoom){
				var z = $('zpt_' + src.id);
				if(z){
					z.style.visibility = "visible";
				}
			}
		}
	}	
	tab.setPage ( 1 );
}

/*
 * Form helpers.
 */
var watchingForms = false;
function _stopHere (e){
	console.info(e.target);
}
function _setupForms ( ){
	if(!watchingForms){
		for (var i=0;i<document.forms.length;i++){
			var f=document.forms[i];
			f.addEventListener ( 'submit', function ( e ){ _stopHere(e);}, true);
		}
	}
}
function sendPost ( action, params ){
	
	var form = new Element ( 'form' , {method:'POST', action:action});
	for (var key in params){
		var val = params[key];
		form.appendChild( new Element ( 'input' ,
		{
			type:'hidden',
			name:key,
			value:val
		}) ); 
	}
	document.body.appendChild ( f );
	f.submit();
}


function sendForm ( elt ){
	//This is a big huge hack...
	var f = elt.form;
	var params = {};
	for (var i=0;i<f.elements.length;i++){
		var e = f.elements [i];
		params [ e.name ] = e.value;
	}
	postForm(f.action, params);
}

/*
 * Theme related.
 */
var Themes = {
	defaultStyle : {
		displayName : "Default Style",
		imagePath : "images/"
	},
//	test    : {
//		displayName : "Test Style",
//		imagePath   : "images/test/"
//	}
};

var CurrentTheme = "default";

function initThemes (){
	var sel = $('themeSelect');
	
	for (var theme in window.Themes){
	
		var opt = new Element('option');
		opt.value = theme;
		opt.innerHTML = Themes[theme].displayName;
		sel.appendChild(opt)
		 
	}
	Event.observe(sel,'change', function (event){
		setTheme (event.element().value);
	});
}

function setTheme ( options ){
	if (Object.isString(options)){
		window.CurrentTheme = options;
		options = Themes[options];
		
	}
	setImagePath ( options.imagePath );
}

function setImagePath (path){
	var each = function (elt){
		var img = null;
		for (var i=0;i<elt.childNodes.length;i++) {
			var kid = elt.childNodes[i];
			if (kid.nodeType==1){ //document.ELEMENT_NODE in IE land...
				img = kid;
				break;
			}
		}
		if (!img) return;
		if (!img.src) img.src = "";
		var name = img.src.split("/").pop();
		
		if (name){
			img.src = path + name;
		}
	}
	$A(document.getElementsByName('pt')).each (each);
	$A(document.getElementsByName('zpt')).each (each);
	$A(document.getElementsByName('lpt')).each (each);
}

/*
 * VisPlot
 */
 function getSourceById (id){
 	for(var i=0;i<Sources.length;i++){
 		if (Sources[i].id==id) return Sources[i];
 	}
 }
 function doVisPlot ( ){
 	if (!$('vpLink') || $('vpLink').hasClassName('invalidLink')){
 		return; //One of several places that make it tempting to include scriptaculous libraries...
 	}
 	var opts = {};
 	if ($('wholeYearRadio').checked){
 		opts ['mode']=100;
 		opts["date"] = formatDate(new Date(), 'dd-mm-yyyy');
 	}else{
 		opts['mode'] = 1;
 		var date = validateDate($('vpDate').value);
	 	if(!date) return;
		var s = formatDate(date, 'dd-mm-yyyy');
		opts['date'] = s;
 	}  
 	var v = $("selectVPCoords").value.split(";");
 	opts['lat'] = v[0];
 	opts['lon'] = v[1];
 	var tid = [];
 	var tname = [];
 	var ra = [];
 	var dec = [];
 	var srcids = tab.getKeyArray(0);
 	if(srcids==null||!srcids.length) return;
 	for(var i=0;i<srcids.length;i++){
 		var src = getSourceById(srcids[i]);
 		if(src){
 			tid.push (srcids[i]);
 			tname.push (src.canonical_name.replace(/,/g, '\\,'));
 			ra.push (src.coord_ra.replace(/,/g, '\\,'));
 			dec.push (src.coord_dec.replace(/,/g, '\\,'));
 		}
 	}
 	opts.tname = tname.join(',');
 	opts.ra = ra.join(',');
 	opts.dec = dec.join(',');
 	opts.tid = tid.join(',');
 	popupWin('http://tevcat.uchicago.edu/visplot.cgi?'+Object.toQueryString(opts),'Source Visibility','820','640','center','front');
 	//popupWin('visplot.cgi?'+Object.toQueryString(opts),'Source Visibility','820','640','center','front');
 	
 }
   var popupWinWindow=null;
  
function popupWin(mypage,myname,w,h,pos,infocus){
    if (pos == 'random'){ 
        LeftPosition=(screen.width)?Math.floor(Math.random()*(screen.width-w)):100;
        TopPosition=(screen.height)?Math.floor(Math.random()*((screen.height-h)-75)):100;
    } else {
        LeftPosition=(screen.width)?(screen.width-w)/2:100;
        TopPosition=(screen.height)?(screen.height-h)/2:100;
    }
    settings  ='width='+ w + ',height='+ h + ',top=' + TopPosition + ',left=' + LeftPosition;
    settings +=',scrollbars=1,location=0,directories=0,status=0,menubar=0,toolbar=0,resizable=0';
    //if already open, close it and re-open:
    if(popupWinWindow != null){ popupWinWindow.close();}
    popupWinWindow=window.open('',myname,settings);
    if(infocus=='front'){popupWinWindow.focus();popupWinWindow.location=mypage;}
    if(infocus=='back'){popupWinWindow.blur();popupWinWindow.location=mypage;popupWinWindow.blur();}  
}
 function validateDate (s){
 	var re = /^(\d\d?)[-](\d\d?)[-](\d\d\d\d)$/;
 	var mo = re.exec( s );
 	if(!mo) return null;
 	var d =new Date(mo[2]+"/"+mo[1]+"/"+mo[3]);
 	if(d.getElapsed ()==NaN) return null; 
 	return d;
 }
 function checkVPDate ( ){
 	if( window.validateVPDate && !validateDate($('vpDate').value)){
 		$('errorMessage').show();
 		$('selectOneMessage').hide();
 		//$('vpLink').addClassName ('invalidLink');
 		$('vpLink').style.color = '#505000';
 	}else{
 		$('errorMessage').hide();
 		if ( window.tab && tab.getKeyArray(tab.keyCol).length==0 ){
 			$('selectOneMessage').show();
 			//$('vpLink').addClassName ('invalidLink'); TODO: Get this to work.
 			$('vpLink').style.color = '#505000';
 		}else{
 			$('selectOneMessage').hide();
 			$('vpLink').style.color = '#D0D000'; //TODO: Style class!
 		}
 	}
 }


/**
 * Constants related to whether we're plotting selected, unselected or we don't care.
 */
//TODO: There's probably a more sensible way to do this...
var PLOT_ALL = 0;
var PLOT_SELECTED = 1;
var PLOT_UNSELECTED = 2;
var SelectionFilter = PLOT_ALL;

/**
 * Update various things in response to a selection change.
 */

function tableRowHandler ( selectedIds ){
	//Ask for at least one row.
	if (selectedIds.length==0){
		$('errorMessage').hide ();
		$('selectOneMessage').show();
		//$('vpLink').addClassName('invalidLink');
		$('vpLink').style.color = '#505000';
		$('wholeYearRadio').enable();
		$('wholeYearFont').color = '#FFFFFF';
	}else{
		$('selectOneMessage').hide();
		checkVPDate();
		if(selectedIds.length > 1){
			if ($('wholeYearRadio').checked){
				$('wholeYearRadio').checked = '';
				$('singleDayRadio').checked='checked';
				$('vpDate').enable();
        		$('vpDate').style.color = '#FFFFFF';
        		window.validateVPDate = true;
			}
			$('wholeYearRadio').disable();
			$('wholeYearFont').color = '#888888'; 
		}else{
			$('wholeYearFont').color = '#FFFFFF';
			$('wholeYearRadio').enable();
		}
	}
	
	//TODO: We should update the plotted points when the selection changes.
	//This is done, but I think there's a smarter way...
	if (SelectionFilter != PLOT_ALL){
		plotSel(SelectionFilter == PLOT_SELECTED ? 1 : 0);
	}
}

if(window.console){
	console.info ("tab="+window.tab);
}
if ( window.tab ){
	window.tab.rowHandler = tableRowHandler;
}
	
	
function overlay (){		
	    if(document.Panel2.oversel.value=='none'){
	        document.getElementById('ovr_vts').style.visibility = 'hidden';
	        document.getElementById('ovr_hess').style.visibility = 'hidden';
	    }
	    if(document.Panel2.oversel.value=='vts'){
	        document.getElementById('ovr_vts').src='images/Overlay_VTS.png';
	        document.getElementById('ovr_vts').style.visibility = 'visible';
	        document.getElementById('ovr_hess').style.visibility = 'hidden';
	    }
	    if(document.Panel2.oversel.value=='hess'){
	        document.getElementById('ovr_hess').src='images/Overlay_HESS.png';
	        document.getElementById('ovr_vts').style.visibility = 'hidden';
	        document.getElementById('ovr_hess').style.visibility = 'visible';
	    }
	    if(document.Panel2.oversel.value=='vandh'){
	        document.getElementById('ovr_vts').src='images/Overlay_VTS.png';
	        document.getElementById('ovr_hess').src='images/Overlay_HESS.png';
	        document.getElementById('ovr_vts').style.visibility = 'visible';
	        document.getElementById('ovr_hess').style.visibility = 'visible';
	    }
}

function toggle()
{
  for(var i=1;i<tab.cols.length;i++){
    gridDef.colDef[i].isVisible = true;
  }
  if(document.Panel.name.checked == 0) gridDef.colDef[1].isVisible = false;
  if(document.Panel.ra.checked == 0) gridDef.colDef[2].isVisible = false;
  if(document.Panel.dec.checked == 0) gridDef.colDef[3].isVisible = false;
  if(document.Panel.type.checked == 0) gridDef.colDef[4].isVisible = false;
  if(document.Panel.disc.checked == 0) gridDef.colDef[5].isVisible = false;
  if(document.Panel.date.checked == 0) gridDef.colDef[6].isVisible = false;
  if(document.Panel.dist.checked == 0) gridDef.colDef[7].isVisible = false;
  tab.loadData(gridDef);
  tab.rowHandler = tableRowHandler;
  tab.rowHandler (tab.getKeyArray(tab.keyCol));
}

function marked()
{
  var mkd = tab.getKeyArray(0);
  alert(mkd);
}
//0 - Unselect All
//1 - Select All
function selAll(val)
{
  if(val == 0){
    tab.resetMark();
    tab.paint();
  } else {
    for(i=0;i<tab.rows.length;i++){
      tab.rows[i].isMark = 1;
    }
    tab.paint();
    if ( tab.rowHandler && typeof tab.rowHandler == 'function'){
      tab.rowHandler(tab.getKeyArray(tab.keyCol));
    }
  }
}
	
function resetFilter(){
  for (var i = 0; i < tab.cols.length; i++){
    if (tab.cols[i].useAutoFilter) tab.setFilter(i, '');
  }
}

var sortA1 = 1;
function spw2(id){
  if(sortA1 == 1){
    tab.setSort(id, 1);
    sortA1 *= -1;
  } else {
    tab.setSort(id, -1);
	                         sortA1 *= -1;
  }
}

function resetAll(){
  for (i=0;i<tab.rows.length;i++) tab.rows[i].isVisible = 1;
  tab.setPage(1);
}

// val corresponds to SelectionFilter.
function plotSel(val)
{ 
  SelectionFilter = val; 
  var selPts = tab.getKeyArray(0);
  var allPts = document.getElementsByName("pt","a");
  
  if(IsShowingZoom){
    var zPts   = document.getElementsByName("zpt","a");
    
    for(var i=0;i<zPts.length;i++){
      if(val != PLOT_ALL){
        var match = false;
        for (var j=0;j<selPts.length;j++){
          if(zPts[i].id=='zpt_'+selPts[j]){
            match = true;
            break;
          }
        }
      }
      else {
        var match = true;
      }
      if(val!=PLOT_UNSELECTED){
        if(match && tab.rows[i].isVisible){
          zPts[i].style.visibility = "visible";
        }else{
          zPts[i].style.visibility = "hidden";
        }
      }else{
        if(match && tab.rows[i].isVisible){
          zPts[i].style.visibility = "hidden";
        }else{
          zPts[i].style.visibility = "visible";
        }	    			
      }
    }
  }
  
  
  for(var i=0;i<allPts.length;i++) {
    if(val != PLOT_ALL){
      var match = 0;
      for(var j=0;j<selPts.length;j++){
        var id  = 'pt_'+selPts[j];
        if(allPts[i].id == id ){
          match = 1;
          break;
        }
      }
    }
    else{
      var match = true;
    }
    if(val != PLOT_UNSELECTED){
      if(match == 1 && tab.rows[i].isVisible==1){
        allPts[i].style.visibility = "visible";
      } else {
        allPts[i].style.visibility = "hidden";
      }             
    } else {
      if(match == 0 && tab.rows[i].isVisible==1){
        allPts[i].style.visibility = "visible";
      } else {
        allPts[i].style.visibility = "hidden";
      }             
    }             
  }
}    

function changeThresh()
{
  //alert('change',document.Panel.src_thresh.checked);
  // Checked means show dodgy sources
  if(document.Panel.src_thresh.checked == 1){
    document.cookie = "src_thresh=-1";
  } else {
    document.cookie = "src_thresh=0";
  }
  window.location.reload();
}

function changePrivate()
{
  if(document.Panel3.checkShowPublic.checked == 1){
    //alert('change checked');
    document.cookie = "src_public=1";
  } else {
    //alert('change unchecked');
    document.cookie = "src_public=0";
  }
  window.location.reload();
}    
function exportLegend (back){
  var thm = 'default';
  var sel = $('themeSelect');
  if ( sel && window.Themes ){
    for (var name in window.Themes){
      if ( name == sel.value && window.Themes[name].imagePath ){
        thm = window.Themes[name].imagePath;
      }
    }
  }
  var loc = self.location.toString().split('#')[0]; //Something bad happens if you leave the hash on.
  window.open(loc+'export.pl?legend=1&back='+back+'&theme='+thm, 'Legend', 'left=20,top=20,width=235,height=500,toolbar=0,resizable=1');
}
function callExport(back)
{
  var allPts = document.getElementsByName("pt");        
  var list = ""; 
  for(var i=0;i<allPts.length;i++) {
    if(allPts[i].style.visibility == "visible" || allPts[i].style.visibility == ""){ 
      list += allPts[i].id+",";
    }
  }  
  var overlays = [];
  var overimgs = document.getElementsByClassName('overlay');
  for(var i=0;i<overimgs.length;i++){
    var img = overimgs[i];
    if(img.style.visibility!='hidden'){
      if(img.src && img.src.length!=0){
        //Strip off the root address (think this is ok...)
        var re = /^.+?\/\/.+?\/(.+)$/;
        var mo = re.exec (img.src);
        overlays.push(mo[1]);	
      }
    }
  }
  var over = overlays.join(',');
  var thm = 'default';
  var sel = $('themeSelect');
  if ( sel && window.Themes ){
    for (var name in window.Themes){
      if ( name == sel.value && window.Themes[name].imagePath ){
        thm = window.Themes[name].imagePath;
      }
    }
  }
  var loc = self.location.toString().split('#')[0]; //Something bad happens if you leave the hash on.
  window.open(loc+'export.pl?back='+back+';over='+over+';data='+list+';theme='+thm, 'Exporter', 'left=20,top=20,width=1080,height=500,toolbar=0,resizable=1');
}
var CCp = null;
var CGp = null;
function initCodeThat  ( ){
  window.CGp = CCodeThatTable.prototype;
  
  
  CGp.filterSel = function(val)
  {
            var t = this;
    for(i = 0;i<t.rows.length;i++){
      if(t.rows[i].isMark == 1){
        t.rows[i].isVisible = 1;
      } else {
        t.rows[i].isVisible = 0;
      }
    };
    t.setPage(1);
        }
  
  CGp.setBoundFilter = function(filterCol, val)
  {
    var t = this; 
    //check filter col
    if (Undef(filterCol) || filterCol < 0) return; 
    //make all rows visible
    for (i = 0; i < t.rows.length; i++) t.rows[i].isVisible = 1; 
    //check match values
    for (i = 0; i < t.rows.length; i++){
      if(t.rows[i].isMark == 1){
        t.rows[i].isVisible = 1;
      } else {
                      t.rows[i].isVisible = 0;
      }
    };
    //paint grid
    //t.setPage(1);
  }; 
  
  CGp.setPage = function (page)
  {
    var t = this;
    t.page = page;
    //clear search () && visible rows
    t.searchValue = ""; t.vr.length = 0;
    if (!ua.oldOpera) t.paint();
  };
  
  //define method that gets data for compare <-- here you can add some action with data before use it in filter
  window.CCp = CCodeThatCell.prototype;
  
  CCp.getData  = function()
  {
    var data = this.data;
    
    switch (this.col.type){
      case "Number":
      case "Currency":
      data = parseFloat(data);
      break;
      case "Date":
      data = formatDate(data, DATE_FORMAT);
      break; 
    };
    
    return data;
  };     
  
}
function showEGRET(showIt) 
{
  document.getElementById('ovr_egret').src='images/EGRET_Overlay75.png';
  if(showIt == 1) {
    document.getElementById('ovr_egret').style.visibility = 'visible';
  } else {
    document.getElementById('ovr_egret').style.visibility = 'hidden';
  }
}
function showGLAST(showIt) 
{
  document.getElementById('ovr_glast').src='images/GLAST_Overlay75.png';
  if(showIt == 1) {
    document.getElementById('ovr_glast').style.visibility = 'visible';
  } else {
    document.getElementById('ovr_glast').style.visibility = 'hidden';
  }
}
function showNames(showIt) 
{
  if(showIt == 1){
    Tooltip.positionFn=locIt;
    Tooltip.sticky=true;
    Tooltip.hideDelay=0;
    Tooltip.followMouse=0;
    doTooltip(0,tipSrc74);
    doTooltip(1,tipSrc120);
    doTooltip(2,tipSrc123);
  } else {
  }
}
function locIt()
{
  return { x: 0, y: 400 }
}

function showLoginHeader()
{
  if(document.getElementById('LoginHeader').style.visibility == 'hidden') {
    document.getElementById('LoginHeader').style.visibility = 'visible';
  } else {
    document.getElementById('LoginHeader').style.visibility = 'hidden';
  }
}

/*       function showZoom(showIt)
 {
 document.getElementById('zoomimg').src='images/SkyZoom.png';
 if(showIt == 1) {
 document.getElementById('myLayer').style.visibility = 'visible';
 document.getElementById('t1').style.top = '750';
 var cDivs = document.getElementsByName("zpt");
 for(var i=0;i<cDivs.length;i++) {
 cDivs[i].style.visibility = "visible";
 }
 } else {
 document.getElementById('myLayer').style.visibility = 'hidden';
 document.getElementById('t1').style.top = '550';
 var cDivs = document.getElementsByName("zpt");
 for(var i=0;i<cDivs.length;i++) {
 cDivs[i].style.visibility = "hidden";
 }
 }
 }*/
