// JavaScript Document
var title = "";

$(document).ready(function() { 
  var panel = "";
  
  /* Utility functions */
  function basename(path, suffix) {
    var b = path.replace(/^.*[\/\\]/g, '');
    if (typeof(suffix) == 'string' && b.substr(b.length-suffix.length) == suffix) {
      b = b.substr(0, b.length-suffix.length);
    }
    return b;
  }

  /* Event handling for control panel */
  $("div#controls div#start a").click(function() {
    panel = basename($(this).attr("href"));
	$("div#controls div#start").animate({ 'left' : '-304px' }).hide();
	$("div#" + panel).show().animate({ 'left' : '0px' });
	html = '<h2><a href="start" title="Start"></a>Start &raquo; ' + $(this).attr("title") + '</h2>';
	$("div#controls h2").replaceWith(html);
  
    $("div#controls h2 a").click(function() {
      id = basename($(this).attr("href"));
	  $("div#" + panel).animate({ "left" : "304px" }).hide();
      $("div#" + id).show().animate({ "left" : "0px" });
	  html = '<h2>Start</h2>';
	  $("div#controls h2").replaceWith(html);
	  panel = "";
	  return false;
    });
	
	return false;
  });

  $('input#street').click(function() {
    $('p#crossroad_input').hide();
  });
  
  $('input#crossroad').click(function() {
    $('p#crossroad_input').show();
  });
  
  /** BUSINESS SEARCH **/
  $('form#business_search_form').submit(function(e) {
    e.preventDefault();
	Rpc.search_listings($('input#business_search_pattern').val());
  });
  
  /** LOCATION SEARCH **/
  $('form#location_search_form').submit(function(e) {
    e.preventDefault();
	if ($('input#street').attr('checked') == true)
	  Rpc.search_road($('input#location_street').val());
	else
	  Rpc.search_crossroad($('input#location_street').val(), $('select#location_crossroad').val(), $('select#location_crossroad :selected').text());
  });

  /** BROWSE **/
  $('form#browse_form').submit(function(e) {
    e.preventDefault();
	
	$msg = "";

    // check inputs
	if ($('#parent_id :selected').val() == "") {
      jAlert('You must select a category.');
	  return false;
	}
	
	if ($('#area_id :selected').val() == "") {
      jAlert('You must select a area.');
	  return false;
	}
	
	//  Do search...
	Rpc.browse();
	return false;
  });

/* Map event handling */
  $('a#metro').click(function() {
	$('div#metro_map').toggle();
	return false;
  });
  
  $('a#clear').click(function() {
    ScreenMap.empty();
	return false;
  });
  
  /** fullscreen events */
  if ($('div#fullscreen').length) {
	$('div#banner_content ul a').click(function() {
      $('div#fullscreen_form').show();
	  $('div' + $(this).attr('href')).show();
	  panel = $(this).attr('href');
	  $('div#controls h2 span').text($(this).attr('title'));
	  return false;
    });
	
	$('a#close_window').click(function() {
	  $('div#controls h2 span').text('');
      $('div' + panel).hide();
	  $('div#fullscreen_form').hide();
	  return false;
    });
  }
  
  if ($('a.nav_arrow').length) $('a.nav_arrow').tipsy();
  if ($('a.banner_nav').length) $('a.banner_nav').tipsy();

  var moveMap = {
    north: function() {
      $('div#map_body').scrollTop($('div#map_body').scrollTop()-5);
      return;
    },
    northeast: function() {
      $('div#map_body').scrollTop($('div#map_body').scrollTop()-5);
      $('div#map_body').scrollLeft($('div#map_body').scrollLeft()+5);
      return;
    },
    east: function() {
      $('div#map_body').scrollLeft($('div#map_body').scrollLeft()+5);
      return;
    },
    southeast: function() {
      $('div#map_body').scrollTop($('div#map_body').scrollTop()+5);
      $('div#map_body').scrollLeft($('div#map_body').scrollLeft()+5);
      return;
    },
    south: function() {
      $('div#map_body').scrollTop($('div#map_body').scrollTop()+5);
      return;
    },
    southwest: function() {
      $('div#map_body').scrollTop($('div#map_body').scrollTop()+5);
      $('div#map_body').scrollLeft($('div#map_body').scrollLeft()-5);
      return;
    },
    west: function() {
      $('div#map_body').scrollLeft($('div#map_body').scrollLeft()-5);
      return;
    },
    northwest: function() {
      $('div#map_body').scrollTop($('div#map_body').scrollTop()-5);
      $('div#map_body').scrollLeft($('div#map_body').scrollLeft()-5);
      return;
    }
  }

  var mv_timerid = 0;

  $('a#e').hover(
    function() {
      mv_timerid = window.setInterval(function() { moveMap.east(); }, 40);
    },
    function() {
	  window.clearInterval(mv_timerid);
    }
  );

  $('a#se').hover(
    function() {
      mv_timerid = window.setInterval(function() { moveMap.southeast(); }, 40);
    },
    function() {
	  window.clearInterval(mv_timerid);
    }
  );

  $('a#s').hover(
    function() {
      mv_timerid = window.setInterval(function() { moveMap.south(); }, 40);
    },
    function() {
	  window.clearInterval(mv_timerid);
    }
  );

  $('a#sw').hover(
    function() {
      mv_timerid = window.setInterval(function() { moveMap.southwest(); }, 40);
    },
    function() {
	  window.clearInterval(mv_timerid);
    }
  );

  $('a#w').hover(
    function() {
      mv_timerid = window.setInterval(function() { moveMap.west(); }, 40);
    },
    function() {
	  window.clearInterval(mv_timerid);
    }
  );

  $('a#nw').hover(
    function() {
      mv_timerid = window.setInterval(function() { moveMap.northwest(); }, 40);
    },
    function() {
	  window.clearInterval(mv_timerid);
    }
  );

  $('a#n').hover(
    function() {
      mv_timerid = window.setInterval(function() { moveMap.north(); }, 40);
    },
    function() {
	  window.clearInterval(mv_timerid);
    }
  );

  $('a#ne').hover(
    function() {
      mv_timerid = window.setInterval(function() { moveMap.northeast(); }, 40);
    },
    function() {
	  window.clearInterval(mv_timerid);
    }
  );

  $('a#e, a#se, a#s, a#sw, a#w, a#nw, a#n. a#ne').click(function() { return false; });

  $('div#map_body').hover(
    function() { $(this).css('cursor', 'move'); },
    function() { $(this).css('cursor', 'default'); }
  );

  $('input#location_street').blur(function() {
	if ($('input#street').attr('checked') == true) return;
    if ($('.ac_results').css('display') == 'none') {
      if ($('input#location_street').val() == "") 
	    jAlert('Please specify a valid road first.');
	  else
	    Crossroads.getlist($('input#location_street').val(), 'select#location_crossroad');
	}
  });

  
  /* Area object */
  var Areas = {
    populate: function(parent_id) {
      $.post(baseurl + 'rpc/get-areas', {parent_id: parent_id }, function (area) {
	    var option;
	  
	    option = (parent_id == -1) ? "<option value=''>&raquo; Select an area &laquo;</option><option value='^0'>All of Shanghai</option>" : "<option value='^" + parent_id + "'>Whole area</option>";
 
        prefix = (parent_id == -1) ? "^" : "";
	  
        $.each(area.list, function(i, item) {
	      option += "<option value='" + prefix + item.id + "'>" + item.name + "</option>";
	    });
	 
	    selobj = (parent_id == -1) ? '#area_id' : '#hotspot_id';
	  
	    $(selobj).empty();
	    $(selobj).append(option);
      }, 'json');
	}
  }

  /* Category object */
  var Category = {
    populate: function(parent_id) {
      $.post(baseurl + 'rpc/get-categories', {parent_id: parent_id }, function (cats) {
	    var option;
	  
	    option = (parent_id == -1) ? "<option value=''>&raquo; Select a category &laquo;</option>" : "<option value='^" + parent_id + "'>All</option>";
 
        $.each(cats.list, function(i, item) {
	      option += "<option value='" + item.id + "'>" + item.name + "</option>";
	    });
	 
	    selobj = (parent_id == -1) ? '#parent_id' : '#child_id';
	  
	    $(selobj).empty();
	    $(selobj).append(option);
      }, 'json');
	}
  }

  /* Crossroads object */
  var Crossroads = {
	in_progress: false,
	target: null,
    getlist: function(roadname, target) {
	  if (this.in_progress == true) return;
	  
	  this.in_progress = true;
	  this.target = target;
	  
	  var params = {
	    name: roadname
	  }

	  jMessage(ajax_loader + " Updating cross-roads");
	  $.post(baseurl + 'rpc/get-crossroads', params, function (data) {
	    jDismiss();
		Crossroads.in_progress = false;
		if (data.crossroads == null || data.status != 'OK') {
		  jAlert('No cross-roads found!');
          $(Crossroads.target).append('<option value="">&raquo; Get cross-roads &laquo;</option>');
		} else {
		  $(Crossroads.target).empty();
          $.each(data.crossroads, function() {
		    $(Crossroads.target).append('<option value="' + this.id + '">' + this.name + '</option>');
          });
		}
        return;
	  }, 'json');
	}
  }
  
  /* Screen map */
  var ScreenMap = {
	list: null,
	count: 0,
	z: 999,
	map_ref: null,
	empty: function() {
	  $('div#map').empty();
	  $('div#result-list h5').text('');
	  $('div#result-list h5').append('<span class="red">Empty</span>');
	  $('div#result-list ul').empty();
	  $('div#result-list ul').append('<li></li>');
	},
	
    show_crossroad: function(xrd) {
		$('div#map').empty();
		this.create_pin('crossroad', 'crossroad pin', xrd.map_ref);
		msg = xrd.primary_road;
		msg += (xrd.primary_is_lane == 1) ? ' Lane' : ' Road';
		msg += ' and ' + xrd.secondary_road;
		msg += (xrd.secondary_is_lane == 1) ? ' Lane' : ' Road';
		$('div#result-list h5').text('Cross-road found.');
		$('div#result-list ul').empty();
		$('div#result-list ul').append('<li><a id="crossroad" href="#" title="' + xrd.map_ref + '">' + msg + '</a></li>');
		$('div#result-list ul a').click(function() { ScreenMap.show_pin($(this).attr('id'), $(this).attr('title')); return(false); });
		this.show_pin('crossroad', xrd.map_ref);
		  // show search results
		if ($('div#fullscreen').length) {
		  $('a#close_window').click();
		  if ($('div#search_results_tab a.open_results').is(':visible')) $('div#search_results_tab a.open_results').click();
		} else {
		  if (panel == "") {
            $('div#start').animate({'left':'-304px'}).hide();
			$('div#search_results').show().animate({'left':'0'});
			panel = "search_results";
		  } else {
		    $('div#' + panel).animate({'left':"304px"}).hide();
			$('div#search_results').show().animate({'left':'0'});
			panel = "search_results";
		  }
		}
	},
	
	show_road: function(rd) {
		$('div#map').empty();
		
		$('div#result-list h5').text('Road found.');

        html = '';
		
		if (rd.map_ref_1 !== null) {
		  this.create_pin('road-1', 'road pin', rd.map_ref_1);
		  html += '<li><a id="road-1" href="#" title="' + rd.map_ref_1 + '">' + rd.alternative_name_1 + '</a>';
		}
		
		if (rd.map_ref_2 !== null) {
		  this.create_pin('road-2', 'road pin', rd.map_ref_2);
		  html += '<li><a id="road-2" href="#" title="' + rd.map_ref_2 + '">' + rd.alternative_name_2 + '</a>';
		}
		
		if (rd.map_ref_3 !== null) {
		  this.create_pin('road-3', 'road pin', rd.map_ref_3);
		  html += '<li><a id="road-3" href="#" title="' + rd.map_ref_3 + '">' + rd.alternative_name_3 + '</a>';
		}
		
		if (rd.map_ref_4 !== null) {
		  this.create_pin('road-4', 'road pin', rd.map_ref_4);
		  html += '<li><a id="road-4" href="#" title="' + rd.map_ref_4 + '">' + rd.alternative_name_4 + '</a>';
		}
		
		$('div#result-list ul').empty();
		$('div#result-list ul').append(html);
		$('div#result-list ul a').click(function() { ScreenMap.show_pin($(this).attr('id'), $(this).attr('title')); return(false); });
		this.show_pin('road-1', rd.map_ref_1);
		  // show search results
		if ($('div#fullscreen').length) {
		  $('a#close_window').click();
		  if ($('div#search_results_tab a.open_results').is(':visible')) $('div#search_results_tab a.open_results').click();
		} else {
		  if (panel == "") {
            $('div#start').animate({'left':'-304px'}).hide();
			$('div#search_results').show().animate({'left':'0'});
			panel = "search_results";
		  } else {
		    $('div#' + panel).animate({'left':"304px"}).hide();
			$('div#search_results').show().animate({'left':'0'});
			panel = "search_results";
		  }
		}
	},
	
	show_result: function(count, list) {
		ScreenMap.count = count;
		if (ScreenMap.list != null) delete ScreenMap.list;
		this.list = new Array();
		this.list = list;
		this.map_ref = list[0].map_ref;
		
		if (count > 1) {
		  $('div#result-list h5').text(count + ' results found.');
		} else {
		  $('div#result-list h5').text('1 result found.');
		}
		
		list_html = "";
		
		jQuery.each(list, function() {
		  
		  if (this.category == 'Consulates') {
            $("a#" + this.id).append('<img src="' + baseurl + 'uploads/' + this.logo + '" alt="" />');
			$("a#" + this.id + " img").css({'position' : 'absolute', 'top' : '4px', 'left' : '4px' });
		  }
		  
		  
		  $("a#" + this.id).click(function() { z = ++ScreenMap.z; $(this).css('z-index', z); });
		  
		  // hard-coded for now! please change! //
		  switch (parseInt(this.category_id)) {
		    case 228: classname = 'restaurant pin'; break;
		    case 229: classname = 'bar pin'; break;
			case 231: classname = 'music pin'; break;
			case 232: classname = 'club pin'; break;
			case 241: classname = 'chinese-opera pin'; break;
			case 204: classname = 'cafe pin'; break;
			case 233: classname = 'sport pin'; break;
			case 242:
			case 243:
			case 226:
			case 221: classname = 'shopping pin'; break;
			default: classname = 'road pin';
		  }
		  // ------------- E N D -------------- //
		  
		  // create a list
		  ScreenMap.create_pin(this.slug, classname, this.map_ref);
		  list_html += "<li><a id=\"" + this.slug + "\" href=\"#\" title=\"" + this.map_ref + "\">" + this.public_name + ", " + this.short_address + "</a></li>";
		  
		  // show the pins and list
		  
		});

        $('div#result-list ul').empty();
		$('div#result-list ul').append(list_html);
		$('div#result-list ul a').click(function() { ScreenMap.show_pin($(this).attr('id'), $(this).attr('title')); return(false); });
		this.show_pin('road-1', this.map_ref);
	},
	
    create_pin: function(id, classname, map_xy) {
	  if (map_xy == null || map_xy == "") return;
      coord = map_xy.split(',');
      pin_top = coord[1]-12;
	  pin_left = coord[0]-8;
	  var s = '<a id="' + id + '" href="#" class="' + classname + '" style="top: ' + pin_top + 'px; left: ' + pin_left + 'px;"></a>';
      $('div#map').append(s);
	},
	
	show_pin: function(id, map_xy) {
      if (map_xy == null || map_xy == "") return;
      var map_ref = new Array();
      coord = map_xy.split(',');
      map_ref[0] = coord[0]-(map.viewport_width/2);
      map_ref[1] = coord[1]-(map.viewport_height/2);
      $('div#map_body').scrollTop(map_ref[1]);
      $('div#map_body').scrollLeft(map_ref[0]);
	}
  }


  /* Rpc objcet */
  var Rpc = {
    browse: function () {
      var params = {
        area_id: $('#hotspot_id :selected').val(),
		category_id: $('#child_id :selected').val()
	  }
	  
	  if ($('#child_id :selected').val().substr(0, 1) == '^') {
        category = $('#parent_id :selected').text();
      } else {
	    category = $('#child_id :selected').text();
	  }
	  
	  if ($('#hotspot_id :selected').val().substr(0, 1) == '^') {
        area = $('#area_id :selected').text();
	  } else {
	    area = $('#hotspot_id :selected').text();
	  }
	  
	  ScreenMap.empty();
      jMessage(ajax_loader + " Searching in " + category + " in " + area + "...");
	  $.post(baseurl + 'rpc/browse', params, function (data) {
	    jDismiss();
        if (data.count <= 0)
		  jAlert('Your search did not match any business or organisation.');
		else {
		  ScreenMap.show_result(data.count, data.list);
		  // show search results
		  if ($('div#fullscreen').length) {
		    $('a#close_window').click();
		    if ($('div#search_results_tab a.open_results').is(':visible')) $('div#search_results_tab a.open_results').click();
		  } else {
		    if (panel == "") {
              $('div#start').animate({'left':'-304px'}).hide();
			  $('div#search_results').show().animate({'left':'0'});
			  panel = "search_results";
		    } else {
		      $('div#' + panel).animate({'left':"304px"}).hide();
			  $('div#search_results').show().animate({'left':'0'});
			  panel = "search_results";
		    }
		  }
		}
        return;
	  }, 'json');
	},
	
	search_listings: function(pattern){
      var params = {
        pattern: pattern
	  }
	  ScreenMap.empty();
      jMessage(ajax_loader + " Searching for " + pattern + "...");
	  $.post(baseurl + 'rpc/search-clients', params, function (data) {
	    jDismiss();
        if (data.count <= 0)
		  jAlert('Your search did not match any business or organisation.');
		else {
		  ScreenMap.show_result(data.count, data.list);
		  // show search results
		  if ($('div#fullscreen').length) {
		    $('a#close_window').click();
		    if ($('div#search_results_tab a.open_results').is(':visible')) $('div#search_results_tab a.open_results').click();
		  } else {
		    if (panel == "") {
              $('div#start').animate({'left':'-304px'}).hide();
			  $('div#search_results').show().animate({'left':'0'});
			  panel = "search_results";
		    } else {
		      $('div#' + panel).animate({'left':"304px"}).hide();
			  $('div#search_results').show().animate({'left':'0'});
			  panel = "search_results";
		    }
		  }
		}
        return;
	  }, 'json');
	},
	
	search_road: function(pattern) {
      var params = {
        pattern: pattern
	  }
	  ScreenMap.empty();
      jMessage(ajax_loader + " Searching for road like " + pattern + "...");
	  $.post(baseurl + 'rpc/search-road', params, function (data) {
	    jDismiss();
        if (data.road == null)
          jAlert('Road not found.');
		else
          ScreenMap.show_road(data.road);
        return;
	  }, 'json');
	},
	
	search_crossroad: function(primary, secondary, secondary_name) {
      var params = {
		id: secondary
	  }
	  ScreenMap.empty();
      jMessage(ajax_loader + " Searching for cross-road " + primary + " &amp; " + secondary_name + "...");
	  $.post(baseurl + 'rpc/search-crossroad', params, function (data) {
	    jDismiss();
        if (data.crossroad == null)
          jAlert('Cross-road not found.');
		else
          ScreenMap.show_crossroad(data.crossroad);
        return;
	  }, 'json');
	}
  }

  /* Initialisation */
  $('input#busines_search_pattern').val('');
  $('input#crossroad').attr('checked', '');
  $('input#street').attr('checked', 'checked');
  $('input#location_street').blur(function() {
	if ($('input#street').attr('checked') == true) return;
    if ($('.ac_results').css('display') == 'none') {
      if ($('input#location_street').val() == "") 
	    jAlert('Please specify a valid road first.');
	  else
	    Crossroads.getlist($('input#location_street').val(), 'select#location_crossroad');
	}
  });
  $('input#location_street').autocomplete(baseurl + 'rpc/getroads');
  
  $('select#area_id').change(function() {
    $('#hotspot_id').empty();
	$('#hotspot_id').append('<option value="">*** Updating list ***</option>');
    Areas.populate($('select#area_id option:selected').val().substr(1));
  });
  
  $('select#parent_id').change(function() {
										
    $('#child_id').empty();
	
	if ($('select#parent_id option:selected').val() == "") {
	  $('#child_id').append('<option value="">-- Not set</option>');
	} else {
	  $('#child_id').append('<option value="">*** Updating list ***</option>');
      Category.populate($('select#parent_id option:selected').val());
	}
  });
  
  if ($('div#fullscreen').length) {
	$('a.open_results').click(function() {
      $('div#fullscreen div#slideout').animate({ "left" : "0" });
	  
	  $(this).hide();
	  $('a.close_results').show();
	  return false;
    });
	
	$('a.close_results').click(function() {
      $('div#fullscreen div#slideout').animate({ "left" : "-320px" });
	  
	  $(this).hide();
	  $('a.open_results').show();
	  return false;
    });
  }
  
  if ($("#event_calendar #slider").length) {
    $("#event_calendar #slider").easySlider({
      auto: true,
      continuous: true 
    });
  }

  $('div#map_body').scrollTop(map.start_y);
  $('div#map_body').scrollLeft(map.start_x);
  $('#map_body').dragscrollable({dragSelector: '.dragger:first', acceptPropagatedEvent: false});
  
  if (typeof map == 'object') {
    if (window.location.href.indexOf('map') > 0) {
	  map.viewport_width = $(window).width();
	  map.viewport_height = $(window).height();
	  map.start_x = parseInt((map.width - map.viewport_width)/2);
	  map.start_y = parseInt((map.width - map.viewport_width)/2);
	}
  }
  
  Areas.populate(-1);
  Category.populate(-1);


});

