/**
 * copyright (C) 2009-2010 Auger
 */


// ---- Config ----

// Namespace to bind vars.
var auger = {};
auger.map = null;
auger.directions  = null;
auger.dirExpander = null;
auger.dirPanel    = null;
auger.dirError    = null;

// Settings
auger.SLIDE_SPEED = 300;
auger.MAIN_UP_SIZE = 281;
auger.SWF_INSTALLER = "/wp-content/themes/auger/resources/swf/expressInstall.swf"
auger.HEADER_SWF = {
  url: "/wp-content/themes/auger/resources/swf/header.swf"
, width: 600
, width_vwhite: 480
, height: 141
, version: "9.0.0"
};
auger.MAP_SETTINGS = {
  center: [ 52.252252, 6.181311 ]
, zoom: 16
, marker: [ 52.249475, 6.176159 ]
, directionsTo: "Hanzeweg 45, 7418 AV Deventer, Nederland"
};


// ---- Init ----

if( window.jQuery )
{
  // IE6 needs a kick to update the #wrapper size.
  var isIE6 = ( jQuery.browser.msie && jQuery.browser.version < 7.0 )

  // Attach init function
  $(document).ready( OnDomReady );
  
  // Tell CSS that JavaScript is enabled.
  $(document.documentElement).addClass("jsenabled");
}

function OnDomReady()
{
  $("#contents .toggle a").click( onExpanderClick );
  $("#slideUpButton a").click( onSlideUpButtonClick );
  $("#categoriesPulldown, #archivesPulldown").change( onBlogArchivePulldownChange );
  
  // If Google Maps V3 is loaded, use it.
  if( window.google && google.maps )
  {
    initGoogleMapsV2();
  }
  
  initFlashTitles();
}


// ---- expander ----

function onExpanderClick( event )
{
  var container = $(this).closest(".expander");
  var contents  = container.children(".contents");
  if( container.hasClass("expander-open") )
  {
    container.removeClass("expander-open");
    contents.slideUp( auger.SLIDE_SPEED, onSlideUpComplete );
  }
  else
  {
    container.addClass("expander-open");
    contents.slideDown( auger.SLIDE_SPEED, onSlideDownComplete );
  }
  
  // Avoid executing the href.
  event.preventDefault();
}


function onSlideUpComplete()
{
  if( isIE6 )
  {
    document.getElementById("wrapper").style.height = '';
  }
  
  if( auger.map )
  {
    auger.map.checkResize();
  }
}


function onSlideDownComplete()
{
  if( isIE6 )
  {
    document.getElementById("wrapper").style.height = '100%'
  }
  
  if( auger.map )
  {
    auger.map.checkResize();
  }
}


// ---- Flash titles ----

function initFlashTitles()
{
  if( ! window.swfobject ) return;
  
  var swf = auger.HEADER_SWF;
  var inVwhite = ( $("#wrapper.vwhite").length > 0 );
  
  var i = 1;
  while(true)
  {
    var id = "pagetitle" + i++;
    var obj = document.getElementById(id);
    if( obj )
    {
      if( obj.tagName == "OBJECT" )
      {
        // Static publishing
        swfobject.registerObject( id, swf.version, auger.SWF_INSTALLER );
      }
      else
      {
        // Dynamic publishing.
        var flashvars = { pageTitle: _trim( obj.innerText || $(obj).text() )   // workarround jQuery MSIE bug.
                        , pageLink: $("a", obj).attr("href") || ""
                        };
        var params = { wmode: 'transparent' };
        var width  = ( inVwhite ? swf.width_vwhite : swf.width );
        swfobject.embedSWF( swf.url, id, width, swf.height, swf.version, auger.SWF_INSTALLER, flashvars, params );
      }
    }
    else
    {
      break;
    }
  }
}


function _trim( text )
{
  return text.replace( /^\s+/gm, '' )
             .replace( /\s+$/gm, '' );
}


// ---- contact page ----

function initGoogleMapsV2()
{
  var canvas      = $("#googlemaps");
  var dirPanel    = $("#augerDirectionsPanel");
  var dirExpander = dirPanel.parent(".expander");
  var dirLink     = $("#showDirectionsLink");
  var dirError    = $("#routeForm .error");
  var options     = { mapTypes: [ G_NORMAL_MAP ] };
  
  if( ! GBrowserIsCompatible() )
  {
    canvas.addClass("incompatible");
    $("body")[0].className = 'default';
    return;
  }
  
  var s = auger.MAP_SETTINGS;
  var map = new google.maps.Map( canvas.get(0), options );
  map.enableContinuousZoom();
  map.enableScrollWheelZoom();
  map.setCenter( new GLatLng( s.center[0], s.center[1] ), s.zoom );
  
  var icon = G_DEFAULT_ICON;  // TODO: new GIcon()..
  var pos  = new GLatLng( s.marker[0], s.marker[1] );
  var marker = new GMarker( pos, icon );
  marker._type = 'auger';

  map.addOverlay( marker );
  GEvent.addListener( map, 'click', onMapClick );
  
  // Init directions
  auger.directions = new GDirections( map, dirPanel[0] );

  // Bind events
  GEvent.addListener( auger.directions, "addoverlay", onDirectionsComplete );
  GEvent.addListener( auger.directions, "error", onDirectionsError );
  $("#planRouteButton").click( onPlanRouteClick );
  $(window).unload( GUnload );
  
  // Make available.
  auger.map = map;
  auger.dirLink     = dirLink;
  auger.dirPanel    = dirPanel;
  auger.dirExpander = dirExpander;
  auger.dirError    = dirError;
}


function onMapClick( overlay, latlng )
{
  if( overlay != null )
  {
    switch( overlay._type )
    {
      case 'auger':
        overlay.openInfoWindowHtml( $("#augerInfoWindowTemplate").html() );
        setTimeout( slideMainUp, 100 );
        break;
    }
  }
}


function onPlanRouteClick( event )
{
  auger.dirError.hide();
    
  var userAddress = trim( this.form.from.value );
  if( userAddress == "" )
  {
    // Close directions
    auger.directions.clear();
    auger.map.closeInfoWindow();
    auger.dirLink.hide();
    auger.dirPanel.slideUp();
    auger.dirExpander.removeClass(".expander-open");
  }
  else
  {
    auger.directions.load( "from: " + userAddress + ", Nederland to: " + auger.MAP_SETTINGS.directionsTo );
  }
  
  event.preventDefault();
}


function onDirectionsComplete()
{
  auger.dirLink.show();
  slideMainUp();
}


function onDirectionsError()
{
  // Bepaal de juiste foutmelding
  var error = 'Google Maps kan geen route berekenen voor dit adres';
  switch( auger.directions.getStatus().code )
  {
    case 500: error += ": server fout"; break;
    case 602: error = "Het opgegeven adres kan niet gevonden worden."; break;
    case 603: error += ": het adres is beschermd."; break;
    case 604: break;  // leave as is
    case 620: error += ": probeert u het later nogmaals"; break;  // query flooding
    default:  error += ": interne fout"; break;
  }
  
  // Forcefully close directions
  auger.dirError.html( error ).show();
  auger.dirLink.hide();
  auger.dirPanel.hide();   // it's emptied by Google Maps (looking collapsed), make sure it doesn't magically reapear.
  auger.dirPanel.parent(".expander").removeClass(".expander-open");
}


// ---- blog pulldowns ----

function onBlogArchivePulldownChange( event )
{
  var activeValue = this.options[ this.selectedIndex ].value;
  if( activeValue )
  {
    location.href = activeValue;
  }
}


// ---- slide botton ----

function onSlideUpButtonClick( event )
{
  if( ! slideMainUp() )
  {
    // Slide down.
    $("#main").animate( { "marginTop": "0" }, onMainRestored );
    auger.map.closeInfoWindow();
  }
  
  if( event )
    event.preventDefault();
}

function slideMainUp()
{
  var main = $("#main");
  if( ! main.hasClass("slided-up") )
  {
    main.addClass("slided-up").animate( { marginTop: "-" + auger.MAIN_UP_SIZE + "px" }, onMainSlidedUp );
    return true;
  }
}

function onMainRestored()
{
  $(this).removeClass("slided-up");
  auger.map.checkResize();
}

function onMainSlidedUp()
{
  auger.map.checkResize();
}


// ---- Utils ----

function trim( value )
{
  return value.replace(/^\s+/,'').replace(/\s+$/,'');
}
