function b(id, dest_lang, src_lang, pid) {
    p(id, dest_lang, src_lang, 'a.php', pid);
}
function p(id, dest_lang, src_lang, url, pid) {
    if(!url) { 
        var url = 'ln.php';
    }
    url += '?' + id;
    if(dest_lang) {
        url += '&trto=' + dest_lang;
    }
    if(src_lang) {
        url += '&trfr=' + src_lang;
    }
    if(pid) {
        url += '&pid' + pid;
    }
    uP(url, id);
}
function xP(id) {
  uP('v.php?lc=' + lang + '&id=' + id, id);
}
function sc(lat, lon, lvl) {
  map.setCenter(new google.maps.LatLng(lat, lon));
  map.setZoom(lvl);
}
function slu(id, name) {
    var bUrl = 'dlu.php?lc=' + lang;
    var pStr1 = "uP('" + bUrl + "&t=1&id=" + id + "'," + id + ")";
    var pStr2 = "uP('" + bUrl + "&t=2&id=" + id + "'," + id + ")";
    var pStr3 = "uP('" + bUrl + "&t=3&id=" + id + "'," + id + ")";
    var pStr4 = "uP('" + bUrl + "&t=4&id=" + id + "'," + id + ")";
    var pStr5 = "uP('" + bUrl + "&t=5&id=" + id + "'," + id + ")";
    i$('dlud').innerHTML = '<b>' + name + '</b><br/>';
    i$('dlud').innerHTML += '&bull; <a href="javascript:;" onclick="' + pStr1 + '">Wikipedia</a><br/>';
    i$('dlud').innerHTML += '&bull; <a href="javascript:;" onclick="' + pStr4 + '">WHO</a><br/>';
    i$('dlud').innerHTML += '&bull; <a href="javascript:;" onclick="' + pStr2 + '">CDC</a><br/>';
    i$('dlud').innerHTML += '&bull; <a href="javascript:;" onclick="' + pStr3 + '">PubMed</a><br/>';
    i$('dlud').innerHTML += '&bull; <a href="javascript:;" onclick="' + pStr5 + '">Google Trends</a><br/>';
    i$('dlud').innerHTML += '<br/><a href="javascript:;" style="text-align: right" onclick="i$(\'dlud\').style.display = \'none\';">close</a>';
    i$('dlud').style.display = '';
}
// function alias to save bandwith on ajax calls
var visiMrk = new Array();
var markerArray = new Array();
function a(marker, hide_id) {
  if(hide_id) {
      //marker.hide();
      marker.onMap = 0;
      if(isArray(visiMrk[hide_id])) {
        visiMrk[hide_id].push(marker);
      } else {
        visiMrk[hide_id] = new Array(marker);
      }
  } else {
    //map.addOverlay(marker);
    markerArray.push(marker);
  }
}
function clearOverlays() {
  // remove kml layers if there are any
  if (!state['persistent_kmlwidget'] && kml2D) {
     for (var i = 0; i < kml2D.length; i++) {
        kml2D[i][1].setMap(null);
     }
  }
  // now remove the markers
  if (markerArray) {
     for (var mi = 0; mi < markerArray.length; mi++) {
        markerArray[mi].setMap(null);
     }
  }
}
function oMark(filename,marker) {
    filename = pathToMain + "hmcache/" + filename;
    $.get(filename, function(data){
        var info = '<div id="gm">' + data + '</div>';
        marker.openInfoWindowHtml(info);
    });
}

var ic = new Array();
var icbase = "http://healthmap.org/pins/img/";
for(var f = 0; f <= 10; f++) {
    ic['p' + f] = icbase + f + ".png";
    ic['c' + f] = icbase + "c/" + f + ".png";
}

function cM(point, title, html, n, tooltip, opened) {
var image = new google.maps.MarkerImage(ic[n], new google.maps.Size(12,20));
var shadow = new google.maps.MarkerImage(icbase + 'mm_shadow.png', new google.maps.Size(22,20));
var marker = new google.maps.Marker({
    position: point,
    map: map,
    icon: image, 
    shadow: shadow,
    title: tooltip
});
//var infowindow = new google.maps.InfoWindow({ content: html });
//google.maps.event.addListener(marker, "click", function() { infowindow.close(); infowindow.open(map,marker); }); 
google.maps.event.addListener(marker, "click", function() { getInfoWindowEvent(marker, html); }); 
points[counter] = point;
markers[counter] = marker;
counter++;
return marker;
}
function isArray(a) {return isObject(a) && a.constructor == Array;}
function isObject(a) {return (a && typeof a == 'object') || isFunction(a);}
function isFunction(a) {return typeof a == 'function';}

if(typeof(google) != "undefined") {
    var infowindow = new google.maps.InfoWindow();
}
function getInfoWindowEvent(marker, content) {
    infowindow.close()
    infowindow.setContent(content);
    infowindow.open(map, marker);
}


// for hiding/showing markers as map layer via checkbox
function hideM() {
    if (document.getElementById('alertsCB').checked == 0) {
        for (var m in markers) {
            //map.removeOverlay(markers[m]);  //v2
            markers[m].setVisible(false);
        }
    } else {
        for (var m in markers) {
            if ((m !== 'remove') && (m !== 'containsValue')) {
                markers[m].setVisible(true);
                //map.addOverlay(markers[m]);
            }
        }
    }
}

// this is some experimental stuff for expand/collapse markers
//var pl = new GIcon();
//pl.image = "http://healthmap.chip.org/~cfreifeld/da/img/5+.png";
//pl.shadow = "http://healthmap.org/img/mm_shadow.png";
//pl.shadowSize = new GSize(22,20);
//pl.iconSize = new GSize(32,32);
//pl.iconAnchor = new GPoint(16,16);
//pl.iconSize = new GSize(12,20);
//pl.iconAnchor = new GPoint(6,20);
//pl.infoWindowAnchor = new GPoint(6,10);
function cXM(point, tooltip, id) {
  var marker = new GMarker(point,{'icon': pl, 'title': tooltip});
  GEvent.addListener(marker, "click", function() { toggleVisiMrk(id); marker.hide(); });
  return marker;
}
function toggleVisiMrk(id) {
  if(isArray(visiMrk[id])) {
    for(var i = 0; i < visiMrk[id].length; i++) {
      m = visiMrk[id][i];
      if(!m.onMap) {
        map.addOverlay(m);
        m.onMap = 1;
      } else if(m.isHidden()) {
        m.show();
      } else {
        m.hide();
      }
    }
  }
}

function pT(lat,lon) {
    return new google.maps.LatLng(lat,lon);
}
// adapted from ecmanaut
function formatTime( timeInteger )
{
  function zpad( n ){ return n>9 ? n : '0'+n; }
  var t = new Date();
  t.setTime(timeInteger * 1000);
  var Y = t.getFullYear();
  var M = t.getMonth(); // month-1
  var D = t.getDate();
  //var d = t.getDay(); // 0..6 == sun..sat
  var mon = monAbbr[M];
  var h = t.getHours();
  var m = t.getMinutes();
  // var s = t.getSeconds();
  //return day +' '+ D +' '+ mon +', '+ Y +', '+ zpad(h)+':'+zpad(m)+':'+zpad(s);
  return D +' '+ mon +' '+ Y +' '+ zpad(h)+':'+zpad(m);
}

function initTags(checkAll) {
    for(var ti = 0; ti < tagIds.length; ti++) {
        var t = tagIds[ti];
        var tagCheck = i$('tag' + t);
        if(checkAll) {
            state['alert_tag_id']['' + t] = 1;
            tagCheck.checked = 1;
        }
        tagCheck.fieldType = 'alert_tag_id';
        tagCheck.dbId = t;
        addEvent(tagCheck, "click", stateChange);
        addEvent(i$('tn' + t), 'mouseover', hilite);
        addEvent(i$('tn' + t), 'mouseout', unHilite);
    }
}
function initCheckboxes(elt, checkAll) {
    var idMap = {'diz':diseaseIds, 'feed':feedIds, 'tag':tagIds, 'place':placeIds};
    var dbidMap  = {'diz':'disease_id', 'feed':'feed_id', 'tag':'alert_tag_id', 'place':'place_id'};
    var ckMap     = {'diz':'diseaseCheck', 'feed':'feedCheck', 'tag':'tagCheck', 'place':'placeCheck'};
    var scMap     = {'diz':'dn', 'feed':'fn', 'tag':'tn', 'place':'pn'};
    var ids = idMap[elt];
    var fieldType = dbidMap[elt];
    var ckName = ckMap[elt];
    var scName = scMap[elt];

    for(var i = 0; i < ids.length; i++) {
        var f = ids[i];
        var ckName = i$(elt + f);
        if(ckName  == null) {
           continue;
        }
        if(checkAll) {
            state[fieldType]['' + f] = 1;
            ckName.checked = 1;
        }
        ckName.fieldType = fieldType;
        ckName.dbId = f;
        addEvent(ckName, "click", stateChange);
        //addEvent(i$(scName + f), 'mouseover', hilite);
        //addEvent(i$(scName + f), 'mouseout', unHilite);
    }
}
function initDiseases(checkAll) {
    for(var di = 0; di < diseaseIds.length; di++) {
        var d = diseaseIds[di];
        var dizCheck = i$('diz' + d);
        if(checkAll) {
            state['disease_id']['' + d] = 1;
            dizCheck.checked = 1;
        }
        dizCheck.fieldType = 'disease_id';
        dizCheck.dbId = d;
        addEvent(dizCheck, "click", stateChange);
        addEvent(i$('dn' + d), 'mouseover', hilite);
        addEvent(i$('dn' + d), 'mouseout', unHilite);
    }
}
//var requestLock = false;
function stateChange(evt) {
    var tg = getTarget(evt);
    // update state object
    // TODO: eventually we will have non boolean state fields
    //state[tg.fieldType][tg.dbId] = tg.checked ? 1 : 0;
    tg.checked ? state[tg.fieldType][tg.dbId] = 1 : delete state[tg.fieldType][tg.dbId];
    //if(!requestLock) {
    //    requestLock = true;
    //    setTimeout('xajax_update_map(state)', 1500);
    //}
    //THIS IS FOR TIMELINE VS MAP
    // SECOND CONDITIONAL IS FOR NEWSITE - DON'T UPDATE MAP ON STATE CHANGE
    if(i$('content').className == "hide") {
        updTimeline();
    } else if(typeof presetds != 'function') {
        updMap();
    }
}
function getAllCheck() {
    state['disease_id'] = new Array();
    state['feed_id'] = new Array();
    state['alert_tag_id'] = new Array();
    state['place_id'] = new Array();
    var f = {'diz_as':'disease_id', 'feed_as':'feed_id', 'tag_as':'alert_tag_id', 'place_as':'place_id'};
    $('input:checkbox.place_as, input:checkbox.diz_as, input:checkbox.feed_as, input:checkbox.tag_as').each(function () {
        if(this.checked) {
            var theVal = $(this).val();
            var thisClassAll = $(this).attr('class');
            var thisClassAr = thisClassAll.split(" ");
            var thisClass = thisClassAr[0];
            state[f[thisClass]][theVal] = 1;
        }
    });
}
function updMap()
{
    //var sdate = i$('date1').value;
    //var edate = i$('date2').value;
    //var sdates = sdate.split("/");
    //state['start_date'] = sdates[2]+"-"+sdates[0]+"-"+sdates[1];
    //var edates = edate.split("/");
    //state['end_date'] = edates[2]+"-"+edates[0]+"-"+edates[1];

    //turn all preset downstates off, doesn't exist for current hm
    if(typeof presetds == 'function') {
        presetds();
    }
    // clear map
    counter = 0;
    // marker_html = [];
    points = [];
    markers = [];

    //TODO: activate spinner here
    //document.body.style.cursor = 'wait';
    // hit the server
    xajax_update_map(state);
}
// fixme: "more" and "hide" are English words
function expCollDiv(divid, dividlink)
{
    if(i$(divid).className == "hide") {
        i$(dividlink).innerHTML = '- hide';
        i$(divid).className = "block";
    } else {
        i$(dividlink).innerHTML = '+ more';
        i$(divid).className = "hide";
    }
}
function plusMinus(divid, dividlink)
{
    if(i$(divid).className == "hide") {
        i$(dividlink).innerHTML = '-';
        i$(divid).className = "block";
    } else {
        i$(dividlink).innerHTML = '+';
        i$(divid).className = "hide";
    }
}
function checkSame(val1, val2)
{
    if(val1 != val2) {
        alert("Password values are different, please try again.");
    }
}
function add_this(loc, service) {
    window.open("http://api.addthis.com/oexchange/0.8/forward/"+service+"/offer?url="+loc); 
}

