/* 给数组添加一个查找指定值得函数，找到了返回这个值对应的数组下标，找不到返回false */
Array.prototype.Search = function(value)
{
	for (key in this)
	{
		if (this[key] == value)
		{
			return parseInt(key);
		}
	}
	return false;
}

// 去除字符串前后的空格
String.prototype.Trim = function()
{
	return this.replace(/(^\s*)|(\s*$)/g, "");
}

String.prototype.isDate = function(){
	var r = this.match(/^(\d{4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
	if (r == null) return false;
	var d = new Date(r[1], r[3]-1, r[4]);
	return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4]);
}


function $(id)
{
	var e = document.getElementById(id);
	if (!e)
		e = document.getElementsByName(name)[0];
	return e;
}

function $v(name)
{
	return $(name).value;
}

/*
 获取元素的绝对坐标
 IE 也可以使用 getBoundingClientRect 函数
 返回结果: {top, left, width, height}
*/
function GetAbsoluteLocation(element)
{
	if (arguments.length != 1 || element == null)
		return null;
	var elmt = element;
	var offsetTop = elmt.offsetTop;
	var offsetLeft = elmt.offsetLeft;
	var offsetWidth = elmt.offsetWidth;
	var offsetHeight = elmt.offsetHeight;
	while(elmt = elmt.offsetParent)
	{
		if (elmt.style.position == 'absolute' || elmt.style.position == 'relative'
			|| (elmt.style.overflow != 'visible' && elmt.style.overflow != '' ))
			break;
		offsetTop += elmt.offsetTop;
		offsetLeft += elmt.offsetLeft;
	}
	return {top: offsetTop, left: offsetLeft, width: offsetWidth, height: offsetHeight};
}

/* 根据 tagName 获取元素的父元素 */
function GetParentElementByTagName(element, tagName)
{
	element = element.parentElement;
	while (element != null && element.tagName != tagName)
	{
		element = element.parentElement;
	}
	return element;
}

/*
 获取元素的子元素中名称属性为name的元素
 index -> 指定返回第几个符合条件的子元素, 如果不指定 , 函数返回整个集合
*/
function GetChildElementsByName(element, name, index)
{
	var elements = element.all.namedItem(name);
	if (typeof(index) != "number")
	{
		var c = [];
		if (elements != null)
		{
			for (var i = 0; i < elements.length; i++)
			{
				if (elements[i].name == name)
				{
					c[c.length] = elements[i];
				}
			}
		}
		return c;
	}
	else
	{
		if (typeof(elements) == "object" && elements.name == name)
		{
			return elements;
		}
		else
		{
			for (var i = 0; i < elements.length && index >= 0; i++)
			{
				if (elements[i].name == name)
				{
					index--;
				}
			}
			return elements[i - 1];
		}
	}
	return null;
}

function GetChildElementsByTagName(element, tagName, index)
{
	var elements = element.all;
	var c = [];
	if (typeof(index) != "number")
	{
		for (var i = 0; i < elements.length; i++)
		{
			if (elements[i].tagName == tagName)
			{
				c[c.length] = elements[i];
			}
		}
		return c;
	}
	else
	{
		for (var i = 0; i < elements.length && index >= 0; i++)
		{
			if (elements[i].tagName == tagName)
			{
				index--;
			}
		}
		return elements[i - 1];
	}
	return null;
}

function GetPreviousSiblingByName(element, name)
{
	var element = element.previousSibling;
	while (element)
	{
		if (element.name && element.name == name) return element;
		element = element.previousSibling;
	}
	return null;
}

function GetNextSiblingByName(element, name)
{
	var element = element.nextSibling;
	while (element)
	{
		if (element.name && element.name == name) return element;
		element = element.nextSibling;
	}
	return null;
}


/* 设置 Select 元素的值 */
function SetSelectValue(eSelect, value)
{
	if (typeof(eSelect) == "string")
	{
		var temp = eSelect;
		var eSelect = document.getElementById(temp);
		if (!eSelect) eSelect = document.getElementsByName(temp)[0];
	}
	if (eSelect && value)
		eSelect.value = value;
}


/*
 随机取出 v1 到 v2 之间(包括 v1 和 v2)的一个整数
 v1 -> 正整数
 v2 -> 正整数, 可省略, 默认为 0
*/
Random = function(v1, v2)
{
	var ok = true;
	if (arguments.length == 1)
		if (typeof(v1) != "number" || v1 < 0) ok = false;
	else if (arguments.length == 2)
		if (typeof(v1) != "number" || v1 < 0 || typeof(v2) != "number" || v2 < 0) ok = false;
	else
		ok = false
	if (!ok)
	{
		alert("Random 函数需要一个或两个正整数参数");
		return false;
	}
	if (arguments.length == 1)
	{
		var v2 = v1;
		v1 = 0;
	}
	else
	{
		var temp = Math.max(v1, v2);
		v1 = Math.min(v1, v2);
		v2 = temp;
	}
	return Math.floor(Math.random() * (Math.floor(v2 - v1) + 1)) + v1;
}


/*
 根据传递的正则表达式验证值
 name -> 被验证的页面元素的名称(应该保证这个名称和所有的id不一样)
 re -> 验证元素值的正则表达式
 description -> 验证失败显示提示信息时对这个元素的称呼
 required -> 是否是必填项

 常用正则表达式
 汉字 [\u4E00-\u9FA5]
 全角字母和数字 [\u0030-\u0039]|[\u0041-\u007A]|[\uFF10-\u0019]|[\uFF21-\uFF5A]
*/
function CheckFormat(name, re, description, required)
{
	if (typeof(re) == "string")
	{
		switch (re)
		{
			case "" : re = /^.+$/m; break;
			case "email" : re = /^[\.\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/; break;
			case "zipcode" : re = /^\d{6}$/; break;
			case "telephone" : re = /^[\d\(\)\-,;:]{7,}$/; break;
			case "date" : re = /^(\d{4})(-|\/)(\d{1,2})\2(\d{1,2})$/; break;
		}
	}
	if (typeof(name) == "string") var e = document.getElementsByName(name)[0];
	if (!e) return true;
	if (description == "") description = "此处";
	if (required)
	{
		if (e.value == "")
		{
			alert("必须填写 " + description);
			e.focus();
			return false;
		}
	}
	else
		if (e.value == "") return true;

	if (!re.test(e.value))
	{
		alert(description + " 不正确");
		e.focus();
		return false;
	}
	else
		return true;
}


/*
 定义关联下拉列表框类
 parentId -> 包含所有下拉列表框的网页元素 id 值
 itemInAll -> 在所有下拉列表框中生成 itemInAll 选项, null 为不生成 (可选项)
 itemInFirst -> 在第一个下拉列表框中生成 itemInFirst 选项, null 为不生成, 其优先级大于 itemInAll (可选项)
*/
function RelatingList(parentId, itemInAll, itemInFirst)
{
	var args = arguments.length;
	if (args < 1) return false;
	if (args < 2) var itemInAll = null;
	if (args < 3) var itemInFirst = null;

	this.parentId = parentId;
	this.itemInAll = itemInAll;
	this.itemInFirst = itemInFirst;
	this.item = Array();
}

/*
 添加一个列表项
 id -> 列表项的 id
 name -> 列表项的名称
 parent -> 列表项的父项 id
*/
RelatingList.prototype.AddItem = function(id, name, cat)
{
	if (arguments.length < 3)
	{
		alert("RelatingList 函数 \"AddItem\" 的参数个数不正确");
		return false;
	}
	with(this)
	{
		item[item.length] = {
			id : id,
			name : name,
			parentId : cat
		};
	}
}

/* 根据设置初始化关联下拉列表框 */
RelatingList.prototype.Show = function(position)
{
	position = position == "" ? [""] : position.split(",");
	with(this)
	{
		var eParent =  document.getElementById(parentId);

		// 生成隐藏提交表单(父类框名称: parentId_cat, 位置框名称: parentId_position)
		var eInput = document.createElement("<INPUT TYPE=HIDDEN NAME='" + parentId + "_cat' ID='" + parentId + "_cat'>");
		eParent.parentNode.appendChild(eInput);
		var eInput = document.createElement("<INPUT TYPE=HIDDEN NAME='" + parentId + "_position' ID='" + parentId + "_position'>");
		eParent.parentNode.appendChild(eInput);

		this.GenerateChildList();
		for (var i = 0; i < position.length; i++)
		{
			var eSelect = eParent.childNodes[i];
			if (eSelect)
			{
				if (position[i] == "" || position[i] == "0")
					eSelect.selectedIndex = 0;
				else
					eSelect.value = position[i];
				if (eSelect.value == "") return;
				eSelect.fireEvent("onchange");
			}
		}
	}
}

/*
 生成子类列表框
 curList -> 当前下拉列表框元素 (可选项)
*/
RelatingList.prototype.GenerateChildList = function(curList)
{
	var parent = 0;	// 父下拉列表框的值
	if (arguments.length != 0) parent = parseInt(curList.value);

	with(this)
	{
		var eParent =  document.getElementById(parentId);

		// 删除当前下拉列表框后面的所有下拉列表框
		while (eParent.lastChild && eParent.lastChild != curList)
			eParent.removeChild(eParent.lastChild);
		// 创建一个下拉列表框
		var eSelect = document.createElement("SELECT");
		var o = this;
		eSelect.onchange = function() {o.GenerateChildList(this);};

		// 生成 itemInAll 和 itemInFirst 选项
		if (itemInFirst && eParent.childNodes.length == 0)
		{
			var eOption = document.createElement("<OPTION STYLE='COLOR:RED;'>");
			eSelect.options.add(eOption);
			eOption.value = "";
			eOption.text = itemInFirst;
		}
		else if (itemInAll)
		{
			var eOption = document.createElement("<OPTION STYLE='COLOR:RED;'>");
			eSelect.options.add(eOption);
			eOption.value = "";
			eOption.text = itemInAll;
		}

		// 生成下拉列表项
		for (var i = 0; i < item.length; i++)
		{
			if (item[i].parentId === parent)
			{
				var eOption = document.createElement("OPTION");
				eSelect.options.add(eOption);
				eOption.value = item[i].id;
				eOption.text = item[i].name;
			}
		}
		// 生成的下拉列表框是否有有效的列表项, 有则显示
		if (eSelect.options.length > 1 || eSelect.options[0] && eSelect.options[0].value != "")
		{
			eParent.appendChild(eSelect);
			eSelect.fireEvent("onchange");
		}

		// 更新提交的父类值
		var eInputParent = document.getElementById(parentId + "_cat");
		var eSelect = eParent.lastChild;
		if (eParent.childNodes.length > 1 && eSelect.value == "") eSelect = eSelect.previousSibling;
		eInputParent.value = (eSelect && eSelect.value != "" ? eSelect.value : 0);
		// 更新提交的位置值
		var eInputPosition = document.getElementById(parentId+ "_position");
		var pos = "";
		var eSelect = eParent.firstChild;
		while (eSelect && eSelect.value != "")
		{
			pos += "," + eSelect.value;
			eSelect = eSelect.nextSibling;
		}
		eInputPosition.value = pos.substr(1);
	}
}



/*
 上传文件的类
 name -> 包含文件上传类的元素 id, 最终上传的时候也是以这个名称上传
 tips -> 上传文件的提示
 dir -> 上传对话框的根目录
*/
function UploadFile(name, multi, tips, dir)
{
	var args = arguments.length;
	if (args < 1) return;
	this.name = name;
	this.multi = "";
	if (args >= 2) this.multi = multi;
	this.tips = "";
	if (args >= 3) this.tips = tips;
	this.dir = "";
	if (args >= 4) this.dir = dir;

	this.base_url = "";
	href = location.href + "/";
	if (href.indexOf("localhost") >= 0 || href.indexOf("testweb") >= 0)
	{
		var p = href.indexOf("/", 10)
		this.base_url = href.substr(p + 1, href.indexOf("/", p + 1) - p);
	}
	this.file = [];
	this.fileDesc = [];
}

UploadFile.prototype.AddFile = function (path, name)
{
	if (!path) var path = "";
	if (!name) var name = "";
	this.file[this.file.length] = path;
	this.fileDesc[this.fileDesc.length] = name;
}

UploadFile.prototype.Add = function ()
{
	var o = this;
	var eTd = document.getElementById(this.name);
	var i = eTd.getElementsByTagName("INPUT").length / 2;
	// 添加分割线
	if (i > 0)
	{
		var eHr = document.createElement('<HR style="clear: both;">');
		eTd.insertBefore(eHr, eTd.lastChild);
	}
	// 添加图象预览框架
	var eIframe = document.createElement('<IFRAME style="display: none; width: 100%;" marginwidth="0" marginheight="0" topmargin="0" leftmargin="0" frameborder="0" border="0" unselectable="true" atomicselection="true" onload="__UploadFile_ResizeIFrame(this)">');
	eTd.insertBefore(eIframe, eTd.lastChild);
	// 文件路径文本框和名称
	var eSpan = document.createElement("SPAN");
	eSpan.innerHTML = "路径: ";
	eTd.insertBefore(eSpan, eTd.lastChild);
	var eInput = document.createElement('<INPUT type="text" id="' + this.name + '_' + i + '" name="' + this.name + '[]" class="input_text" size="50" onchange="__UploadFile_Preview(this)">');
	eTd.insertBefore(eInput, eTd.lastChild);
	if (this.file[i]) eInput.value = this.file[i];
	var eSpan = document.createElement('<SPAN style="margin-left: 20px;">');
	eSpan.innerHTML = "名称: ";
	eTd.insertBefore(eSpan, eTd.lastChild);
	var eInputDesc = document.createElement('<INPUT type="text" name="' + this.name + 'Desc[]" class="input_text" size="35" />');
	eTd.insertBefore(eInputDesc, eTd.lastChild);
	if (this.fileDesc[i]) eInputDesc.value = this.fileDesc[i];
	// 添加操作和说明文字
	var eDiv = document.createElement('<DIV style="float: left; margin-top: 5px;">');
	eTd.insertBefore(eDiv, eTd.lastChild);
	var eSpan = document.createElement('<SPAN style="color: #00f; cursor: hand;">');
	eDiv.appendChild(eSpan);
	eSpan.innerText = "选择上传的文件";
	eSpan.onclick = function() {mcFileManager.callerWindow=null;mcFileManager.open('form', o.name + "_" + i, "", "", {relative_urls : false, remove_script_host : true, remember_last_path : true, document_base_url : "/" + o.base_url});};
	//, path : "../../../UserFiles", rootpath : "../../../UserFiles/" + dir
	var eSpan = document.createElement("SPAN");
	eDiv.appendChild(eSpan);
	eSpan.innerText = " 或者 ";
	var eSpan = document.createElement('<SPAN style="color: #00f; cursor: hand;">');
	eDiv.appendChild(eSpan);
	eSpan.innerText = "取消文件";
	eSpan.onclick = function() {o.CancelFile(this.parentNode.previousSibling.previousSibling.previousSibling);};
	//var eSpan = document.createElement('<SPAN style="color: #f00;">');
	//eDiv.appendChild(eSpan);
	//eSpan.innerText = " (更新或删除时会自动删除以前的文件)";
	eInput.fireEvent("onchange");
}

/* 显示上传文件的界面 */
UploadFile.prototype.Show = function ()
{
	var eTd = document.getElementById(this.name);
	eTd.obj = this;
	// 添加说明文字 div
	var eDiv = document.createElement('<DIV style="float: right; margin-top: 5px;">');
	eDiv.innerHTML = this.tips +
		'<span style="padding: 10px;"> </span><span style="cursor: hand; color: red;" onclick="var iframes=this.parentNode.parentNode.getElementsByTagName(\'IFRAME\');for(var i=0;i<iframes.length;i++){__UploadFile_ResizeIFrame(iframes[i]);}">重新调整预览框大小</span>' +
		(this.multi ? '<span style="padding: 10px;"> </span><span style="cursor: hand; color: red;" onclick="this.parentNode.parentNode.obj.Add()">更多</span>' : "");
	eTd.appendChild(eDiv);
	for (var i = 0; i < this.file.length; i++)
		this.Add();

}

/*
 取消文件
 eInput -> 存放预览路径的文本框
*/
UploadFile.prototype.CancelFile = function (eInput)
{
	eInput.value = "";
	eInput.fireEvent("onchange");
}

/*
 预览文件
 eInput -> 存放预览路径的文本框
*/
function __UploadFile_Preview(eInput)
{
	var preview = false;
	var p = eInput.value.lastIndexOf(".");
	if (p >= 0)
	{
		var extension = eInput.value.substr(p + 1).toLowerCase();
		if ("gif|jpg|jpeg|png|bmp|tif|swf|txt|htm|html|php|jsp|asp|xml|xsl|dtd".indexOf(extension) >= 0)
			preview = true;
	}

	var eIframe = eInput.previousSibling.previousSibling;
	if (preview && eIframe)
	{
		eIframe.style.display = "";
		eIframe.src = eInput.value;
	}
	else
		eIframe.style.display = "none";
}

function __UploadFile_ResizeIFrame(eIframe)
{
	var src = eIframe.src;
	var p = src.lastIndexOf(".");
	var extension = (p >= 0 ? src.substr(p + 1).toLowerCase() : "");
	switch (extension)
	{
		case "gif": case "jpg": case "jpeg": case "png": case "bmp": case "tif":
			if (eIframe.contentWindow)
				eIframe.height = eIframe.contentWindow.document.body.scrollHeight + 2;
			else if(eIframe.Document)
				eIframe.height = eIframe.Document.body.scrollHeight + 2;
			break;
		case "swf":
			eIframe.height = 200;
			break;
		default:
			if (eIframe.contentWindow)
				eIframe.height = Math.min(300, eIframe.contentWindow.document.body.scrollHeight + 2);
			else if(eIframe.Document)
				eIframe.height = Math.min(300, eIframe.Document.body.scrollHeight + 2);
	}
	eIframe.contentWindow.document.body.style.color = "green";
}

// 替换当前网址中指定的参数
// searchRe -> url中被替换参数的正则表达式
//     例如 http://domain/?page=2 中 page=2 对应 /page=[^&]*/ig (最后一定要用*)
// replace -> 参数中被替换部分的值，例如上面的 2
function ChangeUrl(searchRe, replaceValue)
{
	var h = location.href;
	var str = searchRe.toString();
	str = str.substr(1, str.indexOf("=") - 1) + "=";
	if (h.indexOf("?") == -1)
		h += "?" + str;
	else {
		if(h.indexOf(str) == -1)
			h += "&" + str;
	}
	location.href = h.replace(searchRe, str + replaceValue);
}