var realtor_homePrepared = false;
var realtor_homeInitiated = false;
var currentProperty = 0;
var slidingProperties = true;

function prepareHome()
{
  if (realtor_homePrepared) return;
  realtor_homePrepared = true;
  var c = getProperties();
  for (var i=0; i<c.length;i++) c[i].setOpacity(0);
}

addOnDomLoadEvent(prepareHome);

function initHome()
{
  if (realtor_homeInitiated) return;
  realtor_homeInitiated = true;
  initServices();
  initProperties();
}
addOnloadEvent(initHome);

function initServices()
{
  var services = $('content').select('.services li.teaser');
  for (var i=0; i<services.length;i++) services[i].observe('click',onClickService);
}

function onClickService(event)
{
  document.location = Event.findElement(event,'LI').down('a').href;
}

function initProperties()
{
  var c = getProperties();
  var tA, t, d, f;
  for (var i=0; i<c.length;i++)
  {
    c[i].identify();
    c[i].writeAttribute('index',i);
    f = c[i].down('.fullView');
    f.observe('click', onPropertyClick );
    f.observe('mouseover',onPropertyMouseOver);
    f.observe('mouseout',onPropertyMouseOut);
    tA = c[i].select('.thumbnails a');
    for (var k=0; k<tA.length;k++)
    {
      tA[k].observe('click',onClickThumb);
    }
    d = new Element('a',{'class':'prev',href:'#prevProperty'}).update('Voriges Objekt');
    d.setOpacity(0);
    f.appendChild( d );
    d = new Element('a',{'class':'next',href:'#nextProperty'}).update('Nächstes Objekt');
    d.setOpacity(0);
    f.appendChild( d );
  }
  arrangeProperties();
  window.setTimeout( 'fadeInProperties();', 200);
  preloadFullViews();
}

function getProperties()
{
  return $('properties').down('ul.propertyList').childElements();
}

/* Arrangement of the Properties */
function arrangeProperties(p,direction)
{
  if (typeof p != 'number')
  {
    p = currentProperty;
    direction = 1;
  }
  direction = direction > 0 ? -1 : 1;
  var d = direction > 0 ? 1.5 : 2.5;
  var k = p - 1 + (direction > 0 ? 0 : -1);
  var pos = 0;
  var pWidth = 920;
  var pO;
  var effects = new Array();
  var c = getProperties();
  for (var i=0; i<c.length;i++)
  {
    pos = pWidth * (i - d);
    k = k >= c.length ? k = k-c.length : (k < 0 ? c.length+k : k);
    pO = c[k];
    pO.setStyle( {left: pos + 'px'} );
    pO.down('.fullView').setStyle( {left: '0px'} );
    pO.down('a.next').setStyle({ width: '58px', backgroundPosition: '0 0'});
    pO.down('a.prev').setStyle({ width: '58px', backgroundPosition: '-106px -100px'});
    if (p == k)
    {
      pO.setStyle({zIndex:1});
    }
    else
    {
      pO.setStyle({zIndex:2});
      hideExtras(pO);
    }
    k++;
  }
}

function onClickNext(event)
{
  Event.stop(event);
  changeProperty(currentProperty+1);
}
function onClickPrevious(event)
{
  Event.stop(event);
  changeProperty(currentProperty-1);
}

function onPropertyClick(event)
{
  var p = Number(Event.findElement(event,'LI').readAttribute('index'));
  if (p == currentProperty) return;
  Event.stop(event);
  var properties = getProperties();
  if (p == limitToRange( currentProperty + 1, properties.length) ) p = currentProperty+1;
  else p = currentProperty-1;
  changeProperty( limitToRange( p, properties.length) );
}

function onPropertyMouseOver(event)
{
  propertyHoverAnimation(event, 'over');
}

function onPropertyMouseOut(event)
{
  propertyHoverAnimation(event, 'out');
}

var realtor_propertyHoverEffects = new Array();
function propertyHoverAnimation(event_or_index, eventType)
{
  if (slidingProperties) return false;
  var c = getProperties();
  var btn = typeof event_or_index == 'number' ? c[event_or_index] : Event.findElement(event_or_index,'LI');
  var p = btn.readAttribute('index');
  if (typeof realtor_propertyHoverEffects[p] != 'undefined') realtor_propertyHoverEffects[p].cancel();
  var effects = new Array();
  var prevProperty = limitToRange( currentProperty-1, c.length);
  var nextProperty = limitToRange( currentProperty+1, c.length);
  var x = 0;
  var selector = 'next';
  var width = eventType == 'over' ? 106 : 58;
  var bgPos = '';
  if (p == currentProperty) return;
  else if (p == prevProperty)
  {
    selector = 'prev'
    x = eventType == 'over' ? 40 : 0;
    bgPos = eventType == 'over' ? '-59px 0' : '-106px -100px';
  }
  else if (p == nextProperty)
  {
    x = eventType == 'over' ? -40 : 0;
    bgPos = eventType == 'over' ? '0 -100px' : '0 0';
  }
  btn.down('a.'+selector).setStyle({ width: width+'px', backgroundPosition: bgPos });
  effects.push( new Effect.Move( btn.down('.fullView'), { mode: 'absolute', x: x, sync: true } ) );
  effects.push( new Effect.Opacity( btn.down('.fullView .view'), { to: (eventType == 'out' ? 0.4 : 1), sync: true } ) );
  realtor_propertyHoverEffects[p] = new Effect.Parallel( effects, { duration: 0.4, transition: Effect.Transitions.Cubic.easeOut } );
}

initialDelay = 0;
function fadeInProperties()
{
  var c = getProperties();
  var effects = new Array();
  var f;
  var nextProperty = limitToRange( currentProperty+1, c.length );
  var prevProperty = limitToRange( currentProperty-1, c.length );
  for (var i=0; i<c.length; i++)
  {
    f = c[i].down('.fullView');
    f.setStyle({ left: '100px' });
    if (i != currentProperty) f.down('.view').setOpacity(0.4);
    effects.push( new Effect.Opacity( c[i], { to: 1, sync: true } ) );
    effects.push( new Effect.Move( f, { x: -100, y: 0, mode: 'relative', sync: true } ) );
    if (c.length <= 3) break;
    if (i == nextProperty) effects.push( new Effect.Opacity( c[i].down('a.next'), { to: 1, sync: true } ) );
    if (i == prevProperty) effects.push( new Effect.Opacity( c[i].down('a.prev'), { to: 1, sync: true } ) );
  }
  new Effect.Parallel( effects, { duration: 1.5, transition: Effect.Transitions.Sine.easeOut, afterFinish: fadeInPropertiesFinished} );
}

function fadeInPropertiesFinished(event)
{
  slidingProperties = false;
}

function changeProperty(p)
{
  if (slidingProperties) return false;
  
  var c = getProperties();
  p = limitToRange(p, c.length);
  if (p == currentProperty) return true;
  
  slidingProperties = true;
  
  var i;
  realtor_propertyHoverEffects.each( function(i) { if (i) i.cancel(); } );
  
  var effects1 = new Array();
  var effects2 = new Array();
  var effects3 = new Array();
  var effects4 = new Array();
  
  var n = '';
  var d = (p > currentProperty && (currentProperty != 0 || p == 1)) || (p == 0 && currentProperty > 1) ? -920 : 920;
  
  var farProperty = limitToRange( p+2*d/Math.abs(d), c.length );
  var nextProperty = limitToRange( p+1, c.length );
  var prevProperty = limitToRange( p-1, c.length );
  
  arrangeProperties(currentProperty, d);
  
  var cPO = c[currentProperty];
  var cPO_info = cPO.down('.info');
  var cPO_thumbnails = cPO.down('.thumbnails');
  var cPO_img = cPO.down('.fullView .view');
  
  cPO_info.setStyle({zIndex: 1});
  
  effects3.push( new Effect.Opacity( cPO_img, { to: 0.4, sync: true } ));
  effects3.push( new Effect.Opacity( cPO_thumbnails, { to: 0, sync: true } ));
  
  var pO = c[p];
  var pO_fullView = pO.down('.fullView');
  var pO_img = pO.down('.fullView .view');
  var pO_info = pO.down('.info');
  var pO_thumbnails = pO.down('.thumbnails');
  
  var pO_infos = pO_info.select('p');
  pO_infos.push( pO_info.down('h1') );
  pO_infos.push( pO_info.down('h2') );
  for (i=0; i<pO_infos.length;i++)
  {
    if (typeof pO_infos[i] == 'undefined') continue;
    pO_infos[i].setOpacity(0);
    effects3.push( new Effect.Opacity( pO_infos[i], { to: 1, sync: true } ));
  }
  
  var s = d/3.8;
  
  pO_fullView.setStyle({ left: -d+'px' });
  pO.setStyle({ left: '-460px' });
  pO_info.setOpacity(0);
  pO_info.setStyle({ zIndex: 2 });
  pO_info.appear( { duration: 0.2 } );
  pO_thumbnails.setOpacity(0);
  pO_thumbnails.appear( { delay: 0.3, duration: 0.6 } );
  effects3.push( new Effect.Opacity( pO_img, { to: 1, sync: true } ));
  
  var offset = 0;
  
  for (i=0; i<c.length;i++)
  {
    n = c[i].down('.fullView');
    effects1.push( new Effect.Move( n, { x: d, y: 0, mode: 'relative', sync: true } ));
    if (i == farProperty || i == p) 
    {
      effects3.push( new Effect.Opacity( c[i].down('a.next'), { to: 0, sync: true } ) );
      effects3.push( new Effect.Opacity( c[i].down('a.prev'), { to: 0, sync: true } ) );
    }
    if (i == prevProperty) effects4.push( new Effect.Opacity( c[i].down('a.prev'), { to: 1, sync: true } ) );
    if (i == nextProperty) effects4.push( new Effect.Opacity( c[i].down('a.next'), { to: 1, sync: true } ) );
  }
  
  realtor_propertyMoved = p;
  new Effect.Parallel( effects1, { duration: 0.8, afterFinish: propertyMoved });
  new Effect.Parallel( effects2, { delay: 0.5, duration: 0.3 });
  new Effect.Parallel( effects3, { duration: 0.4 });
  new Effect.Parallel( effects4, { delay: 0.4, duration: 0.4 });
}
realtor_propertyMoved = 0;

function propertyMoved()
{
  changeFullView(0,true);
  var c = getProperties();
  hideExtras(c[currentProperty]);
  arrangeProperties(realtor_propertyMoved);
  currentProperty = realtor_propertyMoved;
  slidingProperties = false;
  var view = c[currentProperty];
  view.down('a.next').setStyle({ width: '0px'});
  view.down('a.prev').setStyle({ width: '0px'});
  if (realtor_mouseX < view.cumulativeOffset()[0] && realtor_mouseY > view.cumulativeOffset()[1] && realtor_mouseY < view.cumulativeOffset()[1] + 365)
  {
    propertyHoverAnimation(limitToRange(currentProperty-1,c.length),'over');
    return;
  }
  if (realtor_mouseX > view.cumulativeOffset()[0] + 920 && realtor_mouseY > view.cumulativeOffset()[1] && realtor_mouseY < view.cumulativeOffset()[1] + 365)
  {
    propertyHoverAnimation(limitToRange(currentProperty+1,c.length),'over');
  }
}

function hideExtras(obj)
{
  obj.down('div.info').setStyle({display:'none'});
  obj.down('ul.thumbnails').setStyle({display:'none'});
}

var currentThumb = 0;

function onClickThumb(event)
{
  Event.stop(event);
  if (slidingProperties) return;
  var c = getProperties();
  var tA = c[currentProperty].select('.thumbnails li');
  var clickedThumb = Event.findElement(event,'LI');
  var t = 0;
  for (var i=0; i<tA.length; i++)
  {
    if (tA[i] == clickedThumb) { t = i; break; }
  }
  changeFullView(t);
}

function changeFullView(t, override)
{
  if (slidingProperties && override != true) return;
  var c = getProperties();
  var tA = c[currentProperty].select('.thumbnails li');
  if (t >= tA.length) t = 0;
  for (var i=0; i<tA.length; i++)
  {
    if (tA[i].className == 'selected')
    {
      currentThumb = i;
      break;
    }
  }
  if (t == currentThumb) return;
  var newSrc, tO;
  //var isMap = false;
  //var mapObj;
  for (var i=0; i<tA.length; i++)
  {
    tA[i].className = '';
    if (i == t)
    {
      tA[i].className = 'selected';
      tO = tA[i].down('img');
      /*if (tO.className == 'map')
      {
        isMap = true;
        mapObj = tO;
        continue;
      }*/
      newSrc = tO.src.gsub( /\/thumb\//,'/full/');
    }
  }
  var fullView = c[currentProperty].down('.fullView');
  var oldObj = fullView.down('.view');
  var oldObjId = oldObj.identify();
  //var oldImg = oldObj.down('.picture');
  var newObj;
  var effects = new Array();
  /*if (isMap)
  {
    newObj = new Element( 'div', { 'class': 'view', id: 'map_full' } );
    fullView.appendChild( newObj );
    createMap( mapFull, 'map_full', mapObj.readAttribute('lat'), mapObj.readAttribute('lng'), mapObj.readAttribute('maptype'), mapObj.readAttribute('zoom'), 'default' );
  }
  else
  {*/
    var newImg = new Element( 'img', { src: newSrc, className: 'picture' } );
    newObj = new Element( 'a', { href: oldObj.href, 'class': 'view' } );
    newObj.appendChild(newImg);
    var oldObjSold = oldObj.down('.sold');
    if (oldObjSold)
    {
      var soldImg = new Element( 'img', { src: oldObjSold.src, className: 'sold' } );
      newObj.appendChild( soldImg );
    }
    fullView.appendChild( newObj );
    newObj.setOpacity(0);
    effects.push( new Effect.Opacity( newObj, { to: oldObj.getStyle('opacity'), sync: true } ));
  //}
  effects.push( new Effect.Opacity( oldObj, { to: 0, sync: true } ));
  currentThumb = t;
  new Effect.Parallel( effects, { duration: 0.4 });
  window.setTimeout("fullViewChanged('"+oldObjId+"');", 450 );
}

function fullViewChanged(oldObjId)
{
  $(oldObjId).remove();
  preloadFullViews();
}

function preloadFullViews()
{
  var c = getProperties();
  var tA = c[currentProperty].select('.thumbnails li');
  var img;
  for (var i=0; i<tA.length; i++)
  {
    tO = tA[i].down('img');
    img = new Element('img',{src: tO.src.gsub( /\/thumb\//,'/full/') });
    $('hiddenPreloader').appendChild(img);
  }
}