/****************************************************************************
*                   Copyright (c) 2006 Mercator GeoSystems Ltd
*
*                           Mercator GeoSystems Ltd
*                           10 St Quentin View
*                           Sheffield
*                           South Yorkshire
*                           S17 4PS
*                           ENGLAND
*
*                           Tel    +44 (0) 114 235 3409
*                           Fax    +44 (0) 114 235 3409
*                           E-Mail info@mercatorgeosystems.co.uk
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/

/* Revision history

$Id$

*/

var interval_id;

// Initiliase general, application strings here (such as those for alert boxes)
function initStrings()
{
  strings['Browser window has changed.  Do you wish to reload the application?'] = 'Browser window has changed.  Do you wish to reload the application?';
  strings['Map']       = 'Map';
  strings['Postcodes'] = 'Postcodes';
  strings['Places']    = 'Places';
  strings['Finding location...Please wait...'] = 'Finding location...Please wait...';
  strings['Sorry, no more map locations allowed'] = 'Sorry, no more map locations allowed';
  strings["Checking progress"] = "Checking progress";
};

// The spinner is the "please wait" DIV in the centre of the screen that is displayed
// when anything time consuming happens
// just "hides" the spinner by making it "transparent"
function hideSpinner()
{
  waitMsg.hide();
};

// Shows the "loading image. Please wait" image
function showSpinner()
{
  waitMsg.show();
  waitMsg.bringToFront();
};

function loadFramework()
{
  // create the relevant UI components
  // position elms
  var e1 = domapi.Elm({id:"userDiv"});
  var w = domapi.bodyWidth() / 3;
  var h = domapi.bodyHeight() - 53;
  if (e1) {
    e1.style.position = "absolute";
    e1.setX(0);
    e1.setY(53);
    e1.setW(w);
    e1.setH(h);
  }
  var e2 = domapi.Elm({id:"locationsDiv"});
  if (e2) {
    e2.style.position = "absolute";
    e2.setX(w + 5);
    e2.setY(53);
    e2.setW((w * 2) - 15);
    e2.setH(h);
  }
  var e3= domapi.Elm({id:"mapDiv"});
  if (e3) {
    e3.style.position = "relative";
    e3.setX(0);
    e3.setY(0);
    e3.setW((w * 2) - 35);
    e3.setH(h - 40);
  }
  // within the map panel of the first splitpane we have a pagecontrol
  p = domapi.getElm("locationsDiv");
  pagecontrol = domapi.Pagecontrol({parent:p, h:h});  // same height as map
  // which has a map, postcode & locations page
  pgMap = pagecontrol.addPage({text:strings['Map'], type:"DIV"});
  pagecontrol.assignElement({id:"mapDiv",index:0});
  pgPostcode = pagecontrol.addPage({text:strings['Postcodes'], type:"DIV"});
  pagecontrol.assignElement({id:"postcodesDiv",index:1});
  pgPlaces = pagecontrol.addPage({text:strings['Places'], type:"DIV"});
  pagecontrol.assignElement({id:"placesDiv",index:2});
};

// general application initialisation
function init() {  
  // RPC defaults
  domapi.rpc.ontimeout    = mgTimeoutHandler;
  domapi.rpc.charset      = "UTF-8";
  domapi.rpc.manageCursor = false;
  domapi.rpc.doDebug = false;
  // lang
  lang = 'en_UK';
  // define image size
  screenW = domapi.bodyWidth();
  screenH = domapi.bodyHeight();
  // create layout
  loadFramework();
  // create "wait" object 
  var waitW = 230;
  var waitH = 60;
  // Container
  waitMsg = domapi.Elm({position:"absolute", 
                               w:waitW, 
                               h:waitH, 
                               x:(screenW/2)-(waitW/2), 
                               y:(screenH/2)-(waitH/2)});
  waitMsg.setBgColor("lightgrey");   
  waitMsg.style.border="1px solid black";   
  // Label
  waitLbl = domapi.Label({parent:waitMsg,
                        position:"relative", 
                               w:waitW, 
                               h:waitH, 
                               x:5, 
                               y:5});
  waitLbl.setBgColor("lightgrey");   
  waitLbl.setTextAlign("center");
  waitLbl.setText(strings['Finding location...Please wait...']);
  // create progress bar
  npProgress = domapi.Progressbar({parent:waitMsg, x:5, y:30, w:waitW-10, max:100});
  // hide it
  hideSpinner();
  // create map
  map = new mgMap(config_url);  
};

// loads DomAPI
function loadDOMAPI()
{
  // load DOMAPI functions
  domapi.loadUnit("pagecontrol");
  domapi.loadUnit("rpccore");
  domapi.loadUnit("coreutil");
  domapi.loadUnit("progressbar");  
  domapi.loadUnit("window");  
};

function mgTimeoutHandler(packet)
{
  // do nothing
  // this is here to "swallow" timeouts
};

// a map class
function mgMap(config_url)
{
  // save config url
  this.config_url = config_url;
  // create array of points
  this.m_points_x = [];
  this.m_points_y = [];
  // create the initial google map
  this.gmap = new GMap(document.getElementById("mapDiv"));
  //gmap.disableDragging();
  //gmap.disableInfoWindow();
  this.gmap.addControl(new GLargeMapControl());
  this.gmap.addControl(new GMapTypeControl());
  this.gmap.centerAndZoom(new GPoint(map_x, map_y), map_zoom);  
  // register click handler
  GEvent.addListener(this.gmap, "click", mapClickHandler);
};

// handle google map clicks
function mapClickHandler (marker, point) {
  // temp. disable clicking on existing points
  if (marker) {
    // map.gmap.removeOverlay(marker);
  } else {
    // not exceeded limit (
    if (map.m_points_x.length >= max_points) {
      alert(strings['Sorry, no more map locations allowed']);
    } else {
      //alert(point.x + "," + point.y);
      // save point
      map.m_points_x.push(point.x);
      map.m_points_y.push(point.y);
      // add marker
      map.gmap.addOverlay(new GMarker(point));
    }
  }
};

// resets all controls to their initial state
function resetApp()
{
  // reset forms
  document.getElementById('pcForm').reset();
  document.getElementById('placeForm').reset();
  // removes google map markers
  map.gmap.clearOverlays();
  // clear points array
  map.m_points_x = [];
  map.m_points_y = [];
};

// updates the progress bar when a progress "packet" is received from the server
function updateProgress(packet)
{
  // set the progress 
  var progress        = packet.data.findValueByName("progress");
  var internal_status = packet.data.findValueByName("internal_status");
  npProgress.setValue(parseInt(progress)); 
};

// sends an RPC request to the serevr to get the progress 
function checkProgress(p_tag) {
  // create RPC packet
  var myPacket = new domapi.RPCPacket({url:"mgNetworkPlannerServer.php",statusText:strings["Checking progress"]});
  // add config url
  myPacket.data.add("config_url", map.config_url);
  // add action
  myPacket.data.add("action", "check_progress");  
  myPacket.data.add("tag", p_tag);
  // add language
  myPacket.data.add('lang', lang);
  domapi.rpc.manageCursor = false;
  // send the packet
  domapi.rpc.sendPacket({packet:myPacket, timeout:120000, onreceive:updateProgress});      
};

// Starts the process of finding a good location
function findLocation()
{
  // switch to map view
  pagecontrol.setIndex(0);
  // show spinner
  showSpinner();
  // build DomAPI RPC packet
  var myPacket = new domapi.RPCPacket({url:"mgMeetingServer.php"});
  // add basic parms
  myPacket.data.add("config_url", map.config_url);
  myPacket.data.add("lang",       lang);
  // add map locations
  for (var m=0;m<map.m_points_x.length;m++) {
    myPacket.data.add("map_x[]", map.m_points_x[m]);
    myPacket.data.add("map_y[]", map.m_points_y[m]);
  }
  // add postcodes
  var pcForm = document.getElementById('pcForm');
  for (e=0;e<pcForm.elements.length;e++) {
    myPacket.data.add(pcForm.elements[e].id, pcForm.elements[e].value);    
  }
  // add places
  var placeForm = document.getElementById('placeForm');
  for (e=0;e<placeForm.elements.length;e++) {
    // if a select list
    if (placeForm.elements[e].id.substr(0, 5) == 'place') {
      var box = document.getElementById(placeForm.elements[e].id);
      myPacket.data.add(placeForm.elements[e].id, box.options[box.selectedIndex].value);    
    } else {
      myPacket.data.add(placeForm.elements[e].id, placeForm.elements[e].value);    
    }
  }
  // add timestamp as a unique identifier (tag)
  plan_tag = "" + Math.round(new Date().getTime() * Math.random());
  myPacket.data.add("tag", plan_tag);
  // send packet
  domapi.rpc.sendPacket({packet:myPacket, timeout:120000, onreceive:locationHandler});        
  // setup progress bar
  npProgress.setProgress(0);
  // disable go & reset
  document.getElementById('go').disabled=true;
  document.getElementById('reset').disabled=true;
  // check progress every 3 seconds
  var fn = "checkProgress("+plan_tag+")";
  interval_id = setInterval(fn, 3000);
  
};

// when a location has been found this is called
function locationHandler(packet)
{
  // hide progress stuff
  hideSpinner();
  // reset progress bar (for next run)
  npProgress.setValue(0);
  // stop checking progress
  clearInterval(interval_id);
  // enable go & reset
  document.getElementById('go').disabled=false;
  document.getElementById('reset').disabled=false;
  // did anything go wrong?
  var error_message = packet.data.findValueByName("error_message");
  if (error_message.length > 0) {
    alert(error_message);
  } else {    
    // display appropriate message
    var location_name = packet.data.findValueByName("location_name");
    if (confirm("The best place for your meeting is near '"+location_name+"'.  Click OK to be taken to a list of hotels & conference facilities in this area.")) {
      // redirect to google local
      var location = packet.data.findValueByName("location");
      window.location.href = google_url+location;     
    }
  }
};