var TabControl = Class.create({
	initialize: function(tabControlElement) {
	  this.element = tabControlElement;
		this.openPage = null;
		this.selectedTab = null;
	},
	toggleTabState: function(li) {
		li.toggleClassName('current');
		nextLi = li.next();
		if (nextLi) {
			nextLi.toggleClassName('preceding_current');
		};
	},
	showPage: function(div) {
		this.shownPage = div;
		div.show();
	},
	selectTab: function(li) {
		this.selectedTab = li;
		this.toggleTabState(li);
	},
	hideCurrentTabAndPage: function() {
		if (this.shownPage) {
			this.shownPage.hide();
			this.shownPage = null;
		}
		if (this.selectedTab) {
			this.toggleTabState(this.selectedTab);
			this.selectedTab = null;
		}
	},
	toggleTabs: function(event) {
		var tabControlElement = this.element.down('.tab_control');
		if (this.element.hasClassName('default')) {
		  this.element.addClassName('active');
		  this.element.removeClassName('default');
		  tabControlElement.show();
		} else {
		  this.element.addClassName('default');
		  this.element.removeClassName('active');
		  tabControlElement.hide();
		  this.hideCurrentTabAndPage();
		}
		event.stop();
	}, 
  openPopUp: function(event) {
		var a, open, match;

	    open = function(name, url) {
	      window.open(url, name,'toolbar=no,width=700,height=550');
	    };
	    a = event.element();
	    match = /(digg|facebook|myspace)/.exec(a.className);

	    if (match) {
	      open(match[1], a.readAttribute('href'));
	      event.stop();
	    }
	},
	toggleInviteForm: function(event) {
		var sourceElement = event.element();
    var listItem = sourceElement.up('li');
    var inviteTabPageElement = this.element.down('.pages .share_with_invite');
	
		if (inviteTabPageElement.visible()) {
			this.hideCurrentTabAndPage();
		} else {
			this.hideCurrentTabAndPage();
			this.selectTab(listItem);
			var progressIndication = ProgressIndicator.Spinner.start(sourceElement, 'top');

		    inviteTabPageElement.innerHTML = '';

		    new Ajax.Updater(inviteTabPageElement, sourceElement.href, {
		      method : 'get',
		      onComplete : function(response) {
		        listItem.addClassName('current');
		        progressIndication.stop();
				this.showPage(inviteTabPageElement);
		        Event.addBehavior.reload();
		        var tabPage = new CampaignInviteTabPage(inviteTabPageElement);
		        tabPage.open();
		      }.bind(this)
		    });
		}
  	event.stop();
	},
	
	toggleBadgeForm: function(event) {
		var li, page;
		
		li = event.element().up('li');
		page = this.element.down('.tab_control .pages .share_badge');
		
		if (page.visible()) {
			this.hideCurrentTabAndPage();
		} else {
			this.hideCurrentTabAndPage();
			this.selectTab(li);
			this.showPage(page);
		}
    	event.stop();
	}
});

Event.addBehavior({'#share_this' : Behavior.create({
  onclick: Event.delegate({    
		'a.share_link': function(e) { e.element().up('#share_this').tabControl.openPopUp(e); },
		'a.reveal': function(e) { e.element().up('#share_this').tabControl.toggleTabs(e); },
		'h2 a.close img': function(e) { e.element().up('#share_this').tabControl.toggleTabs(e); },
		'.tab_control ul.tabs li a.invite': function(e) { e.element().up('#share_this').tabControl.toggleInviteForm(e); },
		'.tab_control ul.tabs li a.badge': function(e) { e.element().up('#share_this').tabControl.toggleBadgeForm(e); },
		'input[name=badge_code]': function(e) { e.element().select(); },
		'input[name=widget_code]': function(e) { e.element().select(); }	
	})
})});

document.observe("dom:loaded", function() {
  // handle fixed-pledge (dollars and units) "Join" btn so all areas submit form
  Event.addBehavior({
    '#fixed_pledge':Behavior.create({
      onmouseover:function(e){document.body.style.cursor = 'pointer';},
      onmouseout:function(e){document.body.style.cursor = 'default';},
      onclick:function(e){this.element.up(1).submit();}
    })
  })
  
  // attach toggle for moniker when anonymous checkbox is clicked on/off  
  var membershipAnonymousCheckbox = $('membership_anonymous');
  if (membershipAnonymousCheckbox != null) {
    var membershipMoniker = $$('div.membership_moniker').first();
    if(membershipMoniker != null){
      new ThePoint.DisablingElementToggler(membershipAnonymousCheckbox, $$('div.membership_moniker').first());
    }
    var anonymityRevelationMessage = $$('span.anonymity_revelation_message').first();
    if(anonymityRevelationMessage != null){
      new ThePoint.DisablingElementToggler(membershipAnonymousCheckbox, $$('span.anonymity_revelation_message').first());
    }
    var authorAnonymous = $$('.author_anonymous').first();
    var authorPublic = $$('.author_public').first();
    if (authorPublic != null && authorAnonymous != null){
      new ThePoint.SwappingElementToggler(membershipAnonymousCheckbox,  authorAnonymous, authorPublic);
    }
  }    
      
  // fn for default hide of the 'post reply' forms on campaign show page
  var hideReplyForms = function(){
    $$('.campaign_discussion_post_reply_form').each(function(el){
      el.hide();
    }); 
  }
  hideReplyForms();

  //add show/hide others of post reply form  
  if ($('recent_discussion')) {
    Event.addBehavior({
      '#canvas.logged_in a.campaign_discussion_post_reply_link': Behavior.create({
        onclick:function(e){
          hideReplyForms();          
          var revealDiv = $(this.element.id.replace("reveal_", "reply_"));
          if(revealDiv!=null){
            this.prepareReplyAnonymity(revealDiv);
            revealDiv.show();
             revealDiv.setStyle({visibility: 'visible'});
            location.href = this.element.href;
          }
        }, 
        // every time you reveal a post reply form set anonymity toggle relative to that form
        prepareReplyAnonymity:function(element){
          var idSelStr  = '#' + element.id;
          var elStr = idSelStr + ' .toggle_for_anonymous_posting';
          var anonStr = idSelStr + ' ul.author_anonymous';
          var pubStr = idSelStr + ' ul.author_public';
          var userNameStr = idSelStr + ' .default .post_info';
          var userAnonStr = idSelStr + ' .default .post_info_anonymous';
          new ThePoint.SwappingElementToggler($$(elStr).first(), $$(anonStr).first(), $$(pubStr).first());
          new ThePoint.SwappingElementToggler($$(elStr).first(), $$(userAnonStr).first(), $$(userNameStr).first());
        }
      }), 
    
      // a.cancel GOES NO WHERE, finds a parent div with reply_* id, and hides it
      'a.cancel':Behavior.create({
        onclick:function(e){
          e.stop();
           this.element.ancestors().each(function(el){
             if(el.id.match(/reply_/)){
               el.hide();
               throw $break;
             }
           });
        }
      })
    });
  }
  
  // attach tab behavior 
  var tabControlElement = $('share_this');
	if (tabControlElement != null) {
	  tabControlElement.tabControl = new TabControl(tabControlElement);

	  // handle specific cases of hitting the page via query params rather than rjs
	  var inviteTabPageElement = $$('.pages .share_with_invite').first();
	  var badgeTabPageElement = $$('.pages .share_badge').first();

	  // invites
	  if( inviteTabPageElement != null && inviteTabPageElement.visible()){
	    var listItem = $$('a.invite').first().up('li');
	    tabControlElement.tabControl.selectTab(listItem);
	    tabControlElement.tabControl.showPage(inviteTabPageElement);
	    var tabPage = new CampaignInviteTabPage(inviteTabPageElement);
	    tabPage.open();
	  }

	  // badge
	  if( badgeTabPageElement && badgeTabPageElement.visible() ){
	    var listItem = $$('a.badge').first().up('li');
	    tabControlElement.tabControl.selectTab(listItem);
	    tabControlElement.tabControl.showPage(badgeTabPageElement);
	  }		
	}
});

// 
// TAB CONTROL
// 

//
// TAB CONTROL: PAGES
//

//
// TAB CONTROL: PAGES (Invite)
//
CampaignInviteTabPage = Class.create({
  initialize : function(element) {
    this.element = element;
    this._initializeEventHandlers();
    this._attachEventHandlers();
  },
  open : function() {
    this.element.show();
  },
  _removeContactPendingInvite_onclick : function(e) {
    e.stop();
    var sourceElement = e.element();
    var listItem = sourceElement.up('li');
    var contactElement = listItem.contactElement;
    
    Event.stopObserving(listItem, 'click', this._removeContactPendingInvite_onclickHandler);
    listItem.remove();
    
    contactElement.removeClassName('pending');
    contactElement.observe('click', this._uninvitedContact_onclickHandler);
  },
  _removeEmailAddressPendingInvite_onclick : function(e) {
    e.stop();
    var sourceElement = e.element();
    var listItem = sourceElement.up('li');
    
    Event.stopObserving(listItem, 'click', this._removeEmailAddressPendingInvite_onclickHandler);
    listItem.remove();
  },
  _uninvitedContact_onclick : function(e) {
    e.stop();
    var sourceElement = e.element();
    var contactElement = sourceElement.nodeName == "LI" ? sourceElement : sourceElement.up('li');

    Event.stopObserving(contactElement, 'click', this._uninvitedContact_onclickHandler);
    contactElement.addClassName('pending');
    
    var newContactElement = $li({});
    newContactElement.insert(contactElement.innerHTML);
    newContactElement.contactElement = contactElement;
    this._insertPendingRemoveLink(newContactElement, this._removeContactPendingInvite_onclickHandler);
    
    var userRecipientsElement = this.element.down('form .message .to ul.users');
    userRecipientsElement.insert({bottom: newContactElement});
  },
  _addEmailAddressToPendingList_onclick : function(e) {
    e.stop();
    var sourceElement = e.element();
    var addressesTextArea = $('entered_invite_recipient_email_addresses');
    var emailAddresses = addressesTextArea.value.split(/\s*,\s*/);
    
    addressesTextArea.value = '';
    if (emailAddresses.first() == '') emailAddresses.shift();
    
    emailAddresses.each((function(address) {
      var newAddressElement = $li({}, $span({'class': 'address'}, address));
      this._insertPendingRemoveLink(newAddressElement, this._removeEmailAddressPendingInvite_onclickHandler);
      var pendingAddressesList = this.element.down('form .message .to ul.addresses');
      pendingAddressesList.insert({bottom: newAddressElement});      
    }).bind(this));
  },
  _submitButton_onclick : function(e) {
    this._addEmailAddressToPendingList_onclick(e);
    e.stop();
  
    
    var submitButton = e.element();
    var pendingRecipientEmailAddresses = [];
    var pendingAddressesList = this.element.down('form .message .to ul.addresses');
    var pendingUsersList = this.element.down('form .message .to ul.users');

  // TODO check for cases where no emails are supplied
		
		
  
    if($$("li.placeholder").first() !== null){
      $$("li.placeholder").each(function(listElem){listElem.remove()});
    }
// alert(pendingAddressesList.childElements().length);
    for (var i = 0, addressListItem = null; (addressListItem = pendingAddressesList.down('li', i)) != null; i++){
      pendingRecipientEmailAddresses.push(addressListItem.down('.address').innerHTML);
    }
    $('invite_recipient_email_addresses').value = pendingRecipientEmailAddresses.join(',');

		if((pendingUsersList.childElements().length===0) && (pendingAddressesList.childElements().length===0)){
			addAlertViaRJS("error", "Please enter some emails or contacts to invite"); 
			return false;
		}
    submitButton.form.submit();
  },
  _filterListField_onkeyup : function(e) {
    var field = e.element();
    var filter = field.value;
    var contactsListElement = this.element.down('.recipient_selection .contacts ul');
    var showCount = 0;
    var noMatchesListItemElement = contactsListElement.down('.no_matches')
    
    if (noMatchesListItemElement != null) noMatchesListItemElement.remove();
    
    for (var i = 0, contactElement = null; (contactElement = contactsListElement.down('li', i)) != null; i++) {
      var name = contactElement.down('.full_name').innerHTML;
      if (this._passesThroughFilter(filter, name)) {
        contactElement.show();
        showCount++;
      }
      else {
        contactElement.hide();        
      }
    }
    
    if (showCount == 0) {
      var noMatchesElement = $li({'class' : 'no_matches'}, 'No matches');
      contactsListElement.insert({top: noMatchesElement});
    }
  },
  
  _passesThroughFilter : function(filter, string) {
    var pattern = new RegExp('.*' + filter + '.*', "i");
    
    if (pattern.test(string))
      return true;
      
    return false;
  },
  _insertPendingRemoveLink : function(parentElement, handler) {
    var removeLink = $a({'href': '#', 'class': 'remove'}, 'remove');
    removeLink.observe('click', handler);
    parentElement.insert({bottom: removeLink});
    return removeLink;
  },
  _initializeEventHandlers : function() {
    this._uninvitedContact_onclickHandler = this._uninvitedContact_onclick.bindAsEventListener(this);
    this._removeContactPendingInvite_onclickHandler = this._removeContactPendingInvite_onclick.bindAsEventListener(this);
    this._removeEmailAddressPendingInvite_onclickHandler = this._removeEmailAddressPendingInvite_onclick.bindAsEventListener(this);
    this._addEmailAddressToPendingList_onclickHandler = this._addEmailAddressToPendingList_onclick.bindAsEventListener(this);
    this._submitButton_onclickHandler = this._submitButton_onclick.bindAsEventListener(this);
    this._filterListField_onkeyupHandler = this._filterListField_onkeyup.bindAsEventListener(this);
  },
  _attachEventHandlers : function() {
    var recipientSelectionElement = this.element.down('.recipient_selection');
    // Contacts List
    for (var i = 0, contactElement = null; (contactElement = recipientSelectionElement.down('.contacts ul li.invitable', i)) != null; i++)
      contactElement.observe('click', this._uninvitedContact_onclickHandler);
      
    var buttonToAddEmailAddressToPendingList = $('add_invite_recipient_email_addresses_to_list');
    buttonToAddEmailAddressToPendingList.observe('click', this._addEmailAddressToPendingList_onclickHandler);
    
    var submitButton = $('send_message');
    submitButton.observe('click', this._submitButton_onclickHandler);
    
    var filterListField = $('filter_invite_contacts_list');
		if (filterListField != null)
			filterListField.observe('keyup', this._filterListField_onkeyupHandler);
    
  }
});


