/*
 メール送信関連のJavascript

 以下のjavascriptファイルに依存しています（
    ajaxutil.js
    blowfish.js
 
 説明）
   MailSender.send(mailBody, onsuccess, onerror)
 
     本文mailBodyのメールの送信をサーバにリクエストします。
     サーバ側で正常に終了した場合は、onsuccessで指定された関数を実行します。
     失敗した場合、onerrorで指定された関数を実行します。
 
   MailUtil.makeMailBody(divId)
   
     入力フォームの内容から「ラベル：値」で構成されたメール本文を作成します.
     
     メール本文中のラベルはlabelタグから取得します.
     
     値は、labelタグのfor属性に結びつくinputタグ・selectタグ・textareaタグの
     入力値になります.
     複数のinputタグを連結したい場合は、spanで括り、そのspanのIDをlabelタグのidに
     指定してください。（下記 例の※参照）
     
     例）
     -- html --
       <div id="offer_form">
         <label for="product_name">商品名</label>
         <input type="text" id="product_name"/>
         
         <label for="amount">数量</label>
         <input type="text" id="amount" />
         
         <label>住所</label>
         <label for="zip_code">郵便番号</label>  <!-- ※ spanのidを指定 -->
         <span id="zip_code">                    <!-- ※まとめたいinputタグをspanでくくる -->
           <input type="text" id="zip1"> - <input type="text" id="zip2">
         </span>
       </div>
	 
	 -- javascript実行 --
	 jp.co.takarakujinet.makeMailBody("offer_form");
	 
	 
	 -- メール本文出力結果 --
	 商品名: xxxxxx
	 数量：xxxxxx
	 住所：
	 郵便番号: xxx-xxxx     <-- ※ 複数のinputをまとめて出力（ただし、区切り文字は"-"固定）
 
*/

package("jp.co.takarakujinet");

jp.co.takarakujinet.MailSender = {
	/**
	 * メールの送信をサーバーにリクエストします.
	 * 
	 * @param {String} mailBody メール本文
	 * @param {function} onsuccess メール送信したときに実行される関数
	 * @param {function} onerror メール送信でエラーが発生したときに実行される関数
	 */
    send : function(mailBody, onsuccess, onerror) {
        var secretKey = this._getKey(onerror);
		if (secretKey == "") return;

		mailBody = this._encrypt(mailBody, secretKey);
		
		this._sendMail(mailBody, onsuccess, onerror);
    },
    
    /**
     * 秘密鍵を取得します.
     * 
     * @param {Object} onerror 秘密鍵が取得できないときに実行される関数
     */
    _getKey : function(onerror) {
      	var secretKey = "";
        decodeKey = function(response) {
        	secretKey = base64.decode(response);
        }
      	jp.co.takarakujinet.AjaxUtil._ajaxRequest(
            "POST", "/ajax/goods/generateKey.do", {}, decodeKey, onerror, false);
      
      	return secretKey;
    },
    
	/**
	 * メールをサーバに送信します.
	 * 
	 * @param {Object} mailBody 暗号化されたメール本文
	 * @param {Object} onsuccess メール送信に成功したときに実行される関数
	 * @param {Object} onerror メール送信に失敗したときに実行される関数
	 */
    _sendMail : function(mailBody, onsuccess, onerror) {
	  	var encodedMailBody = utf.URLencode(mailBody);
      	jp.co.takarakujinet.AjaxUtil._ajaxRequest(
            "POST", "/ajax/goods/mailSend.do", {'mail_body' : encodedMailBody},
             onsuccess, onerror, true);
    },
    
	/**
	 * Blowfish暗号化を行います.
	 * 
	 * @param {Object} text 暗号化される文字列
	 * @param {Object} secretKey 秘密鍵
	 * @return 暗号化されBase64で符号化された文字列
	 */
    _encrypt : function(text, secretKey) {
      	var cipherText = blowfish.encrypt(text, secretKey);
      	return base64.encode(cipherText);
    },
	
	/**
	 * Blowfishで復号します.
	 * 
	 * @param {Object} text 暗号化された文字列（Base64済）
	 * @param {Object} secretKey 秘密鍵
	 * @return 復号化された文字列
	 */
	_decrypt : function(text, secretKey) {
		var cipherText = base64.decode(text);
		return blowfish.decrypt(cipherText, secretKey);
	}
}

jp.co.takarakujinet.MailUtil = {
	/**
	 * メールの本文を作成します.
	 * 
	 * @param {Object} divId 入力フォームを含むdivタグ、もしくはformタグのID
	 */
	makeMailBody : function(divId) {
		var body = "";
		var labelElements = this._getLabelElements(divId);
		
		for (var i = 0; i < labelElements.length; i++) {
			var labelValue = labelElements[i].innerHTML;
			var elementValue = this._getValueByLabel(labelElements[i]);
			
			if (labelValue == "" || elementValue == "") {
				continue;
			}
			
			body += labelValue + " : " + elementValue + "\n";
		}
		return body;
	},
	
	/**
	 * labelタグのfor属性からinputタグ、もしくはselectタグの要素を取得し、
	 * その入力値を返します。
	 * また、labelタグのforがinput, select, textarea以外の場合は、
	 * forで指定されたタグの子要素の値を、"-"で連結したものを返します.
	 * 
	 * @param {Object} labelElement label要素
	 */
	_getValueByLabel : function(labelElement) {
		var inputElement = this._getElementByLabelFor(labelElement);
		if (!inputElement) {
			return "";
		}
		
		if (inputElement.tagName == "SELECT"
		    || inputElement.tagName == "INPUT"
			|| inputElement.tagName == "TEXTAREA") {
			return inputElement.value;
		}
		return this._getChildrenValue(inputElement);
	},
	
	/**
	 * 指定された要素の子ノードの値を"-"区切りで連結し返します.
	 * 
	 * @param {Object} el DOM要素
	 */
	_getChildrenValue : function(el) {
		var values = new Array();
		var children = el.childNodes;
		for(var i = 0; i < children.length; i++) {
			if(children[i].value) {
				values.push(children[i].value);
			}
		}
		return values.join("-");
	},
	
	/**
	 * divId内のLabelタグをすべて取得します.
	 * 
	 * @param {Object} divId
	 * @return Label要素の配列
	 */
	_getLabelElements : function(divId) {
		var divElement = document.getElementById(divId);
		return divElement.getElementsByTagName("label");
	},
	
	/**
	 * 指定されたラベル要素のfor属性の要素を取得します.
	 * 
	 * @param {Object} labelElement
	 */
	_getElementByLabelFor : function (labelElement) {
		var forAttr = labelElement.attributes['for'];
		if (!forAttr || forAttr.nodeValue == "") return null;
		
		return document.getElementById(forAttr.nodeValue);
	}
}
