/**
 * 主要Widget、组件的接口定义文件。应尽量精简，使用按需装载的方式处理。与global.js的区别：主要是提供富客户端的组件。
 */
//Ext.BLANK_IMAGE_URL = __ctxPath+'/images/default/s.gif';

var closeHandler=function(){return true;};

var dlgInsertImg=null;
function getInsertImageDialog() {
	if (dlgInsertImg==null) {
		dlgInsertImg = fnCreateDialog("InsertImage","Upload Image:",null,{
			staticDialogUrl:__ctxPath+"/other/browseImageToUpload.html?decorator=blank",
			dialogButtons:[{text:__FMT.button_add, handler:fnUploadImageHandler}, {text:__FMT.button_close, handler:globalUploadCallback}],
			cacheEnabled:true,
			dialogWidth:"480px",
			dialogHeight:"240px"
		});
	}
	return dlgInsertImg;
}
function fnUploadImageHandler(){
	var fileName = $("file_insert_image").value.toLowerCase();
	if (fileName.indexOf(".gif")==-1 && fileName.indexOf(".jpg")==-1) {
		alert("Only image files are supported!");
		return false;
	}
	autoCreateUploadFrame();
	$("frmInsertImage").submit();
	fnShowUploadLightWaitMsg();
	return true;
}

/**
 * 以下三个方法为从Ext引入的显示简单信息的方法。
 */
var boxTempl = null;
function fnGetBoxTempl() {
	if (boxTempl==null) {
		boxTempl = new Ext.Template(
		'<div class="info-box">',
		'<div class="x-box-tl"><div class="x-box-tr"><div class="x-box-tc"></div></div></div>',
		'<div class="x-box-ml"><div class="x-box-mr"><div class="x-box-mc">{title}{content}</div></div></div>',
		'<div class="x-box-bl"><div class="x-box-br"><div class="x-box-bc"></div></div></div>',
		'</div>'
		);
		boxTempl.compile();
	}
	return boxTempl;
}
var msgCt=null;
function msgbox(title, sMsg){
	if (Ext!=null) {
		if (msgCt==null) {
			msgCt=Ext.DomHelper.insertFirst(document.body, {id:'msg-div'}, true);
			msgCt.alignTo(document, 't-t');
		}
	    _msgbox(title, sMsg);
	} else {
   		log(sMsg);
   	}
}
function _msgbox(title, sMsg){
    msgCt.alignTo(document, 't-t');
    var tmpTitle="<h3>"+title+"</h3>";
    var m = fnGetBoxTempl().append(msgCt,{title:tmpTitle,content:sMsg},true);
    m.slideIn('t').pause(3).ghost("t", {remove:true});
}

function sysMsg(sMsg,persist) {
	msgbox("System messages:",sMsg);
	if (false!=persist && $("iframeSaveRecentView")) {
		window.setTimeout("document.getElementById(\"iframeSaveRecentView\").contentWindow.fnSaveHistoryMsg(\""+sMsg+"\")",1000);
	} 
}
/**
 * HelpTips开始
 */
var currentHelpEl=null;
var currentHelpBox=null;
var helpCt=null;
function _showHelpTip(el,helpTipHtml){
	if (Ext!=null) {
		if (helpCt==null) {
			helpCt=Ext.DomHelper.insertFirst(document.body, {id:'helptip-div'}, true);
			helpCt.alignTo(document, 't-t');
		}
		__showHelpTip(el,helpTipHtml);
	}
}
/**直接显示帮助信息*/
function __showHelpTip(el,helpTipHtml){
    if (currentHelpBox!=null && currentHelpBox.hasActiveFx()) {
    	currentHelpBox.stopFx();
    	currentHelpBox.remove();
    }
    if (el==null) {
    	helpCt.alignTo(document.body, 'tr-tr');
    } else {
    	helpCt.alignTo(el,"tl-br");
    }
    currentHelpBox = fnGetBoxTempl().append(helpCt,{title:"",content:helpTipHtml},true);
    currentHelpBox.slideIn('t').pause(5).ghost("t", {remove:true});
}
/**显示远程的帮助信息，通过DWR来读*/
function showElementHelp(el,helpCode) {
	currentHelpEl = el;
	if (helpDwr) {
		helpDwr.searchHelp(helpCode,__ctxPath, remoteHelpCallback);
	}
}
function showPageHelp() {
	currentHelpEl=null;
	if (helpDwr) {
		helpDwr.searchHelp("",__ctxPath, remoteHelpCallback);
	}
}
function remoteHelpCallback(helpData) {
	var sHtml="";
	if (helpData.length>0) {
		for (var i = 0; i < helpData.length; i++) {
			sHtml=sHtml+"<div>"+helpData[i].helpTitle+"</div>"+"<div>"+helpData[i].helpContent+"</div>";
		}
	} else {
		sHtml+="<div>No help items found!</div>";
	}
	sHtml+="<br/><div><a onclick='alert(\"TODO\");'>Edit TODO</a></div>";
	_showHelpTip(currentHelpEl,sHtml);
}
function fnEditHelp(helpCode) {
}
/**
 * HelpTips结束
 */

/**把一个已经存在的TextArea转换为一个RTE（HTML在线编辑器），如需要保存此handler通过callback处理*/
function applyHtmlEditor(textAreaId,width,height,imageCategory,_callback) {
	$import(["/styles/ext-all.css"]);
	$import(["/scripts/probiz/framework/probizUpload.js","/scripts/probiz/framework/probizExt.js"],function(){
		var rte=new Probiz.HtmlEditor({
			id:textAreaId,
			width:width || 600,
			height:height || 300,
			imageCategory:imageCategory
		});
		if ($(textAreaId).getAttribute("validconf")) {
			rte.addListener("sync",function() {
				validateField($(textAreaId));
			});
		}
		rte.applyTo(textAreaId);
		if (_callback) {
			_callback.call(this,rte);
		}
	});
}
/**把一个已经存在的输入框（input type=text）转换为一个日期选择器*/
function applyDatePicker(fieldId,required) {
	var oDateField=new Ext.form.DateField({
		format:extDateFormat,
		altFormat:"Y-m-d",
		allowBlank:required?false:true
	});
	oDateField.applyTo(fieldId);
	return oDateField;
}
/**注意：使用Prototype的AJAX，所以被装入的页面的JS的写法要符合Prototype的规范。详见见文档说明。*/
function fillDivWithPage2(prmDivId, prmUrl, postOrGet, async, prms) {
	new Ajax.Updater(prmDivId, prmUrl, {method: postOrGet?postOrGet:'get', asynchronous: async?async:true, evalScripts:true, parameters: prms?prms:{}});
}
function fnGetOrCreateDialog(dialogId, dialogTitle, dialogContent, config) {
	return fnCreateDialog(dialogId, dialogTitle, dialogContent, config);
}
function closeDialog(dialogId) {
	var dlg=getDialog(dialogId);
	if (dlg) {
		dlg.closeDialog();
	}
}
function getDialog(dialogId) {
	return Ext.DialogManager.get("divDlg"+dialogId);
}
/**
 * 方便的创建dialog的方法，需要指定id，title，config等；而dialogContent为可选，可设为null或""
 * dialogContent可以是html字符串或div等的dom对象。如果非空，其值或innerHTML作为dialog的内容。
 * config可以是Probiz.Dialog里面的所有配置。
 */
function fnCreateDialog(dialogId, dialogTitle, dialogContent, config){
	var strDialogId = "divDlg"+dialogId;
	if ($(strDialogId)) {
		return getDialog(dialogId);
	}
	var oDiv = document.createElement("div");
	oDiv.id=strDialogId;
	var oDivTitle = document.createElement("div");
	oDivTitle.className="x-dlg-hd";
	oDivTitle.innerHTML=dialogTitle;
	var divContentDom = document.createElement("div");
	divContentDom.className="x-dlg-bd";
	if (typeof dialogContent=="string" && dialogContent.trim().length>=0) {
		divContentDom.innerHTML=dialogContent;
	} else if (dialogContent!==null) {
		divContentDom.appendChild(dialogContent);
	}
	oDiv.appendChild(oDivTitle);
	oDiv.appendChild(divContentDom);
	var dialogParentDom=config.parentDom||document.body;
	dialogParentDom.appendChild(oDiv);
	
	config.dialogId=dialogId;
	config.fillContentDivId = config.fillContentDivId||divContentDom;

	return new Probiz.Dialog(config);
}

/**
 * 为已经存在的输入框添加文件上载功能。
 * ori_field为输入框，必须，需要已经存在，需要有id，上传后的url会回填在这个输入框，url只有ctxPath后面的相对路径。
 * category是文件上载后分类存放的类别，可选，缺省others。
 * suffixs为需要支持的后缀列表，可选，可以是逗号分隔的字符串或数组，缺省gif,jpg。如要支持任意文件则应传入空数组。
 * callback是回调方法，可选，缺省只会回填然后清空。
 * 返回创建的Probiz.UploadField实例，但极少需要直接使用。
 */
function fnApplyUpload(ori_field, category, suffixs, callback, onSelectCallback) {
	$importSync("/scripts/probiz/framework/probizUpload.js");
	if (!ori_field || !ori_field.id) {
		alert("Invalid input field, or id not defined.");
		return false;
	}
	var uf = new Probiz.UploadField();
	uf.init(ori_field, category, suffixs, callback, onSelectCallback);
	return uf;
}
/**
 * StoreFront专用。发送信息给指定用户，并可预设标题和内容（相当于静态的模版），还可设置相关的工作件，例如产品/订单的no。只有前两个是必须的。信息类型缺省是普通信息。
 */
function fnSendMsgProxyWithLogin(receiverId,receiverName,messageType,relatedElementId,presetSubject,presetContent) {
	doRequiredLoginAction(function () {
		fnSendMsgProxy(receiverId,receiverName,messageType,relatedElementId,presetSubject,presetContent);
	});
}
/**不是StoreFront的时候用这个，跳过登录检查。*/
function fnSendMsgProxy(receiverId,receiverName,messageType,relatedElementId,presetSubject,presetContent) {
	$importMost(function(){
		fnSendMsg(receiverId,receiverName,messageType,relatedElementId,presetSubject,presetContent);
	});
}

var _probizDialogs=new Array(); 
//currentDialog应永远指向dialog列表的最后一个或null，z-index总是递增10
var currentDialog=null;
var _dialogZIndex=10000;
var dialogIdPrefix="divDlg";
Probiz.SimpleDialog = function(config){
	var dialogId=config.dialogId;
	//创建dialog的外层
	var dlgModalDom = document.createElement("div");
	dlgModalDom.id=dialogIdPrefix+dialogId;
	dlgModalDom.style.display="none";
	dlgModalDom.className="dlg-modal";
	dlgModalDom.style.height=(document.documentElement.scrollHeight||document.body.scrollHeight)+"px";
	var dlgParentDom=config.parentDom||document.body;
	dlgParentDom.appendChild(dlgModalDom);	
	dlgModalDom.innerHTML=_getDlgBoxHtml(dialogId,config.dialogTitle);
	//如果指定dialogContent（可以是Loading...之类的）则填充
	var divContentDom=$("_dlgContBox"+dialogId);
	var dialogContent=config.dialogContent;
	if (typeof dialogContent=="string" && dialogContent.trim().length>=0) {
		divContentDom.innerHTML=dialogContent;
	} else if (dialogContent!==null) {
		divContentDom.appendChild(dialogContent);
	}
	//设置处理方法等
	var staticDialogUrl = config.staticDialogUrl;
	var cacheEnabled = config.cacheEnabled||true;
	var onshowHandler = config.onshowHandler;
	var _savedOnshowHandler=null;
	var fillContentDivId = config.fillContentDivId||divContentDom;
	var savedDialogPageUrl=null;
	
	var _fnOnshowHandlerProxy=function() {
		if (_savedOnshowHandler) {
			if (typeof _savedOnshowHandler=="function") {
				_savedOnshowHandler.call(this);
			} else {
				eval(_savedOnshowHandler+"()");
			}
		}
		//设置dialog的大小和位置
		divContentDom.style.width=config.width||config.dialogWidth||"600px";
		divContentDom.style.height=config.height||config.dialogHeight||"300px";
		var dlgDom=$("_dlgBox"+dialogId);
		dlgDom.style.width=(parseInt(divContentDom.style.width)+40)+"px";
		dlgDom.style.left=config.left||Math.round(((parseInt(document.documentElement.clientWidth||document.body.clientwidth)-parseInt(dlgDom.style.width))/2))+"px";
		dlgDom.style.top=config.top||Math.round(((parseInt(document.documentElement.clientHeight||document.body.clientHeight)-parseInt(divContentDom.style.height)-40)/2)+(document.documentElement.scrollTop||document.body.scrollTop))+"px";
		dlgModalDom.style.zIndex=_dialogZIndex+=10;
		dlgModalDom.style.display="block";
		currentDialog=this;
	};

	return {
		/**
		 * 显示窗口，如指定了url则先读取页面（异步）填充到指定位置，然后显示，接着调用onShowHandler（如果有），里面还可进行数据填充等处理。
		 */
		showDialog : function (dynamicPageUrl,dynamicOnshowHandler) {
			_savedOnshowHandler=dynamicOnshowHandler||onshowHandler;
			var _dialogPageUrl=dynamicPageUrl||staticDialogUrl;
			//对动态内容，每次都调用URL;如果是第一次（dialog不存在），或使用URL动态生成对话框模式并且是不可缓存的，就更新对话框的内容
			if (_dialogPageUrl && (!cacheEnabled || _dialogPageUrl!=savedDialogPageUrl)) {
				savedDialogPageUrl=_dialogPageUrl;
				//给login设置inDialog标记解决session过期问题
				_dialogPageUrl=fnAppendUrl(_dialogPageUrl,"inDialog","true");
				fillDivWithPage(fillContentDivId, _dialogPageUrl, null, _fnOnshowHandlerProxy,"GET",true); 
			} else {
				_fnOnshowHandlerProxy();
			}
		},
		closeDialog : function() {
			fnHide(dlgModalDom);
			currentDialog=null;
		},
		getDialogId : function() {
			return dialogId;
		}
	}
};
function getSimpleDialog(dialogId) {
	for (i=0;i<_probizDialogs.length;i++) {
		if (_probizDialogs[i].getDialogId()==dialogId) {
			return _probizDialogs[i];
		}
	}
	return null;
}

function _getDlgBoxHtml(dialogId,dialogTitle) {
    return ['<!--[if lte IE 6.5]><iframe></iframe><![endif]--><div id="_dlgBox',dialogId,'" class="dlg-box"><div class="dlg-title-box"><div class="dlg-title">',
		dialogTitle,'</div><div class="dlg-close-icon"><img src="',__ctxPath,'/images/dialog/close.gif" border="0" alt="',dialogId,'" onclick="closeSimpleDialog(this.alt);" /></div></div>',
		'<div class="dlg-cont-box-out"><div class="dlg-cont-box-in" id="_dlgContBox',dialogId,'"></div></div></div>'].join('');
}
/**
 * 方便的创建dialog的方法，需要指定id，title，config等；而dialogContent可选，可为null或""或
 * html字符串或div等的dom对象。如果非空，其值或对象直接作为dialog的内容。
 * config可以是Probiz.SimpleDialog里面的所有配置。
 */
function fnCreateSimpleDialog(dialogId, dialogTitle, dialogContent, config){
	var _dlg = getSimpleDialog(dialogId);
	if (!_dlg) {
		config.dialogId=dialogId;
		config.dialogTitle=dialogTitle;
		config.dialogContent=dialogContent;
		_dlg=new Probiz.SimpleDialog(config);
		_probizDialogs.push(_dlg);
	} 
	return _dlg;
}
function showSimpleDialog(dialogId) {
	var _dlg=getSimpleDialog(dialogId);
	if (_dlg) {
		_dlg.showDialog();
	}
}
function closeSimpleDialog(dialogId) {
	var _dlg=getSimpleDialog(dialogId);
	if (_dlg) {
		_dlg.closeDialog();
	}
}

