/**
 * @描述:我的风火组件 构造函数
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 上午10:47:04
 * @param oContainer
 * @param oParam
 * @returns {MyFHUI}
 */
function MyFHUI(oContainer, oParam) {
	// 容器
	this.Container = oContainer;
	// 虚拟主机名称
	this.appName = oParam.appName;
	// 是否要启动定时任务
	this.isRunTimeTask = (oParam.isRunTimeTask == null) ? false : oParam.isRunTimeTask;
	// 定时任务的间隔时长（单位：毫秒）
	if (this.isRunTimeTask) {
		this.timeTaskIntervalDuration = (oParam.timeTaskIntervalDuration == null) ? 3000 : oParam.timeTaskIntervalDuration;
	}
	// 是否要执行在线打点
	this.isDotOnline = (oParam.isDotOnline == null) ? false : oParam.isDotOnline;
	// 执行在线打点的Url
	if (this.isDotOnline) {
		this.urlDotOnline = (oParam.urlDotOnline == null) ? null : oParam.urlDotOnline;
	}
	// url:验证用户是否已经登录
	this.urlIsLoginUser = oParam.urlIsLoginUser;
	// 验证用户是否已经发送了实时查询请求
	this.urlIsSendRealQuery = oParam.urlIsSendRealQuery;
	// url:对话框 提醒用户登录
	this.urlRemindUserLoginDialog = oParam.urlRemindUserLoginDialog;
	// url:对话框 选择用户地址
	this.urlSelectUserAddressDialog = oParam.urlSelectUserAddressDialog;
	// url:对话框 显示添加用户地址
	this.urlShowAddUserAddressDialog = oParam.urlShowAddUserAddressDialog;
	// url:对话框 正在发送实时查询
	this.urlSendingRealQueryDialog = oParam.urlSendingRealQueryDialog;
	// url:提交实时查询
	this.urlSubmitRealQuery = oParam.urlSubmitRealQuery;
	// url:对话框 等待实时查询结果
	this.urlWaitRealQueryDialog = oParam.urlWaitRealQueryDialog;
	// url:对话框 实时查询 查询中......
	this.urlRealQueryInquiresDialog = oParam.urlRealQueryInquiresDialog;
	// url:询问实时查询的结果
	this.urlAskRealQueryResult = oParam.urlAskRealQueryResult;
	// url:取消实时查询
	this.urlCancelRealQuery = oParam.urlCancelRealQuery;
	// url:对话框 实时查询完成
	this.urlRealQueryCompleteDialog = oParam.urlRealQueryCompleteDialog;

	// 当前用户
	this.CurrentUser = oParam.currentUser;
	if (this.CurrentUser == null || this.CurrentUser.userId == null || this.CurrentUser.userId <= 0) {
		throw new Error(-1, "用户对象不能为空！");
	}
};

// 容器
MyFHUI.prototype.Container = null;

// 虚拟主机名称
MyFHUI.prototype.appName = null;

// 当前帐号
MyFHUI.prototype.CurrentUser = null;

// 是否要启动定时任务
MyFHUI.prototype.isRunTimeTask = false;

// 定时任务的间隔时长（单位：毫秒）
MyFHUI.prototype.timeTaskIntervalDuration = -1;

// 定时任务
MyFHUI.prototype.TimeTask = null;

// 是否要执行在线打点
MyFHUI.prototype.isDotOnline = null;

// url:执行在线打点
MyFHUI.prototype.urlDotOnline = null;

// 在线打点任务对象
MyFHUI.prototype.DotOnlineTask = null;

// url:验证用户是否已经登录
MyFHUI.prototype.urlIsLoginUser = null;

// url:对话框 提醒用户去登录
MyFHUI.prototype.urlRemindUserLoginDialog = null;

// url:对话框 选择用户地址
MyFHUI.prototype.urlSelectUserAddressDialog = null;

// url:对话框 显示添加用户地址
MyFHUI.prototype.urlShowAddUserAddressDialog = null;

// url:对话框 正在发送实时查询
MyFHUI.prototype.urlSendingRealQueryDialog = null;

// url:Action 提交实时查询表单
MyFHUI.prototype.urlSubmitRealQuery = null;

// url:对话框 等待实时查询的结果
MyFHUI.prototype.urlWaitRealQueryDialog = null;

// 询问实时查询结果的任务
MyFHUI.prototype.AskRealQueryResultTask = null;

// url:Action 询问实时查询的结果
MyFHUI.prototype.urlAskRealQueryResult = null;

// url:Action 取消当前的实时查询
MyFHUI.prototype.urlCancelRealQuery = null;

// url:对话框 查询中
MyFHUI.prototype.urlRealQueryInquiresDialog = null;

// url:对话框 查询完成
MyFHUI.prototype.urlRealQueryCompleteDialog = null;

/**
 * ------------------------------------------------------------------------------------------------------------
 */

/**
 * @描述：返回应用程序别名
 * @开发人员：moshco zhu
 * @开发时间：2011-6-15 下午02:33:25
 */
MyFHUI.prototype.getAppName = function() {
	return this.appName;
};

/**
 * @描述：开始发送实时查询
 * @开发人员：moshco zhu
 * @开发时间：2011-6-15 下午01:14:47
 */
MyFHUI.prototype.startRealQuery = function(oBtn) {
	try {
		// 读取参数
		var strFormData = oBtn.attr("queryForm");
		if (strFormData == null || strFormData == "") {
			msg("参数为空！");
			return false;
		}
		// 验证当前用户是否已经登录
		var strUrl = this.appName + this.urlIsLoginUser;
		if (!isLoginUser(strUrl)) {
			// 提示用户去登录
			// 创建对话框
			this.showDialog(this.urlRemindUserLoginDialog, "实时购票").showClose();
			// 返回函数值
			return false;
		}
		// 选择用户地址
		this.showSelectUserAddress(strFormData);
	} catch (e) {
		msg("请求发送失败！", "提示信息");
		return false;
	}
	// 返回函数值
	return false;
};

/**
 * @描述:提交实时查询
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 下午01:47:27
 * @param strFormData
 * @returns {Boolean}
 */
MyFHUI.prototype.submitRealQuery = function(oBtn) {
	// 对象别名
	var oThis = this;
	// 异步函数
	var fn = function(strJs) {
		// strJs不能为空
		if (strJs == null || strJs == "") {
			msg("请求发送失败！", "提示信息");
			return false;
		}
		// 读取结果
		var oResult = null;
		eval("oResult = " + strJs + ";");
		if (oResult == null) {
			msg("请求发送失败！", "提示信息");
			return false;
		}
		// 提交结果
		if (!oResult.isSuccess) {
			if (oResult.msg != null && oResult.msg != "") {
				oThis.msg(oResult.msg);
			}
			// 返回函数值
			return false;
		}
		// 排队序号
		var iWaitQueueLength = oResult.waitQueueLength;
		// 显示对话框：等待中
		var oDialog = oThis.showDialog(oThis.urlWaitRealQueryDialog, "实时购票");
		// 闪动
		flash(oDialog.Container.find(".MyFHUIWaitRealQueryDialogQueueLength"), iWaitQueueLength);
		// 开始排队等待
		oThis.waitRealQueryResult(oDialog);
		// 返回函数值
		return true;
	};

	// 读取实时查询表单数据
	var oDialog = oBtn.parents(".MyFHUISelectUserAddressDialog");
	var strFormData = oDialog.attr("form_data");
	if (strFormData == null || strFormData == "") {
		msg("查询表单数据丢失！");
		return false;
	}

	// 读取省份城市地区编码
	var strProvince = null;
	var strCity = null;
	var strArea = null;
	oDialog.find(":radio[name=area]").each(function() {
		if ($(this).attr("checked")) {
			strProvince = $(this).attr("province");
			strCity = $(this).attr("city");
			strArea = $(this).attr("area");
			return false;
		}
		return true;
	});
	// 地区不能为空
	if (strProvince == null || strProvince == "" || strCity == null || strCity == "" || strArea == null || strArea == "") {
		oDialog.find(".msg").html("请选择一项配送地址。").fadeIn(500, function() {
			$(this).fadeOut(12000, function() {
				$(this).empty();
			});
		});
		return false;
	}

	// 转换为JSon对象
	var oFormData = null;
	eval("oFormData = " + strFormData + ";");
	if (oFormData == null) {
		msg("查询表单数据丢失！");
		return false;
	}
	// 显示对话框：提交中
	var oDialog = this.showDialog(this.urlSendingRealQueryDialog, "实时购票");
	// 发出请求
	var strUrl = this.appName + this.urlSubmitRealQuery;
	oFormData = $.extend(oFormData, {
		province : strProvince,
		city : strCity,
		area : strArea
	});
	if (oFormData.startTime == null) {
		msg("出行日期不能为空！");
		return false;
	}
	doAction(strUrl, oFormData, fn);
	// 返回函数值
	return true;
};

/**
 * @描述:等待实时查询的结果
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 下午02:14:45
 * @param oDialog
 * @returns {Boolean}
 */
MyFHUI.prototype.waitRealQueryResult = function(oDialog) {
	// 对象别名
	var oThis = this;
	// 创建一个询问实时查询结果的任务
	this.AskRealQueryResultTask = {
		code : randomNum(6),
		intervalDuration : 3000,
		runParam : {
			url : oThis.urlAskRealQueryResult,
			position : -1,
			dialog : oDialog
		},
		isRun : function(oTask) {
			var str1 = oTask.code;
			var str2 = oThis.AskRealQueryResultTask.code;
			return (str1 == str2) ? true : false;
		},
		run : function(oRunParam) {
			return oThis.askRealQueryResult(oRunParam);
		},
		runNum : 0,
		successNum : 0,
		failNum : 0,
		errorNum : 0
	};
	// 加入到执行队列
	this.TimeTask.addTimeTask(this.AskRealQueryResultTask);
	// 设置不能开始新的实时查询
	this.setStartNewRealQueryunable();

	// 返回函数值
	return true;
};

/**
 * @描述:询问实时查询结果 等待中......
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 下午02:45:24
 * @param oResult
 * @param oDialog
 * @returns {Boolean}
 */
MyFHUI.prototype.askRealQueryResult_Waiting = function(oResult, oDialog) {
	if (oDialog.Container.find(".MyFHUIWaitRealQueryDialog").length == 0) {
		// 排队序号
		var iWaitQueueLength = oResult.waitQueueLength;
		// 显示对话框：等待中
		var oDialog = this.showDialog(this.urlWaitRealQueryDialog, "实时购票");
		// 闪动
		flash(oDialog.Container.find(".MyFHUIWaitRealQueryDialogQueueLength"), iWaitQueueLength);
		this.AskRealQueryResultTask.runParam.dialog = oDialog;
	} else {
		// 用户位置
		this.CurrentUser.position = oResult.position;
		// 队列序号
		var iWaitQueueLength = oResult.waitQueueLength;
		// 闪动
		flash(oDialog.Container.find(".MyFHUIWaitRealQueryDialogQueueLength"), iWaitQueueLength);
		// 设置窗体偏移
		oDialog.setMarginTop($(window).scrollTop() + 200);
	}
	// 返回函数值
	return true;
};

/**
 * @描述:询问实时查询结果 查询中......
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 下午02:51:37
 * @param oResult
 * @param oDialog
 * @returns {Boolean}
 */
MyFHUI.prototype.askRealQueryResult_Query = function(oResult, oDialog) {
	if (oDialog.isQuery == null) {
		var strUrl = this.urlRealQueryInquiresDialog;
		var oDialog = this.showDialog(strUrl, "实时购票");
		oDialog.isQuery = true;
		this.AskRealQueryResultTask.runParam.dialog = oDialog;
	} else {
		oDialog.setMarginTop($(window).scrollTop() + 200);
	}
	// 返回函数值
	return true;
};

/**
 * @描述:问实时查询结果 查询完成
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 下午02:51:48
 * @param oResult
 * @param oDialog
 * @returns {Boolean}
 */
MyFHUI.prototype.askRealQueryResult_Complete = function(oResult, oDialog) {
	// 读取查询Id
	var iQueryId = oResult.queryId;
	var strUrl = this.urlRealQueryCompleteDialog;
	if (strUrl.indexOf('?') >= 0) {
		strUrl += "&";
	} else {
		strUrl += "?";
	}
	strUrl += "queryId=" + iQueryId;
	// 显示对话框
	var oDialog = this.showDialog(strUrl, "实时购票").showClose();
	this.AskRealQueryResultTask.runParam.dialog = oDialog;
	// 停止询问查询结果
	this.stopAskRealQueryResult(oResult, null);
	// 设置可以开始新的实时查询
	this.setStartNewRealQueryable();
	// 返回函数值
	return true;
};

/**
 * @描述:停止询问实时查询的结果
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 下午02:55:41
 * @param oResult
 * @param oDialog
 * @returns {Boolean}
 */
MyFHUI.prototype.stopAskRealQueryResult = function(oResult, oDialog) {
	// 停止运行任务
	if (this.AskRealQueryResultTask != null) {
		// 停止运行任务
		this.AskRealQueryResultTask.isRun = function(oTask) {
			return false;
		};
		this.AskRealQueryResultTask.run = function(oRunParam) {
			return true;
		};
		// 从任务队列中删除任务
		this.TimeTask.removeTimeTask(this.AskRealQueryResultTask);
		// 置空任务对象
		this.AskRealQueryResultTask = null;
	}
	// 关闭对话框
	if (oDialog != null) {
		oDialog.close();
	}
	// 返回函数值
	return true;
};

/**
 * @描述:询问实时查询结果
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 下午02:22:10
 * @param oRunParam
 * @returns {Boolean}
 */
MyFHUI.prototype.askRealQueryResult = function(oRunParam) {
	// 对象别名
	var oThis = this;
	// 异步函数
	var fn = function(strJs) {
		try {
			// alert(strJs);
			// 请求发送失败
			if (strJs == null || strJs == "") {
				return false;
			}
			// 返回结果对象
			var oReturn = null;
			eval("oReturn = " + strJs + ";");
			if (oReturn == null || oReturn.result == null) {
				// 请求发送失败
				return false;
			}
			// 当前查询请求的状态
			var bStatus = oReturn.result.status;
			switch (bStatus) {
			case 10:
				// 等待中
				oThis.askRealQueryResult_Waiting(oReturn.result, oRunParam.dialog);
				break;
			case 20:
				// 查询中
				oThis.askRealQueryResult_Query(oReturn.result, oRunParam.dialog);
				break;
			case 30:
				// 查询完成
				oThis.askRealQueryResult_Complete(oReturn.result, oRunParam.dialog);
				break;
			case 40:
				// 已经提交
				break;
			default:
				// 被取消
				if ((bStatus > 30 && bStatus < 40) || (bStatus < 0)) {
					oThis.stopAskRealQueryResult(oReturn.result, oRunParam.dialog);
					oThis.msg("您的实时查询被服务器取消了！", "提示信息");
				}
			}
		} catch (e) {
		} finally {
		}
	};
	// 当前用户坐标点
	var iPosition = -1;
	if (this.CurrentUser.position != null) {
		iPosition = this.CurrentUser.position;
	}
	// 复制参数
	var oParam = $.extend({}, oRunParam, {
		url : null,
		dialog : null,
		position : iPosition
	});
	// Url
	var strUrl = oThis.getAppName() + oRunParam.url;
	// 发出请求
	doAction(strUrl, oParam, fn);
	// 返回函数值
	return true;
};

/**
 * @描述:是否存在一个已经发送的实时查询
 * @开发人员:moshco zhu
 * @开发时间:2011-6-16 上午11:48:29
 * @returns {Boolean}
 */
MyFHUI.prototype.isSendRealQuery = function() {
	// 是否发送了查询请求
	var bIsSendRealQuery = false;
	// 异步函数
	var fn = function(strJs) {
		// strJs不能为空
		if (strJs == null || strJs == "") {
			msg("请求发送失败！", "提示信息");
			return false;
		}
		// 转换为JSon对象
		var oReturn = null;
		eval("oReturn = " + strJs + ";");
		if (oReturn == null || oReturn.result == null) {
			msg("请求发送失败！", "提示信息");
			return false;
		}
		if (oReturn != null && oReturn.result != null) {
			bIsSendRealQuery = oReturn.result.isSendQueryRequest;
			return true;
		}
		return true;
	};
	// 发送请求
	var strUrl = this.appName + this.urlIsSendRealQuery;
	doAction(strUrl, null, fn, false);
	// 返回函数值
	return bIsSendRealQuery;
};

/**
 * @描述:取消实时查询请求
 * @开发人员:moshco zhu
 * @开发时间:2011-6-16 下午12:50:27
 * @param oBtn
 * @returns {Boolean}
 */
MyFHUI.prototype.cancelRealQuery = function(oBtn) {
	// 对象别名
	var oThis = this;
	// 异步函数
	var fn = function(strJs) {
		// strJs不能为空
		if (strJs == null || strJs == "") {
			msg("请求发送失败！", "提示信息");
			return false;
		}
		// 读取结果
		var oReturn = null;
		eval("oReturn = " + strJs + ";");
		if (oReturn == null || oReturn.result == null) {
			msg("请求发送失败！", "提示信息");
			return false;
		}
		if (oReturn.result.isSuccess) {
			// 停止询问查询结果
			var oDialog = oThis.AskRealQueryResultTask.runParam.dialog;
			oThis.stopAskRealQueryResult(null, oDialog);
			// 设置能够再次开始新的实时查询
			oThis.setStartNewRealQueryable();
			// 取消成功
			oThis.msg("实时查询请求取消成功！", "提示信息");
			// 返回函数值
			return true;
		} else {
			// 取消失败
			msg("查询请求取消失败！", "提示信息");
		}
		// 返回函数值
		return false;
	};
	// Url
	var strUrl = oThis.getAppName() + this.urlCancelRealQuery;
	// 发出请求
	doAction(strUrl, {}, fn);
	// 返回函数值
	return true;
};

/**
 * @描述:设置能开始一个新的实时查询
 * @开发人员:moshco zhu
 * @开发时间:2011-6-17 下午02:27:56
 * @returns {Boolean}
 */
MyFHUI.prototype.setStartNewRealQueryable = function() {
	// 将页面上所有实时查询按钮激活 设置单击事件
	var oRealQueryBtns = $(".MyFHUIRealQueryBtn");
	oRealQueryBtns.removeClass("MyFHUIRealQueryBtnInValid");
	oRealQueryBtns.addClass("MyFHUIRealQueryBtnValid");
	oRealQueryBtns.each(function() {
		$(this).attr("onclick", "javascript:return false;");
		$(this).unbind("click").click(function() {
			return startRealQuery($(this));
		});
		return true;
	});
	// 返回函数值
	return true;
};

/**
 * @描述:设置不能开始一个新的实时查询
 * @开发人员:moshco zhu
 * @开发时间:2011-6-17 下午02:26:45
 * @returns {Boolean}
 */
MyFHUI.prototype.setStartNewRealQueryunable = function() {
	// 将页面上所有实时查询按钮置灰 取消单击事件
	var oRealQueryBtns = $(".MyFHUIRealQueryBtn");
	oRealQueryBtns.removeClass("MyFHUIRealQueryBtnValid");
	oRealQueryBtns.addClass("MyFHUIRealQueryBtnInValid");
	oRealQueryBtns.each(function() {
		$(this).unbind("click");
		$(this).attr("onclick", "javascript:return false;");
		return true;
	});
	// 返回函数值
	return true;
};

/**
 * @描述:显示选择用户地址的对话框
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 下午01:32:51
 * @param strFormData
 */
MyFHUI.prototype.showSelectUserAddress = function(strFormData) {
	// 对象别名
	var oThis = this;
	// 显示对话框
	var oDialog = this.showDialog(this.urlSelectUserAddressDialog, "请选择配送地址");
	oDialog.showClose().setWidth(460, false).setMarginLeft(($(window).width() / 2) + 120);
	// 序列化表单数据
	oDialog.Container.find(".MyFHUISelectUserAddressDialog").attr("form_data", strFormData);
	// 返回函数值
	return true;
};

/**
 * @描述:显示添加用户地址
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 下午04:10:22
 * @param oBtn
 * @returns
 */
MyFHUI.prototype.showAddUserAddress = function(oBtn) {
	// 读取实时查询表单数据
	var oDialog = oBtn.parents(".MyFHUISelectUserAddressDialog");
	var strFormData = oDialog.attr("form_data");
	// 对话框对象
	var oDialog = this.showDialog(this.urlShowAddUserAddressDialog, "请填写送票地址信息");
	oDialog.setWidth(460, false).setMarginLeft(($(window).width() / 2) + 120);
	// 序列化表单数据
	oDialog.Container.find(".MyFHUIAddUserAddressDialog").attr("form_data", strFormData);
	// 初始化组件
	initBaseUIComponent(oDialog.Container, true);
	// 设置默认标题
	setDefaultTitle($(oDialog.Container));
	// 返回函数值
	return oDialog;
};

/**
 * @描述:取消添加用户地址
 * @开发人员:moshco zhu
 * @开发时间:2011-6-16 上午10:40:13
 * @param oBtn
 * @returns
 */
MyFHUI.prototype.cancelAddUserAddress = function(oBtn) {
	// 读取实时查询表单数据
	var oDialog = oBtn.parents(".MyFHUIAddUserAddressDialog");
	var strFormData = oDialog.attr("form_data");
	// 显示对话框：选择用户地址
	return this.showSelectUserAddress(strFormData);
};

/**
 * @描述:保存用户地址
 * @开发人员:moshco zhu
 * @开发时间:2011-6-16 上午10:39:57
 * @param oBtn
 * @returns
 */
MyFHUI.prototype.saveUserAddress = function(oBtn) {
	// 对象别名
	var oThis = this;

	// 异步函数
	var fn = function(strJs) {
		// alert(strJs);
		if (strJs == null || strJs == "") {
			msg("请求发送失败！", "提示信息");
			return false;
		}
		// 转换为JSon对象
		var oResult = null;
		eval("oResult = " + strJs + ";");
		if (oResult == null) {
			msg("请求发送失败！", "提示信息");
			return false;
		}
		// 登录失败
		if (!oResult.isSuccess) {
			// 提示信息
			if (oResult.msg != null && oResult.msg != "") {
				msg(oResult.msg, "提示信息");
			}
			return false;
		}

		// 读取实时查询表单数据
		var oDialog = oBtn.parents(".MyFHUIAddUserAddressDialog");
		var strFormData = oDialog.attr("form_data");
		// 显示对话框：选择用户地址
		return oThis.showSelectUserAddress(strFormData);
	};
	// 验证表单数据
	var fnVerifyForm = function(oFormData) {
		// 收票人姓名不能为空
		if (oFormData["newUserAddress.contact"] == null || oFormData["newUserAddress.contact"] == "") {
			msg("收票人姓名输入不能为空！");
			return false;
		}
		// 地址不能输入为空
		if (oFormData["newUserAddress.area"] == null || oFormData["newUserAddress.area"] == "") {
			msg("地址不能输入为空！");
			return false;
		}
		// 详细地址输入不能为空
		if (oFormData["newUserAddress.address"] == null) {
			msg("详细地址输入不能为空！");
			return false;
		}
		// 身份证号码不能为空
		if (oFormData["newUserAddress.identityCardCode"] == null || oFormData["newUserAddress.identityCardCode"] == "") {
			msg("身份证号码不能为空");
			return false;
		}
		// 身份证不能为空
	    var strIdentityCardCode = (oFormData["newUserAddress.identityCardCode"] == null) ? null : oFormData["newUserAddress.identityCardCode"];
		if (strIdentityCardCode != null && strIdentityCardCode != "" && (((strIdentityCardCode.length != 15 && strIdentityCardCode.length != 18)))) {
			msg("请输入正确的身份证号码");
			return false;
		}
		// 验证通过
		return true;
	};

	// 表单对象
	var oForm = oBtn.parents("form");
	// 读取Action Url
	var strActionUrl = this.appName + oBtn.attr("actionUrl");
	// 读取表单内所有参数
	var oFormData = getFormData(oForm);
	if (!fnVerifyForm(oFormData)) {
		return false;
	}
	// 删除不需要的属性字段
	var strFields = "";
	strFields += "newUserAddress:contact,province,city,area,address,identityCardCode";
	oFormData = onlyContain(oFormData, strFields);
	// 发出请求
	doAction(strActionUrl, oFormData, fn);
	// 返回函数值
	return false;
};

/**
 * @描述:显示消息
 * @开发人员:moshco zhu
 * @开发时间:2011-6-16 上午10:56:49
 * @param strMsg
 * @param strTitle
 * @returns
 */
MyFHUI.prototype.msg = function(strMsg, strTitle) {
	// 对话框容器
	var oDialogContainer = this.Container.find(".MyFHUIDialogContainer");
	// 创建对话框
	var oDialog = nmdialog("<br>" + strMsg, "关闭", null, oDialogContainer, null);
	oDialog.setTitleIcon("FHBaseUIDialogTitleMidIcon1");
	// oDialog.hideButton();
	// oDialog.setMarginLeft(($(window).width() / 2) + 220);
	oDialog.setMarginTop($(window).scrollTop() + 200);
	if (strTitle != null) {
		oDialog.setTitle(strTitle);
	} else {
		oDialog.setTitle("提示信息");
	}
	// $(".dialog").find(">div").fadeOut(0).fadeIn(1000);
	// 返回函数值
	return oDialog;
};

/**
 * @描述:显示对话框
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 下午01:27:25
 * @param strUrl
 * @param strTitle
 * @returns
 */
MyFHUI.prototype.showDialog = function(strUrl, strTitle) {
	// 读取对话框的Html代码
	var strDialogUrl = this.appName + strUrl;
	var strHtml = readHtml(strDialogUrl);
	// 创建对话框
	var oDialogContainer = this.Container.find(".MyFHUIDialogContainer");
	var oDialog = nmdialog(strHtml, null, null, oDialogContainer, null);
	// var oDialog = mNoBorderDialog(strHtml, null, null, $(".dialog"), null);
	oDialog.hideButton();
	oDialog.hideClose();
	oDialog.setTitleIcon("FHBaseUIDialogTitleMidIcon1");
	oDialog.setMarginLeft(($(window).width() / 2) + 220);
	oDialog.setMarginTop($(window).scrollTop() + 200);
	oDialog.setTitle(strTitle);
	// 返回函数值
	return oDialog;
};

/**
 * ------------------------------------------------------------------------------------------------------------
 */

/**
 * @描述：启动程序
 * @开发人员：moshco zhu
 * @开发时间：2011-6-15 上午11:00:49
 */
MyFHUI.prototype.run = function() {

	// 启动定时任务
	if (this.isRunTimeTask) {
		// 定时任务
		this.TimeTask = new FHTimeTask({
			intervalDuration : this.timeTaskIntervalDuration,
			taskArraySize : 50,
			name : "TimeTask_MyFHUI",
			tasks : null
		});
		// 启动
		this.TimeTask.startTimeTask();

		// 开始执行在线打点
		if (this.isDotOnline) {
			this.startDotOnline();
		}
	}
	// 设置所有的实时查询按钮可用
	this.setStartNewRealQueryable();

	// 是否存在已经提交的实时查询请求
	if (this.isSendRealQuery()) {
		// 显示对话框：等待中
		var oDialog = this.showDialog(this.urlWaitRealQueryDialog, "实时购票");
		// 闪动
		flash(oDialog.Container.find(".MyFHUIWaitRealQueryDialogQueueLength"), "");
		// 开始排队等待
		this.waitRealQueryResult(oDialog);
	}

	// 返回函数值
	return true;
};

/**
 * @描述:用户停止在线打点
 * @开发人员:moshco zhu
 * @开发时间:2011-5-25 下午05:43:14
 * @param strUrl
 */
MyFHUI.prototype.stopDotOnline = function() {
	if (this.isDotOnline && this.DotOnlineTask != null) {
		this.DotOnlineTask.isRun = function() {
			return false;
		};
		this.DotOnlineTask.run = function() {
			return false;
		};
		this.TimeTask.removeTimeTask(this.DotOnlineTask);
		return true;
	}
	return false;
};

/**
 * @描述：执行在线打点
 * @开发人员：moshco zhu
 * @开发时间：2011-6-15 上午10:17:35
 */
MyFHUI.prototype.dotOnline = function(oRunParam) {
	// 对象别名
	var oThis = this;

	// 在线打点异步函数
	var fnDotOnlineResult = function(strJs) {
		if (strJs == null || strJs == "") {
			return false;
		}
		// 将字符串转换为JSon对象
		var oReturn = null;
		eval("oReturn = " + strJs + ";");
		// 读取统计数据
		if (oReturn == null || oReturn.result == null) {
			return false;
		}
		// 读取用户当前坐标序号
		var oResult = oReturn.result;
		var iPosition = oResult.position;
		if (iPosition >= 0) {
			oThis.CurrentUser.position = iPosition;
		}

		// 调式信息
		var oTask = oThis.DotOnlineTask;
		var str = "";
		// str += strJs;
		str += "&nbsp;出错：" + oTask.errorNum;
		str += "&nbsp;失败：" + oTask.failNum;
		str += "&nbsp;成功：" + oTask.successNum;
		str += "&nbsp;总计：" + oTask.runNum;
		str += "&nbsp;&nbsp;正在发送请求......";
		// msg("hello,定时任务！" + iPosition + " " + str, "在线打点 调式", 2500);
		// 返回函数值
		return true;
	};

	// 复制参数
	var oParam = $.extend({}, oRunParam, {
		url : null
	});
	// Url
	var strUrl = oThis.getAppName() + oRunParam.url;
	// 发出请求
	doAction(strUrl, oParam, fnDotOnlineResult);
	// 返回函数值
	return true;
};

/**
 * @描述:开始执行在线打点
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 上午09:45:37
 */
MyFHUI.prototype.startDotOnline = function() {
	// 对象别名
	var oThis = this;
	// 任务对象
	this.DotOnlineTask = {
		code : randomNum(6),
		intervalDuration : 3000,
		runParam : {
			url : oThis.urlDotOnline,
			position : -1
		},
		isRun : function(oTask) {
			var str1 = oTask.code;
			var str2 = oThis.DotOnlineTask.code;
			return (str1 == str2) ? true : false;
		},
		run : function(oRunParam) {
			return oThis.dotOnline(oRunParam);
		},
		runNum : 0,
		successNum : 0,
		failNum : 0,
		errorNum : 0
	};
	// 加入到执行队列
	this.TimeTask.addTimeTask(this.DotOnlineTask);
	// 返回函数值
	return true;
};

/**
 * @描述:销毁内部数据
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 上午10:55:31
 */
MyFHUI.prototype.destroy = function() {
	// 停止定时打点任务
	this.stopDotOnline();
	// 销毁定时任务
	this.TimeTask.runTimeTask = function() {
		return false;
	};
	this.TimeTask.tasks = null;
	this.TimeTask = null;
	// 关闭对话框
	this.Container.find(".MyFHUIDialogContainer").empty();
	// 设置所有的实时查询按钮可用
	this.setStartNewRealQueryable();
	// 返回函数值
	return true;
};

/**
 * ------------------------------------------------------------------------------------------------------------
 */

/**
 * @描述：取消实时查询
 * @开发人员：moshco zhu
 * @开发时间：2011-6-16 上午11:09:22
 */
MyFHUI.cancelRealQuery = function(oBtn) {
	if (MyUI == null) {
		msg("请先登录，如果您已经登录，请刷新页面！");
		return false;
	}
	return MyUI.cancelRealQuery(oBtn);
};

/**
 * @描述：提交实时查询
 * @开发人员：moshco zhu
 * @开发时间：2011-6-16 上午10:44:31
 */
MyFHUI.submitRealQuery = function(oBtn) {
	if (MyUI == null) {
		msg("请先登录，如果您已经登录，请刷新页面！");
		return false;
	}
	return MyUI.submitRealQuery(oBtn);
};

/**
 * @描述：取消添加用户地址
 * @开发人员：moshco zhu
 * @开发时间：2011-6-16 上午10:25:48
 */
MyFHUI.cancelAddUserAddress = function(oBtn) {
	if (MyUI == null) {
		msg("请先登录，如果您已经登录，请刷新页面！");
		return false;
	}
	return MyUI.cancelAddUserAddress(oBtn);
};

/**
 * @描述：保存用户地址
 * @开发人员：moshco zhu
 * @开发时间：2011-6-16 上午10:26:14
 */
MyFHUI.saveUserAddress = function(oBtn) {
	if (MyUI == null) {
		msg("请先登录，如果您已经登录，请刷新页面！");
		return false;
	}
	return MyUI.saveUserAddress(oBtn);
};

/**
 * @描述:显示添加用户地址
 * @开发人员:moshco zhu
 * @开发时间:2011-6-16 上午10:13:18
 * @param oBtn
 * @returns
 */
MyFHUI.showAddUserAddress = function(oBtn) {
	if (MyUI == null) {
		msg("请先登录，如果您已经登录，请刷新页面！");
		return false;
	}
	return MyUI.showAddUserAddress(oBtn);
};

/**
 * @描述:开始发送实时查询
 * @开发人员:moshco zhu
 * @开发时间:2011-6-16 上午10:03:05
 * @param oBtn
 * @returns
 */
MyFHUI.startRealQuery = function(oBtn) {
	if (MyUI == null) {
		msg("请先登录，如果您已经登录，请刷新页面！");
		return false;
	}
	return MyUI.startRealQuery(oBtn);
};

/**
 * @描述:验证用户是否已经登录
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 上午11:23:10
 * @param strVerifyUrl
 * @param oCurrentUser
 * @returns {Boolean}
 */
MyFHUI.isLoginUser = function(strVerifyUrl, oCurrentUser) {
	// 是否登录
	var bIsLogin = false;
	// 同步函数
	var fn = function(strJs) {
		// strJs不能为空
		if (strJs == null) {
			return false;
		}
		// 转换为JSon对象
		var oResult = null;
		eval("oResult = " + strJs + ";");
		if (oResult == null) {
			return false;
		}
		// 返回登录结果
		bIsLogin = oResult.isLogin;
		// 将当前用户帐号扩展到对象
		if (oCurrentUser != null) {
			oCurrentUser = $.extend(oCurrentUser, oResult.currentUser);
		}
	};
	// 发出请求
	doAction(strVerifyUrl, null, fn, false);
	// 返回函数值
	return bIsLogin;
};

/**
 * @描述:用户登录
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 上午10:59:09
 * @param oBtn
 * @param oRefreshSection
 */
MyFHUI.loginUser = function(oBtn, oRefreshSection) {
	// 登录异步函数
	var fn = function(strJs) {
		// strJs不能为空
		if (strJs == null || strJs == "") {
			msg("请求发送失败！", "提示信息");
			return false;
		}
		// 转换为JSon对象
		var oResult = null;
		eval("oResult = " + strJs + ";");
		if (oResult == null) {
			msg("请求发送失败！", "提示信息");
			return false;
		}
		// 登录失败
		if (!oResult.isSuccess) {
			// 提示信息
			if (oResult.msg != null && oResult.msg != "") {
				msg(oResult.msg, "提示信息");
			}
			oRefreshSection.find(".security_code_img").click();
			return false;
		}
		// 登录成功 刷新登录区域
		var strActionUrl = oBtn.parents("form").attr("action");
		doAction(strActionUrl, {
			doWith : "show_form"
		}, function(strHtml) {
			oRefreshSection.html(strHtml);
			return true;
		});
		// 返回函数值
		return true;
	};
	// 登录表单
	var oForm = oBtn.parents("form");
	if (oForm.length == 0) {
		return;
	}
	// 读取请求的Url
	var strActionUrl = oForm.attr("action");
	// 读取表单内所有参数
	var oFormData = getFormObjectData(oForm);
	// 发出请求
	doAction(strActionUrl, oFormData, fn);
	// 返回函数值
	return true;
};

/**
 * @描述:用户登出
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 上午11:11:53
 * @param strUrl1
 * @param strUrl2
 * @param oRefreshSection
 * @returns {Boolean}
 */
MyFHUI.logoutUser = function(strUrl1, strUrl2, oRefreshSection) {
	// 异步函数
	var fn = function(strJs) {
		// 登出成功 刷新登录区域
		doAction(strUrl2, null, function(strHtml) {
			// 销毁对象
			if (MyUI != null) {
				MyUI.destroy();
				MyUI = null;
			}
			// 刷新登录区域
			oRefreshSection.html(strHtml);
			// 返回函数值
			return true;
		});
		// 返回函数值
		return true;
	};
	// 发出请求
	doAction(strUrl1, null, fn);
};

/**
 * @描述:设置按钮回车登录事件
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 上午11:20:47
 * @param oBtn
 * @param oRefreshSection
 * @returns {Boolean}
 */
MyFHUI.enterLoginUser = function(oBtn, oRefreshSection) {
	// 事件代码
	if (window.event != null) {
		switch (window.event.keyCode) {
		case 13:
			loginUser(oBtn, oRefreshSection);
			break;
		}
	}
	// 返回函数值
	return true;
};

/**
 * @描述:初始化我的风火
 * @开发人员:moshco zhu
 * @开发时间:2011-6-15 上午10:57:59
 * @param oContainer
 * @returns {Boolean}
 */
MyFHUI.initMyFHUI = function(oContainer) {
	// 虚拟主机名称
	var strAppName = oContainer.attr("appName");
	// 是否要运行定时任务
	var strIsRunTimeTask = oContainer.attr("isRunTimeTask");
	var bIsRunTimeTask = false;
	// 定时任务的间隔时长（单位：毫秒）
	var lTimeTaskIntervalDuration = -1;
	if (strIsRunTimeTask != null) {
		strIsRunTimeTask = strIsRunTimeTask.toLowerCase();
		if ((strIsRunTimeTask == "true") || (strIsRunTimeTask == "1") || (strIsRunTimeTask == "yes")) {
			bIsRunTimeTask = true;
			// 定时任务的间隔时长（单位：毫秒）
			var strTimeTaskIntervalDuration = oContainer.attr("timeTaskIntervalDuration");
			lTimeTaskIntervalDuration = 3000;
			if (!isNaN(parseInt(strTimeTaskIntervalDuration))) {
				lTimeTaskIntervalDuration = parseInt(strTimeTaskIntervalDuration);
			}
		}
	}
	// 是否要执行在线打点
	var strIsDotOnline = oContainer.attr("isDotOnline");
	var bIsDotOnline = false;
	// 执行在线打点的Url
	var strUrlDotOnline = null;
	if (strIsDotOnline != null) {
		strIsDotOnline = strIsDotOnline.toLowerCase();
		if ((strIsDotOnline == "true") || (strIsDotOnline == "1") || (strIsDotOnline == "yes")) {
			bIsDotOnline = true;
			strUrlDotOnline = oContainer.attr("urlDotOnline");
		}
	}
	// 验证用户是否登录的Url
	var strUrlIsLoginUser = oContainer.attr("urlIsLoginUser");
	// 验证用户是否已经发送了实时查询请求
	var strUrlIsSendRealQuery = oContainer.attr("urlIsSendRealQuery");
	// url 对话框：提醒用户登录
	var strUrlRemindUserLoginDialog = oContainer.attr("urlRemindUserLoginDialog");
	// url 对话框：选择用户地址
	var strUrlSelectUserAddressDialog = oContainer.attr("urlSelectUserAddressDialog");
	// url 对话框：显示添加用户地址
	var strUrlShowAddUserAddressDialog = oContainer.attr("urlShowAddUserAddressDialog");
	// url 对话框：正在发送实时查询的请求
	var strUrlSendingRealQueryDialog = oContainer.attr("urlSendingRealQueryDialog");
	// url Action：提交实时查询的请求
	var strUrlSubmitRealQuery = oContainer.attr("urlSubmitRealQuery");
	// url 对话框：等待实时查询的结果
	var strUrlWaitRealQueryDialog = oContainer.attr("urlWaitRealQueryDialog");
	// url 对话框：实时查询 查询中...
	var strUrlRealQueryInquiresDialog = oContainer.attr("urlRealQueryInquiresDialog");
	// url 询问实时查询的结果
	var strUrlAskRealQueryResult = oContainer.attr("urlAskRealQueryResult");
	// url 取消实时查询
	var strUrlCancelRealQuery = oContainer.attr("urlCancelRealQuery");
	// url 对话框：实时查询完成
	var strUrlRealQueryCompleteDialog = oContainer.attr("urlRealQueryCompleteDialog");

	// 读取参数
	var oParam = {
		appName : strAppName,
		isRunTimeTask : bIsRunTimeTask,
		timeTaskIntervalDuration : lTimeTaskIntervalDuration,
		isDotOnline : bIsDotOnline,
		urlIsSendRealQuery : strUrlIsSendRealQuery,
		urlDotOnline : strUrlDotOnline,
		urlIsLoginUser : strUrlIsLoginUser,
		urlRemindUserLoginDialog : strUrlRemindUserLoginDialog,
		urlSelectUserAddressDialog : strUrlSelectUserAddressDialog,
		urlShowAddUserAddressDialog : strUrlShowAddUserAddressDialog,
		urlSendingRealQueryDialog : strUrlSendingRealQueryDialog,
		urlSubmitRealQuery : strUrlSubmitRealQuery,
		urlWaitRealQueryDialog : strUrlWaitRealQueryDialog,
		urlRealQueryInquiresDialog : strUrlRealQueryInquiresDialog,
		urlAskRealQueryResult : strUrlAskRealQueryResult,
		urlCancelRealQuery : strUrlCancelRealQuery,
		urlRealQueryCompleteDialog : strUrlRealQueryCompleteDialog
	};
	// 销毁之前的对象
	if (MyUI != null) {
		MyUI.destroy();
	}
	// 创建UI
	var oCurrentUser = {};
	if (isLoginUser(strAppName + strUrlIsLoginUser, oCurrentUser)) {
		// 创建全局变量对象
		MyUI = new MyFHUI(oContainer, $.extend(oParam, {
			currentUser : oCurrentUser
		}));
		// 开始运行
		MyUI.run();
	}

	// 返回函数值
	return true;
};

// 扩展到window对象
if (window.isExtendMyFHUI == null || !window.isExtendMyFHUI) {
	// 将MyFHUI静态方法扩展到window对象
	$.extend(window, MyFHUI);
	// 设置已经扩展
	window.isExtendMyFHUI = true;
}

// 全局变量
var MyUI = null;

