var __UserId ;
var __ActServUrl = null;
var IsRootContextPath = true; //表明应用是否部署在服务器(如tomcat)的根下

  var v_Text = 1 ; // VIEWID="1" SNAME="Text"           
  var v_Select = 2 ; //VIEWID="2" SNAME="Select"         
  var v_RadioSelect = 3;// VIEWID="3" SNAME="RadioSelect"  
  var v_DateSelect = 4;// VIEWID="4" SNAME="DateSelect"     
  var v_BigText = 5; // VIEWID="5" SNAME="BigText"      
  var v_AutoComplete = 6 ;// VIEWID="6" SNAME="AutoComplete"
  var v_DateTimeSelect = 7; 
  var v_TimeSelect = 8 ;
  var v_CheckSelect = 9 ;

  var D_Integer = 1;
  var D_String = 2;
  var D_Float = 3;
  var D_DateTime = 4;
  var D_Date = 5;
  var D_Time = 6;
  var D_Set = 7;

  var xp_ParaRowData = 'ParasInfo>ParaRowData';
  var xp_ParaRow = 'ParasInfo>ParaRowData>ROW';
  var xp_ParaRowTmpl = xp_ParaRow+"[@PARAID={PARAID}]";
  var xp_ViewRow = 'ParasInfo>ViewRowData>ROW';
  var xp_ViewRowTmpl = xp_ViewRow+"[@VIEWID={VIEWID}]";
  var xp_ParaOptRow = 'ParasInfo>ParaOptRowData>ROW';
  var xp_ParaOptRowTmpl = xp_ParaOptRow+"[@OPTID={OPTID}]";
  var xp_UnitRows = 'ParasInfo>UnitRowData';
  var xp_UnitRow = 'ParasInfo>UnitRowData>ROW';
  var xp_UnitRowTmpl = xp_UnitRow+"[@UID={UNITID}]";
  var xp_UCRows = 'ParasInfo>UCRowData';
  var xp_AuditDefRow = "ParasInfo>AuditDefRowData>information";
  var xp_AuditDefRowTmpl = "ParasInfo>AuditDefRowData>information[@id='{auditDefId}']";
  var xp_AuditRelysCatTmpl = "ParasInfo>AuditRelys>Row[@CatId='{CatId}']";
  var xp_AuditRelysParaTmpl = "ParasInfo>AuditRelys>Row[@ParaId='{ParaId}']";
  var xp_AuditRelysFullParaTmpl = "ParasInfo>AuditRelys>Row[@FullParaId='{FullParaId}']";
  var xp_AuditInfoRowTmpl0 = "AuditInfo>AuditInfoRow"; //简单的情况,不考虑DatId
  var xp_AuditInfoRowTmpl = "AuditInfo>AuditInfoRow[@DatId='{DatId}']"; 
  var xp_RangInfoRow = "ParasInfo>ParaRangRowData>ROW";
  var xp_RangInfoRowTmpl = xp_RangInfoRow+"[@PARAID={PARAID}]"
  
  var R_OP_Run = "Run"; //"执行"操作
  var R_OP_Read = "Read"; //读取
  var R_OP_Add = "Add"; //"增加"操作
  var R_OP_Del = "Del"; //"删除"操作
  var R_OP_Edit = "Edit"; //"修改"操作
  var R_OP_Maint = "Maint"; //维护(包括增,删,改,查)
  var R_OP_Audit = "Audit"; //审核,核查数据

  var XP_RowData = "DATAPACKET>ROWDATA";
  var XP_Row = "DATAPACKET>ROWDATA>ROW";
  var XP_FIELDS = "DATAPACKET>METADATA>FIELDS";
  var XP_MetaData = "DATAPACKET>METADATA";
  var XP_Paras = "DATAPACKET>METADATA>PARAMS";
  var XP_FIELD = "DATAPACKET>METADATA>FIELDS>FIELD";
  var CDS_RowState = "RowState";
  var CDS_addMark ="4";
  var CDS_delMark ="2";
  var CDS_modiMark0="1";
  var CDS_modiMark1="8";

  var CC={
    Test1 : 'test1'
  }

function buildServUrl(servletName){
  var contextPath = "/"; //先假设应用部署在根下
  if (!IsRootContextPath){
    var ss = location.pathname.split('/');
    if (ss[0]=='') //说明pathname以/开始.
      contextPath = '/'+ss[1]+'/';
    else
      contextPath = '/'+ss[0]+'/';
  }
  var servName = (servletName)?servletName:'doAction';
 // alert( contextPath + servName);
  return contextPath + servName;
}

function getActServUrl(){
  if (!__ActServUrl) {
    __ActServUrl = buildServUrl('doAction');
//    alert(__ActServUrl);
  }
  return __ActServUrl;
}

//alert(getActUrl('Action=doLogin&username=dzy'));
function getActUrl(paras) {
  sRpcUrl = getActServUrl();
  if (paras)
   sRpcUrl += '?'+paras;
  return sRpcUrl;
}

//alert(getActionUrl('doLogin','username=dzy'));
function getActionUrl(actionName,paras){
  var allParas = 'Action='+actionName;
  if (paras && paras.length>0) 
    allParas += '&'+paras;
  return getActUrl(allParas);
}

function WMsg(s) {window.status = s;}

Date.patterns = {
    ISO8601Long:"Y-m-d H:i:s",
    ISO8601Short:"Y-m-d",
    ShortDate: "n/j/Y",
    LongDate: "l, F d, Y",
    FullDateTime: "l, F d, Y g:i:s A",
    MonthDay: "F d",
    ShortTime: "g:i A",
    LongTime: "g:i:s A",
    Time: "H:i:s",
    SortableDateTime: "Y-m-d\\TH:i:s",
    UniversalSortableDateTime: "Y-m-d H:i:sO",
    YearMonth: "F, Y"
};

function getCurTimeStamp(){
  var dt = new Date();
  return dt.format(Date.patterns.ISO8601Long);
}

//传入一个包括Option数据的字符串,如:var s="12,动物;13,植物;15,其它";   
//setSelOptions(oSel,s,';',',');
function setSelOptions(selObj,optStr,rowSp,colSp) { 
  selObj.options.length = 0;
  var ssRow = optStr.split(rowSp);
  var ssCol;
  
  if (typeof(jQuery)!='undefined') {
    var buf = [];
    var optTmp ="<option value='{val}'>{text}</option>";
    for (var r = 0;r<ssRow.length;r++) {
      ssCol = ssRow[r].split(colSp);
      if (ssCol.length<2) continue;
      buf.push(optTmp.replace('{val}',ssCol[0]).replace('{text}',ssCol[1]) );
    }
    jQuery(selObj).append(buf.join(""));
  } else { //以下的方式好像在firefox下不灵.
    var jSelObj = $(selObj);
    for (var r = 0;r<ssRow.length;r++) {
      ssCol = ssRow[r].split(colSp);
      if (ssCol.length<2) continue;
      var oOption =$(document.createElement("OPTION"));
      oOption.val(ssCol[0]);
      oOption.text(ssCol[1]);
      jSelObj.append(oOption);
    }
  }
}

function setSelOptsEx(selObj,optContent,selVal){
  if ($(selObj).length>0) $(selObj)[0].options.length = 0;
  var buf = [];
  var optTmp ="<option value='{val}' {selected}>{text}</option>";
  var ssRow = null;
  if (isArray(optContent)) {
    ssRow = optContent;
  } else {
    ssRow = optContent.split(';');
    $(ssRow).each(function(i,n){n=n.split(',')});
  }
  //selObj.options.length = 0;
  for (var r = 0;r<ssRow.length;r++) {
    ssCol = ssRow[r];
    if (ssCol.length<2) continue;
    buf.push(optTmp.replace('{val}',ssCol[0]).replace('{text}',ssCol[1]).replace('{selected}', (ssCol[0]==selVal)?"selected":"" )  );
  }  
  jQuery(selObj).append(buf.join(""));
}

function setSelectIndex(selObj,selVal) {
  if (selObj==null) return;
  for (var r=0;r<selObj.options.length;r++) {
    if (selObj.options[r].value == selVal) {
      selObj.selectedIndex = r;
      return;
    }
  }
}    

//optContent为一个JSON表达式：一个二维数组，第一维是各个Option，第二维是Option的二项数据，此数据的生成请参考
//E:\mw3\ws1\web1exp\src\mochasoft\mps\webexp\rpcser\DemoCDSMaint.java.getComboxDatSourceStr

  //var group = document.createElement('OPTGROUP');
   //    group.label = 'group 2-' + i;
    //   slt2.appendChild(group);

//[["1","-1",null],["1","2","Allergy and Immunology"],["1","3","Anesthesiology"],["2","1","General Interest"]]
function setSelOpts(selObj,optContent,bGrp) {
  selObj.options.length = 0;
  var ssRow ;
  if (typeof(optContent) == "string")
    ssRow = eval(optContent);
  else if (typeof(optContent) == "object")
    ssRow = optContent;
  if (ssRow.length==0) return ;
  var ssCol=ssRow[0];
  var isGrp = bGrp && (ssCol.length > 2);
  var mGrp = {};
  var curGrp = null;
  var group = null;
  
  var jSelObj = $(selObj);
  for (var r = 0;r<ssRow.length;r++) {
    ssCol = ssRow[r]; //.split(colSp);
      if (isGrp){
        curGrp ='g_'+ssCol[0];
        if (!eval('mGrp.'+curGrp)){
          group = document.createElement('OPTGROUP');
          group.label = ssCol[0];
          selObj.appendChild(group);
          eval('mGrp.'+curGrp+'=1'); //eval('this.Code_TR.'+ParaCode+'='+i);
        }
      }  
    if (ssCol.length<2) continue;
    var oOption = $(document.createElement("OPTION"));
    oOption.val( (isGrp)?ssCol[1]:ssCol[0] );
    oOption.text(  (isGrp)?ssCol[2]:ssCol[1] );
    jSelObj.append(oOption);
  }
  return ssRow;
}


function GetCookieVal(offset){
  var endstr = document.cookie.indexOf (";", offset);
  if (endstr == -1)
  endstr = document.cookie.length;
  return unescape(document.cookie.substring(offset, endstr));
}

function SetCookie(name, value){
  var expdate = new Date();
  var argv = SetCookie.arguments;
  var argc = SetCookie.arguments.length;
  var expires = (argc > 2) ? argv[2] : null;
  var path = (argc > 3) ? argv[3] : null;
  var domain = (argc > 4) ? argv[4] : null;
  var secure = (argc > 5) ? argv[5] : false;
  if(expires!=null) expdate.setTime(expdate.getTime() + ( expires * 1000 ));
  document.cookie = name + "=" + escape (value) +((expires == null) ? "" : ("; expires="+ expdate.toGMTString()))
  +((path == null) ? "" : ("; path=" + path)) +((domain == null) ? "" : ("; domain=" + domain))
  +((secure == true) ? "; secure" : "");
}

function DelCookie(name){
  var exp = new Date();
  exp.setTime (exp.getTime() - 1);
  var cval = GetCookie (name);
  document.cookie = name + "=" + cval + "; expires="+ exp.toGMTString();
}
function GetCookie(name){
  var arg = name + "=";
  var alen = arg.length;
  var clen = document.cookie.length;
  var i = 0;
  while (i < clen)  {
    var j = i + alen;
    if (document.cookie.substring(i, j) == arg)
    return GetCookieVal (j);
    i = document.cookie.indexOf(" ", i) + 1;
    if (i == 0) break;
  }
  return null;
}

function openWhatsThis(elementId) {
  Ext.getDom(elementId).style.display="block";
}

function closeWhatsThis(elementId) {
  Ext.getDom(elementId).style.display="none";
}

function toggleWhatsThis(elementId) {
  var o =  Ext.getDom(elementId);
  o.style.display=(o.style.display == "block") ? "none":"block";
}

String.prototype.replaceAll  = function(s1,s2){    
  return this.replace(new RegExp(s1,"gm"),s2);    
} 

//支持查找以忽略大小写的方式查找字符串
//var test = "absnegKIugfkalg"; alert(test.indexOf("kiu",false));
String.prototype.idxOf = function(f,m){ //如果侍查找项是 ? 时,会出错,所以不能用它替换原装的indexOf
  var mm = (m == false) ? "i":"";
  var re = eval('/'+ f +'/'+mm);
  var rt = this.match(re);
  return (rt == null) ? -1:rt.index;
}

Array.indexOf || (Array.prototype.indexOf = function(v){
    for(var i = this.length; i-- && this[i] !== v;);
    return i;
  }); 
  
//兼容IE和FireFox的一些公共代码
function getDocByXMLStr(sXML){
  var doc;
  if ($.browser.msie){
    doc = new ActiveXObject("Msxml2.DOMDocument");
    doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
    doc.loadXML(sXML);
  }else if ($.browser.mozilla) {
    var oParser=new DOMParser();
    doc=oParser.parseFromString(sXML,"text/xml");
  } else {
    var oParser=new DOMParser();
    doc=oParser.parseFromString(sXML,"text/xml");
  }
  return doc;
}
  
function getElementXMLStr(el){
  var sXML;
  if (!el) return ;
  if ($.browser.msie){
    sXML= el.xml;
  } else {
    sXML= new XMLSerializer().serializeToString(el,"text/xml");
  }
  return sXML;
}

function getJFldEl(doc, fldName){
  return $(XP_FIELD+"[@attrname='"+fldName+"']",doc); 
}

function getJParaElInFldEl(fldEl,paName){
  return $("PARAM[@Name='"+paName+"']",fldEl);
}

function getFSO(showMsg){
  if (typeof(showMsg) =='undefined') showMsg = true;
  var fso=null;
  try {
    fso=new ActiveXObject('Scripting.FileSystemObject');
  }catch(e) {
  }
  if (fso==null && showMsg) {
    alert('未能正确创建文件操作对象,可能是安全设置问题,请与管理员联系.') 
  }
  return fso;
}

function decodeJSON(src){
  return eval("(" + src + ")");
}

function getAttrCount(o){
  var iCount = 0;
  for (var a in o) iCount++;
  return iCount;
}

function clearObjProps(o){
  for(var a in o) delete o[a];//=undefined; 
}
  
function isArray(o){
  return typeof(o)=='object' && o.constructor==Array; 
}

function isInt(s){
  var tmp = parseInt(s);
  if (isNaN(tmp)) return false;
  return ''+tmp==s;
}

function isFloat(s){
  var tmp = parseFloat(s);
  if (isNaN(tmp)) return false;
  return ''+tmp==s;
}

/*   
  var sw = new stopWatcher();
  sw.start();
  sw.stop();
  alert(sw.escapeTime());
*/
function stopWatcher(){
  var timerRunning=false;
  var startTime;
  var endTime;
};

stopWatcher.prototype = {
  start:function(){
        this.startTime = new Date().getTime();
        this.timerRunning=true;
    },
    stop:function(){
        this.endTime = new Date().getTime();
        this.timerRunning = false;
    },
    reset:function(){
        this.startTime = null;
        this.endTime = null;
        this.timerRunning = false;
    },
    isRunning : function(){return this.timerRunning},
    escapeTime :function(){return this.endTime - this.startTime}
}

/*
 * 点的转义：.  ==> \\u002E
美元符号的转义：$  ==> \\u0024
乘方符号的转义：^  ==> \\u005E
左大括号的转义：{  ==> \\u007B
左方括号的转义：[  ==> \\u005B
左圆括号的转义：(  ==> \\u0028
竖线的转义：| ==> \\u007C
右圆括号的转义：) ==> \\u0029
星号的转义：*  ==> \\u002A
加号的转义：+  ==> \\u002B
问号的转义：?  ==> \\u003F
反斜杠的转义：\ ==> \\u005C
 */
function escape4Reg(s){
  var buf = [];
  for(var i=0;i<s.length;i++){
    var c=s.charAt(i);
    switch (c) {
      case '.' : buf.push('\\x2E');break;
      case '$' : buf.push('\\x24');break;
      case '^' : buf.push('\\x5E');break;
      case '{' : buf.push('\\x7B');break;
      case '[' : buf.push('\\x5B');break;
      case '(' : buf.push('\\x28');break;
      case '|' : buf.push('\\x28');break;
      case ')' : buf.push('\\x29');break;
      case '*' : buf.push('\\x2A');break;
      case '+' : buf.push('\\x2B');break;
      case '?' : buf.push('\\x3F');break;
      case '\\' : buf.push('\\x5C');break;
      default : buf.push(c);
    }
  }
  return buf.join('');
}

function TreeSearch(op){
  var op = op || {};
  var tree1 = op.tree;
  var NodesOrdDesc = []; //以倒序存放的全部节点,供查找过滤之用

  function doNodeSearch(keyWord){
    var sType=0; //普通搜索
    var PaIdsByPC=[] ;
    function chkSearchType(){
      var k=keyWord;
      if (typeof k =='string' && k.length > 0){
        var c1 = k.charAt(0);
        if (c1 == '#' && isInt(k.substr(1))){ //search catid
          sType = 1;
          keyWord = k.substr(1);
        } else if (c1 == '.' && isInt(k.substr(1))){ //search paraid
          sType = 2;
          keyWord = k.substr(1);
        } else if (c1=='$' && op.pct) { //search paraCode
          sType = 3;
          keyWord = k.substr(1);
          $.ajax({
            url : getActionUrl('qryPaIdByCode') , data: {PaCode:keyWord,PaCodeType:op.pct},type: "GET", 
            dataType :'json',async : false,
            success:function(j){ if (j.success==1) PaIdsByPC = j.paIds.split(','); }
          })
        }
      }
    }
    
    sw = new stopWatcher();
    sw.start();
    var s='';
    if (keyWord=='') {
      myClearFilter();
    } else {
      if (NodesOrdDesc.length==0) initNodesOrdDesc(); //alert($.inArray(tree1.root.firstChild ,NodesOrdDesc));
      var toHides =[]; //存放计算出需要隐藏的节点 
      var showNodes=[],specShows=[];
      chkSearchType();

      function doMatch(i,n){
        function matchANode(){
          if (sType==1){
            return n.id==keyWord;
          } else if (sType==2){
            return  n.id.indexOf('.')!=-1 && n.id.split('.')[1]==keyWord;
          } else if (sType==3){
            return n.id.indexOf('.')!=-1 && $.inArray(n.id.split('.')[1],PaIdsByPC) !=-1;
          } else { 
            //return n.text.indexOf(keyWord,false)!=-1
            return n.text.match(re) != null;
          }  
        }

        if ($.inArray(n,showNodes)!=-1) return;//if (mustShowNodes[n.id]) return ;//如果当前节点在mustShowNodes中,那肯定不能隐藏它.
        if (matchANode(n)) { //如果当前节点符合搜索条件,则将它及它的所有父亲节点放到mustShowNodes中
          if (op.IncSons) //需要将当前匹配节点的儿子节点也显示
            n.eachChild(function(n1){
              if (!$.isFunction(op.chkIncSon) || op.chkIncSon(n1)) {
                n1.ui.show(); showNodes.push(n1); specShows.push(n1);
              }
            });            
          showNodes.push(n);
          n.ui.show(); //防止上次搜索后隐藏了它
          var pN = n.parentNode; 
          while (pN) {
            pN.ui.show();
            showNodes.push(pN);
            pN = pN.parentNode;
          }
        } else toHides.push(n);// [n.id]=n; //else n.ui.hide();
      }
      
      keyWord=escape4Reg(keyWord); 
      var re = eval('/'+ keyWord +'/i'); //为了忽略大小写查找
      $.each(NodesOrdDesc,doMatch);
      sw.stop();
      s='calc usedtime:'+sw.escapeTime();
      sw.start();
      
      var falseToHides = {};//存放那些会隐藏,但无需做隐藏动作的节点,比如节点的父亲已做了隐藏动作,或它的爷爷级节点做了隐藏动作
      trueToHides = {}
      toHides.reverse();//toHides本来是层次深的放在前面,现在要反过来
      $(toHides).each(function(i,n){
        if ($.inArray(n,specShows)!=-1) return true;
        var curPId = n.parentNode.id;
        if (trueToHides[curPId] || falseToHides[curPId]) {//如果一个节点的父亲节点已隐藏 或 无需隐藏 ,则此节点也无需再做隐藏的动作
          falseToHides[n.id] = n; 
        } else {
          trueToHides[n.id] = n;
        }
      });
      for (var nid in trueToHides) { //本来我们只需要将所有toHides调用hide()即可,但那样速度太慢,所以
        trueToHides[nid].ui.hide();
      }
      showNodes.reverse(); //showNodes本来是层次深的放在前面,现在要反过来
      $(showNodes).each(function(i,n){
          n.expand(false,false); //比 n.ensureVisible(); 及 tree1.root.expand(true,false); 的效率要高
      }); 

      sw.stop();
      s += '<br>new  visible usedtime:'+sw.escapeTime();
      //SlideMsg.msg('信息',s,5);
    }
  }  
  
  function myClearFilter(){
    sw = new stopWatcher();
    sw.start();
    tree1.root.collapse(true,false); //否则会全部展开
    tree1.root.cascade(function(n){n.ui.show();} );
    //for (var nid in allHides) allHides[nid].ui.show(); 
    sw.stop();
    //SlideMsg.msg('信息','clear usedtime:'+sw.escapeTime(),5);
  }
  
  function initNodesOrdDesc(){
    NodesOrdDesc.length = 0;
    function addNodeOrdDesc(n){ NodesOrdDesc.push(n) };
    tree1.root.eachChild(function(n){ n.cascade(addNodeOrdDesc)  } );
    //tree1.root.cascade(addNodeOrdDesc); //这样写会包括根节点本身
    NodesOrdDesc.reverse(); 
  }
  
  function setPaCodeType(pct){
    op.pct = pct;
  }
  
  function setOpts(op1){
    //可能的参数: 1.IncSons : boolean,是否显示儿子节点. 
    op = $.extend(op,op1);
  }
  
  return {
    doNodeSearch:doNodeSearch , setPaCodeType: setPaCodeType , setOpts : setOpts
  }
}

function findPosX(obj){ 
  var curleft = 0;
  if (obj.offsetParent)  {
    while (obj.offsetParent)    {
      curleft += obj.offsetLeft;
      obj = obj.offsetParent;
    }
  }
  else if (obj.x)
    curleft += obj.x;
  return curleft;
}

function findPosY(obj){
  var curtop = 0;
  if (obj.offsetParent){
    while (obj.offsetParent){
      curtop += obj.offsetTop;
      obj = obj.offsetParent;
    }
  }
  else if (obj.y)
    curtop += obj.y;
  return curtop;
}

function BorderGlint(op){ //使边框闪烁
  if (!op || !op.obj) return ;
  //1.记下原来的样式
  var jObj = $(op.obj);
  var oriStyle = jObj.attr('style');
//  var oriBorderColor = jObj.css('border-color');
  var color1 = 'green';
  var color2 = 'red';
  var curColor=color1;
  
  //缺省在黑色和红色之间切换
  var repTimes = 10 , doTimes=0;
  
  var iTimer = window.setInterval(function(){
    curColor = (curColor == color1  ? color2 : color1);
    jObj.css('border-color',curColor);
    if (++doTimes == repTimes) {
      clearInterval(iTimer);
      jObj[0].style.cssText=oriStyle;
      if (op.autoFocus) jObj[0].focus(); 
    }
  },300);
}




