var serverDomain = 'http://www.t4media.co.uk/maps/';
var pathToRoot = '../';
var fields = {map: null,
              loading: null,
              region_header: null,
              region_arrow: null,
              region_list: null,
              region_tools: null,
              sidebar: null,
              show_gates: null,
              show_barriers: null,
              campaigns: null,
              label_booked: null,
              filter_booked: null,
//              label_radius: null,
//              radius: null,
//              radius_units: null,
//              apply_radius: null,
//              clear_radius: null,
              ad_list_area: null,
              ad_list: null,
              customers: null,
              customer_msg: null,
              customer_list_area: null,
              customer_list: null,
              map_name: null,
              link_area: null,
              test_link: null,
              copy_link: null};

addEventHandler(window, 'load',   windowLoad);

function windowLoad()
{
	
	
  for (name in fields)
    fields[name] = document.getElementById(name);

    if (fields.campaigns){
      fields.campaigns.selectedIndex = 0;
    }
    //  fields.show_gates.checked = false;
    //  fields.show_barriers.checked = false;
    
  var mapDiv = document.getElementById("map");
	map = new GMap2(mapDiv);
	mapDiv.style.height = windowHeight();

	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	map.addControl(new GScaleControl());
	map.setCenter(new GLatLng(54, -3), 6, G_NORMAL_MAP);
  
  fields.loading = document.createElement('div');
  fields.loading.id = 'loading';
  fields.loading.innerHTML = 'Loading...';
  mapDiv.appendChild(fields.loading);



  GDownloadUrl(pathToRoot + 'ad_gates.xml', receiveAds);
  GDownloadUrl(pathToRoot + 'ad_barriers.xml', receiveAds);
  
  //download if not public map
  if(location.pathname.indexOf('pub/map.asp') == '-1'){
    GDownloadUrl(pathToRoot + 'list_campaigns.xml.asp?sid='+Math.random(), receiveList);
    GDownloadUrl(pathToRoot + 'list_customers.xml.asp?sid='+Math.random(), receiveList);
  }
  addEventHandler(fields.copy_link, 'click', function () {fields.copy_link.select()});

  windowResize();
  initRegions();
};

function receiveList(response)
{
  var xmlDoc = GXml.parse(response).documentElement;
  var fieldName = xmlDoc.nodeName;
  
  if (!fields[fieldName])
    return;

  fields[fieldName].options[0] = new Option('None', '');

  var name;
  for (var n = 0; n < xmlDoc.childNodes.length; n++)
  {
    name = xmlDoc.childNodes[n].getAttribute('name').trim().htmlEntities();
    if (name != '')
      fields[fieldName].options[n + 1] = new Option(name, name);
  }
};

function filterAds()
{
  fields.loading.style.display = 'block';
  setTimeout('delayFilter()', 1);
};

function delayFilter()
{
  // Phase 1: Collect filter criteris

  var types = [];
  if (fields.show_gates.checked)
    types.push('gate');
  if (fields.show_barriers.checked)
    types.push('barrier');

    var filterBooked
    if (fields.campaigns){
     filterBooked = ((valueOfField(fields.campaigns) != '') &&
                      fields.filter_booked.checked);
    }

  var filterRegions = [];
  for (var n = 0; n < tvRegions.length; n++) 
    if (document.getElementById('TV_' + tvRegions[n]).checked)
      filterRegions.push(tvRegions[n].replace('_', ' and '));

//  enableRadius(types.length > 0);

  // Phase 2: Apply criteria to ad locations
  var shown;
  for (var a in ads) 
  {
    shown = (types.indexOf(ads[a].type) > -1);

    if (filterBooked &&
        !ads[a].isBooked())
      shown = false;

    if ((filterRegions.length > 0) &&
        (filterRegions.indexOf(ads[a].tvRegion) == -1))
      shown = false;

    if (shown)
      ads[a].show();
    else
      ads[a].hide();
  }

  windowResize();
  fields.loading.style.display = 'none';
};

function setCustomer()
{
  map.closeInfoWindow();
  fields.loading.style.display = 'block';
  fields.customer_msg.innerHTML = 'Loading...';
  setTimeout('delayCustomer()', 1);
};

function delayCustomer()
{
  showCustomer(valueOfField(fields.customers));
};

function setCampaign()
{
  fields.loading.style.display = 'block';
  fields.customer_msg.innerHTML = 'Loading...';

  campaignAds = {};
  var name = valueOfField(fields.campaigns);
  if (name == '')
  {
    enableBookedFilter(false);
    
    for (var a in ads)
      ads[a].setBooked(false);

    if (fields.filter_booked.checked)
      filterAds();
    else
      fields.loading.style.display = 'none';
  }
  else
  {
    enableBookedFilter(true);
    GDownloadUrl(pathToRoot + 'campaigns/' + name + '.xml?sid='+Math.random(), receiveCampaign);
  }
};

function receiveCampaign(response)
{
  var xmlDoc = GXml.parse(response);
  var nodes = xmlDoc.documentElement.getElementsByTagName('ad');
  var id;

  for (var n = 0; n < nodes.length; n++)
  {
    
    id = parseInt(nodes[n].getAttribute('id'));
    campaignAds[id] = true;
  }

  for (var a in ads)
    ads[a].setBooked(campaignAds[ads[a].id]);

  if (fields.filter_booked.checked)
    filterAds();
  else
    fields.loading.style.display = 'none';
};

function enableBookedFilter(enabled)
{
  if (enabled)
  {
    fields.label_booked.style.color = '';
    fields.filter_booked.disabled = false;
  }
  else
  {
    fields.label_booked.style.color = 'gray';
    fields.filter_booked.disabled = true;
  }
};

function enableRadius(enabled)
{
  if (enabled)
  {
    fields.label_radius.style.color = '';
    fields.radius_units.style.color = '';
    fields.radius.disabled       = false;
    fields.apply_radius.disabled = false;
    fields.clear_radius.disabled = false;
  }
  else
  {
    fields.label_radius.style.color = 'gray';
    fields.radius_units.style.color = 'gray';
    fields.radius.disabled       = true;
    fields.apply_radius.disabled = true;
    fields.clear_radius.disabled = true;
  }
};

function afterCustomerChange(name)
{
  fields.loading.style.display = 'none';
  if (name == '')
    fields.customer_msg.innerHTML = '';
  else
    fields.customer_msg.innerHTML = customers[name].length + ' shown';
};

function preSaveMap()
{
  var mapName = fields.map_name.value.trim();
  if (mapName == '')
  {
    alert('Please enter a map name.');
    return;
  }
  GDownloadUrl('check_map_name.asp?name=' + encodeURIComponent(mapName), saveMap);
};

function saveMap(response)
{

  var xmlDoc = GXml.parse(response);
  var avail = (getText(xmlDoc.documentElement.getElementsByTagName('available')[0]) == '1');
  var mapName = fields.map_name.value.trim();

  if (!avail)
    avail = confirm('Map "' + mapName + '" already exists. Do you want to replace it?');

  if (avail)
  {
    fields.link_area.style.display = 'none';

    var center = map.getCenter();
    var postBody = '';

    postBody = postBody + 'name=' + encodeURIComponent(mapName);
    postBody = postBody + '&lat='  + center.lat();
    postBody = postBody + '&lon='  + center.lng();
    postBody = postBody + '&zoom=' + map.getZoom();

    if (currentCustomer != '')
      postBody = postBody + '&customer=' + encodeURIComponent(currentCustomer);
    
    var campaign = valueOfField(fields.campaigns);
    if (campaign != '')
      postBody = postBody + '&campaign=' + encodeURIComponent(campaign);

//    if (defaultRadius > 0)
//      postBody = postBody + '&radius=' + defaultRadius;

    for (var a in ads)
      if (!ads[a].marker.isHidden())
      {
        postBody = postBody + '&ad=' + a;
        if (ads[a].locale)
          postBody = postBody + '.' + ads[a].locale.radius;
      }
    GDownloadUrl('save_map.asp', postSaveMap, postBody);
  }
};

function postSaveMap(response)
{
  var xmlDoc = GXml.parse(response);
  var nodes = xmlDoc.documentElement.getElementsByTagName('success');
  if (nodes.length == 0)
  {
    nodes = xmlDoc.documentElement.getElementsByTagName('error');
    var msg = 'There was a problem saving your map.';
    if (nodes.length == 0)
      msg = msg + ' Message: ' + getText(nodes[0]);
    alert(msg);
  }
  else
  {
    var code = nodes[0].getAttribute('code').trim();
    if (code == '')
      alert('There was a problem saving your map. No code was returned.');
    else
    {
      var link = serverDomain + 'customer_map.asp?id=' + code;
      fields.test_link.href = link;
      fields.copy_link.value = link;
      fields.link_area.style.display = 'block';
      fields.copy_link.select();
    }
  }
};

/*  We're not doing all-marker radii now
function applyRadius()
{
  var newRadius = valueOfField(fields.radius).trim();
  if (newRadius == '')
    newRadius = 0;
  else
    newRadius = parseInt(newRadius);

  if (isNaN(newRadius))
  {
    alert('Please enter a radius to shade.');
    fields.radius.focus();
  }
  else
  {
    defaultRadius = newRadius;
    for (var a in ads)
      if (!ads[a].marker.isHidden())
      {
        ads[a].hideRadius();
        ads[a].showRadius();
      }
  }
};
*/

function clearRadius()
{
  defaultRadius = 0;
  for (var a in ads)
    if (!ads[a].marker.isHidden())
      ads[a].hideRadius();
};

function initRegions()
{
  content = '';
  for (var n = 0; n < tvRegions.length; n++) 
    content = content + '\n' +
          '<div class="region_item" id="' + tvRegions[n] + '_area">' +
            '<input type="checkbox" id="TV_' + tvRegions[n] + '" onclick="filterAds(); refreshKey()" />' +
            '<label for="TV_' + tvRegions[n] + '">' +
              '<img width="15" height="15" src="' + pathToRoot + 'images/T4TV_' + tvRegions[n] + '.png" />' +
              tvRegions[n] + 
            '</label>' +
          '</div>';

  fields.region_list.innerHTML = content;
}

function clearRegions()
{
  for (var n = 0; n < tvRegions.length; n++) 
    document.getElementById('TV_' + tvRegions[n]).checked = false;

  filterAds();
  refreshKey();
}

function zoomToRegion()
{
  var bounds = new GLatLngBounds();
  var empty = true;

  for (var a in ads)
    if (!ads[a].marker.isHidden())
    {
      empty = false;
      bounds.extend(ads[a].marker.getPoint());
    }

  if (!empty)
  {
    var type = map.getCurrentMapType();
    map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
    toggleKey();
  }
};

function refreshKey()
{
  if (keyVisible)
  {
    fields.region_header.style.borderBottom = '1px solid gray';
    fields.region_arrow.src = pathToRoot + 'images/arrow_up.png';
    fields.region_tools.style.display = 'block';
    for (var n = 0; n < tvRegions.length; n++) 
      document.getElementById(tvRegions[n] + '_area').style.display = 'block';
  }
  else
  {
    fields.region_tools.style.display = 'none';
    fields.region_arrow.src = pathToRoot + 'images/arrow_down.png';

    var filtered = false;
    for (var n = 0; n < tvRegions.length; n++) 
      if (document.getElementById('TV_' + tvRegions[n]).checked)
      {
        filtered = true;
        document.getElementById(tvRegions[n] + '_area').style.display = 'block';
      }
      else
        document.getElementById(tvRegions[n] + '_area').style.display = 'none';

    if (filtered)
    {
      fields.region_header.style.borderBottom = '1px solid gray';
      fields.region_list.style.paddingBottom = '2px';
    }
    else
    {
      fields.region_header.style.borderBottom = '';
      fields.region_list.style.paddingBottom = '2px';
    }
  }
};

