// JavaScript Document
//@param  dom  //the DOM's id or object.  edited by Jalen
// loppp

//alert('general');
$ = function(dom) {
	if(typeof(dom) != 'string')
	{
		return dom;
	}
	return document.getElementById(dom);
}

isIE = (document.all && window.ActiveXObject && !window.opera) ? true : false;

//create element
//citveeli
/**
 * Jalen modified
 * add the functionality of creating element in appointed window
 *
 * return
 * element
 */
$CE = function(type, win){
	if(win != null)
	{
		return win.document.createElement(type);
	}
	return document.createElement(type);
}

//create text node
//citveeli
$CT = function(text){
	return document.createTextNode(text);
}
/**
 * 得到Iframe内部的document对象
 * 注意：只能取相同域名的Iframe内部document对象，域名不同将返回为空
 * @param {Iframe的ID} strIframeId
 */
$GetIframeDocById = function(strIframeId)
{
	if(isIE)
	{
		return $(strIframeId).contentWindow.document;
	}
	else
	{
		return $(strIframeId).contentDocument;
	}

}


/**
 * 由Iframe的Id和Iframe内的元素Id获得对象
 * @param {iframe的Id} strIframeId
 * @param {iframe内部元素的Id} strElementId
 */
$IId = function(strIframeId, strElementId)
{
	return $GetIframeDocById(strIframeId).getElementById(strElementId);
}
//IE:attachEvent(),FF:addEventListener()
//HTML元素附件事件封装
/**
 * @param {Object} object：需要附加事件的HTML元素。
 * @param {Object} sEvent：事件名。采用DOM addEventListener函数事件命名规则，及‘click’或‘change’，词头无‘on’
 * @param {Object} func：附加函数名。
 * @param {Object} bFlow：事件流，可选参数。默认为false（冒泡），ture为（捕获）
 * @param {Object} owner: 当事件触发时将 this 指向 owner， 函数参数表为(e, object)
 */
$AddEvent = function(object, sEvent, func, bFlow, owner){
	if(typeof(object) == 'string')
	{
		object = $(object);
	}
	if (object) {
		var sOn='on';
		var flow=false;
		if(typeof(bFlow)=='boolean'){
			flow=bFlow;
		}
		var eventHander = func;
		if(owner)
		{
			// 在这里重新定义一个处理函数
			eventHander = function(e)
			{
				func.call(owner, e, this);
			}
		}
		if (object.attachEvent) {
			object.attachEvent(sOn.concat(sEvent), eventHander);
		}
		else {
			object.addEventListener(sEvent, eventHander, flow);
		}
	}else{
		alert('"'+object+'"不存在。$AddEvent()');
	}
}

/**
 * 移除对象事件
 * @param {Object} object：需要移除事件的对象
 * @param {Object} sEvent：移除的事件类型。不带‘on’前缀，例如‘click’，‘mousemove’等
 * @param {Object} func：函数名
 */
$RemoveEvent=function(object, sEvent, func)
{
	if(object.removeEventListener)
	{
		object.removeEventListener(sEvent,func,false);
	}
	else if(object.detachEvent)
	{
		object.detachEvent('on'+sEvent,func);
	}
	else
	{
		object['on'+sEvent]=null;
	}
}

/**
 * 停止事件冒泡
 * @param {Object} aoEvent: 事件函数的arguemnts[0];
 */
$StopEventBubble=function(aoEvent)
{
	var oEvent=$GetEvent(aoEvent);
	if(isIE)
	{
		oEvent.cancelBubble=true;
	}
	else
	{
		oEvent.stopPropagation();
	}
}

//Jalen add for class inherit
Function.prototype.inherit = function(parentClass)
{
	for(var p in parentClass)
	{
		if(p != "prototype" && !this[p])
		{
			this[p] = parentClass[p];
		}
	}

	for(var p in parentClass.prototype)
	{
//		if(p == '_init_')
//		{
//			continue;
//		}
		if(!this.prototype[p])
		{
			this.prototype[p] = parentClass.prototype[p];
		}
	}
//	this.prototype._init_ = parentClass;
}

//Jalen add for get search parameters
//该函数返回URL字符串中的查询字段，以JSON对象形式返回，便于使用。
/*
 * 例子：
 * 如果URL = http://index.html?id=123&name=Jalen&age=26;
 * var searchparam = GetSearchParam();
 * 执行后searchparam为如下JSON对象：
 * {
 * 	“id” : “123”,
 * 	“name” : “Jalen”,
 * 	“age” : “26”
 * }
 */
GetSearchParam = function()
{
	var SearchParamStr;
	SearchParamStr = document.location.search;
	if(SearchParamStr == "")
	{
		return null;
	}
	SearchParamStr = SearchParamStr.replace("?", "");
	var SearchParam = SearchParamStr.split("&");
	ParamObjStr = "{";
	for(param in SearchParam)
	{
		if (typeof(SearchParam[param]) == 'string')
		{
			if(param > 0)
			{
				ParamObjStr = ParamObjStr + ',';
			}
			SearchParam[param] = SearchParam[param].replace("=", ":'");
			SearchParam[param] = SearchParam[param] + "'";
			ParamObjStr = ParamObjStr + SearchParam[param];
		}
	}
	ParamObjStr = ParamObjStr + "}";
	var ParamObj = eval('(' + ParamObjStr + ')');
	return ParamObj;
}


//Jalen add for object clone
//该函数深度克隆一个对象，调用方式为
//var newObj = clone(oldObj);
clone = function(oldObj)
{
	try
	{
		if(!oldObj)
		{
			return oldObj;
		}
		var obj = null;
		if (oldObj.length)
		{
			obj = new Array();
		}
		else
		{
			obj = new Object();
		}

		for(var e in oldObj)
		{
			if(typeof(oldObj[e]) == "object")
			{
				obj[e] = clone(oldObj[e]);
			}
			else
			{
				obj[e] = oldObj[e];
			}
		}
	}
	catch(e)
	{
		return null;
	}
	return obj;
}

//在aoTarget节点前插入新节点aoNew
function $InsertAfter(aoNew,aoTarget)
{
	var oParent=aoTarget.parentNode;
	if(oParent.lastChild==aoTarget)
	{
		oParent.appendChild(aoNew);
	}
	else
	{
		oParent.insertBefore(aoNew,aoTarget.nextSibling);
	}
}

//为节点aoEle添加css类asValue，不会覆盖已有的css类。asValue为字符串
function $AddClass(aoEle,asValue)
{
	if (!aoEle.className) 
	{
		aoEle.className = asValue;
	}
	else 
	{
		if (aoEle.className.indexOf(asValue)<0) 
		{
			sTemp = aoEle.className;
			sTemp += ' ';
			sTemp += asValue;
			aoEle.className = sTemp;
		}
	}
}

/**
 * 移除DOM对象的class类
 * @param {Object} aoEle：目标对象
 * @param {Object} asClass：需要移除的class名称
 */
function $RemoveClass(aoEle,asClass)
{
	//var x=aoEle.className;
	var aClasses=aoEle.className.split(' ');
	var aNewClass=new Array();
	for(var i=0;i<aClasses.length;i++)
	{
		if(aClasses[i]!=asClass)
		{
			aNewClass.push(aClasses[i]);
		}
		
	}
	var newClass='';
	
	for(var i=0;i<aNewClass.length;i++)
	{
		newClass=newClass+' '+aNewClass[i];
	}
	aoEle.className=newClass;
	
}


/**
 * Jalen add
 * 利用 alert 显示某个对象或字符串
 *
 * @param {Object} obj  //对象
 * @param {Object} sep  //显示时，对象成员之间的分隔符，不填的话，默认为'\n'
 *
 * return
 * 绝对距离的数组[left, top]
 */
function $Alert(obj, sep)
{
	var separate = '\n';
	var str;
	if(typeof(obj) != 'object')
	{
		str = obj;
	}
	if(sep)
	{
		separate = sep;
	}
	else
	{
		str = '{ ';
		var num = 0;
		for(var i in obj)
		{
			if(num > 0) str += separate;
			str += i + ':' + obj[i];
			num++;
		}
		str += '}';
	}
	alert(str);
}

/**
 * 获取事件对象
 * @param {Object} Para：事件函数的arguments[0]
 */
function $GetEvent(Para)
{
	if (isIE)
    {
		return window.event;
    }
    else
    {
        return Para;
    }
}
/**
 * 添加到收藏夹
 * @param {在收藏夹中的名称} title
 * @param {url} url
 */
function addFavor(title, url)
{
    if (isIE)
    {
        window.external.AddFavorite(url, title);
    }
    else
    {
        window.sidebar.addPanel(title, url, "");
    }

}

function trim(str){  
    // 用正则表达式将前后空格  
    // 用空字符串替代。  
    return str.replace(/(^\s*)|(\s*$)/g, "");  
}

/**
 * Jalen add
 * get the toppest window
 *
 * return
 * toppest window
 */
function $GetTopWindow()
{
	CurWin = window;
	while(1)
	{
		if(CurWin.parent == CurWin)
		{
			return CurWin;
		}
		CurWin = CurWin.parent;
	}
}
/**
 * 设定测试定时器
 *
 * @param {检查间隔} seconds
 * @param {检查条件,如果为假的话将一直检查下去,直到为真退出} strTestVar
 * @param {执行函数,如指定,则将在检查条件为真时执行} func
 */
function TimeExcute(seconds, strTestVar, strFunc)
{
//alert("1");
    if (strTestVar != null)
    {
        if (!eval(strTestVar))
        {
            var strParam = "TimeExcute(" + seconds +
				            ",'" + strTestVar.replace("'", '"') + "'" +
				            ",'" + strFunc.replace(/'/g, '"') + "')";
            setTimeout(strParam, seconds);
        }
        else
        {
            if (strFunc != null)
            {
				//alert(strFunc);
				try{
					//alert(strFunc + 2);
					eval(strFunc);
					//alert(strFunc + 3);
				}
				catch(e)
				{
					alert(strFunc);
					var a = 1;
				}

            }
			else
			{
				alert('TimeExcute:没有设置执行函数！')
			}
        }
    }
    else
    {
		alert('TimeExcute:没有设置检查条件！');
    }

}
