if(!window.Burlap) window.Burlap = {
  reason: null,
  supported: false,

  initModules: function(srvc) {
    if(!Burlap.enabled()) return;

    if(srvc) {
      Burlap[srvc].execute();
    } else {
      for(var srvc in Burlap) {
        if(Burlap[srvc] && 
           typeof Burlap[srvc].execute == "function") {
          Burlap[srvc].execute();
        }
      }
    }
  },

  initStyles: function() {
    if(!Burlap.enabled()) return;
    document.write("<style type='text/css'>.burlap{display:none}</style>");
  },

  /** Sends a signal to Merino.
      Syntax: Burlap.signal("compose_mail", {...}); */
  signal: function(topic, param) {
    var owner = top.top.frames[0];
    owner.MochiKit.Signal.signal(owner.BurlapBroker, topic, param);
  },

  enabled: function() {
    if(Burlap.supported) return true;
    if(Burlap.reason) return false;

    if(window.name == "burlap_frame") {
      Burlap.supported = true;
      return true;
    }

    try {
      Burlap.reason = "Not within iframe window";
      if(top == window) return false;
      Burlap.reason = "Destination frame not found";
      if(top.frames.length <= 0) return false;
      Burlap.reason = "Burlap destination not found";
      if(!top.frames[0].BurlapBroker) return false;
    } catch(e) {
      Burlap.reason += ", " + (e.message||e);
      return false;
    }

    Burlap.reason = "";
    Burlap.supported = true;
    return true;
  }
};

/**
 Conventions:
 1. Perform override task inside the execute() method.
 2. Prefer overriding existing functions over adding inline function calls.
 3. Name overridden functions as original name prefixed with "rp_".
 4. Write inline function calls to check Burlap.enabled() and, if possible, 
    return a boolean, so that they can be used by forms and anchors in a 
    backwards compatible way. e.g.,
      <a href="http://" onclick="return Burlap.AddrBook.compose();">
      <form onsubmit="return Burlap.AddrBook.compose();">
      <input onclick="return Burlap.AddrBook.compose();">
 */

Burlap["AddrBook"] = {
  execute: function() {
    if(window.compose) window.compose = Burlap.AddrBook.rp_compose;
    if(window.composeAll) window.composeAll = Burlap.AddrBook.rp_composeAll;
    if(window.returnAddress) window.returnAddress = Burlap.AddrBook.rp_returnAddress;
  },

  compose: function(to, cc, bcc) {
    if(!Burlap.enabled()) return true;
    Burlap.signal("externalpage_request_compose", {to:to, cc:cc, bcc:bcc});
    return false;
  },

  /*==== Functions that override "/templates/mail/us/addr.js" ====*/

  rp_compose: function(addr) {
  	resetComposeForm();
  	if (addr!=null && addr!='') {
  		document.composeForm.composeto.value=addr;
  		//~document.composeForm.submit();
  		Burlap.AddrBook.compose(document.composeForm.composeto.value);
  	}
  },

  rp_composeAll: function() {
  	resetComposeForm();
  	var count=0;
  	var targetForm = document.addressBook || document.addrbkForm || document.addresscompose;
  	for (var i=0;i<targetForm.elements.length;i++) {
  		var j=targetForm.elements[i];
  	
  		//if (j.checked && j.value != '' && j.type=='radio') {
  		if (j.checked && j.value != '' && (j.type=='checkbox'||j.type=='radio')) {
  			if (parseAddr(j.value)) count++;
  		}
  	}
  	if (count > 0){ 
  	    //~document.composeForm.submit();
  	    Burlap.AddrBook.compose(
  	        document.composeForm.composeto.value, 
  	        document.composeForm.composecc.value, 
  	        document.composeForm.composebcc.value
  	    );
      }
      else {
          alert('Please check on the checkbox of the contacts to proceed');
      }
  },

  rp_returnAddress: function() {
  	if (thisService=="email") {
  		var tmp="";
  		var toAddress="";
  		var ccAddress="";
  		var bccAddress="";
  		for (var i=0;i<document.addressBook.elements.length;i++) {
  			var fieldValue=document.addressBook.elements[i];
  			if (fieldValue.checked) {
  				var tmp=fieldValue.value;
  				if (tmp.substring(0,3)=='to_') {
  					if (toAddress=="") { ; }
  					 else {toAddress+=",";}
  					toAddress+=fieldValue.value.substring(3,(fieldValue.value.length));
  				} else if (tmp.substring(0,3)=='cc_') {
  					if (ccAddress=="") { ; }
  					 else {ccAddress+=",";}
  					ccAddress+=fieldValue.value.substring(3,(fieldValue.value.length));
  				} else if (tmp.substring(0,4)=='bcc_') {
  					if (bccAddress=="") { ; }
  					 else {bccAddress+=",";}
  					bccAddress+=fieldValue.value.substring(4,(fieldValue.value.length));
  				} else{;}
  			}
  		}
  		Burlap.AddrBook.compose(toAddress, ccAddress, bccAddress);
  		window.close();
  	} else if (thisService=="calendar") {
  		var tmp="";
  		var toAddress=window.opener.document.appointmentForm.notify_others.value;
  		for (var i=0;i<document.addressBook.elements.length;i++) {
  			var fieldValue=document.addressBook.elements[i];
  			if (fieldValue.checked) {
  				var tmp=fieldValue.value;
  				if (tmp.substring(0,3)=='to_') {
  					if (toAddress=="") { ; }
  					 else {toAddress+=", ";}
  					toAddress+=fieldValue.value.substring(3,(fieldValue.value.length));
  				} else{;}
  			}
  		}
  		window.opener.document.appointmentForm.notify_others.value=toAddress;
  		//window.close();
  	}
  	document.addressBook.reset();
  }
};

Burlap["Options"] = {
  execute: function() {
    Burlap.signal("optionsupdate");
  }
};

/** Deprecated. Use Burlap */
var AjaxIntegration = {
  /** signalCompose: Deprecated. Use Burlap.AddrBook.signalCompose instead */
  signalCompose:function(to,cc,bcc){
    return Burlap.AddrBook.compose(to, cc, bcc);
  },
  /** signalCompose: Obsoleted. Use Burlap.AddrBook.signalCompose instead */
  _signalCompose: function(to, cc, bcc) {
    return Burlap.AddrBook.compose(to, cc, bcc);
  },

  /** compose+composeAll+returnAddress: Deprecated. */
  compose: Burlap.AddrBook.rp_compose,
  composeAll: Burlap.AddrBook.rp_composeAll,
  returnAddress: Burlap.AddrBook.rp_returnAddress
};