﻿var jUtil =
{
	adjustLeftTop: function (top, left, width, height, objW, objH)
	{
		var w = jUtil.getWidth(document.body);
		var h = jUtil.getHeight(document.body);
		
		if (top + height + 32 > h)
			top = top - height;
		else
			top = top + objH;
		
		if (top < 0)
			top = 0;
		
		if (left + width + 20 > w)
			left = w - width - 20;
		
		if (left < 0)
			left = 0;
		
		return {top: top, left: left};
	},
	
	
	buildTreeView: function(container, nodes, parms)
	{
		var treeId = parms.treeId || "treeViewer";
		var idAttr = parms.idAttr || "i";
		var cdAttr = parms.cdAttr || "c";
		var nmAttr = parms.nmAttr || "t";
		var urlAttr = parms.urlAttr || "r";
		
		$("<ul/>").attr({id: treeId}).addClass("filetree").append(setts(nodes)).appendTo(container);
		
		function setts(nodes)
		{
			var r = null;
			var o = null;
	        
			for(var i = 0; i < nodes.length; i++)
			{
				var n = $(nodes[i]);
				var c = n.children();
			
				if (c.length == 0)
				{
					o = $("<li/>").append($("<span/>").attr({id: n.attr(idAttr), cd: n.attr(cdAttr), url: n.attr(urlAttr)}).text(n.attr(nmAttr)).addClass("file"));
					r = r ? r.add(o) : o;
				}
				else
				{
					o = $("<li/>").append($("<span/>").text(n.attr(nmAttr)).addClass("folder")).append($("<ul/>").append(setts(c)));
					r = r ? r.add(o) : o;
				}
				
				n = c = null;
			}
		    
			return r;
		}
	},
	
	buildTreeList: function(parms, loadTree, k)
  {
		var tableID = parms["tableID"];
		var modelXml = parms["modelXml"] || DataModelDoc[Globals.modelID];
		var dataXml = parms["dataXml"] || XmlCache.data;
		var leafOnly = parms["leafOnly"];
		var prntId = parms["prntId"];
		var level = parms["level"];
		var column = parms["column"];
		var rows = parms["rows"];
		
		var dncd = DataModel.getRootNestCode(k);
		var nodes = jUtil.getNodes(dataXml, "//" + dncd);
		var leafs = new Array();
		
		for(var i = 0; i < nodes.length; i++)
			leafs.push(parseInt(jUtil.getNodeText(nodes[i], "__isleaf__"), 10));
		
		rows.each(function(i, row)
		{
			var fill = "";
			var $row = $(row);
			
			for(var j = 1; j <= level; j++)
			{
				if (leafs[i] == 1)
					fill += "<span class='ttimage'>　</span>";
				else if (j == level)
					fill += "<span class='prepare' id='r" + $row.attr("RowId") + "'><font face='Wingdings'>0</font></span>";
				else
					fill += "<span class='ttimage'>　</span>";
			}
			
			var input = $row.find("input");
			
			if ((leafs[i] != 1) && (leafOnly == ""))
				input.attr({disabled: true});

			input.attr({prntId: prntId});
			$row.attr({level: level, expand: false, loaded: false}).children("td").eq(column).prepend(fill);
		});
		
		$("#list_" + tableID).find(".prepare").each(function(i)
		{
			var $this = $(this).removeClass("prepare").addClass("parimg");
		
			$this.click(function()
			{
				var tr = $this.parent().parent();
				var expand = tr.attr("expand") + "";
				var loaded = tr.attr("loaded") + "";
				var dataId = tr.attr("RowId");
				
				if (expand == "false")
				{
					$("#r" + dataId).html("<font face='Wingdings'>1</font>");
					tr.attr("expand", "true");
					
					if (loaded == "false")
					{
						tr.attr("loaded", "true");
						
						var level = parseInt(tr.attr("level"), 10);
						var html = loadTree(tableID, dataId);
						
						if (html)
						{
							children = $(html).find("tbody").find("tr").each(function(i, obj)
							{
								tr.after(obj);
								tr = $(obj).attr("prntId", dataId);
							});
							
							jUtil.buildTreeList(
								{
								modelXml: modelXml,
								dataXml: XmlCache[dataId],
								tableID: tableID,
								level: level + 1,
								column: column,
								rows: children,
								prntId: dataId,
								leafOnly: leafOnly
								}, 
								loadTree);
							tr = children = null;
						}
					}
					else
					{
						$("#list_" + tableID).find("tbody").find("tr[prntId=" + dataId + "]").each(function(i, obj)
						{
							$(obj).removeClass("collapsed").css({display: ""});
						});
					}
				}
				else
				{
					tr.attr("expand", "false");
					
					$("#r" + dataId).html("<font face='Wingdings'>0</font>");
					$("#list_" + tableID).find("tbody").find("tr[prntId=" + dataId + "]").each(function(i, obj)
					{
						$(obj).addClass("collapsed").css({display: "none"});
					});
				}
			});
		});
		
		nodes = leafs = null;
  },

	containsEx: function(self, elem)
	{
		if (elem.length && elem.length > 0)
			return self[0].contains(elem[0]);
		
		return self[0].contains(elem);
	},

	gc: function()
	{
		if ($.browser.msie)
			CollectGarbage();
	},

	getMilliseconds: function()
	{
		var d = new Date();
		return d.getSeconds() * 1000 + d.getMilliseconds();
	},
	
	getData: function()
	{
		var e, result = [];
		var a = this.find("[id]");
		
		for(var i = 0; i < a.length; i++)
		{
			e = a[i];

			if (e.disabled)
			{
				continue;
			}
			
			switch(e.type)
			{
				case "file":
				case "reset":
				case "etc":
				case "submit":
				case "button":
					break;
			
				case "radio":
				case "checkbox":
					if (e.checked)
					{
						result.push(e.id + "=" + encodeURIComponent(e.value))
					}
					
					break;
					
				case "select-multiple":
					var item;
					
					for(var j = 0; j < e.options.length; j++)
					{
						item = e.options[j];
						
						if (item.selected)
						{
							result.push(e.id + "=" + encodeURIComponent(item.value));
						}
					}
					
					break;
					
				case "textarea":
					e.value = e.value.parseCDATA();
					
				default: 
					if(e.id)
					{
						result.push(e.id + "=" + encodeURIComponent(e.value));
					}
					
					break;
			}
		}
		
		return result.join('&')
	},
	
  getNode: function(xml, xPath)
  {
    return xml.selectSingleNode(xPath);
  },

  getNodes: function(xml, xPath)
  {
    return xml.selectNodes(xPath);
  },

  getNodeText: function(xml, xPath, def)
  {
		def = def || "";
		
    if (!xml)
        return def;
        
		var node = xml.selectSingleNode(xPath);
		
		if (node)
			return node.text;

		return def;
  },
  
  getNodeAttribute: function(xml, xPath, attr, def)
  {
    var node = xml.selectSingleNode(xPath);

    if (node != null)
	    return node.getAttribute(attr);
		
		return def;
  },
    
  getHeight: function(e) 
  {
    if (e && e.attr)
			return e.attr("offsetHeight");
		
		if (e)
			return e.offsetHeight;
  },
  
  getWidth: function(e) 
  {
		if (e.attr)
			return e.attr("offsetWidth");
			
    return e.offsetWidth;
  },
    
  isNumber: function(a)
	{
		return typeof a == "number" && isFinite(a);
	},
	
	isNumeric: function(s)
	{
		s = s + "";
		s = s.trimEx();
		
		var letters = "1234567890.";
		var count = 0;
		
		for(i = 0; i < s.length; i++)   
		{
			var c = s.charAt(i);
			
			if (c == ".")
			    count++;
			
			if (count > 1)
			    return false;
			
			if (c == "." && (i == 0 || i == s.length-1))
			    return false;
			
			if (letters.indexOf(c) == -1)
			    return false;
		}
	
		return true;   
	},

	messageBox: function(title, message, buttonType)
	{
		var buttonIds = ["Close"];
		var buttonNames = ["确定"];
		
		switch(buttonType)
		{
			case ButtonType.OKCancel:
				buttonIds = ["OK", "Cancel"];
				buttonNames = ["确定", "取消"];
				break;
			
			case ButtonType.YesNo:
				buttonIds = ["Yes", "No"];
				buttonNames = ["是", "否"];
				break;
			
			case ButtonType.YesNoCancel:
				buttonIds = ["Yes", "No", "Cancel"];
				buttonNames = ["是", "否", "取消"];
				break;
		}

		return this.openDialog("../../WUISysPages/MessageBox.htm", {title: title, message: message, buttonIds: buttonIds, buttonNames: buttonNames}, "dialogWidth:500px;dialogHeight:200px;scrollbar:no;location:no;status:no;resizable:no;center:yes");
	},
	
  openDialog: function(url, parms, features)
  {
    if ($.browser.msie)
      return window.showModalDialog(url, parms, features);
    else
    {
      window.myAction = this;

      var dlg = window.open(url, "mcePopup", features, true);
  
      window.myArguments = parms;

      this.returnAction = function(parm)
          {
            if (typeof(parm) != undefined)
              return parm;
          };
  
      window.onclick = function()
      {
			  dlg.focus();
		  };
		
      event.cancelBubble = true; 
    }
  },
  
  setIntervalEx: function(fRef, delay)
  {
    if (typeof fRef == "function")
    {
      var args = Array.prototype.slice.call(arguments, 2);
      return window.setInterval(function(){fRef.apply(null, args);}, delay);
    }

    return window.setInterval(fRef, delay);
  },
    
  setTimeoutEx: function(fRef, delay)
  {
    if (typeof fRef == "function")
    {
      var args = Array.prototype.slice.call(arguments, 2);
      return window.setTimeout(function(){fRef.apply(null, args);}, delay);
    }

    return window.setTimeout(fRef, delay);
  },

  setTimeoutEx2: function(cRef, fRef, delay)
  {
    if (typeof fRef == "function")
    {
      var args = Array.prototype.slice.call(arguments, 2);
	    return window.setTimeout(function(){fRef.apply(cRef, args);}, delay);
    }

    return window.setTimeout(fRef, mDelay);
  },
  
  setTimeoutEx3: function(cRef, fRef, delay)
  {
    if (typeof fRef == "function")
    {
      var args = Array.prototype.slice.call(arguments, 3);
      return window.setTimeout(function(){fRef.apply(cRef, args);}, delay);
    }

    return window.setTimeout(fRef, mDelay);
  },

  clearIntervalEx: function(id)
  {
      window.clearInterval(id);
  },

	convertClass: function(obj, c1, c2)
  {
    obj.removeClass(c1);
    obj.addClass(c2);
  },
  
  toBoolean: function(value)
	{
		return value.toLowerCase() == "true" ? true : false;
	},
	
	launchCenterWindow: function(url, name, width, height) 
	{
		var str = "toolbar=no,location=no,directories=no,status=yes,scrollbars=yes,resizable=0,height=" + height;// + ",innerHeight=" + height;
		
		str += ",width=" + width;// + ",innerWidth=" + width;
		
		if (window.screen) 
		{
			var ah = screen.availHeight - 30;
			var aw = screen.availWidth - 10;

			var xc = (aw - width) / 2;
			var yc = (ah - height) / 2;

			str += ",left=" + xc + ",screenX=" + xc;
			str += ",top=" + yc + ",screenY=" + yc;
		}

		return window.open(url, name, str);
	},
	
	// "&"字符串的转换需要特殊处理
	convertXMLSpecialTag2XML: function(s)
	{
		var stringList = s.split("&");
		var resultvalue; 
		
		if (stringList.length <= 1)
			resultvalue = s;
		else
		{ 
			for (var i = 0; i <= stringList.length - 1; i++)
			{		
				if (i > 0) 
					resultvalue = resultvalue + "&amp;" + stringList[i];
				else
					resultvalue = stringList[i];
			}
		}

		return resultvalue;
	},
	
	convertXMLSpecial2XML: function(s)
	{
		s = this.convertXMLSpecialTag2XML(s);
		
		s = s.ReplaceAll('&', "&amp;");
		s = s.ReplaceAll("<", "&lt;");
		s = s.ReplaceAll(">", "&gt;");
		s = s.ReplaceAll('"', "&quot;");
		return s
	},
	
	convertXML2XMLSpecial: function(s)
	{
		s = s.ReplaceAll("&lt;", "<");
		s = s.ReplaceAll("&gt;", ">");
		s = s.ReplaceAll("&quot;", '"');
		s = s.ReplaceAll("&apos;", "'"); 
		s = s.ReplaceAll("&amp;", "&");
		return s;
	}
};
    
var _si = window.setInterval;
var _st = window.setTimeout;

if (!$.browser.msie)
{
	HTMLElement.prototype.contains = function(obj)
	{   
		while(obj && obj.tagName)
        {
			if(obj == this)
				return true;
			
			obj = obj.parentNode;
		}   
		
		return false;   
	};   
}

extendEx(Array.prototype,
{
	clear: function()
	{
		this.length = 0;
		return this;
	},

	copy: function(o)
	{
		if (o)
			return this.concat(o);
		else
			return this.concat();
	},

	indexOf: function(o) 
	{
		for (var i = 0; i < this.length; i++)
			if (this[i] == o) 
				return i;
    
		return -1;
	},
	
	insertAt: function(o,i)
	{
		this.splice(i, 0, o);
	},

	remove: function(o) 
	{
		var i = this.indexOf(o);
		
		if (i != -1)
			this.splice(i,1);
	},

  removeAt: function(i)  
  {
		this.splice(i, 1);
  }
});
