FunctionHandler.register(
  ['*'],
  function()
  {
    try {
      var pageTracker = _gat._getTracker("UA-10764669-1");
      pageTracker._trackPageview();
    } catch(err) {}
    
    // external links
    $('a[rel*=external], .twitter .entry-content a').click(function(){
      window.open($(this).attr('href'));
      return false;
    });
  	
 
    // add the language bar into the document
    var $bar = $('<div dir="ltr" id="language-bar"><p>View the site in <a  href="http://charterforcompassion.org">English</a>, <a dir="ltr" lang="es" hreflang="es" href="http://es.charterforcompassion.org">Español</a>, <a dir="rtl" lang="ar" hreflang="ar" href="http://ar.charterforcompassion.org">ظوكبٕا</a> or <a dir="rtl" lang="he" hreflang="he" href="http://he.charterforcompassion.org">עבךית</a>. If you change your mind, you can change below. ' +
                 '<a class="closer">close</a></p></div>');
    var page = window.location.pathname.toString();
    $bar.find('a.closer').click(function(){$bar.slideUp('fast');})
                         .end()
        .find('a[href]').each(function(){
                           var $a = $(this);
                           $a.attr( 'href', $a.attr('href') + page );
                         })
    $('body').prepend($bar);

  	
  	// add this config
  	window.addthis_config = {
      data_use_flash:   false,
      ui_508_compliant: true
    };
  	window.addthis_pub = 'thecharter';
      	  	
  	// additional styles
  	$('.three-up .module:nth-child(3n)').removeClass('left').addClass('right');
  	$('.three-up .module:nth-child(3n+1)').addClass('first');
  }
);

FunctionHandler.register(
  ['home'],
  function()
  {var
$modal = $('<div class="jqmWindow" id="jq"><div class="modalcontent"></div>' +
           '<div id="loading">Loading</div>' +
           '<a href="#" class="close jqmClose">close</a></div>'),
jqm_showing = false,
$loading    = $modal.find('#loading'),
$m_content  = $modal.find('.modalcontent'),
$body       = $('body'),
width       = false,
height      = false;

$modal.css({
         width:      '200px',
         height:     '200px',
         marginLeft: '-100px',
         marginTop:  '-100px' 
       });

if ( ! ( window.triggerOverlay instanceof Function ) )
{
  window.triggerOverlay = function( content, callback ){
    $m_content.html(content);
    $modal.jqmShow();
    if ( callback instanceof Function )
    {callback();}
  };
}

function resizeAndShow(hash){
  hash.w.fadeIn('slow');
  $modal.animate( {
           width:      width+'px',
           height:     height+'px',
           marginLeft: '-'+(width/2)+'px',
           marginTop:  '-'+(height/2)+'px'
         },
         500,
         'linear',
         function(){$loading.fadeOut('fast');});
  jqm_showing = true;
}

function sizeHTML( $el )
{
  var $dummy  = $el.clone()
                   .addClass('testing')
                   .appendTo($('body'));
  width  = $dummy.outerWidth();
  height = $dummy.outerHeight();
  $dummy.remove();
}

    var
    $form;
    
    // add the modal
    $body.append($modal.jqm({
            modal:   false,
            overlay: 80,
            onShow:  function(hash){
              hash.o.hide()
                    .prependTo($body)
                    .fadeIn('fast',function(){
                      width = height = 0;
                      sizeHTML( $($m_content.html()) );
                      resizeAndShow(hash);
                    });
            },
            onHide: function(hash){
              hash.w.fadeOut('slow',function(){
                $m_content.html('');
                $modal.css({
                        width:      '200px',
                        height:     '200px',
                        marginLeft: '-100px',
                        marginTop:  '-100px' 
                      });
                hash.o.fadeOut('slow',function(){
                  hash.o.remove();
                  $loading.show();
                  jqm_showing = false;
                });
              });
            }
          })
         .hide());
		
		$('a[href=/share/the-charter/]').click(function(){$.get('/inc/affirm',{ajax:true},function(data){
        triggerOverlay( data, function(){
          $form = $m_content.find('form').submit(affirm);
        });
      }, 'html');
      return false;
    });
		
		function affirm()
		{
      $.post( '/inc/affirm', $form.serialize() + '&ajax=true', function( data ){
		    if ( data.indexOf('<form') != -1 )
	      {
	        var $data = $(data);
	        $m_content.html(data);
          sizeHTML( $data );
          $modal.animate( {
                   width:      width+'px',
                   height:     height+'px',
                   marginLeft: '-'+(width/2)+'px',
                   marginTop:  '-'+(height/2)+'px'
                 },
                 500,
                 'linear');
	        if ( $data.find('#shr-recipients').length > 0 )
          {
            $form = $m_content.find('form').submit(share);
          }
          else if ( $data.find('#aff-givenname').length > 0 )
          {
            $form = $m_content.find('form').submit(affirm);
          }
	      }
	    });
	    return false;
		}
		
		function share()
		{
		  $.post( '/inc/affirm', $form.serialize() + '&ajax=true', function( data ){
		    var $data = $(data);
	      $m_content.html(data);
        sizeHTML( $data );
        $modal.animate( {
                 width:      width+'px',
                 height:     height+'px',
                 marginLeft: '-'+(width/2)+'px',
                 marginTop:  '-'+(height/2)+'px'
               },
               500,
               'linear');
	      if ( $data.find('#shr-recipients').length > 0 )
        {
          $form = $m_content.find('form').submit(share);
        }
	    });
	    return false;
		}
		
		// Affirmation slider
		$.get('/inc/affirmer','ajax=true',function(data){
		  var
		  $container = $('#affirmers .blockhead'),
		  $scroller  = $('<div id="scroll-container"></div>').html( data ).height($container.height()),
		  $next      = $('<a class="next" title="Next affirmer" href="#">Next affirmer</a>'),
		  $prev      = $('<a class="prev" title="Previous affirmer" href="#">Previous affirmer</a>'),
		  $blocks    = $scroller.find('p'),
		  width      = 0,
		  count      = 0,
		  showing    = 0,
		  side       = $('html').hasClass('rtl') ? 'right' : 'left';
		  
		  $container.addClass('gallery')
		            .html('')
		            .append($scroller)
		            .append($prev)
		            .append($next);
		  
		  count = $blocks.length;
		  $blocks.width($container.width());
      width = $blocks.outerWidth();
		  $scroller.width( count * width );
		  // since we're counting from 0...
		  count--;
		  
		  $next.click(move);
		  $prev.click(move);
		  evaluateArrows();
		  
		  function move()
		  {
		    var
		    direction = $(this).hasClass('next') ? 'next' : 'prev',
		    properties = {};
		    if ( ( direction == 'prev' &&
		           showing > 0 ) ||
		         ( direction == 'next' &&
		           showing < count ) )
		    {
  		    showing = ( direction == 'next' ) ? showing + 1 : showing - 1;
  		    properties[side] = '-' + ( width * showing ) + 'px';
  	      $scroller.animate(properties,500,'swing');
  	      evaluateArrows();
		    }
		    return false;
		  }
		  
		  function evaluateArrows()
		  {
		    $next.removeClass('disabled');
		    $prev.removeClass('disabled');
		    if ( showing == 0 )
		    {$prev.addClass('disabled');}
		    else if ( showing == count )
		    {$next.addClass('disabled');}
		  }
		});
		
	});

FunctionHandler.register(
  ['share-the-charter'],
  function()
  {
	  // old AddThis
	  var $addthis_tools =  $('<div class="addthis_toolbox"><ul class="sharing-tools custom_images">' +
                        	  '<li class="mail"><a class="addthis_button_email">Email</a></li>' +
                        	  '<li class="facebook"><a class="addthis_button_facebook">Facebook</a></li>' +
                        	  '<li class="digg"><a class="addthis_button_digg">Digg</a></li>' +
                          	'<li class="twitter"><a class="addthis_button_twitter">Twitter</a></li>' +
                          	'<li class="stumble-upon"><a class="addthis_button_stumbleupon">Stumble Upon</a></li>' +
                          	'<li class="delicious"><a class="addthis_button_delicious">Delicious</a></li>' +
                          	'<li class="more"><a class="addthis_button_expanded">More</a></li>' +
                          	'</ul></div>');
    $('p#share-this-site').replaceWith( $addthis_tools );
	  
	  // addthis stuff
  	$('.video').append($('<p><a class="share addthis_button_expanded">Share this</a></p>'));
	});

FunctionHandler.register(
  ['learn'],
  function()
  {
    //$('.timeline').toTimeline();
    $('.timeline a[rel*=media]').click(function(){
      window.open($(this).attr('href'));
      return false;
    });
  }
);

FunctionHandler.register(
  ['share-find-an-event'],
  function()
  {
    var $form = $('.filters form');
    $form.addClass('scripted');
    $form.find(':input').change(function(){$form.submit();});
  }
);

FunctionHandler.register(
  ['share-hold-an-event', 'user-profile-edit'],
  function()
  {
    // regions stuff
    var
    regions = null,
    $country = $('#loc-country').change(function(){getRegions();}),
    $region = $('#loc-region');
    if ( $country.val() != '' )
    {getRegions();}
    function getRegions()
    {
      $.get(
        '/js/regions.json',
        {
          country: $country.val()
        },
        function(data){
          regions = data;
          $region.jsonSuggest(regions);
        },
        'json'
      );
    }
  }
);

FunctionHandler.register(
  ['share-hold-an-event'],
  function()
  {
    // private note stuff
    var $private = $('#private-note').slideUp('fast');
    $("a[href=#private-note]").click(function(){
      $private.toggle('fast');
      return false;
    });
    
    // event end date
    var
    $start_ol = $('#start > ol'),
    $end      = $('#end').parent(),
    $end_time = false;
    $('<li class="checkbox"><label for="has-end-time">' +
      '<input type="checkbox" id="has-end-time" /> '+
      "This event has an end time</label></li>").appendTo($start_ol);
    $end_time = $('#has-end-time');
    if ( $end.find('select').val() == '' )
    {$end.slideUp('fast');}
    else
    {$end_time.attr('checked','checked');}
    $end_time.click(function(){$end_time.change();});
    $end_time.change(function(){
      if ( $end_time.attr('checked') == true )
      {$end.slideDown('fast');}
      else
      {
        $end.slideUp('fast');
        $end.find('select option:first-child').attr('selected','selected');
      }
    });
    
    // event cost free
    var
    $fieldset = $('#event-cost'),
    $cost     = $fieldset.find('#cost'),
    $check    = false;
    $('<li class="checkbox"><label for="cost-is-free">' +
      '<input type="checkbox" id="cost-is-free" /> '+
      "This is a free event</label></li>").appendTo($fieldset.find('ol'));
    $check = $fieldset.find('#cost-is-free');
    $check.change(function(){$cost.val($cost.val()=='free'?'':'free');});
    $cost.keydown(check);
    function check(){
      if ( $cost.val() == 'free' ){$check.attr('checked','checked');}
      else
      {$check.removeAttr('checked');}
    };
    check();    
  }
);

FunctionHandler.register(
  ['share-hold-an-event-preview'],
  function()
  {
    // back
    var $form = $('#fm-event');
    var p = $('<p>or return to</p>');
    var link = $('<a href="#back">edit your event information</a>');

    link.click(function(){
      $form.find('input[name=form]').val('redo');
      $form.submit();
      return false;
    });

    p.append(link);
    $form.append(p);
  }
);

FunctionHandler.register(
  ['share-online'],
  function()
  {
    // AddThis
    window.addthis_share = {
      url:   'http://charterforcompassion.org',
      title: 'Charter for Compassion'
    };
    $('<li class="more"><a class="addthis_button_expanded">More</a></li>').appendTo('ul.sharing-tools');
    
    // subscribe
    var
    $field = $('form.email-signup input[name=email]'),
    message = $field.val();
    $field.focus(function(){
             if ( $field.val() === message )
             {$field.val('');}
           })
           .blur(function(){
             if ( $field.val() === '' )
             {$field.val(message);}
           });
  }
);

FunctionHandler.register(
  ['user-profile-edit'],
  function(){
    // organizational note stuff
    var $org = $('#org-note').slideUp('fast');
    $('a[href=#org-note]').click(function(){
      $org.toggle('fast');
      return false;
    });
    // org field
    var $field = $('li#org-field');
    if ( $field.find('input[type=text]').val() == '' )
    {$field.slideUp('fast');}
    $('input[name=as_organization]').change(function(){
      if ( $(this).attr('checked') )
      {$field.slideDown('fast');}
      else
      {
        $field.slideUp('fast')
              .find('input[type=text]').val('');
      }
    });
  });

FunctionHandler.register(
  ['act'],
  function()
  {var
$modal = $('<div class="jqmWindow" id="jq"><div class="modalcontent"></div>' +
           '<div id="loading">Loading</div>' +
           '<a href="#" class="close jqmClose">close</a></div>'),
jqm_showing = false,
$loading    = $modal.find('#loading'),
$m_content  = $modal.find('.modalcontent'),
$body       = $('body'),
width       = false,
height      = false;

$modal.css({
         width:      '200px',
         height:     '200px',
         marginLeft: '-100px',
         marginTop:  '-100px' 
       });

if ( ! ( window.triggerOverlay instanceof Function ) )
{
  window.triggerOverlay = function( content, callback ){
    $m_content.html(content);
    $modal.jqmShow();
    if ( callback instanceof Function )
    {callback();}
  };
}

function resizeAndShow(hash){
  hash.w.fadeIn('slow');
  $modal.animate( {
           width:      width+'px',
           height:     height+'px',
           marginLeft: '-'+(width/2)+'px',
           marginTop:  '-'+(height/2)+'px'
         },
         500,
         'linear',
         function(){$loading.fadeOut('fast');});
  jqm_showing = true;
}

function sizeHTML( $el )
{
  var $dummy  = $el.clone()
                   .addClass('testing')
                   .appendTo($('body'));
  width  = $dummy.outerWidth();
  height = $dummy.outerHeight();
  $dummy.remove();
}

    
    // add the modal
    $body.append($modal.jqm({
            modal:   false,
            overlay: 80,
            onShow:  function(hash){
              hash.o.hide()
                    .prependTo($body)
                    .fadeIn('fast',function(){
                      width = height = false;
                      if ( $m_content.find('#help-topic').length > 0 )
                      {
                        assignHelpFunctions();
                        sizeHTML( $m_content.find('#help-topic') );
                        resizeAndShow(hash);
                      }
                      else if ( $m_content.find('img').length > 0 )
                      {
                        var $img  = $m_content.find('img');
                        width  = $img.attr('width');
                        height = $img.attr('height');
                        resizeAndShow(hash);
                      }
                      else if ( $m_content.find('object, embed').length > 0 )
                      {
                        switch ( true )
                        {
                          case ( $m_content.find('object[width], embed[width]').length > 0 ):
                            width  = $m_content.find('object[width], embed[width]').eq(0).attr('width');
                            height = $m_content.find('object[height], embed[height]').eq(0).attr('height');
                            break;
                          case ( $m_content.find('embed[src]').length > 0 ):
                            src = $m_content.find('embed').attr('src');
                            break;
                          case ( $m_content.find('object[data]').length > 0 ):
                            src = $m_content.find('object').attr('data');
                            break;
                          case ( $m_content.find('object param[name=movie]').length > 0 ):
                            src = $m_content.find('object param[name=movie]').attr('value');
                            break;
                          default:
                            src = false;
                            break;
                        }
                        if ( width && height )
                        {resizeAndShow(hash);}
                        else if ( src )
                        {
                          $.get( 'http://brianreavis.com/lightbox2.02/php/ajax.swfsize.php',
                                 { swfurl: src },
                                 function(data){
                                   if ( data.indexOf( '|' != -1 ) )
                                   {
                           					 data   = data.split('|');
                           					 width  = parseInt( data[0], 10 );
                           					 height = parseInt( data[1], 10 );
                           					 resizeAndShow(hash);
                           				 }
                                 }
                               );
                        }
                      }
                      else
                      {
                        // console.log('no go');
                      }
                    });
            },
            onHide: function(hash){
              hash.w.fadeOut('slow',function(){
                $m_content.html('');
                $modal.css({
                        width:      '200px',
                        height:     '200px',
                        marginLeft: '-100px',
                        marginTop:  '-100px' 
                      });
                hash.o.fadeOut('slow',function(){
                  hash.o.remove();
                  $loading.show();
                  jqm_showing = false;
                });
              });
            }
          })
         .hide());

    window.showHelp = function( topic_id )
    {
      if ( typeof( topic_id ) == 'undefined' )
      {
        topic_id = '';
      }
      $.get( '/api/help/' + topic_id, false, function(data){
        if ( data.success )
        {triggerOverlay(data.html);}
      }, 'json');
    };

    function assignHelpFunctions(){
      $m_content.find('#ignore').change(function(){
        $.get( '/api/help/dismiss/' + $(this).val(), false, function(data){
          if ( data.success )
          {$modal.jqmHide();}
        }, 'json' );
      });
      $m_content.find('ul.paginator a').click(function(){
        $.get( '/api/help/' + $(this).attr('href').replace(/#help-/,''), false, function(data){
          if ( data.success )
          {
            $m_content.html(data.html);
            assignHelpFunctions();
            sizeHTML( $m_content.find('#help-topic') );
            $modal.animate( {
                     width:      width+'px',
                     height:     height+'px',
                     marginLeft: '-'+(width/2)+'px',
                     marginTop:  '-'+(height/2)+'px'
                   },
                   500,
                   'linear');
          }
        }, 'json');
        return false;
      });
    }
  }
);

FunctionHandler.register(
  ['affirmers'],
  function()
  {
    var infiniteScroll = function() {
   		// options
   		var updateType = 'scroll'; // can be 'scroll' to append as the user reaches the bottom of the page or 'auto' to append every available page
   		var showLoading = !$.browser.msie; // whether or not to show a loading gif while the next group loads; IE seems to perfom better with this set to false
   
   		var nextHref = false;
   		var list = $('#list-affirmers');
   		if( ! list.size() ) { return false; }
   		var paginators = $('ul.paginator');
   		paginators.hide();
   		nextHref = paginators.eq(0).find('.next a').attr('href');
   		var ajaxHolder = $('<div />');
   		var loader = $('<li class="loading"><img src="/img/css/affirmers-loading.gif" alt="Loading more Affirmers" /></li>');
   		var footer = $('#footer');
   		var update = function() {
   			if( ! nextHref ) { return false; }
   			var href = nextHref;
   			nextHref = false;
   			if( showLoading ) {list.append(loader);}
   			$.get(
   				href,
   				function(data) {
   					data = $(data);
   					if( showLoading ) {loader.remove();}
   					data.find('#list-affirmers li').appendTo(list);
   					nextHref = data.find('ul.paginator').eq(0).find('.next a[href]').attr('href');
   					data.empty();
   					if( updateType == 'auto' ) {update();}
   					footer.addClass('foobar').removeClass('foobar'); // This nasty hack brought to you by the letters I and E. Forces a redraw of the footer to fix a display issue where the Fetzer logo stayed in the position it was in before the list was lengthened.
   				},
   				'html'
   			);
   		};
   		if( updateType == 'auto' ) {update();} else {
   			$(window).scroll(function(s) {
   				if( ( list.offset().top + list.height() - Math.floor( $(window).height() / 2 ) ) > $(document).scrollTop() ) {update();}
   			});
   		}
   	};
   	infiniteScroll();
  });
