FB_Stream=function(){};FB_Stream.stream_publish=function(json){var data_array=Drupal.parseJson(json),len=data_array.length;for(var i=0;i<len;i++){var data=data_array[i];data.method='stream.publish';FB.ui(data)}};

// This function called by facebook's javascript when it is loaded.
// http://developers.facebook.com/docs/reference/javascript/
window.fbAsyncInit = function() {

  if (Drupal.settings.fb) {
    FB.init(Drupal.settings.fb.fb_init_settings);
  }

  if (FB._apiKey) {
    // Check the login status.  If offline_access granted, this
    // is the only whay to know if user has logged out of facebook.
    FB.getLoginStatus(function(response) {
      FB_JS.initFinal(response);
    });
  }
  else {
    // No application.  Not safe to call FB.getLoginStatus().
    // We still want to initialize XFBML, third-party modules, etc.
    FB_JS.initFinal({'session' : null});
  }
};

FB_JS = function(){};

/**
 * Finish initializing, whether there is an application or not.
 */
FB_JS.initFinal = function(response) {
  var status = {
    'session' : response.authResponse, // deprecated
    'auth': response.authResponse,
    'response': response
  };
  jQuery.event.trigger('fb_init', status);  // Trigger event for third-party modules.

  FB_JS.authResponseChange(response); // This will act only if fbu changed.

  FB_JS.eventSubscribe();

  FB.XFBML.parse();
}

/**
 * Tell facebook to notify us of events we may need to act on.
 */
FB_JS.eventSubscribe = function() {
  // Use FB.Event to detect Connect login/logout.
  FB.Event.subscribe('auth.authResponseChange', FB_JS.authResponseChange);

  // Q: what the heck is "edge.create"? A: the like button was clicked.
  FB.Event.subscribe('edge.create', FB_JS.edgeCreate);

}

/**
 * Helper parses URL params.
 *
 * http://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html
 */
FB_JS.getUrlVars = function(href) {
  var vars = [], hash;
  var hashes = href.slice(href.indexOf('?') + 1).split('&');
  for(var i = 0; i < hashes.length; i++)
  {
    hash = hashes[i].split('=');
    vars[hash[0]] = hash[1];
    if (hash[0] != 'fbu')
      vars.push(hashes[i]); // i.e. "foo=bar"
  }
  return vars;
}

/**
 * Reload the current page, whether on canvas page or facebook connect.
 *
 * append fbsig, a hash of the session data, to avoid infinite reloads
 * in some cases.
 */
FB_JS.reload = function(destination) {
  // Determine url hash.
  var auth = FB.getAuthResponse();

  var fbhash;
  if (auth != null)
    fbhash = auth.signedRequest; // Use sig rather than compute a new hash.
  else
    fbhash = 0;

  // Avoid infinite reloads.  Still needed? It would be nice to do away with this code if not needed.
  ///@TODO - does not work on iframe because facebook does not pass url args to canvas frame when cookies not accepted.  http://forum.developers.facebook.net/viewtopic.php?id=77236
  var vars = FB_JS.getUrlVars(window.location.href);
  if (vars.fbhash == fbhash) {
    return; // Do not reload (again)
  }

  // Determine where to send user.
  if (typeof(destination) != 'undefined' && destination) {
    // Use destination passed in.
  }
  else if (typeof(Drupal.settings.fb.reload_url) != 'undefined') {
    destination = Drupal.settings.fb.reload_url;
  }
  else {
    destination = window.location.href;
  }

  // Split and parse destination
  var path;
  if (destination.indexOf('?') == -1) {
    vars = [];
    path = destination;
  }
  else {
    vars = FB_JS.getUrlVars(destination);
    path = destination.substr(0, destination.indexOf('?'));
  }

  // Add fbhash to params before reload.
  if (Drupal.settings.fb.reload_url_append_hash) {
    vars.push('fbhash=' + fbhash);
  }

  // Use window.top for iframe canvas pages.
  destination = vars.length ? (path + '?' + vars.join('&')) : path;

  if(Drupal.settings.fb.reload_url_fragment) {
    destination = destination + "#" + Drupal.settings.fb.reload_url_fragment;
  }

  // Feedback that entire page may be reloading.
  // @TODO improve the appearance of this, make it customizable.
  jQuery('body').prepend('<div id="fb_js_pb" class="progress"><div class="bar"><div class="filled"></div></div></div>');

  window.top.location = destination;
  //alert(destination);
};

// Facebook pseudo-event handlers.
FB_JS.authResponseChange = function(response) {
  //debugger;
  if (response.status == 'unknown') {
    // @TODO can we test if third-party cookies are disabled?
  }

  var status = {
    'changed': false,
    'fbu': null,
    'session': response.authResponse, // deprecated,  still needed???
    'auth': response.authResponse, // still needed???
    'response' : response
  };

  if (response.authResponse) {
    status.fbu = response.authResponse.userID;
    if (Drupal.settings.fb.fbu != status.fbu) {
      // A user has logged in.
      status.changed = true;
    }
  }
  else if (Drupal.settings.fb && Drupal.settings.fb.fbu) {
    // A user has logged out.
    status.changed = true;

    // Sometimes Facebook's invalid cookies are left around.  Let's try to clean up their crap.
    // Can get left behind when third-party cookies disabled.
    // @TODO: Still needed with new oauth??? Have cookies been renamed (fbsr_...)???
    FB_JS.deleteCookie('fbs_' + FB._apiKey, '/', '');
    FB_JS.deleteCookie('fbs_' + Drupal.settings.fb.apikey, '/', '');
  }

  if (status.changed) {
    // fbu has changed since server built the page.
    jQuery.event.trigger('fb_session_change', status);

    // Remember the fbu.
    Drupal.settings.fb.fbu = status.fbu;
  }

};

// edgeCreate is handler for Like button.
FB_JS.edgeCreate = function(href, widget) {
  var status = {'href': href};
  FB_JS.ajaxEvent('edge.create', status);
};

// JQuery pseudo-event handler.
FB_JS.sessionChangeHandler = function(context, status) {
  // Pass data to ajax event.
  var data = {
    'event_type': 'session_change'
  };

  if (status.session) {
    data.fbu = status.session.userID;
    // Suppress facebook-controlled session.
    data.fb_session_handoff = true;
  }

  FB_JS.ajaxEvent(data.event_type, data);
  // No need to call window.location.reload().  It will be called from ajaxEvent, if needed.
};


// Helper to pass events via AJAX.
// A list of javascript functions to be evaluated is returned.
FB_JS.ajaxEvent = function(event_type, request_data) {
  if (Drupal.settings.fb.ajax_event_url) {

    // Session data helpful in ajax callbacks.  See fb_settings.inc.
    // request_data.fb_js_session = JSON.stringify(FB.getSession()); // FB.getSession() FAILS! REMOVE or REPLACE.
    if (typeof(Drupal.settings.fb_page_type) != 'undefined') {
      request_data.fb_js_page_type = Drupal.settings.fb_page_type;
    }

    // FB._apikey might be an apikey or might be an appid!
    if (FB._apiKey == Drupal.settings.fb.fb_init_settings.appId ||
        FB._apiKey == Drupal.settings.fb.fb_init_settings.apiKey) {
      request_data.apikey = Drupal.settings.fb.fb_init_settings.apiKey; // deprecated
      request_data.appId = Drupal.settings.fb.fb_init_settings.appId;
    }

    // Other values to pass to ajax handler.
    if (Drupal.settings.fb.controls) {
      request_data.fb_controls = Drupal.settings.fb.controls;
    }

    jQuery.ajax({
      url: Drupal.settings.fb.ajax_event_url + '/' + event_type,
      data : request_data,
      type: 'POST',
      dataType: 'json',
      success: function(js_array, textStatus, XMLHttpRequest) {
        if (js_array.length > 0) {
          for (var i = 0; i < js_array.length; i++) {
            eval(js_array[i]);
          }
        }
        else {
          if (event_type == 'session_change') {
            // No instructions from ajax, reload entire page.
            FB_JS.reload();
          }
        }
      },
      error: function(jqXHR, textStatus, errorThrown) {
        // Unexpected error (i.e. ajax did not return json-encoded data).
        var headers = jqXHR.getAllResponseHeaders(); // debug info.
        var responseText = jqXHR.responseText; // debug info.
        debugger;
        // @TODO: handle error, but how?
      }
    });
  }
};

// Delete a cookie.
// Facebook's JS SDK attempts to delete, but I'm not convinced it always works.
FB_JS.deleteCookie = function( name, path, domain ) {
  document.cookie = name + "=" +
    ( ( path ) ? ";path=" + path : "") +
    ( ( domain ) ? ";domain=" + domain : "" ) +
    ";expires=Thu, 01-Jan-1970 00:00:01 GMT";
};

/**
 * Drupal behaviors hook.
 *
 * Called when page is loaded, or content added via javascript.
 */
Drupal.behaviors.fb = function(context) {
  // Respond to our jquery pseudo-events
  var events = jQuery(document).data('events');
  if (!events || !events.fb_session_change) {
    jQuery(document).bind('fb_session_change', FB_JS.sessionChangeHandler);
  }

  // Once upon a time, we initialized facebook's JS SDK here, but now that is done in fb_footer().

  if (typeof(FB) != 'undefined') {
    // Render any XFBML markup that may have been added by AJAX.
    $(context).each(function() {
      var elem = $(this).get(0);
      FB.XFBML.parse(elem);
    });
  }

  // Markup with class .fb_show should be visible if javascript is enabled.  .fb_hide should be hidden.
  jQuery('.fb_hide', context).hide();
  jQuery('.fb_show', context).show();

};
;
(function($){var buildRating=function($obj){var $widget=buildInterface($obj),$stars=$('.star',$widget),$cancel=$('.cancel',$widget),$summary=$('.fivestar-summary',$obj),feedbackTimerId=0,summaryText=$summary.html(),summaryHover=$obj.is('.fivestar-labels-hover'),currentValue=$("select",$obj).val(),cancelTitle=$('label',$obj).html(),voteTitle=cancelTitle!=Drupal.settings.fivestar.titleAverage?cancelTitle:Drupal.settings.fivestar.titleUser,voteChanged=false;if($obj.is('.fivestar-user-stars')){var starDisplay='user'}else if($obj.is('.fivestar-average-stars')){var starDisplay='average';currentValue=$("input[name=vote_average]",$obj).val()}else if($obj.is('.fivestar-combo-stars')){var starDisplay='combo'}else var starDisplay='none';if($obj.is('.fivestar-smart-stars'))var starDisplay='smart';if($summary.size()){var textDisplay=$summary.attr('class').replace(/.*?fivestar-summary-([^ ]+).*/,'$1').replace(/-/g,'_')}else var textDisplay='none';$stars.mouseover(function(){event.drain();event.fill(this)}).mouseout(function(){event.drain();event.reset()});$stars.children().focus(function(){event.drain();event.fill(this.parentNode)}).blur(function(){event.drain();event.reset()}).end();$cancel.mouseover(function(){event.drain();$(this).addClass('on')}).mouseout(function(){event.reset();$(this).removeClass('on')});$cancel.children().focus(function(){event.drain();$(this.parentNode).addClass('on')}).blur(function(){event.reset();$(this.parentNode).removeClass('on')}).end();$cancel.click(function(){currentValue=0;event.reset();voteChanged=false;if($("input.fivestar-path",$obj).size()&&$summary.is('.fivestar-feedback-enabled'))setFeedbackText(Drupal.settings.fivestar.feedbackDeletingVote);$("select",$obj).val(0);cancelTitle=starDisplay!='smart'?cancelTitle:Drupal.settings.fivestar.titleAverage;$('label',$obj).html(cancelTitle);if($obj.is('.fivestar-smart-text')){$obj.removeClass('fivestar-user-text').addClass('fivestar-average-text');$summary[0].className=$summary[0].className.replace(/-user/,'-average');textDisplay=$summary.attr('class').replace(/.*?fivestar-summary-([^ ]+).*/,'$1').replace(/-/g,'_')};if($obj.is('.fivestar-smart-stars'))$obj.removeClass('fivestar-user-stars').addClass('fivestar-average-stars');$("input.fivestar-path",$obj).each(function(){var token=$("input.fivestar-token",$obj).val();$.ajax({type:'GET',data:{token:token},dataType:'xml',url:this.value+'/'+0,success:voteHook})});return false});$stars.click(function(){currentValue=$('select option',$obj).get($stars.index(this)+$cancel.size()+1).value;$("select",$obj).val(currentValue);voteChanged=true;event.reset();if($("input.fivestar-path",$obj).size()&&$summary.is('.fivestar-feedback-enabled'))setFeedbackText(Drupal.settings.fivestar.feedbackSavingVote);if($obj.is('.fivestar-smart-text')){$obj.removeClass('fivestar-average-text').addClass('fivestar-user-text');$summary[0].className=$summary[0].className.replace(/-average/,'-user');textDisplay=$summary.attr('class').replace(/.*?fivestar-summary-([^ ]+).*/,'$1').replace(/-/g,'_')};if($obj.is('.fivestar-smart-stars'))$obj.removeClass('fivestar-average-stars').addClass('fivestar-user-stars');$("input.fivestar-path",$obj).each(function(){var token=$("input.fivestar-token",$obj).val();$.ajax({type:'GET',data:{token:token},dataType:'xml',url:this.value+'/'+currentValue,success:voteHook})});return false});var event={fill:function(el){var index=$stars.index(el)+1;$stars.children('a').css('width','100%').end().filter(':lt('+index+')').addClass('hover').end();if(summaryHover&&!feedbackTimerId){var summary=$("select option",$obj)[index+$cancel.size()].text,value=$("select option",$obj)[index+$cancel.size()].value;$summary.html(summary!=index+1?summary:'&nbsp;');$('label',$obj).html(voteTitle)}},drain:function(){$stars.filter('.on').removeClass('on').end().filter('.hover').removeClass('hover').end();if(summaryHover&&!feedbackTimerId){var cancelText=$("select option",$obj)[1].text;$summary.html(($cancel.size()&&cancelText!=0)?cancelText:'&nbsp');if(!voteChanged)$('label',$obj).html(cancelTitle)}},reset:function(){var starValue=currentValue/100*$stars.size(),percent=(starValue-Math.floor(starValue))*100;$stars.filter(':lt('+Math.floor(starValue)+')').addClass('on').end();if(percent>0)$stars.eq(Math.floor(starValue)).addClass('on').children('a').css('width',percent+"%").end().end();if(summaryHover&&!feedbackTimerId)$summary.html(summaryText?summaryText:'&nbsp;');if(voteChanged){$('label',$obj).html(voteTitle)}else $('label',$obj).html(cancelTitle)}},setFeedbackText=function(text){feedbackTimerId=1;$summary.html(text)},voteHook=function(data){var returnObj={result:{count:$("result > count",data).text(),average:$("result > average",data).text(),summary:{average:$("summary average",data).text(),average_count:$("summary average_count",data).text(),user:$("summary user",data).text(),user_count:$("summary user_count",data).text(),combo:$("summary combo",data).text(),count:$("summary count",data).text()}},vote:{id:$("vote id",data).text(),tag:$("vote tag",data).text(),type:$("vote type",data).text(),value:$("vote value",data).text()},display:{stars:starDisplay,text:textDisplay}};if(window.fivestarResult){fivestarResult(returnObj)}else fivestarDefaultResult(returnObj);summaryText=returnObj.result.summary[returnObj.display.text];if($(returnObj.result.summary.average).is('.fivestar-feedback-enabled')){if(returnObj.vote.value!=0){setFeedbackText(Drupal.settings.fivestar.feedbackVoteSaved)}else setFeedbackText(Drupal.settings.fivestar.feedbackVoteDeleted);feedbackTimerId=setTimeout(function(){clearTimeout(feedbackTimerId);feedbackTimerId=0;$summary.html(returnObj.result.summary[returnObj.display.text])},2e3)};if(returnObj.vote.value==0&&(starDisplay=='average'||starDisplay=='smart')){currentValue=returnObj.result.average;event.reset()}};event.reset();return $widget},buildInterface=function($widget){var $container=$('<div class="fivestar-widget clear-block"></div>'),$options=$("select option",$widget),size=$('option',$widget).size()-1,cancel=1;for(var i=1,option;option=$options[i];i++){if(option.value=="0"){cancel=0;$div=$('<div class="cancel"><a href="#0" title="'+option.text+'">'+option.text+'</a></div>')}else{var zebra=(i+cancel-1)%2==0?'even':'odd',count=i+cancel-1,first=count==1?' star-first':'',last=count==size+cancel-1?' star-last':'';$div=$('<div class="star star-'+count+' star-'+zebra+first+last+'"><a href="#'+option.value+'" title="'+option.text+'">'+option.text+'</a></div>')};$container.append($div[0])};$container.addClass('fivestar-widget-'+(size+cancel-1));$('select',$widget).after($container).css('display','none');return $container}
function fivestarDefaultResult(voteResult){$('div.fivestar-summary-'+voteResult.vote.tag+'-'+voteResult.vote.id).html(voteResult.result.summary[voteResult.display.text]);if(voteResult.display.stars=='combo')$('div.fivestar-form-'+voteResult.vote.id).each(function(){var $stars=$('.fivestar-widget-static .star span',this),average=voteResult.result.average/100*$stars.size(),index=Math.floor(average);$stars.removeClass('on').addClass('off').css('width','auto');$stars.filter(':lt('+(index+1)+')').removeClass('off').addClass('on');$stars.eq(index).css('width',((average-index)*100)+"%");var $summary=$('.fivestar-static-form-item .fivestar-summary',this);if($summary.size()){var textDisplay=$summary.attr('class').replace(/.*?fivestar-summary-([^ ]+).*/,'$1').replace(/-/g,'_');$summary.html(voteResult.result.summary[textDisplay])}})};$.fn.fivestar=function(){var stack=[];this.each(function(){var ret=buildRating($(this));stack.push(ret)});return stack};if($.browser.msie==true)try{document.execCommand('BackgroundImageCache',false,true)}catch(err){};Drupal.behaviors.fivestar=function(context){$('div.fivestar-form-item:not(.fivestar-processed)',context).addClass('fivestar-processed').fivestar();$('input.fivestar-submit',context).css('display','none')}})(jQuery);
;

