var Relationship = klass.create();
Object.extend(Relationship.prototype, {
  initialize: function(instance, state) {
    this.id = instance;
    this.state = state; 

    this.bindControls();
    this.bindEvents();
  },

  bindControls: function() {
    this.container = $('rel-' + this.id + '-form');
    this.subscribe = $('rel-' + this.id + '-subscribe') || null;
    this.neutral = $('rel-' + this.id + '-neutral') || null;
    this.block = $('rel-' + this.id + '-block') || null;
  },

  bindEvents: function() {
    if (this.state != 'subscribed') {
      this.subscribeObserve();
    }

    if (this.neutral != null) {
      this.neutral.style.cursor = 'pointer';
      Event.observe(this.neutral, 'click',
        this.neutralSubmit.bindAsEventListener(this));
    }

    if (this.state != 'blocked') {
      this.blockObserve();
    }
  },

  subscribeObserve: function() {
    if (this.subscribe != null) {
      this.subscribe.style.cursor = 'pointer';
      Event.observe(this.subscribe, 'click',
        this.subscribeSubmit.bindAsEventListener(this));
    }
  },

  subscribeObserveStop: function() {
    this.subscribe.style.cursor = 'default';
    Event.stopObserving(this.subscribe);
  },

  blockObserve: function() {
    if (this.block != null) {
      this.block.style.cursor = 'pointer';
      Event.observe(this.block, 'click',
        this.blockSubmit.bindAsEventListener(this));
    }
  },

  blockObserveStop: function() {
    this.block.style.cursor = 'default';
    Event.stopObserving(this.block);
  },

  neutralObserveStop: function() {
    Event.stopObserving(this.neutral);
  },

  subscribeSubmitResult: function(req, json, extra) {
    var response = xrpcBind(req.responseXML);
    this.state = response.state;
  },

  subscribeSubmit: function() {
    Global.call(this.subscribeSubmitResult.bind(this), 'userSubscribe', this.id);
    this.subscribe.src = '/images/controls/controls-subscribed.png';
    this.block.src = '/images/controls/controls-block.png';
    this.subscribeObserveStop();
    this.blockObserve();
  },

  neutralSubmitResult: function(req, json, extra) {
    var response = xrpcBind(req.responseXML);
    this.state = '';
  },

  neutralSubmit: function() {
    if (this.state == 'subscribed') {
      Global.call(this.neutralSubmitResult.bind(this), 'userUnsubscribe', this.id);
    } else {
      Global.call(this.neutralSubmitResult.bind(this), 'userUnblock', this.id);
    }
    removeContainer(this.container);
    this.subscribeObserveStop();
    this.neutralObserveStop();
    this.blockObserveStop();
  },

  blockSubmitResult: function(req, json, extra) {
    var response = xrpcBind(req.responseXML);
    this.state = response.state;
  },

  blockSubmit: function() {
    Global.call(this.blockSubmitResult.bind(this), 'userBlock', this.id);
    this.subscribe.src = '/images/controls/controls-subscribe.png';
    this.block.src = '/images/controls/controls-blocked.png';
    this.blockObserveStop();
    this.subscribeObserve();
  }
});

var g_relationshipComponents = [];

function g_relationshipInit() {
  g_relationshipComponents.each(function(inst, i) {
    new Relationship(inst.id, inst.state);
  });
}

g_components.push(g_relationshipInit);

var Relationship2 = klass.create();
Object.extend(Relationship2.prototype, {
  initialize: function(instance, state) {
    this.id = instance;
    this.state = state; 

    this.bindControlsAndEvents();
    this.subscribe.style.cursor = 'pointer';
    this.neutral.style.cursor = 'pointer';
    this.block.style.cursor = 'pointer';
  },

  bindControlsAndEvents: function() {
    this.container = $('rel-' + this.id + '-form');
    this.subscribe = $('rel-' + this.id + '-subscribe'); 
    this.neutral = $('rel-' + this.id + '-neutral');
    this.block = $('rel-' + this.id + '-block');
    this.startObservingAll();
    this.setInitialControls();
  },

  startObservingAll: function () {
    Event.observe(this.subscribe, 'click', this.subscribeSubmit.bindAsEventListener(this));
    Event.observe(this.neutral, 'click', this.neutralSubmit.bindAsEventListener(this));
    Event.observe(this.block, 'click', this.blockSubmit.bindAsEventListener(this));
  },

  stopObservingAll: function() {
    Event.stopObserving(this.subscribe);
    Event.stopObserving(this.neutral);
    Event.stopObserving(this.block);
  },

  setInitialControls: function() {
    if (this.state == "subscribed") {
      this.subscribe.style.display = 'none';
      this.neutral.style.display = 'inline';
      this.block.style.display = 'inline';
    } else if (this.state == "blocked") {
      this.subscribe.style.display = 'inline';
      this.neutral.style.display = 'inline';
      this.block.style.display = 'none';
    } else {
      this.subscribe.style.display = 'inline';
      this.neutral.style.display = 'none';
      this.block.style.display = 'inline';
    }
  },

  subscribeSubmitResult: function(req, json, extra) {
    var response = xrpcBind(req.responseXML);
    this.state = response.state;
  },

  subscribeSubmit: function() {
    Global.call(this.subscribeSubmitResult.bind(this), 'userSubscribe', this.id);
    this.stopObservingAll();
    Event.observe(this.block, 'click', this.blockSubmit.bindAsEventListener(this));
    Event.observe(this.neutral, 'click', this.neutralSubmit.bindAsEventListener(this));
    this.subscribe.style.display = 'none';
    this.neutral.style.display = 'inline';
    this.block.style.display = 'inline';
  },

  neutralSubmitResult: function(req, json, extra) {
    var response = xrpcBind(req.responseXML);
    this.state = '';
  },

  neutralSubmit: function() {
    if (this.state == 'subscribed') {
      Global.call(this.neutralSubmitResult.bind(this), 'userUnsubscribe', this.id);
    } else {
      Global.call(this.neutralSubmitResult.bind(this), 'userUnblock', this.id);
    }

    this.stopObservingAll();
    Event.observe(this.subscribe, 'click', this.subscribeSubmit.bindAsEventListener(this));
    Event.observe(this.block, 'click', this.blockSubmit.bindAsEventListener(this));
    this.subscribe.style.display = 'inline';
    this.neutral.style.display = 'none';
    this.block.style.display = 'inline';
    
  },

  blockSubmitResult: function(req, json, extra) {
    var response = xrpcBind(req.responseXML);
    this.state = response.state;
  },

  blockSubmit: function() {
    Global.call(this.blockSubmitResult.bind(this), 'userBlock', this.id);
    this.stopObservingAll();
    Event.observe(this.subscribe, 'click', this.subscribeSubmit.bindAsEventListener(this));
    Event.observe(this.neutral, 'click', this.neutralSubmit.bindAsEventListener(this));
    this.subscribe.style.display = 'inline';
    this.neutral.style.display = 'inline';
    this.block.style.display = 'none';
  }
});

var g_relationship2Components = [];

function g_relationship2Init() {
  g_relationship2Components.each(function(inst, i) {
    new Relationship2(inst.id, inst.state);
  });
}

g_components.push(g_relationship2Init);

// vim:set sts=2 sw=2 expandtab:
