tchao 3 years ago
parent
commit
5c40dfca17
100 changed files with 23677 additions and 0 deletions
  1. 384 0
      web/codegen/js/AttachMent.js
  2. 210 0
      web/codegen/js/Cascadequery.js
  3. 969 0
      web/codegen/js/CustomForm.js
  4. 939 0
      web/codegen/js/FormUtil.js
  5. 807 0
      web/codegen/js/OfficeControl.js
  6. 208 0
      web/codegen/js/OfficePlugin.js
  7. 128 0
      web/codegen/js/SubtablePermission.js
  8. 52 0
      web/commons/403.jsp
  9. 67 0
      web/commons/404.jsp
  10. 39 0
      web/commons/error.jsp
  11. BIN
      web/commons/image/default_image_male.jpg
  12. BIN
      web/commons/image/msg_none.png
  13. BIN
      web/commons/image/msg_own.png
  14. BIN
      web/commons/image/rsjdaqz.png
  15. BIN
      web/commons/image/sp_03.png
  16. BIN
      web/commons/image/sp_07.png
  17. BIN
      web/commons/image/sp_09.png
  18. BIN
      web/commons/image/sp_12.png
  19. BIN
      web/commons/image/sp_14.png
  20. BIN
      web/commons/image/sp_20.png
  21. BIN
      web/commons/image/yanglaozhang.png
  22. 40 0
      web/commons/include/ats.jsp
  23. 40 0
      web/commons/include/easyuiGet.jsp
  24. 33 0
      web/commons/include/form1.jsp
  25. 11 0
      web/commons/include/getById.jsp
  26. 2 0
      web/commons/include/getCtx.jsp
  27. 31 0
      web/commons/include/getJqGrid.jsp
  28. 3 0
      web/commons/include/html_doctype.html
  29. 49 0
      web/commons/include/nodeUserCondition.jsp
  30. 255 0
      web/commons/include/nodeUserConditionJS.jsp
  31. 59 0
      web/commons/include/nodeUserTemplate.jsp
  32. 53 0
      web/commons/include/userNodeRule.jsp
  33. 40 0
      web/commons/noCurrentSite.jsp
  34. 39 0
      web/commons/noRights.jsp
  35. 39 0
      web/commons/notLogin.jsp
  36. BIN
      web/favicon.ico
  37. 5 0
      web/index.jsp
  38. BIN
      web/media/office/NtkoOfficeControlSetup.msi
  39. BIN
      web/media/office/NtkoUnload.exe
  40. BIN
      web/media/office/OfficeControl.cab
  41. BIN
      web/media/office/ntkooledocall.cab
  42. 607 0
      web/media/swf/bpm/doctor.idfl
  43. 61 0
      web/media/swf/bpm/manifest.xml
  44. 777 0
      web/media/swf/bpm/swfobject.js
  45. 1296 0
      web/media/swf/bpm/tap.idfl
  46. 8 0
      web/media/swf/bpm/test.css
  47. 105 0
      web/media/swf/calendar/calendar.html
  48. BIN
      web/media/swf/calendar/calendar.swf
  49. BIN
      web/media/swf/calendar/playerProductInstall.swf
  50. 777 0
      web/media/swf/calendar/swfobject.js
  51. BIN
      web/media/swf/fileupload/flexupload.swf
  52. 777 0
      web/media/swf/fileupload/swfobject.js
  53. BIN
      web/mobileapp/css/fonts/icomoon.eot
  54. BIN
      web/mobileapp/css/fonts/icomoon.ttf
  55. BIN
      web/mobileapp/css/fonts/icomoon.woff
  56. BIN
      web/mobileapp/css/fonts/ionicons.eot
  57. BIN
      web/mobileapp/css/fonts/ionicons.ttf
  58. 118 0
      web/mobileapp/css/ht.css
  59. 0 0
      web/mobileapp/css/image-iconmoone.css
  60. BIN
      web/mobileapp/css/images/3.jpg
  61. BIN
      web/mobileapp/css/images/flowagent.jpg
  62. BIN
      web/mobileapp/css/images/flowhistory.jpg
  63. BIN
      web/mobileapp/css/images/icon-search-black.png
  64. BIN
      web/mobileapp/css/images/login.jpg
  65. BIN
      web/mobileapp/css/img/down.png
  66. BIN
      web/mobileapp/css/img/medal-act.png
  67. BIN
      web/mobileapp/css/img/medal.png
  68. 6302 0
      web/mobileapp/css/ionic.css
  69. 94 0
      web/mobileapp/css/iscroll/scrollbars.css
  70. BIN
      web/mobileapp/css/login/bg.jpg
  71. 21 0
      web/mobileapp/css/login/login.css
  72. BIN
      web/mobileapp/css/login/logo.png
  73. BIN
      web/mobileapp/css/login/pwdImg.png
  74. 1228 0
      web/mobileapp/css/main.css
  75. 27 0
      web/mobileapp/css/pro-header.css
  76. 57 0
      web/mobileapp/css/pullfresh.css
  77. 17 0
      web/mobileapp/css/task/taskForm.css
  78. 79 0
      web/mobileapp/css/template.css
  79. 20 0
      web/mobileapp/css/ui-anim.css
  80. 200 0
      web/mobileapp/css/ui-apple.css
  81. 497 0
      web/mobileapp/css/ui-base.css
  82. 168 0
      web/mobileapp/css/ui-box.css
  83. 122 0
      web/mobileapp/css/ui-btn.css
  84. 18 0
      web/mobileapp/css/ui-fold.css
  85. 10 0
      web/mobileapp/css/ui-img.css
  86. 71 0
      web/mobileapp/css/ui-input.css
  87. 27 0
      web/mobileapp/css/ui-list.css
  88. 296 0
      web/mobileapp/css/ui-menu-anim.css
  89. 294 0
      web/mobileapp/css/ui-new-style.css
  90. 30 0
      web/mobileapp/css/ui-on.css
  91. 166 0
      web/mobileapp/css/ui-res.css
  92. 81 0
      web/mobileapp/css/ui-rs-client.css
  93. 56 0
      web/mobileapp/css/ui-tab.css
  94. 58 0
      web/mobileapp/js/config.js
  95. 1104 0
      web/mobileapp/js/help/iscroll.js
  96. 1279 0
      web/mobileapp/js/iscroll/iscroll.js
  97. 6 0
      web/mobileapp/js/jquery/jquery.min.js
  98. 217 0
      web/mobileapp/js/ng/base/angular.min.js
  99. 2104 0
      web/mobileapp/js/ng/custom/app.js
  100. 0 0
      web/mobileapp/js/ng/custom/components.js

+ 384 - 0
web/codegen/js/AttachMent.js

@@ -0,0 +1,384 @@
+/**
+ * 附件管理。
+ * @returns {AttachMent}
+ */
+if (typeof AttachMent == 'undefined') {
+	AttachMent = {};
+}
+
+/**
+ * 选择非直接上传附件时判断用flash还是html
+ */
+
+AttachMent.addFile=function(obj){
+	AttachMent.htmlUpLoadFile(obj);
+}
+
+
+/**
+ * 选择直接上传附件时判断用flash还是html
+ */
+AttachMent.directUpLoadFile=function(obj){
+	AttachMent.htmlUpLoadFile(obj);
+}
+
+/**
+ * flash附件非直接上传
+ */
+AttachMent.FlexAddFile=function(obj){	
+	var inputObj=$(obj);
+	var fieldName=inputObj.attr("field");
+	var parent=inputObj.parent().parent();
+
+	var divName="div.attachement";
+	var inputName="input[name='" +fieldName +"'],textarea[name='" +fieldName +"']";
+	//获取div对象。
+	var divObj=$(divName,parent);
+	var inputJson=inputObj.prev();//获取到textarea对象
+	
+	var aryJson=AttachMent.getFileJsonArray(divObj);
+	//文件选择器
+	FlexUploadDialog({isSingle:false,callback:function (fileIds,fileNames,filePaths,extPaths){
+		if(fileIds==undefined || fileIds=="") return ;
+		var aryFileId=fileIds.split(",");
+		var aryName=fileNames.split(",");
+		var aryExtPath=extPaths.split(",");
+		for(var i=0;i<aryFileId.length;i++){
+			var name=aryName[i];
+			AttachMent.addJson(aryFileId[i],name,aryJson);
+		}
+		
+		//获取json
+		var json=JSON2.stringify(aryJson);		
+		var html=AttachMent.getHtml(aryJson);
+		divObj.empty();
+		divObj.append($(html));
+		inputJson.text(json);
+		inputJson.val(json);
+		CustomForm.validate();
+		
+	}});
+};
+/**
+ * 直接附件上传
+ */
+AttachMent.directUpLoad=function(obj){
+	var inputObj=$(obj);
+	var fieldName=inputObj.attr("field");
+	var parent=inputObj.parent().parent();
+	var divName="div.attachement";
+	var inputName="input[name='" +fieldName +"'],textarea[name='" +fieldName +"']";
+	//获取div对象。
+	var divObj=$(divName,parent);
+	var inputJson=inputObj.prev();//获取到textarea对象
+	
+	var aryJson=AttachMent.getFileJsonArray(divObj);
+	//文件上传
+	DirectUploadDialog({callback:function (attachs){
+		
+		if(attachs==undefined || attachs==[]) return ;
+		for(var i=0;i<attachs.length;i++){
+			var fileId=attachs[i].fileId;
+			var name=attachs[i].fileName;
+			AttachMent.addJson(fileId,name,aryJson);
+		}
+		//获取json
+		var json=JSON2.stringify(aryJson);		
+		var html=AttachMent.getHtml(aryJson);
+		divObj.empty();
+		divObj.append($(html));
+		inputJson.val(json);
+		inputJson.text(json);
+		CustomForm.validate();
+	}});
+};
+/**
+ * html附件上传dialog
+ * @param conf
+ */
+
+AttachMent.htmlUpLoadFile=function(obj){	
+	var inputObj=$(obj);
+	var fieldName=inputObj.attr("field");
+	var parent=inputObj.parent().parent();
+	var divName="div.attachement";
+	var rights="w";
+	var inputName="input[name='" +fieldName +"'],textarea[name='" +fieldName +"']";
+	//获取div对象。
+	var divObj=$(divName,parent);
+	var inputJson=inputObj.prev();//获取到textarea对象
+	
+	var aryJson=AttachMent.getFileJsonArray(divObj);
+	//文件选择器
+	HtmlUploadDialog({max:30,callback:function (attachs){
+		if(attachs==undefined || attachs==[]) return ;
+		for(var i=0;i<attachs.length;i++){
+			var fileId=attachs[i].fileId;
+			var name=attachs[i].fileName;
+			AttachMent.addJson(fileId,name,aryJson);
+		}
+		var json=JSON2.stringify(aryJson);		
+		var html=AttachMent.getHtml(aryJson,rights);
+		divObj.empty();
+		divObj.append($(html));
+		inputJson.val(json);
+		inputJson.text(json);
+		if(typeof CustomForm != "undefined"){
+			CustomForm.validate();
+		}
+		
+	}});
+};
+
+/**
+ * 删除附件
+ * @param obj 删除按钮。
+ */
+AttachMent.delFile=function(obj){
+	var inputObj=$(obj);
+	var parent=inputObj.parent();
+	var divObj=parent.parent();
+	var spanObj=$("span[name='attach']",parent);
+	var divContainer=divObj.parent();
+	var fileId=spanObj.attr("fileId");
+	var aryJson=AttachMent.getFileJsonArray(divObj);
+	AttachMent.delJson(fileId,aryJson);
+	var json=JSON2.stringify(aryJson);
+	var inputJsonObj=$("textarea",divContainer);
+	if(aryJson.length == 0)
+		json = "";		
+	//设置json
+	inputJsonObj.val(json);
+	//删除span
+	parent.remove();
+	CustomForm.validate();
+};
+
+/**
+ * 初始化表单的附件字段数据。
+ */
+AttachMent.init=function(parent){
+	if(	$.isEmpty(parent))
+		parent = $("div[name='div_attachment_container']");
+	parent.each(function(){
+		var me=$(this);
+		var atta =$("textarea[controltype='attachment']",me);
+		var jsonStr = atta.val();
+		if(!$.isEmpty(jsonStr)){
+			jsonStr = jsonStr.replaceAll("¥@@¥","\"");
+			atta.val(jsonStr);
+		}
+		var divAttachment=$("div.attachement",me);
+		//json数据为空。
+		AttachMent.insertHtml(divAttachment,jsonStr);
+	});
+};
+
+/**
+ *  附件插入显示
+ * @param {} div
+ * @param {} jsonStr 
+ */
+AttachMent.insertHtml= function(div,jsonStr){
+	if($.isEmpty(jsonStr)) {
+		div.empty();
+		return ;
+	}
+	var jsonObj=[];
+	try {
+		jsonStr = jsonStr.replaceAll("¥@@¥","\"");
+		jsonObj =	jQuery.parseJSON(jsonStr);
+	} catch (e) {
+	}
+	var a = div.attr("title");
+	var html="";
+	if(a!="bulletinGet"){
+		html=AttachMent.getHtml(jsonObj);
+	}else{
+		html=AttachMent.getBulletinHtml(jsonObj);
+	}
+	div.empty();
+	div.append($(html));
+};
+
+/**
+ * 获取文件的html。
+ * @param aryJson
+ * @returns {String}
+ */
+AttachMent.getHtml=function(aryJson){	
+	var str="";
+	var template="";
+	var templateW="<span class='attachement-span'><span fileId='#fileId#' name='attach' file='#file#' ><a class='attachment' target='_blank' path='#path#' onclick='AttachMent.handleClickItem(this)' title='#title#'>#name#</a></span><a href='javascript:;' onclick='AttachMent.download(this);' title='下载' class='download'></a>&nbsp;<a href='javascript:;' onclick='AttachMent.delFile(this);' class='cancel'></a></span>";
+	template=templateW;
+	for(var i=0;i<aryJson.length;i++){
+		var obj=aryJson[i];
+		var id=obj.id;
+		var name=obj.name;
+		var path =__ctx +"/platform/system/sysFile/file_" +obj.id+ ".ht";
+		var file=id +"," + name ;
+		var tmp=template.replace("#file#",file).replace("#path#",path).replace("#name#", AttachMent.parseName(name)).replace("#title#",name).replace("#fileId#", id);
+		//附件如果是图片就显示到后面
+		str+=tmp;
+	}
+	return str;
+};
+
+/**
+ * 获取公告文件的html。
+ * @param aryJson
+ * @returns {String}
+ */
+AttachMent.getBulletinHtml=function(aryJson){	
+	var str="";
+	var template="";
+	var templateW="<span class='attachement-span'><span fileId='#fileId#' name='attach' file='#file#' ><a class='attachment' target='_blank' path='#path#' onclick='AttachMent.handleClickItem(this)' title='#title#'>#name#</a></span><a href='javascript:;' onclick='AttachMent.download(this);' title='下载' class='download'></a></span>";
+	template=templateW;
+	for(var i=0;i<aryJson.length;i++){
+		var obj=aryJson[i];
+		var id=obj.id;
+		var name=obj.name;
+		var path =__ctx +"/platform/system/sysFile/file_" +obj.id+ ".ht";
+		var file=id +"," + name ;
+		var tmp=template.replace("#file#",file).replace("#path#",path).replace("#name#", AttachMent.parseName(name)).replace("#title#",name).replace("#fileId#", id);
+		//附件如果是图片就显示到后面
+		str+=tmp;
+	}
+	return str;
+};
+
+
+AttachMent.parseName = function(name){
+	if(name.length >10)
+		return name.substr(0,6)+"...";
+	return name;
+}
+
+/**
+ * 添加json。
+ * @param fileId
+ * @param name
+ * @param path
+ * @param aryJson
+ */
+AttachMent.addJson=function(fileId,name,aryJson){
+	var rtn=AttachMent.isFileExist(aryJson,fileId);
+	if(!rtn){
+		var obj={id:fileId,name:name};
+		aryJson.push(obj);
+	}
+};
+
+/**
+ * 删除json。
+ * @param fileId 文件ID。
+ * @param aryJson 文件的JSON。
+ */
+AttachMent.delJson=function(fileId,aryJson){
+	for(var i=aryJson.length-1;i>=0;i--){
+		var obj=aryJson[i];
+		if(obj.id==fileId){
+			aryJson.splice(i,1);
+		}
+	}
+};
+
+/**
+ * 判断文件是否存在。
+ * @param aryJson
+ * @param fileId
+ * @returns {Boolean}
+ */
+AttachMent.isFileExist=function(aryJson,fileId){
+	for(var i=0;i<aryJson.length;i++){
+		var obj=aryJson[i];
+		if(obj.id==fileId){
+			return true;
+		}
+	}
+	return false;
+};
+
+/**
+ * 取得文件json数组。
+ * @param divObj
+ * @returns {Array}
+ */
+AttachMent.getFileJsonArray=function(divObj){
+	var aryJson=[];
+	var arySpan=$("span[name='attach']",divObj);
+	arySpan.each(function(i){
+		var obj=$(this);
+		var file=obj.attr("file");
+		var aryFile=file.split(",");
+		var obj={id:aryFile[0],name:aryFile[1]};
+		aryJson.push(obj);
+	});
+	return aryJson;
+};
+
+/**
+ * 点击附件事件处理
+ * @param divObj
+ * @returns {Array}
+ */
+AttachMent.handleClickItem = function(obj){
+
+	var _this = $(obj);
+	var span = _this.closest("span");
+	var fileId = span.attr("fileId");
+	
+	var url =__ctx+"/platform/system/sysFile/getJson.ht";
+	var sysFile;
+	$.ajax({
+		url:url,
+		data:{
+			fileId:fileId
+		},
+		success:function(data){
+			
+			if(typeof(data)=="string"){
+				$.ligerDialog.error('系统超时请重新登录!','提示');
+				return ;
+			}
+			
+			if(data.status!=1){
+				$.ligerDialog.error(data.msg,'提示');
+			}else{
+				sysFile = data.sysFile;
+				var path = _this.attr("path");
+				if(/(doc)|(docx)|(xls)|(xlsx)|(ppt)|(pptx)/ig.test(sysFile.ext)){
+					if($.browser.msie){
+						window.open(path,'_blank');	
+					}else{
+						var h=screen.availHeight-35;
+						var w=screen.availWidth-5;
+						var vars="top=0,left=0,height="+h+",width="+w+",status=no,toolbar=no,menubar=no,location=no,resizable=1,scrollbars=1";
+						var showUrl = __ctx+"/platform/form/office/get.ht?fileId=" + fileId;
+						window.open(showUrl,"myWindow",vars);
+					}
+				}else{
+					window.open(path,'_blank');	
+				}
+			}
+		}
+		
+		
+	});
+};
+
+/**
+ * 下载
+ */		
+AttachMent.download	= function(obj){
+	var me = $(obj);
+	var	span = me.siblings("span");
+	if(span.length >0)
+	var	fileId = span.attr("fileId");
+	
+	var path =__ctx+"/platform/system/sysFile/file_"+fileId+".ht?download=true";
+	window.open(path,'_blank');	
+}
+	
+
+

+ 210 - 0
web/codegen/js/Cascadequery.js

@@ -0,0 +1,210 @@
+/**
+ * 说明
+ * [formtype="window"]主要是处理子表弹出框模式,
+ * table.listTable  处理子表的块模式和表内模式
+ */
+
+if (typeof QueryUI == 'undefined') {
+	QueryUI = {};
+}
+
+/**
+ * queryedCacheData保存当前页面的已经查询出来的数据
+ * 数据格式:
+ * queryedCacheData{
+ * 		
+ * }
+ */
+QueryUI.queryedCacheData={};
+
+QueryUI.init = function(){
+	$("select[selectquery]").each(function(){
+		var me = $(this),
+			selectquery = me.attr("selectquery");
+			
+		if (!selectquery)
+			return true;
+		selectquery = selectquery.replaceAll("'", "\"");
+		var queryJson = JSON2.parse(selectquery);
+		var query = queryJson.query;
+		
+		for (var i = 0; i < query.length; i++) {
+				var field;
+				if(query[i].trigger=='-1')
+				continue;
+				// isMain是true 就是绑定主表的字段
+				if (query[i].isMain=="true") {
+					field = $(".formTable [name$='" + query[i].trigger + "']");
+				} else {
+					field = me.parents('table.listTable,[formtype="window"]').find("[name='" + query[i].trigger + "']");
+					field.unbind("change");
+				}
+				if (field != "")
+					QueryUI.change(field, me, queryJson);
+		}
+		QueryUI.getvalue(me, queryJson);
+	});
+};
+
+QueryUI.change = function(field, SelectObj, queryJson) {
+		field.bind("change", function() {
+				QueryUI.getvalue(SelectObj, queryJson);
+		});
+	};
+
+QueryUI.replaceValue = function(objValue) {
+	return objValue.replaceAll(",", "#,");
+}
+
+
+QueryUI.getvalue = function(SelectObj, queryJson) {
+
+	var query = queryJson.query;
+	var fieldValue, subfield, checkfield,field;
+	var querydataStr = "{";
+	for (var i = 0; i < query.length; i++) {
+		if (query[i].isMain=="true") {
+			//输入框,下拉框,数据字典
+			subfield = $(".formTable [name$='" + query[i].trigger + "']");
+			// 选择器
+			field = $(".formTable [name$='" + query[i].trigger + "ID']");
+			// 单选、复选框
+			checkfield = $(":checked[name$='" + query[i].trigger + "']");
+		} else {
+			subfield = SelectObj.parents('table.listTable,[formtype="window"]').find("[name='" + query[i].trigger + "']");
+			field = SelectObj.parents('table.listTable,[formtype="window"]').find("input[name='" + query[i].trigger + "ID']");
+			checkfield = SelectObj.parents('table.listTable,[formtype="window"]').find(":checked[name='" + query[i].trigger + "']");
+		}
+		switch (query[i].controlType) {
+			//没有绑定任何表字段controlType=-1而有预设值时
+			case '-1':break;
+			// 输入框,下拉框,数据字典是一类直接获取值
+			case '1' :
+			case '2' :
+			case '3' :
+			case '11' :
+			case '15' :
+				fieldValue = subfield.val();
+				break;
+			// 选择器
+			case '4' :
+			case '5' :
+			case '6' :
+			case '7' :
+			case '8' :
+			case '17' :
+			case '18' :
+			case '19' :
+				fieldValue =field.val();
+				fieldValue = QueryUI.replaceValue(fieldValue);
+				break;
+			// 单选、复选框
+			case '13' :
+			case '14' :
+				var tempvalue;
+				checkfield.each(function() {
+							var obj = $(this);
+							if (typeof(tempvalue) != "undefined"
+									&& tempvalue != "") {
+								tempvalue += "#," + obj.val();
+							} else {
+								tempvalue = obj.val();
+							}
+						});
+				fieldValue = tempvalue;
+				tempvalue = "";
+				break;
+		}
+		//如果对应的绑定字段有值则使用该值,没有值则判断设计时有没有输入预设值,有预设值则使用,没有则不做输入条件
+		if (typeof(fieldValue) != "undefined" && fieldValue != ""&& fieldValue!=null) {
+			querydataStr += query[i].condition + ":\"" + fieldValue + "\",";
+		}else{
+			if(query[i].initValue!='')
+			querydataStr += query[i].condition + ":\"" + query[i].initValue + "\",";
+		}
+	}
+	if (querydataStr.length > 1){
+		querydataStr = querydataStr.substring(0, querydataStr.length - 1);
+		querydataStr += "}";
+	}else{
+		querydataStr += "}";
+	}
+	
+	var queryedCacheDataString="";
+	//如果querydataStr为{},说明是查询全部数据,引用一个"queryedCacheDataString"标识全部数据
+	if(querydataStr=="{}"){
+		queryedCacheDataString="queryedCacheDataString"
+	}else{
+		queryedCacheDataString=querydataStr;
+	}
+	
+	var cacheData=QueryUI.getCascaData(queryJson.name,queryedCacheDataString);
+	SelectObj.empty();
+	if(cacheData){
+		QueryUI.handData(cacheData,queryJson,SelectObj);
+	}else{
+		queryCond = {
+			alias : queryJson.name,
+			querydata : querydataStr,
+			page : 0,
+			pagesize : 0
+		};
+		DoQuery(queryCond, function(data) {
+					if (data.errors || data.list.length < 1) {
+						return;
+					}
+					QueryUI.handData(data.list,queryJson,SelectObj);
+					QueryUI.setCascaData(queryJson.name,queryedCacheDataString,data.list);
+				},true);
+	};
+};
+
+/**
+ * 获取缓存数据
+ */
+QueryUI.getCascaData = function(alias,querydata){
+	if(!QueryUI.queryedCacheData)return;
+	var tempAlias=QueryUI.queryedCacheData[alias];
+	if(!tempAlias)return ;
+	var tempData=tempAlias[querydata];
+	return tempData;
+};
+
+/**
+ * 设置缓存数据
+ */
+QueryUI.setCascaData = function(alias,querydata,data){
+	var aliasObj = QueryUI.queryedCacheData[alias] || {};
+	aliasObj[querydata] = data;
+	QueryUI.queryedCacheData[alias] = aliasObj;
+};
+
+
+/**
+ * 获取数据以后经过处理,显示多下拉列表中
+ */
+QueryUI.handData=function(data,queryJson,currSelectObj){
+	var selectObj=$(currSelectObj);
+	var oFrag=document.createDocumentFragment();
+	for (var i = 0; i < data.length; i++) {
+		var dataobj = data[i];
+		var datavalue = dataobj[queryJson.binding.value.toLowerCase()];
+		var datakey = dataobj[queryJson.binding.key.toLowerCase()];
+		var isSame=false;
+		//判断是否有重复的数据
+		for (var j=0; j<i;j++){
+			if(datakey== data[j][queryJson.binding.key.toLowerCase()]){
+				isSame=true;
+				break;
+			}
+		}
+		if(isSame) continue;
+		var opt = $("<option>").val(datakey).text(datavalue);
+		
+		oFrag.appendChild(opt[0]);
+	}
+	selectObj.append(oFrag);
+	var tempValue = selectObj.attr("val");
+	selectObj.val(tempValue);
+	selectObj.trigger("change");
+};

+ 969 - 0
web/codegen/js/CustomForm.js

@@ -0,0 +1,969 @@
+$(function() {
+	CustomForm = {
+		onEditCallBack:null,
+		tables: {},
+		init : function() {
+			var self=this;
+			self.initUI();
+			self.initComdify();
+			self.validate();
+		},
+		
+		//处理添加和删除按钮。
+		handButton:function(table,canWrite){
+			var self=this;
+			if(!canWrite) {
+				$(".add",table).addClass("disabled");
+				$(".del",table).addClass("disabled");
+				return;
+			};
+			
+			$(".add",table).click(function(){
+				self.add(table);
+				//TODO
+				self.initSubQuery();
+				self.subSelectorInit();
+				
+			});
+			
+			table.delegate(".del", "click", function(){
+				var t = $(this).closest('[formtype]'),
+					brother = t.next('[formtype]').length?t.next('[formtype]'):t.prev('[formtype]');
+				t.remove();
+				if(brother)
+					FormUtil.InitMathfunction(brother);
+			});
+		},
+		
+		
+		//处理块模式和表内编译模式下千分位
+		initComdify:function(){
+			$("div[type='custform']").delegate('[showtype]', 'blur',function (){
+					CustomForm.delaComdify($(this));
+				});
+		},
+		
+		//处理弹出框模式下千分位
+		initComdifyForWindow:function(){
+			$("[formtype='window']").delegate('[showtype]', 'blur',function(){
+					CustomForm.delaComdify($(this));
+				});
+		},
+		
+		//处理千分位
+		delaComdify:function(varObj){
+			var me=$(varObj);
+			var value = me.val();
+			var json=null;
+			try{
+				var jsonStr=me.attr("showtype");
+				json=eval('('+jsonStr+')');
+			}
+			catch(err){}
+			if(json!=null){
+				var coinvalue=json.coinValue;
+				var iscomdify=json.isShowComdify;
+				var decimallen=json.decimalValue;
+				//去除货币标签
+				if (coinvalue && value.split(coinvalue) != -1) {
+					var ary = value.split(coinvalue);
+					value = ary.join("");
+				}
+				
+				if (value.indexOf(',') != -1) {
+					value = $.toNumber(value);
+				}
+				if(iscomdify && iscomdify=='1'){
+					var value = $.comdify(value);
+				}
+				
+					// 小数处理
+				if (decimallen > 0 && value) {
+					var zeroLen = '';
+					if (value.indexOf('.') != -1) {
+						var ary = value.split('.');
+						var temp = ary[ary.length - 1];
+						if (temp.length > 0 && temp.length < decimallen) {
+							for (var i = 0; i < decimallen- temp.length; i++) {
+								zeroLen = zeroLen + '0';
+							}
+							value = value + zeroLen;
+						}
+					} else {
+						for (var i = 0; i < decimallen; i++) {
+							zeroLen = zeroLen + '0';
+						}
+						value = value + '.' + zeroLen;
+					}
+				}
+				//添加货币标签
+				if (coinvalue && value) {
+					value = coinvalue + value;
+				}
+			}
+			me.val(value);
+		},
+		
+		
+		/**
+		 * 初始化表单界面。
+		 * 
+		 * @param parent
+		 */
+		initUI : function(parent) {
+			$('input[type="checkbox"]').each(function() {
+				var value=$(this).val();
+				var data=$(this).attr('data');
+				if(!data||data==''||data=='null')return;
+				var ary=data.split(",");
+				for(var i=0;i<ary.length;i++){
+					if(value!=ary[i]) continue;
+					$(this).attr("checked","checked");
+				}
+			});
+			
+			var filter='input,textarea,.dicComboTree,.dicComboBox,.dicCombo';
+			if (parent==undefined) {
+				parent = $('body div[type=custform]');
+				if(!parent||parent.length==0)parent = $("body");
+			}else{
+				//处理初始化附件的bug
+				AttachMent.init($("div[name='div_attachment_container']",parent));
+			}
+			//下拉框默认选中,在下拉框定义一个val属性,使用脚本选中。
+			$("select[name][val]",parent).each(function(){
+				var obj=$(this),val= obj.attr("val");
+				if($.isEmpty(val))
+					val= obj.val();		
+				obj.val(val);
+			});
+			
+			parent.find(filter).each(function() {
+				if ($(this).is('.dicComboTree,.dicComboBox,.dicCombo')) {
+					if($(this).closest('[type=append]').length<=0){//是模板的也不用初始化
+						$(this).htDicCombo();
+					}
+				}
+				//处理默认日期
+				if ($(this).is('.Wdate[displayDate=1]')){
+					var me = $(this);
+					if($.isEmpty(me.val())){			
+						var datefmt = me.attr("datefmt");
+						var nowDate=new Date().Format(datefmt);
+						me.val(nowDate);
+					}
+				}	
+			});
+			if (parent.is('form')) {
+			
+				parent.data('validate', this.getValidate(parent));
+			} else {
+				var v = parent.closest('form');
+				this.valid = this.getValidate(v);
+			}
+			$('div[type=subtable]').each(function() {
+				var subTable=$(this);
+				CustomForm.handRow('edit',subTable);
+			});
+		},
+		//添加一行数据
+		//参数,子表区域,在那个地方插入。
+		add : function(table, beforeElement) {
+			var self=this;
+			var right=table.attr('right');
+			if(right!="w" && right!="b"){
+				return;
+			}
+			//判断是否是使用窗口方式编辑数据。
+			var frm=table.data('form');
+			if (frm) {
+				self.openWin('添加', $(frm), table, beforeElement, function(form, table, beforeElement) {
+					//校验数据
+					var v = form.data('validate');
+					if (!v.valid()) {
+						return false;
+					} 
+					var row = $(table.data('row'));
+					//添加行数据
+					self.addRow(row, form);
+				
+					self._add(table, row, beforeElement);
+					self.handRow('add',table);
+					return true;
+				});
+				//弹窗模式下初始化千分位货币处理函数
+				self.initComdifyForWindow();
+			} 
+			//使用的行内编辑。
+			else {
+				var row = $(table.data('row'));
+				this._add(table, row, beforeElement);
+				row.find('.dicComboBox,.dicComboTree,.dicCombo').each(function() {				
+					$(this).htDicCombo();
+				});
+			}
+			self.handRow('add',table);
+		},
+		
+		handRow:function(type,table){
+			if(typeof(handRowEvent)=="function"){
+				handRowEvent(type,table);
+			}
+		},
+		//添加一行数据往行数据中添加隐藏域,同时设置显示的数据。
+		addRow:function(row,form){
+			form.find('input:text[name],input:hidden[name], textarea[name],select[name]').each(function() {
+				var name=$(this).attr('name');
+				var val=$(this).val();
+				//添加隐藏表单。
+				row.append($('<input type="hidden"/>').attr('name', name).val(val));
+				//修改表格的文本显示。
+				var filter="[fieldName='"+name+"']";
+				var objTd=$(filter,row);
+				if(objTd.length>0){
+					var controltype = $(this).attr('controltype');
+					if(!$.isEmpty(controltype) && controltype=='attachment'){
+						AttachMent.insertHtml(objTd,val);
+					}else if(!$.isEmpty(controltype) && controltype=='select'){
+						var text = $(this).find("option:selected").text();
+						objTd.text(text);
+					}else{
+						objTd.text(val);
+					}	
+				}
+				$(this).val('');
+			});
+			
+			
+			//回填checkbox的值。
+			form.find('input:checkbox,input:radio').each(function() {
+				var name=$(this).attr('name');
+				var value=$(this).val();
+				
+				var filterHidden="input[name='"+ name +"']";
+				var isChecked=($(this).attr("checked")!=undefined);
+				var obj=$(filterHidden,row);
+				
+				var filter="[fieldName='"+name+"']";
+				var objTd=$(filter,row);
+				
+			
+				
+				var val=(isChecked)?value:"";
+				if(obj.length==0){
+					row.append($('<input type="hidden"/>').attr('name', name).val(val));
+				}
+				else{
+					var existVal = obj.val()=="" ? val : obj.val() ;
+					if(existVal!="" && val!=""){
+						existVal += "," +val;
+					}
+					obj.val(existVal);
+					val = existVal;
+				}
+				if(objTd.length>0){
+					objTd.text(val);
+				}
+			});
+		},
+		_add : function(table, newRow, beforeElement) {
+			//处理newRow的字段的必填
+			$("input,textarea,select",newRow).each(function(){
+        		var me=$(this);	
+        		//处理默认日期
+				if (me.is('.Wdate[displayDate=1]') && $.isEmpty(me.val())){
+					var datefmt = me.attr("datefmt");
+					var nowDate=new Date().Format(datefmt);
+					me.val(nowDate);
+				}
+        		var validRule = me.attr("validate");
+				if ( validRule != null && 'undefined' != validRule.toLowerCase() && validRule.length>2 ){ 
+					var json = eval('(' + validRule + ')');		
+					if(json.required){
+						me.addClass("validError");
+					}
+				}
+			});
+			if (beforeElement) {
+				$(beforeElement).before(newRow);
+			}
+			//在最后面加入
+			else {
+				table.find('[formtype]:last').after(newRow);
+			}
+			//初始化界面
+			this.initUI(newRow);
+			//添加右键绑定
+			this.addBind(newRow, table);
+			FormUtil.triggerChoice(newRow);
+			//删除必填样式
+			if(table.hasClass('validError')){
+				table.removeClass('validError');
+			}
+			
+		},
+		
+		/**
+		 * 添加行数据的右键事件绑定。
+		 * @param row
+		 * @param table
+		 */
+		addBind: function(row, table) {
+			//是否需要编辑菜单项目
+			//如果该表弹出窗口定义,那么就不需要编辑菜单项目。
+			var needEdit = (this.tables[table.attr('tableName')].data('form') != null);
+			var menu = this.getMenu(needEdit);
+			row.bind("contextmenu", function(e) {
+				menu.target = e.target;
+				menu.show({top : e.pageY,left : e.pageX});
+				return false;
+			});
+		},
+		/**
+		 * 编辑行数据。
+		 * @param table
+		 * @param row
+		 */
+		edit : function(table, row) {
+			var self=this;
+			var tableName = table.attr('tableName');
+			//获取表单
+			var form = $(this.tables[tableName].data('form'));
+			
+			
+			//对表单数据进行初始化
+			self.initFormData(form,row);
+			
+			form.data('row', row);
+			this.openWin('编辑', form, table, null, function(form, table) {
+				var v = form.data('validate');
+				var rtn=v.valid();
+				if(!rtn) return false;
+				
+				var row = form.data('row');
+				//对表单进行遍历
+				self.setRowData(form,row);
+				return true;
+				
+			});
+		},
+		initFormData:function(form,row){
+			form.find('input:text,textarea,select,input[type="hidden"]').each(function() {
+				var name= $(this).attr('name');
+				var value = row.find('[name="' + name+ '"]').val();
+				$(this).val(value);
+			});
+			form.find('input:checkbox,input:radio').each(function(){
+				var name=$(this).attr("name");
+				var chkValue=$(this).val();
+				var value=row.find('[name="' + name+ '"]').val();
+				
+				if(value.indexOf(chkValue)!=-1){
+					$(this).attr("checked","checked");
+				}
+			});
+		},
+		setRowData:function(form,row){
+			var self=this;
+			//对表单进行遍历
+			form.find('input:text, textarea,input[type="hidden"],select').each(function() {
+				var name=$(this).attr('name');
+				var val=$(this).val();
+				//修改隐藏域的数据值
+				var objHidden=$("input[name='"+name+"']",row);
+				objHidden.val(val);
+				//修改表格的文本显示。
+				var filter="[fieldName='"+name+"']";
+				var objTd=$(filter,row);
+				if(objTd.length<=0) return true;
+				//处理附件
+				var controltype = $(this).attr('controltype');
+				if(!$.isEmpty(controltype) && controltype=='attachment'){
+					AttachMent.insertHtml(objTd,val);
+				}else{
+					objTd.text(val);
+				}	
+			});
+			
+			form.find('input:checkbox,input:radio').each(function(){
+				var name=$(this).attr('name');
+				var objHidden=$("input[name='"+name+"']",row);
+				objHidden.val("");
+				//修改表格的文本显示。
+				var filter="[fieldName='"+name+"']";
+				var objTd=$(filter,row);
+				if(objTd.length>0){
+					objTd.text("");
+				}
+			});
+			
+			form.find('input:checkbox:checked,input:radio:checked').each(function(){
+				var name=$(this).attr('name');
+				var value=$(this).val();
+				var objHidden=$("input[name='"+name+"']",row);
+				var filter="[fieldName='"+name+"']";
+				var objTd=$(filter,row);
+				
+				var hidValue=objHidden.val();
+				if(hidValue){
+					objHidden.val(hidValue +"," +value);
+					objTd.text(hidValue +"," +value);
+				} else{
+					objHidden.val(value);
+					objTd.text(value);
+				}
+				
+			});
+			
+		},
+		
+		/**
+		 * 获取验证器。
+		 * @param target 为一个表单。
+		 * @returns
+		 */
+		getValidate : function(target) {
+			return target.form({
+				/**
+				 * 错误消息处理
+				 */
+				errorPlacement : function(el, msg) {
+					var element=$(el),corners =['right center','left center'],flipIt= element.parents('span.right').length > 0;
+					element.addClass('validError');
+					
+					//添加必填样式
+					var parentTd = element.closest("td");
+					if(parentTd){
+						var formTitle = parentTd.prev("td.formTitle");
+						if(formTitle){
+							var span = $("span.red", formTitle);
+							if(!span || span.length==0){
+								formTitle.append($("<span class='red'>*</span>"));
+							}
+						}
+					}
+					
+					if(element.hasClass("myeditor")){
+						setTimeout(function(){
+							element = element.next();
+							element.css("border","1px solid red");
+						},1000);
+					}else if(element.hasClass("Wdate")||element.is('textarea')){
+						element.css("border","1px solid red");
+					}else if(element.is("select")||element.attr('type')&&(element.attr('type')=='checkbox'||element.attr('type')=='radio')){
+						var name = element.attr('name');
+						if(!name)return;
+						var priElement = $("*[name='"+name+"']",$("span.select_contain_span"));
+						if(priElement.length>0)return;
+						element.removeClass('validError');
+						var errorSpan = $('<span></span>').css({"border":"1px solid red","padding":"1px"}).addClass("select_contain_span");
+						element.before(errorSpan);
+						errorSpan.append(element);
+					}
+					
+					if(!$(msg).is(':empty')){
+						element.qtip({
+							overwrite:false,
+							content : msg,
+							position:{
+								my:corners[flipIt?0:1],
+								at:corners[flipIt?1:0],
+								viewport:$(window)
+							},
+					        show:{
+			   			     	effect: function(offset) {
+			   						$(this).slideDown(100);
+			   					}
+		   			        },
+		   			        hide:{
+		   			        	event:'click mouseleave',
+		   			        	leave: false,
+		   			        	fixed:true,
+		   			        	delay:200
+		   			        },
+		   			        style:{
+								classes:'ui-tooltip-red'
+							}
+						});
+					}else{
+						element.qtip("destroy");
+					}
+				},
+				/**
+				 * 成错误消息
+				 */
+				success : function(el) {
+					var element=$(el);
+					if(element.hasClass("myeditor")){
+						element = element.next();
+						element.css("border","");
+					}else if(element.hasClass("Wdate")||element.is('textarea')){
+						element.css("border","1px solid #999");
+					}else if(element.is("select")||element.attr('type')&&(element.attr('type')=='checkbox'||element.attr('type')=='radio')){
+						var selectSpan = element.parents("span.select_contain_span");
+						if(!selectSpan||selectSpan.length==0){
+							var name = element.attr('name');
+							if(!name)return;
+							var priElement = $("*[name='"+name+"']",$("span.select_contain_span"));
+							if(!priElement||priElement.length==0)return;
+							var tipSpan = priElement.parents("span.select_contain_span");
+							var formtype = priElement.parents("[formtype]");
+							if(formtype&&formtype.length>0){
+								$("[name='"+name+"']",formtype).each(function(){
+									$(this).removeClass('validError');
+									$(this).qtip("destroy");
+									$(this).unbind('mouseover');
+								});
+							}
+							else{
+								$("[name='"+name+"']").each(function(){
+									$(this).removeClass('validError');
+									$(this).qtip("destroy");
+									$(this).unbind('mouseover');
+								});
+							}
+							tipSpan.before(priElement);
+							tipSpan.remove();
+						}						
+						else{
+							selectSpan.before(element);
+							selectSpan.remove();
+						}
+					}else if(element.attr('type')=='subtable'){
+						
+					}
+					element.removeClass('validError');
+					element.qtip("destroy");
+					element.unbind('mouseover');
+				}
+				,rules:com.hotent.form.rule.CustomRules
+			});
+		},
+		validate:function(conf){
+			return this.valid.valid(conf);
+		},
+		//处理有数据格式定义的数据。
+		handNumberData:function(obj){
+			var value=$(obj).val();
+			var showType=$(obj).attr("showtype");
+			if(!showType) return value;
+			try{
+				showType=showType.replaceAll("'","\"");
+				var json=jQuery.parseJSON(showType);
+				var coinvalue = json.coinValue;
+				var isShowComdify = json.isShowComdify;
+				if (coinvalue != null && coinvalue != '' && value.split(coinvalue) != -1) {
+					var ary = value.split(coinvalue);
+					value = ary.join("");
+				}
+				if (isShowComdify && value.split(",") != -1) {
+					var temp = value.split(",");
+					value = temp.join("");
+				}
+			}
+			catch(err){}
+			return value;
+		},
+		/**
+		 * 获取数据。
+		 * 返回json数据。
+		 */
+		getData: function() {
+			var self=this;
+			// 主表数据
+			var main = {
+				fields:{}
+			};
+			//取主表的字段。
+			$("input:text[name^='m:'],input:hidden[name^='m:'],textarea[name^='m:'],select[name^='m:']").each(function() {
+				var name = $(this).attr('name');
+				var value=self.handNumberData(this);
+				main.fields[name.replace(/.*:/, '')] = value;
+			});
+			
+			$("textarea[name^='m:'].myeditor").each(function(num) {
+				var name = $(this).attr('name');
+				var data=getEditorData(editor[num]);
+				main.fields[name.replace(/.*:/, '')] =data;
+				$(this).val(data);
+			});
+			//设置单选按钮。
+			self.setMainRadioData(main.fields);
+			//设置复选框。
+			self.setMainCheckBoxData(main.fields);
+			
+			//子表数据
+			var sub = [];
+			$('div[type=subtable][right=w || right=b][show=true||undefined]').each(function() {
+				var table = {
+					tableName: $(this).attr('tableName'),
+					fields: []
+				};
+				$(this).find('[formtype]:visible').each(function() {
+					var row = {};
+					var objRow=$(this);
+					$("input:text[name^='s:'],input[type='hidden'][name^='s:'],textarea[name^='s:'],select[name^='s:']",objRow).each(function() {
+						var name = $(this).attr('name').replace(/.*:/, '');
+						var value=self.handNumberData(this);
+						row[name] = value;
+					});
+					//设置复选框按钮的数据。
+					self.setSubCheckBoxData(objRow,row);
+					
+					//设置单选按钮的数据
+					self.setSubRadioData(objRow, row);
+					
+					table.fields.push(row);
+				});
+				sub.push(table);
+				
+				JSON2.stringify(sub);
+			});
+			
+			//意见
+			var opinion = [];
+			$('textarea[name^=opinion]').each(function() {
+				opinion.push({
+					name: $(this).attr('name').split(':')[1],
+					value: $(this).val()
+				});
+			});
+			
+			var data = {main: main, sub: sub, opinion: opinion};
+			
+			return JSON2.stringify(data);
+		},
+		/**
+		 * 设置子表的radio单选按钮字段。
+		 * @param dataObj
+		 */
+		setSubRadioData:function(objParent,dataObj){
+			var operatorObj = $('input:radio', objParent);
+			this.setRadioData(dataObj, operatorObj);
+		},
+		/**
+		 * 设置主表的radio单选按钮字段。
+		 * @param dataObj
+		 */
+		setMainRadioData:function(dataObj){
+			var operatorObj = $('input[name^=m]:radio');
+			this.setRadioData(dataObj, operatorObj);
+		},
+		setRadioData:function(dataObj, operatorObj){
+			$(operatorObj).each(function() {
+				var name = $(this).attr('name').replace(/.*:/, '');
+				var value= $(this).val();
+				
+				if($(this).attr("checked")!=undefined){
+					dataObj[name]=value;
+				}
+			});
+		},
+		setCheckBoxData:function(dataObj, operatorObj, checkedObj){
+			//将所有复选框选址清空。
+			$(operatorObj).each(function() {
+				var name = $(this).attr('name').replace(/.*:/, '');
+				dataObj[name]="";
+			});
+			
+			//复选框取值。
+			$(checkedObj).each(function() {
+				var name = $(this).attr('name').replace(/.*:/, '');
+				var value= $(this).val();
+				if(dataObj[name]==""){
+					dataObj[name]=value;
+				} else{
+					dataObj[name]+="," + value;
+				}
+			});
+		},
+		/**
+		 * 设置子表复选框的数据
+		 * @param objParent
+		 * @param dataObj
+		 */
+		setSubCheckBoxData:function(objParent,dataObj){
+			var operatorObj = $('input:checkbox',objParent);
+			var checkedObj = $('input:checkbox:checked',objParent);
+			this.setCheckBoxData(dataObj, operatorObj, checkedObj);
+		},
+		setMainCheckBoxData:function(dataObj){
+			var operatorObj = $('input[name^=m]:checkbox');
+			var checkedObj = $('input[name^=m]:checkbox:checked');
+			this.setCheckBoxData(dataObj, operatorObj, checkedObj);
+		},
+		
+		/**
+		 * 打开操作数据窗口。
+		 * @param title 窗口标题
+		 * @param form	窗口对象。
+		 * @param table 表
+		 * @param beforeElement
+		 * @param callback 回调函数
+		 */
+		openWin : function(title, form, table, beforeElement, callback) {
+			var formProperty=table.data("formProperty");
+			var width=formProperty.width+20;
+			var height=formProperty.height+100;
+			var self=this;
+	
+			form.data('beforeElement', beforeElement);
+			var win = $.ligerDialog({target:form,
+					width:width,
+					height:height,
+					title : title,
+					showMax : true,
+					showToggle : true,
+					onClose : true,
+					showButton : true,
+					buttons : [ {
+						text : "确定",
+						onclick: function (item, dialog) {
+							var result = callback(form, table, form.data('beforeElement'));
+							if(!result) return;
+						    if(self.onEditCallBack!=null){
+								self.onEditCallBack(title);
+							}
+							dialog.close();
+						}
+					} ]
+				});
+			//初始化表单界面
+			this.initUI(form);
+			win.show();
+		
+		},
+		/**
+		 * 获取右键菜单。
+		 * @param needEdit
+		 * @returns
+		 */
+		getMenu : function(needEdit) {
+			var self=this;
+			//判断菜单是否存在,不存在则新建菜单。
+			if ((needEdit && this.menuWithEdit) || (!needEdit && this.menu)) {
+				return needEdit ? this.menuWithEdit : this.menu;
+			} else {
+				var menu;
+				var items = [ {
+					text : '在前面插入记录',
+					click : function() {
+						var row = $(menu.target).closest('[formtype]');
+						var table = row.closest('div[type=subtable]');
+						self.add(table, row);
+						//TODO
+						self.subSelectorInit();
+						self.initSubQuery();
+						self.handRow('add',table);
+					}
+				}, {
+					text : '在后面插入记录',
+					click : function() {
+						var row = $(menu.target).closest('[formtype]');
+						var table = row.closest('div[type=subtable]');
+						row = row.next('[formtype]:visible');
+						if (row.length == 0) {
+							row = null;
+						}
+						self.add(table, row);
+						//TODO
+						self.subSelectorInit();
+						self.initSubQuery();
+						self.handRow('add',table);
+					}
+				}, {
+					line : true
+				}, {
+					text : '编辑',
+					click : function() {
+						var row = $(menu.target).closest('[formtype]');
+						var table = row.closest('div[type=subtable]');
+						self.edit(table, row);
+					}
+				}, {
+					text : '删除此记录',
+					click : function() {
+						var t = $(menu.target).closest('[formtype]'),
+							table = t.closest('div[type=subtable]'),
+							brother = t.next('[formtype]').length?t.next('[formtype]'):t.prev('[formtype]');
+						t.remove();
+						
+						self.handRow('del',table);
+						if(brother)
+							FormUtil.InitMathfunction(brother);
+					}
+				}, {
+					line : true
+				}, {
+					text : '向上移动',
+					click : function() {
+						var t = $(menu.target).closest('[formtype]');
+						var prev = t.prev('[formtype]:visible');
+						if (prev.length > 0) {
+							prev.before(t);
+						}
+						var table = t.closest('div[type=subtable]');
+						self.handRow('add',table);
+					}
+				}, {
+					text : '向下移动',
+					click : function() {
+						var t = $(menu.target).closest('[formtype]');
+						var next = t.next('[formtype]:visible');
+						if (next.length > 0) {
+							next.after(t);
+						}
+						var table = t.closest('div[type=subtable]');
+						self.handRow('add',table);
+					}
+				} ];
+				//如果不需要编辑,删除编辑菜单。
+				if (!needEdit) {
+					items.splice(3, 1);
+				}
+				menu = $.ligerMenu({top : 100,left : 100,width : 130,items : items});
+				if (needEdit) {
+					this.menuWithEdit = menu;
+				}
+				else{
+					this.menu = menu;
+				}
+				return menu;
+			}
+		},
+		
+		
+		/**
+		 * 从数据库加载子表权限。
+		 */
+	  loadSubTablePermission:function(){
+			var defId = $(':hidden[name=defId]').val();
+			var actDefId = $(':hidden[name=actDefId]').val();
+			var formKey = $(':hidden[name=formKey]').val();
+			var nodeId = $(':hidden[name=nodeId]').val();
+			var params={defId:defId,actDefId:actDefId,formKey:formKey,nodeId:nodeId};
+			var url = "getSubTablePermission.ht";
+			var map = null;
+			$.ajaxSetup({async:false});  //修改成同步
+			$.post(url, params,function(data){
+				map = data;
+	        });
+			$.ajaxSetup({async:true}); //改为原来的异步
+			return map;
+	  },
+	  
+	  selectValue:function(select){
+		    var html='';
+			var query=select.attr("selectquery")
+			var queryJson;
+			if(query!=undefined && query!=null ){
+				query=query.replaceAll("'","\"");
+				queryJson = JSON2.parse(query);
+			}else{
+				queryJson = "";
+				query = "";
+			}
+			var sValue=select.attr("val");    //select中有一个属性是保存选中的值的(初始化时用这个)
+			if(sValue==undefined || sValue==null && sValue.length<=0){
+				sValue = "";
+			}
+			if(query){
+				html="<span selectvalue="+sValue+" selectquery="+query+"><lable></lable></span>"
+			}else{
+				if(sValue==""){
+					html=select.find("option:selected").text();    //获取Select选择的Text   选中(不可编辑时或者没有值时,是默认的)
+				}else{
+					html += select.find("option[value='"+sValue+"']").text();    //和值相对应的显示
+				}
+			}
+			return html;
+	  },
+	  
+	 /**
+	  * 主表的权限补充(必埴)
+	  */
+	  isMainTableRequest:function(){
+		  //主表的附件必埴验证问题
+		 $("div[name=div_attachment_container]").each(function() {
+			 var div_me=$(this);
+			 if(div_me.attr("right")!='b') return true;
+			 $("a.link",div_me).each(function(){
+	        	var me=$(this);	
+        		var validRule = me.attr("validate");
+				if ( validRule != null && 'undefined' != validRule.toLowerCase() && validRule.length>2 ){ 
+					var json = eval('(' + validRule + ')');		
+					if(!json.required){
+						var jsonStr = validRule.substring(0, validRule.lastIndexOf('}'));
+						jsonStr +=",'required':true}";    //加上必填
+						me.attr("validate",jsonStr);    
+					}				
+				}else{
+					me.attr("validate","{'required':true}");     //必填
+				}
+	         });
+		 });
+	  },
+	  
+	   //初始化子表级联
+	  initSubQuery:function(){
+		
+	  	$("select[selectquery]",$("[type=subtable],[formtype='window']")).each(function(){
+		  	var me = $(this);
+		  	var selected=me.attr("selectqueryed");
+		  	//selectqueryed标识这个子表是否已经执行过了change绑定,存在就是已经绑定了,不存在就是没用被绑定过
+		  	if(selected)return true;
+			var selectquery = me.attr("selectquery");
+			if (!selectquery)
+				return true;
+			selectquery = selectquery.replaceAll("'", "\"");
+			var queryJson = JSON2.parse(selectquery);
+			var query = queryJson.query;
+			for (var i = 0; i < query.length; i++) {
+				var field;
+				// isMain是true 就是绑定主表的字段
+				if (query[i].isMain=="true") {
+					field = $(".formTable [name$=':" + query[i].trigger + "']");
+				} else {
+					field = me.parents('table.listTable,[formtype="window"]').find("[name='" + query[i].trigger + "']");
+					//添加新一个子表时,执行了多次绑定change事件,把之前的change事件都解绑
+					field.unbind("change");
+				}
+				if (field != "")
+					QueryUI.change(field, me, queryJson);
+			}
+			//添加一个属性,标识已经被绑定过,
+			me.attr("selectqueryed","selectqueryed");
+			QueryUI.getvalue(me, queryJson);
+	  	});
+	  },
+	  //初始化子表选择器
+		 subSelectorInit:function(){
+	  		$('[ctlType="selector"]','.listTable,[formtype="window"]').each(function(){
+	  			var me =$(this);
+	  			var nameID=me.attr('name')+'ID';
+	  			var isHidden=me.siblings("input[name='"+nameID+"']");
+	  			//如果存在隐藏域,则是已经添加了
+	  			if(isHidden.length!=0) return;
+					var type = me.attr('class');
+					//方法在SelectotInit.js
+					buildSelector(me, type);
+				});
+		},	
+		// 验证子表是否必填(至少要有一条记录)
+		isSubTableRequest:function(){
+			var result = {success : true}
+			$('div[right="b"][type="subtable"]').each(function(){
+				var subtable = $(this);
+				var listRows = $('tr.listRow', subtable);
+				if(listRows.length > 1) return true;
+				var tableDesc = subtable.attr('tabledesc');
+				result.success = false;
+				result.errorMsg = tableDesc;
+				return false;
+			});
+			return result;
+		}
+	};
+	//对表单初始化。
+	CustomForm.init();
+});

+ 939 - 0
web/codegen/js/FormUtil.js

@@ -0,0 +1,939 @@
+if (typeof FormUtil == 'undefined') {
+	FormUtil = {};
+}
+//tab前置回调事件
+//前置可以通过返回 return false组织tab切换。
+var onBeforeSelectTabItemCallBack=null;
+//tab后置回调事件
+var onAfterSelectTabItemCallBack=null;
+
+
+/**
+ * 初始化表单tab。
+ */
+FormUtil.initTab=function(){
+	var amount=$("#formTab").length;
+	if(amount>0){
+		$("#formTab").tabs({
+			onSelect:function(title,index){						
+				if(onBeforeSelectTabItemCallBack){
+					return onBeforeSelectTabItemCallBack(title,index);
+				}
+			},
+			onUnselect:function(title,index){
+				FormUtil.changeTabStyle(index);	 //要放到TAB产生后,才执行这个样式的改变,方可可以生效,否则效果不一定有效
+				if(onAfterSelectTabItemCallBack){
+					onAfterSelectTabItemCallBack(title,index);
+				}
+	        }
+		});
+			
+	}
+};
+
+
+/**
+ * 初始化TAB中不能隐藏的对象。
+ */
+FormUtil.changeTabStyle=function(tabid){
+	var tabidObj = $("div[tabid='"+tabid+"']");   //在产生的 DIV tab对象(由ligerTab产生的)		
+	//处理OFFICE控件中 工具栏目 在个别浏览器上有出现不能隐藏的问题
+	FormUtil.changeTabOfficeStyle(tabidObj);
+	//处理图片控件容器会出现 不能隐藏的问题      要结合PictureShowPlugin处理
+	FormUtil.changeTabZoomStyle(tabidObj);
+};
+
+
+/**
+ * 处理OFFICE控件中 工具栏目 在个别浏览器上有出现不能隐藏的问题
+ */
+FormUtil.changeTabOfficeStyle=function(tabidObj){
+	var menuBars = $("div[name='menuBar']");
+	var offices =$("input[controltype='office']");
+	if( menuBars.length>0 && offices.length>0 ){
+		menuBars.each(function(index){         //把所有的OFFICE控件中 工具栏目隐藏掉
+			$(this).css("display","none");
+		});
+		
+		$("div[name='menuBar']",tabidObj).each(function(index){        //把 DIV tab对象(由ligerTab产生的)的OFFICE控件中 工具栏目显示出来
+			var menuBarRight = $(this).attr("menuBarRight");   //读取菜单的权限
+			if(menuBarRight!="r"){
+				$(this).css("display","block");
+			}
+		});
+		
+		//把在TAB里面的所有的OFFICE控件有影响的l-tab-content-item样式:overflow去掉
+		tabidObj.attr("style","");
+		OfficePlugin.isTabItemOffice = false;              //初始化图片控件样式的完成标志, 防止定时器不停止检查
+	}
+	
+};
+
+/**
+ * 处理图片控件容器会在个别浏览器上有出现不能隐藏的问题      要结合PictureShowPlugin处理
+ */
+FormUtil.changeTabZoomStyle=function(tabidObj){	
+	var pictureShows =$("input[controltype='pictureShow']");
+	if( pictureShows.length>0 ){
+		/**liyj注释掉的,注释掉就可以用了*/
+		//图片控件显示处理(原因:个别浏览器有问题需要处理)
+		/*pictureShows.each(function(index){         //把所有的图片控件容器隐藏掉
+			var name = $(this).attr("name");
+			var divId="div_" + name.replaceAll(":","_");
+			$("#"+divId).css("display","none");
+		});*/
+		
+		//把 DIV tab对象(由ligerTab产生的)的图片控件 显示出来
+		$("input[controltype='pictureShow']",tabidObj).each(function(index){        
+    		var name = $(this).attr("name");
+			var divId="div_" + name.replaceAll(":","_");
+			$("#"+divId).css("display","block");
+		});
+		
+		//把 DIV tab对象(由ligerTab产生的)的图片控件在IE下面(IE6、9)大图有可能会发生偏移区域,只有做居左补上
+		if(PictureShowPlugin.browserName=="MSIE"){
+			$("div.wrap_div",tabidObj).each(function(index){        
+	    		$(this).css("text-align","left");
+			});
+		}
+		
+		PictureShowPlugin.isTabItemZoom = false;                   //初始化图片控件样式的完成标志,防止定时器不停止检查
+	}
+};
+
+/**
+ * 默认是进入每一个TAB的特别处理
+ */
+FormUtil.initTabStyle=function(){
+	var tabid = null;
+	var amount=$("#formTab").length;
+	if(amount>0){
+		//默认是进入每一个TAB
+		var tabid = null;
+		$('div.l-tab-content-item').each(function(index){
+			tabid = $(this).attr("tabid");            //选中每一个TAB
+			if(typeof(tabid)!=undefined||tabid!=null||tabid!=""||tabid!="null"){ 
+				return false;
+			}
+		});
+		var tabidObj = $("div[tabid='"+tabid+"']");   //在产生的 DIV tab对象(由ligerTab产生的)	
+		//FormUtil.recursiveTabItemOffice(tabidObj);
+		//FormUtil.recursiveTabItemZoom(tabidObj);
+	}	
+};
+
+
+/**
+ * 递归函数每隔1.5秒,直到Office工具栏目的样式修改好才,停止!
+ */
+FormUtil.recursiveTabItemOffice=function(tabidObj){	
+	window.setTimeout(function(){ 
+		if(OfficePlugin.isTabItemOffice){
+			FormUtil.changeTabOfficeStyle(tabidObj);
+			if(OfficePlugin.isTabItemOffice){
+				FormUtil.recursiveTabItemOffice(tabidObj);
+			}
+		}
+	},1500); 
+};
+
+
+/**
+ * 递归函数每隔1.5秒,直到图片控件的容器的样式修改好才,停止!
+ */
+FormUtil.recursiveTabItemZoom=function(tabidObj){	
+	window.setTimeout(function(){ 
+		if(PictureShowPlugin.isTabItemZoom){
+			FormUtil.changeTabZoomStyle(tabidObj);
+			if(PictureShowPlugin.isTabItemZoom){
+				FormUtil.recursiveTabItemZoom(tabidObj);
+			}
+		}
+	},1500); 
+};
+
+
+
+/**
+ * 初始化日历控件。
+ */
+FormUtil.initCalendar=function(){
+	$("body").delegate("input.Wdate", "click",function(){
+		var fmt=$(this).attr("dateFmt");
+		WdatePicker({el:this,dateFmt:fmt});
+	});
+};
+
+
+
+/**
+ * 绑定对话框。 按钮或者文本框定义如下:
+ * dialog="{name:'globalType',fields:[{src:'TYPENAME',target:'m:mainTable:name'},{src:'TYPEID',target:'m:mainTable:address'}],query:[{'id':'bm','name':'ORGID','isMain':'true'}]}"
+ * 
+ * name:对话框的别名 fields:为字段映射,可以有多个映射。 src:对话框返回的字段。 target:需要映射的控件名称。dialogQuery:向自定义对话框传递的参数字段
+ */
+FormUtil.initCommonDialog=function(){
+	
+	//先把主表中dialog对话框的包含字段中有只读的权限时,只能把对话框功能删除(子表情况的放在CustomForm.js中处理了)
+	$("a.extend",$(".formTable")).each(function(){      //只读时,历遍超链接中自定义对话框的按钮
+		var extend=$(this);
+		var jsonStr = extend.attr('dialog');							
+		if(jsonStr != null && 'undefined' != jsonStr.toLowerCase() && jsonStr.length>2 ){
+			var jsonObj = eval('(' + jsonStr + ')');
+			var fileds = jsonObj.fields;
+			for ( var i = 0; i < fileds.length; i++) {
+				if($.isEmpty(fileds[i].target))//如果为空
+					continue;
+					var ds = $(".formTable [name$=':"+fileds[i].target+"']").not("[name^='s:']");
+					if(ds.length<1){
+						extend.remove();                 //主表字段在只读时,其内容直接为值,所以当对话框读取对应主表字段时没有,证明字段是只读的,所以要删除
+						break;
+					}else{
+						var mark = false;
+						ds.each(function(index){   //主表字段
+							var right = $(this).attr("right");
+							if(right=="r"||right=="rp"){
+								extend.remove();                 //只读和只读提交时删除
+								mark = true;
+								return false;
+							}
+						});
+						if(mark){
+							break;
+						}
+					}				
+			}
+		}                           
+	});
+	
+	$("body").delegate("[dialog]", "click", function(){
+		var obj=$(this);
+		var dialogJson=obj.attr("dialog");
+		var json=eval("("+dialogJson+")" );
+		var name=json.name;
+
+		var fields=json.fields;
+		var parentObj=obj.closest("[formtype]");
+		var isGlobal=parentObj.length==0;
+		var paramsValueString = "" ;
+		var queryArr = json.query;
+		var isMain,preSelector,isReturn=false ;
+		if(!queryArr==false && queryArr.length>0){
+			for(var i=0;i<queryArr.length;i++){
+				isMain = queryArr[i].isMain ;
+				if(isMain=="true"){
+					preSelector = ".formTable" ;
+				}else{
+					preSelector = "div[type='subtable']" ;
+				}
+				
+				//解析获取对应的数据
+				$(preSelector+" :hidden[name$=':"+queryArr[i].id+"ID']").each(function(){
+					if($(this).val()!=""){
+						paramsValueString += queryArr[i].name + "=" + $(this).val() +"&" ;
+						return false ;
+					}
+				});
+				if(paramsValueString.indexOf(queryArr[i].name)<0){
+					$(preSelector+" [name$=':"+queryArr[i].id+"']").each(function(){
+						var self = $(this) ;
+						if(self.val()!=""){
+							paramsValueString += queryArr[i].name + "=" + $(this).val() +"&" ;
+							return false ;
+						}else{
+							var selfClass = self.attr("class") ;
+							if(!selfClass==false){
+								if(selfClass.indexOf("validError")>=0){
+									isReturn = true ;
+									$.ligerDialog.warn('请填写好--'+self.attr("lablename"),'提示');
+									return false ;
+								}
+							}
+						}
+					});
+				}
+				if(isReturn) return false ;
+			}
+		}
+		CommonDialog(name,function(data){
+			var len=data.length;
+			for(var i=0;i<fields.length;i++){
+				var json=fields[i];
+				var src=json.src;
+				var targets=json.target.split(','),target;
+				while(target=targets.pop()){
+					if(!target)return;
+					var filter="[name$=':"+target+"']";
+					//在子表中选择
+					var targetObj=isGlobal?$(filter):$(filter,parentObj);
+					//单选
+					if(len==undefined){
+						targetObj.val(data[src]);
+						targetObj.trigger("change");
+					}
+					//多选
+					else{
+						for(var k=0;k<len;k++){
+							var dataJson=data[k];
+							if(json.data){
+								json.data.push(dataJson[src]);
+							}
+							else{
+								var tmp=[];
+								tmp.push(dataJson[src]);
+								json.data=tmp;
+							}
+						}
+						targetObj.val(json.data.join(","));
+						targetObj.trigger("change");
+					}
+				}
+			}
+		},paramsValueString);
+	});
+};
+
+/**
+ * 初始化统计函数事件绑定
+ */
+FormUtil.InitMathfunction = function(t){
+	if(t){
+		$("input",t).trigger("change");
+	}
+	else{
+		$("input").live('change',FormMath.doMath);
+	}
+};
+
+/**
+ * 获取目标控件的值是否为指定值
+ */
+FormUtil.getTargetVal = function(t,obj){
+	var type = obj.attr("type");
+	 if(obj.is("select")){ //下拉框
+		var val = obj.find('option:selected').val();
+		if(val==t.value)
+			return true;
+		return false;
+	 }else if(type == "radio" || type =="checkbox"){//单选框,多选框
+		 var temp = false;
+		 obj.each(function(){
+			 var me = $(this),
+			 	 state = me.attr("checked"),
+			 	 val = me.val();
+			 
+			 if(state&&t.value.indexOf(val)>-1)
+				 temp = true;
+		 });
+		 return temp;
+	 }else{
+		return false;
+	 }
+};
+
+/**
+ * 获取是否所有的选择框字段都是指定值
+ */
+FormUtil.validHasChange = function(chooseField){
+	var result = true;
+	for(var i=0,c;c=chooseField[i++];){
+		var obj = FormUtil.getTargetObj(c.key);
+		if(!FormUtil.getTargetVal(c,obj))
+			result = false;
+	}
+	return result;
+};
+
+/**
+ * 进行变更字段和表的变更
+ * @param changes
+ */
+FormUtil.doChange = function(choiceKey,changes){
+	for(var i=0,c;c=changes[i++];){
+		//对表进行变更
+		if(!$.isEmpty(c.fieldtype) && c.fieldtype == '1')	
+			FormUtil.doChangeTable(choiceKey,c);
+		else//对字段进行变更
+			FormUtil.doChangeField(choiceKey,c);
+	}
+};
+
+/**
+ * 变换预处理
+ */
+FormUtil.preChange = function(choice,changes,t){
+	var choiceKey = [],
+		trace = $changeObj.data("formtrace");
+	for(var i=0,c;c=choice[i++];){
+		choiceKey.push(c.key);
+		if(trace){
+			for(var j=0,n;n=changes[j++];){
+				var traceCall = trace[n.key+'_'+n.type];
+				if(traceCall){
+					var me = null;
+					if(!$.isEmpty(n.fieldtype) && n.fieldtype == '1')
+						me = $("div[type='subtable'][tablename='"+n.key+"']");
+					else{
+						me = FormUtil.getTargetObj(n.key);
+					}
+					traceCall.call(me,n);
+					me.trigger("blur");
+					delete trace[n.key+'_'+n.type];
+				}
+			}
+		}
+	}
+	if(t){
+		$changeFunc.push({choiceKey:choiceKey,changes:changes});	
+	}
+};
+
+FormUtil.isAttachment = function(obj){
+	var type = obj.attr("controltype");
+	if(!$.isEmpty(type) && type== 'attachment')
+		return true;
+	else
+		return false;
+}
+
+//字段变换方法
+var $fieldChange = {
+        1:function(c){//隐藏
+			var self = $(this).val('');
+			if(FormUtil.isAttachment(self)){	
+				self.parent("div").hide();
+			}else{
+				self.hide();
+				self.parents("label").hide();
+				//隐藏自定义对话框按钮
+				self.closest("span").siblings().hide();
+			}
+		}
+        ,
+        2:function(c){//非隐藏
+			var self = $(this);		
+			if(FormUtil.isAttachment(self)){	
+				self.parent("div").show();
+			}else{
+				self.show();
+				self.parents("label").show();
+				//显示自定义对话框按钮
+				self.closest("span").siblings().show();
+			}
+		}
+        ,
+        3:function(c){//只读
+			var self = $(this);
+			if(self.is("a"))//对选择器的特殊处理
+				 return;
+			if(FormUtil.isAttachment(self)){	
+				self.siblings("a[field='"+c.key+"']").hide();
+				self.siblings(".attachement").find("a.cancel").each(function(){
+					$(this).hide();
+				});
+			}else{	
+				self.attr("disabled",true);
+			}
+		}
+        ,
+        4:function(c){//非只读
+			var self = $(this);
+			if(self.is("a"))//对选择器的特殊处理
+				 return;
+			if(FormUtil.isAttachment(self)){	
+				self.siblings("a[field='"+c.key+"']").show();
+				self.siblings(".attachement").find("a.cancel").each(function(){
+					$(this).show();
+				});
+			}else{	
+				self.removeAttr("disabled");
+			}
+		}
+        ,
+        5:function(c){//必填					
+			var self = $(this),
+				validate = self.attr("validate");
+			if(self.is("a"))//对选择器的特殊处理
+				 return;
+			if(FormUtil.isAttachment(self)){		
+				self.siblings("a.selectFile").addClass("validError");
+				self.parent().attr('right','b');
+			}else{
+				self.addClass("validError");
+				if(!validate){
+					self.attr("validate","{required:true}");						
+				}
+				else{
+					validate = eval("("+validate+")");
+					if(!validate.required){
+						validate.required = true;
+						self.attr("validate",JSON2.stringify(validate));
+					}
+				}
+				if(!$.isEmpty(self.val()))
+					self.removeClass("validError");
+				else{
+					if(self.hasClass("Wdate")){
+						self.css("border","1px solid red");
+					}
+				}
+			}
+		}
+        ,
+        6:function(c){//非必填
+			var self = $(this),
+				validate = self.attr("validate");
+			if(self.is("a"))//对选择器的特殊处理
+				 return;
+			if(FormUtil.isAttachment(self)){
+				self.siblings("a.selectFile").removeClass("validError")
+				self.parent().attr('right','w');
+			}else{
+				if(validate){
+					validate = eval("("+validate+")");
+					if(validate.required){
+						delete validate.required;
+						self.attr("validate",JSON2.stringify(validate));
+					}
+					//删除样式
+					self.removeClass("validError");
+					if(self.hasClass("Wdate")){
+						self.css("border","1px solid #999999");
+					}
+				}
+			}
+		}
+        ,
+        7:function(c){//置空
+			var self = $(this);
+			if(self.is("a"))//对选择器的特殊处理
+				 return;
+			if(FormUtil.isAttachment(self))
+				self.siblings(".attachement").html('');
+			if(self.attr("type")=="checkbox"||self.attr("type")=="radio")
+				self.removeAttr("checked");
+			$(this).val('');
+		}
+	};
+
+/**
+ * 获取关联的需要变动的字段
+ */
+FormUtil.getTargetObj = function(filter){
+	if(!$changeObj){
+		return $("[name='"+filter+"']");
+	}
+	var formtype = $changeObj.parents("[formtype]"),
+		me = null;
+	if(formtype&&formtype.length>0){
+		me = $("[name='"+filter+"']",formtype);
+	}
+	else{
+		me = $("[name='"+filter+"']");
+	}
+	return me;
+};
+
+/**
+ *  字段变换
+ * @param {} changeField
+ */
+FormUtil.doChangeField = function(choiceKey,c){
+	var me = FormUtil.getTargetObj(c.key);
+	if(!me||me.length==0)return;
+	var changeType = c.type,
+		traceCall = null;
+	
+	if(changeType!='8'){
+		var changeFun = $fieldChange[changeType];
+		if(changeType%2){
+			traceCall = $fieldChange[++changeType];
+		}
+		else{
+			traceCall = $fieldChange[--changeType];
+		}
+		me.each(function(){
+			changeFun.call(this,c);
+		});
+	}
+	else{
+		var	reduceSet = c.cascade.reduce,
+			oldHtml = '';
+			
+		me.each(function(){
+			var self = $(this),
+				myType = self.attr('type');
+			if($(this).is("a"))//对选择器的特殊处理
+				 return;
+			if(myType=='radio'||myType=='checkbox'){
+				var spanPar = self.parents("span");
+				for(var i=0,c;c=reduceSet[i++];){
+					if(self.val()==c.id){
+						spanPar.remove();
+					}
+				}
+			}
+			else{//下拉框
+				isSelect = true;
+				oldHtml = self.html();
+				var options = self.find("option");			
+				for(var i=0,c;c=reduceSet[i++];){
+					for(var j=0,n;n=options[j++];){
+						var t = $(n);
+						if(!t.val())continue;
+						if(t.val()==c.id){
+							t.remove();
+						}
+					}
+				}
+			}
+		});
+		FormUtil.putInFormTrace(choiceKey,"tracedata",c.key,oldHtml);
+		traceCall = function(c){
+			var oldHtmlObj = $changeObj.data("tracedata");
+			if(oldHtmlObj){
+				oldHtml = oldHtmlObj[c.key];
+				$(this).each(function(){
+					var curValue = $(this).val();
+					$(this).html(oldHtml).val(curValue).trigger("change");
+				});
+				delete oldHtmlObj[c.key];
+			}
+		};
+	}
+	FormUtil.putInFormTrace(choiceKey,"formtrace",c.key+'_'+c.type,traceCall);
+	me.trigger("blur");
+};
+
+/**
+ * 将变动轨迹放入控件的缓存数据中
+ */
+FormUtil.putInFormTrace = function(choiceKey,datakey,key,value){
+	for(var j=0,n;n=choiceKey[j++];){
+		var changeObj = FormUtil.getTargetObj(n);
+		if(!changeObj)continue;
+		var formTrace = changeObj.data(datakey);
+		if(!formTrace){
+			formTrace = {};
+			formTrace[key] = value;
+			changeObj.data(datakey,formTrace);
+		}
+		else{
+			formTrace[key] = value;
+		}
+	}
+};
+
+//表表换方法集合
+var $tableChange = {
+		1:function(){//隐藏
+			var self = $(this);
+			self.hide();
+		},
+		2:function(){//非隐藏
+			var self = $(this);
+			self.show();
+		},
+		3:function(){//只读(不可以添加)
+			var self = $(this);
+			$('a.add',self).hide();
+			self.find('[formType]').prev().unbind('contextmenu');	
+			$('td',self).find('input,select,textarea').attr("disabled","disabled");
+			$('td',self).find('a').hide();
+		},
+		4:function(){//非只读(可以添加)
+			var self = $(this);
+			$('a.add',self).show();	
+			$('td',self).find('input,select,textarea').removeAttr("disabled","disabled");
+			$('td',self).find('a').show();
+		},
+		5:function(){//必填
+			var self = $(this);
+			var y =self.attr('right');
+			self.attr('right','b');
+			self.attr("yright",y);
+		},
+		6:function(){//非必填
+			var self = $(this);
+			var y =	self.attr("yright");
+			self.attr('right',y?'w':y);
+		},
+		7:function(){//置空
+			var self = $(this);
+			$(":text,select",self).each(function(){
+				 $(this).val('');
+			});
+			$("textarea",self).each(function(){
+				var s= 	$(this);
+				//处理附件
+				if(FormUtil.isAttachment(s))
+					s.siblings(".attachement").html('');
+				s.val('');
+			});
+			$("input[type='radio']",self).each(function(){
+				 $(this).removeAttr("checked");
+			});
+			$("input[type='checkbox']",self).each(function(){
+				 $(this).removeAttr("checked");
+			});
+		}
+};
+
+/**
+ * 表变换
+ * @param {} c
+ */
+FormUtil.doChangeTable = function(choiceKey,c){	
+	var me = $("div[type='subtable'][tablename='"+c.key+"']"),
+		changeType = c.type;
+	
+	var changeFun = $tableChange[changeType];
+	if(changeType%2){
+		traceCall = $tableChange[++changeType];
+	}
+	else{
+		traceCall = $tableChange[--changeType];
+	}
+	me.each(function(){
+		changeFun.call(this,c);
+	});
+	FormUtil.putInFormTrace(choiceKey,"formtrace",c.key+'_'+c.type,traceCall);
+};
+
+var $changeObj = null,
+	$changeFunc = [],
+	$changeNoChoise = [];
+
+FormUtil.ChangeNoChoise = function(){
+	FormUtil.doChange([],$changeNoChoise);
+};
+
+/**
+ * 联动设置的初始化
+ */
+FormUtil.InitGangedSet = function(d){
+	$changeNoChoise = [];
+	for(var i=0,c;c=d[i++];){
+		var choisefield = eval("("+c.choisefield+")"),
+			changefield = eval("("+c.changefield+")");
+		
+		if(choisefield&&choisefield.length==0){
+			$changeNoChoise = $changeNoChoise.concat(changefield);
+		}
+		
+		for(var j=0,m;m=choisefield[j++];){
+			var changeObj = $("*[name='"+m.key+"']");
+			changeObj.die("change").live("change",function(e){
+				$changeFunc = [];
+				$changeObj = $(e.target);
+				var	key = $changeObj.attr("name");
+				//当一个select控件绑定了多次事件时,需要多次验证这个控件的所选值
+				//比如 性别这个字段,在联动中设置了选择'男'时隐藏一个字段,选择'女'时 显示一个字段,此时需要2次验证
+				if(!key)return;
+				for(var x=0,n;n=d[x++];){
+					if(n.choisefield.indexOf(key)>-1){
+						var curChoise = eval("("+n.choisefield+")"),
+							r = FormUtil.validHasChange(curChoise);
+						FormUtil.preChange(curChoise,eval("("+n.changefield+")"),r);
+					}
+				}
+				//延迟处理:等待该变换字段的所有还原方法调用完以后再进行变换
+				if($changeFunc.length>0){
+					for(var y=0,o;o=$changeFunc[y++];){
+						FormUtil.doChange(o.choiceKey,o.changes);
+					}
+				}
+			});
+			changeObj.trigger("change");
+		}
+	}
+	FormUtil.ChangeNoChoise();
+};
+
+/**
+ * 新增子表记录时,触发联动字段change,使新增记录保持合适的联动状态
+ */
+FormUtil.triggerChoice = function(newRow){
+	$("[name]",newRow).each(function(){
+		var me = $(this),
+			name = me.attr("name"),
+			choiceName = FormUtil.findWithChange(name);
+		
+		if(choiceName){
+			var choiceObj = $("[name='"+choiceName+"']"),
+				val = choiceObj.val(); 
+			choiceObj.trigger("change");
+		}
+	});
+	
+};
+
+/**
+ * 遍历联动设置记录,查找 应该触发哪个字段
+ */
+FormUtil.findWithChange = function(name){
+	if(typeof bpmGangedSets == 'undefined')return null;
+	for(var i=0,c;c=bpmGangedSets[i++];){
+		var choisefield = eval("("+c.choisefield+")"),
+			changefield = eval("("+c.changefield+")");
+		
+		if(choisefield&&choisefield.length==0){
+			return null;
+		}
+		for(var j=0,m;m=changefield[j++];){
+			if(m.key==name){
+				return choisefield[0]["key"];
+			}
+		}
+	}
+};
+
+/**
+ * 绑定自定义查询。 按钮或者文本框定义如下:
+ * query="{name:'globalType',evt:'click',fields:[{src:'TYPENAME',target:'m:mainTable:name'},{src:'TYPEID',target:'m:mainTable:address'}]}"
+ * 
+ * name:自定义查询的别名 fields:为字段映射,可以有多个映射。 src:对话框返回的字段。 target:需要映射的控件名称。
+ */
+FormUtil.initCommonQuery=function(){
+	$("[query]").live("keyup change", function(event){
+		var obj = $(this),
+			queryJson=obj.attr("query"),
+			json = eval("("+queryJson+")"),
+			evt = json.evt,
+			next = obj.next();
+		if(evt.key!=event.type){
+			return;
+		}
+		if("carriage_return" == evt.name && event.keyCode != evt.code){
+			return;
+		}
+		var obj=$(this);
+		var queryJson=obj.attr("query");
+		var json = eval("("+queryJson+")");
+		var name = json.name;
+		var cond = json.cond;
+		
+		
+		var value = obj.val();
+		if(next&&next.length > 0){
+			//如果是 选择器类型字段 则获取 选择器的ID字段值 作为查询条件
+			if(next.hasClass("link")&&next[0].tagName == "A"){
+				value = $("input[name='"+obj.attr("name")+"ID']").val();
+			}
+		}
+		if(!value){
+			return;
+		}
+		var fields=json.fields;
+		var parentObj=obj.closest("[formtype]");
+		var isGlobal=parentObj.length==0;
+		var querydataStr = "{"+cond+":\""+value+"\"}";
+	    var  queryCond = {alias:name,querydata:querydataStr,page:1,pagesize:10};
+		DoQuery(queryCond,function(data){
+			if(data.errors){
+				return;
+			}
+			for(var i=0;i<fields.length;i++){
+				var json=fields[i];
+				var src=json.src;
+				var targets=json.target;
+				var target;
+				while(target=targets.pop()){
+					if(!target)return;
+					var filter="[name$=':"+target+"']";
+					//在子表中选择
+					var targetObj=isGlobal?$(filter):$(filter,parentObj);
+					if(data.list.length<1){
+						targetObj.val("");
+						continue;
+					}
+					var dataArr = [] ;
+					for(var k=0;k<data.list.length;k++){
+						var dataJson=data.list[k];
+						if(dataArr){
+							dataArr.push(dataJson[src.toLowerCase()]);
+						}
+						else{
+							var tmp=[];
+							tmp.push(dataJson[src.toLowerCase()]);
+							dataArr=tmp;
+						}
+					}
+					targetObj.val(dataArr.join(","));
+					targetObj.trigger("change").trigger("blur");
+				}
+			}				
+		});
+	}).trigger("change");
+};
+
+FormUtil.initExtLink = function(){
+	$("body").delegate("a[linktype]","click",function(){
+		var linktype = $(this).attr("linktype");
+		if(!linktype){
+			return;
+		}
+		var type = parseInt(linktype);
+		var winArgs="dialogWidth:800px;dialogHeight:600px;help:0;status:1;scroll:1;center:1";
+		switch (type) {
+		case 4://用户单选
+		case 8://用户多选
+			var userid = $(this).attr("refid");
+			url = __ctx+"/platform/system/sysUser/getByUserId.ht?canReturn=2&userId="+userid;
+			
+			//window.showModalDialog(url,"",winArgs);
+			/*KILLDIALOG*/
+			DialogUtil.open({
+				height:600,
+				width: 800,
+				title : '用户多选',
+				url: url, 
+				isResize: true,
+			});
+			
+			break;
+		case 5://角色
+		case 17://角色
+			var roleId = $(this).attr("refid");
+			ShowExeInfo.showRole(roleId);
+			break;
+		case 6://组织
+		case 18://组织
+			var orgId = $(this).attr("refid");
+			ShowExeInfo.showOrg(orgId);
+			break;
+		case 7://岗位
+		case 19://岗位
+			var posId = $(this).attr("refid");
+			ShowExeInfo.showPos(posId);
+			break;
+		case 20://流程引用
+			var runId = $(this).attr("refid");
+			var url=__ctx+"/platform/bpm/processRun/info.ht?isOpenDialog=1&link=1&runId="+runId;
+			var args="dialogWidth:900px;dialogHeight:700px;help:0;status:1;scroll:1;center:1";
+			//window.showModalDialog(url,"",args);
+			/*KILLDIALOG*/
+			DialogUtil.open({
+				height:700,
+				width: 900,
+				title : '',
+				url: url, 
+				isResize: true,
+			});
+			break;
+		}
+	});
+};
+/**
+* 初始化word套打按钮
+**/
+FormUtil.initWordTemplate=function(){
+	$("body").delegate("[templateAlias]", "click", function(){
+		var obj=$(this);
+		var templateAlias=obj.attr("templateAlias");
+		var businessKey = $('#businessKey').val();
+		if(!businessKey) businessKey = 0;
+		var previewUrl = __ctx+'/platform/system/sysWordTemplate/preview_'+templateAlias+'.ht?pk='+businessKey;
+		$.openFullWindow(previewUrl.getNewUrl());
+	});
+};

+ 807 - 0
web/codegen/js/OfficeControl.js

@@ -0,0 +1,807 @@
+/**
+ * office控件。
+ * 使用方法:
+ * var obj=new OfficeControl();
+ * obj.renderTo("divContainer",{fileId:123});
+ * 	divContainer: 文档容器id
+ * 	fileId:附件id,如果指定那么根据该文件id加载word文档。
+ *  
+ *  saveRemote:保存文档到服务器
+ *  
+ * @returns {OfficeControl}
+ */
+OfficeControl=function(){
+	{
+		
+		var Sys = {};
+		var ua = navigator.userAgent.toLowerCase();
+		var s;
+		(s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] : (s = ua
+			    .match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] : (s = ua
+				.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] : (s = ua
+				.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] : (s = ua
+				.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;
+		
+		
+		this.controlId="";
+		this.controlObj=null;
+		this.height="100%";
+		this.width="100%";
+		var _self=this;
+		this.isFileOpen=false;
+		this.templatetype = 1;// 模板类型
+		//这里发布给客户时,可以修改ProductCaption,ProductKey值。
+		this.params={
+				Caption:"欢迎使用",
+				MakerCaption:"广州宏天软件有限公司",
+				MakerKey:"CF4960BFDB79D36ADDC5493B116D39D6A4E335D9",
+				ProductCaption:"广州宏天软件有限公司",
+				ProductKey:"32B10860DB12537FF0003CC2BFD0FA190CB0407E",
+			//	WebUserName:"广州宏天软件有限公司",
+				TitlebarColor:"14402205",
+				IsCheckEkey:"0",
+				IsUseUTF8URL:"-1",
+				IsUseUTF8Data:"-1",
+				BorderStyle:"1",
+				BorderColor:"14402205",
+				TitlebarTextColor:"0",
+				MenubarColor:"14402205",
+				MenuButtonColor:"16180947",
+				MenuBarStyle:"3",
+				MenuButtonStyle:"7"
+			};
+		this.config={doctype:'doc',fileId:"",controlId:"officeObj",myNum:'0',user:{}};
+	};
+	/**
+	 * 处理文件菜单事件。
+	 */
+	this.itemclick=function(item){
+		var txt=item.text;
+		switch(txt){
+			case "新建":
+				_self.newDoc();
+				break;
+			case "打开":
+				_self.controlObj.showDialog(1);
+				break;
+			case "另存为":
+				if(!_self.isFileOpen) return;
+				_self.controlObj.showDialog(3);
+				break;
+			case "关闭":
+				if(!_self.isFileOpen) return;
+				_self.closeDoc();
+				break;
+			case "打印设置":
+				if(!_self.isFileOpen) return;
+				_self.controlObj.showdialog(5);
+				break;
+			case "打印预览":
+				if(!_self.isFileOpen) return;
+				_self.controlObj.PrintPreview();
+				break;
+			case "打印":
+				if(!_self.isFileOpen) return;
+				_self.controlObj.printout(true);
+				break;
+		}
+		
+	},
+	/**
+	 * 获取文档类型。
+	 */
+	this.getDocType=function(){
+		var docType="Word.Document";
+		var type=this.config.doctype;
+		switch(type){
+			case "doc":
+				docType="Word.Document";
+				break;
+			case "xls":
+				docType="Excel.Sheet";
+				break;
+			case "ppt":
+				docType="PowerPoint.Show";
+				break;
+		}
+		return docType;
+	},
+	//click事件需要事先进行定义。
+	this.memuItems= { width: 120, items:
+        [{text: '新建', click: this.itemclick },
+         {text: '打开', click: this.itemclick },
+         {text: '另存为', click: this.itemclick },
+         {text: '关闭', click: this.itemclick },
+         {line: true },
+         {text: '打印设置', click: this.itemclick },
+         {text: '打印预览', click: this.itemclick },
+         {text: '打印', click: this.itemclick }]
+     };
+	/**
+	 * 处理菜单点击事件。
+	 */
+	this.buttonClick=function(item){
+
+		var txt=item.text;
+		switch(txt){
+			case "留痕":
+				_self.setDocUser();
+				_self.controlObj.ActiveDocument.TrackRevisions=true;
+				break;
+			case "不留痕":
+				_self.controlObj.ActiveDocument.TrackRevisions=false;
+				break;
+			case "清除痕迹":
+				_self.controlObj.ActiveDocument.AcceptAllRevisions();
+				break;
+			case "模版套红":
+				_self.insertContentTemplate();
+				break;
+			case "选择模版":
+				_self.insertTemplate();
+				break;
+			case "手写签名":
+				_self.insertHandSign();
+				break;
+			case "盖章":
+				_self.signature();
+				break;
+			case "全屏":
+				_self.controlObj.FullScreenMode=true;
+				break;
+			case "转成PDF":
+				_self.officeToPdf();
+				break;
+			case "Ekey盖章":
+				_self.signatureFromEkey();
+				break;
+			case "PDF盖章":
+				_self.signaturePdfFromEkey();
+				break;
+		}
+	},
+	
+	/**
+	 * 手写签名
+	 */
+	this.insertHandSign=function(){
+		try{
+			_self.controlObj.DoHandSign2(
+					_self.config.user.name,//手写签名用户名称
+					"ntko",//signkey,DoCheckSign(检查印章函数)需要的验证密钥。
+					0,//left
+					0,//top
+					1,//relative,设定签名位置的参照对象.0:表示按照屏幕位置插入,此时,Left,Top属性不起作用。1:光标位置;2:页边距;3:页面距离 4:默认设置栏,段落(为兼容以前版本默认方式)
+					100);
+		}catch(err){
+			$.ligerDialog.error("insertHandSign:" +err.name + ": " + err.message);
+		}
+	},
+	
+	/**
+	 * 可以设置文件用户
+	 */
+	this.setDocUser=function(){
+		with(_self.controlObj.ActiveDocument.Application){
+			UserName = _self.config.user.name;//设置用户信息 
+			UserInitials= _self.config.user.name;//设置用户信息缩写
+		} 
+	}, 
+	/**
+	 * 获取模版
+	 */
+	this.getTemplate=function(callback){
+		var url=__ctx +"/platform/system/sysOfficeTemplate/dialog.ht?type="+this.templatetype;
+		var winArgs="dialogWidth=600px;dialogHeight=400px;help=0;status=0;scroll=1;center=1";
+		url=url.getNewUrl();
+		/*var rtn=window.showModalDialog(url,"",winArgs);
+		return rtn;*/
+		/*KILLDIALOG*/
+		DialogUtil.open({
+			height:400,
+			width: 600,
+			title : '获取模版',
+			url: url, 
+			isResize: true,
+			sucCall:callback
+		});
+		
+	},
+	/**
+	 * 模版套红。
+	 */
+	this.insertContentTemplate=function(){
+		try{
+/*			this.templatetype = 2;
+			var rtn=_self.getTemplate();
+			this.templatetype = 1;
+			if(rtn==undefined || rtn==null ){
+				return false;
+			}
+			var templateUrl = __ctx + "/platform/system/sysOfficeTemplate/getTemplateById.ht?templateId=" + rtn.templateId;
+			
+			//选择对象当前文档的所有内容
+			var curSel = _self.controlObj.ActiveDocument.Application.Selection;
+			curSel.WholeStory();
+			curSel.Cut();
+			
+			if(!(Sys.firefox) && !(Sys.chrome)){      //IE是同步的,它 会等待模版加载成功后执行书签的插入 (火狐和谷歌就不可以)
+				//插入模板
+				_self.controlObj.AddTemplateFromURL(templateUrl);     //AddTemplateFromURL
+				var BookMarkName = "content";
+				if(!_self.controlObj.ActiveDocument.BookMarks.Exists(BookMarkName)){
+					alert("Word 模板中不存在名称为:\""+BookMarkName+"\"的书签!");
+					return false;
+				}
+				var bkmkObj = _self.controlObj.ActiveDocument.BookMarks(BookMarkName);	
+				var saverange = bkmkObj.Range;
+				saverange.Paste();
+				_self.controlObj.ActiveDocument.Bookmarks.Add(BookMarkName,saverange);	
+			}else{
+				//插入模板(火狐谷歌 异步)
+				_self.controlObj.AddTemplateFromURL(templateUrl);     //AddTemplateFromURL
+			}*/	
+			
+			
+			this.templatetype = 2;
+			_self.getTemplate(function(rtn){
+				this.templatetype = 1;
+				if(rtn==undefined || rtn==null ){
+					return false;
+				}
+				var templateUrl = __ctx + "/platform/system/sysOfficeTemplate/getTemplateById.ht?templateId=" + rtn.templateId;
+				
+				//选择对象当前文档的所有内容
+				var curSel = _self.controlObj.ActiveDocument.Application.Selection;
+				curSel.WholeStory();
+				curSel.Cut();
+				
+				if(!(Sys.firefox) && !(Sys.chrome)){      //IE是同步的,它 会等待模版加载成功后执行书签的插入 (火狐和谷歌就不可以)
+					//插入模板
+					_self.controlObj.AddTemplateFromURL(templateUrl);     //AddTemplateFromURL
+					var BookMarkName = "content";
+					if(!_self.controlObj.ActiveDocument.BookMarks.Exists(BookMarkName)){
+						alert("Word 模板中不存在名称为:\""+BookMarkName+"\"的书签!");
+						return false;
+					}
+					var bkmkObj = _self.controlObj.ActiveDocument.BookMarks(BookMarkName);	
+					var saverange = bkmkObj.Range;
+					saverange.Paste();
+					_self.controlObj.ActiveDocument.Bookmarks.Add(BookMarkName,saverange);	
+				}else{
+					//插入模板(火狐谷歌 异步)
+					_self.controlObj.AddTemplateFromURL(templateUrl);     //AddTemplateFromURL
+				}
+			});
+			
+		}catch(err){
+			$.ligerDialog.error("insertTemplate:" +err.name + ": " + err.message);
+		}
+	},
+	/**
+	 * 插入word模版。
+	 */
+	this.insertTemplate=function(){
+		try{
+			/*var rtn=_self.getTemplate();
+			if(rtn==undefined || rtn==null ){
+				return;
+			}
+			var headFileURL = __ctx + "/platform/system/sysOfficeTemplate/getTemplateById.ht?templateId=" + rtn.templateId;
+			_self.controlObj.ActiveDocument.Application.Selection.HomeKey(6,0);//光标移动到文档开头
+			_self.controlObj.OpenFromURL(headFileURL);//在光标位置插入红头文档
+*/		
+			_self.getTemplate(function(rtn){
+				if(rtn==undefined || rtn==null ){
+					return;
+				}
+				var headFileURL = __ctx + "/platform/system/sysOfficeTemplate/getTemplateById.ht?templateId=" + rtn.templateId;
+				_self.controlObj.ActiveDocument.Application.Selection.HomeKey(6,0);//光标移动到文档开头
+				_self.controlObj.OpenFromURL(headFileURL);//在光标位置插入红头文档
+			});
+		}catch(err){
+			$.ligerDialog.error("insertTemplate:" +err.name + ": " + err.message);
+		}
+	},
+		
+	/**
+	 * 获取控件的html。
+	 */
+	this.getControlHtml=function(controlId){
+			var cabPath=__ctx +"/media/office/OfficeControl.cab#version=5,0,2,5";
+			var str = '';
+			if (Sys.ie) {
+				str = '<object  id="'+controlId+'" codeBase="'+cabPath+'" height="'+this.height+'" width="'+this.width+'" classid="clsid:A39F1330-3322-4a1d-9BF0-0BA2BB90E970" style="z-index:-1;">';
+				for(var key in this.params){
+					str+='  <param name="'+key+'" value="'+this.params[key]+'">  ';
+				}
+	            str+="</object>";
+			} else if (Sys.firefox||Sys.chrome) {
+				if(this.config.doctype=='pdf'){
+					str = '<object id="'+controlId+'" codeBase="'+cabPath+'" height="'+this.height+'" width="'+this.width+'"  type="application/ntko-plug" ForOnSaveToURL="saveMethodOnComplete" ForOndocumentopened="documentOpenedOnComplete'+ this.config.myNum +'" ForOnAddTemplateFromURL="addTemplateOnComplete'+ this.config.myNum +'" ';							
+				}else{
+					str = '<object id="'+controlId+'" codeBase="'+cabPath+'" height="'+this.height+'" width="'+this.width+'"  type="application/ntko-plug" ForOnSaveAsOtherFormatToURL="saveMethodOnComplete" ForOndocumentopened="documentOpenedOnComplete'+ this.config.myNum +'" ForOnAddTemplateFromURL="addTemplateOnComplete'+ this.config.myNum +'" ';							
+				}for(var key in this.params){
+					str += '_'+key+'="'+this.params[key]+'"	';
+				}
+				str +='clsid="{A39F1330-3322-4a1d-9BF0-0BA2BB90E970}" >';
+		//		str +='<SPAN STYLE="color:red">尚未安装NTKO Web FireFox跨浏览器插件。请点击<a href="ntkoplugins.xpi">安装组1件</a></SPAN>   ';
+				str +='</object>  ';				
+			}/*else{
+				alert("对不起,控件暂时不支持该浏览器!");
+			}*/
+			
+			//是火狐和谷歌时 增加插入套红模版和只读设置的回调函数
+			if(Sys.firefox||Sys.chrome){
+				str += ' <script type="text/javascript" > ';
+				str += '		function addTemplateOnComplete'+ this.config.myNum +'(){ ';
+				str += '			addTemplateOnComplete("'+this.config.myNum+'"); ';
+				str += '		} ';
+				str += '	                 ';
+				str += '		function documentOpenedOnComplete'+ this.config.myNum +'(){ ';
+				str += '			documentOpenedOnComplete("'+this.config.myNum+'"); ';
+				str += '		} ';
+				str += ' </script> ';
+			}
+            return str;
+	},
+	
+	/**
+	 * 将控件添加到div容器中。
+	 * 第一个参数:
+	 * div的容器ID
+	 * 第二个参数:
+	 * conf:
+	 * doctype:文挡类型:可以为doc,xls,ppt
+	 * fileId:服务器保存的文件ID
+	 */
+	this.renderTo=function(divContainerId,conf){
+		this.config=$.extend({},this.config,conf);
+		//格式为空时默认设置为doc文件
+		if(!this.config.doctype){
+			this.config.doctype = "doc";
+		}
+		if(!(Sys.firefox) && !(Sys.chrome)){
+			Sys.ie = true;
+		}
+		this.controlId="office_" + divContainerId;
+		var html=this.getControlHtml(this.controlId);
+		var menuBar = '<div name="menuBar"  ></div>';
+		$("#" +divContainerId).html("");
+		$("#" +divContainerId).append(menuBar);
+		$("#" +divContainerId).append(html);
+		
+		var obj=document.getElementById(this.controlId);
+		
+		this.controlObj=obj;
+		this.controlObj.MenuBar=false;
+		this.controlObj.Titlebar=false;
+		this.controlObj.IsShowToolMenu=true;
+		this.controlObj.ToolBars=true;
+		var jqControlObj=$(this.controlObj);
+		
+		//修改控件的高度。
+		jqControlObj.height(jqControlObj.parent().height()-26);
+		
+		var docType=this.config.doctype;
+		var items=[];	 
+		 //2013-05-31 add
+		 if(docType=="pdf"){
+				 items.push( { text: 'PDF盖章' ,click:this.buttonClick});
+		 }else{
+			 items.push({ text: '文件', menu: this.memuItems});
+			 if(docType=="doc"){
+					 items.push({ text: '留痕',click:this.buttonClick });
+					 items.push({ text: '不留痕' ,click:this.buttonClick});
+					 items.push( { text: '清除痕迹' ,click:this.buttonClick});
+			 }
+			 items.push( { text: '模版套红' ,click:this.buttonClick});
+			 items.push({ text: '选择模版' ,click:this.buttonClick});
+			 items.push({ text: '手写签名' ,click:this.buttonClick});
+			 items.push({ text: '盖章' ,click:this.buttonClick});
+			 items.push( { text: '转成PDF' ,click:this.buttonClick});
+			 items.push( { text: 'Ekey盖章' ,click:this.buttonClick});
+		 }
+		 items.push({ text: '全屏' ,click:this.buttonClick});
+		 
+		 $("#" +divContainerId +" div[name='menuBar']").ligerMenuBar({ items:items});
+		 
+		 if(Sys.ie||Sys.firefox||Sys.chrome){
+			 if(docType=="pdf"){
+				 this.addPDFSupport();
+				 this.isFileOpen=true;
+			 }else{
+				 this.initDoc();
+			 }
+		 }
+		 else{
+			 $.ligerDialog.warn('office控件只支持IE、Firefox和Chrome 32位版的浏览器!');
+		 }
+		 
+    };
+	
+    /**
+	 * 控件载入时,载入文档。
+	 */
+	this.initDoc=function(){
+		//指定了文件。
+		if(this.config.fileId!="" && this.config.fileId>0){
+			var path= __ctx + "/platform/system/sysFile/getFileById.ht?fileId=" + this.config.fileId;
+			try{
+				this.controlObj.OpenFromURL(path);
+				this.isFileOpen=true;
+			}
+			catch(err){
+				try{
+					this.addPDFSupport();
+					this.isFileOpen=true;
+				}
+				catch(err){
+					this.newDoc();
+				}
+			}
+		}
+		//新建文档。
+		else{
+			this.newDoc();
+		}
+		
+		//IE浏览器是同步的 增加 设置文档是否只读,其它的为异步(由回调接管函数 OfficeControl.js 中有  documentOpenedOnComplete 处理 )
+		if(Sys.ie){
+			this.setFileReadOnly(false);
+		}
+	};
+	/**
+	 * 关闭文档。
+	 */
+	this.closeDoc=function(){
+		if(Sys.ie||Sys.firefox||Sys.chrome){     //$.browser.msie
+			 this.initDoc();
+		}else{
+			 $.ligerDialog.warn('office控件只支持IE、Firefox和Chrome 32位版的浏览器!');
+		}
+		try{
+			this.controlObj.close();
+			this.isFileOpen=false;
+		}catch(err){			
+			$.ligerDialog.error('closeDoc:' +err.name + ": " + err.message);
+		}
+	};
+	
+	/**
+	 * 新建文档。
+	 */
+	this.newDoc=function(){
+		try
+		{
+			var docType=this.getDocType();
+			this.controlObj.CreateNew(docType);
+			this.isFileOpen=true;
+		}
+		catch(err){
+			try{
+				this.controlObj.CreateNew("WPS.Document");
+				this.isFileOpen=true;
+			}catch(err){
+				$.ligerDialog.error("newDoc:" +err.name + ": " + err.message);
+			}
+		}
+	};
+	
+	/**
+	 * 保存文件到服务器。
+	 * 服务器返回文件id到this.config.fileId,同时返回文件ID。
+	 */
+	this.saveRemote=function(inputObjNum){
+		var path= __ctx + "/platform/system/sysFile/saveFile.ht";
+		var uploadName = this.controlId +"_name";
+		var params="fileId=" + this.config.fileId + "&uploadName="+ uploadName;
+		try{
+			//保存数据到服务器。
+			var curDate=new Date();
+			var docName=Math.random()*curDate.getMilliseconds()*10000;
+			/*如果人后辍名为空时,需要用对象的类型来区分是什么文件返回当前控件中的文档类型,
+				  只读 0:  没有文档; 100 =其他文档类型;
+				1=word;2=Excel.Sheet或者 Excel.Chart ;
+				3=PowerPoint.Show; 4= Visio.Drawing; 
+				5=MSProject.Project; 6= WPS Doc;
+				7:Kingsoft Sheet; 51 = PDF文档
+			*/
+			if(this.config.doctype==''||this.config.doctype==null|| 'undefined' == typeof (this.config.doctype)){
+				var type = this.controlObj.DocType;
+				if(type==2){
+					this.config.doctype = "xls";
+				}else if(type==3){
+					this.config.doctype = "ppt";
+				}else if(type==51){
+					this.config.doctype = "pdf";
+				}else{
+					this.config.doctype = "doc";
+				}
+			}
+			var result;
+			if(Sys.firefox||Sys.chrome){   //火狐谷歌浏览器控件文档保存事件(异步的)
+				if(typeof(inputObjNum)!=undefined && inputObjNum!=null){
+					params += "&inputObjNum="+ inputObjNum;        // 用于保存返回的值对象的名称 (异步的才会有)
+				}				
+				//当你用SaveToURL方法时,回调属性用:ForOnSaveToURL 如果是SaveAsOtherFormatToURL的话,就用ForOnSaveAsOtherFormatToURL回调
+				if(this.config.doctype=='pdf'){
+					//直接保存文档,不用转换成指定是什么格式的文件方法
+					this.controlObj.SaveToURL(path,uploadName,params,docName+"." + this.config.doctype,0);
+				}else{
+					//保存文档时要转换成指定兼容文档的的格式方法
+					this.controlObj.SaveAsOtherFormatToURL(5,path,uploadName,params,docName+"." + this.config.doctype,0);
+				}
+				result=-11;
+			}else{   //IE是同步的
+				//SaveToURL
+				if(this.config.doctype=='pdf'){
+					//直接保存文档,不用转换成指定是什么格式的文件方法
+					result=this.controlObj.SaveToURL(path,uploadName,params,docName+"." + this.config.doctype,0);
+				}else{
+					//保存文档时要转换成指定兼容文档的的格式方法
+					result=this.controlObj.SaveAsOtherFormatToURL(5,path,uploadName,params,docName+"." + this.config.doctype,0);
+				}
+				this.config.fileId=result;
+			}			
+			return result;
+		}
+		catch(err){
+			//alert("saveRemote:" +err.name + ": " + err.message);
+			if(Sys.firefox||Sys.chrome){
+				return -13;   //报错时表示火狐谷歌下OFFICE不正常
+			}
+			return -12;
+		}
+	};
+	
+	/**
+	 * 对文档进行签单
+	 */
+	this.signature=function(){
+		
+		var url = __ctx + "/platform/system/seal/dialog.ht";
+		var winArgs = "dialogWidth=800px;dialogHeight=600px;help=0;status=0;scroll=1;center=0;resizable=1;";
+		url = url.getNewUrl();
+		/*var retVal = window.showModalDialog(url, "", winArgs);		
+		if(typeof(retVal)==undefined||retVal==null){
+			return false;
+		}
+		if(retVal.fileId.isEmpty()){
+			return false;
+		}
+		var sealUrl=__ctx + "/platform/system/sysFile/getFileById.ht?fileId=" + retVal.fileId;
+		try{
+//			this.controlObj.AddSignFromURL(retVal.userName,sealUrl);
+			this.controlObj.AddSecSignFromURL(_self.config.user.name,//签章的用户名
+					sealUrl,//印章所在服务器相对url
+					0,//left
+					0,//top
+					1,//relative
+					2,  //print mode 2
+					false,//是是否使用证书,true或者false,
+					false //是否锁定印章
+					);
+		}catch(err){
+			alert("signature:" +err.name + ": " + err.message);
+			return -1;
+		}*/
+		var that=this;
+		/*KILLDIALOG*/
+		DialogUtil.open({
+			height:600,
+			width: 800,
+			title : '对文档进行签单',
+			url: url, 
+			isResize: true,
+			//自定义参数
+			sucCall:function(retVal){
+				if(typeof(retVal)==undefined||retVal==null){
+					return false;
+				}
+				if(retVal.fileId.isEmpty()){
+					return false;
+				}
+				var sealUrl=__ctx + "/platform/system/sysFile/getFileById.ht?fileId=" + retVal.fileId;
+				try{
+					that.controlObj.AddSecSignFromURL(_self.config.user.name,//签章的用户名
+							sealUrl,//印章所在服务器相对url
+							0,//left
+							0,//top
+							1,//relative
+							2,  //print mode 2
+							false,//是是否使用证书,true或者false,
+							false //是否锁定印章
+							);
+				}catch(err){
+					alert("signature:" +err.name + ": " + err.message);
+					return -1;
+				}
+			}
+		});
+		
+	};
+	
+	
+	/**
+	 * 对Office文档进行Ekey硬件签章
+	 */
+	this.signatureFromEkey = function(){
+		if(this.controlObj!=null){
+			/*if(!this.controlObj.IsEkeyConnected)       //暂时不确定
+			{
+				alert("没有检测到EKEY,请将EKEY插入到计算机!然后点击确定继续.");
+				return;
+			}*/	
+			this.controlObj.AddSecSignFromEKEY(
+					        _self.config.user.name,     //username
+							0,  //left
+							0,  // top,
+							1,  // relative,
+							2,  // PrintMode,
+							false,  // IsUseCertificate,
+							false,  // IsLocked,
+							true,  // IsCheckDocChange,
+							false,  //  IsShowUI
+							true,  //   signpass,
+							-1,    // ekeySignIndex,
+							true,  //  IsAddComment,
+							true  //  IsBelowText
+			);
+		}	
+	};
+
+	/**
+	 * 对PDF文档进行Ekey硬件签章
+	 */
+	this.signaturePdfFromEkey=function(){
+         
+		if(this.controlObj!=null){
+			/*if(!this.controlObj.IsEkeyConnected)
+			{
+				alert("没有检测到EKEY.请将EKEY插入到计算机!然后点击确定继续.");
+				return;
+			}*/
+			alert("signaturePdfFromEkey");
+			this.controlObj.ActiveDocument.AddPDFSecSignFromEKEY(_self.config.user.name,null,"111111",null,1,null,null,null,null,true,false,true,false,null);
+		}			
+	};
+	
+	
+	
+	
+	/**
+	 * 把Office文件转换成PDF文件。
+	 * 服务器返回文件id到this.config.fileId,同时返回文件ID。
+	 */
+	this.officeToPdf=function(){
+		if(!confirm("文档转换成PDF后将不可以恢复原有格式文档,确认转换吗?"))
+		{
+			return;
+		}		
+		try{
+			//保存数据到服务器。
+			var pdfUrl = __ctx + "/platform/system/sysFile/saveFilePdf.ht";
+			var uploadName = this.controlId +"_pdf";
+			var params="fileId=" + this.config.fileId + "&uploadName="+ uploadName;
+			var pdfName = this.config.fileId+".pdf";
+			this.controlObj.PublishAsPDFToURL(pdfUrl,uploadName,params,pdfName,0,null,true,true,false,true,true,true);
+			//window.location.href=window.location.href;
+		}
+		catch(err){
+			alert("officeToPdf:" +err.name + ": " + err.message);
+		}			
+	};
+    
+	
+	/**
+	 * 把打开PDF文件
+	 */
+	this.addPDFSupport=function()
+	{
+	//	this.controlObj = document.getElementById(this.controlId);
+		if(document.URL.indexOf("file://")>=0)
+		{
+			if(!confirm("如果从本地磁盘打开的URL,需要手工运行命令'regsvr32 ntkopdfdoc.dll'注册插件文件.您确认已经注册了吗?"))
+			{
+				return;
+			}
+		}
+		var path = __ctx + "/platform/system/sysFile/getFileById.ht?fileId=" + this.config.fileId;
+        this.controlObj.AddDocTypePlugin(".pdf","PDF.NtkoDocument","4.0.0.1",__ctx+"/media/office/ntkopdfdoc.cab",51,true);	//引用pdf组件
+	//	this.controlObj.BeginOpenFromURL(path);  //打开PDF从URL "media/office/bpm.pdf"
+		this.controlObj.OpenFromURL(path);
+		
+	};
+	
+	
+	/**
+	 * 参数为true时把文档设置为只读,false按文档原来的权限设置
+	 */
+	this.setFileReadOnly=function(isRead)
+	{		
+	};
+	
+};
+
+/**
+ * 火狐谷歌浏览器控件文档保存事件(异步的,IE是同步的)回调接管函数 注意不在OfficeControl类里面  一定是单独方法  是控件属性的ForOnSaveToURL对应的方法 (SaveToURL保存后的回调函数)
+ * html 为后台返回的内容
+ */
+var saveMethodOnCompleteNum = 0;   // 有几次回调文件了
+function saveMethodOnComplete(type, code, html) {
+	saveMethodOnCompleteNum = saveMethodOnCompleteNum + 1;
+	var arrys = html.split("##"); 
+	var arryNum = arrys[0];    //保存对象的序号
+	var arryValue = arrys[1];    //要保存的内容
+	if(arryNum>=0){
+        //返回小于1的情况要不要重新获取旧值做保存?
+		/*if(arryValue<=0){
+			arryValue = OfficePlugin.fileObjs.get(arryNum).getAttribute("value");   //保存到对象的值;
+		}*/
+		if(arryValue>0){
+			OfficePlugin.fileObjs.get(arryNum).setAttribute("value",arryValue);   //保存到对象的值
+			// console.info('设置值结束');
+			OfficePlugin.officeObjs[arryNum].config.fileId = arryValue;  //控件中config对象的fileId
+			OfficePlugin.hasSubmitOffices[arryNum]=true; //完成标志
+			OfficePlugin.submitNewNum = OfficePlugin.submitNewNum + 1;   //每回调一次就 提交数量的变量就 加上 1 
+			if(OfficePlugin.submitNum == OfficePlugin.submitNewNum){    //当提交问题 等于 提交数量的变量 时 表示所有文档 都提交了  然后做 业务相关的提交
+				if(OfficePlugin.callBack){
+					OfficePlugin.callBack();
+				}else{
+					var data=CustomForm.getData();
+					//设置表单数据
+					$("#formData").val(data);
+					$('#frmWorkFlow').submit();
+				}
+				OfficePlugin.submitNewNum = 0; //重置  提交数量的变量
+				saveMethodOnCompleteNum = 0; //重置  回调用提交方法次数的变量
+			}
+		}else{
+			if(saveMethodOnCompleteNum==OfficePlugin.submitNum){
+				$.ligerDialog.warn("提交失败,OFFICE控件没能正常使用,请重新安装 !!!","提示");
+			}
+		}
+	}else{
+		if(saveMethodOnCompleteNum==OfficePlugin.submitNum){
+			$.ligerDialog.warn("提交失败,OFFICE控件没能正常使用,请重新安装 !!!","提示");
+		}
+	}
+	
+}
+
+/**
+ * 火狐谷歌浏览器控件文档在套红模版事件(异步的,IE是同步的)回调接管函数 注意不在OfficeControl类里面  一定是单独方法  是控件属性的ForOnAddTemplateFromURL对应的方法 (AddTemplateFromURL保存后的回调函数)
+ * html 为后台返回的内容
+ */
+function addTemplateOnComplete(myNum) {
+	//OfficePlugin.fileObjs.get(myNum).setAttribute("value",arryValue);   //保存到对象的值
+	myObj = OfficePlugin.officeObjs[myNum];  //OfficeControl 实例对象
+	var BookMarkName = "content";
+	if(!myObj.controlObj.ActiveDocument.BookMarks.Exists(BookMarkName)){
+		alert("Word 模板中不存在名称为:\""+BookMarkName+"\"的书签!");
+		return false;
+	}
+//	var bkmkObj = myObj.controlObj.ActiveDocument.BookMarks(BookMarkName);   //IE的方法
+	var bkmkObj = myObj.controlObj.ActiveDocument.BookMarks.Item(BookMarkName);	  //火狐和谷歌特有的
+	var saverange = bkmkObj.Range;
+	saverange.Paste();
+	myObj.controlObj.ActiveDocument.Bookmarks.Add(BookMarkName,saverange);	
+	
+}
+
+
+/**
+ * 火狐谷歌浏览器控件文档在打开文档后的事件(异步的,IE是同步的)
+ * 
+ */
+function documentOpenedOnComplete(myNum) {	
+	myObj = OfficePlugin.officeObjs[myNum];  //OfficeControl 实例对象
+	//文档要求为只读时,通过Office 实例对象设置文档为只读
+	if(myObj!=null&& myObj != undefined){
+		myObj.setFileReadOnly(false);
+	}
+}
+
+}
+

+ 208 - 0
web/codegen/js/OfficePlugin.js

@@ -0,0 +1,208 @@
+/**
+ * Office插件,用于自定义表单。
+ * 
+ * 1.OfficePlugin.init();
+ *  	加载office控件。
+ * 
+ * 2.OfficePlugin.submit();
+ * 		保存office文档。
+ */
+OfficePlugin={
+		//当前登陆用户相关信息件对象
+		user:{id:"0",name:"开发用户",groupId:"0",groupName:"开发部"},
+		//office控件对象
+		officeObjs:new Array(),
+		//附件对象
+		fileObjs:null,
+		//判断当前表单页面是否有office控件。
+		hasOfficeFields:new Array(),		
+		//判断当前表单页面所有office控件是否都提交了。
+		hasSubmitOffices:new Array(),
+		//有多少文档可以提交的
+		submitNum:null,
+		//当前提交文档变量
+		submitNewNum:null,
+		//是否初始化tab中的OFFICE工具栏目的隐藏问题。在FormUtil用到
+		isTabItemOffice:true,
+		//初始化
+		//所做的操作如下:
+		//1.检查当前表单中是否有office控件。
+		//2.如果存在office控件
+		// 	获取文件id,将office控件添加到容器中。
+		init:function(){
+			this.officeObjs=new Array();
+			this.hasOfficeFields=new Array();
+			this.hasSubmitOffices=new Array();
+			this.user = getDocUserData();
+			var num = 0;
+			var myNum = 0;
+			this.fileObjs=$("input[controltype='office']");
+			for ( var i = 0; i < this.fileObjs.length; i++) {
+				var fileObj = this.fileObjs.get(i);
+				var name=fileObj.getAttribute("name");
+				var fileId=fileObj.getAttribute("value");
+
+				//获取附件的扩展名
+				var doctype = "";
+				if(fileId!=null&&fileId!=""){
+					doctype = sysFileType(fileId);
+				}else{
+					fileId="";
+					doctype = fileObj.getAttribute("doctype");	
+				}
+				
+				if(doctype){
+					doctype = doctype.toLowerCase();
+					if(doctype=='pptx'){
+						doctype='ppt';
+					}else if(doctype=='docx'){
+						doctype = 'doc'; 
+					}else if(doctype=='xlsx'){
+						doctype = 'xls'; 
+					}
+				}
+				
+				//容器的ID  
+				var divId="div_" + name.replaceAll(":","_");
+				
+				//容器样式修改
+				var div_rq = $("#" + divId);
+				if(!div_rq || div_rq.length<1){
+					//如果找不到容器,则为表单生成模式,需要生成一个容器div
+					div_rq = $('<div id="'+divId+'" class="office-div"></div>');
+					$(fileObj).after(div_rq);
+				}
+				var dwidth = div_rq.css("width").toLowerCase().replaceAll("px",""); 
+				if(dwidth<700){
+					div_rq.css("width","700px");
+				}
+				var dheight = div_rq.css("height").toLowerCase().replaceAll("px",""); 
+				if(dheight<700){
+					div_rq.css("height","700px");
+				}
+				
+				//必填  已在其它处理
+				var validRule = fileObj.getAttribute("validate");
+				if ( validRule != null && 'undefined' != validRule.toLowerCase() && validRule.length>2 ){ 
+					var json = eval('(' + validRule + ')');		
+					if(json.required){
+						//不做操作
+					}else{
+						var jsonStr = validRule.substring(0, validRule.lastIndexOf('}'));
+						jsonStr +=",\'required\':true}";    //加上必填
+						fileObj.setAttribute("validate",jsonStr);    
+					}				
+				}else{
+					fileObj.setAttribute("validate","{\'required\':true}");     //必填
+				}
+				num++;           //做可提交的标志数量
+				
+				$.ligerDialog.waitting('正在加载OFFICE文档,请稍候...');
+				//加载控件。
+				var officeObj= new OfficeControl();
+				this.officeObjs.push(officeObj);
+				//加载office控件。
+				officeObj.renderTo(divId,{fileId:fileId,doctype:doctype,myNum:myNum,user:this.user});
+				//是否有office控件。
+				this.hasOfficeFields.push(true);
+				//office控件文档标志
+				this.hasSubmitOffices.push(false);
+				myNum++; //序号
+				$.ligerDialog.closeWaitting(); 
+			}
+			this.submitNum = num;  //文档是可以做提交的数目   总娄
+			this.submitNewNum = 0;  //文档是提交了的数目     变化的(重新清空)
+		},
+		//提交文件保存。
+		//如果有office控件。则保存后将返回的附件id放到隐藏域。
+		submit:function(callBack){
+			$.ligerDialog.waitting('正在保存OFFICE文档中,请稍候...');
+		//	var _self=this;
+			for ( var cn = 0; cn < this.officeObjs.length; cn++) {
+				var officeObj= this.officeObjs[cn];
+				if(!this.hasOfficeFields[cn]) return;
+				if(callBack){
+					this.callBack=callBack;
+				}
+				//保存到服务器。
+				var result=officeObj.saveRemote(cn);
+				if(result==-11){
+					//由 火狐谷歌浏览器控件文档保存事件(异步的,IE是同步的)回调接管函数 OfficeControl.js 中有  saveToURLOnComplete 处理 
+				}else if(result==-13){
+					//由 火狐谷歌浏览器控件文档保存事件报错不能由回调接管函数 OfficeControl.js 中有  saveToURLOnComplete 处理 ,直接 在这里处理
+					//下面处理的是如果没安装控件,也可以正常提交表单(建议注销保留)
+					/*result = this.fileObjs.get(cn).getAttribute("value");   //保存到对象的值;
+					if(result>0){
+						officeObj.config.fileId = result;  //控件中config对象的fileId
+						this.fileObjs.get(cn).setAttribute("value",result);
+						this.hasSubmitOffices[cn]=true; //完成标志
+						this.submitNewNum = this.submitNewNum + 1;  //文档是提交了的数目     变化的(重新清空)
+						if(this.submitNum == this.submitNewNum){    //当提交问题 等于 提交数量的变量 时 表示所有文档 都提交了  然后做 业务相关的提交
+							var data=CustomForm.getData();
+							//设置表单数据
+							$("#formData").val(data);
+							$('#frmWorkFlow').submit();
+							this.submitNewNum = 0; //重置  提交数量的变量
+						}else{
+							if(cn==this.officeObjs.length){
+								$.ligerDialog.warn("提交失败,OFFICE控件没能正常使用,请重新安装 !!!","提示");
+							}
+						}
+					}else{
+						$.ligerDialog.warn("提交失败,OFFICE控件没能正常使用,请重新安装 !!!","提示");
+						break
+					}*/
+					//$.ligerDialog.warn("提交失败,OFFICE控件没能正常使用,请重新安装 !!!","提示");
+					alert("提交失败,OFFICE控件没能正常使用,请重新安装 !!!");
+					break;
+				}else{
+					//将结果放到隐藏域。(同步的 处理方法 IE 360 等)
+					//如果返回的是错误的内容,就保存以前的ID(因为过程中文档的ID是一样的)
+					/*if(result==12){      //12这种是OFFICE安装程序有误,可要获取以前的保存(建议注销保留)
+						result = this.fileObjs.get(cn).getAttribute("value");
+					}*/
+					if(result>0){
+						this.fileObjs.get(cn).setAttribute("value",result);
+						this.hasSubmitOffices[cn]=true; //完成标志
+						this.submitNewNum = this.submitNewNum + 1;  //文档是提交了的数目     变化的(重新清空)
+					}else{
+						break; //文件上传失败
+					}
+				}
+			}
+			$.ligerDialog.closeWaitting();   //关闭提示
+		}
+};
+
+//获取文件格式
+function sysFileType(fileId){
+	var doctype = "doc";
+	var path = __ctx +'/platform/system/sysFile/getFileType.ht';
+    $.ajaxSetup({async:false});  //同步
+	$.post(path,{fileId:fileId},function(data){			
+	   doctype = data;
+    });
+	$.ajaxSetup({async:true}); //异步
+	return doctype;
+};
+
+
+//获取用户
+function getDocUserData(){
+	var user = OfficePlugin.user;
+	var path = __ctx +'/platform/system/sysFile/getUserData.ht';
+    $.ajaxSetup({async:false});  //同步
+	$.post(path,{},function(data){			
+	   if(data!=""){
+		   var obj = eval('(' + data + ')');
+		   if(obj.success){
+			   user = obj.user;
+		   }
+	   }
+    });
+	$.ajaxSetup({async:true}); //异步
+	return user;
+};
+
+
+

+ 128 - 0
web/codegen/js/SubtablePermission.js

@@ -0,0 +1,128 @@
+/**
+ * 子表的权限处理
+ * @returns {SubtablePermission}
+ */
+if (typeof SubtablePermission == 'undefined') {
+	SubtablePermission = {};
+}
+
+SubtablePermission.init=function(){
+};
+
+
+var selectValue=function(select){
+	
+		var html='';
+		var query=select.attr("selectquery")
+		var queryJson = "";
+		if(query!=undefined && query!=null){
+			query=query.replaceAll("'","\"");
+			queryJson = JSON2.parse(query);
+		}else{
+			queryJson = "";
+			query = "";
+		}
+		var sValue=select.attr("val");
+		if(sValue==undefined || sValue==null && sValue.length<=0){
+			sValue = "";
+		}
+		html="<span selectvalue="+sValue+" selectquery="+query+"><lable></lable></span>"
+		return html;
+	}
+
+/**
+ * 子表必填判断
+ * 
+ * @return {} Boolean 如果存在必填数据则返回true,否则则返回false
+ */
+SubtablePermission.subRequired = function() {
+	var r = true;
+	var subDiv = $("div[type='subtable']");
+	if( $.isEmptyObject(subDiv)||subDiv.length == 0)
+		return true;
+	if ($.isEmpty(subDiv) )
+		return true;
+
+	// 子表的div
+	subDiv.each(function() {	
+		var visible = $(this).is(":visible");
+		if(!visible)return true;
+		var right = $(this).attr("right");
+		if ($.isEmpty(right))
+			right = "r";
+		else
+			right = right.toLowerCase();
+		// 如果必填权限
+		if (right != "b")
+			return true;
+		var tr = $(this).find('[formtype]:visible');
+		if ($.isEmpty(tr) || $.isEmptyObject(tr) || tr.length == 0) {
+			r = false;
+			if(!($(this).hasClass('validError'))){		//去掉必填样式							
+				$(this).addClass('validError');
+			}
+			return false;
+		}
+		
+		//是不是每行都要有数据
+		/*
+		var t = false;
+		// 判断里面的值是否为空,
+		tr.each(function() {
+			// 判断子表数据
+			t = SubtablePermission.checkSubData($(this));
+			if (t)//如果存在数据 则终止循环
+				return false;
+		});
+		if (!t) {
+			r = false;
+			return false;
+		}		
+		*/
+			
+		});
+	
+  /*	if(!r) subDiv.addClass('validError');
+    else subDiv.removeClass('validError');*/
+	return r;
+};
+
+/**
+ * 检查子表是否存在数据
+ * 
+ * @param {}
+ *            objRow 子表的table
+ * @return {} 如果存在数据则返回true,否则则返回false
+ */
+SubtablePermission.checkSubData = function(objRow) {
+	var t = false;
+	$("input:text[name^='s:'],input[type='hidden'][name^='s:'],textarea[name^='s:'],select[name^='s:']",
+			objRow).each(function() {
+				var value = $(this).val();
+				// 如果存在值 则终止循环
+				if (!$.isEmpty(value)) {
+					t = true;
+					return false;
+				}
+			});
+	// 判断复选框按钮的数据是否有值
+	$('input:checkbox:checked', objRow).each(function() {
+				var value = $(this).val();
+				// 如果存在值 则终止循环
+				if (!$.isEmpty(value)) {
+					t = true;
+					return false;
+				}
+			});
+	// 判断单选按钮的数据是否有值
+	$('input:radio', objRow).each(function() {
+				var value = $(this).val();
+				// 如果存在值 则终止循环
+				if ($(this).attr("checked") != undefined) {
+					t = true;
+					return false;
+				}
+			});
+	return t;
+};
+

+ 52 - 0
web/commons/403.jsp

@@ -0,0 +1,52 @@
+<%@page import="com.hotent.core.web.util.RequestUtil,
+				org.springframework.security.access.AccessDeniedException"  pageEncoding="UTF-8" isErrorPage="true" %>
+<%
+	String basePath=request.getContextPath();
+	AccessDeniedException ex=(AccessDeniedException)request.getAttribute("ex");
+	
+%>
+<html>
+	<head>
+		<%@include file="/commons/include/get.jsp" %>
+		<title>页面出错了</title>
+			<style type="text/css">
+			.STYLE10 {font-family: "微软雅黑";font-size: 20px;}
+			</style>
+	</head>
+	<body>
+	
+	<table  border="0" align="center" cellpadding="0" cellspacing="0" width="450">
+		  <tr>
+	    	<td><img src="${ctx}/styles/default/images/error/error_top.jpg" /></td>
+	  	  </tr>
+		  <tr>
+		    <td height="200" align="center" valign="top" background="${ctx}/styles/default/images/error/error_bg.jpg">
+		    	<table width="80%" border="0" cellspacing="0" cellpadding="0">
+		    	<tr>
+		    		<td style="text-align: center;"><img src="${ctx}/styles/default/images/error/error_sorry.png" /></td>
+		    	</tr>
+		        <tr>
+		          <td width="66%" valign="top" >
+		          	<table width="100%" style="text-align: center;">
+		          		<tr height="25">
+		          			<td>
+		          			<span class="STYLE10">访问被拒绝!</span>
+		          			</td>
+		          		</tr>
+		          		<tr height="70">
+		          			<td style="color: #FF5F02; font-size: 14px; font-family: '微软雅黑';">
+		          			 <%=ex.getMessage() %>
+		          			</td>
+		          		</tr>
+		          	</table>
+		          	
+		     	 </td>
+		      </table>
+		      </td>
+		  </tr>    	 
+		  <tr>
+	    	<td><img src="${ctx}/styles/default/images/error/error_bootom.jpg" /></td>
+	      </tr>
+		</table>
+	</body>
+</html>

+ 67 - 0
web/commons/404.jsp

@@ -0,0 +1,67 @@
+<%@page import="com.hotent.core.web.util.RequestUtil" isErrorPage="true" pageEncoding="UTF-8"%>
+<%
+	String basePath=request.getContextPath();
+%>
+<%@include file="/commons/include/get.jsp"%>
+<html>
+	<head>
+		<title>您访问的页面不存在</title>
+			<style type="text/css">
+			<!--
+			.STYLE10 {
+				font-family: "黑体";
+				font-size: 36px;
+			}
+			
+			-->  
+	.link {
+    border: 1px solid #999999;
+    border-radius: 3px 3px 3px 3px;
+    cursor: pointer;
+    line-height: 23px;
+    padding: 1px 7px 7px 8px;
+    text-align: center;
+}
+			</style>
+	</head>
+	<body>
+	 <table border="0" align="center" cellpadding="0" cellspacing="0">
+	  <tr>
+    	<td><img src="<%=basePath%>/styles/default/images/error/error_top.jpg" /></td>
+  	  </tr>
+	  <tr>
+	    <td height="170" align="center" valign="top" background="<%=basePath%>/styles/default/images/error/error_bg.jpg">
+	    	<table width="100%" border="0" cellspacing="0" cellpadding="0">
+	        <tr>
+	          <td width="100%" valign="top" align="center">
+	          	<table width="100%"  align="center">
+	          		<tr height="25" align="center">
+	          			<td >
+	          			<img src="<%=basePath%>/styles/default/images/error/error.jpg" style="margin-top:20px;"></td>
+	          			</td>
+	          		</tr>
+	          		<tr height="40" align="center">
+	          			<td>
+	          			对不起,您访问的页面不存在!
+	          			</td>
+	          		</tr>
+	          		<tr height="25"  align="center">
+		          		<td>
+		          			<div style="margin:0 100px 0 100px;">
+		          		  		<a class="link reloaded" href="javascript:;" onclick="javascript:location.href='<%=basePath%>/logout';"><span></span>重 新 登 录</a>
+			        	  		<a class="link backed" href="javascript:history.back();" style="margin-left:30px;"><span></span>后 退</a>
+		          			</div>
+		          		</td>
+	          		</tr>
+	          	</table>
+	          	
+	     	 </td>
+	      </table>
+	      </td>
+	  </tr>    	 
+	  <tr>
+    	<td><img src="<%=basePath%>/styles/default/images/error/error_bootom.jpg" /></td>
+      </tr>
+	</table>
+	</body>
+</html>

+ 39 - 0
web/commons/error.jsp

@@ -0,0 +1,39 @@
+<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" %>
+
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+
+
+<html>
+<head>
+	<title>系统出错了</title>
+	<%@include file="/commons/include/get.jsp" %>
+	
+</head> 
+<body>
+
+<table border="0" cellspacing="0" cellpadding="0" class="listHeader" style="width:600px;margin-top: 50px"  align="center">
+	<tr>
+		<td class="title">程序出错了</td>
+		<td>
+		
+		</td>
+	</tr>
+</table>
+
+<table border="0" cellspacing="0" cellpadding="0" class="listTable" style="width:600px;height: 150px" align="center">
+	<tr>
+		<td>
+			<table width="100%" height="100%">
+				<tr>
+					<td width="100px"><img alt="" src="${ctx }/commons/image/error.gif"></td>
+					<td>
+					<%=exception.getMessage() %></td>
+				</tr>
+			</table>
+
+		</td>
+	</tr>
+</table>
+</body>
+</html>
+

BIN
web/commons/image/default_image_male.jpg


BIN
web/commons/image/msg_none.png


BIN
web/commons/image/msg_own.png


BIN
web/commons/image/rsjdaqz.png


BIN
web/commons/image/sp_03.png


BIN
web/commons/image/sp_07.png


BIN
web/commons/image/sp_09.png


BIN
web/commons/image/sp_12.png


BIN
web/commons/image/sp_14.png


BIN
web/commons/image/sp_20.png


BIN
web/commons/image/yanglaozhang.png


+ 40 - 0
web/commons/include/ats.jsp

@@ -0,0 +1,40 @@
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<%@taglib prefix="f" uri="http://www.jee-soft.cn/functions" %>
+<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib prefix="display" uri="http://displaytag.sf.net" %>
+<%@ taglib prefix="hotent" uri="http://www.jee-soft.cn/paging" %>
+<%@ taglib prefix="spr" uri="http://www.springframework.org/tags"%>
+<c:set var="ctx" value="${pageContext.request.contextPath}" />
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<f:link href="Aqua/css/ligerui-all.css"></f:link>
+<f:link href="hotent/ats.css"></f:link>
+<script type="text/javascript" src="${ctx}/js/dynamic.jsp"></script>
+<script type="text/javascript" src="${ctx}/js/jquery/jquery.js"></script>
+<f:js pre="js/lang/common" ></f:js>
+<f:js pre="js/lang/js" ></f:js>
+<script type="text/javascript" src="${ctx}/js/util/util.js"></script>
+<script type="text/javascript" src="${ctx}/js/util/json2.js"></script>
+<script type="text/javascript" src="${ctx}/js/lg/ligerui.min.js"></script>
+<script type="text/javascript" src="${ctx}/js/hotent/displaytag.js" ></script>
+<script type="text/javascript" src="${ctx}/js/calendar/My97DatePicker/WdatePicker.js"></script>
+<script type="text/javascript" src="${ctx}/js/lg/plugins/ligerDialog.js" ></script>
+<script type="text/javascript" src="${ctx}/js/lg/plugins/ligerResizable.js" ></script>
+<script type="text/javascript" src="${ctx}/js/lg/util/DialogUtil.js" ></script>
+<link rel="stylesheet" type="text/css" href="${ctx}/styles/common/css/font-awesome/font-awesome.min.css"></link>
+<link rel="stylesheet" type="text/css" href="${ctx}/styles/common/css/bootstrap/bootstrap.min.css"></link>
+<f:link href="jqGrid/jquery-ui.css" ></f:link>
+<f:link href="jqGrid/ui.jqgrid.css" ></f:link>
+<link rel="stylesheet" type="text/css" href="${ctx}/styles/common/css/fullcalendar/fullcalendar.min.css"></link>
+<!--[if lte IE 8]>
+	<script type="text/javascript" src="${ctx}/js/bootstrap/html5shiv.min.js"></script>
+	<script type="text/javascript" src="${ctx}/js/bootstrap/respond.min.js"></script>
+<![endif]-->
+<script type="text/javascript" src="${ctx}/js/fullcalendar/moment.min.js"></script>
+<script type="text/javascript" src="${ctx}/js/fullcalendar/fullcalendar.min.js"></script>
+<script type="text/javascript" src="${ctx}/js/lang/fullcalendar/zh_CN.js"></script>
+<script type="text/javascript" src="${ctx}/js/jqGrid/jquery.jqGrid.min.js"></script>
+<script type="text/javascript" src="${ctx}/js/jqGrid/i18n/grid.locale-cn.js"></script>
+<script type="text/javascript" src="${ctx}/js/util/util.js"></script>
+<script type="text/javascript" src="${ctx}/js/hotent/platform/ats/AtsDialog.js"></script>
+<script type="text/javascript" src="${ctx}/js/hotent/platform/system/SysDialog.js"></script>

+ 40 - 0
web/commons/include/easyuiGet.jsp

@@ -0,0 +1,40 @@
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@taglib prefix="f" uri="http://www.jee-soft.cn/functions" %>
+<%@ taglib prefix="display" uri="http://displaytag.sf.net" %>
+<%@ taglib prefix="hotent" uri="http://www.jee-soft.cn/paging" %>
+<c:set var="ctx" value="${pageContext.request.contextPath}" />
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<!-- <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" /> -->
+
+<f:link href="Aqua/css/easyui-all.css"></f:link> 
+<f:link href="easyui/easyui.css"></f:link> 
+<f:link href="easyui/icon.css"></f:link>
+<f:link href="jquery/plugins/rowOps.css"></f:link>
+<f:js pre="js/lang/common" ></f:js>
+<f:js pre="js/lang/js" ></f:js>
+<script type="text/javascript" src="${ctx}/js/dynamic.jsp"></script>
+<script type="text/javascript" src="${ctx}/js/jquery/jquery.js"></script>
+<script type="text/javascript" src="${ctx}/js/util/util.js"></script>
+<script type="text/javascript" src="${ctx}/js/util/json2.js"></script>
+<script type="text/javascript" src="${ctx}/js/util/form.js"></script>
+
+<script type="text/javascript" src="${ctx}/js/easyui/jquery.easyui.min.js"></script>
+<f:js pre="js/lang/easyui" ></f:js>
+<script type="text/javascript" src="${ctx}/js/easyui/extend/jquery.easyui.topCall.js"></script>
+<script type="text/javascript" src="${ctx}/js/easyui/extend/jquery.easyui.fixTreeFrame.js"></script>
+<script type="text/javascript" src="${ctx}/js/calendar/My97DatePicker/WdatePicker.js"></script>
+<script type="text/javascript" src="${ctx}/js/jquery/plugins/jquery.htselect.js"></script>
+<script type="text/javascript" src="${ctx}/js/jquery/plugins/jquery.rowOps.js"></script>
+<script type="text/javascript" src="${ctx}/js/easyui/extend/DialogUtil.js" ></script>
+<script type="text/javascript" src="${ctx}/js/easyui/extend/formtterExt.js" ></script>
+<script type="text/javascript" src="${ctx}/js/easyui/extend/jquery.easyui.topCall.js"></script>
+
+<%@include file="/js/msg.jsp"%>
+
+<style type="text/css">
+.pannel-common{
+	padding: 5px !important;
+}
+</style>

+ 33 - 0
web/commons/include/form1.jsp

@@ -0,0 +1,33 @@
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<%@taglib prefix="f" uri="http://www.jee-soft.cn/functions" %>
+<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib prefix="display" uri="http://displaytag.sf.net" %>
+<%@ taglib prefix="hotent" uri="http://www.jee-soft.cn/paging" %>
+<%@ taglib prefix="spr" uri="http://www.springframework.org/tags"%>
+<c:set var="ctx" value="${pageContext.request.contextPath}" />
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<f:link href="Aqua/css/ligerui-all.css" ></f:link>
+<f:link href="tree/zTreeStyle1.css" ></f:link>
+<f:link href="web.css" ></f:link>
+<f:js pre="js/lang/common" ></f:js>
+<f:js pre="js/lang/js" ></f:js>
+<f:js pre="js/lang/view/platform/system" ></f:js>
+<script type="text/javascript" src="${ctx}/js/dynamic.jsp"></script>
+<script type="text/javascript" src="${ctx}/js/jquery/jquery.js"></script>
+<script type="text/javascript" src="${ctx}/js/jquery/jquery.form.js"></script>
+<script type="text/javascript" src="${ctx}/js/jquery/jquery.validate.min.js"></script>
+<script type="text/javascript" src="${ctx}/js/jquery/additional-methods.min.js"></script>
+<script type="text/javascript" src="${ctx}/js/jquery/jquery.validate.ext.js"></script>
+<script type="text/javascript" src="${ctx}/js/util/util.js"></script>
+<script type="text/javascript" src="${ctx}/js/util/json2.js"></script>
+<script type="text/javascript" src="${ctx}/js/util/form.js"></script>
+<script type="text/javascript" src="${ctx}/js/tree/jquery.ztree.js"></script>
+<script type="text/javascript" src="${ctx}/js/lg/ligerui.min.js"></script>
+<script type="text/javascript" src="${ctx}/js/lg/plugins/ligerDialog.js" ></script>
+<script type="text/javascript" src="${ctx}/js/lg/plugins/ligerResizable.js" ></script>
+<script type="text/javascript" src="${ctx}/js/calendar/My97DatePicker/WdatePicker.js"></script>
+<script type="text/javascript" src="${ctx}/js/lg/util/DialogUtil.js" ></script>
+<script type="text/javascript" src="${ctx}/js/hotent/platform/system/Share.js"></script>
+
+

+ 11 - 0
web/commons/include/getById.jsp

@@ -0,0 +1,11 @@
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<%@taglib prefix="f" uri="http://www.jee-soft.cn/functions" %>
+<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<c:set var="ctx" value="${pageContext.request.contextPath}" />
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<f:link href="web.css" ></f:link>
+<f:link href="Aqua/css/ligerui-all.css"></f:link>
+<script type="text/javascript" src="${ctx}/js/dynamic.jsp"></script>
+<script type="text/javascript" src="${ctx}/js/jquery/jquery.js"></script>
+<script type="text/javascript" src="${ctx}/js/lg/ligerui.min.js"></script>

+ 2 - 0
web/commons/include/getCtx.jsp

@@ -0,0 +1,2 @@
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<c:set var="ctx" value="${pageContext.request.contextPath}" />

+ 31 - 0
web/commons/include/getJqGrid.jsp

@@ -0,0 +1,31 @@
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@taglib prefix="f" uri="http://www.jee-soft.cn/functions" %>
+<%@ taglib prefix="display" uri="http://displaytag.sf.net" %>
+<%@ taglib prefix="hotent" uri="http://www.jee-soft.cn/paging" %>
+<c:set var="ctx" value="${pageContext.request.contextPath}" />
+<f:link href="web.css"></f:link>
+<f:link href="jquery/plugins/rowOps.css"></f:link>
+<f:link href="Aqua/css/ligerui-all.css"></f:link>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<f:link href="jqGrid/jquery-ui.css" ></f:link>
+<f:link href="jqGrid/ui.jqgrid.css" ></f:link>
+<f:js pre="js/lang/common" ></f:js>
+<f:js pre="js/lang/js" ></f:js>
+<script type="text/javascript" src="${ctx}/js/dynamic.jsp"></script>
+<script type="text/javascript" src="${ctx}/js/jquery/jquery.js"></script>
+<script type="text/javascript" src="${ctx}/js/jqGrid/i18n/grid.locale-cn.js"></script>
+<script type="text/javascript" src="${ctx}/js/jqGrid/jquery.jqGrid.src.js"></script>
+<script type="text/javascript" src="${ctx}/js/jquery/plugins/jquery.rowOps.js"></script>
+<script type="text/javascript" src="${ctx}/js/hotent/foldBoxJqGrid.js" ></script>
+<script type="text/javascript" src="${ctx}/js/hotent/absoulteInTop.js" ></script>
+<script type="text/javascript" src="${ctx}/js/util/util.js"></script>
+<script type="text/javascript" src="${ctx}/js/hotent/platform/system/sqlquery/grid.js"></script>
+<script type="text/javascript" src="${ctx}/js/hotent/platform/form/CommonDialog.js"></script>
+<script type="text/javascript" src="${ctx}/js/lg/ligerui.min.js"></script>
+<script type="text/javascript" src="${ctx}/js/lg/plugins/ligerDialog.js" ></script>
+<script type="text/javascript" src="${ctx}/js/lg/util/DialogUtil.js" ></script>
+<script type="text/javascript" src="${ctx}/js/hotent/platform/system/SysDialog.js" ></script>
+<script type="text/javascript" src="${ctx}/js/hotent/platform/form/SelectorUtil.js" ></script>
+<script type="text/javascript" src="${ctx}/js/calendar/My97DatePicker/WdatePicker.js"></script>

+ 3 - 0
web/commons/include/html_doctype.html

@@ -0,0 +1,3 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+

+ 49 - 0
web/commons/include/nodeUserCondition.jsp

@@ -0,0 +1,49 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
+
+
+<table style="width:100%" id="table_${nodeUserMap.nodeId}" class="table-grid">
+	<thead>
+	<tr>
+		<th width="80" nowrap="nowrap">序号</th>
+		<th width="*" nowrap="nowrap">条件</th>
+		<th nowrap="nowrap" width="90px">批次号</th>
+	</tr>
+	</thead>
+	<tbody class="data">
+	       <input type="hidden" name="setId" value="${nodeUserMap.setId}"/>
+			<input type="hidden" name="defId" value="${defId}"/>
+			<input type="hidden" name="nodeId" value="${nodeUserMap.nodeId}"/>
+	<c:choose>
+		<c:when test="${fn:length(nodeUserMap.bpmUserConditionList)>0}">
+			<c:forEach items="${nodeUserMap.bpmUserConditionList}" var="conditionNode" varStatus="cnt">
+				<tr <c:if test="${cnt.index%2=='0' }">class="odd"</c:if>>
+					<td>
+						<input type='checkbox' name='nodeUserCk' onchange="changeCheck(this)"/>&nbsp;${cnt.count}						
+						<input type="hidden" name="conditionId" value="${conditionNode.id}"/>		
+					<input type="hidden" name="sn" value="${conditionNode.sn}"/>				
+						<c:if test="${nodeId!=null}">
+							<input type="hidden" name="nodeId" value="${nodeId}"/>
+						</c:if>
+					</td>
+					<td>
+						<div name="conditionShow">
+							<textarea class="hidden">${conditionNode.condition}</textarea>							
+						</div>
+						<div style="margin:8px 0 0 0;">
+							${conditionNode.conditionShow}
+						</div>
+					</td>
+					<td name="groupNoTd">
+						<div style="width: 80px">
+							<input name="groupNo" style="width:70px;" class="inputText" ivalue ="${conditionNode.groupNo}"  value="${conditionNode.groupNo}" />
+<!--							<div name="groupNo"  style="width:70px;border: 2px;border: 1 solid silver;"><span>${conditionNode.groupNo}</span></div>-->
+						</div>
+					</td>
+				</tr>
+			</c:forEach>
+		</c:when>
+	</c:choose>
+	</tbody>
+</table>

+ 255 - 0
web/commons/include/nodeUserConditionJS.jsp

@@ -0,0 +1,255 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<script type="text/javascript">
+ // 移动行
+ function move(tableId, direct,obj){
+	var objTr=$("#"+tableId+">tbody.data>tr");
+	if(objTr.length==0) return;
+
+	var curObj = $(obj).parents('tr:first');
+	if(direct=='up'){
+		var prevObj=curObj.prev();
+		if(prevObj.length>0){			
+			alertConditionSn(curObj,prevObj,direct);		
+		}
+	}
+	else{
+		var nextObj=curObj.next();
+		if(nextObj.length>0){
+			alertConditionSn(curObj,nextObj,direct)	;
+		}
+	}
+};
+
+
+
+
+function delRows(tableId){
+	var tableObj=$('#'+tableId);
+	 var deletes=$('input[type=checkbox]:checked',tableObj);
+	if(deletes.length==0){
+		$.ligerMsg.info('请选择删除的记录!');
+		return ;
+	}
+	$.ligerDialog.confirm('确定要删除吗?','提示', function(rtn) {
+		if (rtn) {		
+			for(var i=deletes.length-1;i>=0;i--){
+				var conditionId=$(deletes[i]).next('input[name="conditionId"]').val();
+				if(conditionId!='' && conditionId!=undefined){
+					$.post(__ctx+'/platform/bpm/bpmUserCondition/del.ht',{'id':conditionId});
+				}
+				$(deletes[i]).parent().parent().fadeOut(500, function() {
+						$(this).remove();
+				});
+			}
+			
+		}
+	});
+}
+
+
+function selectScript(){
+	var objConditionCode=$("#txtScriptData")[0];
+	ScriptDialog({callback:function(script){
+		jQuery.insertText(objConditionCode,script);
+	}});
+}
+
+var win;
+function showScript(obj){
+	$("#txtScriptData").val(obj.val());
+	
+	var divObj=$("#divScriptData");
+	win= $.ligerDialog.open({ target:divObj , height: 350,width:500, modal :true,
+		buttons: [ { text: '确定', onclick: function (item, dialog) { 
+				obj.val($("#txtScriptData").val());
+				dialog.hide();
+			} 
+		}, 
+		{ text: '取消', onclick: function (item, dialog) { dialog.hide(); } } ] }); 
+	
+}
+
+function changeVar(obj){
+	var val=$(obj).val();
+	var objScript=$("#txtScriptData")[0];
+	jQuery.insertText(objScript,val);
+}
+
+//显示其他节点的对话框
+function showOtherNodeDlg(conf){
+	var winArgs="dialogWidth=650px;dialogHeight=500px;help=0;status=0;scroll=1;center=1";
+	url=__ctx + "/platform/bpm/bpmDefinition/taskNodes.ht?actDefId=${bpmDefinition.actDefId}&nodeId="+conf.nodeId;
+	url=url.getNewUrl();
+	/* var rtn=window.showModalDialog(url,"",winArgs);
+	if(conf.callback){
+		if(rtn!=undefined){
+			conf.callback.call(this,rtn.nodeId,rtn.nodeName);
+		}	
+	} */
+	var that = this;
+	DialogUtil.open({
+		height:500,
+		width: 650,
+		title : '其他节点',
+		url: url, 
+		//自定义参数
+		sucCall:function(rtn){
+			conf.callback.call(that,rtn.nodeId,rtn.nodeName);
+		}
+	});
+}
+function conditionDialog(tableId,edit)
+{
+	var tableObj=$('#'+tableId);
+	var defId=$('input[type="hidden"][name="defId"]',tableObj).val();
+	var nodeId=$('input[type="hidden"][name="nodeId"]',tableObj).val();
+	var parentActDefId=$('#parentActDefId').val();
+	var conditionId;
+	if(edit){
+		 conditionId=$('input[type="checkbox"]:checked:first',tableObj).next('input[name="conditionId"]').val();
+	}
+	
+	var url;
+	if(conditionId){
+		url=__ctx + '/platform/bpm/bpmDefinition/conditionEdit.ht?defId='+defId+'&nodeId='+nodeId+'&conditionId='+conditionId;
+	}	
+	else if(edit && !conditionId){
+		$.ligerDialog.warn("请先选择要修改的规则条件!",'提示');
+		return;
+	}else{
+		url=__ctx + '/platform/bpm/bpmDefinition/conditionEdit.ht?defId='+defId+'&nodeId='+nodeId;
+	}
+	if(parentActDefId){
+		url += '&parentActDefId='+parentActDefId;
+	}
+	
+	var dialogWidth=1000;
+	var dialogHeight=640;
+	var conf={};
+	conf=$.extend({},{dialogWidth:dialogWidth ,dialogHeight:dialogHeight ,help:0,status:0,scroll:1,center:1},conf);
+	
+	/*KILLDIALOG*/
+	DialogUtil.open({
+        height:conf.dialogHeight,
+        width: conf.dialogWidth,
+        title : '配置节点人员',
+        url: url, 
+        isResize: true,
+        //自定义参数
+        sucCall:function(){
+        	location.href=location.href.getNewUrl();
+        }
+    });
+}
+
+function changeCheck(obj){
+	var tableObj=$(obj).closest('table');
+	var ck=$(obj).attr('checked');
+	$('input[type="checkbox"]:checked',tableObj).attr('checked',false);
+	if(ck=="checked"){
+		$(obj).attr('checked',true);
+	}
+	else{
+		$(obj).attr('checked',false);
+	}
+	
+}
+$(function(){
+	$("div.group > a.link.update").unbind('click');
+	$("select[name='variableIds']").live("change",function(){
+		var _this=this;
+		var assignType=$(_this).parent().parent().find(':input[name="assignType"]').val();
+		//兼容老版本
+		if(assignType>=16&&assignType<=19){
+			$(_this).parent().find('input[name="cmpIds"]').val(_this.value);
+			$(_this).parent().find('textarea[name="cmpNames"]').val($("option:selected",_this).text());
+			$(_this).parent().find(':input[name="variableNames"]').val($("option:selected",_this).text());
+		}else{
+			$(_this).parent().find(':input[name="variableNames"]').val($("option:selected",_this).text());
+		}
+	});
+	$("a.moveup,a.movedown").unbind("click");
+	$("a.moveup,a.movedown").click(function(){
+		sortCondition(this);
+	});
+	initConditionShow();
+});
+//初始化 规则的描述内容
+function initConditionShow(){
+	$("div[name='conditionShow']").each(function(){
+		var me = $(this),
+			textarea = me.find("textarea"),
+			value = textarea.val().trim();
+		if(value=="")return true;
+		value = eval("("+value+")");
+		var text = [];
+		compileConDesc(value,text)
+		textarea.before(text.join(' '));
+	});
+};
+
+//组装规则描述
+function compileConDesc(json,text){
+	for(var i=0,c;c=json[i++];){
+		if(c.compType){
+			text.push(c.compType=='or'?' 或者 ':' 并且 ');
+		}
+		if(c.branch){
+			var branchDesc = ['('];
+			compileConDesc(c.sub,branchDesc);
+			branchDesc.push(')');
+			text.push(branchDesc.join(''));
+		}
+		else{
+			if(c.judgeCon2){
+				text.push('(');
+				text.push(c.conDesc);
+				text.push(')');
+			}
+			else{
+				text.push(c.conDesc);
+			}
+		}
+	}
+};
+
+function updSn(tbodyObj){
+	var conditionObjs=$("input[name='conditionId']",tbodyObj);
+	if(conditionObjs.length<2)return;
+	var aryCondition=[];
+	conditionObjs.each(function(){
+		aryCondition.push(this.value);
+	});
+	var conditionIds=aryCondition.join(",");
+	$.post('${ctx}/platform/bpm/bpmUserCondition/updateSn.ht',{"conditionIds":conditionIds},function(data){
+		var resultData=eval('('+data+')');
+		if(resultData.result==1){
+			
+		}else{
+			$.ligerDialog.warn(resultData.message,'提示');
+		}
+	});
+}
+
+
+function sortCondition(btnObj){
+	var obj=$(btnObj);
+	var direct=obj.hasClass("moveup")?1:0;
+	var curObj = obj.closest('tr');
+	var tbodyObj = obj.closest('tbody');
+	if(direct==1){
+		var prevObj=curObj.prev();
+		if(prevObj!=null){
+			curObj.insertBefore(prevObj);	
+		}
+	}
+	else{
+		var nextObj=curObj.next();
+		if(nextObj!=null){
+			curObj.insertAfter(nextObj);
+		}
+	}
+	updSn(tbodyObj);
+	
+}
+</script>

+ 59 - 0
web/commons/include/nodeUserTemplate.jsp

@@ -0,0 +1,59 @@
+<!-- 用户模板 -->
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+	<table class="hidden">
+		<tbody id="selectUserRow">
+			<tr>
+				<td nowrap='nowrap' height='28'>
+					<input type='checkbox' name='nodeUserCk'/>
+					<input type='hidden' name='nodeUserId'/>
+					
+				</td>
+				<td>
+					<select name='assignType' class='select' onchange='assignTypeChange(this);'>
+						<c:forEach items="${assignUserTypes}" var="item">
+							<option value="${item.key}" <c:if test="${item.key eq 'users'}">selected="selected"</c:if> >${item.value["title"]}</option>
+						</c:forEach>
+					</select>
+				</td>
+				<td>
+					<textarea style="display: none;" name='cmpIds'></textarea>
+					<textarea name='cmpNames' readonly='readonly' style='width:73%' rows='2' class='textarea'></textarea>
+					<a class='button' onclick='selectCmp(this);'><span>选择...</span></a>
+				</td>
+				<c:if test="${nodeId != '' }">
+					<td>
+						<c:choose>
+							<c:when test="${isMultiInstance}">
+								<select name="extractUser">
+									<option value="0">不抽取</option>
+									<option value="1">抽取</option>
+									<option value="2">二级抽取</option>
+									<option value="3">用户组合</option>
+								</select>
+							</c:when>
+							<c:otherwise>
+								<select name="extractUser">
+									<option value="0">不抽取</option>
+									<option value="1">抽取</option>
+								</select>
+							</c:otherwise>
+						</c:choose>
+						
+					</td>
+				</c:if>
+				<td>
+					<a id='moveupField' class='link moveup'></a>
+					<a id='movedownField' class='link movedown'></a>
+				</td>
+				<td>
+					<select name='compType'>
+						<option value='0'>或</option>
+						<option value='1'>与</option>
+						<option value='2'>排除</option>
+					</select>
+				</td>
+			</tr>
+			
+		</tbody>
+	</table>

+ 53 - 0
web/commons/include/userNodeRule.jsp

@@ -0,0 +1,53 @@
+<!-- 流程规则 -->
+<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
+<div>
+<div class="table-top">
+			<div class="table-top-right">	
+						<div class="toolBar" style="margin:0;">
+							<div class="group"><a class="link add" onclick="addCondition.apply(this)">添加规则</a></div>
+							<div class="l-bar-separator"></div>
+							<div class="group"><a class="link add" onclick="addConditionScript(this)">添加脚本规则</a></div>
+							<div class="l-bar-separator"></div>
+							<div class="group"><a class="link switchuser" onclick="">组合规则</a></div>
+							<div class="l-bar-separator"></div>
+							<div class="group"><a class="link del" onclick="delCondition()">删除</a></div>
+						</div>					
+		    </div>
+</div>
+	<table id="condition-table" class="table-grid" cellpadding="1" cellspacing="1" border="0" >
+		<thead>
+			<tr>
+				<th style="width:60px;"><input type="checkbox" onclick="checkAll.apply(this)"/></th>
+				<th width="15%">变量</th>
+				<th width="10%">运算类型</th>
+				<th colSpan="4" width="65%">条件</th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr class="condition-tr hidden">
+				<td>
+					<input name="pk" type="checkbox" />
+				</td>
+				<td name="flowvar-td">
+					<select name="flowVars" onchange="flowVarChange.apply(this)">
+						<c:forEach items="${flowVars}" var="flowVar">
+							<option class="flowvar-item"  value="${flowVar.fieldName}" chosenopt="${flowVar.jsonOptions}" ctltype="${flowVar.controlType}" ftype="${flowVar.fieldType}" datefmt='${flowVar.datefmt}'>${flowVar.fieldDesc}</option>
+						</c:forEach>
+					</select>
+				</td>
+				<td name="conComType">
+					<select name="comTypeSelect">
+						<option value='0'>或</option>
+						<option value='1'>与</option>
+					</select>
+				</td>
+				<td name="judgeCon-td" class="judgeCon-td"></td>
+				<td name="judgeVal-td" class="judgeVal-td"></td>
+				<td name="judgeCon-td2" class="judgeCon-td"></td>
+				<td name="judgeVal-td2" class="judgeVal-td"></td>
+			</tr>
+		</tbody>
+	</table>
+</div>
+
+			

+ 40 - 0
web/commons/noCurrentSite.jsp

@@ -0,0 +1,40 @@
+<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" %>
+
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+
+
+<html>
+<head>
+	<title>没有设置站点</title>
+	<%@include file="/commons/include/get.jsp" %>
+	
+</head> 
+<body>
+
+<table border="0" cellspacing="0" cellpadding="0" class="listHeader" style="width:500px;margin-top: 50px"  align="center">
+	<tr>
+		<td class="title">没有设置站点</td>
+		<td>
+		
+		</td>
+	</tr>
+</table>
+
+<table border="0" cellspacing="0" cellpadding="0" class="listTable" style="width:500px;height: 150px" align="center">
+	<tr>
+		<td>
+			<table width="100%" height="100%">
+				<tr>
+					<td width="100px"><img alt="" src="${ctx }/commons/image/error.gif"></td>
+					<td>
+					没有设置站点,请<a href="${ctx }/manage/site/siteInfo.ht">设置当前操作站点</a>。</td>
+				</tr>
+			</table>
+
+		</td>
+	</tr>
+</table>
+
+</body>
+</html>
+

+ 39 - 0
web/commons/noRights.jsp

@@ -0,0 +1,39 @@
+<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" %>
+
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+
+
+<html>
+<head>
+	<title>没有访问权限</title>
+	<%@include file="/commons/include/get.jsp" %>
+	
+</head> 
+<body>
+
+<table border="0" cellspacing="0" cellpadding="0" class="listHeader" style="width:600px;margin-top: 50px"  align="center">
+	<tr>
+		<td class="title">没有访问权限</td>
+		<td>
+		
+		</td>
+	</tr>
+</table>
+
+<table border="0" cellspacing="0" cellpadding="0" class="listTable" style="width:600px;height: 150px" align="center">
+	<tr>
+		<td>
+			<table width="100%" height="100%">
+				<tr>
+					<td width="100px"><img alt="" src="${ctx }/commons/image/error.gif"></td>
+					<td>
+					对不起,你没有访问该页面的权限!</td>
+				</tr>
+			</table>
+
+		</td>
+	</tr>
+</table>
+</body>
+</html>
+

+ 39 - 0
web/commons/notLogin.jsp

@@ -0,0 +1,39 @@
+<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" %>
+
+<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+
+
+<html>
+<head>
+	<title>没有登录</title>
+	<%@include file="/commons/include/get.jsp" %>
+	
+</head> 
+<body>
+
+<table border="0" cellspacing="0" cellpadding="0" class="listHeader" style="width:600px;margin-top: 50px"  align="center">
+	<tr>
+		<td class="title">没有登录系统</td>
+		<td>
+		
+		</td>
+	</tr>
+</table>
+
+<table border="0" cellspacing="0" cellpadding="0" class="listTable" style="width:600px;height: 150px" align="center">
+	<tr>
+		<td>
+			<table width="100%" height="100%">
+				<tr>
+					<td width="100px"><img alt="" src="${ctx }/commons/image/error.gif"></td>
+					<td>
+					对不起,你还没有登录系统!</td>
+				</tr>
+			</table>
+
+		</td>
+	</tr>
+</table>
+</body>
+</html>
+

BIN
web/favicon.ico


+ 5 - 0
web/index.jsp

@@ -0,0 +1,5 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+    pageEncoding="UTF-8"%>
+
+	<%String str="";
+	response.sendRedirect(request.getContextPath()+ "/platform/console/main.ht"); %>

BIN
web/media/office/NtkoOfficeControlSetup.msi


BIN
web/media/office/NtkoUnload.exe


BIN
web/media/office/OfficeControl.cab


BIN
web/media/office/ntkooledocall.cab


+ 607 - 0
web/media/swf/bpm/doctor.idfl

@@ -0,0 +1,607 @@
+<diagram xmlns:bg="bpm.graphic" xmlns:ciied="com.ibm.ilog.elixir.diagram" xmlns:fg="flash.geom">
+  <bg:HPool id="hPool1" automaticGraphLayout="false" expandedHeight="142" expandedWidth="1475" gap="-2" height="142" inheritNodeLayout="true" left="20" top="160" width="1475" x="20" y="160">
+    <label>Doctor's Office</label>
+    <ports>
+      <ciied:Port id="port1"/>
+    </ports>
+    <bg:HLane id="hLane1" automaticGraphLayout="false" expandedHeight="72" expandedWidth="1450" height="72" inheritNodeLayout="true" left="0" top="0" width="1450">
+      <label>Receptionist</label>
+      <ports>
+        <ciied:Port id="port2"/>
+      </ports>
+      <bg:Task id="task1" height="50" left="81" top="10" width="90" x="81" y="10">
+        <label>Receive Doctor Request</label>
+        <ports>
+          <ciied:Port id="port3"/>
+          <ciied:Port id="port4" clipOnShape="true" y="0"/>
+          <ciied:Port id="port5" x="0"/>
+          <ciied:Port id="port6" clipOnShape="true" x="1"/>
+          <ciied:Port id="port7" movable="false"/>
+          <ciied:Port id="port8" movable="false"/>
+          <ciied:Port id="port9" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port10" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port11" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port12" clipOnShape="true" x="0"/>
+          <ciied:Port id="port13" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port14" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port15" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port16" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port17" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:StartEvent id="startEvent1" height="30" left="10" top="20" width="30" x="10" y="20">
+        <label></label>
+        <ports>
+          <ciied:Port id="port18"/>
+          <ciied:Port id="port19" x="1"/>
+          <ciied:Port id="port20" clipOnShape="true" x="1"/>
+          <ciied:Port id="port21" movable="false"/>
+          <ciied:Port id="port22" movable="false"/>
+          <ciied:Port id="port23" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port24" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port25" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port26" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port27" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port28" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port29" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port30" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:StartEvent>
+      <bg:Task id="task2" height="50" left="211" top="10" width="90" x="211" y="10">
+        <label>Send Availability Request</label>
+        <ports>
+          <ciied:Port id="port31"/>
+          <ciied:Port id="port32" clipOnShape="true" x="1"/>
+          <ciied:Port id="port33" movable="false"/>
+          <ciied:Port id="port34" movable="false"/>
+          <ciied:Port id="port35" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port36" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port37" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port38" clipOnShape="true" x="0"/>
+          <ciied:Port id="port39" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port40" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port41" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port42" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port43" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:Task id="task3" height="50" left="601" top="10" width="90" x="601" y="10">
+        <label>Receive Availability</label>
+        <ports>
+          <ciied:Port id="port44"/>
+          <ciied:Port id="port45" movable="false"/>
+          <ciied:Port id="port46" x="1"/>
+          <ciied:Port id="port47" movable="false"/>
+          <ciied:Port id="port48" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port49" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port50" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port51" clipOnShape="true" x="1"/>
+          <ciied:Port id="port52" clipOnShape="true" x="0"/>
+          <ciied:Port id="port53" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port54" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port55" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port56" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port57" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:Task id="task4" height="50" left="731" top="10" width="90" x="731" y="10">
+        <label>Send Booking</label>
+        <ports>
+          <ciied:Port id="port58"/>
+          <ciied:Port id="port59" x="0"/>
+          <ciied:Port id="port60" clipOnShape="true" x="0"/>
+          <ciied:Port id="port61" movable="false"/>
+          <ciied:Port id="port62" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port63" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port64" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port65" clipOnShape="true" x="1"/>
+          <ciied:Port id="port66" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port67" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port68" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port69" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port70" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:Task id="task5" height="50" left="991" top="10" width="90" x="991" y="10">
+        <label>Send Appointment</label>
+        <ports>
+          <ciied:Port id="port71"/>
+          <ciied:Port id="port72" y="0"/>
+          <ciied:Port id="port73" clipOnShape="true" y="0"/>
+          <ciied:Port id="port74" clipOnShape="true" x="1"/>
+          <ciied:Port id="port75" movable="false"/>
+          <ciied:Port id="port76" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port77" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port78" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port79" clipOnShape="true" x="0"/>
+          <ciied:Port id="port80" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port81" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port82" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port83" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port84" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:SequenceFlow id="sequenceFlow1" endPort="port12" startPort="port20">
+        <fallbackEndPoint>
+          <fg:Point id="point1" x="89" y="52"/>
+        </fallbackEndPoint>
+        <fallbackStartPoint>
+          <fg:Point id="point2"/>
+        </fallbackStartPoint>
+        <label></label>
+        <shapeType>straight</shapeType>
+      </bg:SequenceFlow>
+      <bg:SequenceFlow id="sequenceFlow2" endPort="port38" startPort="port6">
+        <fallbackEndPoint>
+          <fg:Point id="point3" x="216" y="50"/>
+        </fallbackEndPoint>
+        <fallbackStartPoint>
+          <fg:Point id="point4"/>
+        </fallbackStartPoint>
+        <label></label>
+        <shapeType>straight</shapeType>
+      </bg:SequenceFlow>
+      <bg:SequenceFlow id="sequenceFlow3" endPort="port60" startPort="port51">
+        <fallbackEndPoint>
+          <fg:Point id="point5"/>
+        </fallbackEndPoint>
+        <fallbackStartPoint>
+          <fg:Point id="point6" x="666" y="54"/>
+        </fallbackStartPoint>
+        <label></label>
+        <shapeType>straight</shapeType>
+      </bg:SequenceFlow>
+    </bg:HLane>
+    <bg:HLane id="hLane2" automaticGraphLayout="false" expandedHeight="72" expandedWidth="1450" height="72" inheritNodeLayout="true" left="0" top="0" width="1450" y="70">
+      <label>Doctor</label>
+      <ports>
+        <ciied:Port id="port85"/>
+      </ports>
+      <bg:Task id="task6" height="50" left="341" top="10" width="90" x="341" y="10">
+        <label>Receive Availability Request</label>
+        <ports>
+          <ciied:Port id="port86"/>
+          <ciied:Port id="port87" movable="false"/>
+          <ciied:Port id="port88" movable="false"/>
+          <ciied:Port id="port89" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port90" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port91" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port92" clipOnShape="true" x="1"/>
+          <ciied:Port id="port93" clipOnShape="true" x="0"/>
+          <ciied:Port id="port94" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port95" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port96" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port97" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port98" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:Task id="task7" height="50" left="471" top="10" width="90" x="471" y="10">
+        <label>Send Availability</label>
+        <ports>
+          <ciied:Port id="port99"/>
+          <ciied:Port id="port100" clipOnShape="true" x="0"/>
+          <ciied:Port id="port101" clipOnShape="true" x="1"/>
+          <ciied:Port id="port102" movable="false"/>
+          <ciied:Port id="port103" movable="false"/>
+          <ciied:Port id="port104" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port105" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port106" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port107" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port108" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port109" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port110" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port111" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:Task id="task8" height="50" left="861" top="10" width="90" x="861" y="10">
+        <label>Receive Booking</label>
+        <ports>
+          <ciied:Port id="port112"/>
+          <ciied:Port id="port113" clipOnShape="true" x="0"/>
+          <ciied:Port id="port114" clipOnShape="true" x="1"/>
+          <ciied:Port id="port115" movable="false"/>
+          <ciied:Port id="port116" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port117" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port118" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port119" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port120" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port121" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port122" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port123" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:Task id="task9" height="50" left="1121" top="10" width="90" x="1121" y="10">
+        <label>Receive Symptoms</label>
+        <ports>
+          <ciied:Port id="port124"/>
+          <ciied:Port id="port125" clipOnShape="true" x="1"/>
+          <ciied:Port id="port126" movable="false"/>
+          <ciied:Port id="port127" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port128" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port129" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port130" clipOnShape="true" x="0"/>
+          <ciied:Port id="port131" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port132" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port133" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port134" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port135" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:Task id="task10" height="50" left="1251" top="10" width="90" x="1251" y="10">
+        <label>Send Prescription</label>
+        <ports>
+          <ciied:Port id="port136"/>
+          <ciied:Port id="port137" clipOnShape="true" y="0"/>
+          <ciied:Port id="port138" x="1"/>
+          <ciied:Port id="port139" clipOnShape="true" x="1"/>
+          <ciied:Port id="port140" movable="false"/>
+          <ciied:Port id="port141" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port142" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port143" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port144" clipOnShape="true" x="0"/>
+          <ciied:Port id="port145" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port146" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port147" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port148" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port149" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:EndEvent id="endEvent1" height="30" left="1383" top="18" width="30" x="1383" y="18">
+        <label>End</label>
+        <ports>
+          <ciied:Port id="port150"/>
+          <ciied:Port id="port151" x="1"/>
+          <ciied:Port id="port152" y="1"/>
+          <ciied:Port id="port153" movable="false"/>
+          <ciied:Port id="port154" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port155" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port156" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port157" clipOnShape="true" x="0"/>
+          <ciied:Port id="port158" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port159" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port160" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port161" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port162" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:EndEvent>
+      <bg:SequenceFlow id="sequenceFlow4" endPort="port100" startPort="port92">
+        <fallbackEndPoint>
+          <fg:Point id="point7"/>
+        </fallbackEndPoint>
+        <fallbackStartPoint>
+          <fg:Point id="point8" x="414" y="44"/>
+        </fallbackStartPoint>
+        <label></label>
+        <shapeType>straight</shapeType>
+      </bg:SequenceFlow>
+      <bg:SequenceFlow id="sequenceFlow5" endPort="port144" startPort="port125">
+        <fallbackEndPoint>
+          <fg:Point id="point9" x="1265" y="47"/>
+        </fallbackEndPoint>
+        <fallbackStartPoint>
+          <fg:Point id="point10"/>
+        </fallbackStartPoint>
+        <label></label>
+        <shapeType>straight</shapeType>
+      </bg:SequenceFlow>
+      <bg:SequenceFlow id="sequenceFlow6" endPort="port157" startPort="port139">
+        <fallbackEndPoint>
+          <fg:Point id="point11" x="1385" y="47"/>
+        </fallbackEndPoint>
+        <fallbackStartPoint>
+          <fg:Point id="point12"/>
+        </fallbackStartPoint>
+        <label></label>
+        <shapeType>straight</shapeType>
+      </bg:SequenceFlow>
+    </bg:HLane>
+    <bg:SequenceFlow id="sequenceFlow7" endPort="port93" startPort="port32">
+      <fallbackEndPoint>
+        <fg:Point id="point13" x="363" y="152"/>
+      </fallbackEndPoint>
+      <fallbackStartPoint>
+        <fg:Point id="point14"/>
+      </fallbackStartPoint>
+      <intermediatePoints>
+        <fg:Point id="point15" x="346" y="35"/>
+        <fg:Point id="point16" x="346" y="105"/>
+      </intermediatePoints>
+      <label>Are you available?</label>
+      <shapeType>free</shapeType>
+    </bg:SequenceFlow>
+    <bg:SequenceFlow id="sequenceFlow8" endPort="port52" startPort="port101">
+      <fallbackEndPoint>
+        <fg:Point id="point17" x="614" y="49"/>
+      </fallbackEndPoint>
+      <fallbackStartPoint>
+        <fg:Point id="point18"/>
+      </fallbackStartPoint>
+      <intermediatePoints>
+        <fg:Point id="point19" x="606" y="105"/>
+        <fg:Point id="point20" x="606" y="35"/>
+      </intermediatePoints>
+      <label>I am available</label>
+      <shapeType>free</shapeType>
+    </bg:SequenceFlow>
+    <bg:SequenceFlow id="sequenceFlow9" endPort="port113" startPort="port65">
+      <fallbackEndPoint>
+        <fg:Point id="point21"/>
+      </fallbackEndPoint>
+      <fallbackStartPoint>
+        <fg:Point id="point22" x="814" y="48"/>
+      </fallbackStartPoint>
+      <intermediatePoints>
+        <fg:Point id="point23" x="866" y="35"/>
+        <fg:Point id="point24" x="866" y="105"/>
+      </intermediatePoints>
+      <label>I'll book you</label>
+      <shapeType>free</shapeType>
+    </bg:SequenceFlow>
+    <bg:SequenceFlow id="sequenceFlow10" endPort="port79" startPort="port114">
+      <fallbackEndPoint>
+        <fg:Point id="point25" x="1012" y="57"/>
+      </fallbackEndPoint>
+      <fallbackStartPoint>
+        <fg:Point id="point26"/>
+      </fallbackStartPoint>
+      <intermediatePoints>
+        <fg:Point id="point27" x="996" y="105"/>
+        <fg:Point id="point28" x="996" y="35"/>
+      </intermediatePoints>
+      <label></label>
+      <shapeType>free</shapeType>
+    </bg:SequenceFlow>
+    <bg:SequenceFlow id="sequenceFlow11" endPort="port130" startPort="port74">
+      <fallbackEndPoint>
+        <fg:Point id="point29" x="1135" y="162"/>
+      </fallbackEndPoint>
+      <fallbackStartPoint>
+        <fg:Point id="point30"/>
+      </fallbackStartPoint>
+      <intermediatePoints>
+        <fg:Point id="point31" x="1126" y="35"/>
+        <fg:Point id="point32" x="1126" y="105"/>
+      </intermediatePoints>
+      <label></label>
+      <shapeType>free</shapeType>
+    </bg:SequenceFlow>
+  </bg:HPool>
+  <bg:HPool id="hPool2" automaticGraphLayout="false" expandedHeight="72" expandedWidth="1475" gap="-2" height="72" inheritNodeLayout="true" left="20" top="50" width="1475" x="20" y="50">
+    <label>Patient</label>
+    <ports>
+      <ciied:Port id="port163"/>
+    </ports>
+    <bg:HLane id="hLane3" automaticGraphLayout="false" expandedHeight="72" expandedWidth="1450" height="72" inheritNodeLayout="true" left="0" top="0" width="1450">
+      <label></label>
+      <ports>
+        <ciied:Port id="port164"/>
+      </ports>
+      <bg:StartEvent id="startEvent2" height="30" left="10" top="19" width="30" x="10" y="19">
+        <label>Illness</label>
+        <ports>
+          <ciied:Port id="port165"/>
+          <ciied:Port id="port166" movable="false"/>
+          <ciied:Port id="port167" movable="false"/>
+          <ciied:Port id="port168" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port169" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port170" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port171" clipOnShape="true" x="1"/>
+          <ciied:Port id="port172" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port173" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port174" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port175" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port176" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:StartEvent>
+      <bg:Task id="task11" height="50" left="81" top="10" width="90" x="81" y="10">
+        <label>Send Doctor Request</label>
+        <ports>
+          <ciied:Port id="port177"/>
+          <ciied:Port id="port178" clipOnShape="true" x="0"/>
+          <ciied:Port id="port179" clipOnShape="true" y="1"/>
+          <ciied:Port id="port180" movable="false"/>
+          <ciied:Port id="port181" movable="false"/>
+          <ciied:Port id="port182" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port183" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port184" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port185" clipOnShape="true" x="1"/>
+          <ciied:Port id="port186" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port187" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port188" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port189" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port190" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:Task id="task12" height="50" left="991" top="10" width="90" x="991" y="10">
+        <label>Receive Appointment</label>
+        <ports>
+          <ciied:Port id="port191"/>
+          <ciied:Port id="port192" clipOnShape="true" x="0"/>
+          <ciied:Port id="port193" y="1"/>
+          <ciied:Port id="port194" clipOnShape="true" y="1"/>
+          <ciied:Port id="port195" x="1"/>
+          <ciied:Port id="port196" movable="false"/>
+          <ciied:Port id="port197" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port198" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port199" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port200" clipOnShape="true" x="1"/>
+          <ciied:Port id="port201" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port202" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port203" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port204" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port205" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:Task id="task13" height="50" left="1121" top="10" width="90" x="1121" y="10">
+        <label>Send Symptoms</label>
+        <ports>
+          <ciied:Port id="port206"/>
+          <ciied:Port id="port207" x="1"/>
+          <ciied:Port id="port208" clipOnShape="true" x="0"/>
+          <ciied:Port id="port209" movable="false"/>
+          <ciied:Port id="port210" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port211" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port212" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port213" clipOnShape="true" x="1"/>
+          <ciied:Port id="port214" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port215" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port216" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port217" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port218" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:Task id="task14" height="50" left="1251" top="10" width="90" x="1251" y="10">
+        <label>Receive Prescription</label>
+        <ports>
+          <ciied:Port id="port219"/>
+          <ciied:Port id="port220" clipOnShape="true" x="0"/>
+          <ciied:Port id="port221" clipOnShape="true" y="1"/>
+          <ciied:Port id="port222" x="1"/>
+          <ciied:Port id="port223" clipOnShape="true" x="1"/>
+          <ciied:Port id="port224" movable="false"/>
+          <ciied:Port id="port225" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port226" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port227" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port228" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port229" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port230" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port231" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port232" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:Task>
+      <bg:EndEvent id="endEvent2" height="30" left="1383" top="18" width="30" x="1383" y="18">
+        <label>End</label>
+        <ports>
+          <ciied:Port id="port233"/>
+          <ciied:Port id="port234" x="0"/>
+          <ciied:Port id="port235" movable="false"/>
+          <ciied:Port id="port236" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port237" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port238" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port239" clipOnShape="true" x="0"/>
+          <ciied:Port id="port240" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port241" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port242" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port243" clipOnShape="true" movable="false"/>
+          <ciied:Port id="port244" clipOnShape="true" movable="false">
+            <id>CENTER</id>
+          </ciied:Port>
+        </ports>
+      </bg:EndEvent>
+      <bg:SequenceFlow id="sequenceFlow12" endPort="port178" startPort="port171">
+        <fallbackEndPoint>
+          <fg:Point id="point33"/>
+        </fallbackEndPoint>
+        <fallbackStartPoint>
+          <fg:Point id="point34" x="47" y="48"/>
+        </fallbackStartPoint>
+        <label></label>
+        <shapeType>straight</shapeType>
+      </bg:SequenceFlow>
+      <bg:SequenceFlow id="sequenceFlow13" endPort="port192" startPort="port185">
+        <fallbackEndPoint>
+          <fg:Point id="point35"/>
+        </fallbackEndPoint>
+        <fallbackStartPoint>
+          <fg:Point id="point36" x="161" y="44"/>
+        </fallbackStartPoint>
+        <label></label>
+        <shapeType>straight</shapeType>
+      </bg:SequenceFlow>
+      <bg:SequenceFlow id="sequenceFlow14" endPort="port208" startPort="port200">
+        <fallbackEndPoint>
+          <fg:Point id="point37"/>
+        </fallbackEndPoint>
+        <fallbackStartPoint>
+          <fg:Point id="point38" x="1057" y="47"/>
+        </fallbackStartPoint>
+        <label></label>
+        <shapeType>straight</shapeType>
+      </bg:SequenceFlow>
+      <bg:SequenceFlow id="sequenceFlow15" endPort="port220" startPort="port213">
+        <fallbackEndPoint>
+          <fg:Point id="point39"/>
+        </fallbackEndPoint>
+        <fallbackStartPoint>
+          <fg:Point id="point40" x="1193" y="50"/>
+        </fallbackStartPoint>
+        <label></label>
+        <shapeType>straight</shapeType>
+      </bg:SequenceFlow>
+      <bg:SequenceFlow id="sequenceFlow16" endPort="port239" startPort="port223">
+        <fallbackEndPoint>
+          <fg:Point id="point41" x="1392" y="52"/>
+        </fallbackEndPoint>
+        <fallbackStartPoint>
+          <fg:Point id="point42"/>
+        </fallbackStartPoint>
+        <label></label>
+        <shapeType>straight</shapeType>
+      </bg:SequenceFlow>
+    </bg:HLane>
+  </bg:HPool>
+  <bg:MessageFlow id="messageFlow1" endPort="port4" startPort="port179">
+    <fallbackEndPoint>
+      <fg:Point id="point43"/>
+    </fallbackEndPoint>
+    <fallbackStartPoint>
+      <fg:Point id="point44"/>
+    </fallbackStartPoint>
+    <label>I want to see doctor</label>
+    <shapeType>straight</shapeType>
+  </bg:MessageFlow>
+  <bg:MessageFlow id="messageFlow2" endPort="port194" startPort="port73">
+    <fallbackEndPoint>
+      <fg:Point id="point45"/>
+    </fallbackEndPoint>
+    <fallbackStartPoint>
+      <fg:Point id="point46"/>
+    </fallbackStartPoint>
+    <label>Go see doctor</label>
+    <shapeType>straight</shapeType>
+  </bg:MessageFlow>
+  <bg:MessageFlow id="messageFlow3" endPort="port221" startPort="port137">
+    <fallbackEndPoint>
+      <fg:Point id="point47"/>
+    </fallbackEndPoint>
+    <fallbackStartPoint>
+      <fg:Point id="point48"/>
+    </fallbackStartPoint>
+    <label>Send Prescription</label>
+    <shapeType>straight</shapeType>
+  </bg:MessageFlow>
+</diagram>

+ 61 - 0
web/media/swf/bpm/manifest.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<componentPackage>
+  <component class="bpm.XMLSerializer"/>
+  <component class="bpm.graphic.Activity"/>
+  <component class="bpm.graphic.ConnectingObject"/>
+  <component class="bpm.graphic.EndEvent"/>
+  <component class="bpm.graphic.Event"/>
+  <component class="bpm.graphic.FlowObject"/>
+  <component class="bpm.graphic.Gateway"/>
+  <component class="bpm.graphic.HLane"/>
+  <component class="bpm.graphic.HPool"/>
+  <component class="bpm.graphic.HPoolAdorner"/>
+  <component class="bpm.graphic.IntermediateEvent"/>
+  <component class="bpm.graphic.MessageFlow"/>
+  <component class="bpm.graphic.SequenceFlow"/>
+  <component class="bpm.graphic.StartEvent"/>
+  <component class="bpm.graphic.SubProcess"/>
+  <component class="bpm.graphic.Task"/>
+  <component class="bpm.graphic.VLane"/>
+  <component class="bpm.graphic.VPool"/>
+  <component class="bpm.graphic.VPoolAdorner"/>
+
+  <component class="bpm.graphic.skins.EndEventSkin"/>
+  <component class="bpm.graphic.skins.GatewaySkin"/>
+  <component class="bpm.graphic.skins.HLaneSkin"/>
+  <component class="bpm.graphic.skins.HPoolSkin"/>
+  <component class="bpm.graphic.skins.IntermediateEventSkin"/>
+  <component class="bpm.graphic.skins.MessageFlowSkin"/>
+  <component class="bpm.graphic.skins.SequenceFlowSkin"/>
+  <component class="bpm.graphic.skins.StartEventSkin"/> 
+  <component class="bpm.graphic.skins.SubProcessSkin"/>
+  <component class="bpm.graphic.skins.TaskSkin"/>
+  <component class="bpm.graphic.skins.VPoolSkin"/>
+  <component class="bpm.graphic.skins.VLaneSkin"/>
+    
+  
+  <!-- Icons -->
+  <component class="bpm.graphic.icons.BPMNIcon"/>
+    
+  <component class="bpm.graphic.icons.skins.EmptySkin"/>
+  <component class="bpm.graphic.icons.skins.AdHocMarkerSkin"/>
+  <component class="bpm.graphic.icons.skins.ANDMarkerSkin"/>
+  <component class="bpm.graphic.icons.skins.CancelTriggerSkin"/>
+  <component class="bpm.graphic.icons.skins.CompensationMarkerSkin"/>
+  <component class="bpm.graphic.icons.skins.CompensationTriggerSkin"/>
+  <component class="bpm.graphic.icons.skins.ComplexMarkerSkin"/>
+  <component class="bpm.graphic.icons.skins.ErrorTriggerSkin"/>
+  <component class="bpm.graphic.icons.skins.EventMarkerSkin"/>
+  <component class="bpm.graphic.icons.skins.LinkTriggerSkin"/>
+  <component class="bpm.graphic.icons.skins.LoopMarkerSkin"/>
+  <component class="bpm.graphic.icons.skins.MessageTriggerSkin"/>
+  <component class="bpm.graphic.icons.skins.MultipleInstanceMarkerSkin"/>
+  <component class="bpm.graphic.icons.skins.MultipleTriggerSkin"/>
+  <component class="bpm.graphic.icons.skins.ORMarkerSkin"/>
+  <component class="bpm.graphic.icons.skins.RuleTriggerSkin"/>
+  <component class="bpm.graphic.icons.skins.SubProcessMarkerSkin"/>
+  <component class="bpm.graphic.icons.skins.TerminateTriggerSkin"/>
+  <component class="bpm.graphic.icons.skins.TimerTriggerSkin"/>
+  <component class="bpm.graphic.icons.skins.XORMarkerSkin"/>
+
+</componentPackage>

+ 777 - 0
web/media/swf/bpm/swfobject.js

@@ -0,0 +1,777 @@
+/*!	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
+	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
+*/
+
+var swfobject = function() {
+	
+	var UNDEF = "undefined",
+		OBJECT = "object",
+		SHOCKWAVE_FLASH = "Shockwave Flash",
+		SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
+		FLASH_MIME_TYPE = "application/x-shockwave-flash",
+		EXPRESS_INSTALL_ID = "SWFObjectExprInst",
+		ON_READY_STATE_CHANGE = "onreadystatechange",
+		
+		win = window,
+		doc = document,
+		nav = navigator,
+		
+		plugin = false,
+		domLoadFnArr = [main],
+		regObjArr = [],
+		objIdArr = [],
+		listenersArr = [],
+		storedAltContent,
+		storedAltContentId,
+		storedCallbackFn,
+		storedCallbackObj,
+		isDomLoaded = false,
+		isExpressInstallActive = false,
+		dynamicStylesheet,
+		dynamicStylesheetMedia,
+		autoHideShow = true,
+	
+	/* Centralized function for browser feature detection
+		- User agent string detection is only used when no good alternative is possible
+		- Is executed directly for optimal performance
+	*/	
+	ua = function() {
+		var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
+			u = nav.userAgent.toLowerCase(),
+			p = nav.platform.toLowerCase(),
+			windows = p ? /win/.test(p) : /win/.test(u),
+			mac = p ? /mac/.test(p) : /mac/.test(u),
+			webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
+			ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
+			playerVersion = [0,0,0],
+			d = null;
+		if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
+			d = nav.plugins[SHOCKWAVE_FLASH].description;
+			if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
+				plugin = true;
+				ie = false; // cascaded feature detection for Internet Explorer
+				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
+				playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
+				playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
+				playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
+			}
+		}
+		else if (typeof win.ActiveXObject != UNDEF) {
+			try {
+				var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
+				if (a) { // a will return null when ActiveX is disabled
+					d = a.GetVariable("$version");
+					if (d) {
+						ie = true; // cascaded feature detection for Internet Explorer
+						d = d.split(" ")[1].split(",");
+						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+					}
+				}
+			}
+			catch(e) {}
+		}
+		return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
+	}(),
+	
+	/* Cross-browser onDomLoad
+		- Will fire an event as soon as the DOM of a web page is loaded
+		- Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/
+		- Regular onload serves as fallback
+	*/ 
+	onDomLoad = function() {
+		if (!ua.w3) { return; }
+		if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { // function is fired after onload, e.g. when script is inserted dynamically 
+			callDomLoadFunctions();
+		}
+		if (!isDomLoaded) {
+			if (typeof doc.addEventListener != UNDEF) {
+				doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false);
+			}		
+			if (ua.ie && ua.win) {
+				doc.attachEvent(ON_READY_STATE_CHANGE, function() {
+					if (doc.readyState == "complete") {
+						doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee);
+						callDomLoadFunctions();
+					}
+				});
+				if (win == top) { // if not inside an iframe
+					(function(){
+						if (isDomLoaded) { return; }
+						try {
+							doc.documentElement.doScroll("left");
+						}
+						catch(e) {
+							setTimeout(arguments.callee, 0);
+							return;
+						}
+						callDomLoadFunctions();
+					})();
+				}
+			}
+			if (ua.wk) {
+				(function(){
+					if (isDomLoaded) { return; }
+					if (!/loaded|complete/.test(doc.readyState)) {
+						setTimeout(arguments.callee, 0);
+						return;
+					}
+					callDomLoadFunctions();
+				})();
+			}
+			addLoadEvent(callDomLoadFunctions);
+		}
+	}();
+	
+	function callDomLoadFunctions() {
+		if (isDomLoaded) { return; }
+		try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early
+			var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));
+			t.parentNode.removeChild(t);
+		}
+		catch (e) { return; }
+		isDomLoaded = true;
+		var dl = domLoadFnArr.length;
+		for (var i = 0; i < dl; i++) {
+			domLoadFnArr[i]();
+		}
+	}
+	
+	function addDomLoadEvent(fn) {
+		if (isDomLoaded) {
+			fn();
+		}
+		else { 
+			domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
+		}
+	}
+	
+	/* Cross-browser onload
+		- Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
+		- Will fire an event as soon as a web page including all of its assets are loaded 
+	 */
+	function addLoadEvent(fn) {
+		if (typeof win.addEventListener != UNDEF) {
+			win.addEventListener("load", fn, false);
+		}
+		else if (typeof doc.addEventListener != UNDEF) {
+			doc.addEventListener("load", fn, false);
+		}
+		else if (typeof win.attachEvent != UNDEF) {
+			addListener(win, "onload", fn);
+		}
+		else if (typeof win.onload == "function") {
+			var fnOld = win.onload;
+			win.onload = function() {
+				fnOld();
+				fn();
+			};
+		}
+		else {
+			win.onload = fn;
+		}
+	}
+	
+	/* Main function
+		- Will preferably execute onDomLoad, otherwise onload (as a fallback)
+	*/
+	function main() { 
+		if (plugin) {
+			testPlayerVersion();
+		}
+		else {
+			matchVersions();
+		}
+	}
+	
+	/* Detect the Flash Player version for non-Internet Explorer browsers
+		- Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
+		  a. Both release and build numbers can be detected
+		  b. Avoid wrong descriptions by corrupt installers provided by Adobe
+		  c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
+		- Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
+	*/
+	function testPlayerVersion() {
+		var b = doc.getElementsByTagName("body")[0];
+		var o = createElement(OBJECT);
+		o.setAttribute("type", FLASH_MIME_TYPE);
+		var t = b.appendChild(o);
+		if (t) {
+			var counter = 0;
+			(function(){
+				if (typeof t.GetVariable != UNDEF) {
+					var d = t.GetVariable("$version");
+					if (d) {
+						d = d.split(" ")[1].split(",");
+						ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+					}
+				}
+				else if (counter < 10) {
+					counter++;
+					setTimeout(arguments.callee, 10);
+					return;
+				}
+				b.removeChild(o);
+				t = null;
+				matchVersions();
+			})();
+		}
+		else {
+			matchVersions();
+		}
+	}
+	
+	/* Perform Flash Player and SWF version matching; static publishing only
+	*/
+	function matchVersions() {
+		var rl = regObjArr.length;
+		if (rl > 0) {
+			for (var i = 0; i < rl; i++) { // for each registered object element
+				var id = regObjArr[i].id;
+				var cb = regObjArr[i].callbackFn;
+				var cbObj = {success:false, id:id};
+				if (ua.pv[0] > 0) {
+					var obj = getElementById(id);
+					if (obj) {
+						if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match!
+							setVisibility(id, true);
+							if (cb) {
+								cbObj.success = true;
+								cbObj.ref = getObjectById(id);
+								cb(cbObj);
+							}
+						}
+						else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported
+							var att = {};
+							att.data = regObjArr[i].expressInstall;
+							att.width = obj.getAttribute("width") || "0";
+							att.height = obj.getAttribute("height") || "0";
+							if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); }
+							if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); }
+							// parse HTML object param element's name-value pairs
+							var par = {};
+							var p = obj.getElementsByTagName("param");
+							var pl = p.length;
+							for (var j = 0; j < pl; j++) {
+								if (p[j].getAttribute("name").toLowerCase() != "movie") {
+									par[p[j].getAttribute("name")] = p[j].getAttribute("value");
+								}
+							}
+							showExpressInstall(att, par, id, cb);
+						}
+						else { // Flash Player and SWF version mismatch or an older Webkit engine that ignores the HTML object element's nested param elements: display alternative content instead of SWF
+							displayAltContent(obj);
+							if (cb) { cb(cbObj); }
+						}
+					}
+				}
+				else {	// if no Flash Player is installed or the fp version cannot be detected we let the HTML object element do its job (either show a SWF or alternative content)
+					setVisibility(id, true);
+					if (cb) {
+						var o = getObjectById(id); // test whether there is an HTML object element or not
+						if (o && typeof o.SetVariable != UNDEF) { 
+							cbObj.success = true;
+							cbObj.ref = o;
+						}
+						cb(cbObj);
+					}
+				}
+			}
+		}
+	}
+	
+	function getObjectById(objectIdStr) {
+		var r = null;
+		var o = getElementById(objectIdStr);
+		if (o && o.nodeName == "OBJECT") {
+			if (typeof o.SetVariable != UNDEF) {
+				r = o;
+			}
+			else {
+				var n = o.getElementsByTagName(OBJECT)[0];
+				if (n) {
+					r = n;
+				}
+			}
+		}
+		return r;
+	}
+	
+	/* Requirements for Adobe Express Install
+		- only one instance can be active at a time
+		- fp 6.0.65 or higher
+		- Win/Mac OS only
+		- no Webkit engines older than version 312
+	*/
+	function canExpressInstall() {
+		return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);
+	}
+	
+	/* Show the Adobe Express Install dialog
+		- Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
+	*/
+	function showExpressInstall(att, par, replaceElemIdStr, callbackFn) {
+		isExpressInstallActive = true;
+		storedCallbackFn = callbackFn || null;
+		storedCallbackObj = {success:false, id:replaceElemIdStr};
+		var obj = getElementById(replaceElemIdStr);
+		if (obj) {
+			if (obj.nodeName == "OBJECT") { // static publishing
+				storedAltContent = abstractAltContent(obj);
+				storedAltContentId = null;
+			}
+			else { // dynamic publishing
+				storedAltContent = obj;
+				storedAltContentId = replaceElemIdStr;
+			}
+			att.id = EXPRESS_INSTALL_ID;
+			if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; }
+			if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; }
+			doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
+			var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
+				fv = "MMredirectURL=" + encodeURI(window.location).toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title;
+			if (typeof par.flashvars != UNDEF) {
+				par.flashvars += "&" + fv;
+			}
+			else {
+				par.flashvars = fv;
+			}
+			// IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
+			// because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
+			if (ua.ie && ua.win && obj.readyState != 4) {
+				var newObj = createElement("div");
+				replaceElemIdStr += "SWFObjectNew";
+				newObj.setAttribute("id", replaceElemIdStr);
+				obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf
+				obj.style.display = "none";
+				(function(){
+					if (obj.readyState == 4) {
+						obj.parentNode.removeChild(obj);
+					}
+					else {
+						setTimeout(arguments.callee, 10);
+					}
+				})();
+			}
+			createSWF(att, par, replaceElemIdStr);
+		}
+	}
+	
+	/* Functions to abstract and display alternative content
+	*/
+	function displayAltContent(obj) {
+		if (ua.ie && ua.win && obj.readyState != 4) {
+			// IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
+			// because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
+			var el = createElement("div");
+			obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content
+			el.parentNode.replaceChild(abstractAltContent(obj), el);
+			obj.style.display = "none";
+			(function(){
+				if (obj.readyState == 4) {
+					obj.parentNode.removeChild(obj);
+				}
+				else {
+					setTimeout(arguments.callee, 10);
+				}
+			})();
+		}
+		else {
+			obj.parentNode.replaceChild(abstractAltContent(obj), obj);
+		}
+	} 
+
+	function abstractAltContent(obj) {
+		var ac = createElement("div");
+		if (ua.win && ua.ie) {
+			ac.innerHTML = obj.innerHTML;
+		}
+		else {
+			var nestedObj = obj.getElementsByTagName(OBJECT)[0];
+			if (nestedObj) {
+				var c = nestedObj.childNodes;
+				if (c) {
+					var cl = c.length;
+					for (var i = 0; i < cl; i++) {
+						if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
+							ac.appendChild(c[i].cloneNode(true));
+						}
+					}
+				}
+			}
+		}
+		return ac;
+	}
+	
+	/* Cross-browser dynamic SWF creation
+	*/
+	function createSWF(attObj, parObj, id) {
+		var r, el = getElementById(id);
+		if (ua.wk && ua.wk < 312) { return r; }
+		if (el) {
+			if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
+				attObj.id = id;
+			}
+			if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
+				var att = "";
+				for (var i in attObj) {
+					if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
+						if (i.toLowerCase() == "data") {
+							parObj.movie = attObj[i];
+						}
+						else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+							att += ' class="' + attObj[i] + '"';
+						}
+						else if (i.toLowerCase() != "classid") {
+							att += ' ' + i + '="' + attObj[i] + '"';
+						}
+					}
+				}
+				var par = "";
+				for (var j in parObj) {
+					if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
+						par += '<param name="' + j + '" value="' + parObj[j] + '" />';
+					}
+				}
+				el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
+				objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
+				r = getElementById(attObj.id);	
+			}
+			else { // well-behaving browsers
+				var o = createElement(OBJECT);
+				o.setAttribute("type", FLASH_MIME_TYPE);
+				for (var m in attObj) {
+					if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
+						if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+							o.setAttribute("class", attObj[m]);
+						}
+						else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
+							o.setAttribute(m, attObj[m]);
+						}
+					}
+				}
+				for (var n in parObj) {
+					if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
+						createObjParam(o, n, parObj[n]);
+					}
+				}
+				el.parentNode.replaceChild(o, el);
+				r = o;
+			}
+		}
+		return r;
+	}
+	
+	function createObjParam(el, pName, pValue) {
+		var p = createElement("param");
+		p.setAttribute("name", pName);	
+		p.setAttribute("value", pValue);
+		el.appendChild(p);
+	}
+	
+	/* Cross-browser SWF removal
+		- Especially needed to safely and completely remove a SWF in Internet Explorer
+	*/
+	function removeSWF(id) {
+		var obj = getElementById(id);
+		if (obj && obj.nodeName == "OBJECT") {
+			if (ua.ie && ua.win) {
+				obj.style.display = "none";
+				(function(){
+					if (obj.readyState == 4) {
+						removeObjectInIE(id);
+					}
+					else {
+						setTimeout(arguments.callee, 10);
+					}
+				})();
+			}
+			else {
+				obj.parentNode.removeChild(obj);
+			}
+		}
+	}
+	
+	function removeObjectInIE(id) {
+		var obj = getElementById(id);
+		if (obj) {
+			for (var i in obj) {
+				if (typeof obj[i] == "function") {
+					obj[i] = null;
+				}
+			}
+			obj.parentNode.removeChild(obj);
+		}
+	}
+	
+	/* Functions to optimize JavaScript compression
+	*/
+	function getElementById(id) {
+		var el = null;
+		try {
+			el = doc.getElementById(id);
+		}
+		catch (e) {}
+		return el;
+	}
+	
+	function createElement(el) {
+		return doc.createElement(el);
+	}
+	
+	/* Updated attachEvent function for Internet Explorer
+		- Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks
+	*/	
+	function addListener(target, eventType, fn) {
+		target.attachEvent(eventType, fn);
+		listenersArr[listenersArr.length] = [target, eventType, fn];
+	}
+	
+	/* Flash Player and SWF content version matching
+	*/
+	function hasPlayerVersion(rv) {
+		var pv = ua.pv, v = rv.split(".");
+		v[0] = parseInt(v[0], 10);
+		v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
+		v[2] = parseInt(v[2], 10) || 0;
+		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
+	}
+	
+	/* Cross-browser dynamic CSS creation
+		- Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
+	*/	
+	function createCSS(sel, decl, media, newStyle) {
+		if (ua.ie && ua.mac) { return; }
+		var h = doc.getElementsByTagName("head")[0];
+		if (!h) { return; } // to also support badly authored HTML pages that lack a head element
+		var m = (media && typeof media == "string") ? media : "screen";
+		if (newStyle) {
+			dynamicStylesheet = null;
+			dynamicStylesheetMedia = null;
+		}
+		if (!dynamicStylesheet || dynamicStylesheetMedia != m) { 
+			// create dynamic stylesheet + get a global reference to it
+			var s = createElement("style");
+			s.setAttribute("type", "text/css");
+			s.setAttribute("media", m);
+			dynamicStylesheet = h.appendChild(s);
+			if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
+				dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];
+			}
+			dynamicStylesheetMedia = m;
+		}
+		// add style rule
+		if (ua.ie && ua.win) {
+			if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) {
+				dynamicStylesheet.addRule(sel, decl);
+			}
+		}
+		else {
+			if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) {
+				dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
+			}
+		}
+	}
+	
+	function setVisibility(id, isVisible) {
+		if (!autoHideShow) { return; }
+		var v = isVisible ? "visible" : "hidden";
+		if (isDomLoaded && getElementById(id)) {
+			getElementById(id).style.visibility = v;
+		}
+		else {
+			createCSS("#" + id, "visibility:" + v);
+		}
+	}
+
+	/* Filter to avoid XSS attacks
+	*/
+	function urlEncodeIfNecessary(s) {
+		var regex = /[\\\"<>\.;]/;
+		var hasBadChars = regex.exec(s) != null;
+		return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
+	}
+	
+	/* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)
+	*/
+	var cleanup = function() {
+		if (ua.ie && ua.win) {
+			window.attachEvent("onunload", function() {
+				// remove listeners to avoid memory leaks
+				var ll = listenersArr.length;
+				for (var i = 0; i < ll; i++) {
+					listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
+				}
+				// cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
+				var il = objIdArr.length;
+				for (var j = 0; j < il; j++) {
+					removeSWF(objIdArr[j]);
+				}
+				// cleanup library's main closures to avoid memory leaks
+				for (var k in ua) {
+					ua[k] = null;
+				}
+				ua = null;
+				for (var l in swfobject) {
+					swfobject[l] = null;
+				}
+				swfobject = null;
+			});
+		}
+	}();
+	
+	return {
+		/* Public API
+			- Reference: http://code.google.com/p/swfobject/wiki/documentation
+		*/ 
+		registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {
+			if (ua.w3 && objectIdStr && swfVersionStr) {
+				var regObj = {};
+				regObj.id = objectIdStr;
+				regObj.swfVersion = swfVersionStr;
+				regObj.expressInstall = xiSwfUrlStr;
+				regObj.callbackFn = callbackFn;
+				regObjArr[regObjArr.length] = regObj;
+				setVisibility(objectIdStr, false);
+			}
+			else if (callbackFn) {
+				callbackFn({success:false, id:objectIdStr});
+			}
+		},
+		
+		getObjectById: function(objectIdStr) {
+			if (ua.w3) {
+				return getObjectById(objectIdStr);
+			}
+		},
+		
+		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
+			var callbackObj = {success:false, id:replaceElemIdStr};
+			if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
+				setVisibility(replaceElemIdStr, false);
+				addDomLoadEvent(function() {
+					widthStr += ""; // auto-convert to string
+					heightStr += "";
+					var att = {};
+					if (attObj && typeof attObj === OBJECT) {
+						for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
+							att[i] = attObj[i];
+						}
+					}
+					att.data = swfUrlStr;
+					att.width = widthStr;
+					att.height = heightStr;
+					var par = {}; 
+					if (parObj && typeof parObj === OBJECT) {
+						for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
+							par[j] = parObj[j];
+						}
+					}
+					if (flashvarsObj && typeof flashvarsObj === OBJECT) {
+						for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
+							if (typeof par.flashvars != UNDEF) {
+								par.flashvars += "&" + k + "=" + flashvarsObj[k];
+							}
+							else {
+								par.flashvars = k + "=" + flashvarsObj[k];
+							}
+						}
+					}
+					if (hasPlayerVersion(swfVersionStr)) { // create SWF
+						var obj = createSWF(att, par, replaceElemIdStr);
+						if (att.id == replaceElemIdStr) {
+							setVisibility(replaceElemIdStr, true);
+						}
+						callbackObj.success = true;
+						callbackObj.ref = obj;
+					}
+					else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install
+						att.data = xiSwfUrlStr;
+						showExpressInstall(att, par, replaceElemIdStr, callbackFn);
+						return;
+					}
+					else { // show alternative content
+						setVisibility(replaceElemIdStr, true);
+					}
+					if (callbackFn) { callbackFn(callbackObj); }
+				});
+			}
+			else if (callbackFn) { callbackFn(callbackObj);	}
+		},
+		
+		switchOffAutoHideShow: function() {
+			autoHideShow = false;
+		},
+		
+		ua: ua,
+		
+		getFlashPlayerVersion: function() {
+			return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
+		},
+		
+		hasFlashPlayerVersion: hasPlayerVersion,
+		
+		createSWF: function(attObj, parObj, replaceElemIdStr) {
+			if (ua.w3) {
+				return createSWF(attObj, parObj, replaceElemIdStr);
+			}
+			else {
+				return undefined;
+			}
+		},
+		
+		showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) {
+			if (ua.w3 && canExpressInstall()) {
+				showExpressInstall(att, par, replaceElemIdStr, callbackFn);
+			}
+		},
+		
+		removeSWF: function(objElemIdStr) {
+			if (ua.w3) {
+				removeSWF(objElemIdStr);
+			}
+		},
+		
+		createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) {
+			if (ua.w3) {
+				createCSS(selStr, declStr, mediaStr, newStyleBoolean);
+			}
+		},
+		
+		addDomLoadEvent: addDomLoadEvent,
+		
+		addLoadEvent: addLoadEvent,
+		
+		getQueryParamValue: function(param) {
+			var q = doc.location.search || doc.location.hash;
+			if (q) {
+				if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
+				if (param == null) {
+					return urlEncodeIfNecessary(q);
+				}
+				var pairs = q.split("&");
+				for (var i = 0; i < pairs.length; i++) {
+					if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
+						return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
+					}
+				}
+			}
+			return "";
+		},
+		
+		// For internal usage only
+		expressInstallCallback: function() {
+			if (isExpressInstallActive) {
+				var obj = getElementById(EXPRESS_INSTALL_ID);
+				if (obj && storedAltContent) {
+					obj.parentNode.replaceChild(storedAltContent, obj);
+					if (storedAltContentId) {
+						setVisibility(storedAltContentId, true);
+						if (ua.ie && ua.win) { storedAltContent.style.display = "block"; }
+					}
+					if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }
+				}
+				isExpressInstallActive = false;
+			} 
+		}
+	};
+}();

File diff suppressed because it is too large
+ 1296 - 0
web/media/swf/bpm/tap.idfl


+ 8 - 0
web/media/swf/bpm/test.css

@@ -0,0 +1,8 @@
+/* CSS file */
+@namespace s "library://ns.adobe.com/flex/spark";
+@namespace mx "library://ns.adobe.com/flex/mx";
+
+s|TitleWindow
+{
+	border-color:#ccc;
+}

+ 105 - 0
web/media/swf/calendar/calendar.html

@@ -0,0 +1,105 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- saved from url=(0014)about:internet -->
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">	
+    <!-- 
+    Smart developers always View Source. 
+    
+    This application was built using Adobe Flex, an open source framework
+    for building rich Internet applications that get delivered via the
+    Flash Player or to desktops via Adobe AIR. 
+    
+    Learn more about Flex at http://flex.org 
+    // -->
+    <head>
+        <title></title>         
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+		<!-- Include CSS to eliminate any default margins/padding and set the height of the html element and 
+		     the body element to 100%, because Firefox, or any Gecko based browser, interprets percentage as 
+			 the percentage of the height of its parent container, which has to be set explicitly.  Initially, 
+			 don't display flashContent div so it won't show if JavaScript disabled.
+		-->
+        <style type="text/css" media="screen"> 
+			html, body	{ height:100%; }
+			body { margin:0; padding:0; overflow:auto; text-align:center; 
+			       background-color: #ffffff; }   
+			#flashContent { display:none; }
+        </style>
+		
+		<!-- Enable Browser History by replacing useBrowserHistory tokens with two hyphens -->
+        <!-- BEGIN Browser History required section >
+        <link rel="stylesheet" type="text/css" href="history/history.css" />
+        <script type="text/javascript" src="history/history.js"></script>
+        <! END Browser History required section -->  
+		    
+        <script type="text/javascript" src="swfobject.js"></script>
+        <script type="text/javascript">
+            <!-- For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. --> 
+            var swfVersionStr = "10.0.0";
+            <!-- To use express install, set to playerProductInstall.swf, otherwise the empty string. -->
+            var xiSwfUrlStr = "playerProductInstall.swf";
+            var flashvars = {};
+            var params = {};
+            params.quality = "high";
+            params.bgcolor = "#ffffff";
+            params.allowscriptaccess = "sameDomain";
+            params.allowfullscreen = "true";
+            var attributes = {};
+            attributes.id = "calendar";
+            attributes.name = "calendar";
+            attributes.align = "middle";
+            swfobject.embedSWF(
+                "calendar.swf", "flashContent", 
+                "100%", "100%", 
+                swfVersionStr, xiSwfUrlStr, 
+                flashvars, params, attributes);
+			<!-- JavaScript enabled so display the flashContent div in case it is not replaced with a swf object. -->
+			swfobject.createCSS("#flashContent", "display:block;text-align:left;");
+        </script>
+    </head>
+    <body>
+        <!-- SWFObject's dynamic embed method replaces this alternative HTML content with Flash content when enough 
+			 JavaScript and Flash plug-in support is available. The div is initially hidden so that it doesn't show
+			 when JavaScript is disabled.
+		-->
+        <div id="flashContent">
+        	<p>
+	        	To view this page ensure that Adobe Flash Player version 
+				10.0.0 or greater is installed. 
+			</p>
+			<script type="text/javascript"> 
+				var pageHost = ((document.location.protocol == "https:") ? "https://" :	"http://"); 
+				document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='" 
+								+ pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" ); 
+			</script> 
+        </div>
+	   	
+       	<noscript>
+            <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%" id="calendar">
+                <param name="movie" value="calendar.swf" />
+                <param name="quality" value="high" />
+                <param name="bgcolor" value="#ffffff" />
+                <param name="allowScriptAccess" value="sameDomain" />
+                <param name="allowFullScreen" value="true" />
+                <!--[if !IE]>-->
+                <object type="application/x-shockwave-flash" data="calendar.swf" width="100%" height="100%">
+                    <param name="quality" value="high" />
+                    <param name="bgcolor" value="#ffffff" />
+                    <param name="allowScriptAccess" value="sameDomain" />
+                    <param name="allowFullScreen" value="true" />
+                <!--<![endif]-->
+                <!--[if gte IE 6]>-->
+                	<p> 
+                		Either scripts and active content are not permitted to run or Adobe Flash Player version
+                		10.0.0 or greater is not installed.
+                	</p>
+                <!--<![endif]-->
+                    <a href="http://www.adobe.com/go/getflashplayer">
+                        <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash Player" />
+                    </a>
+                <!--[if !IE]>-->
+                </object>
+                <!--<![endif]-->
+            </object>
+	    </noscript>		
+   </body>
+</html>

BIN
web/media/swf/calendar/calendar.swf


BIN
web/media/swf/calendar/playerProductInstall.swf


+ 777 - 0
web/media/swf/calendar/swfobject.js

@@ -0,0 +1,777 @@
+/*!	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
+	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
+*/
+
+var swfobject = function() {
+	
+	var UNDEF = "undefined",
+		OBJECT = "object",
+		SHOCKWAVE_FLASH = "Shockwave Flash",
+		SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
+		FLASH_MIME_TYPE = "application/x-shockwave-flash",
+		EXPRESS_INSTALL_ID = "SWFObjectExprInst",
+		ON_READY_STATE_CHANGE = "onreadystatechange",
+		
+		win = window,
+		doc = document,
+		nav = navigator,
+		
+		plugin = false,
+		domLoadFnArr = [main],
+		regObjArr = [],
+		objIdArr = [],
+		listenersArr = [],
+		storedAltContent,
+		storedAltContentId,
+		storedCallbackFn,
+		storedCallbackObj,
+		isDomLoaded = false,
+		isExpressInstallActive = false,
+		dynamicStylesheet,
+		dynamicStylesheetMedia,
+		autoHideShow = true,
+	
+	/* Centralized function for browser feature detection
+		- User agent string detection is only used when no good alternative is possible
+		- Is executed directly for optimal performance
+	*/	
+	ua = function() {
+		var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
+			u = nav.userAgent.toLowerCase(),
+			p = nav.platform.toLowerCase(),
+			windows = p ? /win/.test(p) : /win/.test(u),
+			mac = p ? /mac/.test(p) : /mac/.test(u),
+			webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
+			ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
+			playerVersion = [0,0,0],
+			d = null;
+		if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
+			d = nav.plugins[SHOCKWAVE_FLASH].description;
+			if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
+				plugin = true;
+				ie = false; // cascaded feature detection for Internet Explorer
+				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
+				playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
+				playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
+				playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
+			}
+		}
+		else if (typeof win.ActiveXObject != UNDEF) {
+			try {
+				var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
+				if (a) { // a will return null when ActiveX is disabled
+					d = a.GetVariable("$version");
+					if (d) {
+						ie = true; // cascaded feature detection for Internet Explorer
+						d = d.split(" ")[1].split(",");
+						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+					}
+				}
+			}
+			catch(e) {}
+		}
+		return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
+	}(),
+	
+	/* Cross-browser onDomLoad
+		- Will fire an event as soon as the DOM of a web page is loaded
+		- Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/
+		- Regular onload serves as fallback
+	*/ 
+	onDomLoad = function() {
+		if (!ua.w3) { return; }
+		if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { // function is fired after onload, e.g. when script is inserted dynamically 
+			callDomLoadFunctions();
+		}
+		if (!isDomLoaded) {
+			if (typeof doc.addEventListener != UNDEF) {
+				doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false);
+			}		
+			if (ua.ie && ua.win) {
+				doc.attachEvent(ON_READY_STATE_CHANGE, function() {
+					if (doc.readyState == "complete") {
+						doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee);
+						callDomLoadFunctions();
+					}
+				});
+				if (win == top) { // if not inside an iframe
+					(function(){
+						if (isDomLoaded) { return; }
+						try {
+							doc.documentElement.doScroll("left");
+						}
+						catch(e) {
+							setTimeout(arguments.callee, 0);
+							return;
+						}
+						callDomLoadFunctions();
+					})();
+				}
+			}
+			if (ua.wk) {
+				(function(){
+					if (isDomLoaded) { return; }
+					if (!/loaded|complete/.test(doc.readyState)) {
+						setTimeout(arguments.callee, 0);
+						return;
+					}
+					callDomLoadFunctions();
+				})();
+			}
+			addLoadEvent(callDomLoadFunctions);
+		}
+	}();
+	
+	function callDomLoadFunctions() {
+		if (isDomLoaded) { return; }
+		try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early
+			var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));
+			t.parentNode.removeChild(t);
+		}
+		catch (e) { return; }
+		isDomLoaded = true;
+		var dl = domLoadFnArr.length;
+		for (var i = 0; i < dl; i++) {
+			domLoadFnArr[i]();
+		}
+	}
+	
+	function addDomLoadEvent(fn) {
+		if (isDomLoaded) {
+			fn();
+		}
+		else { 
+			domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
+		}
+	}
+	
+	/* Cross-browser onload
+		- Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
+		- Will fire an event as soon as a web page including all of its assets are loaded 
+	 */
+	function addLoadEvent(fn) {
+		if (typeof win.addEventListener != UNDEF) {
+			win.addEventListener("load", fn, false);
+		}
+		else if (typeof doc.addEventListener != UNDEF) {
+			doc.addEventListener("load", fn, false);
+		}
+		else if (typeof win.attachEvent != UNDEF) {
+			addListener(win, "onload", fn);
+		}
+		else if (typeof win.onload == "function") {
+			var fnOld = win.onload;
+			win.onload = function() {
+				fnOld();
+				fn();
+			};
+		}
+		else {
+			win.onload = fn;
+		}
+	}
+	
+	/* Main function
+		- Will preferably execute onDomLoad, otherwise onload (as a fallback)
+	*/
+	function main() { 
+		if (plugin) {
+			testPlayerVersion();
+		}
+		else {
+			matchVersions();
+		}
+	}
+	
+	/* Detect the Flash Player version for non-Internet Explorer browsers
+		- Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
+		  a. Both release and build numbers can be detected
+		  b. Avoid wrong descriptions by corrupt installers provided by Adobe
+		  c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
+		- Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
+	*/
+	function testPlayerVersion() {
+		var b = doc.getElementsByTagName("body")[0];
+		var o = createElement(OBJECT);
+		o.setAttribute("type", FLASH_MIME_TYPE);
+		var t = b.appendChild(o);
+		if (t) {
+			var counter = 0;
+			(function(){
+				if (typeof t.GetVariable != UNDEF) {
+					var d = t.GetVariable("$version");
+					if (d) {
+						d = d.split(" ")[1].split(",");
+						ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+					}
+				}
+				else if (counter < 10) {
+					counter++;
+					setTimeout(arguments.callee, 10);
+					return;
+				}
+				b.removeChild(o);
+				t = null;
+				matchVersions();
+			})();
+		}
+		else {
+			matchVersions();
+		}
+	}
+	
+	/* Perform Flash Player and SWF version matching; static publishing only
+	*/
+	function matchVersions() {
+		var rl = regObjArr.length;
+		if (rl > 0) {
+			for (var i = 0; i < rl; i++) { // for each registered object element
+				var id = regObjArr[i].id;
+				var cb = regObjArr[i].callbackFn;
+				var cbObj = {success:false, id:id};
+				if (ua.pv[0] > 0) {
+					var obj = getElementById(id);
+					if (obj) {
+						if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match!
+							setVisibility(id, true);
+							if (cb) {
+								cbObj.success = true;
+								cbObj.ref = getObjectById(id);
+								cb(cbObj);
+							}
+						}
+						else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported
+							var att = {};
+							att.data = regObjArr[i].expressInstall;
+							att.width = obj.getAttribute("width") || "0";
+							att.height = obj.getAttribute("height") || "0";
+							if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); }
+							if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); }
+							// parse HTML object param element's name-value pairs
+							var par = {};
+							var p = obj.getElementsByTagName("param");
+							var pl = p.length;
+							for (var j = 0; j < pl; j++) {
+								if (p[j].getAttribute("name").toLowerCase() != "movie") {
+									par[p[j].getAttribute("name")] = p[j].getAttribute("value");
+								}
+							}
+							showExpressInstall(att, par, id, cb);
+						}
+						else { // Flash Player and SWF version mismatch or an older Webkit engine that ignores the HTML object element's nested param elements: display alternative content instead of SWF
+							displayAltContent(obj);
+							if (cb) { cb(cbObj); }
+						}
+					}
+				}
+				else {	// if no Flash Player is installed or the fp version cannot be detected we let the HTML object element do its job (either show a SWF or alternative content)
+					setVisibility(id, true);
+					if (cb) {
+						var o = getObjectById(id); // test whether there is an HTML object element or not
+						if (o && typeof o.SetVariable != UNDEF) { 
+							cbObj.success = true;
+							cbObj.ref = o;
+						}
+						cb(cbObj);
+					}
+				}
+			}
+		}
+	}
+	
+	function getObjectById(objectIdStr) {
+		var r = null;
+		var o = getElementById(objectIdStr);
+		if (o && o.nodeName == "OBJECT") {
+			if (typeof o.SetVariable != UNDEF) {
+				r = o;
+			}
+			else {
+				var n = o.getElementsByTagName(OBJECT)[0];
+				if (n) {
+					r = n;
+				}
+			}
+		}
+		return r;
+	}
+	
+	/* Requirements for Adobe Express Install
+		- only one instance can be active at a time
+		- fp 6.0.65 or higher
+		- Win/Mac OS only
+		- no Webkit engines older than version 312
+	*/
+	function canExpressInstall() {
+		return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);
+	}
+	
+	/* Show the Adobe Express Install dialog
+		- Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
+	*/
+	function showExpressInstall(att, par, replaceElemIdStr, callbackFn) {
+		isExpressInstallActive = true;
+		storedCallbackFn = callbackFn || null;
+		storedCallbackObj = {success:false, id:replaceElemIdStr};
+		var obj = getElementById(replaceElemIdStr);
+		if (obj) {
+			if (obj.nodeName == "OBJECT") { // static publishing
+				storedAltContent = abstractAltContent(obj);
+				storedAltContentId = null;
+			}
+			else { // dynamic publishing
+				storedAltContent = obj;
+				storedAltContentId = replaceElemIdStr;
+			}
+			att.id = EXPRESS_INSTALL_ID;
+			if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; }
+			if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; }
+			doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
+			var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
+				fv = "MMredirectURL=" + encodeURI(window.location).toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title;
+			if (typeof par.flashvars != UNDEF) {
+				par.flashvars += "&" + fv;
+			}
+			else {
+				par.flashvars = fv;
+			}
+			// IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
+			// because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
+			if (ua.ie && ua.win && obj.readyState != 4) {
+				var newObj = createElement("div");
+				replaceElemIdStr += "SWFObjectNew";
+				newObj.setAttribute("id", replaceElemIdStr);
+				obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf
+				obj.style.display = "none";
+				(function(){
+					if (obj.readyState == 4) {
+						obj.parentNode.removeChild(obj);
+					}
+					else {
+						setTimeout(arguments.callee, 10);
+					}
+				})();
+			}
+			createSWF(att, par, replaceElemIdStr);
+		}
+	}
+	
+	/* Functions to abstract and display alternative content
+	*/
+	function displayAltContent(obj) {
+		if (ua.ie && ua.win && obj.readyState != 4) {
+			// IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
+			// because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
+			var el = createElement("div");
+			obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content
+			el.parentNode.replaceChild(abstractAltContent(obj), el);
+			obj.style.display = "none";
+			(function(){
+				if (obj.readyState == 4) {
+					obj.parentNode.removeChild(obj);
+				}
+				else {
+					setTimeout(arguments.callee, 10);
+				}
+			})();
+		}
+		else {
+			obj.parentNode.replaceChild(abstractAltContent(obj), obj);
+		}
+	} 
+
+	function abstractAltContent(obj) {
+		var ac = createElement("div");
+		if (ua.win && ua.ie) {
+			ac.innerHTML = obj.innerHTML;
+		}
+		else {
+			var nestedObj = obj.getElementsByTagName(OBJECT)[0];
+			if (nestedObj) {
+				var c = nestedObj.childNodes;
+				if (c) {
+					var cl = c.length;
+					for (var i = 0; i < cl; i++) {
+						if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
+							ac.appendChild(c[i].cloneNode(true));
+						}
+					}
+				}
+			}
+		}
+		return ac;
+	}
+	
+	/* Cross-browser dynamic SWF creation
+	*/
+	function createSWF(attObj, parObj, id) {
+		var r, el = getElementById(id);
+		if (ua.wk && ua.wk < 312) { return r; }
+		if (el) {
+			if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
+				attObj.id = id;
+			}
+			if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
+				var att = "";
+				for (var i in attObj) {
+					if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
+						if (i.toLowerCase() == "data") {
+							parObj.movie = attObj[i];
+						}
+						else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+							att += ' class="' + attObj[i] + '"';
+						}
+						else if (i.toLowerCase() != "classid") {
+							att += ' ' + i + '="' + attObj[i] + '"';
+						}
+					}
+				}
+				var par = "";
+				for (var j in parObj) {
+					if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
+						par += '<param name="' + j + '" value="' + parObj[j] + '" />';
+					}
+				}
+				el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
+				objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
+				r = getElementById(attObj.id);	
+			}
+			else { // well-behaving browsers
+				var o = createElement(OBJECT);
+				o.setAttribute("type", FLASH_MIME_TYPE);
+				for (var m in attObj) {
+					if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
+						if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+							o.setAttribute("class", attObj[m]);
+						}
+						else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
+							o.setAttribute(m, attObj[m]);
+						}
+					}
+				}
+				for (var n in parObj) {
+					if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
+						createObjParam(o, n, parObj[n]);
+					}
+				}
+				el.parentNode.replaceChild(o, el);
+				r = o;
+			}
+		}
+		return r;
+	}
+	
+	function createObjParam(el, pName, pValue) {
+		var p = createElement("param");
+		p.setAttribute("name", pName);	
+		p.setAttribute("value", pValue);
+		el.appendChild(p);
+	}
+	
+	/* Cross-browser SWF removal
+		- Especially needed to safely and completely remove a SWF in Internet Explorer
+	*/
+	function removeSWF(id) {
+		var obj = getElementById(id);
+		if (obj && obj.nodeName == "OBJECT") {
+			if (ua.ie && ua.win) {
+				obj.style.display = "none";
+				(function(){
+					if (obj.readyState == 4) {
+						removeObjectInIE(id);
+					}
+					else {
+						setTimeout(arguments.callee, 10);
+					}
+				})();
+			}
+			else {
+				obj.parentNode.removeChild(obj);
+			}
+		}
+	}
+	
+	function removeObjectInIE(id) {
+		var obj = getElementById(id);
+		if (obj) {
+			for (var i in obj) {
+				if (typeof obj[i] == "function") {
+					obj[i] = null;
+				}
+			}
+			obj.parentNode.removeChild(obj);
+		}
+	}
+	
+	/* Functions to optimize JavaScript compression
+	*/
+	function getElementById(id) {
+		var el = null;
+		try {
+			el = doc.getElementById(id);
+		}
+		catch (e) {}
+		return el;
+	}
+	
+	function createElement(el) {
+		return doc.createElement(el);
+	}
+	
+	/* Updated attachEvent function for Internet Explorer
+		- Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks
+	*/	
+	function addListener(target, eventType, fn) {
+		target.attachEvent(eventType, fn);
+		listenersArr[listenersArr.length] = [target, eventType, fn];
+	}
+	
+	/* Flash Player and SWF content version matching
+	*/
+	function hasPlayerVersion(rv) {
+		var pv = ua.pv, v = rv.split(".");
+		v[0] = parseInt(v[0], 10);
+		v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
+		v[2] = parseInt(v[2], 10) || 0;
+		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
+	}
+	
+	/* Cross-browser dynamic CSS creation
+		- Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
+	*/	
+	function createCSS(sel, decl, media, newStyle) {
+		if (ua.ie && ua.mac) { return; }
+		var h = doc.getElementsByTagName("head")[0];
+		if (!h) { return; } // to also support badly authored HTML pages that lack a head element
+		var m = (media && typeof media == "string") ? media : "screen";
+		if (newStyle) {
+			dynamicStylesheet = null;
+			dynamicStylesheetMedia = null;
+		}
+		if (!dynamicStylesheet || dynamicStylesheetMedia != m) { 
+			// create dynamic stylesheet + get a global reference to it
+			var s = createElement("style");
+			s.setAttribute("type", "text/css");
+			s.setAttribute("media", m);
+			dynamicStylesheet = h.appendChild(s);
+			if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
+				dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];
+			}
+			dynamicStylesheetMedia = m;
+		}
+		// add style rule
+		if (ua.ie && ua.win) {
+			if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) {
+				dynamicStylesheet.addRule(sel, decl);
+			}
+		}
+		else {
+			if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) {
+				dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
+			}
+		}
+	}
+	
+	function setVisibility(id, isVisible) {
+		if (!autoHideShow) { return; }
+		var v = isVisible ? "visible" : "hidden";
+		if (isDomLoaded && getElementById(id)) {
+			getElementById(id).style.visibility = v;
+		}
+		else {
+			createCSS("#" + id, "visibility:" + v);
+		}
+	}
+
+	/* Filter to avoid XSS attacks
+	*/
+	function urlEncodeIfNecessary(s) {
+		var regex = /[\\\"<>\.;]/;
+		var hasBadChars = regex.exec(s) != null;
+		return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
+	}
+	
+	/* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)
+	*/
+	var cleanup = function() {
+		if (ua.ie && ua.win) {
+			window.attachEvent("onunload", function() {
+				// remove listeners to avoid memory leaks
+				var ll = listenersArr.length;
+				for (var i = 0; i < ll; i++) {
+					listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
+				}
+				// cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
+				var il = objIdArr.length;
+				for (var j = 0; j < il; j++) {
+					removeSWF(objIdArr[j]);
+				}
+				// cleanup library's main closures to avoid memory leaks
+				for (var k in ua) {
+					ua[k] = null;
+				}
+				ua = null;
+				for (var l in swfobject) {
+					swfobject[l] = null;
+				}
+				swfobject = null;
+			});
+		}
+	}();
+	
+	return {
+		/* Public API
+			- Reference: http://code.google.com/p/swfobject/wiki/documentation
+		*/ 
+		registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {
+			if (ua.w3 && objectIdStr && swfVersionStr) {
+				var regObj = {};
+				regObj.id = objectIdStr;
+				regObj.swfVersion = swfVersionStr;
+				regObj.expressInstall = xiSwfUrlStr;
+				regObj.callbackFn = callbackFn;
+				regObjArr[regObjArr.length] = regObj;
+				setVisibility(objectIdStr, false);
+			}
+			else if (callbackFn) {
+				callbackFn({success:false, id:objectIdStr});
+			}
+		},
+		
+		getObjectById: function(objectIdStr) {
+			if (ua.w3) {
+				return getObjectById(objectIdStr);
+			}
+		},
+		
+		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
+			var callbackObj = {success:false, id:replaceElemIdStr};
+			if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
+				setVisibility(replaceElemIdStr, false);
+				addDomLoadEvent(function() {
+					widthStr += ""; // auto-convert to string
+					heightStr += "";
+					var att = {};
+					if (attObj && typeof attObj === OBJECT) {
+						for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
+							att[i] = attObj[i];
+						}
+					}
+					att.data = swfUrlStr;
+					att.width = widthStr;
+					att.height = heightStr;
+					var par = {}; 
+					if (parObj && typeof parObj === OBJECT) {
+						for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
+							par[j] = parObj[j];
+						}
+					}
+					if (flashvarsObj && typeof flashvarsObj === OBJECT) {
+						for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
+							if (typeof par.flashvars != UNDEF) {
+								par.flashvars += "&" + k + "=" + flashvarsObj[k];
+							}
+							else {
+								par.flashvars = k + "=" + flashvarsObj[k];
+							}
+						}
+					}
+					if (hasPlayerVersion(swfVersionStr)) { // create SWF
+						var obj = createSWF(att, par, replaceElemIdStr);
+						if (att.id == replaceElemIdStr) {
+							setVisibility(replaceElemIdStr, true);
+						}
+						callbackObj.success = true;
+						callbackObj.ref = obj;
+					}
+					else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install
+						att.data = xiSwfUrlStr;
+						showExpressInstall(att, par, replaceElemIdStr, callbackFn);
+						return;
+					}
+					else { // show alternative content
+						setVisibility(replaceElemIdStr, true);
+					}
+					if (callbackFn) { callbackFn(callbackObj); }
+				});
+			}
+			else if (callbackFn) { callbackFn(callbackObj);	}
+		},
+		
+		switchOffAutoHideShow: function() {
+			autoHideShow = false;
+		},
+		
+		ua: ua,
+		
+		getFlashPlayerVersion: function() {
+			return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
+		},
+		
+		hasFlashPlayerVersion: hasPlayerVersion,
+		
+		createSWF: function(attObj, parObj, replaceElemIdStr) {
+			if (ua.w3) {
+				return createSWF(attObj, parObj, replaceElemIdStr);
+			}
+			else {
+				return undefined;
+			}
+		},
+		
+		showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) {
+			if (ua.w3 && canExpressInstall()) {
+				showExpressInstall(att, par, replaceElemIdStr, callbackFn);
+			}
+		},
+		
+		removeSWF: function(objElemIdStr) {
+			if (ua.w3) {
+				removeSWF(objElemIdStr);
+			}
+		},
+		
+		createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) {
+			if (ua.w3) {
+				createCSS(selStr, declStr, mediaStr, newStyleBoolean);
+			}
+		},
+		
+		addDomLoadEvent: addDomLoadEvent,
+		
+		addLoadEvent: addLoadEvent,
+		
+		getQueryParamValue: function(param) {
+			var q = doc.location.search || doc.location.hash;
+			if (q) {
+				if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
+				if (param == null) {
+					return urlEncodeIfNecessary(q);
+				}
+				var pairs = q.split("&");
+				for (var i = 0; i < pairs.length; i++) {
+					if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
+						return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
+					}
+				}
+			}
+			return "";
+		},
+		
+		// For internal usage only
+		expressInstallCallback: function() {
+			if (isExpressInstallActive) {
+				var obj = getElementById(EXPRESS_INSTALL_ID);
+				if (obj && storedAltContent) {
+					obj.parentNode.replaceChild(storedAltContent, obj);
+					if (storedAltContentId) {
+						setVisibility(storedAltContentId, true);
+						if (ua.ie && ua.win) { storedAltContent.style.display = "block"; }
+					}
+					if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }
+				}
+				isExpressInstallActive = false;
+			} 
+		}
+	};
+}();

BIN
web/media/swf/fileupload/flexupload.swf


+ 777 - 0
web/media/swf/fileupload/swfobject.js

@@ -0,0 +1,777 @@
+/*!	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
+	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
+*/
+
+var swfobject = function() {
+	
+	var UNDEF = "undefined",
+		OBJECT = "object",
+		SHOCKWAVE_FLASH = "Shockwave Flash",
+		SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
+		FLASH_MIME_TYPE = "application/x-shockwave-flash",
+		EXPRESS_INSTALL_ID = "SWFObjectExprInst",
+		ON_READY_STATE_CHANGE = "onreadystatechange",
+		
+		win = window,
+		doc = document,
+		nav = navigator,
+		
+		plugin = false,
+		domLoadFnArr = [main],
+		regObjArr = [],
+		objIdArr = [],
+		listenersArr = [],
+		storedAltContent,
+		storedAltContentId,
+		storedCallbackFn,
+		storedCallbackObj,
+		isDomLoaded = false,
+		isExpressInstallActive = false,
+		dynamicStylesheet,
+		dynamicStylesheetMedia,
+		autoHideShow = true,
+	
+	/* Centralized function for browser feature detection
+		- User agent string detection is only used when no good alternative is possible
+		- Is executed directly for optimal performance
+	*/	
+	ua = function() {
+		var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
+			u = nav.userAgent.toLowerCase(),
+			p = nav.platform.toLowerCase(),
+			windows = p ? /win/.test(p) : /win/.test(u),
+			mac = p ? /mac/.test(p) : /mac/.test(u),
+			webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
+			ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
+			playerVersion = [0,0,0],
+			d = null;
+		if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
+			d = nav.plugins[SHOCKWAVE_FLASH].description;
+			if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
+				plugin = true;
+				ie = false; // cascaded feature detection for Internet Explorer
+				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
+				playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
+				playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
+				playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
+			}
+		}
+		else if (typeof win.ActiveXObject != UNDEF) {
+			try {
+				var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
+				if (a) { // a will return null when ActiveX is disabled
+					d = a.GetVariable("$version");
+					if (d) {
+						ie = true; // cascaded feature detection for Internet Explorer
+						d = d.split(" ")[1].split(",");
+						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+					}
+				}
+			}
+			catch(e) {}
+		}
+		return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
+	}(),
+	
+	/* Cross-browser onDomLoad
+		- Will fire an event as soon as the DOM of a web page is loaded
+		- Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/
+		- Regular onload serves as fallback
+	*/ 
+	onDomLoad = function() {
+		if (!ua.w3) { return; }
+		if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { // function is fired after onload, e.g. when script is inserted dynamically 
+			callDomLoadFunctions();
+		}
+		if (!isDomLoaded) {
+			if (typeof doc.addEventListener != UNDEF) {
+				doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false);
+			}		
+			if (ua.ie && ua.win) {
+				doc.attachEvent(ON_READY_STATE_CHANGE, function() {
+					if (doc.readyState == "complete") {
+						doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee);
+						callDomLoadFunctions();
+					}
+				});
+				if (win == top) { // if not inside an iframe
+					(function(){
+						if (isDomLoaded) { return; }
+						try {
+							doc.documentElement.doScroll("left");
+						}
+						catch(e) {
+							setTimeout(arguments.callee, 0);
+							return;
+						}
+						callDomLoadFunctions();
+					})();
+				}
+			}
+			if (ua.wk) {
+				(function(){
+					if (isDomLoaded) { return; }
+					if (!/loaded|complete/.test(doc.readyState)) {
+						setTimeout(arguments.callee, 0);
+						return;
+					}
+					callDomLoadFunctions();
+				})();
+			}
+			addLoadEvent(callDomLoadFunctions);
+		}
+	}();
+	
+	function callDomLoadFunctions() {
+		if (isDomLoaded) { return; }
+		try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early
+			var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));
+			t.parentNode.removeChild(t);
+		}
+		catch (e) { return; }
+		isDomLoaded = true;
+		var dl = domLoadFnArr.length;
+		for (var i = 0; i < dl; i++) {
+			domLoadFnArr[i]();
+		}
+	}
+	
+	function addDomLoadEvent(fn) {
+		if (isDomLoaded) {
+			fn();
+		}
+		else { 
+			domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
+		}
+	}
+	
+	/* Cross-browser onload
+		- Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
+		- Will fire an event as soon as a web page including all of its assets are loaded 
+	 */
+	function addLoadEvent(fn) {
+		if (typeof win.addEventListener != UNDEF) {
+			win.addEventListener("load", fn, false);
+		}
+		else if (typeof doc.addEventListener != UNDEF) {
+			doc.addEventListener("load", fn, false);
+		}
+		else if (typeof win.attachEvent != UNDEF) {
+			addListener(win, "onload", fn);
+		}
+		else if (typeof win.onload == "function") {
+			var fnOld = win.onload;
+			win.onload = function() {
+				fnOld();
+				fn();
+			};
+		}
+		else {
+			win.onload = fn;
+		}
+	}
+	
+	/* Main function
+		- Will preferably execute onDomLoad, otherwise onload (as a fallback)
+	*/
+	function main() { 
+		if (plugin) {
+			testPlayerVersion();
+		}
+		else {
+			matchVersions();
+		}
+	}
+	
+	/* Detect the Flash Player version for non-Internet Explorer browsers
+		- Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
+		  a. Both release and build numbers can be detected
+		  b. Avoid wrong descriptions by corrupt installers provided by Adobe
+		  c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
+		- Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
+	*/
+	function testPlayerVersion() {
+		var b = doc.getElementsByTagName("body")[0];
+		var o = createElement(OBJECT);
+		o.setAttribute("type", FLASH_MIME_TYPE);
+		var t = b.appendChild(o);
+		if (t) {
+			var counter = 0;
+			(function(){
+				if (typeof t.GetVariable != UNDEF) {
+					var d = t.GetVariable("$version");
+					if (d) {
+						d = d.split(" ")[1].split(",");
+						ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
+					}
+				}
+				else if (counter < 10) {
+					counter++;
+					setTimeout(arguments.callee, 10);
+					return;
+				}
+				b.removeChild(o);
+				t = null;
+				matchVersions();
+			})();
+		}
+		else {
+			matchVersions();
+		}
+	}
+	
+	/* Perform Flash Player and SWF version matching; static publishing only
+	*/
+	function matchVersions() {
+		var rl = regObjArr.length;
+		if (rl > 0) {
+			for (var i = 0; i < rl; i++) { // for each registered object element
+				var id = regObjArr[i].id;
+				var cb = regObjArr[i].callbackFn;
+				var cbObj = {success:false, id:id};
+				if (ua.pv[0] > 0) {
+					var obj = getElementById(id);
+					if (obj) {
+						if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match!
+							setVisibility(id, true);
+							if (cb) {
+								cbObj.success = true;
+								cbObj.ref = getObjectById(id);
+								cb(cbObj);
+							}
+						}
+						else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported
+							var att = {};
+							att.data = regObjArr[i].expressInstall;
+							att.width = obj.getAttribute("width") || "0";
+							att.height = obj.getAttribute("height") || "0";
+							if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); }
+							if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); }
+							// parse HTML object param element's name-value pairs
+							var par = {};
+							var p = obj.getElementsByTagName("param");
+							var pl = p.length;
+							for (var j = 0; j < pl; j++) {
+								if (p[j].getAttribute("name").toLowerCase() != "movie") {
+									par[p[j].getAttribute("name")] = p[j].getAttribute("value");
+								}
+							}
+							showExpressInstall(att, par, id, cb);
+						}
+						else { // Flash Player and SWF version mismatch or an older Webkit engine that ignores the HTML object element's nested param elements: display alternative content instead of SWF
+							displayAltContent(obj);
+							if (cb) { cb(cbObj); }
+						}
+					}
+				}
+				else {	// if no Flash Player is installed or the fp version cannot be detected we let the HTML object element do its job (either show a SWF or alternative content)
+					setVisibility(id, true);
+					if (cb) {
+						var o = getObjectById(id); // test whether there is an HTML object element or not
+						if (o && typeof o.SetVariable != UNDEF) { 
+							cbObj.success = true;
+							cbObj.ref = o;
+						}
+						cb(cbObj);
+					}
+				}
+			}
+		}
+	}
+	
+	function getObjectById(objectIdStr) {
+		var r = null;
+		var o = getElementById(objectIdStr);
+		if (o && o.nodeName == "OBJECT") {
+			if (typeof o.SetVariable != UNDEF) {
+				r = o;
+			}
+			else {
+				var n = o.getElementsByTagName(OBJECT)[0];
+				if (n) {
+					r = n;
+				}
+			}
+		}
+		return r;
+	}
+	
+	/* Requirements for Adobe Express Install
+		- only one instance can be active at a time
+		- fp 6.0.65 or higher
+		- Win/Mac OS only
+		- no Webkit engines older than version 312
+	*/
+	function canExpressInstall() {
+		return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);
+	}
+	
+	/* Show the Adobe Express Install dialog
+		- Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
+	*/
+	function showExpressInstall(att, par, replaceElemIdStr, callbackFn) {
+		isExpressInstallActive = true;
+		storedCallbackFn = callbackFn || null;
+		storedCallbackObj = {success:false, id:replaceElemIdStr};
+		var obj = getElementById(replaceElemIdStr);
+		if (obj) {
+			if (obj.nodeName == "OBJECT") { // static publishing
+				storedAltContent = abstractAltContent(obj);
+				storedAltContentId = null;
+			}
+			else { // dynamic publishing
+				storedAltContent = obj;
+				storedAltContentId = replaceElemIdStr;
+			}
+			att.id = EXPRESS_INSTALL_ID;
+			if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; }
+			if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; }
+			doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
+			var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
+				fv = "MMredirectURL=" + encodeURI(window.location).toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title;
+			if (typeof par.flashvars != UNDEF) {
+				par.flashvars += "&" + fv;
+			}
+			else {
+				par.flashvars = fv;
+			}
+			// IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
+			// because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
+			if (ua.ie && ua.win && obj.readyState != 4) {
+				var newObj = createElement("div");
+				replaceElemIdStr += "SWFObjectNew";
+				newObj.setAttribute("id", replaceElemIdStr);
+				obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf
+				obj.style.display = "none";
+				(function(){
+					if (obj.readyState == 4) {
+						obj.parentNode.removeChild(obj);
+					}
+					else {
+						setTimeout(arguments.callee, 10);
+					}
+				})();
+			}
+			createSWF(att, par, replaceElemIdStr);
+		}
+	}
+	
+	/* Functions to abstract and display alternative content
+	*/
+	function displayAltContent(obj) {
+		if (ua.ie && ua.win && obj.readyState != 4) {
+			// IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
+			// because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
+			var el = createElement("div");
+			obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content
+			el.parentNode.replaceChild(abstractAltContent(obj), el);
+			obj.style.display = "none";
+			(function(){
+				if (obj.readyState == 4) {
+					obj.parentNode.removeChild(obj);
+				}
+				else {
+					setTimeout(arguments.callee, 10);
+				}
+			})();
+		}
+		else {
+			obj.parentNode.replaceChild(abstractAltContent(obj), obj);
+		}
+	} 
+
+	function abstractAltContent(obj) {
+		var ac = createElement("div");
+		if (ua.win && ua.ie) {
+			ac.innerHTML = obj.innerHTML;
+		}
+		else {
+			var nestedObj = obj.getElementsByTagName(OBJECT)[0];
+			if (nestedObj) {
+				var c = nestedObj.childNodes;
+				if (c) {
+					var cl = c.length;
+					for (var i = 0; i < cl; i++) {
+						if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
+							ac.appendChild(c[i].cloneNode(true));
+						}
+					}
+				}
+			}
+		}
+		return ac;
+	}
+	
+	/* Cross-browser dynamic SWF creation
+	*/
+	function createSWF(attObj, parObj, id) {
+		var r, el = getElementById(id);
+		if (ua.wk && ua.wk < 312) { return r; }
+		if (el) {
+			if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
+				attObj.id = id;
+			}
+			if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
+				var att = "";
+				for (var i in attObj) {
+					if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
+						if (i.toLowerCase() == "data") {
+							parObj.movie = attObj[i];
+						}
+						else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+							att += ' class="' + attObj[i] + '"';
+						}
+						else if (i.toLowerCase() != "classid") {
+							att += ' ' + i + '="' + attObj[i] + '"';
+						}
+					}
+				}
+				var par = "";
+				for (var j in parObj) {
+					if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
+						par += '<param name="' + j + '" value="' + parObj[j] + '" />';
+					}
+				}
+				el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
+				objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
+				r = getElementById(attObj.id);	
+			}
+			else { // well-behaving browsers
+				var o = createElement(OBJECT);
+				o.setAttribute("type", FLASH_MIME_TYPE);
+				for (var m in attObj) {
+					if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
+						if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
+							o.setAttribute("class", attObj[m]);
+						}
+						else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
+							o.setAttribute(m, attObj[m]);
+						}
+					}
+				}
+				for (var n in parObj) {
+					if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
+						createObjParam(o, n, parObj[n]);
+					}
+				}
+				el.parentNode.replaceChild(o, el);
+				r = o;
+			}
+		}
+		return r;
+	}
+	
+	function createObjParam(el, pName, pValue) {
+		var p = createElement("param");
+		p.setAttribute("name", pName);	
+		p.setAttribute("value", pValue);
+		el.appendChild(p);
+	}
+	
+	/* Cross-browser SWF removal
+		- Especially needed to safely and completely remove a SWF in Internet Explorer
+	*/
+	function removeSWF(id) {
+		var obj = getElementById(id);
+		if (obj && obj.nodeName == "OBJECT") {
+			if (ua.ie && ua.win) {
+				obj.style.display = "none";
+				(function(){
+					if (obj.readyState == 4) {
+						removeObjectInIE(id);
+					}
+					else {
+						setTimeout(arguments.callee, 10);
+					}
+				})();
+			}
+			else {
+				obj.parentNode.removeChild(obj);
+			}
+		}
+	}
+	
+	function removeObjectInIE(id) {
+		var obj = getElementById(id);
+		if (obj) {
+			for (var i in obj) {
+				if (typeof obj[i] == "function") {
+					obj[i] = null;
+				}
+			}
+			obj.parentNode.removeChild(obj);
+		}
+	}
+	
+	/* Functions to optimize JavaScript compression
+	*/
+	function getElementById(id) {
+		var el = null;
+		try {
+			el = doc.getElementById(id);
+		}
+		catch (e) {}
+		return el;
+	}
+	
+	function createElement(el) {
+		return doc.createElement(el);
+	}
+	
+	/* Updated attachEvent function for Internet Explorer
+		- Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks
+	*/	
+	function addListener(target, eventType, fn) {
+		target.attachEvent(eventType, fn);
+		listenersArr[listenersArr.length] = [target, eventType, fn];
+	}
+	
+	/* Flash Player and SWF content version matching
+	*/
+	function hasPlayerVersion(rv) {
+		var pv = ua.pv, v = rv.split(".");
+		v[0] = parseInt(v[0], 10);
+		v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
+		v[2] = parseInt(v[2], 10) || 0;
+		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
+	}
+	
+	/* Cross-browser dynamic CSS creation
+		- Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
+	*/	
+	function createCSS(sel, decl, media, newStyle) {
+		if (ua.ie && ua.mac) { return; }
+		var h = doc.getElementsByTagName("head")[0];
+		if (!h) { return; } // to also support badly authored HTML pages that lack a head element
+		var m = (media && typeof media == "string") ? media : "screen";
+		if (newStyle) {
+			dynamicStylesheet = null;
+			dynamicStylesheetMedia = null;
+		}
+		if (!dynamicStylesheet || dynamicStylesheetMedia != m) { 
+			// create dynamic stylesheet + get a global reference to it
+			var s = createElement("style");
+			s.setAttribute("type", "text/css");
+			s.setAttribute("media", m);
+			dynamicStylesheet = h.appendChild(s);
+			if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
+				dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];
+			}
+			dynamicStylesheetMedia = m;
+		}
+		// add style rule
+		if (ua.ie && ua.win) {
+			if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) {
+				dynamicStylesheet.addRule(sel, decl);
+			}
+		}
+		else {
+			if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) {
+				dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
+			}
+		}
+	}
+	
+	function setVisibility(id, isVisible) {
+		if (!autoHideShow) { return; }
+		var v = isVisible ? "visible" : "hidden";
+		if (isDomLoaded && getElementById(id)) {
+			getElementById(id).style.visibility = v;
+		}
+		else {
+			createCSS("#" + id, "visibility:" + v);
+		}
+	}
+
+	/* Filter to avoid XSS attacks
+	*/
+	function urlEncodeIfNecessary(s) {
+		var regex = /[\\\"<>\.;]/;
+		var hasBadChars = regex.exec(s) != null;
+		return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
+	}
+	
+	/* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)
+	*/
+	var cleanup = function() {
+		if (ua.ie && ua.win) {
+			window.attachEvent("onunload", function() {
+				// remove listeners to avoid memory leaks
+				var ll = listenersArr.length;
+				for (var i = 0; i < ll; i++) {
+					listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
+				}
+				// cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
+				var il = objIdArr.length;
+				for (var j = 0; j < il; j++) {
+					removeSWF(objIdArr[j]);
+				}
+				// cleanup library's main closures to avoid memory leaks
+				for (var k in ua) {
+					ua[k] = null;
+				}
+				ua = null;
+				for (var l in swfobject) {
+					swfobject[l] = null;
+				}
+				swfobject = null;
+			});
+		}
+	}();
+	
+	return {
+		/* Public API
+			- Reference: http://code.google.com/p/swfobject/wiki/documentation
+		*/ 
+		registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {
+			if (ua.w3 && objectIdStr && swfVersionStr) {
+				var regObj = {};
+				regObj.id = objectIdStr;
+				regObj.swfVersion = swfVersionStr;
+				regObj.expressInstall = xiSwfUrlStr;
+				regObj.callbackFn = callbackFn;
+				regObjArr[regObjArr.length] = regObj;
+				setVisibility(objectIdStr, false);
+			}
+			else if (callbackFn) {
+				callbackFn({success:false, id:objectIdStr});
+			}
+		},
+		
+		getObjectById: function(objectIdStr) {
+			if (ua.w3) {
+				return getObjectById(objectIdStr);
+			}
+		},
+		
+		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
+			var callbackObj = {success:false, id:replaceElemIdStr};
+			if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
+				setVisibility(replaceElemIdStr, false);
+				addDomLoadEvent(function() {
+					widthStr += ""; // auto-convert to string
+					heightStr += "";
+					var att = {};
+					if (attObj && typeof attObj === OBJECT) {
+						for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
+							att[i] = attObj[i];
+						}
+					}
+					att.data = swfUrlStr;
+					att.width = widthStr;
+					att.height = heightStr;
+					var par = {}; 
+					if (parObj && typeof parObj === OBJECT) {
+						for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
+							par[j] = parObj[j];
+						}
+					}
+					if (flashvarsObj && typeof flashvarsObj === OBJECT) {
+						for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
+							if (typeof par.flashvars != UNDEF) {
+								par.flashvars += "&" + k + "=" + flashvarsObj[k];
+							}
+							else {
+								par.flashvars = k + "=" + flashvarsObj[k];
+							}
+						}
+					}
+					if (hasPlayerVersion(swfVersionStr)) { // create SWF
+						var obj = createSWF(att, par, replaceElemIdStr);
+						if (att.id == replaceElemIdStr) {
+							setVisibility(replaceElemIdStr, true);
+						}
+						callbackObj.success = true;
+						callbackObj.ref = obj;
+					}
+					else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install
+						att.data = xiSwfUrlStr;
+						showExpressInstall(att, par, replaceElemIdStr, callbackFn);
+						return;
+					}
+					else { // show alternative content
+						setVisibility(replaceElemIdStr, true);
+					}
+					if (callbackFn) { callbackFn(callbackObj); }
+				});
+			}
+			else if (callbackFn) { callbackFn(callbackObj);	}
+		},
+		
+		switchOffAutoHideShow: function() {
+			autoHideShow = false;
+		},
+		
+		ua: ua,
+		
+		getFlashPlayerVersion: function() {
+			return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
+		},
+		
+		hasFlashPlayerVersion: hasPlayerVersion,
+		
+		createSWF: function(attObj, parObj, replaceElemIdStr) {
+			if (ua.w3) {
+				return createSWF(attObj, parObj, replaceElemIdStr);
+			}
+			else {
+				return undefined;
+			}
+		},
+		
+		showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) {
+			if (ua.w3 && canExpressInstall()) {
+				showExpressInstall(att, par, replaceElemIdStr, callbackFn);
+			}
+		},
+		
+		removeSWF: function(objElemIdStr) {
+			if (ua.w3) {
+				removeSWF(objElemIdStr);
+			}
+		},
+		
+		createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) {
+			if (ua.w3) {
+				createCSS(selStr, declStr, mediaStr, newStyleBoolean);
+			}
+		},
+		
+		addDomLoadEvent: addDomLoadEvent,
+		
+		addLoadEvent: addLoadEvent,
+		
+		getQueryParamValue: function(param) {
+			var q = doc.location.search || doc.location.hash;
+			if (q) {
+				if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
+				if (param == null) {
+					return urlEncodeIfNecessary(q);
+				}
+				var pairs = q.split("&");
+				for (var i = 0; i < pairs.length; i++) {
+					if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
+						return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
+					}
+				}
+			}
+			return "";
+		},
+		
+		// For internal usage only
+		expressInstallCallback: function() {
+			if (isExpressInstallActive) {
+				var obj = getElementById(EXPRESS_INSTALL_ID);
+				if (obj && storedAltContent) {
+					obj.parentNode.replaceChild(storedAltContent, obj);
+					if (storedAltContentId) {
+						setVisibility(storedAltContentId, true);
+						if (ua.ie && ua.win) { storedAltContent.style.display = "block"; }
+					}
+					if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }
+				}
+				isExpressInstallActive = false;
+			} 
+		}
+	};
+}();

BIN
web/mobileapp/css/fonts/icomoon.eot


BIN
web/mobileapp/css/fonts/icomoon.ttf


BIN
web/mobileapp/css/fonts/icomoon.woff


BIN
web/mobileapp/css/fonts/ionicons.eot


BIN
web/mobileapp/css/fonts/ionicons.ttf


+ 118 - 0
web/mobileapp/css/ht.css

@@ -0,0 +1,118 @@
+.cp-cb{
+	display:none;
+}
+.cp-cb + label{
+	background-color: white;
+	border: 0.1em solid #727272;
+	box-shadow: 0 0.1em 0.2em rgba(0,0,0,0.05), inset 0 -1.5em 1em -1.2em rgba(0,0,0,0.05);
+	padding: 0.6em;
+	border-radius: 0.2em;
+	display: inline-block;
+	position: relative;
+}
+.cp-cb + label:active, .cp-cb:checked + label:active {
+	box-shadow: 0 0.1em 0.2em rgba(0,0,0,0.05), inset 0 0.1em 0.3em rgba(0,0,0,0.1);
+}
+.cp-cb:checked + label {
+	background-color: white;
+	border: 0.1em solid #52ADEC;
+	box-shadow: 0 0.1em 0.2em rgba(0,0,0,0.05), inset 0 -1.5em 1em -1.2em rgba(0,0,0,0.05), inset 15px 1em -1.2em rgba(255,255,255,0.1);
+	color: #52ADEC;
+}
+.cp-cb:checked + label:after {
+	content: '\2714';
+	font-size: 1.5em;
+	position: absolute;
+	top: -0.35em;
+	left: -0.2em;
+	color: #52ADEC;
+}
+
+.cp-rb {
+	display: none;
+}
+.cp-rb + label {
+	-webkit-appearance: none;
+	background-color: white;
+	border: 0.1em solid #727272;
+	box-shadow: 0 0.1em 0.2em rgba(0,0,0,0.05), inset 0 -1.5em 1em -1.2em rgba(0,0,0,0.05);
+	padding: 0.4em;
+	border-radius: 2em;
+	display: inline-block;
+	position: relative;
+}
+.cp-rb:checked + label:after {
+	content: ' ';
+	width: 0.7em;
+	height: 0.7em;
+	border-radius: 2em;
+	position: absolute;
+	top: 0.2em;
+	background: #52ADEC;
+	box-shadow: inset 0 0 1em rgba(0,0,0,0.3);
+	text-shadow: 0;
+	left: 0.2em;
+	font-size: 0.7em;
+}
+.cp-rb:checked + label {
+	background-color: white;
+	color: #52ADEC;
+	border: 0.1em solid #52ADEC;
+	box-shadow: 0 0.1em 0.2em rgba(0,0,0,0.05), inset 0 -1.5em 1em -1.2em rgba(0,0,0,0.05), inset 1.5em 1em -1.2em rgba(255,255,255,0.1), inset 0 0 1em rgba(0,0,0,0.1);
+}
+.cp-rb + label:active, .cp-rb:checked + label:active {
+	box-shadow: 0 0.1em 0.2em rgba(0,0,0,0.05), inset 0 0.1em 0.3em rgba(0,0,0,0.1);
+}
+div.selector_div{
+	/*
+padding:0.5em;
+*/
+}
+span.info-span{
+	/*
+border:0.1em solid #ccc;
+	background:#eee;
+	padding:0.2em;
+	margin:0.2em;
+*/
+	display:inline-block;
+}
+span.info-span a{
+	font-size:1.2em;
+	text-decoration:none;
+	color:#888888 !important
+}
+a.info-act{
+	font-weight:bold;
+}
+.nav{
+	display:inline-block;
+}
+.nav > div{
+	border:0.1em solid #666666;
+	display:inline-block;
+}
+.nav > div > span{
+	display:inline-block;
+	margin:0.3em;
+	color:#666666;
+	font-size:1em;
+}
+div.navact{
+	background:#666666;
+}
+div.navact > span{
+	color:#fff;
+}
+.navcr {
+	-webkit-border-top-right-radius: .6em;
+	border-top-right-radius: .6em;
+	-webkit-border-bottom-right-radius: .6em;
+	border-bottom-right-radius: .6em
+}
+.navcl {
+	-webkit-border-top-left-radius: .6em;
+	border-top-left-radius: .6em;
+	-webkit-border-bottom-left-radius: .6em;
+	border-bottom-left-radius: .6em
+}

+ 0 - 0
web/mobileapp/css/image-iconmoone.css


BIN
web/mobileapp/css/images/3.jpg


BIN
web/mobileapp/css/images/flowagent.jpg


BIN
web/mobileapp/css/images/flowhistory.jpg


BIN
web/mobileapp/css/images/icon-search-black.png


BIN
web/mobileapp/css/images/login.jpg


BIN
web/mobileapp/css/img/down.png


BIN
web/mobileapp/css/img/medal-act.png


BIN
web/mobileapp/css/img/medal.png


File diff suppressed because it is too large
+ 6302 - 0
web/mobileapp/css/ionic.css


+ 94 - 0
web/mobileapp/css/iscroll/scrollbars.css

@@ -0,0 +1,94 @@
+
+.sl_header {
+	position:absolute; 
+	z-index:2;
+	top:0; 
+	left:0;
+	width:100%;
+	font-size:1em;
+	text-align:center;
+}
+
+.sl_wrapper {
+	position: absolute;
+	z-index: 1;
+	top:0; 
+	bottom:0;
+	left: 0;
+	right:5%;
+	width: 100%;
+	background: #eeeeee;
+	/*overflow: hidden;*/
+}
+
+.sl_scroller {
+	position: absolute;
+	z-index: 1;
+	-webkit-tap-highlight-color: rgba(0,0,0,0);
+	width: 100%;
+	-webkit-transform: translateZ(0);
+	-moz-transform: translateZ(0);
+	-ms-transform: translateZ(0);
+	-o-transform: translateZ(0);
+	transform: translateZ(0);
+	-webkit-touch-callout: none;
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+	-webkit-text-size-adjust: none;
+	-moz-text-size-adjust: none;
+	-ms-text-size-adjust: none;
+	-o-text-size-adjust: none;
+	text-size-adjust: none;
+}
+
+.sl_footer {
+	position:absolute; 
+	z-index:2;
+	bottom:0; 
+	left:0;
+	width:100%;
+	font-size:1em;
+	text-align:center;
+}
+
+.sl_pop_footer{
+	position: absolute;
+	z-index: 1;
+	bottom: 0;
+	left: 0;
+	width:93%;
+	background-color:white;
+	-webkit-animation:sl_pop_footer_Move 0.1s;
+}
+@-webkit-keyframes sl_pop_footer_Move{
+	from{bottom:-100px;}
+	to{bottom:0px;}
+}
+
+.sl_right {
+	position: absolute;
+	z-index: 2;
+	top:0;
+	right: 0;
+	display:box;
+	width:8%;
+	font-size:0.6em;
+}
+
+.sl_middle{
+	position: absolute;
+	z-index: 3;
+	top:40%;
+	left: 37%;
+	border:1px solid gray;
+	background-color:white;
+	font-size:3em;
+	text-align:center;
+	width: 1.2em;
+	height: 1.2em;
+}
+.sl_middle:empty{
+	display:none;
+}

BIN
web/mobileapp/css/login/bg.jpg


+ 21 - 0
web/mobileapp/css/login/login.css

@@ -0,0 +1,21 @@
+
+.uinn-pLt1{
+	padding-top:5.3125em;
+}
+.uinn-pLb1{
+	padding-bottom:0.7em;
+}
+.uwh-pL1{
+	width:13.375em;
+	height:3.6875em;
+}
+.logoBg2{
+	background-image:url('bg.png');
+}
+
+.userImg{
+	background-image:url('userImg.png');
+}
+.pwdImg{
+	background-image:url('pwdImg.png');
+}

BIN
web/mobileapp/css/login/logo.png


BIN
web/mobileapp/css/login/pwdImg.png


File diff suppressed because it is too large
+ 1228 - 0
web/mobileapp/css/main.css


+ 27 - 0
web/mobileapp/css/pro-header.css

@@ -0,0 +1,27 @@
+/*头部按钮图片*/
+
+.t-btn-a1{
+	background-image:url('head-btn/t-btn1.png');
+}
+.t-btn-a2{
+	background-image:url('head-btn/t-btn2.png');
+}
+.t-btn-a3{
+	background-image:url('head-btn/t-btn3.png');
+}
+.t-btn-a4
+{
+	background-image:url('head-btn/t_del.png');
+}
+.t-btn-a5
+{
+	background-image:url('head-btn/t-btn5.png');
+}
+.t-btn-a6{
+	background-image:url('head-btn/t-btn6.png');
+}
+
+
+.t-icon1{
+	background-image:url('head-btn/t-icon1.png');
+}

+ 57 - 0
web/mobileapp/css/pullfresh.css

@@ -0,0 +1,57 @@
+#pulldown, #pullup {
+	background:#fff;
+	height:2.5em;
+	line-height:2.5em;
+	padding:0.3125em 0.625em;
+	border-bottom:0.0625em solid #ccc;
+	font-weight:bold;
+	font-size:0.875em;
+	color:#888;
+}
+
+#pulldown .pulldown-icon, #pullup .pullup-icon  {
+	
+display:block; 
+
+position: relative;
+
+	width:2.5em; height:2.5em;
+	background:url(img/pull-icon@2x.png) 0 0 no-repeat;
+	-webkit-background-size:2.5em 5.0em; background-size:2.5em 5.0em;
+	-webkit-transition-property:-webkit-transform;
+	-webkit-transition-duration:250ms;	
+}
+
+#pulldown .pulldown-icon {
+	-webkit-transform:rotate(0deg) translateZ(0);
+}
+
+#pullup .pullup-icon  {
+	-webkit-transform:rotate(-180deg) translateZ(0);
+}
+
+#pulldown.flip .pulldown-icon {
+	-webkit-transform:rotate(-180deg) translateZ(0);
+}
+
+#pullup.flip .pullup-icon {
+	-webkit-transform:rotate(0deg) translateZ(0);
+}
+
+#pulldown.loading .pulldown-icon, #pullup.loading .pullup-icon {
+	background-position:0 100%;
+	-webkit-transform:rotate(0deg) translateZ(0);
+	-webkit-transition-duration:0ms;
+
+	-webkit-animation-name:loading;
+	-webkit-animation-duration:2s;
+	-webkit-animation-iteration-count:infinite;
+	-webkit-animation-timing-function:linear;
+}
+
+
+
+@-webkit-keyframes loading {
+	from { -webkit-transform:rotate(0deg) translateZ(0); }
+	to { -webkit-transform:rotate(360deg) translateZ(0); }
+}

+ 17 - 0
web/mobileapp/css/task/taskForm.css

@@ -0,0 +1,17 @@
+.jsonTitle {
+    color: rgb(10, 158, 152);
+    font-weight: bold;
+    text-align: center;
+}
+
+.dvjstr {
+    color: rgb(0, 135, 146);
+    font-weight: bold;
+    text-align: center;
+}
+
+.dvjsta {
+    font-size: 14px;
+    text-align: center;
+    padding-top: 6px;
+}

+ 79 - 0
web/mobileapp/css/template.css

@@ -0,0 +1,79 @@
+.group-v{
+	display: -webkit-box !important;
+	display: box !important;
+	position:relative;
+	-webkit-box-orient:vertical;
+	box-orient:vertical;
+}
+.g-t{
+	padding:1em 0.65em 0 0.65em;
+	color:#484848;
+}
+.g-cont{
+	display: -webkit-box !important;
+	display: box !important;
+	position:relative;
+	-webkit-box-orient:vertical;
+	box-orient:vertical;
+	padding:0.625em;
+	position:relative;
+	-webkit-box-flex: 1; 
+	box-flex: 1;
+}
+.g-cont-border{
+	border:1px solid;
+	border-color:#c0c0c0;
+}
+.g-cont-mutifile,.g-cont-sgtxt,.g-cont-multtxt{
+	display: -webkit-box !important;
+	display: box !important;
+	position:relative;
+	padding:0.75em 0.625em;
+	background-color:#FFF;
+	-webkit-box-align:center;
+	box-align:center;
+	color:black;
+	border-bottom:1px solid #c0c0c0;
+}
+.g-c-cs{
+	position:relative;
+	-webkit-box-flex: 1; 
+	box-flex: 1;
+	font-size:0.875em;
+	color: rgb(184, 193, 194);
+    text-align: right;
+}
+.g-c-cs>div{
+	display: -webkit-box !important;
+	display: box !important;
+	position:relative;
+	-webkit-border-radius: 0.3em;
+	border-radius: 0.3em;
+	-webkit-background-clip: padding-box;
+	background-clip: padding-box
+	margin-left:3px;
+	-webkit-box-align:center;
+	box-align:center;
+	margin-left:1em;
+	padding-right: 1.5em;
+}
+.g-c-cs>div>input,.g-c-cs>div>textarea{
+	margin:0px;
+	border:0px;
+	width:100%;
+	height:100%;
+	-webkit-appearance: none;
+	padding: 0.4em 0;
+	line-height: 1.2em;
+	background:none;
+	text-decoration: none;
+	font-size: 1em;
+	display:block;
+	margin:-0.4em 0 0 0.2em;
+}
+.g-cont-sgtxt>.g-c-cs>div{
+	height: 2em;
+}
+.h4em{
+	height: 4em !important;
+}

+ 20 - 0
web/mobileapp/css/ui-anim.css

@@ -0,0 +1,20 @@
+.utra
+{
+	-webkit-transition:all 300ms ease-in 100ms
+}
+
+
+.a-op
+{
+	opacity:0
+}
+
+.a-mr
+{
+	-webkit-transform:translateX(100%);
+}
+
+.a-ml
+{
+	-webkit-transform:translateX(-100%);
+}

+ 200 - 0
web/mobileapp/css/ui-apple.css

@@ -0,0 +1,200 @@
+.ui-bar-iphone {
+	border-bottom: 1px solid rgba(0,0,0,0.9);
+	border-top: 1px solid rgba(255,255,255,0.5);
+	background: #6f85a3;
+	color: #fff;
+	font-weight: bold;
+	text-shadow: 0 -1px 1px #000;
+}
+
+.ui-btn-iphone
+{
+	border:1px solid rgba(0,0,0,0);
+	
+}
+.ui-btn-iphone .ui-btn-inner
+{
+	padding-top:0.6em !important;
+	padding-left:1px !important;;
+	padding-right:1px !important;;
+}
+
+.ui-btn-iphone:hover,.ui-btn-iphone:focus
+{
+	opacity:1;
+	-webkit-animation-name: btn_bg; 
+  	-webkit-animation-duration: .6s; 
+  	-webkit-animation-iteration-count: 1;
+  	-webkit-animation-timing-function: ease-in;	
+}
+
+.ui-btn-iphone:active
+{
+	opacity:1;
+	-webkit-animation-name: btn_bg_act; 
+  	-webkit-animation-duration: .6s; 
+  	-webkit-animation-iteration-count: 1;
+  	-webkit-animation-timing-function: ease-in;	
+}
+
+.ui-btn-apple-al
+{
+	padding:0px 0em 0px 1.2em;
+	background-image:url('res-apple/app-btn-l.png');
+	background-repeat:no-repeat;
+	-webkit-background-size:1.2em 100%;
+	background-size:1.2em 100%
+}
+
+.ui-btn-apple-ar
+{
+	padding:0px 0.5em 0px 0em;
+	background-image:url('res-apple/app-btn-r.png');
+	background-repeat:no-repeat;
+	-webkit-background-size:0.5em 100%;
+	background-size:0.5em 100%;
+	background-position:right;
+}
+
+.ui-btn-apple-ac
+{
+	background-image:url('res-apple/app-btn-c.png');
+	background-repeat:repeat;
+	-webkit-background-size:auto 100%;
+	background-size:auto 100%;
+}
+
+.ui-btn-apple-nl
+{
+	padding:0px 0em 0px 0.4em;
+	background-image:url('res-apple/app-rbt-l.png');
+	background-repeat:no-repeat;
+	-webkit-background-size:0.4em 100%;
+	background-size:0.4em 100%
+}
+
+.ui-btn-apple-nr
+{
+	padding:0px 0.4em 0px 0em;
+	background-image:url('res-apple/app-rbt-r.png');
+	background-repeat:no-repeat;
+	-webkit-background-size:0.4em 100%;
+	background-size:0.4em 100%;
+	background-position:right;
+}
+.ui-btn-apple-nc
+{
+	background-image:url('res-apple/app-rbt-c.png');
+	background-repeat:repeat;
+	-webkit-background-size:auto 100%;
+	background-size:auto 100%;
+}
+
+.ui-nav-iphone
+{
+	border-top: 1px solid rgba(255, 255, 255, 0.5);
+}
+
+.ui-nav-iphone .ui-btn 
+{
+	margin:0.2em !important;
+}
+.ui-nav-iphone .ui-btn-active
+{
+	background-color:rgba(255,255,255,0.25) !important;
+	border-radius:0.6em;
+	border: 0px;
+	background-image: none;
+}
+
+
+.ui-nav-iphone .ui-btn .ui-btn-inner {
+padding-top: 2.6em !important;
+padding-bottom: 0.2em !important;
+}
+
+
+.ui-nav-iphone .ui-btn .ui-icon {
+width: 2.6em!important;
+height: 2.6em!important;
+margin-left: -1.3em !important;
+box-shadow: none!important;
+-moz-box-shadow: none!important;
+-webkit-box-shadow: none!important;
+-webkit-border-radius: none !important;
+border-radius: none !important;
+}
+
+.ui-nav-iphone .ui-btn-text
+{
+	font-size:0.8em
+}
+
+.ui-nav-iphone input[type="radio"]:checked + label
+{
+	background-color:rgba(255,255,255,0.25) !important;
+	border-radius:0.6em;
+	border: 0px;
+	background-image: none;
+}
+
+input[type="radio"] + label>span.ui-pic-info{
+	background: url(res-apple/info.png) 50% 50% no-repeat;
+}
+
+input[type="radio"]:checked + label>span.ui-pic-info{
+	background: url(res-apple/info-act.png) 50% 50% no-repeat;
+}
+
+input[type="radio"] + label>span.ui-pic-menu{
+	background: url(res-apple/menu.png) 50% 50% no-repeat;
+}
+
+input[type="radio"]:checked + label>span.ui-pic-menu{
+	background: url(res-apple/menu-act.png) 50% 50% no-repeat;
+}
+
+input[type="radio"] + label>span.ui-pic-home{
+	background: url(res-apple/home.png) 50% 50% no-repeat;
+}
+
+input[type="radio"]:checked + label>span.ui-pic-home{
+	background: url(res-apple/home-act.png) 50% 50% no-repeat;
+}
+
+input[type="radio"] + label>span.ui-pic-set{
+	background: url(res-apple/set.png) 50% 50% no-repeat;
+}
+
+input[type="radio"]:checked + label>span.ui-pic-set{
+	background: url(res-apple/set-act.png) 50% 50% no-repeat;
+}
+
+input[type="radio"] + label>span.ui-pic-shop{
+	background: url(res-apple/shop.png) 50% 50% no-repeat;
+}
+
+input[type="radio"]:checked + label>span.ui-pic-shop{
+	background: url(res-apple/shop-act.png) 50% 50% no-repeat;
+}
+
+input[type="radio"] + label>span.ui-pic-talk{
+	background: url(res-apple/talk.png) 50% 50% no-repeat;
+}
+
+input[type="radio"]:checked + label>span.ui-pic-talk{
+	background: url(res-apple/talk-act.png) 50% 50% no-repeat;
+}
+
+.ui-nav-iphone span.ui-icon {
+-webkit-background-size: 2.6em 2.6em;
+background-size: 2.6em 2.6em;
+}
+
+
+
+.ui-btn-iphone-c .ui-btn-inner 
+{
+	padding: .65em 0.13em .65em 0.0em
+}
+

+ 497 - 0
web/mobileapp/css/ui-base.css

@@ -0,0 +1,497 @@
+*
+{
+	margin: 0;
+	padding:0;
+}
+
+div
+{
+	outline:0 !important;
+	-webkit-text-size-adjust: none;
+    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);	
+	/*position:relative;*/
+}
+
+ul,li{
+	list-style: none;
+}
+
+
+.uc-tl {
+	-webkit-border-top-left-radius: .6em;
+	border-top-left-radius: .6em
+}
+
+.uc-tr {
+	-webkit-border-top-right-radius: .6em;
+	border-top-right-radius: .6em
+}
+
+.uc-bl {
+	-webkit-border-bottom-left-radius: .6em;
+	border-bottom-left-radius: .6em
+}
+
+.uc-br {
+	-webkit-border-bottom-right-radius: .6em;
+	border-bottom-right-radius: .6em
+}
+
+.uc-t {
+	-webkit-border-top-left-radius: .6em;
+	border-top-left-radius: .6em;
+	-webkit-border-top-right-radius: .6em;
+	border-top-right-radius: .6em
+}
+
+.uc-b {
+	-webkit-border-bottom-left-radius: .6em;
+	border-bottom-left-radius: .6em;
+	-webkit-border-bottom-right-radius: .6em;
+	border-bottom-right-radius: .6em
+}
+
+.uc-r {
+	-webkit-border-top-right-radius: .6em;
+	border-top-right-radius: .6em;
+	-webkit-border-bottom-right-radius: .6em;
+	border-bottom-right-radius: .6em
+}
+
+.uc-l {
+	-webkit-border-top-left-radius: .6em;
+	border-top-left-radius: .6em;
+	-webkit-border-bottom-left-radius: .6em;
+	border-bottom-left-radius: .6em
+}
+
+.uc-a {
+	-webkit-border-radius: .6em;
+	border-radius: .6em
+}
+
+.uc-n {
+	-webkit-border-radius: 0;
+	border-radius: 0
+}
+
+.uc-tl1 {
+	-webkit-border-top-left-radius: 0.3em;
+	border-top-left-radius: 0.3em
+}
+
+.uc-tr1 {
+	-webkit-border-top-right-radius: 0.3em;
+	border-top-right-radius: 0.3em
+}
+
+.uc-bl1 {
+	-webkit-border-bottom-left-radius: 0.3em;
+	border-bottom-left-radius: 0.3em
+}
+
+.uc-br1 {
+	-webkit-border-bottom-right-radius: 0.3em;
+	border-bottom-right-radius: 0.3em
+}
+
+.uc-t1 {
+	-webkit-border-top-left-radius: 0.3em;
+	border-top-left-radius: 0.3em;
+	-webkit-border-top-right-radius: 0.3em;
+	border-top-right-radius: 0.3em
+}
+
+.uc-b1 {
+	-webkit-border-bottom-left-radius: 0.3em;
+	border-bottom-left-radius: 0.3em;
+	-webkit-border-bottom-right-radius: 0.3em;
+	border-bottom-right-radius: 0.3em
+}
+
+.uc-r1 {
+	-webkit-border-top-right-radius: 0.3em;
+	border-top-right-radius: 0.3em;
+	-webkit-border-bottom-right-radius: 0.3em;
+	border-bottom-right-radius: 0.3em
+}
+
+.uc-l1 {
+	-webkit-border-top-left-radius: 0.3em;
+	border-top-left-radius: 0.3em;
+	-webkit-border-bottom-left-radius: 0.3em;
+	border-bottom-left-radius: 0.3em
+}
+
+.uc-a1 {
+	-webkit-border-radius: 0.3em;
+	border-radius: 0.3em
+}
+.uc-a3 {
+	-webkit-border-radius: 0.4em;
+	border-radius: 0.4em
+}
+.uc-a2 {
+	-webkit-border-radius: 1.2em;
+	border-radius: 1.2em
+}
+.uc-tl,.uc-tr,.uc-bl,.uc-br ,.uc-t,.uc-b,.uc-r ,.uc-l,.uc-a,.uc-n,.uc-tl1,.uc-tr1,.uc-bl1,.uc-br1,.uc-t1,.uc-b1,.uc-r1,.uc-l1,.uc-a1,.uc-a2,,.uc-a3
+{
+	-webkit-background-clip: padding-box;
+	background-clip: padding-box
+}
+
+.us {
+	-webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, .3);
+	box-shadow: 0 1px 4px rgba(0, 0, 0, .3)
+}
+.us1 {
+	-webkit-box-shadow: 0 1px 4px rgba(120, 120, 120, .3);
+	box-shadow: 0 1px 4px rgba(120, 120, 120, .3)
+}
+.us-i {
+	-webkit-box-shadow: inset 0px 2px 3px rgba(0, 0, 0, .4);
+	box-shadow: inset 0px 2px 3px rgba(0, 0, 0, .4)
+}
+
+.uts
+{
+	text-shadow:0px 2px 2px #000;
+}
+
+.um,.um body {
+	height: 100%;
+	padding:0px;
+	margin:0px;
+}
+
+.um-vp {
+	margin: 0;
+	padding:0;
+	overflow-x: hidden;
+	-webkit-text-size-adjust: none;
+	-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+	-webkit-user-select:none
+}
+
+.um-vp .up{
+	top: 0;
+	left: 0;
+	width: 100%;
+	min-height: 100%;
+	max-height: 100%;
+	position: absolute;
+	border: 0
+}
+
+.uh,.uf {
+	display: block;
+	width:100%;
+}
+
+.up .uh,.up .uf ,.pos_re{
+	position: relative
+}
+
+
+
+.uh .ut,.uf .ut {
+	padding: .82em 1em .82em;
+	margin: 0;
+}
+
+
+.ufl
+{
+	float:left !important;
+}
+.ufr
+{
+	float:right !important;
+}
+
+.ulev2 {
+	font-size: 1.4em !important;
+}
+
+.ulev1 {
+	font-size: 1.2em !important;
+}
+
+.ulev0 {
+	font-size: 1.0em !important;
+}
+
+.ulev-1 {
+	font-size: 0.8125em !important;
+}
+
+.ulev-2 {
+	font-size: 0.625em !important;
+}
+.ulev-3 {
+	font-size: 1.0625em !important;
+}
+.ulev-4 {
+	font-size: 0.75em !important;
+}
+.ulim {
+	max-width: 5em;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+	overflow:hidden;
+}
+
+.uinl{
+	display: inline-block;
+	position:relative;
+}
+
+.uinn
+{
+	padding:0.5em;
+	margin:0;
+}
+.uinn1
+{
+	padding:0 0.5em;
+	margin:0;
+}
+.uinn2
+{
+	padding:0.5em 1em;
+	margin:0;
+}
+.uinn3
+{
+	padding:0.2em;
+	margin:0;
+}
+.uinn4
+{
+	padding:0 0.2em;
+	margin:0;
+}
+.uinn5
+{
+	padding:0.75em 0.5em;
+	margin:0;
+}
+.uinn6
+{
+	padding:0.66em 0.875em;
+	margin:0;
+}
+.uinn7
+{
+	padding:0.66em 0.375em;
+	margin:0;
+}
+.uinn8
+{
+	padding:0.4em;
+	margin:0;
+}
+.umh1
+{
+	min-height:1em;
+}
+
+.umh2
+{
+	min-height:1.2em;
+}
+
+.umh3
+{
+	min-height:1.5em;
+}
+
+.umh4
+{
+	min-height:2em;
+}
+.umh5
+{
+	min-height:3em;
+}
+.umh6
+{
+	min-height:4em;
+}
+.umh7
+{
+	min-height:1.8em;
+}
+.umw1
+{
+	min-width:1em;
+}
+
+.umw2
+{
+	min-width:2em;
+}
+
+.umw3
+{
+	min-width:3em;
+}
+
+.umw4
+{
+	min-width:4em;
+}
+
+.tx-l
+{
+ text-align:left;
+}
+.tx-r
+{
+ text-align:right;
+}
+.tx-c
+{
+ text-align:center;
+}
+
+.ut-s
+{
+	text-overflow: ellipsis;
+	overflow: hidden;
+	white-space: nowrap;
+	outline: 0 !important
+}
+
+.uba
+{
+	border:1px solid;
+	
+}
+
+.ub-trb
+{
+	border-top:1px solid;
+	border-right:1px solid;
+	border-bottom:1px solid;
+	
+}
+.ub-rbl
+{
+	border-right:1px solid;
+	border-bottom:1px solid;
+	border-left:1px solid;
+}
+.ub-rb
+{
+	border-right:1px solid;
+	border-bottom:1px solid;
+}
+.uba1
+{
+	border:2px solid;	
+}
+.uba2
+{
+	border:3px solid;	
+}
+
+.ubt
+{
+	border-top:1px solid;
+}
+.ubb
+{
+	border-bottom:1px solid;
+}
+
+.ubl
+{
+	border-left:1px solid;
+}
+
+.ubr
+{
+	border-right:1px solid;
+}
+
+.uhide
+{
+	display:none !important;
+}
+
+.umar-tlb2
+{
+	 margin: 1.2em 0 1.2em 0.8em;
+}
+.umar-b
+{
+	 margin-bottom:0.4em;
+}
+.umar-b2
+{
+	 margin-bottom:0.4em;
+}
+.umar-t
+{
+	 margin-top:0.4em;
+}
+.umar-t1
+{
+	 margin-top:0.6em;
+}
+.umar-l
+{
+	 margin-left:0.4em;
+}
+.umar-l1
+{
+	 margin-left:1em;
+}
+.umar-r
+{
+	 margin-right:0.4em;
+}
+.umar-a
+{
+	 margin:0.4em;
+}
+.umar-a1
+{
+	 margin:0.6em;
+}
+.umar-a2
+{
+	 margin:0.8em;
+}
+
+.uof
+{
+	overflow:hidden;
+}
+.uof-x
+{
+	overflow-x:hidden;
+}
+.uof-y
+{
+	overflow-y:hidden;
+}
+
+.uabs
+{
+	position:absolute;
+	left:0;
+	top:0;
+}
+.uabs-r1
+{
+	position:absolute;
+	right:0;
+	top:0;
+}
+.line-hei{
+	line-height:1.2em;
+}
+

+ 168 - 0
web/mobileapp/css/ui-box.css

@@ -0,0 +1,168 @@
+.ub
+{
+	display: -webkit-box !important;
+	display: box !important;
+	position:relative;
+}
+
+.ub-rev
+{
+	-webkit-box-direction:reverse;
+	box-direction:reverse;
+}
+
+.ub-fh
+{
+	width:100%;
+}
+
+.ub-fv
+{
+	height:100%;
+}
+
+.ub-con
+{
+	position:absolute;
+	width:100%;
+	height:100%;
+}
+
+.ub-ac
+{
+	-webkit-box-align:center;
+	box-align:center;
+}
+
+.ubac
+{
+	-webkit-box-align:center;
+	box-align:center;
+}
+
+.ub-ae
+{
+	-webkit-box-align:end;
+	box-align:end;
+}
+
+.ub-pc
+{
+	-webkit-box-pack:center;
+	box-pack:center;
+}
+.ub-pe
+{
+	-webkit-box-pack:end;
+	box-pack:end;
+}
+.ub-pj
+{
+	-webkit-box-pack:justify;
+	box-pack:justify;
+}
+
+.ub-ver
+{
+	-webkit-box-orient:vertical;
+	box-orient:vertical;
+}
+
+.ub-f1
+{
+	position:relative;
+	-webkit-box-flex: 1; 
+	box-flex: 1;
+}
+
+.ub-f2
+{
+	position:relative;
+	-webkit-box-flex: 2;
+	box-flex: 2; 
+}
+
+.ub-f3
+{
+	position:relative;
+	-webkit-box-flex: 3;
+	box-flex: 3;
+}
+
+.ub-f4
+{
+	position:relative;
+	-webkit-box-flex: 4;
+	box-flex: 4;
+}
+.ub-f5
+{
+	position:relative;
+	-webkit-box-flex: 5;
+	box-flex:5;
+}
+.ub-f6
+{
+	position:relative;
+	-webkit-box-flex: 6;
+	box-flex: 6;
+}
+.ub-f7
+{
+	position:relative;
+	-webkit-box-flex: 7;
+	box-flex: 7;
+}
+.ub-f10
+{
+	position:relative;
+	-webkit-box-flex: 10;
+	box-flex: 10;
+}
+
+.ub-img
+{
+	-webkit-background-size:contain;
+	background-size:contain;
+	background-repeat:no-repeat;
+	background-position:center;
+}
+
+.ub-img1
+{	
+	-webkit-background-size:cover;
+	background-size:cover;
+	background-repeat:no-repeat;
+	background-position:center;
+}
+.ub-img2
+{
+	background-repeat:repeat-x;
+	background-size:auto 100%
+}
+.ub-img3
+{
+	background-repeat:repeat-y;
+	background-size:100% auto
+}
+
+.ub-img4
+{
+	-webkit-background-size:100% auto;
+	background-size:100% auto;
+	background-repeat:no-repeat;
+	background-position:center;
+}
+.ub-img5
+{
+	-webkit-background-size:auto 100%;
+	background-size:auto 100%;
+	background-repeat:no-repeat;
+	background-position:center;
+}
+
+.ub-img6
+{
+	background-repeat:no-repeat;
+	background-position:center;
+}

+ 122 - 0
web/mobileapp/css/ui-btn.css

@@ -0,0 +1,122 @@
+
+.uh .btn-l,.uf .btn-l {
+	position: absolute;
+	left: 10px;
+	top: .55em
+}
+
+.uh .btn-r,.uf .btn-r {
+	position: absolute;
+	right: 10px;
+	top: .55em
+}
+
+
+.uh .btn,.uf .btn{
+	display: inline-block;
+	font-size: .8125em;
+	margin: 0
+}
+
+.btn
+{
+	font-size: 0.8em;
+	text-align:center;
+}
+
+.btn-act
+{
+	-webkit-box-shadow:inset 0 1px 4px rgba(0,0,0,0.6);
+	box-shadow:inset 0 1px 4px rgba(0,0,0,0.6);
+}
+
+.btn-act1
+{
+	opacity:0.4
+}
+
+.btn-a
+{
+	background-image:url('res-apple/app-btn-l.png'),url('res-apple/app-btn-c.png'),url('res-apple/app-btn-r.png');
+	background-repeat:no-repeat,no-repeat,no-repeat;
+	-webkit-background-clip: padding-box,content-box,padding-box;
+	background-clip: padding-box,content-box,padding-box;
+	-webkit-background-size:1.2em 100%,100% 100%,0.5em 100%;
+	background-size:1.2em 100%,100% 100%,0.5em 100%;
+	background-position:left,center,right;
+	padding:0 0.5em 0 1.2em;
+	min-height:2.2em;
+}
+
+.btn-n
+{
+	background-image:url('res-apple/app-rbt-l.png'),url('res-apple/app-rbt-c.png'),url('res-apple/app-rbt-r.png');
+	background-repeat:no-repeat,no-repeat,no-repeat;
+	-webkit-background-clip: padding-box,content-box,padding-box;
+	background-clip: padding-box,content-box,padding-box;
+	-webkit-background-size:0.4em 100%,100% 100%,0.4em 100%;
+	background-size:0.4em 100%,100% 100%,0.4em 100%;
+	background-position:left,center,right;
+	padding:0 0.4em;
+	min-height:2.2em;
+}
+
+.btn-al
+{
+	background-image:url('res-apple/app-btn-l.png');
+	background-repeat:no-repeat;
+	-webkit-background-size:1.2em 100%;
+	background-size:1.2em 100%;
+	background-position:left;
+	padding-left:1.2em;
+	min-height:2.2em;
+}
+.btn-ac
+{
+	background-image:url('res-apple/app-btn-c.png');
+	background-repeat:repeat;
+	-webkit-background-size:100% 100%;
+	background-size:100% 100%;
+	background-position:center;
+	min-height:2.2em;
+}.btn-ar
+{
+	background-image:url('res-apple/app-btn-r.png');
+	background-repeat:no-repeat;
+	-webkit-background-size:.4em 100%;
+	background-size:.4em 100%;
+	background-position:left;
+	padding-right:.5em;
+	min-height:2.2em;
+}
+
+.btn-nl
+{
+	background-image:url('res-apple/app-rbt-l.png');
+	background-repeat:no-repeat;
+	-webkit-background-size:.4em 100%;
+	background-size:.4em 100%;
+	background-position:left;
+	padding-left:.4em;
+	min-height:2.2em;
+}
+.btn-nc
+{
+	background-image:url('res-apple/app-rbt-c.png');
+	background-repeat:repeat;
+	-webkit-background-size:100% 100%;
+	background-size:100% 100%;
+	background-position:center;
+	min-height:2.2em;
+}
+.btn-nr
+{
+	background-image:url('res-apple/app-rbt-r.png');
+	background-repeat:no-repeat;
+	-webkit-background-size:.4em 100%;
+	background-size:.4em 100%;
+	background-position:left;
+	padding-right:.5em;
+	min-height:2.2em;
+}
+

+ 18 - 0
web/mobileapp/css/ui-fold.css

@@ -0,0 +1,18 @@
+input[type=checkbox]:checked+div.col
+{
+	-webkit-border-bottom-left-radius: 0em;
+	border-bottom-left-radius: 0em;
+	-webkit-border-bottom-right-radius: 0em;
+	border-bottom-right-radius: 0em
+}
+.col-c
+{
+	display:none;
+}
+
+input[type=checkbox]:checked+div>div.col-icon {
+	background-image: url(images/icons-18-white_07.png);
+}
+input[type=checkbox]+div>div.col-icon {
+	background-image: url(images/icons-18-white_13.png);
+}

+ 10 - 0
web/mobileapp/css/ui-img.css

@@ -0,0 +1,10 @@
+
+.im{
+	background-image: url('img/icon.png');
+}
+.im1{
+	background-image: url('img/icon1.png');
+}
+.im2{
+	background-image: url('img/icon2.png');
+}

+ 71 - 0
web/mobileapp/css/ui-input.css

@@ -0,0 +1,71 @@
+.ulab .uinput
+{
+	margin-left:3px
+}
+.uinput input,.uinput textarea
+{
+	margin:0px;
+	border:0px;
+	width:100%;
+	height:100%;
+	-webkit-appearance: none;
+	padding: .4em 0;
+	line-height: 1.2em;
+	background:none;
+	text-decoration: none;
+	font-size: 1em;
+	display:block;
+}
+.uinput input.search
+{
+	margin: 0px;
+	border: 0px;
+	width: 100%;
+	height: 100%;
+	-webkit-appearance: none;
+	padding: .8em 0 0 0.6em;
+	line-height: 1.2em;
+	background: none;
+	text-decoration: none;
+	font-size: 1em;
+	display: block;
+}
+
+input[type="radio"]:checked + div > div.rdi-icon {
+	background-color: transparent;
+	background-image: url(images/icons-18-white_41.png);
+}
+input[type=radio]+div>div.rdi-icon {
+	background-color: transparent;
+	background-image: url(images/icons-18-white_43.png);
+}
+
+input[type="radio"]:checked + div.rdi {
+	box-shadow:inset 0 1px 4px rgba(0,0,0,0.6);
+}
+
+input[type=checkbox]+div>div.che-icon {
+	background-color: transparent;
+	border:1px solid;
+}
+
+input[type=checkbox]:checked+div>div.che-icon {
+	background-color: transparent;
+	border: 0.1em solid #52ADEC;
+}
+
+input[type=checkbox]:checked+div>div.che-icon>label:after {
+	content: '\2714';
+	font-size: 0.8em;
+	color: #52ADEC;
+}
+
+.sel select
+{
+	left:0;
+	top:0;
+	position:absolute; 
+	width:100%;
+	height:100%;
+	opacity: 1;
+}

+ 27 - 0
web/mobileapp/css/ui-list.css

@@ -0,0 +1,27 @@
+
+.lis , .lis-m div
+{ 
+	padding:0.4em;
+}
+.lis-icon
+{ 
+	width:2em;
+	height:2em;
+	margin-right:0.4em;
+}
+.lis-th{
+	width:4em;
+	margin:0em 0.4em 0em 0px;
+	min-height:4em;
+}
+.lis-sw
+{
+	width:0.6em;
+	height:1em;
+	margin-left:0.4em;
+}	
+.lis-row-rt
+{
+	width:10%;
+	text-align:center;
+}

+ 296 - 0
web/mobileapp/css/ui-menu-anim.css

@@ -0,0 +1,296 @@
+.ui-menu-pos
+{
+	position:absolute;
+	left:0.5em;
+	top:0.5em;
+	height:1.7em;
+	width:1.7em;	
+	z-index:100;
+}
+
+.ui-menu-btn
+{
+	position:absolute;
+	left:0em;
+	bottom:0em;
+	width:100%;
+	height:100%;
+	
+}
+
+input[type=checkbox]:checked+div>div.ui-menu-btn-bg
+{
+ 	-webkit-transform:translate(0,0em) rotate(405deg);
+	position:absolute;width:100%;height:100%;
+	-webkit-background-size:cover;
+	background-size:cover;
+	background-position:center;
+	background-repeat:no-repeat;
+	
+	background-image:url(res-menu/menubtn.png);
+	-webkit-transition: all 0.3s ease-in-out;
+	
+	-webkit-animation-name:anim_menu_btn_active;
+}
+
+input[type=checkbox]+div>div.ui-menu-btn-bg
+{
+ 	-webkit-transform:translate(0,0em) rotate(0deg); 
+	position:absolute;width:100%;height:100%;
+	-webkit-background-size:cover;
+	background-size:cover;
+	background-position:center;
+	background-repeat:no-repeat;
+	
+	background-image:url(res-menu/menubtn.png);
+	-webkit-transition: all 0.3s ease-in-out;
+	
+	-webkit-animation-name:anim_menu_btn_inactive;
+}
+
+
+@-webkit-keyframes anim_menu_btn_active{
+	0% {
+		-webkit-transform:translate(0,0em) rotate(490deg);
+	}
+	
+	100% { 
+		-webkit-transform:translate(0,0em) rotate(0deg);
+	}
+}
+
+@-webkit-keyframes anim_menu_btn_inactive{
+	0% {
+		-webkit-transform:translate(0,0em) rotate(0deg);
+	}
+	
+	100% { 
+		-webkit-transform:translate(0,0em) rotate(490deg);
+	}
+}
+
+.ui-menu-item-btn
+{
+	position:absolute;
+	left:0em;
+	top:0em;
+	width:2.7em;
+	height:2.7em;
+	background-repeat:no-repeat;
+	background-position:center;
+}
+
+input[type=checkbox]+div>div.ui-menu-item-anim_1
+{
+	background-size:cover;background-image:url(res-menu/1.png);
+	-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+	opacity:0;
+	-webkit-transition: all 0.34s ease-in-out;
+	-webkit-animation-name:anim_menu_btn_inactive_1;
+}
+
+input[type=checkbox]:checked+div>div.ui-menu-item-anim_1
+{
+	background-size:cover;background-image:url(res-menu/1.png);
+	-webkit-transform:translate(0,9em) rotate(2880deg) scale(1,1);
+	opacity:1;
+	-webkit-transition: all 0.1s ease-in-out;
+	-webkit-animation-name:anim_menu_btn_active_1;
+}
+
+@-webkit-keyframes name:anim_menu_btn_inactive_1 {
+	0% {
+		-webkit-transform:translate(0,9em) rotate(2880deg) scale(1,1);
+		
+	}
+	
+	100% { 
+		-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+		
+	}
+}
+
+@-webkit-keyframes anim_menu_btn_active_1 {
+	0% {
+		-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+		
+	}
+	
+	100% { 
+		-webkit-transform:translate(0,9em) rotate(2880deg) scale(1,1);
+		
+	}
+}
+
+input[type=checkbox]+div>div.ui-menu-item-anim_2
+{
+	background-size:cover;background-image:url(res-menu/2.png);
+	-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+	opacity:0;
+	-webkit-transition: all 0.28s ease-in-out;
+	-webkit-animation-name:anim_menu_btn_inactive_2;
+}
+
+input[type=checkbox]:checked+div>div.ui-menu-item-anim_2
+{
+	background-size:cover;background-image:url(res-menu/2.png);
+	/* -webkit-transform:translate(3.44em,8.31em) rotate(2880deg) scale(1,1); */
+	-webkit-transform:translate(0em,8em) rotate(2880deg) scale(1,1);
+	opacity:1;
+	-webkit-transition: all 0.16s ease-in-out;
+	-webkit-animation-name:anim_menu_btn_active_2;
+}
+
+@-webkit-keyframes name:anim_menu_btn_inactive_2 {
+	0% {
+		-webkit-transform:translate(3.44em,8.31em) rotate(2880deg) scale(1,1);
+		
+	}
+	
+	100% { 
+		-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+		
+	}
+}
+
+@-webkit-keyframes anim_menu_btn_active_2 {
+	0% {
+		-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+		
+	}
+	
+	100% { 
+		-webkit-transform:translate(3.44em,8.31em) rotate(2880deg) scale(1,1);
+		
+	}
+}
+
+input[type=checkbox]+div>div.ui-menu-item-anim_3
+{
+	background-size:cover;background-image:url(res-menu/3.png);
+	-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+	opacity:0;
+	-webkit-transition: all 0.22s ease-in-out;
+	-webkit-animation-name:anim_menu_btn_inactive_3;
+}
+
+input[type=checkbox]:checked+div>div.ui-menu-item-anim_3
+{
+	background-size:cover;background-image:url(res-menu/3.png);
+/*	-webkit-transform:translate(6.36em,6.36em) rotate(2880deg) scale(1,1);*/
+	-webkit-transform:translate(4em,6.5em) rotate(2880deg) scale(1,1);
+	opacity:1;
+	-webkit-transition: all 0.22s ease-in-out;
+	-webkit-animation-name:anim_menu_btn_active_3;
+}
+
+@-webkit-keyframes name:anim_menu_btn_inactive_3 {
+	0% {
+		-webkit-transform:translate(6.36em,6.36em) rotate(2880deg) scale(1,1);
+		
+	}
+	
+	100% { 
+		-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+		
+	}
+}
+
+@-webkit-keyframes anim_menu_btn_active_3 {
+	0% {
+		-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+		
+	}
+	
+	100% { 
+		-webkit-transform:translate(6.36em,6.36em) rotate(2880deg) scale(1,1);
+		
+	}
+}
+
+input[type=checkbox]+div>div.ui-menu-item-anim_4
+{
+	background-size:cover;background-image:url(res-menu/4.png);
+	-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+	opacity:0;
+	-webkit-transition: all 0.16s ease-in-out;
+	-webkit-animation-name:anim_menu_btn_inactive_4;
+}
+
+input[type=checkbox]:checked+div>div.ui-menu-item-anim_4
+{
+	background-size:cover;background-image:url(res-menu/4.png);
+/*	-webkit-transform:translate(8.31em,3.44em) rotate(2880deg) scale(1,1);*/
+	-webkit-transform:translate(6.5em,3.5em) rotate(2880deg) scale(1,1);
+	opacity:1;
+	-webkit-transition: all 0.28s ease-in-out;
+	-webkit-animation-name:anim_menu_btn_active_4;
+}
+
+@-webkit-keyframes name:anim_menu_btn_inactive_4 {
+	0% {
+		-webkit-transform:translate(8.31em,3.44em) rotate(2880deg) scale(1,1);
+		
+	}
+	
+	100% { 
+		-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+		
+	}
+}
+
+@-webkit-keyframes anim_menu_btn_active_4 {
+	0% {
+		-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+		
+	}
+	
+	100% { 
+		-webkit-transform:translate(8.31em,3.44em) rotate(2880deg) scale(1,1);
+		
+	}
+}
+
+input[type=checkbox]+div>div.ui-menu-item-anim_5
+{
+	background-size:cover;background-image:url(res-menu/5.png);
+	-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+	opacity:0;
+	-webkit-transition: all 0.1s ease-in-out;
+	-webkit-animation-name:anim_menu_btn_inactive_5;
+}
+
+input[type=checkbox]:checked+div>div.ui-menu-item-anim_5
+{
+	background-size:cover;background-image:url(res-menu/5.png);
+/*	-webkit-transform:translate(9em,0em) rotate(2880deg) scale(1,1);*/
+	-webkit-transform:translate(8em,0em) rotate(2880deg) scale(1,1);
+	opacity:1;
+	-webkit-transition: all 0.34s ease-in-out;
+	-webkit-animation-name:anim_menu_btn_active_5;
+}
+
+@-webkit-keyframes name:anim_menu_btn_inactive_5 {
+	0% {
+		-webkit-transform:translate(9em,0em) rotate(2880deg) scale(1,1);
+		
+	}
+	
+	100% { 
+		-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+		
+	}
+}
+
+@-webkit-keyframes anim_menu_btn_active_5 {
+	0% {
+		-webkit-transform:translate(0,0em) rotate(0deg) scale(0.1,0.1);
+		
+	}
+	
+	100% { 
+		-webkit-transform:translate(9em,0em) rotate(2880deg) scale(1,1);
+		
+	}
+}
+

+ 294 - 0
web/mobileapp/css/ui-new-style.css

@@ -0,0 +1,294 @@
+/*2012-03-16*/
+.clear{
+	clear:both;
+	overflow:hidden;
+	font-size:0;
+	height:0;
+}
+.ui-loc-cen{
+	text-align:center;
+	font-weight:bold;
+	border:none;
+}
+.ui-bor-none{
+	border:none;
+}
+.w_order{margin: -0.9em 10% 0 0%; display:-webkit-box; -webkit-box-algin:center; -webkit-box-pack:center;}
+.w_order li{margin:0 0.3em;-webkit-box-orient:horizontal;
+	box-orient:horizontal;}
+.w_order li span{width:0.375em;height:0.375em;-webkit-border-radius:0.375em;  background:#000; display:block;}
+.w_order li.w_order_show span{background:#660000;}
+/*2012-03-17*/
+.ui-span-time{
+	position: relative;text-align: right;font-size: 0.6em;top:.5em;right: 1em;
+}
+.ui-title-loc{
+	text-align:center;top: -1em;position: relative;
+}
+/*2012-03-20*/
+.ui-font-size-title{
+	font-size:2em;
+}
+.ui-loc-flag{
+	min-height:1.8em;min-width:1.8em;background:url(images/pin_red.png) no-repeat;background-size:cover;
+}
+/*2012-03-21*/
+.ui-index-line{
+	border-bottom: 1px solid #EEE;
+}
+.ui-info-pad
+{
+	margin:0.2em 0.5em 0.2em 0;
+}
+
+.ui-box-heading
+{
+	font-size: 1em;
+	font-weight: bold;
+	display: block;
+	margin: .6em 0 0.1em 0;
+	text-overflow: ellipsis;
+	overflow: hidden;
+	white-space: nowrap;
+	font-family:΢���ź�
+}
+
+.ui-box-desc
+{
+	font-size: 1em;
+	display: block;
+	overflow: hidden;
+	white-space: nowrap;
+	margin: .1em 0 0.1em 0;
+	font-family:΢���ź�;
+	color:#888;
+}
+
+input[type=checkbox]+div.ui-anim-float-view
+{
+	-webkit-transform:translateX(99%);
+	-webkit-transition: all 0.5s ease-in-out;
+	opacity:0;
+	background-color:rgba(255,255,255,0)
+}
+
+input[type=checkbox]:checked+div.ui-anim-float-view
+{
+	-webkit-transform:translateX(0%);
+	-webkit-transition: all 0.5s ease-in-out;
+	opacity:1;
+	background-color:rgba(255,255,255,1)
+}
+.ui-page-num-anim
+{
+	-webkit-transition: all 0.2s ease-in-out;
+}
+
+/* .ui-header-custom
+{
+	background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#1164B6), to(#20A3E1)) !important;
+	background-image: -webkit-gradient(top, rgba(17,99,180,1) 0%, rgba(21,108,195,1) 49%, rgba(24,116,207,1) 50%, rgba(33,172,229,1) 100%) !important;
+	background-image: -webkit-linear-gradient(top, rgba(17,99,180,1) 0%, rgba(21,108,195,1) 49%, rgba(24,116,207,1) 50%, rgba(33,172,229,1) 100%) !important;
+	background-image: linear-gradient(top, rgba(17,99,180,1) 0%, rgba(21,108,195,1) 49%, rgba(24,116,207,1) 50%, rgba(33,172,229,1) 100%) !important;
+ 	background-image:url(images/title.png);
+} */
+.ui-article-img{
+	position: absolute; 
+	left: 50%; 
+	top: 50%; 
+	margin: -1.25em 0 0 -1.25em; 
+	width: 2em;
+	height: 2em; 
+	border: 0.2em solid #FFF;
+	background-size:cover;
+}
+/*2012-03-26*/
+.ui-com-bac{
+	background:url(../images/bc_ac.png) !important;
+}
+.ui-com-li-style{
+background:none;border-bottom:1px dotted #000 !important;
+}
+.ui-li-desc-c {
+font-size: 0.95em;
+font-weight: normal;
+display: block;
+margin: -.5em 0 .6em;
+white-space:inherit;
+padding: 0 0.2em;
+}
+/*03-28*/
+.ui-style{
+	font-size:.875em;
+	width:100%;
+	margin-bottom:.8em;
+}
+/*03-30*/
+h3{
+	padding: 5px;
+}
+.ui-logo-bottom{
+	display:box;
+	display:-webkit-box;
+}
+.ui-ul-box{
+	margin:0;
+	padding:0;
+	display:-webkit-box; 
+	-webkit-box-algin:center; 
+	-webkit-box-pack:center;-webkit-box-orient:horizontal;
+}
+.ui-ul-box li{
+	margin:0 0.3em;-webkit-box-orient:horizontal;
+	box-orient:horizontal;
+	list-style:none;
+}
+.selected{
+	color:#F00;
+}
+.say_box{
+	width:100%;
+	/* border-bottom:1px dashed #fff; */
+	padding:10px 0;
+}
+.say_style{
+	/*border-style: solid; 
+	border-width: 0.5em 1em 0.5em 0;
+	border-color: transparent #f00 transparent transparent; */
+	height:16px;
+	width:12px;
+	background: url(../images/ui-say-left.png);
+	margin:0.6em -1px 0 0;
+	float:left;
+	background-size: 100% 100%;
+	position: relative;
+	z-index: 2;
+}
+.say_style-right
+{
+	/*border-style: solid; 
+	border-width: 0.5em 0 0.5em 1em; 
+	border-color: transparent transparent transparent #e1e1e1;*/
+	height:16px;
+	width:12px;
+	background: url(../images/ui-say-right.png);
+	margin:0.8em 0 0 -1px;
+	float:right;
+	background-size: 100% 100%;
+	position: relative;
+	z-index: 2;
+}
+/*2012-04-05*/
+.ui-tra{
+	-webkit-transition: all 0.5s ease-in-out;
+}
+
+/*2012-04-06*/
+.ui-update-icn{
+	background:url(images/update.png) no-repeat center center;
+	position:absolute;
+	width:1.5em; 
+	height:1.5em;
+	right:1em;
+	bottom:.15em;
+	/* -webkit-background-size:80% 80%;
+	background-size:80% 80%; */
+}
+.ui-update-icn_{
+	background:url(images/update_.png) no-repeat;
+	position:absolute;width:1.3em; height:1.3em;right:1em;bottom:.3em;
+}
+.ui-update-log{
+	background:url(images/update.png) no-repeat;
+}
+.ui-back-icn{
+	background:url(images/fh.png) no-repeat;
+	position:absolute;width:2em; height:1.5em;bottom:.3em;
+	left:1em;
+}
+.ui-comment-icn{
+	background:url(images/pl.png) no-repeat;
+	position:absolute;width:2em; height:1.5em;bottom:.3em;
+	right:2em;
+}
+
+
+.ui-imgText-anim
+{
+	-webkit-transition: all .3s ease-in-out;
+}
+
+input[type=radio]+div.ui-imgText
+{
+	opacity:0
+}
+input[type=radio]:checked+div.ui-imgText
+{
+	opacity:1;
+}
+/*2012-04-09*/
+.ui-comment-icn_ {
+background: url(images/pl.png) no-repeat;
+position: absolute;
+width: 1.5em;
+height: 1.5em;
+bottom: 1em;
+right: 1em;
+background-size: contain;
+}
+.ui-liao{
+	background:-webkit-gradient(linear, 0 0%, 0 13%, from(#f9fcfd), to(#d8d9d9));
+	border: 1px #9badc2 solid;
+}
+.ui-liao-bai{
+	background:-webkit-gradient(linear, 0 0%, 0 13%, from(#f9fcfd), to(#cde6ef));
+	border: 1px #9badc2 solid;
+}
+
+/*2012-04-10*/
+.ui-logo-point{
+	color:red;
+}
+.ui-com-bac_{
+	background:#FFF;
+}
+/*2012-04-12*/
+.ui-com-liao-bac{
+	background:url(images/bg.png) !important;
+}
+/*2012-04-17*/
+.ui-corner-my{
+	border:2px solid #FFF; 
+	-webkit-border-radius: .2em;
+	border-radius: .2em
+}
+.ui-corner-my-list{
+	border:2px solid #ccc; 
+	-webkit-border-radius: .2em;
+	border-radius: .2em
+}
+/* 2012-4-24 dwx */
+/* .ui-corner-top-radius {
+	-webkit-border-top-left-radius: 0em !important;
+	border-top-left-radius: 0em !important;
+	-webkit-border-top-right-radius: 0em !important;
+	border-top-right-radius: 0em !important;
+} */
+.li-bot{
+ 	border:none;
+ 	border-bottom:1px solid #ccc !important;
+ }
+ ul{
+ 	margin:0;
+ 	padding:0;
+ }
+ .ui-right-icon{
+ 	position: absolute;
+ 	top: 1.5em;
+ 	right: 1em;
+ 	background:url(css/images/right_dian.png);
+ 	width:.7em;
+ 	height:1.1em;
+ 	background-size:100% 100%;
+ 	-webkit-background-size:100% 100%;
+ }

+ 30 - 0
web/mobileapp/css/ui-on.css

@@ -0,0 +1,30 @@
+.swi
+{	
+	width:4.6em;
+	position:relative;
+	height:1.625em;
+	overflow:hidden;
+	background-image:url('switch/on-off.png');
+	background-size:auto 100%;
+	background-repeat:no-repeat;
+	background-origin:border-box;
+}
+
+.swi-btn
+{
+	background-image:url('switch/swi.png');	
+	-webkit-transition: all 200ms linear;
+	transition: all 200ms linear;
+	width:2.45em;
+	height:100%;
+	-webkit-border-radius:0.2em;
+	border-radius:0.2em;
+}
+input+ div>div.swi-btn{
+ 	-webkit-transform:translate(-0em);
+}
+
+input:checked  + div>div.swi-btn
+{
+	-webkit-transform:translate(2.15em);
+}

+ 166 - 0
web/mobileapp/css/ui-res.css

@@ -0,0 +1,166 @@
+.res1{
+	background-image: url(images/icons-18-white_13.png)!important;
+}
+.res2
+{
+	background-image:url('images/t-arrow.png');
+}
+
+.res3
+{
+	background-image:url('images/b-arrow.png');
+}
+.res4
+{
+	background-image:url('images/add-icon.png')!important;
+}
+.res5 {
+	background-image: url(images/del.png);
+}
+.res6{
+	background-image: url(images/icon-search-black.png);
+}
+.res7 {
+	background-image: url(images/refresh.png);
+}
+.res8{
+	background-image: url('img/gs2.png');
+}
+
+.res9
+{
+	background-image: url('images/selected.png');
+}
+
+.res10
+{
+	background-image:url('img/appcan.png')!important;
+}
+.res11
+{
+	background:url('img/head_bg.png') ;
+}
+.res12
+{
+	background:url('img/back1.png') ;
+}
+.res13
+{
+	background:url('img/foot_bg.png') ;
+}
+.res14
+{
+	background:url('img/login.png') ;
+}
+.res15
+{
+	background:url('img/register.png') ;
+}
+.res16
+{
+	background:url('img/appcan.png') ;
+}
+.res17
+{
+	background:url('img/shop_bg.png') ;
+}
+.res18
+{
+	background:url('img/jian.png') ;
+}
+.res19
+{
+	background:url('img/gouzi.png') ;
+}
+.res20
+{
+	background:url('img/jiesuan.png') ;
+}
+.res21
+{
+	background:url('img/btn_r.png') ;
+}
+.res22
+{
+	background:url('img/index_on.png') ;
+}
+.res23
+{
+	background:url('img/index_off.png') ;
+}
+.res24
+{
+	background:url('img/edit.png') ;
+}
+.res25
+{
+	background:url('img/delete.png') ;
+}
+.res26
+{
+	background:url('img/gou.png') ;
+}
+.res27
+{
+	background:url('img/btn_jh.png') ;
+}
+.res28
+{
+	background:url('img/khjh.png') ;
+}
+.res29
+{
+	background:url('img/xgmm.png') ;
+}
+.res30
+{
+	background:url('img/wdsc.png') ;
+}
+.res31
+{
+	background:url('img/gwc.png') ;
+}
+.res32
+{
+	background:url('img/wddd.png') ;
+}
+.res33
+{
+	background:url('img/shdz.png') ;
+}
+.res34
+{
+	background:url('img/zxzh.png') ;
+}
+.res35
+{
+	background:url('img/xiaoxi.png') ;
+}
+.res36
+{
+	background:url('img/dagou.png') ;
+}
+.res37
+{
+	background:url('img/yinying.png')!important;
+}
+.res38
+{
+	background:url('img/zhuanpan.png');
+}
+.res39
+{
+	background:url('img/zhuanpan1.png')!important;
+}
+.res40
+{
+	background:url('img/gre_line.png')!important;
+}
+.res41
+{
+	background:url('img/gra_line.png')!important;
+}
+.res42
+{
+	background:url('img/jifen_bg.png') repeat-x !important;
+}

+ 81 - 0
web/mobileapp/css/ui-rs-client.css

@@ -0,0 +1,81 @@
+.ui-rsc-filter-pos
+{
+	position:absolute;
+	right:0.5em;
+	top:0.5em;
+	height:1.7em;
+	width:1.7em;	
+	z-index:3;
+}
+
+.ui-rsc-filter-btn
+{
+	position:absolute;
+	left:0em;
+	bottom:0em;
+	width:100%;
+	height:100%;
+	
+}
+
+.ui-rsc-filter-bg
+{
+	position:absolute;
+	right:-1em;top:1.6em;
+	width:9.1875em;height:8.0625em;
+	background-image:url(res-rs-client/filterbg.png);
+	background-repeat:no-repeat;
+	background-size:cover;
+	border-radius:0.5em;
+	z-index:3;
+	padding:1em;
+}
+
+.ui-rsc-filter-btn-bg
+{
+	position:absolute;
+	width:100%;height:100%;
+	background-size:cover;
+	background-position:center;
+	background-repeat:no-repeat;
+	background-image:url(res-rs-client/filter.png);
+}
+
+.ui-rsc-filter-item
+{
+	
+    color:white;text-shadow:0 1px 1px black;
+}
+
+input[type=checkbox]:checked+div>div.ui-rsc-anim1
+{
+	opacity:0.5;
+	-webkit-transition: all 0.5s ease-in-out;
+	-webkit-transform:scale(1,1);
+}
+input[type=checkbox]+div>div.ui-rsc-anim1
+{
+	opacity:1;
+	-webkit-transition: all 0.5s ease-in-out;
+	-webkit-transform:scale(1,1);
+}
+input[type=checkbox]:checked+div>div.ui-rsc-anim2
+{
+	opacity:1;
+	-webkit-transition: all 0.5s ease-in-out;
+	-webkit-transform:scale(1,1)
+}
+input[type=checkbox]+div>div.ui-rsc-anim2
+{
+	opacity:0;
+	-webkit-transition: all 0.5s ease-in-out;
+	-webkit-transform:scale(0,0)
+}
+
+input[type=radio]:checked+div.ui-rsc-select
+{
+	color: #fff;
+	background:#206BBE;
+	-webkit-box-shadow: inset 0px 2px 3px rgba(0, 0, 0, .4);
+	box-shadow: inset 0px 2px 3px rgba(0, 0, 0, .4);
+}

+ 56 - 0
web/mobileapp/css/ui-tab.css

@@ -0,0 +1,56 @@
+
+input[type="radio"]:checked + div.tab-act
+{
+	background-color:rgba(255,255,255,0.1) !important;
+	border-radius:0.3em;
+	border: 0px;
+	background-image: none;
+}
+
+input[type="radio"] + div>div.tp-info{
+	background-image: url(res-apple/info.png);
+}
+
+input[type="radio"]:checked + div>div.tp-info{
+	background-image: url(res-apple/info-act.png);
+}
+
+input[type="radio"] + div>div.tp-menu{
+	background-image: url(res-apple/menu.png) ;
+}
+
+input[type="radio"]:checked + div>div.tp-menu{
+	background-image: url(res-apple/menu-act.png);
+}
+
+input[type="radio"] + div>div.tp-home{
+	background-image: url(res-apple/home.png);
+}
+
+input[type="radio"]:checked + div>div.tp-home{
+	background-image: url(res-apple/home-act.png);
+}
+
+input[type="radio"] + div>div.tp-set{
+	background-image: url(res-apple/set.png);
+}
+
+input[type="radio"]:checked + div>div.tp-set{
+	background-image: url(res-apple/set-act.png);
+}
+
+input[type="radio"] + div>div.tp-shop{
+	background-image: url(res-apple/shop.png);
+}
+
+input[type="radio"]:checked + div>div.tp-shop{
+	background-image: url(res-apple/shop-act.png);
+}
+
+input[type="radio"] + div>div.tp-talk{
+	background-image: url(res-apple/talk.png);
+}
+
+input[type="radio"]:checked + div>div.tp-talk{
+	background-image: url(res-apple/talk-act.png);
+}

+ 58 - 0
web/mobileapp/js/config.js

@@ -0,0 +1,58 @@
+/**
+ * 当前应用的配置信息
+ * 
+ * @author zxh
+ * @date 2014-04-23
+ */
+var __version="V0.6.11",
+	//访问服务设置的地址
+	__ctx="http://192.168.1.222:8080/bpm",
+	//__ctx="http://10.0.24.49:8080/ecp",
+	//__ctx="https://mecp.st.sf-express.com:443/ecp",
+	// 当前语言信息 默认简体中文
+	 __lang  = "",
+	//每个页面的当前语言
+	__pageLang = localStorage.getItem("__pageLang"),
+	//当前用户
+	__curUserInfo = null,
+	__curUserId = null,
+	
+	__scxs = "",
+	__scxmainwindow="",
+	//判断是否登录
+	__hasLogin = false;
+
+
+//====访问服务设置的地址
+if(localStorage.getItem("__ctx")!=null)
+	__ctx =localStorage.getItem("__ctx");
+
+//===== 当前语言信息
+if (localStorage.getItem("__lang") != null) 
+	__lang = localStorage.getItem("__lang");
+
+//====每个页面的当前语言
+if(!__pageLang){
+	__pageLang = {};
+	localStorage.setItem("__pageLang", JSON.stringify(__pageLang));
+}
+else{
+	__pageLang = JSON.parse(__pageLang);
+}
+
+/**
+ * 当前用户
+ * 
+ */
+function __getCurUserInfo(){
+	var curUserInfo = localStorage.getItem("__curUserInfo");
+	if(curUserInfo == null || curUserInfo == ''){
+		//返回登录页面
+	//	HT.goToHtml("login");
+		return ;
+	}
+	__curUserInfo = JSON.parse(curUserInfo);
+	__curUserId = __curUserInfo.userId;
+};
+//
+__getCurUserInfo();

File diff suppressed because it is too large
+ 1104 - 0
web/mobileapp/js/help/iscroll.js


File diff suppressed because it is too large
+ 1279 - 0
web/mobileapp/js/iscroll/iscroll.js


File diff suppressed because it is too large
+ 6 - 0
web/mobileapp/js/jquery/jquery.min.js


File diff suppressed because it is too large
+ 217 - 0
web/mobileapp/js/ng/base/angular.min.js


File diff suppressed because it is too large
+ 2104 - 0
web/mobileapp/js/ng/custom/app.js


+ 0 - 0
web/mobileapp/js/ng/custom/components.js


Some files were not shown because too many files changed in this diff