/* Hi. */
var realtor_onLoaded = new Array();
var realtor_onDomLoaded = new Array();
function addOnloadEvent(fnc){ realtor_onLoaded.push(fnc); }
function addOnDomLoadEvent(fnc){ document.observe('dom:loaded',fnc); }
function executeOnloadEvent(event) { for(var i=0;i<realtor_onLoaded.length;i++) realtor_onLoaded[i](); }

Event.observe(window, 'load', executeOnloadEvent);

var realtor_mouseX = 0;
var realtor_mouseY = 0;
var realtor_maps = new Array();
var realtor_markers = new Array();
var realtor_marker_managers = new Array();
var realtor_appInitiated = false;
var realtor_appPrepared = false;
var realtor_galleryControlsEffects;
var realtor_infoboxToggling = false;

function debug(msg)
{
  if (!$('debug_log'))
  {
    $('container').appendChild(new Element('div',{id:'debug_log'}));
  }
  if ($('debug_log').getStyle('display') != 'block') $('debug_log').setStyle( { display: 'block' } );
  $('debug_log').innerHTML = msg + '<br/>' + $('debug_log').innerHTML;
  return true;
}

function prepareApplication()
{
  if (realtor_appPrepared) return;
  realtor_appPrepared = true;
  $('page').select('div.infobox').each( function (infobox) { 
    infobox.addClassName('closed');
    infobox.down('div.title').observe('click',onClickInfoBox);
    infobox.down('div.content').wrap( new Element('div',{'class':'contentWrapper'}));
    infobox.down('div.content').setStyle({display:'none'});
  } );
}
addOnDomLoadEvent(prepareApplication);

function onClickInfoBox(event)
{
  Event.stop(event);
  if (realtor_infoboxToggling) return;
  realtor_infoboxToggling = true;
  var infobox = Event.findElement(event,'div.infobox');
  var infoboxContent = infobox.down('div.content');
  if (infobox.hasClassName('closed')) infobox.removeClassName('closed');
  else infobox.addClassName('closed');
  Effect.toggle( infoboxContent, 'blind', { duration: Math.max( 0.7, Math.min( 1.2, infoboxContent.getHeight() * 0.0015 )), afterFinish: infoBoxTogglingFinished } );
}

function infoBoxTogglingFinished()
{
  realtor_infoboxToggling = false;
}

function initApplication()
{
  if (realtor_appInitiated) return;
  realtor_appInitiated = true;
  var links = $('container').select('a.obfuscated');
  var c,i,link,clearLink;
  for (i=0;i<links.length;i++) 
  {
    link = links[i];
    link.innerHTML = getClearLink(link);
    link.observe('click',onClickMailLink);
  }
  $('container').observe('mousemove',onMouseMove);
  var hiddenPreloader = new Element('div',{id:'hiddenPreloader'});
  $('container').appendChild(hiddenPreloader);
}
addOnloadEvent(initApplication);

function getClearLink(link)
{
  var chars = link.readAttribute('chars').split('|');
  var indizes = link.readAttribute('indizes').split('|');
  var url = '';
  for (var i=0;i<indizes.length;i++) url += chars[indizes[i]];
  return url;
}

function onClickMailLink(event)
{
  Event.stop(event);
  document.location = 'mailto:'+getClearLink(Event.element(event));
}

function addPictureCaption(image,wrapper)
{
  if (!image.readAttribute('title') || image.readAttribute('title') == '') return false;
  var p = new Element('p', {className: 'caption'}).update(image.readAttribute('title'));
  wrapper.appendChild(p);
}

function readAndCreateMap(mapId, options)
{
  if (!GBrowserIsCompatible()) return;
  if (typeof realtor_maps[mapId] != 'undefined') return;
  var mapElem = $(mapId);
  realtor_maps[mapId] = new GMap2(mapElem);
  var map = realtor_maps[mapId];
  realtor_markers[mapId] = new Array();
  resetMapCenter(mapId);
	if (typeof options == 'undefined') options = new Object();
	if (typeof options.enabled == 'undefined') options.enabled = false;
  if (options.controls == true) 
	{
    map.addControl( new MapMoveControls() );
	  map.addControl( new MapZoomControls() );
	  map.addControl( new MapTypeControls() );
  }
  if (options.enabled)
  {
    map.enableDoubleClickZoom();
    map.enableDragging();
    map.enableInfoWindow();
    map.enableScrollWheelZoom();
  }
  else
  {
    map.disableDoubleClickZoom();
    map.disableDragging();
    map.disableInfoWindow();
    map.disableScrollWheelZoom();
  }
	return map;
}
function resetMapCenter(mapId)
{
  var mapElem = $(mapId);
  var map = realtor_maps[mapId];
	var mapType = mapElem.readAttribute('mapType');
	var zoom = Number(mapElem.readAttribute('zoom'));
	map.setCenter( getMapCenter(mapId), zoom, eval(mapType) );
}

function getMapCenter(mapId)
{
  var mapElem = $(mapId);
  var lat = Number(mapElem.readAttribute('lat'));
	var lng = Number(mapElem.readAttribute('lng'));
	return new GLatLng( lat, lng );
}

function readAndCreateMapMarkers(mapName,objects)
{
  var marker;
  for (var i=0; i<realtor_markers[mapName].length;i++)
  {
    realtor_maps[mapName].removeOverlay( realtor_markers[mapName][i] );
    realtor_markers[mapName][i].remove();
  }
  realtor_markers[mapName] = new Array();
  for (var i=0; i<objects.length;i++)
  {
    marker = readAndCreateMapMarker(objects[i]);
    realtor_markers[mapName].push(marker);
    realtor_maps[mapName].addOverlay( marker );
  }
}

function readAndCreateMapMarker(obj)
{
  var point = new GLatLng( Number(obj.readAttribute('lat')), Number(obj.readAttribute('lng')) );
  var title = obj.readAttribute('title');
  var info = obj.readAttribute('info');
  var marker = createMapMarker(point,title);
  GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(info); });
  return marker;
}

// Creates a marker whose info window displays the letter corresponding
// to the given index.
function createMapMarker(point,title)
{
  // Create a base icon for all of our markers that specifies the
  // shadow, icon dimensions, etc.
  var icon = new GIcon(G_DEFAULT_ICON);
  icon.shadow = "/images/marker_shadow.png";
  icon.image = "/images/marker_point.png";
  icon.iconSize = new GSize(23, 31);
  icon.shadowSize = new GSize(37, 34);
  icon.iconAnchor = new GPoint(11, 31);
  icon.infoWindowAnchor = new GPoint(11, 2);
  var marker = new GMarker(point, { icon:icon, title:title, draggable: true });
  marker.disableDragging();
  return marker;
}

function showAllMapMarkers(mapName)
{
  realtor_maps[mapName].panTo(getMapMarkersBounds(mapName).getCenter());
}

function getMapMarkersBounds(mapName)
{
  var bounds = new GLatLngBounds();
  var markers = realtor_markers[mapName];
  for (var i=0; i<markers.length;i++) bounds.extend(markers[i].getLatLng());
  return bounds;
}

function limitToRange(index,range)
{
  return index >= range ? index - range : (index < 0 ? range + index : index);
}

function getEventElementIndex(event)
{
  var view = Event.findElement(event,'A');
  return view.readAttribute('index');
}

function onMouseMove(event)
{
  realtor_mouseX = event.pointerX();
  realtor_mouseY = event.pointerY();
}

function initGalleryControls(obj, clickListener, imageWidth )
{
  obj = typeof obj == 'string' ? $(obj) : obj;
  imageWidth = typeof imageWidth == 'undefined' ? 103 : Number(imageWidth);
  var galleryControlWrapper = new Element('div', { id:'galleryControls' } );
  var galleryControlPrev = new Element('a',{'class':'prev',href:'#prevImage',index:'prev'}).update('Voriges Bild');
  var galleryControlNext = new Element('a',{'class':'next',href:'#nextImage',index:'next'}).update('Nächstes Bild');
  galleryControlWrapper.setStyle({left:(imageWidth-93)+'px', opacity: 0 });
  galleryControlPrev.observe('click',clickListener);
  galleryControlNext.observe('click',clickListener);
  galleryControlWrapper.appendChild( galleryControlPrev );
  galleryControlWrapper.appendChild( galleryControlNext );
  obj.appendChild(galleryControlWrapper);
  obj.observe('mouseover',showGalleryControls);
  obj.observe('mouseout',hideGalleryControls);
}

function showGalleryControls(event)
{
  if (typeof realtor_galleryControlsEffects != 'undefined') realtor_galleryControlsEffects.cancel();
  realtor_galleryControlsEffects = new Effect.Opacity( 'galleryControls', { to: 1, duration: 0.2 });
}

function hideGalleryControls(event)
{
  if (typeof realtor_galleryControlsEffects != 'undefined') realtor_galleryControlsEffects.cancel();
  realtor_galleryControlsEffects = new Effect.Opacity( 'galleryControls', { to: 0, duration: 0.4 });
}

function getMapControlsContainer(map)
{
  var container = map.getContainer().down('div.mapControls');
  if (!container)
  {
    container = new Element("div", { 'class': 'mapControls' } );
    map.getContainer().appendChild(container);
  }
  return container;
}

function MapMoveControls() {}
if (typeof GControl == 'function') MapMoveControls.prototype = new GControl();
MapMoveControls.prototype.initialize = function(map)
{
  var container = getMapControlsContainer(map);
  var mapContainer = map.getContainer();
  var mapName = mapContainer.identify();
  var mapPanV = mapContainer.getHeight() * 2 / 3;
  var mapPanH = mapContainer.getWidth() / 3;
  //
  var moveDiv = new Element("div", { 'class': 'moveControl' });
  container.appendChild(moveDiv);
  //
  var moveLeftDiv = new Element("div", { 'class': 'moveLeft', title: 'Nach links' }).update('Nach links');
  GEvent.addDomListener(moveLeftDiv, "click", function() { map.panBy({width: mapPanH,height:0}); });
  moveDiv.appendChild(moveLeftDiv);
  //
  var moveRightDiv = new Element("div", { 'class': 'moveRight', title: 'Nach rechts' }).update('Nach rechts');
  GEvent.addDomListener(moveRightDiv, "click", function() { map.panBy({width:-mapPanH,height:0}); });
  moveDiv.appendChild(moveRightDiv);
  //
  var moveUpDiv = new Element("div", { 'class': 'moveUp', title: 'Nach oben' }).update('Nach oben');
  GEvent.addDomListener(moveUpDiv, "click", function() { map.panBy({width:0,height:mapPanV}); });
  moveDiv.appendChild(moveUpDiv);
  //
  var moveDownDiv = new Element("div", { 'class': 'moveDown', title: 'Nach unten' }).update('Nach unten');
  GEvent.addDomListener(moveDownDiv, "click", function() { map.panBy({width:0,height:-mapPanV}); });
  moveDiv.appendChild(moveDownDiv);
  //
  var moveResetDiv = new Element("div", { 'class': 'moveReset', title: 'Zurücksetzen' }).update('Zurücksetzen');
  GEvent.addDomListener(moveResetDiv, "click", function() { showAllMapMarkers(mapName); });
  moveDiv.appendChild(moveResetDiv);
  //
  return container;
}

function MapZoomControls() {}
if (typeof GControl == 'function') MapZoomControls.prototype = new GControl();
MapZoomControls.prototype.initialize = function(map)
{
  var container = getMapControlsContainer(map);
  //
  var zoomDiv = new Element("div", { 'class': 'zoomControl' });
  container.appendChild(zoomDiv);
  //
  var zoomInDiv = new Element("div", { 'class': 'zoomIn', title: 'Reinzoomen' }).update('Reinzoomen');
  GEvent.addDomListener(zoomInDiv, "click", function() { map.zoomIn(); });
  zoomDiv.appendChild(zoomInDiv);
  //
  var zoomOutDiv = new Element("div", { 'class': 'zoomOut', title: 'Rauszoomen' }).update('Rauszoomen');
  GEvent.addDomListener(zoomOutDiv, "click", function() { map.zoomOut(); });
  zoomDiv.appendChild(zoomOutDiv);
  //
  return container;
}

function MapTypeControls() {}
if (typeof GControl == 'function') MapTypeControls.prototype = new GControl();
MapTypeControls.prototype.initialize = function(map)
{
  var container = getMapControlsContainer(map);
  //
  var typeDiv = new Element("div", { 'class': 'typeControl' });
  container.appendChild(typeDiv);
  //
  var normalDiv = new Element("div", { 'class': 'typeNormal' + (map.getCurrentMapType() == G_NORMAL_MAP ? ' selected' : ''), title: G_NORMAL_MAP.getAlt() }).update(G_NORMAL_MAP.getName());
  GEvent.addDomListener(normalDiv, "click", function() { 
    map.setMapType(G_NORMAL_MAP);
    typeDiv.select('div').each(function(e) { e.removeClassName('selected'); } );
    typeDiv.down('.typeNormal').addClassName('selected');
  });
  typeDiv.appendChild(normalDiv);
  //
  var satelliteDiv = new Element("div", { 'class': 'typeSatellite' + (map.getCurrentMapType() == G_HYBRID_MAP ? ' selected' : ''), title: G_HYBRID_MAP.getAlt() }).update(G_HYBRID_MAP.getName());
  GEvent.addDomListener(satelliteDiv, "click", function() { 
    map.setMapType(G_HYBRID_MAP);
    typeDiv.select('div').each(function(e) { e.removeClassName('selected'); } );
    typeDiv.down('.typeSatellite').addClassName('selected');
  });
  typeDiv.appendChild(satelliteDiv);
  //
  var physicalDiv = new Element("div", { 'class': 'typePhysical' + (map.getCurrentMapType() == G_PHYSICAL_MAP ? ' selected' : ''), title: G_PHYSICAL_MAP.getAlt() }).update(G_PHYSICAL_MAP.getName());
  GEvent.addDomListener(physicalDiv, "click", function() { 
    map.setMapType(G_PHYSICAL_MAP);
    typeDiv.select('div').each(function(e) { e.removeClassName('selected'); } );
    typeDiv.down('.typePhysical').addClassName('selected');
  });
  typeDiv.appendChild(physicalDiv);
  //
  return container;
}

var realtor_disabledForms = new Array();
function disabledForm(objName)
{
  var status = realtor_disabledForms[objName] == true;
  realtor_disabledForms[objName] = true;
  return status;
}
function enableForm(objName)
{
  realtor_disabledForms[objName] = false;
}

function showLoadingForm(objName)
{
  $(objName+'_activity_indicator').setStyle({ display: 'inline', top: ($(objName).getHeight()/2 + 10) + 'px', left: '160px' })
  $(objName+'_activity_indicator').fade( { from: 0, to: 1, duration: 0.5 } );
  $(objName).down('form').setOpacity(.2);
  $(objName).down('.submit').onlick = 'return false;';
}

function hideLoadingForm(objName)
{
  //$(objName).down('form').setOpacity(1);
}