FunctionHandler.register(
  '*',
  function()
  { 
    try {
      var pageTracker = _gat._getTracker("UA-10082993-1");
      pageTracker._trackPageview();
    } catch(err) {}
    
    $button = $('<button type="button" class="close">close</button>');
    $button.click(function(){
      $(this).parent().fadeOut('fast');
    });
    $('div.help').hide().addClass('pop').append($button.clone(true));
    $('a.help').click(function() {
      $("#"+this.href.replace( /.*?#(.*)/g, "$1" )).fadeIn('fast').css({
        'top' : $(this).position().top-12, 
        'left' : $(this).position().left+40
        });
      return false;
    });

	$('form#fm-questions').submit(function(s) {
		s.preventDefault();
		$('textarea[id*=message]').val( $('textarea[id*=message]').val() + "\n\n" + $('select#Email[name=question]').find('option[value=' + $('select#Email[name=question]').val() + ']').text() );
		return false;
	});

  }
);

FunctionHandler.register(
  ['properties-edit', 'listings-edit'],
  function()
  {
    $(".fig-ctrl .replacement").hide();
  	$(".fig-ctrl a.replace").click(function(e){
  	  e.preventDefault();
  	  var $this = $(this);
  	  $($this.attr('href')).parent().slideDown('fast');
  	  $this.blur();
  	});
});

FunctionHandler.register(
  ['properties-add'],
  function()
  {
    var
    number, name,
    $form    = $('#fm-addproperty'),
    $button  = $form.find('button'),
    $number  = $('#PropertyStreetNumber').blur(checkForDuplicate),
    $name    = $("#PropertyStreetName").blur(checkForDuplicate),
    $message = $('<div id="message" class="error"><p></p></div>');
    
  	function checkForDuplicate()
  	{
  	  number = $number.val();
  	  name   = $name.val();
  	  if ( number != '' &&
  	       name != '' )
  	  {
  	    $.post(
  	      '/json/checkforduplicate/',
  	      {
  	        'json': '{ "Property": { "street_number": ' + number + 
  	                ', "street_name": "' + name + '" } }'
  	      },
  	      function(data){
  	        if ( data.success === false )
  	        {
  	          $message.find('p').text(data.message).end()
  	                  .insertBefore('#fm-addproperty>:first-child');
  	          $button.remove();
  	        }
  	        else
  	        {
  	          $message.remove();
  	          $button.appendTo($form.find('.fm-submit'));
  	        }
  	      },
  	      'json'
  	    );
  	  }
  	}
});

FunctionHandler.register(
  ['users-signup'],
  function()
  {
    var
    email,
    $email   = $('#UserEmail').blur(lookupCompany),
    $company = {
      fieldset:  $('#signup-company'),
      name:      $('#CompanyName'),
      industry:  $('#CompanyIndustry'),
      employees: $('#CompanyNumEmployees')
    },
    $message = $('<div id="message" class="notice"><p></p></div>');
    
  	function lookupCompany()
  	{
  	  email = $email.val();
  	  if ( email != '' )
  	  {
  	    $.get(
  	      '/json/lookupcompany/' + email,
  	      false,
  	      function(data){
  	        if ( data.success === true )
  	        {
  	          $company.name.val( data.result.Company.name );
  	          $company.industry.val( data.result.Company.industry );
  	          $company.employees.val( data.result.Company.num_employees );
  	          $message.find('p').text(data.message).end()
  	                  .insertBefore( $company.fieldset.find('ol') );
  	        }
  	      },
  	      'json'
  	    );
  	  }
  	}
  	
  	
  	var panel = $('<div id="panel"><div id="tools"></div><div class="content"></div><p class="fm-submit"></p></div>');
  	var target = panel.find('.content');
	  panel.hide().appendTo( $('body') );
		var temp = $('<div></div>');
  	temp.hide();
	
  	$('#agree a[rel=agreement],#agree input[type=checkbox]').click(function(c) {
  		c.preventDefault();
  		target.empty();
  		panel.find('h1').remove();
  		panel.show();

  		var $link = $(this).parent().find('a[rel=agreement]');
  		var href = $link.attr('href');
  		var checkbox = $(this).parent().find('input[type=checkbox]');
  		var agree = $('<button class="button">Agree</button>');
  		var cancel = $('<button class="button">Cancel</button>');

  		agree.click(function() {
  			if( ! checkbox.is(':checked') ) {
  				checkbox.attr('checked', 'checked');
  			}
  			panel.hide();
  		});
		
  		cancel.click(function() {
  			if( checkbox.is(':checked') ) {
  				checkbox.attr('checked', false);
  			}
        panel.hide();
  		});
		
  		panel.find('.fm-submit').empty().append(cancel).append(agree);
		
  		temp.load( href + ' #content-main', {},
  		 function(){
  			temp.find('#content-main h1').prependTo( panel );
  			temp.find('#content-main').children().appendTo( target );
  		});
  	});
});

FunctionHandler.register(
  ['listings-add', 'listings-edit'],
  function()
  {
    var
    $size   = $('#ListingSquareFootage'),
    $negotiable = $('#ListingNegotiable1'),
    $per_mo = $('#ListingMonthlyRent'),
    $per_sf = $('#ListingCostPerSquareFoot');
    
    $negotiable.change(function(){
      if ( $negotiable.attr('checked') == true )
      {
        $per_mo.val('')
               .attr('disabled','disabled');
        $per_sf.val('')
               .attr('disabled','disabled');
      }
      else
      {
        $per_mo.removeAttr('disabled');
        $per_sf.removeAttr('disabled');
      }
      $per_mo.toggleClass('disabled');
      $per_sf.toggleClass('disabled');
    });
    
    $size.change(updatePrices);
    $per_mo.change(updatePrices);
    $per_sf.change(updatePrices);
        
    function updatePrices(e)
    {
      if ( $negotiable.attr('checked') == true ){ return; }
      var
      $el    = $( e.target ),
      size   = parseFloat( $size.val().replace(/[\$,]/,''), 10 ).toFixed(2),
      per_mo = parseFloat( $per_mo.val().replace(/[\$,]/,''), 10 ).toFixed(2),
      per_sf = parseFloat( $per_sf.val().replace(/[\$,]/,''), 10 ).toFixed(2);
      
      if ( ! isNaN( size ) )
      {
        switch ( true )
        {
          // size was updated & per month needs updating
          case ( $el.attr('name') === $size.attr('name') &&
                 ! isNaN( per_sf ) ):
          // per square foot was updated
          case ( $el.attr('name') === $per_sf.attr('name') &&
                 ! isNaN( per_sf ) ):
          // per month was deleted, but per square foot remains
          case ( $el.attr('name') === $per_mo.attr('name') &&
                 isNaN( per_mo ) &&
                 ! isNaN( per_sf ) ):
            $per_sf.val( per_sf );
            $per_mo.val( parseFloat( per_sf * size / 12, 10 ).toFixed(2) );
            break;
          // size was updated & per square foot needs updating
          case ( $el.attr('name') === $size.attr('name') &&
                 ! isNaN( per_mo ) ):
          // per month was updated
          case ( $el.attr('name') === $per_mo.attr('name') &&
                 ! isNaN( per_mo ) ):
                    // per month was deleted, but per square foot remains
          case ( $el.attr('name') === $per_sf.attr('name') &&
                isNaN( per_sf ) &&
                ! isNaN( per_mo ) ):
            $per_mo.val( per_mo );
            $per_sf.val( parseFloat( per_mo * 12 / size, 10 ).toFixed(2) );
            break;
        }
      }
    }
    $('input.repeating').each(function(){
      var
      $file  = $(this),
      $tpl   = $file.parent().clone(),
      name   = $file.attr('name').replace( /\[\]/, '' ),
      max    = parseInt( $('input[name=\'' + name + '[max]\']').attr('value'), 10  ),
      $count = $('input[name=\'' + name + '[current]\']');
      $file.change(repeat);
      function repeat(){
        var count = parseInt( $count.attr('value'), 10  ) + 1;
        $count.attr( 'value', count );
        if ( count < max )
        {
          $tpl.clone()
              .change(repeat)
              .appendTo( $file.parent().parent() );
        }
      }
    });
    
    $('#ListingNotes').keypress(function(){
      var
      $this = $(this),
      text  = $this.val();
      if ( text.length > 250 )
      {
        alert('Please limit your notes to 250 characters.');
        $this.val(text.substring(0,250));
      }
    });
});

FunctionHandler.register(
  ['listings-view'],
  function()
  { 
  	if ( $.fn.lightBox instanceof Function )
  	{
      $('head').append('<link rel="stylesheet" src="/js/third-party/jquery.lightbox.js/css/jquery.lightbox-0.5.css">');
      $('#space-pics a').lightBox();
    }
    
    var $map = new EasyGoogleMap( $('#space-map'), {
      'controls': 'none'
    });
    $('#space-map').show();
  	var printLink = $(jQuery('<a href="#print" class="print" title="Print this listing">Print this listing</a>'));
  	$('#tools').find('ul').append( $(jQuery('<li />')).append(printLink) );
  	printLink.click(function(c) {
  		c.preventDefault();
  		window.print();
  	});
  }
);

FunctionHandler.register(
  ['search-index','home', 'listings-view'],
  function()
  {
    $("#chk-areas-all").change(function(){
  	  if (this.checked) {
  	    $("#search-areas .area input:checkbox:not(:disabled)").attr('checked', true).parent().addClass('selected');
  	    $('#search-map a[href^="#"]').addClass('selected');
  	  }
  	  else if (!this.checked) {
  	    $("#search-areas .area input:checkbox:not(:disabled)").attr('checked', false).parent().removeClass('selected');
  	    $('#search-map a[href^="#"]').removeClass('selected');
  	  }
  	});

  	$("#search-areas .area input:checkbox:not(:disabled)").change(function(){
  	  if (this.checked) {
  	    $(this).parent().addClass('selected');
  	    $('#search-map a[href="#'+this.id+'"]').addClass('selected');
  	  }
  	  if (!this.checked) {
  	    $("#chk-areas-all").attr('checked', false);
  	    $(this).parent().removeClass('selected');
  	    $('#search-map a[href="#'+this.id+'"]').removeClass('selected');
  	  }
  	});
  	
  	$("#search-areas .area label:has(input:checkbox:not(:disabled))").hover(
  	  function(){
  	    $('#search-map a[href="#'+$(this).find('input').attr('id')+'"]').addClass('over');
  	  },
  	  function(){
   	    $('#search-map a[href="#'+$(this).find('input').attr('id')+'"]').removeClass('over');
   	  }
   	);

  	$("#search-map a").hover(
  	  function(){
  	    $($(this).attr('href')).parent().addClass('over');
  	  },
  	  function(){
   	    $($(this).attr('href')).parent().removeClass('over');
   	  }
   	);

    $("#search-areas input:checkbox:not(:disabled)").focus(function(){
  	  $(this).parent().addClass("over");
  	});
  	$("#search-areas input:checkbox:not(:disabled)").blur(function(){
  	  $(this).parent().removeClass("over");
  	});

  	$("#search-map a").click(function(){
  	  $(this).toggleClass("selected").blur();

  	  var id = $(this).attr('href');
  	  if ($(id).attr('checked')) {
  	    $($(this).attr('href')).attr('checked', false).parent().removeClass('selected');
  	  } else {
  	    $($(this).attr('href')).attr('checked', true).parent().addClass('selected');
  	  }
  	  return false;
  	});
  	
  	$("#dynamap").hide();
    $("a#seemap").click(function(){
      $("#dynamap").fadeIn('fast');
      return false;
    });
    $("#dynamap #mapclose").click(function(){
      $("#dynamap").fadeOut('fast');
    });

    $("#fm-search-rev .area ul").hide().parents("fieldset.area").addClass("closed"); 
    $("#search-areas .area input:checkbox:checked:not(:disabled)").parent().addClass('selected')
                                                                  .parents("fieldset.area").removeClass("closed")
                                                                  .children("ul").show();

  	$("#fm-search-rev .area legend span").click(function() {
  	  $(this).parents("fieldset").children("ul").slideToggle("fast");
  	  $(this).parents("fieldset").toggleClass("closed");
  	});

  	$("#sort-by button, .perpage button").css({ position: 'absolute', left: '-999em' });

  	$("#search-results th input:checkbox:not(:disabled)").change(function(){
  	  $(this).parents('tr').toggleClass('selected');
  	});

  	var $toggle = $('<button type="button" class="expcol">less</button>');
  	$('#search-results tbody tr td:last-child').each(function(){
  	  var 
  	  $t = $toggle.clone();
  	  $t.click(function(){
  	    var 
  	    $this = $(this),
  	    text  = $this.text();
        $this.text( (text=='more'?'less':'more') )
             .blur()
             .parents("tr").toggleClass("open")
             .children(".desc").children(".desc-meta").slideToggle("fast");
      });
      $(this).append($t)
             .parents("tr").toggleClass("open");
  	});

    var
    $expand  = $('<p id="expcol-all"><button type="button" id="toggle-all" class="open">collapse all</button></p>'),
    $results = $("#search-results").toggleClass('expanded');
    $expand.find('#toggle-all').click(function(){
  	  $results.toggleClass('expanded');
  	  if ( $results.hasClass('expanded') )
  	  {
    	  $("#search-results tr").addClass("open");
        $("#search-results .desc-meta").slideDown("fast");
        $(this).blur().addClass("open").text("collapse all");  	  
  	  }
  	  else
  	  {
    	  $("#search-results tr").removeClass("open");
        $("#search-results .desc-meta").slideUp("fast");
        $(this).blur().removeClass("open").text("expand all");  	  
  	  }
  	});
  	$('#spaces').prepend($expand);

  	// set the select box to auto submit
    $("#perpage-btm").change(function(){
      $('#spaces').submit();
    });

    $("#results-sort").change(function(){
      $('#spaces').submit();
    });

    $('#listings-view #fm-search-rev').hide();
  	$("#listings-view #revise-search").click(function(event){
  	  $('#listings-view #fm-search-rev').slideToggle("fast");
  	  event.preventDefault();
    });

  }
);


FunctionHandler.register(
  ['search-index'],
  function()
  {
  	if ( $.fn.lightBox instanceof Function )
  	{
      $('head').append('<link rel="stylesheet" src="/js/third-party/jquery.lightbox.js/css/jquery.lightbox-0.5.css">');
      $('.desc-meta a:has(img)').lightBox();
    }
    
  	$.get( '/search/tools', false, function(data){
  	  $(data).insertAfter('#mkt-snapshot');
  	  $('#contact_agents, #send_to_colleague, #save_filing_cabinet').click(function(event){
        var selected = [];
    	  $('#search-results').find('th input:checkbox:not(:disabled)').each(function(){
    	    if (this.checked) {
            selected.push($(this).attr('id').replace(/sel-sp/i, ''));
          }
    	  });
        if ( selected.length > 0 )
        {
      	  var listings = ( selected instanceof Array ? selected.join(',') : selected );
      	  $(this).attr('href', $(this).attr('action').replace('#','') + 'Listings:' + listings);
        }
        else
        {
          event.preventDefault();
          alert('Please select a listing first.');
        }
    	});
  	});

    var $interval = 20000;

    var $snapshot = setInterval( function(){
      update_snapshot('#mkt-snapshot-next');
    }, $interval);

    // reset the timer of next or previous are pressed
    $("#mkt-snapshot-next, #mkt-snapshot-prev").live('click', function(event){
      clearInterval($snapshot);
      update_snapshot($(this));
      $snapshot = setInterval( function(){
        update_snapshot('#mkt-snapshot-next');
      }, $interval);
      event.preventDefault();
    });
    
    // This function toggles an element's text between two values
    jQuery.fn.toggleText = function(text1, text2) {
    	jQuery(this).text( ( jQuery(this).text() == text1 ? text2 : text1 ) );
    };

    function update_snapshot( id ) {
      $.get( $(id).attr('href'), function(html) {
        $('#mkt-snapshot').html( $(html).find('#mkt-snapshot').html() );
      });
    }

    $(document).ajaxStart(function () {
      $('#mkt-snapshot-nav').hide();
      $('#mkt-snapshot .ajaxLoading').fadeIn();
    }).ajaxStop(function (){
      $('#mkt-snapshot .ajaxLoading').hide();
      $('#mkt-snapshot-nav').fadeIn();
    });
        
  }
);

FunctionHandler.register(
  ['listings-share'],
  function()
  {
    var $to = $("#to-name");
    if( $to.val() != '' )
    {
      fillName();
    }
    $to.keyup(fillName);
    function fillName()
    {
      $("#dear").text($to.val());
    }
  }
);

FunctionHandler.register(
  ['listingsfolders-index'],
  function()
  {
    $("#mngfolders .rename p").hide();
		$("#mngfolders .rename label").click(function(){
		  $(this).siblings('.rename p').slideDown('fast');
		});
  }
);

FunctionHandler.register(
  ['admin-fields'],
  function()
  {
    // setup the links
    var $a = $('<strong class="move"><a class="up">Move Up</a><a class="down">Move Down</a></strong>');
    $('.category li strong.move').remove();
    $('.category li:not(:last-child)').prepend($a);
    $('.category li:first-child').find('a.up').remove();
    $('.category li:last-child').prev().find('a.down').remove();
    $('.category li a').click(move);
    // manage the swapping
    function move()
    {
      var
      $this = $(this),
      direction = $this.attr('class'),
      id = $this.parent().siblings('label').attr('for').replace(/.*?-(\d+)/,'$1');
      $.get(
	      '/json/movefield/' + id + '/' + direction,
	      null,
	      function(data){
	        if ( data.success !== false )
	        {
	          var $subject = $this.parents('li'), $other, $control;
	          if ( direction == 'up' )
	          {
	            $other = $subject.prev();
	            $other.find('strong.move').replaceWith($subject.find('strong.move')).prependTo($subject);
	            $subject.insertBefore($other);
	          }
	          else if ( direction == 'down' )
	          {
	            $other = $subject.next();
	            $other.find('strong.move').replaceWith($subject.find('strong.move')).prependTo($subject);
              $subject.insertAfter($other);
	          }
	          $('.category li a').click(move);
	        }
	      },
	      'json'
	    );
    }
  }
);
