$.fn.placeholder = function(){
  var supportPlaceholder,
    $inputs = $(this),
    fakeholder;

  supportsPlaceholder = function(){
    var i = document.createElement('input');
    return 'placeholder' in i;
  };

  fakeholder = function($input){
    var placeholderVal = $input.attr("placeholder");

    $input.bind({
      "focus": function(){
        if ($input.val() == placeholderVal) 
        $input.val("");
      },

      "blur": function() {
        if ($input.val() == "") 
        $input.val(placeholderVal);
      }
    });

    $input.val(placeholderVal);
  };

  if (!supportsPlaceholder()){
    $inputs.each(function(){
      fakeholder($(this));
    });
  }
};

var BSTR = {
  "common": function() {
    var find_container = $( "div.find-an-apartment" );
    
    $('.datepicker_____________').datepicker({
      beforeShow: function(picker){
        setTimeout(function(){
          $('.ui-datepicker').css({"z-index":20});
        },200);
      }
    });
    $('input[type=text]').placeholder();
    
    $( "body.interior li#book-an-apartment a" ).bind( "click", function(e) {
      find_container.slideToggle();
      e.preventDefault();
    });
  },
  
  "home": function() {
    // Hero swapper
    var $hero = $( "div#hero" ),
      $hero_slides_container = $( "ul", $hero ),
      $hero_slides = $( "li", $hero_slides_container );
    
    for( i = 2; i < 14; i++ ) {
      var $li = $( '<li><img src="images/heroes/hero-' + i + '.jpg" alt="" /></li>' );
      
      $li.hide().appendTo( $hero_slides_container );
    }
    
    setInterval( function() {
      var $current_slide = $( "li:visible:first", $hero ),
        $next_slide = $current_slide.next();
        
        if ( !$next_slide.length ) {
          $next_slide = $( "li:first", $hero );
        }
        
        $current_slide.fadeOut( 1500 );
        $next_slide.fadeIn( 1500 );
    }, 7000 );
    
    // Infinitely scrolling carousel
    var $carousel = $( "div#carousel" ),
      $next = $( "div.controls a.next", $carousel ),
      $prev = $( "div.controls a.previous", $carousel );
    
    $next.hover(
      function() {
        $( this ).animate({
          left: "+=10px"
        });
      },
      function() {
        $( this ).animate({
          left: "-=10px"
        });
      }
    );
    
    $prev.hover(
      function() {
        $( this ).animate({
          left: "-=10px"
        });
      },
      function() {
        $( this ).animate({
          left: "+=10px"
        });
      }
    );
    
    UTIL.carousel( $carousel );
  },

  "search": function() {
    var init, embiggenMap, collapseMap,
        $mapContainer = $('.map-container'),
        $expandMapLink = $mapContainer.children('.view-larger-map'),
        $map = $mapContainer.children('.map'),
        $searchResults = $('#search-results');

    init = function() {
      UTIL.tabNav();
      UTIL.fixedPos();
    };
    
    embiggenMap = function(){
      $(window).scrollTop(300);
      $(window).unbind("scroll");
      $searchResults.animate({"margin-top":240});
      $mapContainer.addClass('expanded')
                   .css({"position":"absolute",
                         "left":0,
                         "top":214});
      $map.animate({"width":940});
      $expandMapLink.text("Hide larger map");
    };

    collapseMap = function(){
      $mapContainer.removeClass("expanded")
                   .css({"left":720});
      $map.css({"width":220});
      $searchResults.animate({"margin-top":0});
      $expandMapLink.text("Show larger map");
      UTIL.fixedPos(); 
    };

    $('.map .marker').toggle(function(){
      $(this).siblings('div').show();
    },function(){
      $(this).siblings('div').hide();
    });

    $('.view-larger-map').toggle(function(e){
      embiggenMap();
      e.preventDefault();
    },function(e){
      collapseMap();
      e.preventDefault();
    });

    $('.tab').click(function() {
      collapseMap();
    });
    init();
  }
};

var UTIL = {
  carousel: function(scope, options) {
    o = $.extend({}, options, {
      pages: 'ul.page',
      prev: '.previous',
      next: '.next',
      speed: 1000,
      perPage: 5
    });

    var carousel = this,
        $scope = $(scope),
        $pages = $(o.pages, scope),
        $prev = $(o.prev, scope),
        $next = $(o.next, scope);
        $current = $pages.eq(0);

    $current.siblings().css('left', '9999px');
    $current.addClass('current');

    function advance(direction, next) {
      var delta = direction*100;
      next.css('left', delta + '%');
      $current.add(next).animate({
        left: '-='+delta+'%'
      }, 'slow');
      $current.removeClass('current');
      $current = next;
      $current.addClass('current');
    };

    $next.bind('click', function() {
      if(!$(this).hasClass('disabled')) {
        var next = $current.next();
        if(next.length === 0) {
          next = $pages.eq(0);
        }
        advance(1, next);
      }
      return false;
    });

    $prev.bind('click', function() {
      if(!$(this).hasClass('disabled')) {
        var prev = $current.prev();
        if(prev.length === 0) {
          prev = $pages.eq(-1);
        }
        advance(-1, prev);
      }
      return false;
    });

    if($pages.length <= 1) {
      $prev.add($next).addClass('disabled');
    }
  },

  fixedPos: function() {
    var $mapContainer = $('.map-container'),
        initMapOffsetTop = $mapContainer.offset().top,
        initMapOffsetLeft = $mapContainer.offset().left,
        containerHeight = $('#main').height();

    $(window).scroll(function(){
      var scrollHeight = $(this).scrollTop(),
          mapBottomOffset = $mapContainer.offset().top + 380;

      if (scrollHeight > initMapOffsetTop) {
        if (mapBottomOffset >= containerHeight && (containerHeight - scrollHeight < 280)) {
          $mapContainer.css({
            position: "static",
            "margin-top": containerHeight - 660
          });
        } else {
          $mapContainer.css({
            position: "fixed",
            "margin-top": 0,
            top: 10,
            left: initMapOffsetLeft
          });
        }
      } else {
        $mapContainer.css({
          position: "absolute",
          top: 214,
          left: 720
        });
      }
    });
  },

  tabNav: function() {
    var $tabs = $('#search-results .tabs a'),
        $resultsLists = $('#search-results .results'),
        $propertyRates = $('#property-rates', $resultsLists),
        $areaRates = $('#area-rates', $resultsLists),
        tabToggle;

    tabToggle = function() {
      var tabId = $('li.active').attr('id');
          containerId = tabId.replace("-tab",""); 
      $('.rates-list').hide();
      $('#'+containerId).show();
      UTIL.fixedPos();   // make sure to reset scroll dimensions for new tab
    };

    $tabs.click(function(e) {
      var $li = $(this).parents('li'),
          $body = $('body');
      
      if ($body.hasClass('search-dates')) {
        $body.removeClass('search-dates')
             .addClass('search-areas');
      } else {
        $body.removeClass('search-areas')
             .addClass('search-dates');
      }

      if (!$li.hasClass('active')){
        $li.siblings('.active').removeClass('active');
        $li.addClass('active');
      }
      tabToggle();
      e.preventDefault();
    });
  },

  exec: function( page_id ) {
    var ns = BSTR;
    
    if ( page_id !== "" && ns[page_id] && typeof( ns[page_id] ) == "function" ) {
      ns[page_id]();
    }
  },
  
  init: function() {
    UTIL.exec( "common" );
    UTIL.exec( document.body.id );
  }
};

$().ready( UTIL.init );

