function Share(aeSib, axConf){ 
    var loConf = CNMS.json2Obj(axConf[1]);
    
    var U;
	if(typeof CNMS_Util == "undefined"){
		U = iUtil();
	}else{
		U = CNMS_Util();
	}
    var obj = {};
    obj.data = {};
    obj.view = {};
    obj.ctrl = {};
    obj.dom = {};
    obj.event = {};        
    
    
    obj.ctrl.submit = false;
    obj.ctrl.styleSheet = "http://xfiles.cdnmyspace.cn/dir/uibox/share/style.css";
    obj.ctrl.startCount = 3;
    
    init();
    
    
    return obj;
    
    function init(){
    	U.addEvent(aeSib,"click",checkLogin);
    	//CNMS.includeUrl('<link rel="stylesheet" href="http://xfiles.cdnmyspace.cn/dir/uibox/share/style.css',null,"css");
    }
    
    
    function listen(){
    	U.addEvent(obj.dom.close,"click",hide);
    	U.addEvent(obj.dom.cancel,"click",hide);
    	U.addEvent(obj.dom.cancel2,"click",hide);
    	U.addEvent(obj.dom.cancel3,"click",hide);
    	U.addEvent(obj.dom.checkbox,"click",checkboxHandler);
    	
    	U.addEvent(obj.dom.innerInput,"focus",innerInputFocusHandler);
    	U.addEvent(obj.dom.outerInput,"focus",outerInputFocusHandler);
    	U.addEvent(obj.dom.outerInput,"blur",outerInputBlurHandler);
    	U.addEvent(obj.dom.submit,"click",submit);
    	
    	obj.autoSuggest.listen();
    	obj.friendSelector.listen();
    	
    }
    function checkLogin(){
		 var loRequest = {
			"webservices":"http://share.myspace.cn/api/do_islogin.php",
			"values":"link="+location.href,
			"contentType":"application/x-www-form-urlencoded"
		}
		CNMS.loadAjax(loRequest,action,"share");
		function action(aoData){
			if(aoData.result == 1){
				buildUI();
			}else{
				location.href = aoData.msg;
			}
		}
    }
    
    function innerInputFocusHandler(){
    	obj.dom.innerInput.select();
    }
    function outerInputFocusHandler(){
    	var leNode = obj.dom.outerInput;
    	var lsDefVal = leNode.getAttribute("defVal");
    	if(leNode.value == lsDefVal){
    		leNode.value = "";
    	}
    }
    function outerInputBlurHandler(){
    	var leNode = obj.dom.outerInput;
    	var lsDefVal = leNode.getAttribute("defVal");
    	if(U.trim(leNode.value) == ""){
    		leNode.value = lsDefVal;
    	}else{
    		var lxSeperator = [",",";","、","，","；"];
    		var lsSeperator = "";
    		for(var i=0;i<lxSeperator.length;i++){
    			lsSeperator = lxSeperator[i];
    			if(leNode.value.indexOf(lsSeperator)!=-1){
    				break;
    			}
    		}
    		
    		var lxEmail = [];
    		if(lsSeperator == ""){
    			lxEmail = [leNode.value];
    		}else{
    			lxEmail = leNode.value.split(lsSeperator);
    		}
    		var pattern = /^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.){1,4}[a-z]{2,3}$/;
    		for(var i=0; i<lxEmail.length; i++){
    			var lsEmail = U.trim(lxEmail[i].toLowerCase());
    			if(!pattern.test(lsEmail)){
    				obj.ctrl.outerInputValid = false;
    				obj.dom.outerError.innerHTML = "第"+(i+1)+"个Email有误,多人请用“;”隔开";
    				obj.dom.outerError.style.display = "block";
    				return false;
    			}
    		}
    		leNode.setAttribute("validVal",lxEmail.join(";")); 		
    	}    	
    	obj.ctrl.outerInputValid = true;
    	obj.dom.outerError.style.display = "none";
    }        
    function submit(){
    	var lxInnerList = [];
    	var loInner = obj.friendSelector.data.selectedFriends;
    	for(var x in loInner){
    		lxInnerList.push(x);
    	}
    	var lsOuter = obj.dom.outerInput.value;
    	var lsOuterDef = obj.dom.outerInput.getAttribute("defVal");
    	var lsComment = obj.dom.commentTextArea.value;
    	var lsPara = "";
    	
    	if(lsOuterDef!=lsOuter && !obj.ctrl.outerInputValid){
    		alert("请先修改站外好友中错误的Email！");
    		return false;
    	}
		if(lsOuterDef == lsOuter){
			lsOuter = obj.dom.outerInput.value = "";
		}else{
			lsOuter = obj.dom.outerInput.getAttribute("validVal");
		}
		CNMS.loadAjax(loRequest,callback,"share");    	

		 var loRequest = {
			"webservices":"http://share.myspace.cn/api/do_add_share.php",
			"values":["desc=",encodeURIComponent(lsComment),"&inner=",lxInnerList.join(";"),"&outer=",lsOuter,"&",lsPara,"&",loConf.queryString].join(""),
			"contentType":"application/x-www-form-urlencoded"
		}
		CNMS.loadAjax(loRequest,callback,"share");
		//callback({"result":0,"msg":"http:\/\/share.myspace.cn"});
		//callback({"result":1,"msg":"http:\/\/xx.myspace.cn"});
		//callback({"result":2,"msg":[{"link":"#this","text":"阿曼"},{"link":"mailto:xzkcz@163.com","text":"psyduck@gmail.com"}]});
		function callback(aoData){
			if(aoData.result == 1){
				obj.dom.stepWrapper1.style.display = "none";
				obj.dom.goLink.href = aoData.msg;
				obj.dom.stepWrapper2.style.display = "block";
				delayClose();
			}else if(aoData.result == 2){
				obj.dom.stepWrapper1.style.display = "none";
				
				var lxLinks = [];
				var lxReceivers = aoData.msg; 
				for(var i=0; i<lxReceivers.length; i++){
					lxLinks.push('<a target="_blank" href="'+lxReceivers[i].link+'">'+lxReceivers[i].text+'</a>');
				}
				
				
				obj.dom.receiverList.innerHTML = lxLinks.join("、 ");
				obj.dom.stepWrapper3.style.display = "block";
				delayClose();			
			}else{
				alert(aoData.msg);
			};
		}
		
    }
    function hide(){
    	if(obj.ctrl.timer){
    		clearTimeout(obj.ctrl.timer);	
    	}    	
    	obj.popLayer.hide();
    }
    function delayClose(){
    	obj.ctrl.timer = setTimeout(obj.popLayer.hide,3000);
    }
    function checkboxHandler(){
    	if(obj.dom.checkbox.checked){    		
    		if(navigator.userAgent.indexOf("IE")!=-1){
    			obj.dom.innerTr.style.display = obj.dom.outerTr.style.display = "block";	
    		}else{
    			obj.dom.innerTr.style.display = obj.dom.outerTr.style.display = "table-row";
    		}
    	}else{
    		obj.dom.innerTr.style.display = obj.dom.outerTr.style.display = "none";
    	}
    }
    function inputInit(aeNode){
    	
    }
    
    function buildUI(){
		var lsHTML = [
		'',
		'		<dt class="clearfix">',
		'			<img alt="" src="http://xfiles.cdnmyspace.cn/dir/music/v1/img/k_ico_close.gif" class="close" id="kcz_shareToFriendsClose"/>',
		'			<span id="kcz_shareToFriendsTitle" class="text">',loConf.title,'</span>',
		'		</dt>',
		'		<dd class="hr"></dd>',
		'		<dd id="kcz_shareToFriendsStep1">',
		'		<table cellpadding="0" cellspacing="0">			',
		'			<tr class="checkbox">',
		'				<td colspan="2"><label><input id="kcz_shareToFriendsCheckbox" type="checkbox" name="toSend" />同时推荐给指定好友</label></td>',
		'			</tr>		',
		'			<tr id="kcz_shareToFriendsInnerTr" class="friends">',
		'				<td class="label">站内好友：</td>',
		'				<td class="input">',
		'					<div id="selectorTrigger" class="trigger"></div>',
		'					<div id="selectedFriendWrapper" class="friendList clearfix">',
		'						<span></span>',
		'						<input id="kcz_shareToFriendsInnerInput" class="inputFriendName" autocomplete="off" type="text" value="请输入好友姓名或昵称" />',
		'					</div>',
		'					<div id="kcz_friendSelector2" class="kcz_friendSelector2">',
		'						<div class="topSeg">							',
		'							<select id="selectFriendGroup">',
		'								<option value="_all">全部好友</option>',
		'							</select>		',
		'						</div>',
		'						<ul id="friendSelector2_listWrapper"></ul>',
		'						<div class="botSeg">',
		'							<label id="kcz_friendSelector2Counter" class="tip">还能添加<span>20</span>个好友</label>',
		'							<a id="friendSelector2_ok" class="cnViBtnBlue" href="javascript:void(0)"><b><i>确　定</i></b></a>					',
		'						</div>',
		'					</div>',
		'					<!--end.kcz_friendSelector2-->						',
		'				</td>',
		'			</tr>',
		'			<tr id="kcz_shareToFriendsOuterTr" class="email">',
		'				<td class="label">站外好友：</td>',
		'				<td class="input">',
		'					<input id="kcz_shareToFriendsOuterInput" class="inputFriendName" type="text" value="请输入对方Email地址，多人请用分号隔开" defVal="请输入对方Email地址，多人请用分号隔开" />',
		'					<div id="kcz_shareToFriendsOuterError" class="error"></div>',
		'				</td>',
		'			</tr>				',
		'			<tr class="commentTr">',
		'				<td class="label">分享理由：</td>',
		'				<td class="input">',
		'					<textarea id="kcz_shareToFriendsCommentText" name="comment" ></textarea>',
		'					<div id="kcz_shareToFriendsCommentError" class="error">推荐语最大长度为2000字</div>',
		'				</td>',
		'			</tr>',
		'			<tr class="opt">',
		'				<td class="label"></td>',
		'				<td class="input">',
		'					<a id="kcz_shareToFriendsShareButton" class="cnViBtnBlue" href="javascript:void(0)"><b><i>马上分享</i></b></a>&nbsp;&nbsp;',
		'					<a id="kcz_shareToFriendsCancelButton" class="cnViBtnSilver" href="javascript:void(0)"><b><i>取　消</i></b></a>',
		'				</td>',
		'			</tr>  				',
		'		</table>',
		'		</dd>',
		'		<dd id="kcz_shareToFriendsStep2">',
		'			<div class="success2">',
		'				已经分享成功,<a id="kcz_shareToFriendsGoLink" class="go" href="http://share.myspace.cn">去看看</a>',
		'			</div>		',
		'		</dd>',
		'		<dd id="kcz_shareToFriendsStep3">',
		'			<div class="success">',
		'				已经分享成功,<a id="kcz_shareToFriendsGoLink" class="go" href="http://share.myspace.cn">去看看</a>',
		'				<div class="receivers">',
		'					成功发送给',
		'					<span id="kcz_shareToFriendsReceiverList">',
		'						<a target="_blank" href="#this" title="阿曼">阿曼</a>、',
		'						<a target="_blank" href="#this" title="psyduck@gmail.com">psyduck@gmail.com</a>',
		'					</span>',
		'				</div>',
		'			</div>		',
		'		</dd>		'
		].join("");
		var lsId = "kcz_shareToFriendsWrapper";
		var leWrapper = document.getElementById(lsId);
		if(!leWrapper){
			leWrapper = document.createElement("dl");
			leWrapper.id = lsId;
			leWrapper.className = 'kcz_shareToFriendsWrapper kcz_shareToFriendsPopLayer';
			document.body.insertBefore(leWrapper,document.body.firstChild);
			
			var leLink = document.createElement("link");
			leLink.rel = "stylesheet";
			leLink.type = "text/css";
			leLink.href = obj.ctrl.styleSheet;
			leWrapper.parentNode.insertBefore(leLink,leWrapper);
		}
		leWrapper.innerHTML = lsHTML;
	    obj.dom = {
	    	wrapper:document.getElementById("kcz_shareToFriendsWrapper"),
	    	title:document.getElementById("kcz_shareToFriendsTitle"),
	    	stepWrapper1:document.getElementById("kcz_shareToFriendsStep1"),
	    	stepWrapper2:document.getElementById("kcz_shareToFriendsStep2"),
	    	stepWrapper3:document.getElementById("kcz_shareToFriendsStep3"),
	    	checkbox:document.getElementById("kcz_shareToFriendsCheckbox"),
	    	innerTr:document.getElementById("kcz_shareToFriendsInnerTr"),
	    	innerInput:document.getElementById("kcz_shareToFriendsInnerInput"),
	    	outerInput:document.getElementById("kcz_shareToFriendsOuterInput"),
	    	outerTr:document.getElementById("kcz_shareToFriendsOuterTr"),
	    	outerError:document.getElementById("kcz_shareToFriendsOuterError"),
	    	commentTextArea:document.getElementById("kcz_shareToFriendsCommentText"),
	    	commentError:document.getElementById("kcz_shareToFriendsCommentError"),
	    	submit:document.getElementById("kcz_shareToFriendsShareButton"),
	    	receiverList:document.getElementById("kcz_shareToFriendsReceiverList"),
	    	cancel:document.getElementById("kcz_shareToFriendsCancelButton"),
	    	cancel2:document.getElementById("kcz_shareToFriendsCancelButton2"),
	    	cancel3:document.getElementById("kcz_shareToFriendsCancelButton3"),
	    	goLink:document.getElementById("kcz_shareToFriendsGoLink"),
	    	close:document.getElementById("kcz_shareToFriendsClose")
	    };
	    
	    
	    obj.friendSelector =  FriendSelectorV2({
								wrapper:document.getElementById("kcz_friendSelector2"),
								trigger:document.getElementById("selectorTrigger"),
								listWrapper:document.getElementById("friendSelector2_listWrapper"),
								ok:document.getElementById("friendSelector2_ok"),
								select:document.getElementById("selectFriendGroup"),
								input:document.getElementById("selectedFriendWrapper").getElementsByTagName("input")[0],
								selectedFriendsWrapper:document.getElementById("selectedFriendWrapper").getElementsByTagName("span")[0],
							    counter:document.getElementById("kcz_friendSelector2Counter")
							});
		obj.friendSelector.event.updateSelectTriggerStatus = function(aiff){
			if(aiff <= obj.ctrl.startCount){
				obj.friendSelector.dom.counter.innerHTML = "还能添加"+aiff+"个好友";
				obj.friendSelector.dom.counter.style.display = "inline";
			}else{
				obj.friendSelector.dom.counter.style.display = "none";
			}
		}
	    obj.autoSuggest =  AutoSuggestV2({input:document.getElementById("selectedFriendWrapper").getElementsByTagName("input")[0]});
		obj.autoSuggest.filter = function(axData){
			var lxResult = [];
			for(var i=0;i<axData.length;i++){
			    var lsId = axData[i].UserId;
				if(!obj.friendSelector.data.selectedFriends[lsId]){
					lxResult.push(axData[i]);
				}					
			}
			return lxResult;
		}
		obj.autoSuggest.event.submit = function(aeNode){
			var lsId = aeNode.getAttribute("uid");
			var lsName = aeNode.getAttribute("title");
			obj.friendSelector.data.selectedFriends[lsId] = lsName;
			obj.friendSelector.updateSelectedFriends();
			obj.friendSelector.dom.input.value = "";
		
		}		
		obj.popLayer = PopLayerV2({popLayer:obj.dom.wrapper});	    
	    
	    
	    
	    
	    listen();
    	obj.popLayer.show();
    }
    function validateEmail(asVal){
		var pattern = /^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.){1,4}[a-z]{2,3}$/;
		var flag = false;
		if(!/\S/.test(asVal)){
			showErrorInfo(aeErrorNode,"邮箱帐户不能为空");
		}else if(!pattern.test(asVal)){
			showErrorInfo(aeErrorNode,"邮箱格式不正确");
		}else{
			hideErrorInfo(aeErrorNode);
			flag = true;
		}
		return flag;	
    }
	function iUtil(){
		return {
			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);
			},			
			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("");
			}
		};		
	}	
}
function PopLayerV2(aoConf){
	var U;
	if(typeof CNMS_Util == "undefined"){
		U = iUtil();
	}else{
		U = CNMS_Util();
	}
	var obj = {};
	obj.dom = {
		popLayer:aoConf.popLayer,
		mask:null,
		obstacles:null
	}
	
	obj.ctrl = {};
	obj.ctrl.obstacleTags = ["select","object","embed"];
	obj.ctrl.popLayerWidth = parseInt(U.getStyle(obj.dom.popLayer,"width").split("px")[0]);
	obj.ctrl.popLayerHeight = parseInt(U.getStyle(obj.dom.popLayer,"height").split("px")[0]);
	obj.ctrl.isIE6 = !!(document.all && (typeof XMLHttpRequest=="undefined"));
	obj.ctrl.maskId = "kcz_popLayerMask_uid_v2"
	
	obj.listen = listen;
	obj.show = show;
	obj.hide = hide;
	
	return obj;
	
	function listen(){
		U.addEvent(window,"resize",resizePopLayer);
	}
	function show(){
		if(obj.ctrl.isIE6){
			hideObstacles();
		}
		obj.dom.mask = document.getElementById(obj.ctrl.maskId);
		if(!obj.dom.mask){
			obj.dom.mask = document.createElement("div");
			obj.dom.mask.id = obj.ctrl.maskId;
			obj.dom.mask.style.cssText = "position:absolute;left:0;top:0; z-index:10;background-color:black; opacity:0.5; filter:Alpha(opacity=50);";		
			document.body.insertBefore(obj.dom.mask,document.body.firstChild);
		}else{
			obj.dom.mask.style.display = "block";
		}
		resizePopLayer();
		obj.dom.popLayer.style.display = "block";
		if(obj.onShow){
			obj.onShow();
		}
	}
	function hide(){	
		if(obj.dom.mask){
			obj.dom.mask.style.display = "none";
		}
		obj.dom.popLayer.style.display = "none";
		if(obj.onHide){
			obj.onHide();
		}
		if(obj.ctrl.isIE6){
			showObstacles();
		}
	}
	function resizePopLayer(){
		var liPageWidth = U.getPageSize().x;
		var liPageHeight = U.getPageSize().y;
		var liViewWidth = U.getViewPort().x;
		var liViewHeight = U.getViewPort().y;

		var liMaxWidth = liPageWidth > liViewWidth ? liPageWidth : liViewWidth;
		var liMaxHeight = liPageHeight > liViewHeight ? liPageHeight : liViewHeight;	
		if(obj.dom.mask){
			obj.dom.mask.style.width = liMaxWidth + "px";
			obj.dom.mask.style.height = liMaxHeight + "px";		
		}
		obj.dom.popLayer.style.left = Math.round((liViewWidth - 360) / 2) + U.getScroll().x + "px";
		obj.dom.popLayer.style.top = 100 + U.getScroll().y + "px";		
	}

	function showObstacles(){		
		for(var i=0; i<obj.dom.obstacles.length;i++){
			obj.dom.obstacles[i].style.visibility = "";
		}	
	}
	function hideObstacles(){
		obj.dom.obstacles = filterObstacles();
		for(var i=0; i<obj.dom.obstacles.length;i++){
			obj.dom.obstacles[i].style.visibility = "hidden";
		}	
	}	
	function filterObstacles(){
		var lxFilter = [];
		var lxObstaclesAll = getObstacles(document);
		var lxObstaclesInside = getObstacles(obj.dom.popLayer);
		for(var i=0; i<lxObstaclesAll.length;i++){
			var leObstacle = lxObstaclesAll[i];
			var flag = true;
			for(var j=0;j<lxObstaclesInside.length;j++){
				if(leObstacle == lxObstaclesInside[j]){
					flag = false;
					break;
				}
			}
			if(flag == true && leObstacle.style.visibility != "hidden"){
				lxFilter.push(leObstacle);
			}
		}
		return lxFilter;
		function getObstacles(aeNode){
			var lxObstacles = [];
			for(var i=0; i<obj.ctrl.obstacleTags.length;i++){
				var lxNode = aeNode.getElementsByTagName(obj.ctrl.obstacleTags[i]);
				for(var j=0;j<lxNode.length;j++){
					lxObstacles.push(lxNode[j]);
				}
			}
			return lxObstacles;
		}		
	}	
	function iUtil(){
		return {
			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);
			    }
			},
			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
					};
				}		 
				
			},
			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);
			}
		}
	}
}
function AutoSuggestV2(aoConf){
	var U;
	if(typeof CNMS_Util == "undefined"){
		U = iUtil();
	}else{
		U = CNMS_Util();
	}
	
    var obj = {};
    obj.data = {};
    obj.view = {};
    obj.ctrl = {};
    obj.dom = {};
    obj.event = {};
	
	
	obj.dom.input = aoConf.input;
	obj.dom.wrapper = null;	//提示列表的根结点
	obj.dom.list = null;
	obj.dom.listItems = null;
	obj.dom.curListItem = null;
	
    obj.view.header = '<ul class="kcz_friendSuggest">';
    obj.view.repeater = '<li title="{K:DisplayName}" uid="{K:UserId}"><img src="{K:Image}" /><label>{K:DisplayName}</label></li>'; 
    obj.view.footer = '</ul>';
	obj.view.empty = '';
	
	obj.ctrl.getUrl = "http://music.myspace.cn/jsi.php?act=search_friend&start=0&count=6&kw=";
	obj.ctrl.displayField = "DisplayName"; //在搜索框中显示哪个字段
	obj.ctrl.curListItemClassName = "cur";	
	obj.ctrl.wrapperClassName = "autoSuggestWrapper";
	obj.ctrl.curKeyWord = "";
	obj.ctrl.leftDiff = 6;
	obj.ctrl.topDiff = 11;	//建议列表与输入框的距离
	obj.ctrl.selectFirst = true;	//默认是否选中第一条
	
	obj.event.empty = function(){
		if(obj.view.empty != ""){
			obj.dom.wrapper.innerHTML = obj.view.empty;
		}
	}
	
    obj.getData = getData;
    obj.listen = listen;
    obj.buildUI = buildUI;
	obj.clickListHandler = clickListHandler;
	obj.clickInputHandler = clickInputHandler;
	obj.moveListHandler = moveListHandler;
	obj.keyUpInputHandler = keyUpInputHandler;
	obj.blurInputHandler = blurInputHandler;
	obj.getNodeInputField = getNodeInputField;
	obj.submit = submit;
	obj.show = show;
	obj.hide = hide;
	obj.isShow = isShow;
	
	
    return obj;
    
	function listen(){
		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(){
		obj.hide();
	}
	function submit(){
		if(!obj.dom.curListItem){
			return false;
		}
		obj.dom.input.value = obj.getNodeInputField(obj.dom.curListItem);
		U.removeClass(obj.dom.curListItem,obj.ctrl.curListItemClassName);
		if(obj.event.submit){
			obj.event.submit(obj.dom.curListItem);
		}		
		obj.dom.curListItem = null;
		obj.hide();
	}
	
	function getNodeInputField(aeNode){
		return aeNode.getAttribute("title");		
	}
	function clickInputHandler(event){
		event = event || window.event;
	    if(navigator.userAgent.indexOf("IE")!=-1){
	    	event.cancelBubble = true;	        
	    } else {
	        event.stopPropagation();
	    }	
	}
	function clickDocHandler(event){
		event = event || window.event;
		var leTarget = event.target || event.srcElement;
		if(!obj.dom.wrapper){
			return false;
		}
		if(leTarget.parentNode != obj.dom.input && !isIncludeMe(obj.dom.wrapper,leTarget)){
			obj.hide();
		}
		function isIncludeMe(aeParent,aeChild){
			if(aeChild.parentNode!= document.documentElement && (aeChild.parentNode == aeParent || isIncludeMe(aeParent,aeChild.parentNode))){
				return true;
			}else{
				return false;
			}
		}		
	}
	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){
		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{					
					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{					
					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)){
					obj.hide();
					break;
				}
				buildUI();
				break;
		}
			
	}	
	function buildUI(){
		obj.getData(action);
		function action(aoData){
			var lxData = aoData.List;
			if(obj.filter){
				lxData = obj.filter(lxData);
			}
			if(!obj.dom.wrapper){
				obj.dom.wrapper = document.createElement("div");
				obj.dom.wrapper.id = "test";
				obj.dom.wrapper.className = obj.ctrl.wrapperClassName;
				//document.body.insertBefore(obj.dom.wrapper,document.body.firstChild);
				document.body.appendChild(obj.dom.wrapper);
				//obj.dom.wrapper = document.getElementById("kcz");
				U.addEvent(obj.dom.wrapper,"mousemove", obj.moveListHandler);
				U.addEvent(obj.dom.wrapper,"click", obj.clickListHandler);
			}		
			var leWrapper = obj.dom.wrapper;
			leWrapper.style.width = obj.dom.input.offsetWidth || U.getStyle(obj.dom.input,"width");
			leWrapper.style.position = "absolute";
			leWrapper.style.zIndex = 1000;
			leWrapper.style.left = U.pageX(obj.dom.input)+obj.ctrl.leftDiff + "px";
			var liHeight = parseInt(obj.dom.input.offsetHeight || U.getStyle(obj.dom.input,"height"));
			//modefy by yjz
			leWrapper.style.top = U.pageY(obj.dom.input) + (isNaN(liHeight)?0: liHeight) + obj.ctrl.topDiff + "px";
			
			if(navigator.userAgent.indexOf("MSIE 6")!=-1){
				if(obj.buildIframe){
					obj.buildIframe();
				}
				/*
				var leIframe = document.createElement("iframe");
				leIframe.style.position = "relative";
				leIframe.style.zIndex = 10;
				leIframe.style.width = obj.dom.input.offsetWidth;
				leIframe.style.height = obj.dom.input.offsetHeight;
				leIframe.style.marginTop = "-" + obj.dom.input.offsetHeight + "px";
				leWrapper.appendChild(leIframe);
				* */
			}
			if(lxData.length < 1){				
				if(obj.event.empty){
					obj.event.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");
				obj.dom.list.style.position = "relative";
				obj.dom.list.style.zIndex = 40;			
				if(obj.ctrl.selectFirst){
					obj.dom.curListItem = obj.dom.list.firstChild;
					U.addClass(obj.dom.curListItem,obj.ctrl.curListItemClassName);
				}				
			}
			obj.show();
			if(obj.event.buildUI){
				obj.event.buildUI();
			}
		}
	}
	
    function getData(afCallback){
		obj.ctrl.curKeyWord = obj.dom.input.value;
		var lsUrl = obj.ctrl.getUrl + encodeURIComponent(obj.dom.input.value);
    	var loData = obj.data[lsUrl];
    	if(!loData){
			CNMS.loadJsonP(lsUrl,action);			
    	}else{			
			if(obj.event.getData){
				loData = obj.event.getData(loData);
			}
			afCallback(loData);			
    	}
		function action(aoResp){
			var loResp = aoResp;
			obj.data[lsUrl] = loResp;			
			if(obj.event.getData){
				loResp = obj.event.getData(loResp);
			}
			afCallback(loResp);
		}		
	}
	function isShow(){
		return obj.dom.wrapper.style.display == "block";
	}		
	function hide(){
		if(obj.dom.wrapper){
			clearTimeout(obj.ctrl.timer);			
			obj.ctrl.timer = setTimeout(function(){
				obj.dom.wrapper.style.display = "none";
			},200);
		}		
	}
	function show(){
		obj.dom.wrapper.style.display = "block";
	}	
	function iUtil(){
		return {
			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);
			},			
			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("");
			}
		};		
	}	
}
function FriendSelectorV2(aoConf){
	var U;
	if(typeof CNMS_Util == "undefined"){
		U = iUtil();
	}else{
		U = CNMS_Util();
	}
	var obj = {};
	obj.data = {};
	obj.event = {};
	obj.view = {};
	obj.data.selectedFriends = {};
	obj.data.freindGroup = null;
	obj.dom = aoConf;
	/*
	{
		wrapper:document.getElementById("kcz_friendSelector2"),
		trigger:document.getElementById("selectorTrigger"),
		listWrapper:document.getElementById("friendSelector2_listWrapper"),
		ok:document.getElementById("friendSelector2_ok"),
		select:document.getElementById("selectFriendGroup"),
		input:document.getElementById("selectedFriendWrapper").getElementsByTagName("input")[0],
		selectedFriendsWrapper:document.getElementById("selectedFriendWrapper").getElementsByTagName("span")[0],
	    counter:document.getElementById("kcz_friendSelector2Counter").getElementsByTagName("span")[0]
	}
	* */
	obj.dom.getRemoveFriendButtons = function(){
		return U.byClass("close",obj.dom.selectedFriendsWrapper,"img");
	};
	obj.dom.getSelectTrigger = function(){
		return obj.dom.listWrapper.getElementsByTagName("input")	
	};
	
	obj.ctrl = {};
	obj.ctrl.maxFriends = 20;
	obj.ctrl.friendOverStyle = "hover";
	obj.ctrl.optionAll = "_all";
	obj.ctrl.selectedStyle = "yes";
	obj.ctrl.friendGroupDataUrl = "http://friends.myspace.cn/jsi.php?act=listcat";
	obj.ctrl.friendInGroupDataUrl = "http://friends.myspace.cn/jsi.php?act=list_friends&start={K:start}&count={K:count}&catid=";
	obj.ctrl.friendInSearchDataUrl = "http://music.myspace.cn/jsi.php?act=search_friend&start={K:start}&count={K:count}&kw=";
	obj.ctrl.inputIsNull = true;
	obj.ctrl.widthDiff = 0;
	obj.ctrl.heightDiff = 0;
	obj.ctrl.isShow = false;
	obj.ctrl.toHide = true;
	
	obj.view = {};
	obj.view.selectedFriendDefault = '<input class="inputFriendName" type="text" />';	
	obj.view.friendGroupOption = '<div class="friendUnit"><div class="friendUnitR" uid="{K:UserId}" title="{K:Title}"><img class="close" src="http://xfiles.cdnmyspace.cn/dir/vi/v2/img/k_friend_close.gif" />{K:DisplayName}</div></div>';
	
	
	obj.smartList = smartListWithPagerV2({
		dataUrl:"http://music.myspace.cn/jsi.php?act=search_friend&start={K:start}&count={K:count}&kw=",
		wrapper:obj.dom.listWrapper,
		header:'',
		repeater:'<li id="{K:UserId}" title="{K:DisplayName}"><input id="input_{K:UserId}" type="checkbox" /><label for="input_{K:UserId}"><img src="{K:Image}" /><span>{K:DisplayName}</span></label></li>',
		footer:'',
		emptyView:'<div class="isNull">没有找到符合条件的好友！</div>',
		pageSize:40
	});
	obj.smartList.buildUI = function(){
		var obj = this;
		var smartView = U.smartView;
		var liCurRecord = (obj.pager.ctrl.curPage-1) * obj.ctrl.pageSize;
		var lsUri = smartView(obj.ctrl.dataUrl,{start:liCurRecord,count:obj.ctrl.pageSize});
		obj.getData(lsUri,action);
	    function action(axData){
			var lxData = axData;
			if(obj.formateData){
				lxData = obj.formateData(axData);
			}		
	    	if(lxData.length < 1){				
	    		obj.dom.wrapper.innerHTML = obj.view.empty;
	    	}else{
	    		obj.dom.wrapper.innerHTML += [obj.view.header,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.modifyUI){
	    		obj.modifyUI();
	    	}
	    	if(obj.event.buildUI){
	    		obj.event.buildUI();
	    	}			
	    }		
	}
	obj.smartList.modifyUI = modifySmartListUI;
	
	obj.buildSelect = buildSelect;
	obj.buildUI = buildUI;
	obj.updateSelectedFriends = updateSelectedFriends;
	obj.modifySmartListUI = modifySmartListUI;
	obj.updateSelectTriggerStatus = updateSelectTriggerStatus;
	obj.triggerSelectFriend = triggerSelectFriend;
	obj.getSelectedFriendsLength = getSelectedFriendsLength;
	obj.clickDocHandler = clickDocHandler;
	obj.inputKeyUpHandler = inputKeyUpHandler;
	obj.show = show;
	obj.hide = hide;
	obj.listen = listen;
	
	return obj;
	
	function buildUI(){
		obj.buildSelect();
		obj.smartList.buildUI();
	}
	function buildSelect(){
		if(!obj.data.freindGroup){
			CNMS.loadJsonP(obj.ctrl.friendGroupDataUrl,action);
		}	
		function action(aoData){
			obj.data.freindGroup = 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);
			}
		}
	}	
	function listen(){
		if(obj.getDom){
			obj.getDom();
		}
		U.addEvent(obj.dom.input,"focus",inputFocusHandler);
		U.addEvent(obj.dom.input,"keyup",obj.inputKeyUpHandler);
		U.addEvent(obj.dom.input,"blur",inputBlurHandler);
		U.addEvent(obj.dom.trigger,"click",obj.triggerSelectFriend);
		if(obj.dom.selectedFriendsWrapper){
			U.addEvent(obj.dom.selectedFriendsWrapper.parentNode,"click",wrapperParentClickHandler);			
		}
		//U.addEvent(obj.dom.ok,"click",obj.triggerSelectFriend);
		U.addEvent(obj.dom.select,"change",selectChangeHandler);
		U.addEvent(obj.dom.listWrapper,"scroll",scrollToNext);
		U.addEvent(document,"click",obj.clickDocHandler);
		U.addEvent(obj.dom.wrapper,"click",clickExceptionHandler);
		U.addEvent(obj.dom.trigger,"click",clickExceptionHandler);
		//U.addEvent(obj.dom.ok,"click",selectDone);
				
	}
	function wrapperParentClickHandler(event){
		event = event || window.event;
	    var leTarget = event.target || event.srcElement;
		if(!obj.dom.selectedFriendsWrapper){
			return false;
		}	    
	    if(leTarget == obj.dom.selectedFriendsWrapper.parentNode){
	    	obj.dom.input.focus();
	    }
	}
	function clickExceptionHandler(event){
		obj.ctrl.toHide = false;
	}
	function clickDocHandler(){
		if(!obj.dom.wrapper){
			return false;
		}
		if(obj.ctrl.isShow && obj.ctrl.toHide){
			obj.hide();
		}
		obj.ctrl.toHide = true;
	}
	function inputFocusHandler(){
		obj.dom.wrapper.style.display = "none";
	}
	
	function inputKeyUpHandler(event){
		event = window.event||event;
		switch(event.keyCode){
			case 8:
				if(!obj.dom.selectedFriendsWrapper){
					return false;
				}
				var leTarget = obj.dom.selectedFriendsWrapper.lastChild;
				if(leTarget && obj.ctrl.inputIsNull){
					var lsId = leTarget.getElementsByTagName("div")[0].getAttribute("uid");
					delete obj.data.selectedFriends[lsId];
					obj.updateSelectedFriends();						
				}
			default:
				if(obj.dom.input.value.length == 0){
					obj.ctrl.inputIsNull = true;
				}else{
					obj.ctrl.inputIsNull = false;
				}
		}
		
	}
	function inputBlurHandler(){
		//obj.dom.wrapper.style.display = "none";
		
	}
	
	function scrollToNext(){
		var leNode = obj.dom.listWrapper;
		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){
			if(obj.smartList.pager.ctrl.totalPage > obj.smartList.pager.ctrl.curPage){
				obj.smartList.pager.ctrl.curPage++;
				obj.smartList.buildUI();
			}
		}
	}
	function overFriend(aeNode){
		return function(){		
			U.addClass(aeNode,obj.ctrl.friendOverStyle);
		}
	}
	function outFriend(aeNode){
		return function(){			
			U.removeClass(aeNode,obj.ctrl.friendOverStyle);
		}
	}
	function selectChangeHandler(){
		var lsSelectVal = obj.dom.select.value;
		obj.smartList.pager.ctrl.curPage = 1;
		obj.smartList.dom.wrapper.innerHTML = "";			
		if(lsSelectVal != obj.ctrl.optionAll){
			obj.smartList.ctrl.dataUrl = obj.ctrl.friendInGroupDataUrl + encodeURIComponent(lsSelectVal);
		}else{
			obj.smartList.ctrl.dataUrl = obj.ctrl.friendInSearchDataUrl;
		}
		obj.smartList.buildUI();
	}	
	function show(){
		obj.dom.input.value = "";
		//obj.smartList.pager.ctrl.curPage = 1;
		//obj.smartList.dom.wrapper.innerHTML  = "";
		// to be improved
		if(!obj.ctrl.firstBuild){
			obj.buildUI();
			obj.ctrl.firstBuild = true;
		}

		obj.dom.wrapper.style.display = "block";	
		obj.ctrl.isShow = true;
		if(obj.event.show){
			obj.event.show();
		}
	}
	function hide(){
		obj.dom.wrapper.style.display = "none";
		obj.ctrl.isShow = false;
	}
	function triggerSelectFriend(){			
		var lsDisplay = obj.dom.wrapper.style.display;
		if(lsDisplay == "block"){
			obj.hide();
		}else{
			obj.show();
		}			
	}	
	function searchFriends(){
		var lsKeyword = U.trim(obj.dom.searchInput.value);
		if(lsKeyword == obj.dom.searchInput.getAttribute("defVal")){
			lsKeyword = "";
		}
		obj.smartList.ctrl.dataUrl = obj.ctrl.friendInSearchDataUrl + encodeURIComponent(lsKeyword);
		obj.smartList.pager.ctrl.curPage = 1;
		obj.smartList.buildUI();
		
		obj.dom.select.value = obj.ctrl.optionAll;
	}
	function modifySmartListUI(){
		var lxCheckbox = obj.dom.getSelectTrigger();		
		for(var i=0; i<lxCheckbox.length;i++){
			var leCheckbox = lxCheckbox[i];
			if(obj.data.selectedFriends[leCheckbox.getAttribute("id")]){
				U.addClass(leCheckbox,obj.ctrl.selectedStyle);
			}
			leCheckbox.onclick = clickItemHandler(i);
		}
		obj.updateSelectTriggerStatus();
		function clickItemHandler(aiIndex){
			return function(){
				var leCheckbox = lxCheckbox[aiIndex];
				var lsId = leCheckbox.parentNode.getAttribute("id");
				var lsName = leCheckbox.parentNode.getAttribute("title");
				if(!leCheckbox.checked){					
					delete obj.data.selectedFriends[lsId];
				}else{
					obj.data.selectedFriends[lsId] = lsName;
				}
				obj.updateSelectTriggerStatus();
				obj.updateSelectedFriends();
			}
		}
	}
	function updateSelectedFriends(){
		var lxHTML = [];			
		var lxData = [];
		for (var x in obj.data.selectedFriends){
			var lsName = obj.data.selectedFriends[x].substring(0,19).split("<").join("&lt;").split(">").join("&gt;");
			var lsTitle = obj.data.selectedFriends[x].split('"').join("&quot;").split("'").join("&#39;");
			lxData.push({"DisplayName":lsName,"Title":lsTitle,"UserId":x})				
		}
		obj.dom.selectedFriendsWrapper.innerHTML = U.smartView(obj.view.friendGroupOption,lxData);
		var lxClose = obj.dom.getRemoveFriendButtons();
		for(var i=0;i<lxClose.length;i++){
			var leClose = lxClose[i];
			var leItem = leClose.parentNode;
			U.addEvent(leClose,"click",removeFriend);
		}
		if(obj.event.updateSelectedFriends){
			obj.event.updateSelectedFriends();
		}
	}
	function removeFriend(event){
		event = event || window.event;
		var leTarget = event.target || event.srcElement;	
		var lsId = leTarget.parentNode.getAttribute("uid");
		delete obj.data.selectedFriends[lsId];
		obj.updateSelectTriggerStatus();
		obj.updateSelectedFriends();
	}	
	function updateSelectTriggerStatus(){
		var flag = true;
		var liSelectedFriends = getSelectedFriendsLength();
		var lxSelectTrigger = obj.dom.getSelectTrigger();
		for(var i=0; i<lxSelectTrigger.length;i++){
			var leSelectTrigger = lxSelectTrigger[i];
			var lsId = leSelectTrigger.parentNode.id;
			if(obj.data.selectedFriends[lsId]){
				leSelectTrigger.checked = true;
			}else{
				leSelectTrigger.checked = false;
			}
		}
		
		if(liSelectedFriends >= obj.ctrl.maxFriends){
			for(var i=0; i<lxSelectTrigger.length;i++){
				var leSelectTrigger = lxSelectTrigger[i];				
				if(!leSelectTrigger.checked){
					leSelectTrigger.disabled = true;
				}
			}
			flag = false;
		}else{
			for(var i=0; i<lxSelectTrigger.length;i++){
				var leSelectTrigger = lxSelectTrigger[i];				
				if(!leSelectTrigger.checked){
					leSelectTrigger.disabled = false;
				}
			}
		}
		if(obj.event.updateSelectTriggerStatus){
			obj.event.updateSelectTriggerStatus(obj.ctrl.maxFriends - liSelectedFriends);
		}	
		return flag;
	}
	function getSelectedFriendsLength(){
		var index = 0;
		for(var x in obj.data.selectedFriends){
			index++;
		}
		return index;
	}
	function iUtil(){
		return {
			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);
			    }
			},
			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, "");
			},
			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;
			},
			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);
			},			
			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("");
			}
		};		
	}	
}

function smartListWithPagerV2(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.dataUrl = aoConf.dataUrl || "";
	obj.ctrl.pageSize = aoConf.pageSize || 10;
	obj.dom.wrapper = aoConf.wrapper;
	obj.dom.getTopPager = aoConf.getTopPager;
    obj.dom.getBottomPager = aoConf.getBottomPager;
    	
	obj.pager = pagerV2({
			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(asUri,afCallback){
    	var loData = obj.data[asUri];
    	if(!loData){
			CNMS.loadJsonP(asUri,action);			
    	}else{
			obj.pager.ctrl.totalPage = Math.ceil(parseInt(loData.Total) / obj.ctrl.pageSize);
			afCallback(loData.List);
			if(obj.event.getData){
				obj.event.getData(loData);
			}			
    	}
		function action(aoResp){
			var loResp = aoResp;
			obj.data[asUri] = loResp;
			obj.pager.ctrl.totalPage = Math.ceil(parseInt(loResp.Total) / obj.ctrl.pageSize);
			afCallback(loResp.List);
			if(obj.event.getData){
				obj.event.getData(loResp);
			}
		}
    }

    function buildUI(){
		var liCurRecord = (obj.pager.ctrl.curPage-1) * obj.ctrl.pageSize;
		var lsUri = smartView(obj.ctrl.dataUrl,{start:liCurRecord,count:obj.ctrl.pageSize});
		obj.getData(lsUri,action);
	    function action(axData){
			var lxData = axData;
			if(obj.formateData){
				lxData = obj.formateData(axData);
			}		
	    	if(lxData.length < 1){				
	    		obj.dom.wrapper.innerHTML = obj.view.empty;
	    	}else{
	    		obj.dom.wrapper.innerHTML = [obj.view.header,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.modifyUI){
	    		obj.modifyUI();
	    	}
	    	if(obj.event.buildUI){
	    		obj.event.buildUI();
	    	}			
	    }
    }    
	function smartView(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("");
	}

	function pagerV2(aoConf){
	    var obj = {};
	    if(!aoConf){
	    	aoConf = {};
	    }
	    obj.dom = {wrapper:aoConf.wrapper};
	    obj.dom.getLinks = function(){
	    	return obj.dom.wrapper.getElementsByTagName("a");
	    }
	    obj.ctrl = {};
		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.event = {};
		obj.event.clickLink = function(){
			obj.buildUI();
			return !1;
		};
		obj.event.buildUI = function(){
			obj.listen();
		};		
		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;
		            }
		            return obj.event.clickLink();
		        }
		    }
	    }
	    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.event.buildUI();
	    }  
	}	  
}