function FriendPicker(aoConf){
	if(!aoConf){
		aoConf={};
	}
	var U = iUtil();	
	var obj = {};
	obj.data = {};
	obj.event = {};
	obj.view = {};
	obj.ctrl = {};	
	obj.ctrl.email=aoConf.email ||false;
	obj.ctrl.maxFriends=aoConf.maxFriends ||5;
	obj.ctrl.curUnitClassName=aoConf.curUnitClassName||"cur";
	obj.ctrl.unitErrorClassName=aoConf.unitErrorClassName||"error";
	obj.ctrl.emailClassName=aoConf.emailClassName||"email";
	obj.ctrl.curUnitErrorClassName=aoConf.curUnitErrorClassName||"curError";
	obj.ctrl.redirect=aoConf.redirect ||"http://www.myspace.cn?uid=";
	obj.ctrl.friendSelectorGetUrl=aoConf.friendSelectorGetUrl ||"http://cso.myspace.cn/search/dataapi/sfpy.php?range=all&imgsize=w&start={K:start}&count={K:count}&kw=";
	obj.ctrl.autoSuggestGetUrl=aoConf.autoSuggestGetUrl || "http://cso.myspace.cn/search/dataapi/sfpy.php?range=all&imgsize=w&start=0&count={K:count}&kw={K:keyWord}";
	obj.ctrl.redirect=aoConf.redirect ||"http://www.myspace.cn?uid=";
	obj.ctrl.listWidthDiff=aoConf.listWidthDiff || 0;
	obj.ctrl.listLeftDiff=aoConf.listLeftDiff || 0;
	obj.ctrl.listTopDiff=aoConf.listTopDiff || 0;
	obj.ctrl.panelLeftDiff=aoConf.panelLeftDiff || 0;
	obj.ctrl.panelTopDiff=aoConf.panelTopDiff || 0;
	obj.ctrl.panelAlign=aoConf.panelAlign || "left";
	obj.ctrl.redirect=aoConf.redirect;
	
	//私有变量
	var liEmailCount=0;
	var lbInputShow=true;
	var lbInputNull=true;
	
	obj.dom={
		wrapper:aoConf.wrapper||document.getElementById("ctrl_friendPickerWrapper"),
		trigger:aoConf.trigger||document.getElementById("ctrl_displayTrigger"),
		selectedFriendsWrapper:aoConf.selectedFriendsWrapper||document.getElementById("ctrl_friendPickerSelectedFriends"),
		input:aoConf.input||document.getElementById("ctrl_friendNameInput")
	};
	obj.view.friendUnit='<div class="friendUnit {K:ClassName}"><div class="friendUnitR" uid="{K:UserId}" title="{K:Title}">{K:DisplayName}<img class="close" src="http://xfiles.cdnmyspace.cn/dir/vi/v2/img/k_friend_close2.gif" /></div></div>';
	obj.view.empty=aoConf.empty||'<ul><div class="isNull">无匹配好友，请检查输入</div></ul>';
	obj.view.tip=aoConf.tip||'<ul><div class="tip">请输入好友姓名、昵称（支持拼音）</div></ul>';
	obj.view.listMaxTip='<ul><div class="tip max">最多只能同时发送'+obj.ctrl.maxFriends+'个好友</div></ul>';
	if(obj.ctrl.email){
		obj.view.empty=aoConf.empty||'<ul><div class="isNull">无匹配好友，请检查输入;Email直接回车</div></ul>';
		obj.view.tip=aoConf.tip||'<ul><div class="tip">请输入好友姓名、昵称（支持拼音）、Email</div></ul>';		
	}
	//调用者可以修改的方法
	obj.setDefaultFriends=setDefaultFriends;
	obj.updateSelectedFriends=updateSelectedFriends;
	obj.removeFriend=removeFriend;
	obj.keyUpInputHandler=keyUpInputHandler;
	obj.inputShow=inputShow;
	obj.inputHide=inputHide;
	obj.adjustList=adjustList;
	obj.adjustPanel=adjustPanel;
	obj.buildListTip=buildListTip;
	
	
	//好友选择面板的初始化
	obj.friendSelector = FriendSelector({
		getItemsUrl:obj.ctrl.friendSelectorGetUrl,
		trigger:obj.dom.trigger,
		maxFriends:obj.ctrl.maxFriends,
        initShowAll : aoConf.initShowAll,
		redirect:obj.ctrl.redirect
	});
	obj.friendSelector.event.choiceClickHandler=obj.updateSelectedFriends;
	obj.friendSelector.event.show=obj.adjustPanel;


	//好友选择建议列表的初始化
	obj.autoSuggest = AutoSuggest({
		getUrl:obj.ctrl.autoSuggestGetUrl,
		input:obj.dom.input,
		empty:obj.view.empty,
		tip:obj.view.tip,
		showCount:10,
		isGetLocal:true,
		delaySearch:50,
		initGetNumber:100,
		searchCount:10,
		topDiff:obj.ctrl.listTopDiff,
		leftDiff:obj.ctrl.listLeftDiff
	});
	obj.autoSuggest.event.show=obj.adjustList;
	obj.autoSuggest.event.inputNull=obj.buildListTip;
	obj.autoSuggest.submit = function(){
		if(!obj.autoSuggest.dom.curListItem){
			if(obj.ctrl.email){
				var lsName=U.trim(obj.dom.input.value);
				var lsId = "_email"+liEmailCount++;
				if(lsName==""){
					return;
				}
				if(obj.friendSelector.getSelectedItemsLength()<obj.ctrl.maxFriends){
					obj.friendSelector.data.selectedItems[lsId] = lsName;
				}
				obj.updateSelectedFriends();
				obj.dom.input.value="";
				obj.buildListTip();
			}			
			return false;
		}
		var leCurListItem=obj.autoSuggest.dom.curListItem;
		var lsId = leCurListItem.getAttribute("uid");
		var lsName = leCurListItem.getAttribute("title");
		if(obj.ctrl.maxFriends<=1){
			obj.friendSelector.data.selectedItems = {};
			obj.friendSelector.data.selectedItems[lsId] = lsName;
			if(obj.ctrl.redirect){
				location.href=obj.ctrl.redirect+lsId;
			}
		}else{
			if(obj.friendSelector.getSelectedItemsLength()<obj.ctrl.maxFriends){
				obj.friendSelector.data.selectedItems[lsId] = lsName;
			}
		}		
		U.removeClass(obj.autoSuggest.dom.curListItem,obj.autoSuggest.ctrl.curListItemClassName);
		obj.autoSuggest.dom.curListItem = null;
		
		obj.updateSelectedFriends();
		obj.autoSuggest.dom.input.value = "";
		obj.buildListTip();
		
		if(obj.friendSelector.isShow()){
			obj.friendSelector.updateStatus();			
		}
	}
	
	init();
	return obj;
	
	
	function init(){
		stopLoading();
		if(aoConf.openPanel){
			obj.friendSelector.clickDocHandler=function(){};
			obj.friendSelector.triggerDisplay();
		}		
		listen();
		if(aoConf.defaultFriends){
			obj.setDefaultFriends(aoConf.defaultFriends);
		}
	}
	function listen(){
		U.addEvent(obj.dom.wrapper,"click",clickWrapperHandler);
		U.addEvent(obj.dom.input,"keydown",keyDownInputHandler);
		U.addEvent(obj.dom.input,"keyup",keyUpInputHandler);
		U.addEvent(obj.dom.input,"blur",blurInputHandler);
		obj.friendSelector.listen();
		obj.autoSuggest.listen();		
	}
	//建议列表在输入关键词为空时的视图
	function buildListTip(){
		var lsHTML="";
		var liFriends=obj.friendSelector.getSelectedItemsLength();
		if(liFriends>=obj.ctrl.maxFriends && obj.ctrl.maxFriends>1){
			//好友数已经达到最大值
			lsHTML = obj.view.listMaxTip;
		}else{
			//输入提示
			lsHTML = obj.view.tip;
		}
		obj.autoSuggest.buildUIAction({});
		obj.autoSuggest.dom.wrapper.innerHTML = lsHTML;
	}
	//调整建议列表的位置	
	function adjustList(){
		if(!obj.autoSuggest.isShow()){
			return;
		}
		var leInputWrapper=obj.dom.input.parentNode;
		var leListWrapper=obj.autoSuggest.dom.wrapper;
		leListWrapper.style.width=leInputWrapper.clientWidth+obj.ctrl.listWidthDiff+"px";
		leListWrapper.style.left = U.pageX(leInputWrapper)+obj.ctrl.listLeftDiff+"px";	
		leListWrapper.style.top = U.pageY(leInputWrapper) +leInputWrapper.clientHeight+obj.ctrl.listTopDiff+"px";
		if(U.isIE()==6){
			obj.autoSuggest.dom.iframe.style.width = leListWrapper.style.width;
			obj.autoSuggest.dom.iframe.style.left = leListWrapper.style.left;
			obj.autoSuggest.dom.iframe.style.top = leListWrapper.style.top;
		}
	}
	//调整好友选择面板的位置
	function adjustPanel(){
		if(!obj.friendSelector.isShow()){
			return;
		}		
		var leInputWrapper=obj.dom.input.parentNode;
		var leWrapper=obj.friendSelector.dom.wrapper;
		if(obj.ctrl.panelAlign=="left"){
			leWrapper.style.left = U.pageX(leInputWrapper)+obj.ctrl.panelLeftDiff+"px";				
		}else{
			var liDiff=leInputWrapper.clientWidth-leWrapper.clientWidth;
			leWrapper.style.left = U.pageX(leInputWrapper)+obj.ctrl.panelLeftDiff+liDiff+"px";
		}

		leWrapper.style.top = U.pageY(leInputWrapper) +leInputWrapper.clientHeight+obj.ctrl.panelTopDiff+"px";	
	}
	function clickWrapperHandler(event){
		event = window.event||event;
		var leTarget=event.target || event.srcElement;
		if(leTarget==obj.dom.wrapper && lbInputShow){
			obj.dom.input.focus();
		}		
	}
	function blurInputHandler(){
		U.removeClass(obj.dom.curUnit,obj.ctrl.curUnitClassName);
		obj.dom.curUnit=null;
	}
	function keyDownInputHandler(){
		if(obj.dom.input.value.length==0){
			lbInputNull=true;
		}else{
			lbInputNull=false;
		}
	}
	function keyUpInputHandler(event){
		if(!lbInputNull){
			U.removeClass(obj.dom.curUnit,obj.ctrl.curUnitClassName);
			obj.dom.curUnit=null;
			return;
		}
		event = window.event||event;
		switch(event.keyCode){
			case 37:
				if(obj.dom.curUnit){
					removeUnitClassName(obj.dom.curUnit);
					var lePrev = obj.dom.curUnit.previousSibling;
					if(lePrev){
						obj.dom.curUnit = lePrev;
						addUnitClassName(obj.dom.curUnit);
					}else{
						obj.dom.curUnit = null;
					}
				}else{					
					obj.dom.curUnit = obj.dom.selectedFriendsWrapper.lastChild;
					if(!obj.dom.curUnit){
						return false;
					}
					addUnitClassName(obj.dom.curUnit);
				}				
				break;
			case 39:
				if(obj.dom.curUnit){
					removeUnitClassName(obj.dom.curUnit);
					var leNext = obj.dom.curUnit.nextSibling;
					if(leNext){
						obj.dom.curUnit = leNext;
						addUnitClassName(obj.dom.curUnit);
					}else{
						obj.dom.curUnit = null;
					}
				}else{					
					obj.dom.curUnit = obj.dom.selectedFriendsWrapper.firstChild;
					if(!obj.dom.curUnit){
						return false;
					}
					addUnitClassName(obj.dom.curUnit);
				}				
				break;
			case 8:
				if(!obj.dom.curUnit&&obj.dom.selectedFriendsWrapper.lastChild){
					obj.removeFriend(obj.dom.selectedFriendsWrapper.lastChild.childNodes[0]);	
				}			
			case 46:
				// to do childNodes
				if(obj.dom.curUnit){
					obj.removeFriend(obj.dom.curUnit.childNodes[0]);	
				}
				break;
			default:
				removeUnitClassName(obj.dom.curUnit);
				obj.dom.curUnit=null;
				break;							
		}		
	}
	function addUnitClassName(aeNode){
		if(U.hasClass(aeNode,obj.ctrl.unitErrorClassName)){
			U.addClass(aeNode,obj.ctrl.curUnitErrorClassName);
		}else{
			U.addClass(aeNode,obj.ctrl.curUnitClassName);
		}
	}
	function removeUnitClassName(aeNode){
		U.removeClass(obj.dom.curUnit,obj.ctrl.curUnitClassName);
		U.removeClass(obj.dom.curUnit,obj.ctrl.curUnitErrorClassName);		
	}
	//预设选中的好友
	function setDefaultFriends(axData){
		for(var i=0;i<axData.length;i++){
			var loData=axData[i];
			if(!loData.UserId){
				continue;
			}
			obj.friendSelector.data.selectedItems[loData.UserId]=loData.DisplayName;
		}
		obj.updateSelectedFriends();		
	}
	function updateSelectedFriends(){
		var lxData = [];
		var loSelectdFriends=obj.friendSelector.data.selectedItems;
		for (var x in loSelectdFriends){
			var lsName = loSelectdFriends[x].substring(0,19).split("<").join("&lt;").split(">").join("&gt;");
			var lsTitle = loSelectdFriends[x].split('"').join("&quot;").split("'").join("&#39;");
			var loData={"DisplayName":lsName,"Title":lsTitle,"UserId":x};
			if(x.indexOf("_email")!=-1){
				var pattern = /^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.){1,4}[a-z]{2,3}$/;
				if(!pattern.test(loSelectdFriends[x])){
					loData["ClassName"]=obj.ctrl.unitErrorClassName;
				}else{
					loData["ClassName"]=obj.ctrl.emailClassName;
				}
			}
			lxData.push(loData);
		}
		obj.dom.selectedFriendsWrapper.innerHTML = U.smartView(obj.view.friendUnit,lxData);
		var lxClose = U.byClass("close",obj.dom.selectedFriendsWrapper,"img");
		for(var i=0;i<lxClose.length;i++){
			var leClose = lxClose[i];
			var leItem = leClose.parentNode;
			U.addEvent(leClose,"click",removeClickHandler);
		}
		
		//当好友单选时，及时隐藏输入框
		if(obj.ctrl.maxFriends<=1){
			if(lxClose.length>0){
				obj.inputHide();
			}else{
				obj.inputShow();
			}			
		}

		obj.adjustList();
		obj.adjustPanel();
		if(obj.event.updateSelectedFriends){
			obj.event.updateSelectedFriends();
		}
	}
	function removeClickHandler(event){
		event = event || window.event;
		var leTarget = event.target || event.srcElement;
		obj.removeFriend(leTarget.parentNode);
		obj.friendSelector.clickSelfHandler();
	}
	function removeFriend(aeNode){
		var leTarget = aeNode;
		if(!leTarget){
			return;
		}
		var lsId = leTarget.getAttribute("uid");
		delete obj.friendSelector.data.selectedItems[lsId];
		if(obj.friendSelector.isShow()){
			obj.friendSelector.updateStatus();			
		}
		obj.updateSelectedFriends();
	}
	function stopLoading(){		
		var leInput = obj.autoSuggest.dom.input;
		if (!leInput){return false;}
		var lsDefVal = leInput.getAttribute("defval")||"";
		U.removeClass(leInput.parentNode,"loading");
		leInput.value=lsDefVal;
		leInput.blur();
	}
	function inputShow(){
		if(!lbInputShow){
			obj.dom.input.style.visibility="visible";
			lbInputShow=true;
		}
	}
	function inputHide(){
		if(lbInputShow){
			obj.dom.input.style.visibility="hidden";
			lbInputShow=false;
		}
	}		
	function FriendSelector(aoConf){
		var obj = {};
		obj.data = {};
		obj.event = {};
		obj.view = {};
		obj.ctrl = {};
		obj.data.selectedItems = {};
		obj.data.options = null;
		obj.dom = {
			trigger:aoConf.trigger,
			wrapper:null,
			select:null,
			list:null,
			ok:null,
			count:null,
			getChoice:function(){
				return obj.dom.list.getElementsByTagName("input");
			}
		};
		obj.ctrl.redirect=aoConf.redirect || false;
        obj.ctrl.initShowAll=aoConf.initShowAll || false;        
		obj.ctrl.wrapperClassName = aoConf.wrapperClassName || "friendSelectorWrapper";
		obj.ctrl.maxFriends = aoConf.maxFriends || 20;		
		obj.ctrl.getGroupUrl = "http://friends.myspace.cn/jsi.php?act=listcat";
		obj.ctrl.getItemsByGroupUrl = "http://friends.myspace.cn/jsi.php?act=list_friends&imgsize=w&start={K:start}&count={K:count}&catid=";
		//obj.ctrl.getItemsUrl = "http://music.myspace.cn/jsi.php?act=search_friend&imgsize=w&start={K:start}&count={K:count}&kw=";
		obj.ctrl.getItemsUrl = aoConf.getItemsUrl || "http://cso.myspace.cn/search/dataapi/sfpy.php?range=all&imgsize=w&start={K:start}&count={K:count}&kw=";
		
		var lbIsShow = false;
		var lsOptionAllValue = "_all";
		var lbDelayScroll = true;
		var lbCanHide=true;
	
		obj.view.content = ['	 <div class="topSeg">                                             ',          
							'		<select><option value="_all">全部好友</option></select>     ',
							'	 </div>',
							'	 <ul class="_friendSelector_list"></ul>',
							'	 <div class="botSeg">',
							'		<label class="tip"></label>',
							obj.ctrl.maxFriends<=1?"":'<a href="javascript:void(0)" class="cnViBtnBlue"><b><i>确　定</i></b></a>',
							'	 </div>'].join("");
	
		obj.selectChangeHandler=selectChangeHandler;
		obj.scrollToNext=scrollToNext;
		obj.listenChoice=listenChoice;
		obj.updateStatus = updateStatus;
		obj.triggerDisplay = triggerDisplay;
		obj.getSelectedItemsLength = getSelectedItemsLength;
		obj.choiceClickHandler=choiceClickHandler;
		obj.clickSelfHandler=clickSelfHandler;
		obj.clickDocHandler=clickDocHandler;		
		obj.show = show;
		obj.hide = hide;
		obj.isShow = isShow;
		obj.buildUI = buildUI;
		obj.listen = listen;
		
		return obj;
		
		function buildUI(){
			if(!obj.dom.wrapper){
				var leWrapper = document.createElement("div");			
				leWrapper.className = obj.ctrl.wrapperClassName;
				leWrapper.innerHTML = obj.view.content;
				document.body.insertBefore(leWrapper,document.body.firstChild);
				
				
				obj.dom.wrapper=leWrapper;
				obj.dom.select = leWrapper.getElementsByTagName("select")[0];
				obj.dom.list = leWrapper.getElementsByTagName("ul")[0];
				obj.dom.count = leWrapper.getElementsByTagName("label")[0];
				obj.dom.ok = leWrapper.getElementsByTagName("a")[0];
				
				U.addEvent(obj.dom.wrapper,"click",obj.clickSelfHandler);
				U.addEvent(obj.dom.select,"change",obj.selectChangeHandler);
				U.addEvent(obj.dom.list,"scroll",obj.scrollToNext);
				U.addEvent(obj.dom.ok,"click",obj.triggerDisplay);	
				
				initSmartList();
			}
            if(!obj.ctrl.initShowAll){
                obj.smartList.buildUI();
            }
			
			
			//创建朋友分组的下拉列表
			if(!obj.data.options){
				U.loadJsonP(obj.ctrl.getGroupUrl,action);
			}
			function action(aoData){
				obj.data.options = aoData;
				var loGroup = aoData.Msg;
				for(var x in loGroup){
					var leOption = new Option();
					leOption.value = x;
					leOption.innerHTML = loGroup[x];
					obj.dom.select.appendChild(leOption);
				}
                if(obj.event.buildUI){
                    obj.event.buildUI();
                }
			}
		}
		function listen(){
			U.addEvent(obj.dom.trigger,"click",obj.triggerDisplay);
			U.addEvent(obj.dom.trigger,"click",obj.clickSelfHandler);
			U.addEvent(document,"click",obj.clickDocHandler);			
		}
		function clickDocHandler(){
			if(lbCanHide){
				obj.hide();
			}
			lbCanHide=true;
		}
		function clickSelfHandler(){
			lbCanHide=false;
		}
		function initSmartList(){
			obj.smartList = SmartList({
				getUrl:obj.ctrl.getItemsUrl,
				wrapper:obj.dom.list,
				header:'',
				repeater:'<li uid="{K:UserId}" title="{K:Title}"><input id="input_{K:UserId}" name="friend" type="'+(obj.ctrl.maxFriends<=1?"radio":"checkbox")+'" /><label for="input_{K:UserId}"><img src="{K:Image}" /><span>{K:DisplayName}</span></label></li>',
				footer:'',
				emptyView:'<div class="isNull">没有找到符合条件的好友！</div>',
				isAccumulate:true,
				pageSize:40
			});
			obj.smartList.filter = function(axData){
				var lxResult = [];
				for(var i=0;i<axData.length;i++){
					var loData = axData[i];
					if(loData.DisplayName){
						loData.DisplayName = loData.DisplayName.substring(0,19).split("<").join("&lt;").split(">").join("&gt;");	
						loData.Title = loData.DisplayName.split('"').join("&quot;").split("'").join("&#39;");
					}else{
						loData.DisplayName = "";
						loData.Title = "";
					}
					lxResult.push(loData);
				}
				return lxResult;
			}
			obj.smartList.event.buildUI = function(){
				obj.listenChoice();
				obj.updateStatus();
			};			
		}
		function scrollToNext(){
			var leNode = obj.dom.list;
			var liHeight = parseInt(U.getStyle(leNode,"height").split("px")[0]);
			if(!leNode.lastChild){
				return false;
			}
			var liDif = leNode.lastChild.offsetTop - leNode.scrollTop - liHeight - 9;
			if(liDif < 5 && lbDelayScroll){
				lbDelayScroll = false;
				setTimeout(function(){
					if(obj.smartList.pager.ctrl.totalPage > obj.smartList.pager.ctrl.curPage){
						obj.smartList.pager.ctrl.curPage++;
						obj.smartList.buildUI();
					}
					lbDelayScroll = true;
				},500);
			}
		}
		function selectChangeHandler(){
			var lsSelectVal = obj.dom.select.value;
			obj.smartList.pager.ctrl.curPage = 1;
			obj.smartList.dom.wrapper.innerHTML = "";			
			if(lsSelectVal != lsOptionAllValue){
				obj.smartList.ctrl.getUrl = obj.ctrl.getItemsByGroupUrl + encodeURIComponent(lsSelectVal);
			}else{
				obj.smartList.ctrl.getUrl = obj.ctrl.getItemsUrl;
			}
			obj.smartList.buildUI();
		}
		function listenChoice(){
			var lxChoice = obj.dom.getChoice();		
			for(var i=0; i<lxChoice.length;i++){
				lxChoice[i].onclick = obj.choiceClickHandler;
			}
		}
		// to abstact
		function choiceClickHandler(){
			var leChoice = this;
			var lsId = leChoice.parentNode.getAttribute("uid");
			var lsName = leChoice.parentNode.getAttribute("title");
			if(obj.ctrl.maxFriends<=1){
				obj.data.selectedItems={};
				obj.data.selectedItems[lsId] = lsName;
				obj.hide();
				if(obj.ctrl.redirect){
					location.href=obj.ctrl.redirect+lsId;
				}
			}else{
				if(!leChoice.checked){					
					delete obj.data.selectedItems[lsId];
				}else{
					obj.data.selectedItems[lsId] = lsName;
				}
				obj.updateStatus();		
			}
			if(obj.event.choiceClickHandler){
				obj.event.choiceClickHandler();
			}	
		}
		function updateStatus(){
			var liSelectedItems = obj.getSelectedItemsLength();
			var lxSelectTrigger = obj.dom.getChoice();
			
			//设置choice是否被选中
			for(var i=0; i<lxSelectTrigger.length;i++){
				var leSelectTrigger = lxSelectTrigger[i];
				var lsId = leSelectTrigger.parentNode.getAttribute("uid");
				if(obj.data.selectedItems[lsId]){
					leSelectTrigger.checked = true;
				}else{
					leSelectTrigger.checked = false;
				}
			}
			//设置choice是否可用			
			if(liSelectedItems >= obj.ctrl.maxFriends){
				for(var i=0; i<lxSelectTrigger.length;i++){
					var leSelectTrigger = lxSelectTrigger[i];				
					if(!leSelectTrigger.checked){
						leSelectTrigger.disabled = true;
					}
				}
			}else{
				for(var i=0; i<lxSelectTrigger.length;i++){
					var leSelectTrigger = lxSelectTrigger[i];				
					if(!leSelectTrigger.checked){
						leSelectTrigger.disabled = false;
					}
				}
			}
			//显示好友数量即将达到或已经达到最大的提示
			var liDiff=obj.ctrl.maxFriends - liSelectedItems;
			if(liDiff<= 3){
				if(liDiff==0){
					obj.dom.count.innerHTML = "最多只能同时发送"+obj.ctrl.maxFriends+"个好友";	
				}else{
					obj.dom.count.innerHTML = "还能添加"+liDiff+"个好友";
				}
				obj.dom.count.style.display = "inline";
			}else{
				obj.dom.count.style.display = "none";
			}			
			if(obj.event.updateStatus){
				obj.event.updateStatus();
			}
		}
		function getSelectedItemsLength(){
			var index = 0;
			for(var x in obj.data.selectedItems){
				index++;
			}
			return index;
		}
		function show(){
			if(!obj.ctrl.firstBuild){
				obj.buildUI();
				obj.ctrl.firstBuild = true;
			}
	
			obj.dom.wrapper.style.display = "block";	
			lbIsShow = true;
			obj.updateStatus();
			if(obj.event.show){
				obj.event.show();
			}
		}
		function isShow(){
			return obj.dom.wrapper&&obj.dom.wrapper.style.display == "block";
		}		
		function hide(){
			if(lbIsShow){
				obj.dom.wrapper.style.display = "none";
				lbIsShow = false;				
			}
		}
		function triggerDisplay(){
			if(lbIsShow){
				obj.hide();
			}else{
				obj.show();
			}			
		}			
	}
		

	function AutoSuggest(aoConf){	
	    var obj = {};
	    obj.data = {};
		obj.data.indexedData = {};
		obj.data.cachedData = {};
	    obj.view = {};
	    obj.ctrl = {};
	    obj.dom = {};
	    obj.event = {};
		
		
		obj.dom.input = aoConf.input;
		obj.dom.wrapper = null;	//提示列表的根结点
		obj.dom.iframe = null;
		obj.dom.list = null;
		obj.dom.listItems = null;
		obj.dom.curListItem = null;
		
	    obj.view.header = aoConf.header || '<ul class="kcz_friendSuggest">';
	    obj.view.repeater = aoConf.repeater || '<li title="{K:DisplayName}" uid="{K:UserId}"><img src="{K:Image}" /><label>{K:DisplayName}</label></li>'; 
	    obj.view.footer = aoConf.footer || '</ul>';
		obj.view.empty = aoConf.empty || '';
		obj.view.tip = aoConf.tip || '';
		
		obj.ctrl.getUrl = aoConf.getUrl || "http://cso.myspace.cn/search/dataapi/sfpy.php?range=all&imgsize=w&start=0&count={K:count}&kw={K:keyWord}";
		obj.ctrl.key = aoConf.key || "UserId";
		obj.ctrl.isGetLocal = aoConf.isGetLocal || false;	//是否从客户端的缓存中搜索
		obj.ctrl.displayField = aoConf.displayField || "DisplayName"; //在搜索框中显示哪个字段
		obj.ctrl.curListItemClassName = aoConf.curListItemClassName || "cur";	
		obj.ctrl.curKeyWord = "";
		obj.ctrl.leftDiff = aoConf.leftDiff || 0;	//建议列表与输入框的距离
		obj.ctrl.topDiff = aoConf.topDiff || 0;
		obj.ctrl.selectFirst = true;	//默认是否选中第一条
		obj.ctrl.initData = true;
		obj.ctrl.initGetNumber = aoConf.initGetNumber || 30;
		obj.ctrl.searchCount = aoConf.searchCount || 100;
		obj.ctrl.showCount = aoConf.showCount || 100;
		obj.ctrl.delaySearch = aoConf.delaySearch || 100;
		obj.ctrl.hideTimer = null;
		obj.ctrl.searchTimer = null;
		obj.ctrl.wrapperClassName = aoConf.wrapperClassName || "autoSuggest";
		    
	    obj.listen = listen;
	    obj.buildUI = buildUI;
		obj.initData = initData;
		obj.getData = getData;
		obj.getDataArray = getDataArray;
		obj.getRemoteData = getRemoteData;
		obj.filter = filter;
		obj.getRemoteSearchResultCallback = getRemoteSearchResultCallback;
		obj.buildUIAction = buildUIAction;
		obj.createIndex = createIndex;
		obj.isValidSearchResult = isValidSearchResult;
		obj.validateArray = validateArray;
			
		obj.clickListHandler = clickListHandler;
		obj.getNodeInputField = getNodeInputField;
		obj.moveListHandler = moveListHandler;
		obj.keyUpInputHandler = keyUpInputHandler;
		obj.blurInputHandler = blurInputHandler;
		
		obj.submit = submit;
		obj.show = show;
		obj.hide = hide;
		obj.isShow = isShow;
		
		
	    return obj;
	    
		function listen(){
			if (!obj.dom.input){return false}
			obj.dom.input.setAttribute("autocomplete","off");
			U.addEvent(obj.dom.input,"keyup",obj.keyUpInputHandler);
			U.addEvent(obj.dom.input,"focus",obj.keyUpInputHandler);
			U.addEvent(obj.dom.input,"blur",obj.blurInputHandler);
		}
		function blurInputHandler(){
			var lsDefVal = obj.dom.input.getAttribute("defval");
	    	if(!/\S/.test(obj.dom.input.value)){
	    		obj.dom.input.value = lsDefVal || "";
	    	}		
			obj.hide();
		}
		function submit(){
			if(!obj.dom.curListItem){
				return false;
			}
			var leCurListItem=obj.dom.curListItem;
			U.removeClass(obj.dom.curListItem,obj.ctrl.curListItemClassName);	
			obj.dom.curListItem = null;
			obj.hide();
			if(obj.event.submit){
				obj.event.submit(leCurListItem);
			}			
		}
		
		function clickListHandler(event){
			obj.submit();	
		}
		function moveListHandler(event){
			event = event || window.event;
			var leTarget = event.target || event.srcElement;
			if(leTarget.tagName.toLowerCase() == "li"){
				if(!U.hasClass(leTarget,obj.ctrl.curListItemClassName)){
					if(obj.dom.curListItem){
						U.removeClass(obj.dom.curListItem,obj.ctrl.curListItemClassName);
					}							
					U.addClass(leTarget,obj.ctrl.curListItemClassName);
					obj.dom.curListItem = leTarget;
				}
			}	
		}
		function keyUpInputHandler(event){	
			var lsDefVal = obj.dom.input.getAttribute("defval");
	    	if(obj.dom.input.value == lsDefVal){
	    		obj.dom.input.value = "";
	    	}
			event = window.event||event;
			switch(event.keyCode){
				case 38:			
					if(obj.dom.curListItem){
						U.removeClass(obj.dom.curListItem,obj.ctrl.curListItemClassName);
						var lePrev = obj.dom.curListItem.previousSibling;
						if(lePrev){
							obj.dom.curListItem = lePrev;
							U.addClass(obj.dom.curListItem,obj.ctrl.curListItemClassName);
							obj.dom.input.value = obj.getNodeInputField(obj.dom.curListItem);
						}else{
							obj.dom.curListItem = null;
							obj.dom.input.value = obj.ctrl.curKeyWord;
						}
					}else{
						if(!obj.dom.list){
							return false;
						}									
						obj.dom.curListItem = obj.dom.list.lastChild;
						if(!obj.dom.curListItem){
							return false;
						}
						U.addClass(obj.dom.curListItem,obj.ctrl.curListItemClassName);
						obj.dom.input.value = obj.getNodeInputField(obj.dom.curListItem);		
					}
					break;
				case 40:
					if(obj.dom.curListItem){
						U.removeClass(obj.dom.curListItem,obj.ctrl.curListItemClassName);
						var leNext = obj.dom.curListItem.nextSibling;
						if(leNext){
							obj.dom.curListItem = leNext;
							U.addClass(obj.dom.curListItem,obj.ctrl.curListItemClassName);
							obj.dom.input.value = obj.getNodeInputField(obj.dom.curListItem);
						}else{
							obj.dom.curListItem = null;
							obj.dom.input.value = obj.ctrl.curKeyWord;
						}
					}else{	
						if(!obj.dom.list){
							return false;
						}										
						obj.dom.curListItem = obj.dom.list.firstChild;
						if(!obj.dom.curListItem){
							return false;
						}					
						U.addClass(obj.dom.curListItem,obj.ctrl.curListItemClassName);
						obj.dom.input.value = obj.getNodeInputField(obj.dom.curListItem);		
					}	
	
					break;
				case 27:
					obj.dom.curListItem = null;
					obj.dom.input.value = obj.ctrl.curKeyWord;			
					obj.dom.input.blur();
					break;
				case 13:
					obj.submit();
					break;
				default:
					if(event.keyCode==37 || event.keyCode==39){
						break;
					}
					if(!/\S/.test(obj.dom.input.value)){						
						if(obj.event.inputNull){
							obj.event.inputNull();
						}else{
							obj.dom.wrapper.innerHTML = obj.view.tip;
							obj.show();
						}
						break;
					}
					obj.ctrl.curKeyWord = obj.dom.input.value;
					clearTimeout(obj.ctrl.searchTimer);
					obj.ctrl.searchTimer = setTimeout(obj.buildUI,obj.ctrl.delaySearch);
					break;
			}
		}	
		function buildUI(){
			obj.getData(obj.ctrl.curKeyWord,obj.buildUIAction);		
		}
		function buildUIAction(aoData){
			var lxData = aoData;
			if(obj.filter){
				lxData = obj.filter(lxData);
			}
			if(!obj.dom.wrapper){
				obj.dom.wrapper = document.createElement("div");
				obj.dom.wrapper.className = obj.ctrl.wrapperClassName;
				document.body.appendChild(obj.dom.wrapper);
				U.addEvent(obj.dom.wrapper,"mousemove", obj.moveListHandler);
				U.addEvent(obj.dom.wrapper,"click", obj.clickListHandler);
			}
			var leWrapper = obj.dom.wrapper;
			if(lxData.length < 1){
				obj.dom.curListItem = null;
				if(obj.view.empty != ""){
					leWrapper.innerHTML = obj.view.empty;
				}	
			}else{
				leWrapper.innerHTML = [obj.view.header,U.smartView(obj.view.repeater,lxData),obj.view.footer].join("");
				obj.dom.list = leWrapper.getElementsByTagName("ul")[0];
				obj.dom.listItems = leWrapper.getElementsByTagName("li");
	
				if(obj.ctrl.selectFirst){
					obj.dom.curListItem = obj.dom.list.firstChild;
					U.addClass(obj.dom.curListItem,obj.ctrl.curListItemClassName);
				}			
			}
			leWrapper.style.width = obj.dom.input.offsetWidth +"px";
			leWrapper.style.position = "absolute";
			leWrapper.style.zIndex = 1000;
			leWrapper.style.left = U.pageX(obj.dom.input)+obj.ctrl.leftDiff + "px";
			leWrapper.style.top = U.pageY(obj.dom.input) + obj.ctrl.topDiff + "px";		
			if(U.isIE()==6){
				if(!obj.dom.iframe){
					obj.dom.iframe = document.createElement("iframe");
					obj.dom.iframe.style.position = "absolute";
					obj.dom.iframe.style.zIndex = 10;
					document.body.appendChild(obj.dom.iframe);			
				}
				obj.dom.iframe.style.width = obj.dom.input.offsetWidth+"px";
				obj.dom.iframe.style.left = leWrapper.style.left;
				obj.dom.iframe.style.top = leWrapper.style.top;
			}		
			obj.show();
			if(obj.event.buildUI){
				obj.event.buildUI();
			}
		}	
		function filter(aoData){
			var lxData = [];
			var cnt = 0;
			for(var x in aoData){
				if(x != ""){
					lxData.push(aoData[x]);
				}
				if(++cnt >= obj.ctrl.showCount){
					break;
				}
			}
			return lxData;
		}
	    function getData(asKeyWord,afCallback){
			var loCachedData = obj.data.indexedData[encodeURIComponent(asKeyWord)];
			if(!loCachedData){
				if(obj.ctrl.isGetLocal){
					obj.createIndex(asKeyWord,afCallback);
				}else{
					if(obj.ctrl.getUrl){
						obj.getRemoteData(asKeyWord);	
					}
				}			
			}else{
				afCallback(loCachedData);
			}
		}
		function getDataArray(aoData){
			return aoData.List;
		}
		function getNodeInputField(aeNode){
			return aeNode.getAttribute("title");		
		}	
		function initData(afCallback){
			obj.ctrl.initData = false;
			if(!obj.ctrl.initGetNumber || obj.ctrl.initGetNumber <= 0){
				return false;
			}
			var lsInitDataUrl = U.smartView(obj.ctrl.getUrl,{count:obj.ctrl.initGetNumber,keyWord:""});
			U.loadJsonP(lsInitDataUrl,action);
			function action(aoData){
				var lxData = obj.getDataArray(aoData);
				for(var i=0;i<lxData.length;i++){
					var loData = lxData[i];
					obj.data.cachedData[loData[obj.ctrl.key]]=loData;
				}
				afCallback(obj.data.cachedData);
			}
		}
		function getRemoteSearchResultCallback(aoData){
			var lxData = obj.getDataArray(aoData);
			var lsKeyWord = encodeURIComponent(aoData.kw) || encodeURIComponent(obj.dom.input.value);
			if(!lxData){
				alert("远程数据获取出错！");
			}
			var loSearchResult = obj.data.indexedData[lsKeyWord];
			if(!loSearchResult){
				loSearchResult = {};
			}
			
			for(var i=0;i<lxData.length;i++){
				var loData = lxData[i];
				loSearchResult[loData[obj.ctrl.key]]=loData;
				obj.data.cachedData[loData[obj.ctrl.key]]=loData;
			}
			obj.data.indexedData[lsKeyWord] = loSearchResult;		
			obj.buildUIAction(loSearchResult);
		}
		function createIndex(asKeyWord,afCallback){
			if(obj.ctrl.initData){
				obj.initData(action);
			}else{
				action(obj.data.cachedData);
			}
			function action(aoData){
				var loSearchResult = {};
				for(var x in aoData){
					var loData = aoData[x];
					if(obj.isValidSearchResult(asKeyWord,loData)){
						loSearchResult[loData[obj.ctrl.key]]=loData;
					}
				}
				obj.data.indexedData[encodeURIComponent(asKeyWord)] = loSearchResult;
				if(obj.ctrl.getUrl){
					obj.getRemoteData(asKeyWord);	
				}			
				afCallback(loSearchResult);
			}
		}
		function getRemoteData(asKeyWord){
			var lsGetUrl = U.smartView(obj.ctrl.getUrl,{count:obj.ctrl.searchCount,keyWord:encodeURIComponent(asKeyWord)});
			U.loadJsonP(lsGetUrl,obj.getRemoteSearchResultCallback);		
		}
		
		function isValidSearchResult(asKeyWord,aoData){
			var lsDisplayName = aoData.DisplayName || "";
			var lsName = lsDisplayName.toLowerCase();
			asKeyWord = asKeyWord.toLowerCase();
			var lxQP=[],lxJP=[];
			
			if(aoData.qp){
				lxQP= aoData.qp.split(",");
			}
			if(aoData.jp){
				lxJP= aoData.jp.split(",");
			}
			if(lsName.indexOf(asKeyWord)!=-1 || obj.validateArray(asKeyWord,lxQP,"left") || obj.validateArray(asKeyWord,lxJP,"left")){
				return true;
			}else{
				return false;
			}
		}
		function validateArray(asKeyWord,axData,asType){
			asType = asType || "left";
			if(asType == "left"){
				for(var i=0; i<axData.length;i++){
					if(axData[i].indexOf(asKeyWord)==0){
						return true;
					}
				}			
			}else{
				for(var i=0; i<axData.length;i++){
					if(axData[i].indexOf(asKeyWord)!=-1){
						return true;
					}
				}			
			}
	
			return false;
		}
		function isShow(){
			return obj.dom.wrapper&&obj.dom.wrapper.style.display == "block";
		}		
		function hide(){
			if(obj.dom.wrapper){
				clearTimeout(obj.ctrl.hideTimer);			
				obj.ctrl.hideTimer = setTimeout(function(){
					obj.dom.wrapper.style.display = "none";
					if(U.isIE()==6){
						obj.dom.iframe.style.display = "none";
					}				
				},200);
			}		
		}
		function show(){
			obj.dom.wrapper.style.display = "block";
			if(U.isIE()==6){
				obj.dom.iframe.style.height = obj.dom.wrapper.clientHeight;
				obj.dom.iframe.style.display = "block";
			}
			if(obj.event.show){
				obj.event.show();
			}			
		}	
	}
	function SmartList(aoConf){
	    var obj = {};
	    obj.data = {};
	    obj.view = {};
	    obj.ctrl = {};
	    obj.dom = {};
	    obj.event = {};
	    
	    obj.view.header = aoConf.header || "";
	    obj.view.repeater = aoConf.repeater || ""; 
	    obj.view.footer = aoConf.footer || "";
		obj.view.empty = aoConf.emptyView || "";
	    obj.ctrl.getUrl = aoConf.getUrl;
		obj.ctrl.pageSize = aoConf.pageSize || 10;
		obj.ctrl.isAccumulate = aoConf.isAccumulate || false;
		obj.dom.wrapper = aoConf.wrapper;
		obj.dom.getTopPager = aoConf.getTopPager;
	    obj.dom.getBottomPager = aoConf.getBottomPager;
	    	
		obj.pager = Pager({
				wrapper:aoConf.pager,
				curPage:aoConf.curPage || 1,
				pageStep:aoConf.pageStep || 5			
			});
	    obj.pager.event.clickLink = function(){
	        obj.buildUI();
			return !1;
	    }
		
	    obj.getData = getData;
	    obj.buildUI = buildUI;
	    return obj;
	    
	    function getData(afCallback){
			var liCurRecord = (obj.pager.ctrl.curPage-1) * obj.ctrl.pageSize;
			if(!obj.ctrl.getUrl){				
				if(aoConf.data){
					obj.pager.ctrl.totalPage = Math.ceil(aoConf.data.length / obj.ctrl.pageSize);
					afCallback(aoConf.data.slice(liCurRecord,liCurRecord+obj.ctrl.pageSize));
				}else{
					obj.pager.ctrl.totalPage = 1;
					afCallback([]);
				}				
			}else{				
				var lsUrl = U.smartView(obj.ctrl.getUrl,{start:liCurRecord,count:obj.ctrl.pageSize});
				var loCacheData = obj.data[lsUrl];
				if(!loCacheData){
					U.loadJsonP(lsUrl,action);			
				}else{
					action(loCacheData,true);
				}
			}
			function action(aoData,abIsCached){
				var loData = aoData;
				if(!abIsCached){
					obj.data[lsUrl] = loData;					
				}
				obj.pager.ctrl.totalPage = Math.ceil(parseInt(loData.Total) / obj.ctrl.pageSize);	
				afCallback(loData.List);
				if(obj.event.getData){
					obj.event.getData(loData);
				}
			}
	    }
	    function buildUI(){
			obj.getData(action);
		    function action(axData){
				var lxData = axData;
				if(obj.filter){
					lxData = obj.filter(axData);
				}
		    	if(lxData.length < 1){				
		    		obj.dom.wrapper.innerHTML = obj.view.empty;
		    	}else{
		    		var lsOldHTML="";
		    		if(obj.ctrl.isAccumulate){
		    			lsOldHTML=obj.dom.wrapper.innerHTML;
		    		}		    		
		    		obj.dom.wrapper.innerHTML = [lsOldHTML,obj.view.header,U.smartView(obj.view.repeater,lxData),obj.view.footer].join("");	    	
			    	if(obj.dom.getTopPager){
			    		obj.pager.dom.wrapper = obj.dom.getTopPager();
			    		obj.pager.buildUI();	
			    	}
			    	if(obj.dom.getBottomPager){
			    		obj.pager.dom.wrapper = obj.dom.getBottomPager();
			    		obj.pager.buildUI();
			    	}			
				}
		    	if(obj.event.buildUI){
		    		obj.event.buildUI();
		    	}			
		    }
	    }
	}
	/*
	 * to do: leA.onclick=clickLinkHandler
	 */
	function Pager(aoConf){
	    var obj = {};
	    obj.ctrl = {};
	    obj.dom = {};
	    obj.event = {};
	    
	    if(!aoConf){
	    	return;
	    }
	    obj.dom.wrapper = aoConf.wrapper;
	    obj.dom.getLinks = function(){
	    	return obj.dom.wrapper.getElementsByTagName("a");
	    }
	    
		obj.ctrl.curPage = aoConf.curPage || 1;
		obj.ctrl.totalPage = aoConf.totalPage || 20;
		obj.ctrl.pageStep = aoConf.pageStep || 5;
		obj.ctrl.href = aoConf.href || "?page=";
		
		obj.listen = listen;
		obj.buildUI = buildUI;
	    return obj;
	    

	    function listen(){	    
	    	var lxLinks = obj.dom.getLinks();
	        for (var i = 0; i < lxLinks.length; i++) {
	            var leA = lxLinks[i];
	            switch (leA.innerHTML) {
	                case "首页":
	                    leA.onclick = clickLinkHandler(leA, "first");
	                    break;
	                case "上一页":
	                    leA.onclick = clickLinkHandler(leA, "prev");
	                    break;
	                case "下一页":
	                    leA.onclick = clickLinkHandler(leA, "next");
	                    break;
	                case "末页":
	                    leA.onclick = clickLinkHandler(leA, "last");
	                    break;
	                default:
	                    leA.onclick = clickLinkHandler(leA, "mid");
	            }
	        }
		    function clickLinkHandler(aeA, asType){
		        return function(){
		            switch (asType) {
		                case "first":
		                    obj.ctrl.curPage = 1;
		                    break;
		                case "prev":
		                    --obj.ctrl.curPage;
		                    break;
		                case "mid":
		                    obj.ctrl.curPage = parseInt(aeA.getAttribute("title"))
		                    break;
		                case "next":
		                    ++obj.ctrl.curPage;
		                    break;
		                case "last":
		                    obj.ctrl.curPage = obj.ctrl.totalPage;
		                    break;
		            }
		            if(obj.event.clickLink){
						obj.event.clickLink();		            	
		            }else{
			            obj.buildUI();
			            return !1;		            	
		            }
		        }
		    }
	    }
	    function buildUI(){
	        var liStart = obj.ctrl.curPage - Math.floor(obj.ctrl.pageStep / 2);
	        var liEnd = obj.ctrl.curPage + Math.floor((obj.ctrl.pageStep + 1) / 2) - 1;		
	        if (liStart >= 1){
				if (liEnd > obj.ctrl.totalPage) {
	                liEnd = obj.ctrl.totalPage;
	                liStart = liEnd - obj.ctrl.pageStep + 1;
	                liStart = liStart > 0 ? liStart : 1;
	            }
	        }else {
	            liStart = 1;
	            liEnd = liStart + obj.ctrl.pageStep - 1;
	            liEnd = liEnd <= obj.ctrl.totalPage ? liEnd : obj.ctrl.totalPage;
	        }
	        var lxHTML = [];
	        lxHTML.push(['<a href="' , obj.ctrl.href , '1' , '" title="',1,'">首页</a><span>|</span><a href="' , obj.ctrl.href , (obj.ctrl.curPage - 1) , '" title="',(obj.ctrl.curPage - 1),'">上一页</a>'].join(""));
	        lxHTML.push('<span>|</span>');
	        for (var i = liStart; i <= liEnd; i++) {
	            if (i == obj.ctrl.curPage) {
	                lxHTML.push('<label>' + i + '</label>');
	            }
	            else {
	                lxHTML.push(['<a href="' , obj.ctrl.href , i , '" title="', i ,'">' , i , '</a>'].join(""));
	            }
	            lxHTML.push('<span>|</span>');
	        }
	        lxHTML.push(['<a href="' , obj.ctrl.href , (obj.ctrl.curPage + 1) , '" title="',(obj.ctrl.curPage + 1),'">下一页</a><span>|</span><a href="' , obj.ctrl.href , obj.ctrl.totalPage , '" title="',obj.ctrl.totalPage,'">末页</a>'].join(""));
	        
	        if (obj.ctrl.curPage == 1) {
	            lxHTML.shift();
	        }
	        if (obj.ctrl.curPage == obj.ctrl.totalPage) {
	            lxHTML.pop();
	        }
			
	        obj.dom.wrapper.innerHTML = lxHTML.join("");
	        obj.listen();
	        if(obj.event.buildUI){
		        obj.event.buildUI();	        	
	        }
	    }
	}	
	function iUtil(){
		return {
			loadJsonP: function(asUrl, afCallback){
				if (!asUrl) {
					return false;
				}
				var lsUrl = asUrl;
				var lsGUID="";
				if (lsUrl.indexOf("callback=") == -1) {
					lsGUID="_auto_call_back_"+Math.floor(Math.random()*16000).toString(16);
					lsUrl = lsUrl + (lsUrl.indexOf("?") != -1 ? "&" : "?") + "callback=" + lsGUID;
				}
				window[lsGUID] = afCallback;
				
				var leTag = document.createElement('script');
				leTag.setAttribute('type', 'text/javascript');
				leTag.setAttribute('src', lsUrl);
				document.getElementsByTagName('head')[0].appendChild(leTag);				
			},		
			isIE:function(){
				var lsv = navigator.userAgent.toLowerCase();
				if (lsv.indexOf("msie") != -1){
					return parseInt(lsv.substring(lsv.indexOf("msie") + 5, lsv.indexOf("; w")));
				} 
				else{
					return 0;
				}
			},			
			byClass:function(asClass, aeP, asTag){
			    var lxNew = [];
			    asClass = asClass == null ? "" : asClass;
			    aeP = aeP == null ? document : aeP;
			    asTag = asTag == null ? "*" : asTag;
			    
			    var lxTag = aeP.getElementsByTagName(asTag);
			    var pattern = new RegExp("(^|\s)" + asClass + "(\s|$)");
			    for (var i = 0; i < lxTag.length; i++) {
			        if ((" " + lxTag[i].className + " ").indexOf(" " + asClass + " ") != -1) {
			            lxNew.push(lxTag[i]);
			        }
			    }
			    return lxNew;
			},
			hasClass:function(aeTag,asClass){
			    if (!aeTag || !aeTag.className) {
			        return false;
			    }
			    if ((" " + aeTag.className + " ").indexOf(" " + asClass + " ") == -1) {
			        return false;
			    }
			    return true;		
			},
			addClass:function(aeTag, asClass){
			    if (!aeTag) {
			        return false;
			    }		
			    asClass = asClass == null ? 'cnViOver' : asClass;
			    if ((" " + aeTag.className + " ").indexOf(" " + asClass + " ") == -1) {
			        aeTag.className = (aeTag.className + ' ' + asClass).replace(/(^\s*)|(\s*$)/g, "");
			    }
			    return aeTag;
			},
			removeClass:function(aeTag, asClass){
			    if (!aeTag) {
			        return false;
			    }		
			    asClass = asClass == null ? 'cnViOver' : asClass;
			    aeTag.className = aeTag.className.replace(new RegExp('(^|\\s)' + asClass + '(?:\\s|$)'), '$1').replace(/(^\s*)|(\s*$)/g, "");
			},			
			addEvent:function(aeTag, asEvt, afHandler){
			    if (!aeTag) {
			        return false;
			    }
			    if (navigator.userAgent.indexOf("IE") != -1) {
			        aeTag.attachEvent("on" + asEvt, afHandler);
			    } else {
			        aeTag.addEventListener(asEvt, afHandler, false);
			    }
			},
			pageX:function (aeTag){
				return aeTag.offsetParent? aeTag.offsetLeft + this.pageX(aeTag.offsetParent): aeTag.offsetLeft;
			},
			pageY:function (aeTag){
				return aeTag.offsetParent? aeTag.offsetTop + this.pageY(aeTag.offsetParent): aeTag.offsetTop;
			},
			getMouse:function(event){
				event = event || windiow.event;
				var isIE = navigator.userAgent.indexOf("IE")!=-1;
				return {
					x: isIE ? event.clientX + document.documentElement.scrollLeft : event.pageX,
					y: isIE ? event.clientY + document.documentElement.scrollTop : event.pageY
				};
			},
			trim:function(asStr){
			    asStr = asStr == null ? "" : asStr;
			    return asStr.replace(/(^\s*)|(\s*$)/g, "");
			},
			getStyle:function(aeNode,asName){
			    if (typeof(aeNode)=="string"){
					 aeNode=document.getElementById(aeNode);
				}
				var lsIE,lsW3C;
				if(asName.indexOf("-")!=-1){
					lsW3C = asName;
					// to be improved
			        lsIE = asName.split("-")[0]+asName.split("-")[1].charAt(0).toUpperCase()+asName.split("-")[1].substring(1);
				}else{
					lsIE = asName;
			        lsW3C = asName.replace(/([A-Z])/g, "-$1");
				}
			    return navigator.userAgent.indexOf("IE")!=-1 ?aeNode.currentStyle[lsIE]:document.defaultView.getComputedStyle(aeNode, "").getPropertyValue(lsW3C);
			},
			getPageSize:function(){
				var lsObj;		
				if(navigator.userAgent.indexOf("IE")!=-1){
					lsObj = "documentElement";
				}else{
					lsObj = "body";
				}
				return{
					x: document[lsObj].scrollWidth,
					y: document[lsObj].scrollHeight
				};
			},
			getScroll:function(){
				if(navigator.userAgent.indexOf("IE")!=-1){
					return{
						x: document.documentElement.scrollLeft || document.body.scrollLeft,
						y: document.documentElement.scrollTop || document.body.scrollTop
					};
				}else{
					return{
						x: self.pageXOffset,
						y: self.pageYOffset
					};
				}	
			},	
			getViewPort:function(){
				if(navigator.userAgent.indexOf("IE")!=-1){
					return{
						x: document.documentElement.clientWidth || document.body.clientWidth,
						y: document.documentElement.clientHeight || document.body.clientHeight
					};
				}else{
					return{
						x: self.innerWidth,
						y: self.innerHeight
					};
				}
			},
			smartView:function(asHTML, axData){
			    var lxLeft = asHTML.split("{K:");
			    var lxHTML = [];
			    if(!axData){
			    	return false;
			    }
				if(axData.constructor != Array){
					if(axData.constructor == Number){
						var liIndex = axData;
						axData = [];				
						axData[liIndex - 1] = {};
					}else{
						axData = [axData];	
					}
				}
			    for (var i = 0; axData && i < axData.length; i++) {
			        for (var j = 0; j < lxLeft.length; j++) {
			            var lsProp = lxLeft[j].substring(0, lxLeft[j].indexOf("}"));
			            if (lsProp != "") {
			            	if(lsProp == "k"){            		
			            		lxHTML[lxHTML.length] = i;
			                	lxHTML[lxHTML.length] = lxLeft[j].substring(lxLeft[j].indexOf("}") + 1);
			            	}else{
			            		lxHTML[lxHTML.length] = axData[i][lsProp];
			                	lxHTML[lxHTML.length] = lxLeft[j].substring(lxLeft[j].indexOf("}") + 1);
			            	}
			               
			            }
			            else {
			                lxHTML[lxHTML.length] = lxLeft[j];
			            }
			        }
			    }
			    return lxHTML.join("");
			}			
		};
	}
}