(function($){

	$(window).load(function(event){
		// Form manipulation
		var jForm = $('form#ajaxSubmit');
		((0 < jForm.size()) ? jForm : $('form:first')).formMan2();
	});

	// From http://groups.google.com/group/jquery-en/browse_thread/thread/df28d794de5a9c4e/d53038a86929c34f?pli=1
	$.fn.sort = function() {return this.pushStack( $.makeArray( [].sort.apply( this, arguments ) ) );}; 

	// Form manipulation
	$.fn.formMan2 = function(opts) {
		var settings = {
			sFMsgCls	: "errmsg",
			sMsgSaved	: "\u767b\u9332\u3057\u307e\u3057\u305f\u3002", // 登録しました。のメッセージ
			sKeepCls	: "unreplaceable",
			onRowPlace: null
		};
		$.extend(settings, $.hybs.defaults, opts || {});
		
		return this.each(function() {
			var oForm , mParams , formOpts ;

			oForm = this;
			mParams = {};
			// 処理先のJSPを自動でajaxSubmitモードにする
			// 5.1.3.0 (2010/02/01) リクエストに戻す
			mParams[settings.sAjxSbmtKey] = 'true';
			
			/*-------------------------------------------------
				form Plugin のパラメーター設定
			---------------------------------------------------*/
			formOpts = {};
			formOpts.data = mParams;

			// submit前
			formOpts.beforeSubmit = function (formData, jqForm, options) {
			/* -----------------------------------------
			//	// 画面に押された操作ボタンのcommandをを取得
			//	var sName = settings.sHybsCmd;
			//	var aPair = $.grep(formData, function(a){return (a.name == sName);});
			//	if(aPair) {
			//			sName = 'hX_' + aPair[0].value + 'CMD';
			//			aPair = $.grep(formData, function(a){return (a.name == sName);});
			//	}
			//	jqForm[0].hCMD = (aPair) ? aPair[0].value : '';
			   ----------------------------------------- */

				return (settings.beforeSubmit) ? settings.beforeSubmit(formData, jqForm, options) : true;
			};

			// 成功時
			formOpts.success = function(data, status, $form) {
				var sHybsCmd , match , sUrl , sFrame , oFrame ;

				sHybsCmd = $form.data($.hybs.defaults.sHybsCmd).cmd;
//				var match ;
				// サーバーから帰ってきたデータにrow_errorの有無を確認する
				if(data.indexOf("row_error") >=0) {
					// 二度押しチェックのフラグを戻す
					isClicked = false;
					match = /(?:<\/table>)*[\S\s]*(\[\d+ - \d+\]\/\[\d+\])[\S\s]*(<table[^>]*?>[\S\s]+?row_error[\S\s]*<\/table>)/m.exec(data);
					$.hybs.ogAlert(match ? (match[1] + match[2]) : data);
				}
				else if($.inArray(sHybsCmd, [settings.sCmdInsert, settings.sCmdCopy, settings.sCmdModify, settings.sCmdDelete
																												, settings.sCmdEntry, settings.sCmdUndo]) >= 0) {
					// command=ENTRYでサーバーから帰ってきたデータにid="noTransitionUrl"が有れば、そのURLの画面に遷移する
					if(sHybsCmd == settings.sCmdEntry) {
// 5.3.5.0 (2011/05/01) fileUpload時でも正しく動作するように対応
//						match = /<div id="noTransitionUrl">(.*)<\/div><div id="noTransitionTarget">(.*)<\/div>/m.exec(data);
						match = /<div id="?noTransitionUrl"?>(.*)<\/div>[\s\S]*<div id="?noTransitionTarget"?>(.*)<\/div>/mi.exec(data);
						if(match) {
// 5.3.5.0 (2011/05/01) fileUpload時でも正しく動作するように対応
//							sUrl = match[1];
							sUrl = match[1].replace(/&amp;/g,"&");
							sFrame = match[2];
							oFrame = ( sFrame != "null" ) ? eval( "top." + sFrame ) : window;
							oFrame = oFrame ? oFrame :eval("top.CONTENTS." + sFrame); // 5.5.1.4 (2012/04/10) フレーム存在しない場合の対応
							oFrame.location.href = sUrl;
						}
					}
				}
			};

			// エラー発生時
			formOpts.error = function (xhr, status, e) {
				$.hybs.ogLog(status + '\n' + xhr.responseText);

				$.hybs.ogAlert(status + '<br/>' + xhr.responseText);
			};

			// 送信し、データが戻された後の完了処理
			formOpts.complete = function (xhr, status) {
				// クリックしたボタン情報をクリア
				$(oForm).removeData($.hybs.defaults.sHybsCmd);
			};

			// 動作させるcommandを選択 ajaxSubmit.jsはENTRY時のみ動作させる。
			formOpts.cmds = formOpts.cmds || 
						[settings.sCmdEntry];

			//ajaxFormを呼び出す
			$(oForm).ajaxHybsForm(formOpts);
		});
	};

})(jQuery);

