var tod = 0;
var asl = 0;
var wc = 0;
var mType = 0;
var map = null;
var meetings = new Array();
var geoXml = null;
var ttc = 0;
var geocoder = null;

var meMarker = null;
var meetingsAtPoint = new Array();

function filterTtc()
{
    
    if (ttc == 1)
    {
        map.removeOverlay(geoXml);
        document.getElementById('ttc').className = 'inactiveCtl';
        ttc = 0;
    }
    else
    {
        map.addOverlay(geoXml);
        ttc = 1;
        document.getElementById('ttc').className = 'activeCtl';
    }

}



function initializeMap()
{
    try
    {
        Ajax.Responders.register(
        {
            onCreate : function()
            {
             
                if (Ajax.activeRequestCount === 1)
                {
                    $('loading').show();
                }
            },
            onComplete : function()
            {
                if (Ajax.activeRequestCount === 0)
                {
                    $('loading').hide();
                }
            }
        });
    }
    catch (ignored)
    {
       ;// alert(ignored);
    }
    
    try
    {
        if (GBrowserIsCompatible())
        {
            map = new GMap2(document.getElementById("bigmap_canvas"));
            
            var topLeft = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10,
                    10));
           
            
           // map.addControl(new GLargeMapControl(), topLeft);
            map.addControl(new GOverviewMapControl());
         map.addControl(new GLargeMapControl3D());
            map.setCenter(new GLatLng(43.705608, -79.39064), 10);
            
            geocoder = new GClientGeocoder();
            
            filterDow(dow);
            
        }
        else
        {
            alert("Your browser does not support the Google Maps.");
        }
        
    }
    catch (e)
    {
        alert("error initializing: " + e);
    }
}

var fetchedDows = [ false, false, false, false, false, false, false, false,
        false ];

var dowLabels = [ 'Any Day', 'Sunday', 'Monday', 'Tuesday', 'Wednesday',
        'Thursday', 'Friday', 'Saturday' ];

var todLabels = [ 'at <b>any time</b>', 'in the <b>morning</b>',
        'in the <b>afternoon</b>', 'in the <b>evening</b>' ];

var mTypeLabels = [ 'any meeting type', 'open', 'closed' ];

function filterDow(aDow)
{
    
    document.getElementById('dow' + dow).className = 'inactiveCtl';
    dow = aDow;
    document.getElementById('dow' + dow).className = 'activeCtl';
 
    if (!fetchedDows[aDow])
    {
        map.closeInfoWindow();
        fetchedDows[aDow] = true;
        fetch(aDow);
        
    }
    else
    {
        filter();
    }
   
}

function filterMtype(aMtype)
{
    document.getElementById('mType' + mType).className = 'inactiveCtl';
    mType = aMtype
    document.getElementById('mType' + mType).className = 'activeCtl';
    
    filter();
}

function filterTod(aTod)
{
    document.getElementById('tod' + tod).className = 'inactiveCtl';
    tod = aTod;
    document.getElementById('tod' + tod).className = 'activeCtl';
    
    filter();
    
}

function filterAsl()
{
    
    if (asl == 0)
    {
        asl = 1;
        document.getElementById('asl').className = 'activeCtl';
    }
    else
    {
        asl = 0;
        document.getElementById('asl').className = 'inactiveCtl';
    }
    
    filter();
}

function filterWc()
{
    if (wc == 0)
    {
        wc = 1;
        document.getElementById('wc').className = 'activeCtl';
    }
    else
    {
        wc = 0;
        document.getElementById('wc').className = 'inactiveCtl';
    }
    
    filter();
}

function filter()
{
    try
    {
        map.closeInfoWindow();
        for ( var i = 0; i < meetings.length; i++)
        {
            var meeting = meetings[i];
            var mtgsAtPoint = meetingsAtPoint[meeting.pKey];
            
            var showMeeting = false;
            for (var j = 0; j < mtgsAtPoint.length; j++)
            {
                var mtgAtPoint = mtgsAtPoint[j];
                var showThisMeeting = isInDow(mtgAtPoint.Dow.id)
                        && isInTod(mtgAtPoint.Meeting.start_time)
                        && isAsl(mtgAtPoint.Meeting.asl) && isWc(mtgAtPoint.Meeting.wc)
                        && isMtype(mtgAtPoint.MeetingType.id);
                
                showMeeting = showMeeting || showThisMeeting;
            }
            
            if (meeting.gMarker != null)
            {
                if (showMeeting)
                    meeting.gMarker.show();
                else
                    meeting.gMarker.hide();
            }
            
        }
        
         updateFilterSummary();
    }
    catch (e)
    {
        
        alert("filter error: " + e + " m: " + meeting.Meeting.id);
    }
}

function isMtype(aMtype)
{
    var r = mType == 0 || aMtype == mType;
    return r;
}

function isWc(aWc)
{
    var r = wc == 0 || aWc == '1';
    // alert("isWc: " + r);
    return r;
}

function isAsl(aAsl)
{
    var r = asl == 0 || aAsl == '1';
    // alert("isAsl: " + r);
    return r;
}

function isInDow(aDow)
{
    var r = dow == 0 || dow == aDow;
    // alertOnce("aDow: " + aDow + " dow: " + dow);
    // throw new Error('');
    return r;
}

function isInTod(aTime)
{
    var hours = new Number(aTime.slice(0, 2));
    // alert(aTime + " hours: " + );
    // throw new Error();
    var ok = true;
    
    switch (tod)
    {
        case 0:
            ok = true;
            break;
        case 1:
            ok = hours < 12;
            break;
        case 2:
            ok = hours >= 12 && hours < 18;
            break;
        case 3:
            ok = hours >= 18;
            break;
        default:
            throw new Error("Unhandled time of day(" + tod + +")");
    }
    // alert("isInTod: " + ok);
    return ok;
}

function toTime(date)
{
    var hours = new Number(date.slice(0, 2));
    var minutes = new Number(date.slice(3, 5));
    
    var suffix = "AM";
    if (hours >= 12)
    {
        suffix = "PM";
        hours = hours - 12;
    }
    if (hours == 0)
    {
        hours = 12;
    }
    
    if (minutes < 10)
        minutes = "0" + minutes;
    
    return hours + ":" + minutes + " " + suffix;
}

function wrapIfNotNull(content)
{
    var wrapped = null;
    
    if (content && content != '')
        wrapped = "(" + content + ")";
    else
        wrapped = "";
    
    return wrapped;
}
var alertDone = false;
function alertOnce(msg)
{
    if (!alertDone)
    {
        alert(msg);
        alertDone = true;
    }
    else
        ; // done
        
}
function emptyOrTarget(sTarget)
{
    return emptyOrOther(sTarget, sTarget);
}
function emptyOrOther(sTarget, other)
{
    var r = null;
    if (sTarget != null && sTarget.replace(/\s+/, "") != '')
        r = other;
    else
        r = '';
    
    return r;
}

function city(id)
{
    var name = '';
    for ( var i = 0; i < cities.length; i++)
    {
        if (cities[i].City.id == id)
            name = cities[i].City.idname;
        else
            ; // not found
    }
    return name;
}

function locAddress(loc)
{
    var addr = "";
 
    addr += emptyOrOther(loc.unit_suite, '#' + loc.unit_suite + ' ');
    addr += emptyOrTarget(loc.street_num);
    addr += emptyOrTarget(loc.num_suffix);
    addr += ' ';
    addr += loc.street_name;
    addr += ' ';
    addr += loc.street_type;
    addr += emptyOrOther(loc.street_direction, ' ' + loc.street_direction);
    addr += ', ';
    addr += city(loc.city_id);
    
    return addr;
    
}

var boolAttr = "<span class='imBool'>ATTR</span>";
var gLink = "<a href='GURL' title='Visit the home page for this meeting&#39;s group.'>NAME</a>";


function locName(loc)
{
    var locName = new String(loc.idname).replace(/\(.*\).*$/, "");
   return emptyOrOther(locName, "<i>" + locName + "</i><br />");
    
}

function groupLink(aMeeting)
{
    var link = null;
    var url = aMeeting.Aagroup.home_page_url;
    
    if (url != null && url != '')
    {
        link = gLink.replace('GURL', url);
        link = link.replace('NAME', aMeeting.Meeting.idname);
    }
    else
        link = aMeeting.Meeting.idname;
    
    return link;
}
function attrSpan(attr, value)
{
    var span = "";
    if (value == '1')
        span = boolAttr.replace("ATTR", attr);
    else
        ; // false
        
    return span;
}

function allAttrs(aMeeting)
{
    var attrs = "";
    attrs += attrSpan('Wheelchair accessible', aMeeting.Meeting.wc);
    attrs += attrSpan('ASL interpreters allowed', aMeeting.Meeting.asl);
    return attrs;
}

function meetingType(aMeeting)
{
    var type = aMeeting.MeetingType.idname;
    var desc = "";
    if (type == 'open')
        desc = 'Open meeting';
    else if (type = 'closed')
        desc = 'Closed meeting';
    else
        desc = 'Either a open or a closed meeting.';

    return desc;
}

function fetch(aDow)
{
    new Ajax.Request('/webapp/app/webroot/index.php/meetings/ajax/' + aDow,
    {
        method :'get',
        // parameters: {dow: aDow},
        
        onException : function(request, err)
        {
         
        },
        onSuccess : function(transport)
        {
            var txt = transport.responseText;
            txt = txt.match("\\[{1,1}.*\\].*$") + new String("");
          
            var json = txt.evalJSON();
            
            try
            {
                
                for ( var i = 0; i < json.length; i++)
                {
                    var meeting = json[i];
                    meetings[meetings.length] = meeting;
               
                    var gMarker = null;
                    
                    var pKey = "Dow" + aDow + "_Lat" + meeting.Location.latitude + "_Lng" +  meeting.Location.longitude;
                    if (meetingsAtPoint[pKey] == null)
                    {
                        var point = new GLatLng(meeting.Location.latitude,
                                meeting.Location.longitude);
                        
                        gMarker = new GMarker(point);
                        meetingsAtPoint[pKey] = [meeting];
                        map.addOverlay(gMarker);
                        
                        gMarker.hide();
                    }
                    else
                    {
                       
                        gMarker = meetingsAtPoint[pKey][0].gMarker;
                        meetingsAtPoint[pKey][meetingsAtPoint[pKey].length] = meeting;
                        // alert(meetingsAtPoint[pKey].length);
                    }
                    
                    meeting.pKey = pKey;
                    
                    meeting.gMarker = gMarker;
                    
                    gMarker.bindInfoWindowTabsHtml(null);
                    var tabs = [];
                    
                    for (var j = 0; j < meetingsAtPoint[pKey].length; j++)
                    {
                        var mtg = meetingsAtPoint[pKey][j];
                        tabs[j] = new GInfoWindowTab(toTime(mtg.Meeting.start_time),meetingInfo(mtg));                        
                    }
                    gMarker.bindInfoWindowTabsHtml(tabs);
                }
                
                filter();
            }
            catch (e)
            {
                // alert("error parsing json");
            }
        }
    });
    
}



function meetingInfo(aMeeting)
{
    
    var instance = mInfoTemplate;
    instance = instance.replace("NAME", groupLink(aMeeting));
    instance = instance.replace("ADDR_TITLE", locName(aMeeting.Location));
    instance = instance.replace("ADDRESS", locAddress(aMeeting.Location));
    instance = instance.replace("TIME", aMeeting.Dow.idname + ' '
            + toTime(aMeeting.Meeting.start_time));
    
    var type = meetingType(aMeeting);
    
    instance = instance.replace("TYPE", type);
    if (aMeeting.Meeting.srv == '1')
        instance = instance.replace("SRV", " (Service meeting)");
    else
        instance = instance.replace("SRV", "");
 
    instance = instance.replace("LANGUAGE", aMeeting.Language.idname);
    instance = instance.replace("LAT", aMeeting.Location.latitude);
    instance = instance.replace("LNG", aMeeting.Location.longitude);
    instance = instance.replace("ZOOM", "Zoom map in on meeting.")

    var attrs = allAttrs(aMeeting);
    instance = instance.replace("ATTRS", attrs);
    
    instance = instance.replace("FOCUS", emptyOrOther(aMeeting.Meeting.focus,
            "<b>Focus</b>: " + aMeeting.Meeting.focus));
    instance = instance.replace("RESTRICTIONS", emptyOrOther(
            aMeeting.Meeting.restrictions, "<b>Restrictons</b>: "
                    + aMeeting.Meeting.restrictions));
    
    var comments = aMeeting.Meeting.comments;
   // comments = comments.replace(/\n\s*\n/, '<br/>&nbsp;<br/>');
  //  comments = comments.replace(/\n/, '<br/>');
    instance = instance.replace("COMMENTS",
            emptyOrOther(aMeeting.Meeting.comments, "<b>Comments</b>: " + comments +""));
    
    
    var notices = aMeeting.MeetingNotice;
    if (notices.length > 0)
    {
        var allNotices = "<b style='margin-top: 5px; border-top: 1px solid #666; display: block;'>Meeting Notice(s):</b>";
        for ( var i = 0; i < notices.length; i++)
        {
            var mNotice = notices[i];
            var note = mInfoNoticeTemplate;
            note = note.replace("TITLE", "<b>* " + mNotice.title + "</b>");
            var remarks = mNotice.remarks;
            remarks = remarks.replace(/\n\s*\[.\]/, '');
            remarks = remarks.replace(/\[.\]/, '');
            note = note.replace("REMARKS", remarks);
           allNotices += note;
        }
        instance = instance.replace("NOTICES", allNotices);
    }
    else
    {
        instance = instance.replace("NOTICES",
                "");
    }
    
    return instance;
    
}

function zoom(lat, lng)
{
    scroll(0, 175);
    map.setCenter(new GLatLng(lat + 0.005, lng), 15);
}

function drawPoint(lat, lng)
{
    
    var point = new GLatLng(lat, lng);
    map.setCenter(point, 12);
    
    if (meMarker != null)
        map.removeOverlay(meMarker);
    else
        ; // not set yet
        
    var blueIcon = new GIcon(G_DEFAULT_ICON);
    blueIcon.image = "http://gmaps-samples.googlecode.com/svn/trunk/markers/blue/blank.png";
    markerOptions =
    {
        icon :blueIcon
    };
    
    meMarker = new GMarker(point, markerOptions);
    
    map.addOverlay(meMarker);
    
}

function findPoint()
{
    try
    {
        var lAddress = $('myAddress').value;
        
        geocoder.getLatLng(lAddress, function(point)
        {
            var lat = '';
            var lng = '';
            if (!point)
            {
                alert("Sorry, couldn't find your address; please try again.");
                return;
            }
            else
            {
                lat = point.lat();
                lng = point.lng();
            }
            
            drawPoint(lat, lng);
            
        });
        
    }
    catch (e)
    {
        alert("error finding lat and lng: " + e);
    }
    
}

function updateFilterSummary()
{
    var summary = filterSummary;
    summary = summary.replace("DOW", dowLabels[dow]);
    summary = summary.replace("TOD", todLabels[tod]);
    summary = summary.replace("TYPE", mTypeLabels[mType]);
    summary = summaryDisplay('dASL', asl, summary);
    summary = summaryDisplay('dWc', wc, summary);
    
    $('filterSummary').innerHTML = summary;
}

function summaryDisplay(attr, state, summary)
{
    if (state == 1)
        summary = summary.replace(attr, "");
    else
        summary = summary.replace(attr, "none");
    
    return summary;
}


function showMtgTypeInfo()
{
    var top =  document.viewport.getScrollOffsets().top;
 
    $('meetingTypeInfo').style.top = top + "px";
    $('meetingTypeInfo').style.display = '';

}