/**
 * jQuery.ScrollTo - Easy element scrolling using jQuery.
 * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 5/25/2009
 * @author Ariel Flesler
 * @version 1.4.2
 *
 * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
 */
;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);

/*
 * jQuery UI Components for Charity Blossom
 * 
 *      jquery.ui.autocomplete.js
 */

/*
 * Add nonprofit Auto Complete Functionality to search boxes
 */

jQuery.page = jQuery({}); // for adding page based events

jQuery.page.bind('auth-login', function () {
    // fired when a user logs in via ajax
    // add the auth true to each signup/sign in element
    if ($('#wiki')) {
        // reattach wikiedit functionality
        $('.wikiedit').unbind('click').addClass('wiki-editor').wikiEdit();
    }
    $('.signinfirst').data('auth', true);
    
    // Updates the navbar, could do more
    $.ajax({
        url: '/ajax/account/authinfo/',
        success: function(data){
            $('#login-state').replaceWith(data.html);
        }
    });
});

$.wait = function( callback, seconds){
    return window.setTimeout( callback, seconds * 1000 );
}

jQuery.fn.gcustomvar = function (cmd) {
    // Google Analytics Custom tracking
    visitor_scope = 1;
    session_scope = 2;
    page_scope = 3;
    try {
        if (cmd === 'donation_amount_test') {
            key = cmd;
            slot = 3;
            value = $('#id_amount_test').val();
            scope = session_scope;
        }
        _gaq.push(['_setCustomVar', slot, key, value, scope]);
    } catch (err) {}
}

jQuery.fn.eventTrack = function () {
        return this.each(function () {
            var $this = $(this);
            $this.bind("click", function (evt) {
                var action_label = ($this.data('action') || $this.attr('rel') || $this.html())
                $(this).gtrack($("body").attr('id'), action_label, 'click');
            }); //bind
        }); //.each
    };

jQuery.fn.gtrack = function (category, src, action, value ) {
    if (_gaq) {
        try {
            console.log(category, action, src, value);
        } catch (err) {}
        if (value) {
            _gaq.push(['_trackEvent', category, action, src, value]);
        } else {
            _gaq.push(['_trackEvent', category, action, src]);
        }
    }
}

jQuery.fn.searchAutoComplete = function() {
    return this.each( function () {
        jQuery(this).autocomplete({
            source: '/ajax/search/',
            select: function(event, ui) {
                //follow link if href
                if (ui.item.href) {
                    window.location = ui.item.href;
                    return false;
                };
            }
        });
    });
};

jQuery.fn.dynamicFloater = function () {
    $this = $(this);
    if ($this.length > 0) {
        var top = $this.offset().top - parseFloat($this.css('marginTop').replace(/auto/,0));
        $(window).scroll(function (event) {
            var y = $(this).scrollTop();
        
            if (y >= top) {
                $this.addClass('fixed');
            } else {
                $this.removeClass('fixed');
            }
        });
    } //if
};

$(document).ready(function() {$("#id_q").searchAutoComplete();});

jQuery.fn.initMenu = function() {  
    return this.each(function(){
        var theMenu = $(this).get(0);
        $('.acitem', this).hide();
        $('li.expand > .acitem', this).show();
        $('li.expand > .acitem', this).prev().addClass('active');
        $('li a', this).click(
            function(e) {
                e.stopImmediatePropagation();
                var theElement = $(this).next();
                var parent = this.parentNode.parentNode;
                if($(parent).hasClass('noaccordion')) {
                    if(theElement[0] === undefined) {
                        window.location.href = this.href;
                    }
                    $(theElement).slideToggle('normal', function() {
                        if ($(this).is(':visible')) {
                            $(this).prev().addClass('active');
                        }
                        else {
                            $(this).prev().removeClass('active');
                        }    
                    });
                    return false;
                }
                else {
                    if(theElement.hasClass('acitem') && theElement.is(':visible')) {
                        if($(parent).hasClass('collapsible')) {
                            $('.acitem:visible', parent).first().slideUp('normal', 
                            function() {
                                $(this).prev().removeClass('active');
                            }
                        );
                        return false;  
                    }
                    return false;
                }
                if(theElement.hasClass('acitem') && !theElement.is(':visible')) {         
                    $('.acitem:visible', parent).first().slideUp('normal', function() {
                        $(this).prev().removeClass('active');
                    });
                    theElement.slideDown('normal', function() {
                        $(this).prev().addClass('active');
                    });
                    return false;
                }
            }
        }
    );
});
};


jQuery.fn.helpbubble = function (evt) {
    $this = $(this);
    $($this.data('helpbubble')).dialog({
            width:$this.data('width')||400, 
            height:$this.data('height')||250,
            open: function (evt, ui) {
                y = $(':focus', this).blur();
            },
            modal:true,
            title:$this.data('bubbletitle')||'Help',
            resizable:false,
            dialogClass:'cb-dialog-bg'});
}

jQuery.fn.signupSignin = function() {
    // setups up the signin/signup before post
    // use a button in q form with the ID
    // and an empty div that is the jquery ui dialog
    // <div id="signindialog"></div>
    
    function ajaxUrl() {
        return "/ajax/account/dialog/";
    };
    
    function uniformErrors(selector, errors, data) {
        for (name in errors) {
            if (name == "__all__") {
                node = $(selector).find('fieldset') || $(selector)
                node.prepend(
                    $("<div><ul><li></li></ul></div>").find('li').text(errors[name][0]).closest('div').attr('id', 'errorMsg').addClass('error')
                );
            } else {
                id = name;
                if ((data)&&(data.hasOwnProperty('prefix'))) {
                    id = data['prefix'] + '-' + name;
                }
                $('#div_id_'+id).addClass('error').prepend(
                    $('<p></p>').addClass('errorField').text(errors[name][0])
                );
            }
        }
    };
    
    function performAction(element) {
        if (element.data('ajaxaction') != undefined) {
            $.ajax({
              type: 'POST',
              url: element.data('ajaxaction'),
              data: element.serializeArray(),
              success: function (data) {
                      // remove all the errors
                      element.find(".errorField").remove();
                      element.find(".error").removeClass('error');
                      if (data['status'] == 'ok') {
                          if (data.stream_refresh) {
                              $.ajax({
                                  url: data.stream_refresh,
                                  success: function (stream_data) {
                                      $(stream_data.action).hide().prependTo(".activitystream").fadeIn();
                                  }
                              });
                          }
                          if (data.prepend) {
                              $(data.prepend).hide().prependTo(element.data('prepend')).fadeIn();
                          }
                          if (data.update) {
                              $(element.data('update')).html(data.update);
                          }
                          if (data.replace) {
                              element.html(data.replace);
                          }
                      } else {
                          uniformErrors(element, data['errors']);
                      }
                    }
            });
            
        } else if (element.attr('action') != undefined) {
            element.submit();
        } else if (element.attr('href') ){
            window.location=element.attr('href');
        } else {
            window.location.reload();
        }
    };
    
    function setupSigninAction(element, data) {
        // insert the data, setup the actions
        $('#signindialog').html(data);
        $("#signindialog .fb_button").click(function () {
            FB_login_ajax({success: function () {
                    $('#signindialog').dialog('close');
                    jQuery.page.trigger('auth-login');
                    performAction(element);
                }
            });
        });
        $("#signindialog form").uniform();
        $(".ajax-registration-switch").click( function (event) {
            event.preventDefault();
            $(".fb.login.fb-only-dialog").append("<p class=\"progressbar\">please wait...</p>");
            
            $.ajax({
              url: ajaxUrl()+"?"+$(this).attr('name'),
              success: function(data) {
                  setupSigninAction(element, data);
              }
            });
            
        });
        $("#signindialog form").submit(function (evt) {
            // preform the action
            $that = $(this);
            evt.preventDefault();
            foo = $that.serializeArray();
            $.ajax({
              type: 'POST',
              url: $that.attr('action'),
              data: foo,
              success: function (data) {
                      // remove all the errors
                      $("#signindialog #errorMsg").remove();
                      $(".ajax-register-form .errorField").remove();
                      $(".error").removeClass('error');
                      if (data['status'] == 'ok') {
                          $('#signindialog').dialog('close');
                          jQuery.page.trigger('auth-login');
                          performAction(element);
                      } else {
                          uniformErrors($that.parent(), data['errors'], data);
                      }
                    }
            });
        });
    };
    
    return this.each(function(){
        $(this).click(function (event) {
            $(this).gtrack('signinfirst', event.target.id, 'click');
            event.preventDefault();
            // fetch the signup form
            that = $(this)
            if (that.data('auth') && that.closest('form').length) {
              performAction(that.closest('form'));
            } else {
                $.ajax({
                  url: ajaxUrl(),
                  success: function(data){
                      // open the signindialog
                      if (that.closest('form').length) {
                          setupSigninAction(that.closest('form'), data);
                      } else {
                          setupSigninAction(that, data);
                      }
                     $('#signindialog').dialog({modal: true, 
                            width:550, 
                            height:400,
                            title:'Sign In',
                            dialogClass:'cb-dialog-bg'});
                  }
                });
            };
        });
    });
};

jQuery.fn.fb_signinNoDialog = function (args) {
    /*
    options: afterLogin
    */
    return this.each(function (index, obj) {
        // args passed in get attached to evt.data
        $(this).click(args, function (evt) {
            FB_login_ajax({
                success: function () {
                    // default page sign-in cleanup
                    jQuery.page.trigger('auth-login');
                    
                    // custom page sign-in actions
                    if (evt.data && evt.data.afterLogin) {
                        evt.data.afterLogin.call(obj);
                    }
                }}); //FB_login_ajax
                }); //.click
            }); // .each()
} //.fb_signinNoDialog


jQuery.fn.wikiEdit = function() {
    function setup_form(section ) {
      // click of the submit button
      $(section).find('input[type="button"]').click( function () {
          $(section).find('form').submit();
      });
      
      wikidialog = $(section).find('form').data('asdialog')
      
      if ( $(section).find('form').data('image') ) {
          remove =  $(section).find('form').data('remove')
          $($(section).find('form').data('image')).ajaxSubmitInput({
                url: $(section).find('form').data('ajaxaction'),
                beforeSubmit: function () {
                    $(wikidialog).append('<h2 class="progressbar">Please Wait</h>');
                },
                onComplete: function($input, iframeContent, $options) {
                    $input.closest('form')[0].reset();
                    if (!iframeContent) {
                        return;
                    }
                    var iframeJSON;
                    try {
                        iframeJSON = $.parseJSON(iframeContent);
                    } catch(err) {
                        iframeJSON = $.parseJSON($(iframeContent).text());
                    }
                    var upStatus = iframeJSON.status;

                    if (upStatus == 'ok') {
                        if (wikidialog) {
                            $(wikidialog).dialog('close');
                        }
                        $(section).html(iframeJSON.html);
                        if (iframeJSON.stream_refresh) {
                             $.ajax({
                                 url: iframeJSON.stream_refresh,
                                 success: function (stream_data) {
                                     $(stream_data.action).hide().prependTo(".activitystream").fadeIn();
                                 }
                             });
                         };
                    }
                    $(remove).remove();
                }
          }) 
      } else {
        $(section).find('form').submit( function () {
          $.ajax({
            type: 'POST',
            url: $(section).find('form').attr('action'),
            data: $(section).find('form :input').serializeArray(),
            success: function (data) {
                if (data.stream_refresh) {
                    $.ajax({
                        url: data.stream_refresh,
                        success: function (stream_data) {
                            $(stream_data.action).hide().prependTo(".activitystream").fadeIn();
                        }
                    });
                };
                $(section).html(data.html);
                setup_form(section);
            }
          });
          return false;
        });
      }
      // reset to original content
      $(section).find('input[type="reset"]').click( function () {
          $(section).html($(section).data('original_content'));
          $(section).removeData('original_content');
      });

      $(section).find("textarea").attr("rows", "2").keyup(function() {
          var rows = this.value.split('\n').length;
          if(rows > 2 && this.rows !== rows){
              this.rows=rows;
          }
      });
      
      
      if (wikidialog) {
          $(wikidialog).dialog({title:$(wikidialog).data('dialogtitle'), modal:true});
      }
    };
    
    return this.each(function(){
        // click of the edit button
        $(this).click(function (event) {
            event.preventDefault();
            $(this).gtrack('WikiEdit', event.target.id, 'click');
            // get the edit form
			if ($(this).data('open')) {
	            section = $(this).data('open');
			} else {
	            section = '#' + $(this).closest('div').attr('id')+ '-content';				
			}
			console.log('section name', section);
            $.ajax({
              url: $(this).attr('rel'),
              success: function(data){
                  // store original data
                  if (! $(section).data('original_content')) {
                      $(section).data('original_content', $(section).html());
                  };
                  $(section).html(data.html);
                  setup_form(section);
              }
            });

        });
    });
};

jQuery.fn.donorEdit = function() {
    function setup_form( section, action ) {
      // click of the submit button
      $(section).find('input[type="button"]').click( function () {
          $(section).find('form').submit();
      });
      
      $(section).find('form').submit( function () {
        $.ajax({
          type: 'POST',
          url: action,
          data: $(section).find('form :input').serializeArray(),
          success: function (data) {
              $(section).html(data.html);
              setup_form(section, action);
          }
        });
        return false;
      });
      
      // reset to original content
      $(section).find('input[type="reset"]').click( function () {
          $(section).html($(section).data('original_content'));
          $(section).removeData('original_content');
      });
      
      $(section).find('form.uniForm').uniform();
    };
    
    return this.each(function(){
        // click of the edit button
        $(this).click(function (event) {
            event.preventDefault();
            // get the edit form
            section = $(this).data('container');
            action = $(this).data('ajax')
            $.ajax({
              url: $(this).data('ajax'),
              success: function(data){
                  // store original data
                  if (! $(section).data('original_content')) {
                      $(section).data('original_content', $(section).html());
                  };
                  $(section).html(data.html);
                  setup_form(section, action);
              }
            });

        });
    });
};

function associateUserDonation() {
    // connect donation obj to newly logged-in user.
    element = $("#hookuplater");
    $.ajax({
          type: 'POST',
          url: element.data('ajaxaction'),
          data: element.serializeArray(),
          context:$("#mysteryblock"),
          success: function (data) {
              $(this).replaceWith(data.html);
          }
      });
}

function donateThankYouAfterLogin() {
    // $this gives the item origination click.
}


$(document).ready(function() {
    $( "#tabs" ).tabs();
    $('.menu').initMenu();
    $('#nonprofit_menu a').click( function (evt) {
        $t = $(this);
        evt.preventDefault();
        $.scrollTo($t.attr("href"), 500);
    });
    
    // $.wait( function() { $("#billboard").slideUp(); }, 10);
    
    $("#review_form textarea")
        .val('Spread the word about this charity')
        .css('color','#bbb')
        .click(function() {
            if($(this).val() === "Spread the word about this charity") {
                $(this).val('').css('color','#333');
            }
        });
    
    $("#tabs textarea").attr("rows", "2").keyup(function() {
          var rows = this.value.split('\n').length;
          if(this.rows !== rows){
              this.rows=rows;
          }
    });
    
        var ghost = $("#id_q").data('ghost') || "Get started by searching for a nonprofit"
		if (!($.trim($("#id_q").val()))) {
	        $("#id_q").val(ghost).css('color', '#ccc');
	        $("#id_q").focus(function() {
	            if($(this).val() === ghost) {
	                $(this).val("").css('color','#333');
	            }
	        });
	        $("#id_q").blur(function() {
	            if($(this).val() === '') {
	                $(this).val(ghost).css('color', '#ccc');
	            }
	        });
		}

    // setup anything that needs signup/in before post
    $('.signinfirst').signupSignin();
    
    // only search if on the wiki pages
    if ($('#wiki')) {
        $('.wiki-editor').wikiEdit();
        if (e = /\?wikiopen(#.*)/.exec(window.location)) {
            $(e[1] + '-open').click();
        }
        $('#actionbar a').eventTrack();
    };
    $('body').on("click",  ".helpbubble",  jQuery.fn.helpbubble)    
    $(".clicktrack").eventTrack(); 
    $("#fixer").dynamicFloater();
    $('.onesubmit').submit(function(evt){
        $('.oneclick', this).val("Please wait").attr('disabled','disabled');
    });
    
    try {
        //twitter tracking. for FB, see facebook snippet
        twttr.events.bind('tweet', function(event) {
            if (event) { 
                _gaq.push(['_trackSocial', 'twitter', 'tweet']); 
            }
        });
    } catch (err) {}
    
    $('#login-state .fb_button').fb_signinNoDialog();
    
    if ($("#donate_thankyou").length > 0) {
        jQuery.page.bind('auth-login', function() {
            // page-specific clean up once logged in
            associateUserDonation();
        });
        $('.fb_signinNoDialog').fb_signinNoDialog({afterLogin:donateThankYouAfterLogin});
    } // if "#donate_thankyou"
});

