
var FBConnect = {

  /*
   * If this value is true alert boxes will be raised when various
   * types of configuration errors are detected.
   */
  debugVerbose : (window.location.href.indexOf('fbc_verbose_debug') != -1),

  initialized : false,

  init : function(api_key, plugin_path,
                  template_bundle_id, home_url,
                  wp_user, app_config) {

    if (!api_key) {
      FBConnect.error("api_key is not set");
    }

    if (!plugin_path) {
      FBConnect.error("plugin path not provided");
    }

    // Check for properly configured template - note this test fails in IE!
    if (this.debugVerbose) {
      var html_tag = document.getElementsByTagName('html').item(0);
      if (html_tag.getAttribute('xmlns:fb') === null) {
        FBConnect.error('xmlns:fb not defined on html tag - check your templates');
      }
    }

    FBConnect.home_url = home_url || "/";

    FBConnect.plugin_path = plugin_path;
    FBConnect.template_bundle_id = template_bundle_id;
    FBConnect.wp_user = wp_user;

    FB.init(api_key, plugin_path + "xd_receiver.php", app_config);

    FBConnect.initialized = true;
  },

  appconfig_reload : {
    reloadIfSessionStateChanged: true
  },

  appconfig_none : {},

  appconfig_ajaxy : {
    ifUserConnected : fbc_onlogin_noauto,
    ifUserNotConnected : fbc_onlogout_noauto
  },

  logout : function() {
    FB.ensureInit(function() {
       FB.Connect.logout();
    });
  },

  redirect_home : function() {
    window.location = FBConnect.home_url;
  },

  /*
   wordpress specific functions
   */
  setup_feedform : function() {

    if (!FBConnect.template_bundle_id) {
      FBConnect.error("no template id provided");
      return;
    }

    var comment_form = ge('commentform');
    if (!comment_form) {
      FBConnect.error('unable to locate id=commentform');
      return;
    }

    var orig_submit = ge('submit');
    if (orig_submit && orig_submit.getAttribute('name') === 'submit') {
      /* This is a bit of a hack. The default theme gives the submit
       button an id and name of "submit". This causes it to overwrite
       the .submit() function on the form. The solution is to delete
       the submit button and recreate it with a different id. See
       http://jibbering.com/faq/names/ for more info on why this is
       bad.  */

      var subbutton = document.createElement('input');
      subbutton.setAttribute('name', 'fbc_submit_hack');
      subbutton.setAttribute('type', 'submit');

      // restore the origional name
      subbutton.setAttribute('value', '寫好了');

      comment_form.appendChild(subbutton);

      orig_submit.parentNode.replaceChild(subbutton, orig_submit);

    }

    /*
     * This is pretty terrible but I don't have a better option for
     * detecting a callable on IE since typeof(comment_form.submit)
     * returns object and 'call' in comment_form.submit is false.
     */
    if (comment_form.submit.nodeType) {
      FBConnect.error('unable to find .submit() on commentform');
      return;
    }

    comment_form.onsubmit = function() {
      return FBConnect.show_comment_feedform();
    }

  },

  show_comment_feedform : function() {

    var template_data = {
        'post-url': window.location.href,
        'post-title': FBConnect.article_title,
        'blog-name': FBConnect.blog_name,
        'blog-url': FBConnect.home_url
    };

    var comment_text = '';

    var commentform = ge('commentform');
    if (commentform) {
      // if this isn't present something is seriously wrong
      var comment_box = commentform.comment;
      if (comment_box) {
        comment_text = comment_box.value;
      } else {
        FBConnect.error('unable to locate comment textarea');
        return true;
      }
    } else {
      FBConnect.error('unable to locate comment form, expected id=commentform');
      return true;
    }

    if (comment_text.length === 0) {
      // allow normal submit to complete
      return true;
    }

    FB.Connect.showFeedDialog(FBConnect.template_bundle_id,
                              template_data,
                              null, // template_ids
                              null, // body_general
                              null, // story_size (deprecated)
                              FB.RequireConnect.promptConnect, // require_connect
                              function() {
                                commentform.submit();
                              },
                              'Your comment: ',
                              {value: comment_text});

    // submit handled by showFeedDialog
    return false;

  },

  error : function(msg) {
    if (FBConnect.debugVerbose) {
      var emsg = 'Error: ' + msg;
      alert(emsg);
    }
  }

};

// end FBConnect

function fbc_onlogout_noauto() {
  fbc_set_visibility_by_class('fbc_hide_on_login', '');
  fbc_set_visibility_by_class('fbc_hide_on_logout', 'none');
}


function fbc_onlogin_noauto() {

  fbc_set_visibility_by_class('fbc_hide_on_login', 'none');
  fbc_set_visibility_by_class('fbc_hide_on_logout', '');
  FBConnect.setup_feedform();
}

function fbc_set_visibility_by_class(cls, vis) {
  var res = document.getElementsByClassName(cls);
  for(var i = 0; i < res.length; ++i) {
    res[i].style.visibility = vis;
  }
}


function ge(elem) {
  return document.getElementById(elem);
}
