util.js 75 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444
  1. (function () {
  2. window.HT_LS = {
  3. activeWin:'activeWin', // 主页激活其他窗口
  4. selectorToSelected:'selectorToSelected', // 联系人激活已选中
  5. formToSeletor:'formToSeletor', // 表单激活联系人
  6. selectorSelected:'selectorSelected', // 已选中联系人
  7. contactCommon:'contactCommon' // 常用联系人
  8. }
  9. })();
  10. //帮助类
  11. (function () {
  12. window.HT = {
  13. /**
  14. * 字符串解析为整数
  15. */
  16. parseInt:function(string,radix){
  17. if(this.isEmpty(string))
  18. return 0;
  19. if(this.isEmpty(radix))
  20. return parseInt(string,10);
  21. return parseInt(string,radix);
  22. },
  23. getI18n:function(lang){
  24. if (lang === 'zh_cn')
  25. $i18n$ = $i18n$_zh_cn;
  26. else if(lang === 'zh_tw')
  27. $i18n$ = $i18n$_zh_tw;
  28. else if(lang === 'en_us')
  29. $i18n$ = $i18n$_en_us;
  30. else{
  31. var language= navigator.language;
  32. switch (language) {
  33. case 'zh-CN':
  34. case 'zh-cn':
  35. $i18n$ = $i18n$_zh_cn;
  36. break;
  37. case 'zh-TW':
  38. case 'zh-tw':
  39. $i18n$ = $i18n$_zh_tw;
  40. break;
  41. case 'en-US':
  42. case 'en-us':
  43. $i18n$ = $i18n$_en_us;
  44. break;
  45. default:
  46. $i18n$ = $i18n$_zh_cn;
  47. break;
  48. }
  49. }
  50. return $i18n$;
  51. },
  52. // 文件的双引号
  53. FILE_QUOTES:"¥@@¥",
  54. //默认页大小
  55. pageSize:10,
  56. fileTarget:{},
  57. __flag:true,
  58. footer:"",
  59. /**
  60. * 转换PageBean
  61. */
  62. trustPageBean:function(param){
  63. var pageBean ={
  64. start:1,
  65. pageSize:this.pageSize
  66. };
  67. if(!param)
  68. param ={};
  69. else{
  70. pageBean = param.pageBean?param.pageBean:pageBean;
  71. delete param.pageBean;
  72. }
  73. var pageSize = pageBean.pageSize,
  74. start = pageBean.start,
  75. p = this.parseInt(start/pageSize),
  76. page = ((start%pageSize)>0)?(p+1):p;
  77. param.page = page;
  78. param.pageSize = pageSize;
  79. param.start = start;
  80. return param;
  81. },
  82. getDefaultPage :function(flag){
  83. if(!flag)
  84. flag = 2;
  85. return {
  86. _flag:flag,
  87. start:1,
  88. pageSize:this.pageSize
  89. }
  90. },
  91. // 刷新效果
  92. initBounce :function(funcTop, funcBottom) {
  93. uexWindow.setBounce("1");
  94. if (!funcTop && !funcBottom) {
  95. uexWindow.showBounceView("0", "rgba(0,0,0,0)", "0");
  96. uexWindow.showBounceView("1", "rgba(0,0,0,0)", "0");
  97. return;
  98. }
  99. var top = 0, btm = 1,params;
  100. //回调
  101. uexWindow.onBounceStateChange = function(type, state) {
  102. if (type == top && state == 2) { // 顶部弹动
  103. funcTop();
  104. }
  105. if (type == btm && state == 2) { // 底部弹动
  106. funcBottom();
  107. }
  108. }
  109. //顶部弹动
  110. if (funcTop) {
  111. params = "{'pullToReloadText':"+$i18n$.COMMON.PULL_RELOAD_TEXT
  112. +",'releaseToReloadText':"+$i18n$.COMMON.RELEASE_REFRESH_TEXT
  113. +",'loadingText':"+$i18n$.COMMON.LOADING_TEXT+"}";
  114. uexWindow.setBounceParams('0',params);
  115. uexWindow.showBounceView(top, "rgba(0,0,0,0)", 1);// 设置弹动位置及效果([1:显示内容;0:不显示])
  116. uexWindow.notifyBounceEvent(top, 1);// 注册接收弹动事件([0:不接收onBounceStateChange方法回调;1:接收])
  117. }
  118. // 底部弹动
  119. if (funcBottom) {
  120. params = "{'pullToReloadText':"+$i18n$.COMMON.LOAD_RELOAD_TEXT
  121. +",'releaseToReloadText':"+$i18n$.COMMON.LOAD_REFRESH_TEXT
  122. +",'loadingText':"+$i18n$.COMMON.LOAD_MORE_TEXT+"}";
  123. uexWindow.setBounceParams('1',params);
  124. uexWindow.showBounceView(btm, "rgba(0,0,0,0)", 1);// 设置弹动位置及效果([1:显示内容;0:不显示])
  125. uexWindow.notifyBounceEvent(btm, 1); // 注册接收弹动事件([0:不接收onBounceStateChange方法回调;1:接收])
  126. }
  127. },
  128. /**
  129. * 加载分页的数据
  130. */
  131. loadedPage:function(scope,flag,method){
  132. if(!method)
  133. method = "search()";
  134. var pageBean = scope.pageBean;
  135. if(!pageBean)
  136. pageBean = this.getDefaultPage(flag);
  137. if(flag == 0){//刷新功能
  138. pageBean._flag = flag;
  139. pageBean.start = 1;
  140. pageBean.pageSize=this.pageSize;
  141. } else if(flag == 1) {//加载成功
  142. pageBean._flag = flag;
  143. pageBean.start = pageBean.pageSize+pageBean.start;
  144. pageBean.pageSize=this.pageSize;
  145. }
  146. scope.pageBean = pageBean;
  147. try{
  148. eval("(scope."+method+")");
  149. }catch(e){}
  150. scope.$digest();
  151. },
  152. /**
  153. * 默认的日期格式
  154. */
  155. defaultDateFormate:'yyyy-MM-dd hh:mm:ss',
  156. iso8601TestRe:/\d\dT\d\d/,
  157. iso8601SplitRe:/[- :T\.Z\+]/,
  158. dashesRe:/-/g,
  159. /**
  160. * 设置字符串类型的本地缓存
  161. *
  162. * @param {String}
  163. * key 传入key
  164. * @param {String}
  165. * value 字符串的值
  166. *
  167. */
  168. setStorage: function(key,value){
  169. var sto = window.localStorage;
  170. if (sto)
  171. sto.setItem(key, value);
  172. },
  173. /**
  174. * 判断对象是否为空
  175. */
  176. isObjNull:function(obj){
  177. for (var i in obj){
  178. return false;
  179. }
  180. return true;
  181. },
  182. /**
  183. * 设置JSON类型的本地缓存
  184. *
  185. * @param {String}
  186. * key 指定key
  187. * @param {String}
  188. * value JSON的值
  189. */
  190. setStorageJSON: function(key,value){
  191. this.setStorage(key, JSON.stringify(value));
  192. },
  193. /**
  194. * 读取字符串类型的本地缓存
  195. *
  196. * @param {String}
  197. * key 指定key
  198. * @param {String}
  199. * isClear 是否清除当前key的缓存
  200. * @return {String} 返回字符串类型的缓存
  201. */
  202. getStorage :function(key,isClear) {
  203. var r = '',
  204. sto = window.localStorage;
  205. if (sto)
  206. r = sto.getItem(key);
  207. if(isClear)
  208. sto.removeItem(key);
  209. return r;
  210. },
  211. /**
  212. * 获取缓存中的boolean值
  213. * @param {Object} key
  214. * @param {Object} isClear
  215. */
  216. getStorageBoolean: function(key,isClear) {
  217. var b = this.getStorage(key,isClear);
  218. return b && b=='true';
  219. },
  220. /**
  221. * 读取SON类型的本地缓存
  222. *
  223. * @param {String}
  224. * key 指定key
  225. * @param {String}
  226. * isClear 是否清除当前key的缓存
  227. * @return {String} 返回JSON类型的缓存
  228. */
  229. getStorageJSON:function(key,isClear) {
  230. var r = this.getStorage(key,isClear)
  231. if (!this.isEmpty(r))
  232. r = JSON.parse(r);
  233. return r;
  234. },
  235. /**
  236. * 清除本地缓存,如没指定key则为清空所有缓存
  237. *
  238. * @param {String}
  239. * key 指定key
  240. */
  241. clearStorage:function(key) {
  242. var sto = window.localStorage;
  243. if (!sto)
  244. return;
  245. if (key)
  246. sto.removeItem(key);
  247. else
  248. sto.clear();
  249. },
  250. /**
  251. * 获取缓存的数据
  252. */
  253. getLocalStorage:function(key,value,isJson) {
  254. var v = this.getStorage(key);
  255. if (this.isEmpty(v) && this.isEmpty(value))
  256. return v;
  257. if (this.isEmpty(v)){
  258. if(isJson)
  259. v =JSON.stringify(value);
  260. this.setStorage(key, v);
  261. }else{
  262. if(isJson)
  263. v = JSON.parse(v);
  264. }
  265. return v
  266. },
  267. /**
  268. * 记录打开浮动窗口的对象 curid:当前打开的页面id preid:前一次的页面id
  269. */
  270. pages: {
  271. curid: '',
  272. preid: ''
  273. },
  274. /**
  275. * 根据主窗口ID 关闭 该主窗口下面的浮动窗口
  276. * @param {Object} id
  277. */
  278. clearPages:function(id){
  279. if(id){
  280. uexWindow.evaluateScript(id,0,"HT.clearPages();");
  281. }else{
  282. for(var i in this.pages){
  283. if(i!="curid"&&i!="preid"){
  284. uexWindow.closePopover(i);
  285. }
  286. }
  287. HT.pages={
  288. curid: '',
  289. preid: ''
  290. };
  291. }
  292. },
  293. /**
  294. * 判断是否只有时间
  295. *
  296. * @param {Object}
  297. * time
  298. */
  299. isOnlyTime: function (time) {
  300. if(this.isEmpty(time))
  301. return false;
  302. return !this.isDate(time) && !this.isObject(time) && time.indexOf(" ") == -1 && time.length == 8 && time.split(":").length == 3;
  303. },
  304. /**
  305. * 判断是否是日期
  306. *
  307. * @param {Object}
  308. * value
  309. */
  310. isDate: function (value) {
  311. return toString.call(value) === '[object Date]';
  312. },
  313. /**
  314. * 判断是否是字符串
  315. *
  316. * @param {Object}
  317. * value
  318. */
  319. isStirng: function (value) {
  320. return typeof value === 'string';
  321. },
  322. /**
  323. * 通过属性获取DOM对象,最好用document.querySelectorAll("[attr]")代替
  324. * @param {Object} attr
  325. */
  326. getDomsByAttrs:function(attr){
  327. var allDoms=this.$(document).find("*");
  328. var doms=[];
  329. for(var i=allDoms.length;i--;){
  330. var atts=allDoms[i].attributes;
  331. if(allDoms[i].hasAttributes(attr)&&atts&&this.isAttrInNamedNodeMap(atts,attr)&&this.$(allDoms[i]).attr(attr)!=undefined){
  332. doms.push(allDoms[i]);
  333. };
  334. }
  335. return doms;
  336. },
  337. /**
  338. * 判断一个attr是否在该对象的NodeMap集合中
  339. * @param {Object} arr
  340. * @param {Object} obj
  341. */
  342. isAttrInNamedNodeMap:function(arr,obj){
  343. for(var i=arr.length;i--;){
  344. if(arr[i].name==obj)
  345. return true;
  346. }
  347. return false;
  348. },
  349. /**
  350. * 通过dom获取当前的angular
  351. */
  352. $:function(dom){
  353. return angular.element(dom);
  354. },
  355. /**
  356. * 通过ID获取DOM对象
  357. * @param {Object} id
  358. */
  359. $$:function(id){
  360. return document.getElementById(id);
  361. },
  362. /**
  363. * 通过id获取当前的angular的element
  364. */
  365. getElement :function(id){
  366. return angular.element(this.$$(id));
  367. },
  368. /**
  369. * 通过id获取当前的Scope
  370. */
  371. getScope : function (id){
  372. return this.getElement(id).scope();
  373. },
  374. /**
  375. * 当填写完子表数据时,点击确定按钮的操作。(将该数据插入对应的scope中的子表中)
  376. * @param {Object} e
  377. */
  378. addSubTableCol: function (e) {
  379. //通过点击确定按钮的事件e获取 ,子表的表名ID。obj
  380. var subTableId=this.$(e.currentTarget).parent().parent().attr("id");
  381. var subTabDIV = this.getElement(subTableId);
  382. var scope=subTabDIV.scope();
  383. //校验子表数据是否填写正确,传入subTabDIV[0] 表示只校验该DIV下面的需要validate的对象
  384. if(!scope.valid({dom:subTabDIV[0]})){
  385. scope.$parent.showWrongMsg("子表表单数据不正确");
  386. return false;
  387. }
  388. //判断当前子表数据是 修改状态还是添加状态
  389. if(scope.item.___index>=0){
  390. scope.$parent.sub[subTableId.toLowerCase()][scope.item.___index]=scope.item;
  391. }else{
  392. scope.$parent.sub=scope.$parent.sub||[];
  393. scope.$parent.sub[subTableId.toLowerCase()]=scope.$parent.sub[subTableId.toLowerCase()]||[];
  394. scope.$parent.sub[subTableId.toLowerCase()].push(scope.item);
  395. }
  396. //清除 子作用于下面 的数据
  397. this.clearChildScopeVals(scope);
  398. scope.$parent.$digest();
  399. scope.item={};
  400. //关闭添加子表页面的窗口
  401. this.openSubTableIframe(e, true);
  402. //打开form主页面的窗口
  403. this.openSubTableIframe("mainWindow", false);
  404. //将form主窗口的页面从全屏改成原来的状态
  405. uexWindow.evaluateScript("taskInfo",'0',"HT.togglePoperFullWindow('form',false)");
  406. uexWindow.evaluateScript("newFlow_add",'0',"HT.togglePoperFullWindow('form',false)");
  407. return true;
  408. },
  409. openSubPopver: function (tagetId) {
  410. // var tagetId = angular.element(e.currentTarget).parent().attr("tablename");
  411. var tagetObj = angular.element(document.getElementById(tagetId.toLowerCase()));
  412. //打开添加子表页面的窗口
  413. this.openSubTableIframe(tagetId.toLowerCase(), false);
  414. //关闭form主页面的窗口
  415. this.openSubTableIframe("mainWindow", true);
  416. //将form主窗口的页面变成全屏状态
  417. uexWindow.evaluateScript("taskInfo",'0',"HT.togglePoperFullWindow('form',true)");
  418. uexWindow.evaluateScript("newFlow_add",'0',"HT.togglePoperFullWindow('form',true)");
  419. window.scrollTo(0,0);
  420. },
  421. getSelectedOption:function(elm){
  422. var ops=elm[0].options;
  423. for(var i=ops.length;i--;){
  424. if(elm.val()==ops[i].value){
  425. return ops[i].text;
  426. }
  427. }
  428. },
  429. /**
  430. * 实现上下滑动效果
  431. */
  432. scrollH: function (jqId, offsetHeight) {
  433. var wrapper = typeof jqId == 'object' ? jqId : this.$$(jqId);
  434. if(!wrapper) return;
  435. HT.$(document.body).css("overflow","hidden");
  436. return new iScroll(jqId, {
  437. mouseWheel: true,
  438. hScrollbar: false,
  439. vScrollbar: false,
  440. bottom:0
  441. });
  442. },
  443. /**
  444. * 获取DOM对象
  445. * @param {Object} obj
  446. * @param {Object} type
  447. */
  448. getDoms:function(obj,type){
  449. switch (type) {
  450. case "id":
  451. return document.getElementById(obj);
  452. break;
  453. case "class":
  454. return document.getElementsByClassName(obj);
  455. break;
  456. case "target":
  457. return document.getElementsByTagName(obj);
  458. break;
  459. }
  460. },
  461. /**
  462. * 实现左右滑动效果
  463. */
  464. scrollW: function (obj, type) {
  465. var objs = this.getDoms(obj,type);
  466. var scxs=[];
  467. for (var o = 0; o < objs.length; o++) {
  468. scxs.push(new iScroll(objs[o], {
  469. scrollX: true,
  470. scrollY: false,
  471. mouseWheel: false,
  472. hScrollbar: false,
  473. vScrollbar: false
  474. }));
  475. }
  476. return scxs;
  477. },
  478. /**
  479. * 刷新当前页面,可以在任何一个页面调用HT.reload()来刷新当前页面。
  480. */
  481. reload: function () {
  482. // window.location.href = window.location.href;
  483. window.location.reload(true);
  484. // document.execCommand("Refresh");
  485. // document.URL=window.location.href;
  486. // window.navigate(window.location.href);
  487. },
  488. reloadByScope:function(id){
  489. HT.getScope(id).reload();
  490. },
  491. /**
  492. * 清除input框
  493. * @param {Object} e
  494. * @param {Object} ngModel
  495. */
  496. clearInput:function(e,ngModel){
  497. var scope=angular.element(e.currentTarget).scope();
  498. var evalstr="scope."+ngModel+"='';";
  499. eval(evalstr);
  500. scope.$digest();
  501. },
  502. /**
  503. * trigger 对象的click事件
  504. * @param {Object} e
  505. */
  506. trigger: function (e) {
  507. angular.element(e.currentTarget).next().triggerHandler("click");
  508. },
  509. /**
  510. * 保存子表数据,该方法是在后台表单模板中调用的
  511. * @param {Object} e
  512. */
  513. saveSubtableDate:function(e){
  514. if(this.addSubTableCol(e)){
  515. this.hideSubTableIframe(e);
  516. }
  517. },
  518. /**
  519. * 清楚子作用域的数据
  520. * @param {Object} scope
  521. */
  522. clearChildScopeVals:function(scope){
  523. if(scope.$$childTail){
  524. if(scope.$$childTail.$$prevSibling){
  525. this.setValueNull(scope.$$childTail.$$prevSibling);
  526. }
  527. if(scope.$$childTail.$$nextSibling){
  528. this.setValueNull(scope.$$childTail.$$nextSibling);
  529. }
  530. if(scope.$$childTail.$$childHead){
  531. this.setValueNull(scope.$$childTail.$$childHead);
  532. }
  533. this.setValueNull(scope.$$childTail);
  534. }
  535. },
  536. /**
  537. * 清除数据
  538. * @param {Object} s
  539. */
  540. setValueNull:function(s){
  541. if(s.users||s.files){
  542. if(s.users instanceof Array){
  543. s.users=[];
  544. }
  545. if(s.files instanceof Array){
  546. s.files=[];
  547. }
  548. }
  549. },
  550. /**
  551. * 隐藏子表页面
  552. * @param {Object} e
  553. * @param {Object} type
  554. */
  555. hideSubTableIframe : function(e,type){
  556. //type==0 表示从添加子表的页面点击了取消按钮,从而隐藏该页面
  557. if(type=="0") HT.openSubTableIframe(e,true);
  558. var subTableId=HT.$(e.currentTarget).parent().parent().attr("id");
  559. var subTabDIV=this.getElement(subTableId);
  560. var scope=subTabDIV.scope();
  561. HT.clearChildScopeVals(scope);
  562. if (scope.item.___index >= 0) {
  563. scope.item = {};
  564. scope.$digest();
  565. }
  566. HT.openSubTableIframe('mainWindow', false);
  567. uexWindow.evaluateScript("taskInfo",'0',"HT.togglePoperFullWindow('form',false)");
  568. uexWindow.evaluateScript("newFlow_add",'0',"HT.togglePoperFullWindow('form',false)");
  569. window.scrollTo(0,document.body.scrollHeight);
  570. document.activeElement.blur();
  571. //当点击按钮的时候 添加一个透明的遮罩层,避免出现点一次触发两次的情况
  572. HT.addModal(document.body.scrollHeight+"px");
  573. //1m之后删除遮罩层
  574. window.setTimeout(function(){HT.hideModal();},1000)
  575. },
  576. /**
  577. * 通过传入的ID,和 状态 来判断是否是显示当前DOM 还是隐藏当前DOM
  578. * @param {Object} id
  579. * @param {Object} s
  580. */
  581. openSubTableIframe: function (id, s) {
  582. if (id.currentTarget) id = angular.element(id.currentTarget).parent().parent().attr("id");
  583. this.getElement(id).toggleClass("uhide", s).toggleClass("z-index9999", s);
  584. },
  585. triggerSelect:function(){
  586. // document.querySelectorAll("select")[0].onclick();
  587. },
  588. request: {
  589. getParameter: function (val) {
  590. var uri = window.location.search;
  591. var re = new RegExp("" + val + "=([^&>]*)", "ig");
  592. return ((uri.match(re)) ? (uri.match(re)[0].substr(val.length + 1)) : null);
  593. }
  594. },
  595. /**
  596. * 获取随机数,范围是min和max之间
  597. */
  598. getRandomNum: function (Min, Max) {
  599. var Range = Max - Min - 1;
  600. var Rand = Math.random(Math.round(Math.random(Range * Range)));
  601. return (Min + Math.round(Rand * Range));
  602. },
  603. /**
  604. * 随机获取某个数组中的一个元素
  605. */
  606. getByRan: function (arr) {
  607. if (!arr || !arr.length) return;
  608. return arr[this.getRandomNum(0, arr.length)];
  609. },
  610. /**
  611. * 当打开一个浮动窗口时,记录当前浮动窗口的page对象信息。
  612. */
  613. main_resize: function (id) {
  614. var s = window.getComputedStyle(this.$$('content'), null);
  615. this.pages['' + id + ''] = {
  616. 'y': this.$$('header').offsetHeight,
  617. 'w': this.parseInt(s.width),
  618. 'h': this.parseInt(s.height),
  619. 's': this.parseInt(s.fontSize)
  620. };
  621. },
  622. /**
  623. * 打开浮动窗口,如果ID存在,则直接调用;
  624. */
  625. openPopFrame: function (id,isBackOpen,param) {
  626. var param = (typeof param!="undefined")?param:"";
  627. var url = id;
  628. this.pages.preid = this.pages.curid; // 赋值上次打开的页面id
  629. this.pages.curid = id; // 记录本次打开的
  630. if (this.pages.preid != '') {
  631. uexWindow.setPopoverFrame(this.pages.preid, 0, 0, 0, 0);
  632. }
  633. if (!this.pages['' + id + '']) {
  634. this.main_resize(id);
  635. var p = this.pages['' + id + ''];
  636. setTimeout(function(){
  637. if(isBackOpen){
  638. uexWindow.openPopover(id, '0', '' + url + '.html'+param, '', 0, 0, 0, 0, p.s, '0');
  639. }else{
  640. uexWindow.openPopover(id, '0', '' + url + '.html'+param, '', 0, p.y, p.w, p.h, p.s, '0');
  641. }
  642. },200);
  643. } else {
  644. if(id=="myUndertake"&&!HT.getStorage("__firstToMyUndertake")&&!HT.getStorage("__myUndertakeSearched")){
  645. uexWindow.evaluatePopoverScript("","myUndertake","HT.reloadByScope('myUndertake')");
  646. HT.setStorage("__myUndertakeSearched","true");
  647. }else if(id=="myLaunch"&&!HT.getStorage("__firstToMyLaunch")&&!HT.getStorage("__myLaunchSearched")){
  648. uexWindow.evaluatePopoverScript("","myLaunch","HT.reloadByScope('myLaunch')");
  649. HT.setStorage("__myLaunchSearched","true");
  650. }
  651. uexWindow.setPopoverFrame(id, 0, this.pages['' + id + ''].y, this.pages['' + id + ''].w, this.pages['' + id + ''].h);
  652. }
  653. HT.checkLangChange(id,true);
  654. },
  655. /**
  656. * 改变浮动窗口的高度,在表单初始化的时候,因为主页面的footer是之后加载出来的,所以浮动窗口需要减去该footer的高
  657. * @param {Object} id
  658. * @param {Object} height
  659. */
  660. changePopHeight: function(id,height){
  661. this.pages['' + id + ''].h=this.pages['' + id + ''].h+height;
  662. uexWindow.setPopoverFrame(id, 0, this.pages['' + id + ''].y, this.pages['' + id + ''].w, this.pages['' + id + ''].h);
  663. },
  664. /**
  665. * 通过ID和状态 判断是否让浮动窗口全屏显示
  666. * @param {Object} id
  667. * @param {Object} flag
  668. */
  669. togglePoperFullWindow:function(id,flag){
  670. if(flag){
  671. if (id.currentTarget) id = angular.element(id.currentTarget).parent().parent().attr("id");
  672. uexWindow.setPopoverFrame(id, 0, 0, document.width, document.height);
  673. }else{
  674. uexWindow.setPopoverFrame(id, 0, this.pages['' + id + ''].y, this.pages['' + id + ''].w, this.pages['' + id + ''].h);
  675. }
  676. },
  677. /**
  678. * url:如果是数字,则返回上一个页面,数字表示页面切换的动画类型; 如果是string值 ,则直接打开string.html页面
  679. */
  680. goback: function (url) {
  681. if (!/[^\d]/.test(Math.abs(url))) {
  682. uexWindow.close(url);
  683. } else if (url) {
  684. this.goToHtml(url);
  685. };
  686. },
  687. /**
  688. * 一般的toast窗口
  689. * @param {Object} msg
  690. */
  691. toast:function(msg){
  692. uexWindow.toast("0","5",msg,"2000");
  693. },
  694. /**
  695. * 在其他页面调用某页面的toast窗口
  696. * @param {Object} id
  697. * @param {Object} popwindowId
  698. * @param {Object} waitmsg
  699. * @param {Object} time
  700. * @param {Object} type
  701. */
  702. toastInWindow:function(id,popwindowId,waitmsg,time,type){
  703. var msg=waitmsg ? waitmsg : $i18n$.COMMON.WATTING_MSG;
  704. time=time?time:0;
  705. type=type==0?0:1;
  706. try {
  707. if (id) {
  708. if (popwindowId) {
  709. uexWindow.evaluatePopoverScript(id, popwindowId, 'uexWindow.toast(' + type + ', 5,"' + msg + '", ' + time + ');');
  710. }
  711. else {
  712. uexWindow.evaluateScript(id, 0, 'uexWindow.toast(' + type + ', 5,"' + msg + '", ' + time + ');');
  713. }
  714. }
  715. else {
  716. uexWindow.toast(type, 5, msg, time);
  717. }
  718. }
  719. catch (e) {
  720. console.info(e);
  721. }
  722. },
  723. /**
  724. * 关闭toast
  725. * @param {Object} id
  726. * @param {Object} popwindowId
  727. */
  728. closeToastInWindow:function(id,popwindowId){
  729. try {
  730. if(id){
  731. if(popwindowId){
  732. uexWindow.evaluatePopoverScript(id,popwindowId,'uexWindow.closeToast();');
  733. }else{
  734. uexWindow.evaluateScript(id,0,'uexWindow.closeToast();');
  735. }
  736. }else{
  737. uexWindow.closeToast();
  738. }
  739. }
  740. catch (e) {
  741. console.info(e);
  742. }
  743. },
  744. /**
  745. * 判断对象是否在数组中
  746. * @param {Object} arr
  747. * @param {Object} obj
  748. */
  749. checkInArr: function (arr, obj) {
  750. for (var i in arr) {
  751. if (obj == arr[i]) {
  752. return true;
  753. }
  754. }
  755. return false;
  756. },
  757. checkLangChange:function(urlId,isPop){
  758. if(!urlId)return;
  759. var lang = localStorage.getItem("__lang"),
  760. pageLang = HT.getStorageJSON("__pageLang");
  761. if(!pageLang)return;
  762. var curPageLang = pageLang[urlId];
  763. if(!curPageLang)return;
  764. if(curPageLang==lang)return;
  765. if(isPop){
  766. uexWindow.evaluatePopoverScript("",urlId,"HT.reload()");
  767. }
  768. else{
  769. uexWindow.evaluateScript(urlId,0,"HT.reload()");
  770. }
  771. HT.updatePageLang(urlId);
  772. },
  773. updatePageLang : function(urlId){
  774. var pageLang = HT.getStorageJSON("__pageLang");
  775. pageLang[urlId] = __lang;
  776. HT.setStorageJSON("__pageLang",pageLang);
  777. },
  778. /**
  779. * 打开对应的页面; urlId:页面的地址; type:打开的类型,默认为0;
  780. */
  781. goToHtml: function (urlId, type) {
  782. uexWindow.open(urlId, '0', urlId + ".html", '0', '0', '0', type | '0');
  783. HT.checkLangChange(urlId);
  784. },
  785. /**
  786. * 获取只有header的页面中content的尺寸
  787. */
  788. getContentSizeOnlyHeader: function () {
  789. var screenHeight = window.innerHeight,
  790. header = this.$$('header'),
  791. headerWidth = header.offsetWidth,
  792. headerHeight = header.offsetHeight,
  793. json = {};
  794. json.width = headerWidth;
  795. json.height = screenHeight - headerHeight;
  796. return json;
  797. },
  798. /**
  799. * 为时间类型添加0的前缀
  800. */
  801. addZero: function (n) {
  802. n = parseInt(n);
  803. if (n < 10) {
  804. return '0' + n;
  805. }
  806. return '' + n;
  807. },
  808. /**
  809. * 获取伪类的class的属性值
  810. */
  811. getFualClass: function (dom, place, key) {
  812. var obj = window.getComputedStyle(dom, ":" + place);
  813. if (obj) return obj.getPropertyValue(key);
  814. },
  815. /**
  816. * 创建一个INPUT输入框,暂时没用到,也不起作用
  817. */
  818. createInput:function(){
  819. window.setTimeout(function(){
  820. uexInput.cbCreate=function(opid,dataType,data){
  821. alert(opid,dataType,data);
  822. };
  823. uexInput.onButtonClick=function(btnName,TextContent){
  824. alert(btnName,TextContent);
  825. }
  826. uexInput.create('{"background": "login.jpg", "inputType": "0", "items": [{"type": "0", "name": "itemFace", "emotion": {"normal": "login.jpg", "pressed": "login.jpg", "default": "true"}, "keyboard": {"normal": "login.jpg", "pressed": "login.jpg"} }, {"type": "1", "name": "itemInput", "defText": "默认文字", "defHint": "提示语", "bg": {"normal": "login.jpg", "pressed": "login.jpg"}, "autofill": "true"}, {"type": "3", "name": "itemBtn", "label": "发送", "bg": {"normal": "login.jpg", "pressed": "login.jpg"}, }, {"type": "2", "name": "itemBtn", "label": "更多", "bg": {"normal": "login.jpg", "pressed": "login.jpg"}, } ] }')
  827. },10)
  828. },
  829. /**
  830. * 获取某个元素的绝对位置
  831. * @param {Object} element
  832. */
  833. getAbsoluteLocation:function (element){
  834. if ( arguments.length != 1 || element == null ){
  835. return null;
  836. }
  837. var offsetTop = element.offsetTop;
  838. var offsetLeft = element.offsetLeft;
  839. var offsetWidth = element.offsetWidth;
  840. var offsetHeight = element.offsetHeight;
  841. while( element = element.offsetParent ){
  842. offsetTop += element.offsetTop;
  843. offsetLeft += element.offsetLeft;
  844. }
  845. return { absoluteTop: offsetTop, absoluteLeft: offsetLeft,
  846. offsetWidth: offsetWidth, offsetHeight: offsetHeight
  847. };
  848. },
  849. /**
  850. * 通过DOM集合main 减去 DOM集合sub 返回差集
  851. * @param {Object} main
  852. * @param {Object} sub
  853. */
  854. getDomWithSubDom:function(main,sub){
  855. var alldom=[];
  856. var isIn=false;
  857. for(var i=0; i<main.length;i++){
  858. var temp=main[i];
  859. for(var j=0;j<sub.length;j++){
  860. if(temp==sub[j]){
  861. isIn=true;
  862. break;
  863. }
  864. }
  865. if(!isIn){
  866. alldom.push(temp);
  867. isIn=false;
  868. }
  869. }
  870. return alldom;
  871. },
  872. /**
  873. * 设置伪类的class的属性值
  874. */
  875. setFualClass: function (dom, place, value) {
  876. var obj = window.getComputedStyle(dom, ":" + place);
  877. if (obj) return obj.getPropertyValue(key);
  878. },
  879. /**
  880. * 文件上传
  881. * @param {Object} file
  882. */
  883. httpReqPost:function (file){
  884. var httpId = new Date().getTime().toString();
  885. httpId=httpId.substring(httpId.length-3,httpId.length);
  886. var url=__ctx+'/mobile/system/file/saveFile.ht';
  887. //开始一个跨域异步请求
  888. uexXmlHttpMgr.open(httpId,'post',url,30000);
  889. if(file){
  890. uexXmlHttpMgr.setPostData(httpId,'1','file',file);
  891. }
  892. uexXmlHttpMgr.send(httpId);
  893. uexXmlHttpMgr.onData = function(inOpCode,inStatus,inResult){
  894. if(inStatus == 1){
  895. var result=eval(inResult);
  896. if(result.success){
  897. HT.closeToastInWindow();
  898. var tempFile={id:result.file.fileId,name:result.file.fileName};
  899. var files=[];
  900. var currentFile=eval("HT.fileTarget.scope."+HT.fileTarget.ngModel);
  901. if (currentFile) files = eval(currentFile.replaceAll("¥@@¥", "\""));
  902. files.push(tempFile);
  903. var evalstr='HT.fileTarget.scope.'+HT.fileTarget.ngModel+'=JSON.stringify(files).replaceAll("\\"", "¥@@¥")';
  904. eval(evalstr);
  905. HT.fileTarget.scope.$digest();
  906. HT.toastInWindow("","","文件上传成功",2000,0);
  907. }else{
  908. HT.closeToastInWindow();
  909. HT.setStorage("wrongmsg",result.msg);
  910. uexWindow.evaluatePopoverScript("","form","HT.showmsg(null,null,'formDiv')");
  911. }
  912. uexXmlHttpMgr.close(httpId);
  913. }
  914. }
  915. },
  916. /**
  917. * 调用打开文件的方法(单个文件)
  918. */
  919. explorerFile: function () {
  920. try {
  921. uexFileMgr.cbExplorer = function(opId, dataType, data){
  922. HT.httpReqPost(data);
  923. }
  924. var path = '/sdcard';//android的用法
  925. uexFileMgr.explorer(path);
  926. }
  927. catch (e) {
  928. alert(e)
  929. }
  930. },
  931. /**
  932. * 调用打开文件的方法(多个文件)
  933. */
  934. multiExplorerFile: function () {
  935. this.explorerFile();
  936. // return ;
  937. // uexFileMgr.cbMultiExplorer = function (opId, dataType, data) {
  938. // if (dataType == 1) {
  939. // HT.toastInWindow("","","文件上传中",0);
  940. // var json=JSON.parse(data);
  941. // for(var i in json){
  942. // HT.httpReqPost(json[i]);
  943. // }
  944. // }
  945. // }
  946. // uexFileMgr.multiExplorer('/sdcard');
  947. },
  948. //打开图片浏览器
  949. openBrowser :function (){
  950. uexImageBrowser.cbPick=function (opCode,dataType,data){
  951. HT.httpReqPost(data);
  952. }
  953. uexImageBrowser.pick();
  954. },
  955. /**
  956. * 如果传入的值是null、undefined或空字符串,则返回true。(可选的)
  957. *
  958. * @param {Mixed}
  959. * value 要验证的值。
  960. * @param {Boolean}
  961. * allowBlank (可选的) 如果该值为true,则空字符串不会当作空而返回true。
  962. * @return {Boolean}
  963. */
  964. isEmpty: function (v, allowBlank) {
  965. return v === null || v === undefined || (!allowBlank ? v === '' : false);
  966. },
  967. /**
  968. * 获取日期选择的对象
  969. */
  970. getDate: function (me) {
  971. var dateObj = {};
  972. var mydate = new Date();
  973. var ty = mydate.getFullYear();
  974. var tm = mydate.getMonth() + 1;
  975. var td = mydate.getDate();
  976. var dateInput = angular.element(me.currentTarget ? me.currentTarget : me).find("input");
  977. var val = dateInput.val();
  978. var dateFmt = dateInput.attr("dateFmt");
  979. if (val) {
  980. var date = new Date(val);
  981. dateObj.ty = date.getFullYear();
  982. dateObj.tm = date.getMonth() + 1;
  983. dateObj.td = date.getDate();
  984. } else {
  985. dateObj.ty = ty;
  986. dateObj.tm = tm;
  987. dateObj.td = td;
  988. }
  989. uexControl.cbOpenDatePicker = function (opCode, dataType, data) {
  990. var obj = eval('(' + data + ')');
  991. var y = obj.year;
  992. var mh = parseInt(obj.month);
  993. var d = parseInt(obj.day);
  994. var str = y + '-' + HT.addZero(mh) + '-' + HT.addZero(d);
  995. var time = dateInput.parent().next().find("input").val();
  996. if (time) str = str + " " + time;
  997. var scope = dateInput.scope();
  998. // var ngModel=dateInput.attr("ng-model").split(".");
  999. eval("scope."+dateInput.attr("ng-model")+"=new Date(str)");
  1000. // scope[dateInput.attr("ng-model")] = new Date(str);
  1001. scope.$digest();
  1002. dateInput[0].blur();
  1003. dateObj.ty = y;
  1004. dateObj.tm = mh;
  1005. dateObj.td = d;
  1006. }
  1007. uexControl.openDatePicker(dateObj.ty, dateObj.tm, dateObj.td);
  1008. },
  1009. /**
  1010. * 获取时间选择的对象
  1011. */
  1012. getTime: function (me) {
  1013. var dateObj = {},
  1014. mydate = new Date(),
  1015. ty = mydate.getHours(),
  1016. tm = mydate.getMinutes(),
  1017. td = mydate.getSeconds(),
  1018. dateInput = angular.element(me.currentTarget ? me.currentTarget : me).find("input"),
  1019. val = dateInput.val(),
  1020. dateFmt = dateInput.attr("dateFmt"),
  1021. scope = dateInput.scope(),
  1022. ngModel = dateInput.attr("ng-model"),
  1023. oldVal = eval("scope."+ngModel);
  1024. if (val) {
  1025. var date = val.split(":");
  1026. dateObj.ty = parseInt(date[0]);
  1027. dateObj.tm = parseInt(date[1]);
  1028. } else {
  1029. dateObj.ty = ty;
  1030. dateObj.tm = tm;
  1031. dateObj.td = td;
  1032. }
  1033. if (oldVal instanceof Date) oldVal = oldVal.Format("yyyy-MM-dd hh:mm:ss");
  1034. uexControl.cbOpenTimePicker = function (opCode, dataType, data) {
  1035. var obj = eval('(' + data + ')'),
  1036. y = obj.hour,
  1037. m = obj.minute,
  1038. str = HT.addZero(y) + ':' + HT.addZero(m);
  1039. if (!HT.isOnlyTime(oldVal) && dateInput.attr("datefmt") != "HH:mm:ss" && dateInput.attr("datefmt") != "HH:mm:00") {
  1040. if (oldVal) {
  1041. str = oldVal.substring(0, oldVal.indexOf(" ")) + " " + str;
  1042. } else {
  1043. var nd = mydate.Format('yyyy-MM-dd');
  1044. str = nd+" " + str;
  1045. }
  1046. eval("scope."+ngModel+"=new Date(str)");
  1047. } else {
  1048. oldVal = oldVal ? oldVal : "00:00:00";
  1049. // scope[dateInput.attr("ng-model")] = str + ":" + oldVal.split(":")[2];
  1050. eval('scope.'+dateInput.attr('ng-model')+'=str + ":" + oldVal.split(":")[2]');
  1051. }
  1052. dateInput[0].blur();
  1053. scope.$digest();
  1054. dateObj.ty = y;
  1055. dateObj.tm = m;
  1056. }
  1057. uexControl.openTimePicker(dateObj.ty, dateObj.tm);
  1058. },
  1059. /**
  1060. * 是否是对象
  1061. *
  1062. */
  1063. isObject:function(value){
  1064. return value instanceof Object && value.constructor == Object;
  1065. },
  1066. /**
  1067. * Parse a value into a formatted date using the specified format
  1068. * pattern.
  1069. *
  1070. * @param {String/Date}
  1071. * value The value to format. Strings must conform to the
  1072. * format expected by the JavaScript Date object's [parse()
  1073. * method](http://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date/parse).
  1074. * @param {String}
  1075. * [format='m/d/Y'] (optional) Any valid date format string.
  1076. * @return {String} The formatted date string.
  1077. */
  1078. date: function(value, format) {
  1079. var date = value;
  1080. if (!value) {
  1081. return "";
  1082. }
  1083. if (!this.isDate(value)) {
  1084. if(this.isObject(value)){
  1085. value = new Date(value['time']);
  1086. }else{
  1087. date = new Date(Date.parse(value));
  1088. if (isNaN(date)) {
  1089. // Dates with ISO 8601 format are not well supported by
  1090. // mobile devices, this can work around the issue.
  1091. if (this.iso8601TestRe.test(value)) {
  1092. date = value.split(this.iso8601SplitRe);
  1093. date = new Date(date[0], date[1]-1, date[2], date[3], date[4], date[5]);
  1094. }
  1095. if (isNaN(date)) {
  1096. // Dates with the format "2012-01-20" fail, but
  1097. // "2012/01/20" work in some browsers. We'll try and
  1098. // get around that.
  1099. date = new Date(Date.parse(value.replace(this.dashesRe, "/")));
  1100. // <debug>
  1101. if (isNaN(date)) {
  1102. // "Cannot parse the passed value " + value + "
  1103. // "
  1104. }
  1105. // </debug>
  1106. }
  1107. }
  1108. value = date;
  1109. }
  1110. }
  1111. return value.Format(format?format:this.defaultDateFormate);
  1112. },
  1113. /**
  1114. * 回调主页时触发 onStateChange
  1115. */
  1116. winCallback : function(urlId){
  1117. HT.checkLangChange(urlId);
  1118. var win = getstorage(HT_LS.activeWin);
  1119. switch(win){
  1120. case "contactCommon":
  1121. uexWindow.evaluatePopoverScript("","contactCommon","addContactCommon()");
  1122. break;
  1123. default:
  1124. break;
  1125. }
  1126. HT.clearStorage(HT_LS.activeWin);
  1127. },
  1128. mergeContacts:function (a,b){
  1129. for(var i=0;i<a.length;i++){
  1130. for(var j=0;j<b.length;j++){
  1131. if(a[i].id==b[j].id){
  1132. b.splice(j,1);
  1133. }
  1134. }
  1135. }
  1136. for(var i=0;i<b.length;i++){
  1137. a.push(b[i]);
  1138. }
  1139. return a;
  1140. },
  1141. addContact:function(cbfun){
  1142. var newus = this.getStorageJSON(HT_LS.selectorSelected,true);
  1143. if(!newus||newus.length==0)return;
  1144. uexWindow.toast(1, 5, $i18n$.COMMON.WATTING_MSG, 5000);
  1145. var ds = [];
  1146. var idx=0;
  1147. var sqls = [];
  1148. var makeSql = function(us, cb){
  1149. ds.push(us)
  1150. uexDataBaseMgr.cbSelectSql = function(opId, type, data){
  1151. if (type == 1) {
  1152. var sql = "";
  1153. var r = angular.fromJson(data);
  1154. if(!r||r.length==0){
  1155. var u = ds[idx];
  1156. sql = "INSERT INTO frequent_contacts (id,account,name,position,refid) VALUES ('"+u.id+"','"+u.account+"','"+u.name+"','"+u.position+"','"+__curUserId+"')";
  1157. }else{
  1158. var o = r[0];
  1159. sql = "UPDATE frequent_contacts SET name='"+o.name+"',account='"+o.account+"',position='"+o.position+"',refid='"+__curUserId+"' WHERE _id ='"+o._id+"'";
  1160. }
  1161. sqls.push(sql);
  1162. }
  1163. idx++;
  1164. }
  1165. uexDataBaseMgr.selectSql(HT.SQLiteDBName, HT.getOperationNum(), "select * from frequent_contacts where id='"+us.id+"' and refid='"+__curUserId+"'");
  1166. }
  1167. for (var i = 0; i < newus.length; i++) {
  1168. makeSql(newus[i]);
  1169. }
  1170. setTimeout(function(){
  1171. if (sqls.length > 0 && sqls.length == newus.length) {
  1172. var rnd = HT.getOperationNum();
  1173. uexDataBaseMgr.cbTransaction=function(opId,dataType,data){
  1174. if(dataType==2){
  1175. if (data == 0) {
  1176. if(!cbfun)
  1177. HT.goback('-1');
  1178. else{
  1179. uexWindow.closeToast();
  1180. cbfun();
  1181. }
  1182. }
  1183. else if (data == 1) {
  1184. //console.log('事务执行失败');
  1185. }
  1186. }
  1187. }
  1188. uexDataBaseMgr.transaction(HT.SQLiteDBName,rnd,function(){
  1189. uexDataBaseMgr.cbExecuteSql = null;
  1190. for(var i=0;i<sqls.length;i++){
  1191. uexDataBaseMgr.executeSql(HT.SQLiteDBName,rnd,sqls[i]);
  1192. }
  1193. });
  1194. }
  1195. }, 1000);
  1196. },
  1197. /**
  1198. * 返回选择用户
  1199. */
  1200. selectedUsers:function(){
  1201. var flag = this.getStorage(HT_LS.formToSeletor,true),
  1202. u = this.getStorageJSON(HT_LS.selectorSelected,true),
  1203. sel = this.getElement(flag),
  1204. scope = sel.scope(),
  1205. ngModel = sel.attr("ng-model"),
  1206. refid = sel.attr("refid"),
  1207. nameAry = [],
  1208. idAry = [];
  1209. angular.forEach(u,function(item){
  1210. nameAry.push(item.name);
  1211. idAry.push(item.id);
  1212. });
  1213. var names = nameAry.join(","),
  1214. ids = idAry.join(","),
  1215. un = 'scope.'+ngModel+' = "'+ names+'"',
  1216. id = 'scope.'+refid+' = "'+ ids+'"' ;
  1217. eval('('+un+')');
  1218. eval('('+id+')');
  1219. scope.$digest();
  1220. },
  1221. /**
  1222. * 通过flag 来寻找scope对象
  1223. * @param {Object} scope
  1224. * @param {Object} flag
  1225. */
  1226. getScopeByNextSiblings:function(scope,flag){
  1227. var f = scope.flag;
  1228. while(!f||f.toLowerCase()!=flag){
  1229. scope = scope.$$nextSibling;
  1230. return HT.getScopeByNextSiblings(scope,flag);
  1231. }
  1232. return scope;
  1233. },
  1234. /**
  1235. * Get the index of the provided `item` in the given `array`, a supplement for the
  1236. * missing arrayPrototype.indexOf in Internet Explorer.
  1237. *
  1238. * @param {Array} array The array to check.
  1239. * @param {Object} item The item to look for.
  1240. * @param {Number} from (Optional) The index at which to begin the search.
  1241. * @return {Number} The index of item in the array (or -1 if it is not found).
  1242. */
  1243. indexOf : function(array, item, from) {
  1244. var i, length = array.length;
  1245. for (i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++) {
  1246. if (array[i] === item) {
  1247. return i;
  1248. }
  1249. }
  1250. return -1;
  1251. },
  1252. /**
  1253. * Returns a new array with unique items.
  1254. *
  1255. * @param {Array} array
  1256. * @return {Array} results
  1257. */
  1258. unique : function(array) {
  1259. var clone = [],
  1260. i = 0,
  1261. ln = array.length,
  1262. item;
  1263. for (; i < ln; i++) {
  1264. item = array[i];
  1265. if (this.indexOf(clone,item) === -1) {
  1266. clone.push(item);
  1267. }
  1268. }
  1269. return clone;
  1270. },
  1271. /**
  1272. * 合并
  1273. */
  1274. merge : function(){
  1275. var args = Array.prototype.slice.call(arguments),
  1276. array = [],
  1277. i, ln;
  1278. for (i = 0, ln = args.length; i < ln; i++) {
  1279. array = array.concat(args[i]);
  1280. }
  1281. return this.unique(array);
  1282. },
  1283. SQLiteDBName : 'ecpMobileDB',
  1284. SQLCallbackList : {},
  1285. oprationNum : 1,
  1286. getOperationNum : function(){
  1287. return HT.oprationNum++;
  1288. },
  1289. initTable:{
  1290. cache_forms:"create table cache_forms(_id integer primary key,formid text,template BLOB,guid text)",
  1291. cache_draft:"create table cache_draft(_id integer primary key,defId text,data BLOB)",
  1292. frequent_contacts:"create table frequent_contacts(_id integer primary key,id text,account text,name text,position text,refid text)"
  1293. },
  1294. /**
  1295. * 执行sql语句
  1296. * @param {String} sql 要执行的sql语句
  1297. * @param {function} callback 回调函数,回调参数{Boolean} 执行结果 true:成功,false:失败
  1298. */
  1299. executeSql : function(sql,callback){
  1300. var rnd = HT.getOperationNum();
  1301. if(callback){
  1302. HT.SQLCallbackList[rnd] = callback;
  1303. }
  1304. uexDataBaseMgr.cbExecuteSql = function(opId, type, data){
  1305. var curCallback = HT.SQLCallbackList[opId];
  1306. if (curCallback) {
  1307. delete HT.SQLCallbackList[opId];
  1308. if (type == 2 && data == 0) {
  1309. curCallback(true);
  1310. }
  1311. else {
  1312. curCallback(false);
  1313. }
  1314. }
  1315. }
  1316. uexDataBaseMgr.executeSql(HT.SQLiteDBName, rnd, sql);
  1317. },
  1318. /**
  1319. * 查询sql语句
  1320. * @param {String} sql 查询的sql语句
  1321. * @param {function} callback 回调函数,回调参数{Boolean|Array} 查询失败则返回false,成功则返回[{},{},...]
  1322. */
  1323. selectSql : function(sql,callback){
  1324. var rnd = HT.getOperationNum();
  1325. if(callback){
  1326. HT.SQLCallbackList[rnd] = callback;
  1327. }
  1328. uexDataBaseMgr.cbSelectSql = function(opId, type, data){
  1329. var curCallback = HT.SQLCallbackList[opId];
  1330. if (curCallback) {
  1331. delete HT.SQLCallbackList[opId];
  1332. if (type == 1) {
  1333. if(data.indexOf('"template":')>-1){
  1334. data=data.replaceAll("\\\\","¥@1@¥").replaceAll("\\r","¥@2@¥").replaceAll("\\n","¥@3@¥");
  1335. }else{
  1336. if(data.indexOf('"data":"')>-1&&data.indexOf('"main"')>-1&&data.indexOf('"sub"')>-1&&data.indexOf('"opinion"')>-1){
  1337. var str1=data.substring(data.indexOf('"data":"')+'"data":"'.length,data.indexOf(']}"')+']}"'.length-1);
  1338. var str2=data.substring(0,data.indexOf(str1));
  1339. var str3=data.substring(data.indexOf(str1)+str1.length,data.length);
  1340. data=str2+str1.replaceAll("\"","\\\"")+str3;
  1341. }
  1342. }
  1343. var json = eval(data);
  1344. curCallback(json);
  1345. }
  1346. else {
  1347. curCallback(false);
  1348. }
  1349. }
  1350. }
  1351. uexDataBaseMgr.selectSql(HT.SQLiteDBName, rnd, sql);
  1352. },
  1353. /**
  1354. * 初始化数据库连接(并创建常用联系人和表单缓存表)
  1355. */
  1356. openDataBase : function(){
  1357. uexDataBaseMgr.cbOpenDataBase = function(opId, dataType, data){
  1358. if (dataType == 2 && data == 0) {
  1359. // HT.initFrequentTable(function(r){
  1360. // if(!r)
  1361. // alert("初始化联系人表失败");
  1362. // });
  1363. // HT.initCacheFormTable(function(r){
  1364. // if(!r)
  1365. // alert("初始化表单模板表失败");
  1366. // });
  1367. // HT.initCacheDraft(function(r){
  1368. // if(!r)
  1369. // alert("初始化草稿表失败");
  1370. // });
  1371. }
  1372. else {
  1373. alert('手机本地数据库连接失败!');
  1374. }
  1375. }
  1376. uexDataBaseMgr.openDataBase(HT.SQLiteDBName, HT.getOperationNum());
  1377. },
  1378. /**
  1379. * 关闭数据库
  1380. */
  1381. closeDataBase : function(){
  1382. uexDataBaseMgr.cbCloseDataBase = function closeDataBaseCallBack(opid, type, data){
  1383. //数据库关闭成功
  1384. if (type == 2 && data == 0) {
  1385. return;
  1386. }
  1387. else{
  1388. alert('数据库关闭失败!');
  1389. }
  1390. }
  1391. uexDataBaseMgr.closeDataBase(HT.SQLiteDBName, HT.getOperationNum());
  1392. },
  1393. /**
  1394. * 添加常用联系人表
  1395. * @param {function} callback 回调函数,回调参数 {Boolean} 执行结果 true:成功,false:失败
  1396. */
  1397. initFrequentTable : function(callback){
  1398. var result = true;
  1399. HT.isTableExist("frequent_contacts",function(r){
  1400. //创建常用联系人表
  1401. if(!r){
  1402. var sql = "create table frequent_contacts(_id integer primary key,id text,account text,name text,position text)";
  1403. HT.executeSql(sql,function(r1){
  1404. if(!r1){
  1405. //创建失败
  1406. result = false;
  1407. }
  1408. });
  1409. }
  1410. });
  1411. if(callback)callback(result);
  1412. },
  1413. /**
  1414. * 添加表单模板缓存表
  1415. * @param {function} callback 回调函数,回调参数 {Boolean} 执行结果 true:成功,false:失败
  1416. */
  1417. initCacheFormTable : function(callback){
  1418. var result = true;
  1419. HT.isTableExist("cache_forms",function(r){
  1420. //创建表单缓存表
  1421. if(!r){
  1422. var sql = "create table cache_forms(_id integer primary key,formid text,template BLOB,guid text)";
  1423. HT.executeSql(sql,function(r1){
  1424. if(!r1){
  1425. //创建失败
  1426. result = false;
  1427. }
  1428. });
  1429. }
  1430. });
  1431. if(callback)callback(result);
  1432. },
  1433. /**
  1434. * 初始化草稿表缓存表
  1435. * @param {function} callback 回调函数,回调参数 {Boolean} 执行结果 true:成功,false:失败
  1436. */
  1437. initCacheDraft : function(callback){
  1438. var result = true;
  1439. HT.isTableExist("cache_draft",function(r){
  1440. //创建表单缓存表
  1441. if(!r){
  1442. var sql = "create table cache_draft(_id integer primary key,defId text,data BLOB)";
  1443. HT.executeSql(sql,function(r1){
  1444. if(!r1){
  1445. //创建失败
  1446. result = false;
  1447. }
  1448. });
  1449. }
  1450. });
  1451. if(callback)callback(result);
  1452. },
  1453. /**
  1454. * 判断表是否存在
  1455. * @param {Object} tablename 表名
  1456. * @param {function} callback 回调函数,回调参数 {Boolean} 执行结果 true:存在,false:不存在
  1457. */
  1458. isTableExist : function(tablename,callback){
  1459. var sql = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='"+tablename+"'";
  1460. HT.selectSql(sql,function(json){
  1461. if(callback){
  1462. if (!json) {
  1463. callback(json);
  1464. }
  1465. else {
  1466. var firstItem = json[0],
  1467. result = false;
  1468. if(firstItem){
  1469. var count = firstItem["COUNT(*)"];
  1470. if(Number(count)>0)result = true;
  1471. }
  1472. callback(result);
  1473. }
  1474. }
  1475. });
  1476. },
  1477. /**
  1478. * 添加、更新常用联系人
  1479. * @param {Object} frequent 常用联系人 e.g. {"id":"10001","account":"123456","name":"张三","position":"技术部工程师"}
  1480. * @param {function} callback 回调函数,回调参数 {Boolean} 执行结果 true:成功,false:失败
  1481. */
  1482. addUpdateFrequent : function(frequent,callback){
  1483. if(!angular.isObject(frequent)){
  1484. if(callback)callback(false);
  1485. return;
  1486. }
  1487. HT.getFrequent(frequent.id,function(r){
  1488. // alert("addUpdateFrequent:"+r);
  1489. // this.openDataBase();
  1490. if (!r || r.length == 0) {
  1491. var sql = "INSERT INTO frequent_contacts (id,account,name,position) VALUES ('"+frequent.id+"','"+frequent.account+"','"+frequent.name+"','"+frequent.position+"')";
  1492. HT.executeSql(sql,callback);
  1493. }else{
  1494. var sql = "UPDATE frequent_contacts SET name='"+frequent.name+"',account='"+frequent.account+"',position='"+position+"' WHERE _id ='"+r[0]._id+"'";
  1495. HT.executeSql(sql,callback);
  1496. }
  1497. });
  1498. },
  1499. /**
  1500. * 删除常用联系人
  1501. * @param {String} id 常用联系人ID
  1502. * @param {function} callback 回调函数,回调参数 {Boolean} 执行结果 true:成功,false:失败
  1503. */
  1504. deleteFrequent : function(id,callback){
  1505. if(!id){
  1506. if(callback)callback(false);
  1507. return;
  1508. }
  1509. var sql = "delete from frequent_contacts where id = '"+id+"'";
  1510. callback(HT.executeSql(sql));
  1511. },
  1512. /**
  1513. * 清空所有常用联系人
  1514. * @param {function} callback 回调函数,回调参数 {Boolean} 执行结果 true:成功,false:失败
  1515. */
  1516. clearFrequent : function(callback){
  1517. var sql = "delete from frequent_contacts where refid='"+__curUserId+"'";
  1518. HT.executeSql(sql,callback);
  1519. },
  1520. /**
  1521. * 查询常用联系人
  1522. * @param {String} id 常用联系人ID
  1523. * @param {function} callback 回调函数,回调参数 {Object} e.g. [{"id":"10001","account":"123456","name":"张三","position":"技术部工程师"}]
  1524. */
  1525. getFrequent : function(id,callback){
  1526. if(id!=0&&!id){
  1527. return callback(false);
  1528. }
  1529. var sql = "select * from frequent_contacts where id='"+id+"' and refid='"+__curUserId+"'";
  1530. HT.selectSql(sql,callback);
  1531. },
  1532. /**
  1533. * 查询所有常用联系人
  1534. * @param {function} callback 回调函数,回调参数 {Array} e.g. [{"id":"10001","account":"123456","name":"张三","position":"技术部工程师"},...]
  1535. */
  1536. getAllFrequent : function(callback){
  1537. var sql = "select * from frequent_contacts where refid='"+__curUserId+"'";
  1538. HT.selectSql(sql,callback);
  1539. },
  1540. /**
  1541. * 添加、更新表单模板
  1542. * @param {Object} form 表单模板 e.g. {"formid":"10002","template":"","guid":""}
  1543. * @param {function} callback 回调函数,回调参数 {Boolean} 执行结果 true:成功,false:失败
  1544. */
  1545. addUpdateCacheTemplate : function(form,callback){
  1546. if(!angular.isObject(form)){
  1547. if(callback)callback(false);
  1548. return;
  1549. }
  1550. var sql = "";
  1551. HT.getCacheTemplate(form.formid,function(r){
  1552. var temp = form.template.replaceAll("\"","¥@@¥").replaceAll("'","#@@#");
  1553. if(!r||r.length==0){
  1554. sql = "INSERT INTO cache_forms (formid,template,guid) VALUES ('"+form.formid+"','"+temp+"','"+form.guid+"')";
  1555. }
  1556. else{
  1557. sql = "UPDATE cache_forms SET template='"+temp+"',guid='"+form.guid+"' WHERE _id ='"+r[0]._id+"'";
  1558. }
  1559. });
  1560. setTimeout(function(){
  1561. HT.executeSql(sql,callback);
  1562. },1000);
  1563. },
  1564. /**
  1565. * 删除表单模板
  1566. * @param {String} formid
  1567. * @param {function} callback 回调函数,回调参数{Boolean} 执行结果 true:成功,false:失败
  1568. */
  1569. deleteCacheTemplate : function(formid,callback){
  1570. if(!formid){
  1571. if(callback)callback(false);
  1572. return;
  1573. }
  1574. var sql = "delete from cache_forms where formid = '"+formid+"'";
  1575. HT.executeSql(sql,callback);
  1576. },
  1577. /**
  1578. * 删除所有表单模板
  1579. * @param {function} callback 回调函数,回调参数
  1580. */
  1581. clearCacheTemplate : function(callback){
  1582. var sql = "delete from cache_forms";
  1583. HT.executeSql(sql,callback);
  1584. },
  1585. /**
  1586. * 获取表单模板
  1587. * @param {String} formid 表单ID
  1588. * @param {function} callback 回调函数,回调参数{Object} 表单模板 e.g. [{"formid":"10002","template":"","guid":""}]
  1589. */
  1590. getCacheTemplate : function(formid,callback){
  1591. if(!formid){
  1592. return callback(false);
  1593. }
  1594. var sql = "select formid,template,_id,guid from cache_forms where formid='"+formid+"'";
  1595. return HT.selectSql(sql,callback);
  1596. },
  1597. /**
  1598. * 查询所有缓存表单
  1599. * @param {function} callback 回调函数,回调参数 {Array} e.g. [{"formid":"10002","template":"","guid":""},...]
  1600. */
  1601. getAllCacheTemplate : function(callback){
  1602. var sql = "select * from cache_forms";
  1603. HT.selectSql(sql,callback);
  1604. },
  1605. ///////////////////////////草稿开始
  1606. /**
  1607. * 添加、更新草稿
  1608. * @param {Object} draft 表单模板 e.g. {"defId":"10002","data":""}
  1609. * @param {function} callback 回调函数,回调参数 {Boolean} 执行结果 true:成功,false:失败
  1610. */
  1611. addUpdateCacheDraft : function(draft,callback){
  1612. if(!angular.isObject(draft)){
  1613. if(callback)callback(false);
  1614. return;
  1615. }
  1616. var sql = "";
  1617. try {
  1618. HT.getCacheDraft(draft.defId,function(r){
  1619. var data =JSON.stringify(draft.data);
  1620. if(!r||r.length==0){
  1621. sql = "INSERT INTO cache_draft (defId,data) VALUES ('"+draft.defId+"','"+data+"')";
  1622. }
  1623. else{
  1624. sql = "UPDATE cache_draft SET data='"+data+"' WHERE _id ='"+r[0]._id+"'";
  1625. }
  1626. if(HT.isIOS()){
  1627. HT.executeSql(sql, callback);
  1628. }
  1629. });
  1630. } catch (e) {
  1631. alert(e)
  1632. }
  1633. if(HT.isAndroid()){
  1634. window.setTimeout(function(){
  1635. HT.executeSql(sql,callback);
  1636. },1000);
  1637. }
  1638. },
  1639. /**
  1640. * 删除草稿
  1641. * @param {String} defId
  1642. * @param {function} callback 回调函数,回调参数{Boolean} 执行结果 true:成功,false:失败
  1643. */
  1644. deleteCacheDraft : function(defId,callback){
  1645. if(!defId){
  1646. if(callback)callback(false);
  1647. return;
  1648. }
  1649. var sql = "delete from cache_draft where defId = '"+defId+"'";
  1650. HT.executeSql(sql,callback);
  1651. },
  1652. /**
  1653. * 删除所有草稿
  1654. * @param {function} callback 回调函数,回调参数
  1655. */
  1656. clearCacheDraft : function(callback){
  1657. var sql = "delete from cache_draft";
  1658. HT.executeSql(sql,callback);
  1659. },
  1660. /**
  1661. * 获取草稿
  1662. * @param {String} defId 流程ID
  1663. * @param {function} callback 回调函数,
  1664. * 回调参数{Array} 草稿
  1665. * e.g. [{"defId":"10002","data":""}]
  1666. */
  1667. getCacheDraft : function(defId,callback){
  1668. if(!defId){
  1669. return callback(false);
  1670. }
  1671. var sql = "select * from cache_draft where defId='"+defId+"'";
  1672. return HT.selectSql(sql,callback);
  1673. },
  1674. /**
  1675. * 查询所有缓存草稿
  1676. * @param {function} callback 回调函数,回调参数 {Array} e.g. [{"defId":"10002","data":""},...]
  1677. */
  1678. getAllCacheDraft : function(callback){
  1679. var sql = "select * from cache_draft";
  1680. HT.selectSql(sql,callback);
  1681. },
  1682. ///////////////////////////草稿结束
  1683. /**
  1684. *是否是手机
  1685. */
  1686. isMobile:function(u){
  1687. if(!u)
  1688. u =navigator.userAgent;
  1689. if(u.indexOf('Win')>-1 || u.indexOf('x11')>-1 )
  1690. return false;
  1691. return !!u.match(/AppleWebKit.*Mobile.*/)||!!u.match(/AppleWebKit/);
  1692. },
  1693. /**
  1694. *是否是安卓手机
  1695. */
  1696. isAndroid:function(){
  1697. var u =navigator.userAgent;
  1698. if(this.isMobile(u)){
  1699. if (/android/i.test(u))
  1700. return true;
  1701. }
  1702. },
  1703. /**
  1704. *是否是IOS手机
  1705. */
  1706. isIOS:function(){
  1707. var u =navigator.userAgent;
  1708. if(this.isMobile(u)){
  1709. if (/iphone|ipad|ipod/i.test(u))
  1710. return true;
  1711. }
  1712. },
  1713. networkStatus:function(){
  1714. var status = uexDevice.getInfo('13');
  1715. if(!this.isMobile() && status){
  1716. return true;
  1717. }else{
  1718. if(status && status == -1){
  1719. this.toast('网络状态:网络不可用');
  1720. return false;
  1721. }else{
  1722. return true;
  1723. }
  1724. }
  1725. },
  1726. /**
  1727. * 判断数组中是否存在此id
  1728. * @param {Object} users
  1729. * @param {Object} id
  1730. */
  1731. isInUsers:function(users,id){
  1732. var f = false;
  1733. angular.forEach(users,function(user){
  1734. if(user.id == id){
  1735. f = true;
  1736. }
  1737. })
  1738. return f;
  1739. },
  1740. /**
  1741. * 整理选择器选中项
  1742. * @param {Object} sels
  1743. * @param {Object} choseItem
  1744. * @param {Object} pageItem
  1745. */
  1746. mergeUsers: function(sels, choseItem, pageItem){
  1747. if (sels.length > 0) {
  1748. var del_sels = [];
  1749. for (var i = 0; i < sels.length; i++) {
  1750. var u = sels[i];
  1751. var inPage = this.isInUsers(pageItem, u.id);
  1752. var inChose = this.isInUsers(choseItem, u.id);
  1753. if (inPage && !inChose) {
  1754. var j = 0;
  1755. angular.forEach(pageItem, function(c){
  1756. if (u.id == c.id) {
  1757. del_sels.push(u);
  1758. }
  1759. j++;
  1760. })
  1761. }
  1762. else
  1763. if (inPage && inChose) {
  1764. var j = 0;
  1765. angular.forEach(choseItem, function(c){
  1766. if (u.id == c.id) {
  1767. choseItem.splice(j, 1);
  1768. }
  1769. j++;
  1770. })
  1771. }
  1772. }
  1773. if (del_sels.length > 0) {
  1774. angular.forEach(del_sels, function(d){
  1775. sels.remove(d);
  1776. })
  1777. }
  1778. }
  1779. return this.mergeContacts(choseItem, sels);
  1780. },
  1781. /**
  1782. * 选中已选中的项
  1783. */
  1784. checkSelected:function(){
  1785. var userChbs = angular.element(document.getElementsByName("userChb"));
  1786. var sels = HT.getStorageJSON(HT_LS.selectorSelected);
  1787. for(var i=0;i<userChbs.length;i++){
  1788. var u = angular.element(userChbs[i]);
  1789. var isExist = this.isInUsers(sels,u.val());
  1790. if(isExist){
  1791. u.prop("checked",true);
  1792. }else{
  1793. u.prop("checked",false);
  1794. }
  1795. }
  1796. },
  1797. /**
  1798. * 得到页面中选中的项
  1799. * @param {Object} users
  1800. */
  1801. getChoseItem:function(users){
  1802. var userChbs = angular.element(document.getElementsByName("userChb"));
  1803. var choseItem = [];
  1804. for(var i=0;i<userChbs.length;i++){
  1805. var u = angular.element(userChbs[i]);
  1806. if(u.prop("checked")){
  1807. angular.forEach(users,function(o){
  1808. if(u.val()==o.id){
  1809. choseItem.push(o);
  1810. }
  1811. })
  1812. }
  1813. }
  1814. return choseItem;
  1815. },
  1816. /**
  1817. * 封装alert方法
  1818. */
  1819. alert:function(msg){
  1820. uexWindow.alert($i18n$.COMMON.WARN,msg,$i18n$.COMMON.OK);
  1821. },
  1822. /**
  1823. * 联动改变
  1824. * @param scope :当前的scope
  1825. * @param changefield :改变的值列表
  1826. * @param flag : 标记正向(true)还是反向(false)操作
  1827. */
  1828. gangedSetChange :function(scope,changefield,flag){
  1829. for(var i=0,c;c=changefield[i++];){
  1830. var t = this.parseInt(c.type),
  1831. changeType = t;
  1832. if(!flag && changeType<=6){
  1833. if((changeType%2) == 0 ){
  1834. changeType = flag?changeType :changeType -1;
  1835. }else{
  1836. changeType = flag?changeType :changeType +1
  1837. }
  1838. }
  1839. var keyAry = c.key.split(":"),
  1840. key = keyAry[0]+"_"+keyAry[1]+"_"+keyAry[2],
  1841. doms = document.getElementsByName(key);
  1842. angular.forEach(doms,function(dom){
  1843. var el = angular.element(dom),
  1844. type=el.attr("type"),
  1845. nodeName,
  1846. elm = el;
  1847. if(el)
  1848. nodeName = el[0].nodeName.toLowerCase();
  1849. switch (changeType) {
  1850. case 1://隐藏
  1851. if(type== 'checkbox' ||type == 'radio')//单选、复选
  1852. elm = el.parent().parent().parent().parent().parent();
  1853. else if(nodeName &&nodeName== "select")//下拉
  1854. elm = el.parent();
  1855. elm.addClass("uhide");
  1856. break;
  1857. case 2://非隐藏
  1858. if(type== 'checkbox' ||type == 'radio')//单选、复选
  1859. elm = el.parent().parent().parent().parent().parent();
  1860. else if(nodeName &&nodeName== "select")//下拉
  1861. elm = el.parent();
  1862. elm.removeClass("uhide");
  1863. break;
  1864. case 3://只读(不可以添加)
  1865. break;
  1866. case 4://非只读(可以添加)
  1867. break;
  1868. case 5://必填
  1869. var validate = el.attr("validate");
  1870. if(!validate){
  1871. el.attr("validate","{required:true}");
  1872. }else{
  1873. validate = eval("("+validate+")");
  1874. if(!validate.required){
  1875. validate.required = true;
  1876. el.attr("validate",JSON.stringify(validate));
  1877. }
  1878. }
  1879. break;
  1880. case 6://非必填
  1881. var validate = el.attr("validate");
  1882. if(validate){
  1883. validate = eval("("+validate+")");
  1884. if(validate.required){
  1885. delete validate.required;
  1886. el.attr("validate",JSON.stringify(validate));
  1887. }
  1888. }
  1889. break;
  1890. case 7://置空
  1891. var ngModel = el.attr("ng-model");
  1892. var s = '(scope.' + ngModel + '="")';
  1893. try{
  1894. eval(s);
  1895. }catch(e){}
  1896. break;
  1897. case 8://级联
  1898. break;
  1899. default:
  1900. break;
  1901. }
  1902. //再去验证下当前属性
  1903. scope.valid({element:el});
  1904. });
  1905. }
  1906. },
  1907. /**
  1908. * 联动设置
  1909. * @param conf
  1910. * scope :当前的scope
  1911. * gangedSet:联动设置
  1912. */
  1913. gangedSet:function(conf){
  1914. var scope = conf.scope,
  1915. gangedSet= conf.gangedSet;
  1916. var $changeNoChoise= [];
  1917. for(var i=0,c;c=gangedSet[i++];){
  1918. var v = c.value,
  1919. name = c.name;
  1920. scope.$watch(c.key,function(newVal,oldVal){
  1921. if(newVal ==oldVal )
  1922. return;
  1923. //找到触发当前节点的
  1924. var doms = document.getElementsByName(name),
  1925. dom= doms.length >0?doms[0]:false;
  1926. if(!dom)
  1927. return;
  1928. var el = angular.element(dom),
  1929. type = el.attr("type");
  1930. //还原修改的状态
  1931. HT.gangedSetChange(scope,$changeNoChoise,false);
  1932. $changeNoChoise = [];
  1933. if(type == "checkbox"){//checkbox是值多值的,改变选择的
  1934. if(HT.isEmpty(newVal))
  1935. return;
  1936. for(var j=0,m;m=v[j++];){
  1937. var changefield = m.changefield,
  1938. changeVal = m.value,
  1939. newValAry = newVal.split(",");
  1940. if(newValAry.indexOf(m.value) > -1){//包含的
  1941. HT.gangedSetChange(scope,changefield,true);
  1942. //记录改变的,还原修改的
  1943. $changeNoChoise = $changeNoChoise.concat(changefield);
  1944. }
  1945. }
  1946. }else{
  1947. for(var j=0,m;m=v[j++];){
  1948. var changefield = m.changefield;
  1949. if(newVal == m.value){
  1950. HT.gangedSetChange(scope,changefield,true);
  1951. //记录改变的,还原修改的
  1952. $changeNoChoise = $changeNoChoise.concat(changefield);
  1953. }
  1954. }
  1955. }
  1956. });
  1957. }
  1958. // var gangedSet= conf.gangedSet;
  1959. // var $changeNoChoise= [];
  1960. // for(var i=0,c;c=gangedSet[i++];){
  1961. // var doms = document.getElementsByName(c.key);
  1962. // angular.forEach(doms,function(dom){
  1963. // var el = angular.element(dom);
  1964. // el.attr("ganged-set-bind",JSON.stringify(c.value));
  1965. //
  1966. // });
  1967. // }
  1968. },
  1969. /**
  1970. * 显示错误提示信息
  1971. * @param {Object} baseService
  1972. * @param {Object} msg
  1973. */
  1974. showmsg:function(baseService,msg,scopeId){
  1975. if(!baseService){
  1976. if(!msg) msg=HT.getStorage("wrongmsg",true);
  1977. HT.getScope(scopeId).showWrongMsg(msg);
  1978. return;
  1979. }
  1980. baseService.openDialog({
  1981. title: $i18n$.COMMON.WARN,
  1982. html: msg,
  1983. digest:true,
  1984. buttons: [{
  1985. label: $i18n$.COMMON.CANCEL,
  1986. callback: function(){
  1987. baseService.closeDialog();
  1988. }
  1989. }]
  1990. })
  1991. },
  1992. /**
  1993. * 为父窗口添加模态层
  1994. */
  1995. addModalToParent:function(){
  1996. try {
  1997. uexWindow.evaluateScript("", 0, "HT.addModal(null,0.5)");
  1998. }
  1999. catch (e) {
  2000. }
  2001. },
  2002. /**
  2003. * 取消父窗口的模态层
  2004. */
  2005. hideModalFromParent:function(){
  2006. try {
  2007. uexWindow.evaluateScript("", 0, "HT.hideModal()");
  2008. }
  2009. catch (e) {
  2010. }
  2011. },
  2012. /**
  2013. * 添加模态层
  2014. * @param {Object} height
  2015. */
  2016. addModal:function(height,opacity){
  2017. if(document.querySelectorAll(".ng-modal,.__modal").length>0) return;
  2018. height=height||"100%";
  2019. opacity=opacity||"0";
  2020. var div='<div class="__modal" style="background-color:#333;top: 0;left: 0;position: absolute; width: 100%; height: '+height+'; z-index: 10001; opacity: '+opacity+'; "></div>';
  2021. HT.$(document.body).append(div);
  2022. },
  2023. /**
  2024. * 关闭模态层
  2025. */
  2026. hideModal:function(){
  2027. HT.$(document.querySelectorAll(".__modal")).remove();
  2028. },
  2029. /**
  2030. * 滑动窗口的事件
  2031. */
  2032. touchmoveHandler: function(e){
  2033. e.preventDefault();
  2034. //滑动过程中,失去焦点
  2035. document.activeElement.blur();
  2036. },
  2037. /**
  2038. * 删除可滑动的事件
  2039. */
  2040. delTouchmove:function(){
  2041. document.addEventListener('touchmove',HT.touchmoveHandler, false);
  2042. },
  2043. /**
  2044. * 恢复可滑动事件
  2045. */
  2046. addTouchmove:function(){
  2047. document.removeEventListener('touchmove',HT.touchmoveHandler, false);
  2048. },
  2049. // 设置选择器导航宽度
  2050. setNaviWidth:function(last,navis, scope){
  2051. var wh = document.body.offsetWidth;
  2052. var fz = this.parseInt(window.getComputedStyle($$("navi"),null).fontSize);
  2053. var ls = last.name.length;
  2054. var s = this.parseInt(wh/fz);
  2055. var ns = 0;
  2056. if(navis&&navis.length>0){
  2057. angular.forEach(navis,function(n){
  2058. ns += n.name.length;
  2059. })
  2060. }
  2061. var ex = s - 3 - ls - ns;
  2062. scope.midNavi = ex;
  2063. angular.element($$("midNavi")).css("max-width",ex+"em");
  2064. },
  2065. // 设置选择器导航显示
  2066. setSeletorNavi:function(o,isNavi,head,scope){
  2067. if (o.id != 0 && isNavi != 1) {
  2068. var navis = scope.navis;
  2069. var navi = {
  2070. id: o.id,
  2071. name: o.name
  2072. };
  2073. var lastNavi = scope.lastNavi;
  2074. if (lastNavi != null) {
  2075. navis.push(lastNavi);
  2076. scope.prevNavi = lastNavi;
  2077. }
  2078. else {
  2079. scope.prevNavi = head;
  2080. }
  2081. scope.navis = navis;
  2082. scope.lastNavi = navi;
  2083. HT.setNaviWidth(navi, navis, scope);
  2084. }
  2085. else
  2086. if (isNavi && o.id == 0) {
  2087. scope.navis = [];
  2088. scope.lastNavi = null;
  2089. scope.midNavi = -1000;
  2090. }
  2091. else {
  2092. if (isNavi && isNavi == 1) {
  2093. var lastNavi;
  2094. var navis = scope.navis;
  2095. var flag = true;
  2096. var total = navis.length;
  2097. var i = total - 1;
  2098. for (; i >= 0; i--) {
  2099. if (flag) {
  2100. if (navis[i].id == o.id) {
  2101. flag = false;
  2102. if (i < total) {
  2103. lastNavi = navis[i];
  2104. navis.splice(i, 1);
  2105. if (i == 0) {
  2106. scope.prevNavi = head;
  2107. }
  2108. else {
  2109. scope.prevNavi = navis[i - 1];
  2110. }
  2111. }
  2112. }
  2113. else {
  2114. navis.splice(i, 1);
  2115. }
  2116. }
  2117. }
  2118. scope.navis = navis;
  2119. scope.lastNavi = lastNavi;
  2120. HT.setNaviWidth(lastNavi, navis, scope);
  2121. }
  2122. }
  2123. },
  2124. contactSelUser:function(){
  2125. var multi = HT.getStorage("isMulti");
  2126. var contactCur = HT.getStorage("contactCur");
  2127. if(multi!="1"){
  2128. if(contactCur=="all"){
  2129. uexWindow.evaluatePopoverScript("contact","contactAll","selectedUsers()");
  2130. }else if(contactCur=="common"){
  2131. uexWindow.evaluatePopoverScript("contact","contactCommon","selectedUsers()");
  2132. }
  2133. }else{
  2134. uexWindow.evaluatePopoverScript("contact","contactCommon","selectedUsers()");
  2135. uexWindow.evaluatePopoverScript("contact","contactAll","selectedUsers()");
  2136. }
  2137. },
  2138. toTaskInfo:function(baseService,taskid){
  2139. baseService.post(__ctx+'/mobile/bpm/bpmMobileTask/isAllowMobile.ht',
  2140. {taskId:taskid},function(data){
  2141. if(!data.success){
  2142. HT.alert(data.msg);
  2143. uexWindow.evaluatePopoverScript("index","mytask","HT.reload();");
  2144. uexWindow.evaluateScript("index",0,"pendingCount()");
  2145. }else{
  2146. if(data.type == 1){
  2147. HT.alert(data.msg);
  2148. }else{
  2149. HT.setStorage("formFlowType",1);
  2150. HT.setStorage("taskId",taskid);
  2151. HT.goToHtml("taskInfo");
  2152. }
  2153. }
  2154. });
  2155. },
  2156. /**
  2157. * 向上回溯elm
  2158. * @param {Object} cur 当前页面elm对象
  2159. * @param {Object} tar 目标elm,字符串
  2160. * @param {Object} type 1:id;2:class;3:name
  2161. * @param {Object} cb 回调方法
  2162. */
  2163. findPreElm:function(cur, tar, type, cb){
  2164. var pat = cur.parentElement;
  2165. if(!pat)return;
  2166. var name = "";
  2167. switch (type) {
  2168. case 1: // id
  2169. name = pat.id;
  2170. break;
  2171. case 2: // class
  2172. name = pat.className;
  2173. break;
  2174. case 3: // name
  2175. name = pat.nodeName;
  2176. break;
  2177. default:
  2178. break;
  2179. }
  2180. if(name.indexOf(tar)!=-1){
  2181. cb(cur);
  2182. }else{
  2183. HT.findPreElm(pat,tar,type,cb);
  2184. }
  2185. },
  2186. /**
  2187. * 第一次打开index的时候 就直接打开 我的代办、我的发起、我的承接页面,这个时候让这三个浮动窗口一开始占满屏幕(为了解决在某些手机中,在有footer的情况下 无法触发上拉刷新的事件。并且可以提高应用的效率,因为第一次打开我的发起、我的承接的时候 并没有请求数据。)
  2188. */
  2189. firstOpenIndexPage:function(){
  2190. HT.clearStorage("__firstToMyLaunch");
  2191. HT.clearStorage("__firstToMyUndertake");
  2192. HT.clearStorage("__myUndertakeSearched");
  2193. HT.clearStorage("__myLaunchSearched");
  2194. HT.setStorage("__firstToMyLaunch","true");
  2195. HT.setStorage("__firstToMyUndertake","true");
  2196. // HT.openPopFrame('more',true);
  2197. // HT.openPopFrame('contactCommon',true);
  2198. HT.openPopFrame('myUndertake');
  2199. HT.openPopFrame('myLaunch');
  2200. HT.openPopFrame('mytask');
  2201. },
  2202. /**
  2203. * 在这里做了一个延迟,等浮动窗口加载完成之后再去渲染index中的footer;
  2204. * @param {Object} $scope
  2205. * @param {Object} $compile
  2206. */
  2207. addIndexFooter:function($scope,$compile){
  2208. window.setTimeout(function(){
  2209. var footer=angular.element('<div id="footer" class="uf t-gra ub t-wh c-wh footer" > <div class="ub-tccc ub ub-f1" ontouchstart="zy_touch(\'\')" ng-click="showSearch(this,\'mytask\',\'TITLE.MY_TODO\');"> <input class="uhide" type="radio" name="tabSwitch" checked="true" id="ifooter_mytask"> <div class="ub-f1 ub ub-ver tab-act mar-t043 t-gra"> <span class="badge" ng-bind="pendingCount||\'\'"></span> <span class="badgenum" ng-bind="pendingCount||\'\'"></span> <div class="tc icon-house"> </div> <div class="uinn-a13 tx-c act-col icon-check-green mar-b0375 fs0625" ng-bind="\'MENU.TODO\'|translate"> </div> </div> </div> <div class="ub-tccc ub ub-f1" ontouchstart="zy_touch(\'\')" ng-click="showSearch(this,\'myLaunch\',\'TITLE.BPM_HISTORY\');"> <input class="uhide" type="radio" name="tabSwitch" id="ifooter_myLaunch"> <div class="ub-f1 ub ub-ver tab-act mar-t043 t-gra" > <div class=" tc icon-clock"> </div> <div class="uinn-a13 tx-c act-col icon-check-green mar-b0375 fs0625" ng-bind="\'MENU.HISTORY\'|translate"> </div> </div> </div> <div class="ub-tccc ub ub-f1" ontouchstart="zy_touch(\'\')" ng-click="showSearch(this,\'contactCommon\',\'MENU.CONTACT\');"> <input class="uhide" type="radio" name="tabSwitch" id="ifooter_contactCommon"> <div class="ub-f1 ub ub-ver tab-act mar-t043 t-gra" > <div class="tc icon-user4"> </div> <div class="uinn-a13 tx-c act-col icon-check-green mar-b0375 fs0625" ng-bind="\'MENU.CONTACT\'|translate"> </div> </div> </div> <div class="ub-tccc ub ub-f1" ontouchstart="zy_touch(\'\')" ng-click="showSearch(this,\'more\',\'MENU.MORE\');"> <input class="uhide" type="radio" name="tabSwitch" id="ifooter_more"> <div class="ub-f1 ub ub-ver tab-act mar-t043 t-gra" > <div class="tc icon-ellipsis"> </div> <div class="uinn-a13 tx-c act-col icon-check-green mar-b0375 fs0625" ng-bind="\'MENU.MORE\'|translate"> </div> </div> </div> </div>');
  2210. HT.$($$("page_0")).append(footer);
  2211. $compile(footer)($scope);
  2212. var footerHeight=parseInt(window.getComputedStyle(this.$$('footer'), null).height);
  2213. HT.pages['mytask'].h-=footerHeight;
  2214. HT.pages['myLaunch'].h-=footerHeight;
  2215. HT.pages['myUndertake'].h-=footerHeight;
  2216. // HT.pages['contactCommon'].h-=footerHeight;
  2217. // HT.pages['more'].h-=footerHeight;
  2218. uexWindow.setPopoverFrame("myUndertake", 0, 0, 0, 0);
  2219. uexWindow.setPopoverFrame("myLaunch", 0, 0, 0, 0);
  2220. // uexWindow.setPopoverFrame("contactCommon", 0, HT.pages['contactCommon'].y, HT.pages['contactCommon'].w, HT.pages['contactCommon'].h);
  2221. // uexWindow.setPopoverFrame("myUndertake", 0, HT.pages['myUndertake'].y, HT.pages['myUndertake'].w, HT.pages['myUndertake'].h);
  2222. // uexWindow.setPopoverFrame("myLaunch", 0, HT.pages['myLaunch'].y, HT.pages['myLaunch'].w, HT.pages['myLaunch'].h);
  2223. uexWindow.setPopoverFrame("mytask", 0, HT.pages['mytask'].y, HT.pages['mytask'].w, HT.pages['mytask'].h);
  2224. /**
  2225. * 解决代办数字显示的问题
  2226. */
  2227. $$("ifooter_mytask").checked=false;
  2228. $$("ifooter_mytask").checked=true;
  2229. var v=HT.getStorage("__voteAgree",true);
  2230. if(v=="17"||v=="42"){
  2231. $$("ifooter_myLaunch").checked=true;
  2232. }
  2233. $scope.$digest();
  2234. }, 1100);
  2235. },
  2236. userInfo:function(baseService,info,type){
  2237. var u = {};
  2238. if(type=="formhistory"){
  2239. info={id:info.exeUserId}
  2240. }
  2241. var btnAdd = {
  2242. label:$i18n$.CONTACT.ADD_TO_COMMON,// "添加到常用联系人"
  2243. // backcolor: "#51aeec",
  2244. // forecolor: "#fff",
  2245. // bordercolor: "#226ee5",
  2246. callback: function(){
  2247. var us=[];
  2248. us.push(u);
  2249. HT.setStorageJSON(HT_LS.selectorSelected,us);
  2250. HT.addContact(function(){
  2251. uexWindow.evaluatePopoverScript("index","contactCommon","HT.reload()");
  2252. HT.toast($i18n$.COMMON.ADD_SUCCESS);//"添加成功"
  2253. baseService.closeDialog();
  2254. });
  2255. }
  2256. }
  2257. var btnClose = {
  2258. label: $i18n$.COMMON.CANCEL,//"取消"
  2259. callback: function(){
  2260. baseService.closeDialog();
  2261. }
  2262. }
  2263. var showdialog = function(u,buttons,digest){
  2264. var html = '<ul ontouchstart="zy_touch()" class="ub ubb b-ddd t-bla ub-ac lis h275"><li class="ut-s t-111 f-sz10625">工号</li><li class="ub-f1 ulev-app1 t-888 t-right">' + u.account +
  2265. '</li></ul><ul ontouchstart="zy_touch()" class=" ub ubb b-ddd t-bla ub-ac lis h275"><li class="ut-s t-111 f-sz10625">姓名</li><li class="ub-f1 ulev-app1 t-888 t-right">' +
  2266. u.name +
  2267. '</li></ul>' +
  2268. '<ul ontouchstart="zy_touch()" class=" ub t-bla ub-ac lis h275"><li class="ut-s t-111 f-sz10625">岗位</li><li class="ub-f1 ulev-app1 t-888 mar-l0625 ">' +
  2269. u.position +
  2270. '</li></ul>';
  2271. baseService.openDialog({
  2272. title: $i18n$.CONTACT.CONTACT_INFO,//"联系人信息"
  2273. html: html,
  2274. digest:digest,
  2275. buttons: buttons
  2276. });
  2277. }
  2278. HT.getFrequent(info.id,function(rs){
  2279. var buttons = [];
  2280. if(rs&&rs.length>0){
  2281. u = rs[0];
  2282. buttons.push(btnClose);
  2283. showdialog(u,buttons,true);
  2284. }else{
  2285. var url = __ctx+'/mobile/system/user/get.ht';
  2286. baseService.post(url,{userId:info.id},function(data){
  2287. u = {
  2288. id:data.user.userId,
  2289. name:data.user.fullname,
  2290. account:data.user.account,
  2291. position:data.user.posname!=null?data.user.posname:""
  2292. }
  2293. buttons.push(btnAdd);
  2294. buttons.push(btnClose);
  2295. showdialog(u,buttons);
  2296. });
  2297. }
  2298. });
  2299. }
  2300. }
  2301. })();
  2302. /**
  2303. *
  2304. * @param {Object}
  2305. * formatStr 时间对象的格式化
  2306. *
  2307. */
  2308. Date.prototype.Format = function (formatStr) {
  2309. var str = formatStr;
  2310. var Week = ['日', '一', '二', '三', '四', '五', '六'];
  2311. str = str.replace(/yyyy|YYYY/, this.getFullYear());
  2312. str = str.replace(/yy|YY/, (this.getYear() % 100) > 9 ? (this.getYear() % 100).toString() : '0' + (this.getYear() % 100));
  2313. str = str.replace(/MM/, (this.getMonth() + 1) > 9 ? (this.getMonth() + 1).toString() : '0' + (this.getMonth() + 1));
  2314. str = str.replace(/M/g, (this.getMonth() + 1));
  2315. str = str.replace(/w|W/g, Week[this.getDay()]);
  2316. str = str.replace(/dd|DD/, this.getDate() > 9 ? this.getDate().toString() : '0' + this.getDate());
  2317. str = str.replace(/d|D/g, this.getDate());
  2318. str = str.replace(/hh|HH/, this.getHours() > 9 ? this.getHours().toString() : '0' + this.getHours());
  2319. str = str.replace(/h|H/g, this.getHours());
  2320. str = str.replace(/mm/, this.getMinutes() > 9 ? this.getMinutes().toString() : '0' + this.getMinutes());
  2321. str = str.replace(/m/g, this.getMinutes());
  2322. str = str.replace(/ss|SS/, this.getSeconds() > 9 ? this.getSeconds().toString() : '0' + this.getSeconds());
  2323. str = str.replace(/s|S/g, this.getSeconds());
  2324. return str;
  2325. };
  2326. /**
  2327. * 检查指定的对象是否存在数组中
  2328. *
  2329. * @param {Object}
  2330. * o 检查的对象
  2331. * @param {Number}
  2332. * from (可选)指定要开始的索引
  2333. * @return {Number} 数组的索引(或-1,表示未找到)
  2334. */
  2335. Array.prototype.indexOf = function (o, from) {
  2336. var len = this.length;
  2337. from = from || 0;
  2338. from += (from < 0) ? len : 0;
  2339. for (; from < len; ++from) {
  2340. if (this[from] === o) {
  2341. return from;
  2342. }
  2343. }
  2344. }
  2345. /**
  2346. * 删除数组中指定的对象。如果没找到该对象没有任何反应
  2347. *
  2348. * @param {Object}
  2349. * o 要删除的对象
  2350. * @return {Array} 这个数组
  2351. */
  2352. Array.prototype.remove = function (o) {
  2353. var i = this.indexOf(o);
  2354. if (i != -1) { this.splice(i, 1);
  2355. }
  2356. return this;
  2357. };
  2358. /**
  2359. * 字符串去除左右空格
  2360. */
  2361. String.prototype.trim=function(){
  2362. return this.replace(/(^\s*)|(\s*$)/g,"");
  2363. }
  2364. /**
  2365. * 字符串替换
  2366. *
  2367. * @param s1
  2368. * 需要替换的字符
  2369. * @param s2
  2370. * 替换的字符。
  2371. * @returns
  2372. */
  2373. String.prototype.replaceAll = function(s1, s2) {
  2374. return this.replace(new RegExp(s1, "gm"), s2);
  2375. };
  2376. /**
  2377. * var str=String.format("姓名:{0},性别:{1}","ray","男");
  2378. * alert(str);
  2379. * @returns
  2380. */
  2381. String.format=function(){
  2382. var template=arguments[0];
  2383. var args=arguments;
  2384. var str=template.replace(/\{(\d+)\}/g,function(m,i){
  2385. var k=parseInt(i)+1;
  2386. return args[k];
  2387. });
  2388. return str;
  2389. };