function IntroFriend(aoConf){
	var U=iUtil();

    var obj = {};
    obj.data = {};
    obj.view = {};
    obj.ctrl = {};
    obj.dom = {};
    obj.event = {};        
	
	obj.ctrl.wrapperId="introFriendWrapper";
    obj.ctrl.styleSheet="http://xfiles.cdnmyspace.cn/dir/friendGroup/code/introFriend.css";
	obj.ctrl.curUser={};
    init();
    
    
    return obj;
    
    function init(){
		var lxTriggers=aoConf.triggers||U.byClass("introFriendTrigger");
		for(var i=0;i<lxTriggers.length;i++){
			U.addEvent(lxTriggers[i],"click",itemClickHandler(i));
		}
		
		function itemClickHandler(aiIndex){
			return function(){
				var leTarget=lxTriggers[aiIndex];
				var lsId=leTarget.getAttribute("uid");
				var lsName=leTarget.getAttribute("uname");
				obj.ctrl.curUser={UserId:lsId,DisplayName:lsName};
				buildUI(obj.ctrl.curUser);		
			}
		}		
    }

	function buildUI(aoData){
		var lsHTML=[
			'	<dt>',
			'		<img class="close" src="http://xfiles.cdnmyspace.cn/dir/music/v1/img/k_ico_close.gif" alt=""/>',
			'		<span class="text" id="kcz_shareToFriendsTitle">介绍好友</span>',
			'	</dt>',
			'	<dd class="hr"></dd>',
			'	<dd class="step1Wrapper">',
			'		<div class="textWrapper">',
			'			如果你的好友中有<span class="nickName">',aoData.DisplayName,'</span>的熟人，或你觉得他可能感兴趣的人，就快介绍给他吧！',
			'		</div>',
			'		<div class="inputWrapper">',
			'			<img class="friendPanelTriger" id="ctrl_displayTrigger_introFriend" src="http://xfiles.cdnmyspace.cn/dir/gift/v1/img/inputB1.png" />',
			'			<div class="friendPicker" id="ctrl_friendPickerWrapper_introFriend">',
			'				 <span id="ctrl_friendPickerSelectedFriends_introFriend"></span>',
			'				 <input id="ctrl_friendNameInput_introFriend" type="text" deffval="请输入好友姓名或昵称(支持拼音)" value="" class="inputFriendName" />	     ',
			'			</div>			',
			'		</div>',
			'		<div class="optWrapper">',
			'			<div class="error">您还没有选择好友！</div>',
			'			<a class="cnViBtnBlue" href="javascript:void(0)"><b><i>立即介绍</i></b></a>',
			'			&nbsp;&nbsp;',
			'			<a class="cnViBtnSilver" href="javascript:void(0)"><b><i>取 消</i></b></a>',
			'		</div>',
			'	</dd>	',
			'	<dd class="step2Wrapper">',
			'		介绍成功，已经向<span class="nickName">',aoData.DisplayName,'</span>和你介绍的好友发送通知信啦！<br />',
			'		他们有可能通过你的介绍成为好友哦~',
			'	</dd>',
			'	<dd class="step3Wrapper">出错啦！</dd>'].join("");
		var leWrapper = document.getElementById(obj.ctrl.wrapperId);
		if(!leWrapper){
			leWrapper = document.createElement("dl");
			leWrapper.id = obj.ctrl.wrapperId;
			leWrapper.className = obj.ctrl.wrapperId;
			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:leWrapper,
			close:U.byClass("close",leWrapper,"img")[0],
			nickName:U.byClass("nickName",leWrapper,"span")[0],
			nickName2:U.byClass("nickName",leWrapper,"span")[1],
			step1:leWrapper.getElementsByTagName("dd")[1],
			step2:leWrapper.getElementsByTagName("dd")[2],
			step3:leWrapper.getElementsByTagName("dd")[3],
			submit:U.byClass("cnViBtnBlue",leWrapper,"a")[0],
			cancel:U.byClass("cnViBtnSilver",leWrapper,"a")[0],
			error:U.byClass("error",leWrapper,"div")[0]		
		}
		obj.popLayer=PopLayer({
			popLayer:leWrapper,
			topDiff:-100
		});
		obj.friendPicker=FriendPicker({
			wrapper:document.getElementById("ctrl_friendPickerWrapper_introFriend"),
			trigger:document.getElementById("ctrl_displayTrigger_introFriend"),
			selectedFriendsWrapper:document.getElementById("ctrl_friendPickerSelectedFriends_introFriend"),
			input:document.getElementById("ctrl_friendNameInput_introFriend"),
			maxFriends:20,
			panelAlign:"left",
			panelTopDiff:9,
			panelLeftDiff:7,
			listTopDiff:10,
			listLeftDiff:7,
			listWidthDiff:2
		});
		//过滤好友
		obj.friendPicker.autoSuggest.filter=function(aoData){
			var lxData = [];
			var cnt = 0;
			for(var x in aoData){
				if(x != "" && x!=obj.ctrl.curUser.UserId){
					lxData.push(aoData[x]);
				}
				if(++cnt >= obj.friendPicker.autoSuggest.ctrl.showCount){
					break;
				}
			}
			return lxData;
		}		
		var lfOldUpdateStatus=obj.friendPicker.friendSelector.updateStatus;
		obj.friendPicker.friendSelector.updateStatus=function(){
			lfOldUpdateStatus();
			var lsUnitId="input_"+obj.ctrl.curUser.UserId;
			var leSelfUser=document.getElementById(lsUnitId);
			if(leSelfUser){
				leSelfUser.parentNode.style.display="none";
			}
		}
		
		listen();
		obj.popLayer.show();
	}
	function listen(){
		U.addEvent(obj.dom.close,"click",close);
		U.addEvent(obj.dom.cancel,"click",close);
		U.addEvent(obj.dom.submit,"click",submit);
		
		U.addEvent(window,"resize",onPageChange);
		U.addEvent(window,"scroll",onPageChange);
	}
	function onPageChange(){
		obj.friendPicker.friendSelector.hide();
		//obj.friendPicker.autoSuggest.hide();
		obj.popLayer.resize();
	}
	function close(){
		clearTimeout(obj.ctrl.timer);
		obj.popLayer.hide();
	}
	
	
	function submit(){
		var loData=obj.friendPicker.friendSelector.data.selectedItems;
		var lxResult=[];
		for(var x in loData){
			lxResult.push(x);
		}
		if(lxResult.length<1){
			obj.dom.error.style.visibility="visible";
			return;
		}else{
			obj.dom.error.style.visibility="hidden";
		}
		var loRequest = {
			"webservices":"http://ajaxv2.myspace.cn/_common/AjaxService/UserHomeSvc.svc/json/sendRecommendFriends",
			"values":["from=",lxResult.join(","),"&to=",obj.ctrl.curUser.UserId].join(""),
			"contentType":"application/x-www-form-urlencoded"
		}
	
		U.loadAjax(loRequest,action);
		//action('{result:1}')
		function action(asData){			
			var loData=U.json2Obj(asData);
			obj.dom.step1.style.display="none";
			if(loData.result == 1){
				obj.dom.step2.style.display="block";
				obj.ctrl.timer=setTimeout(function(){
					obj.popLayer.hide();
				},3000);
			}else if(loData.result == 2){
				close();
				location.href=loData.msg;
			}else{
				obj.dom.step3.style.display="block";				
			}
			obj.popLayer.resize();				
		}
	}	
	

	function PopLayer(aoConf){
		var obj = {};
		obj.dom = {
			popLayer:aoConf.popLayer,
			mask:null,
			obstacles:null
		}
		obj.event = {};
		obj.ctrl = {};
		obj.ctrl.obstacleTags = ["select","object","embed"];
		obj.ctrl.isIE6 = true; // !!(document.all && (typeof XMLHttpRequest=="undefined"));
		obj.ctrl.isShow = false;
		obj.ctrl.topDiff = aoConf.topDiff||0;
		
		obj.resize = resize;
		obj.show = show;
		obj.hide = hide;
		
		return obj;
		
		function show(){
			if(obj.ctrl.isIE6){
				hideObstacles();
			}			
			if(!obj.dom.mask){
				obj.dom.mask = document.createElement("div");
				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";
			}
			
			obj.dom.popLayer.style.display = "block";
			obj.ctrl.isShow = true;
			
			obj.resize();			
			if(obj.event.show){
				obj.event.show();
			}
		}
		function hide(){	
			if(obj.dom.mask){
				obj.dom.mask.style.display = "none";
			}
			obj.dom.popLayer.style.display = "none";
			if(obj.ctrl.isIE6){
				showObstacles();
			}
			obj.ctrl.isShow = false;
			if(obj.event.hide){
				obj.event.hide();
			}			
		}
		function resize(){
			if(!obj.ctrl.isShow){
				return;
			}
			var liPageWidth = U.getPageSize().x;
			var liPageHeight = U.getPageSize().y;
			var liViewWidth = U.getViewPort().x;
			var liViewHeight = U.getViewPort().y;
			var liMaxHeight = liPageHeight > liViewHeight ? liPageHeight : liViewHeight;
			if(obj.dom.mask){
				obj.dom.mask.style.width = "100%";
				obj.dom.mask.style.height = liMaxHeight + "px";	
			}
			//fix profile bug in ie6 html{-overflow:hidden;}
			if(navigator.userAgent.indexOf("IE")!=-1){
				document.documentElement.style.overflow="auto";	
				document.body.style.height="auto";					
			}
			obj.dom.popLayer.style.left = Math.round((liViewWidth - obj.dom.popLayer.offsetWidth) / 2) + U.getScroll().x + "px";
			obj.dom.popLayer.style.top = Math.round((liViewHeight - obj.dom.popLayer.offsetHeight) / 2) + U.getScroll().y + obj.ctrl.topDiff + "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 {
			loadAjax: function(aoObj, afCallback, asDomain){
				if(navigator.userAgent.indexOf("IE")!=-1){
					action(delay);
				}else{
					delay();
				}
	
				function delay(){
					if (document.domain != "myspace.cn"){
						document.domain = "myspace.cn";
					} 
					if (aoObj == null){
						return false;
					}
					if (asDomain == null){
						asDomain = "ajaxv2";
					}
					var lsFrameUrl = "http://" + asDomain + ".myspace.cn/_common/static/post.html";
					var lsFrameName = asDomain + "_frame";
					var lsFrameWrapperId = asDomain+"_frameWrapper";
					var leFrameWrapper = document.getElementById(lsFrameWrapperId);
					if (window.frames[lsFrameName] == null){
						leFrameWrapper = document.createElement("span");
						leFrameWrapper.id = lsFrameWrapperId;
						leFrameWrapper.style.display = "none";
						document.body.appendChild(leFrameWrapper);
						leFrameWrapper.innerHTML = '<iframe name='+lsFrameName+'></iframe>';
						addLoadListener();
					}else if(window.frames[lsFrameName].loadServices == null){
						addLoadListener();
					}else{
						lfCallback();
					}
					function addLoadListener(){
						var leIframe =  leFrameWrapper.getElementsByTagName("iframe")[0];
					    if (navigator.userAgent.indexOf("IE")!=-1) {
					       leIframe.attachEvent("onload", lfCallback);
					    } else {
					        leIframe.addEventListener("load", lfCallback, false);
					    }
						leIframe.src = lsFrameUrl;				
					}
					
					function lfCallback(){
						afCallback(window.frames[lsFrameName].loadServices(aoObj));
					}				
				}
				function action(afDelay){
					var timer = function(){
						try{
							document.documentElement.doScroll("left");
							afDelay();
						}catch(error) {							
							setTimeout(timer, 200);
						}					
					}
					timer();
				}				
			},
			loadJsonP: function(asUrl, afCallback){
				if (!asUrl) {
					return false;
				}
				var lsUrl = asUrl;
				if (lsUrl.indexOf("callback=") == -1) {
					var lsGUID="_autoCallBack"+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);				
			},
			json2Obj: function(astr){
				var ljson;
				if(typeof astr == "object"){
					return astr;
				}
				astr = (astr != null) ? astr.split("\n").join("").split("\r").join("") : "";
				if (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/.test(astr.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) {
					if (astr != "") {
						ljson = eval('(' + astr + ')');
						return ljson;
					}
				}
				return {};
			},
			includeUrl: function(asUrl, afCallback, asType){
				var leHead = document.getElementsByTagName('head')[0];
				if (asType == null){
					asType = "js";
				}				
				var leTag = null;
				if (asType == "js") {
					leTag = document.createElement('script');
					leTag.setAttribute('type', 'text/javascript');
					leTag.setAttribute('src', asUrl);
				}
				else {
					leTag = document.createElement('link');
					leTag.setAttribute('rel', 'stylesheet');
					leTag.setAttribute('type', 'text/css');
					leTag.setAttribute('href', asUrl);
				}
				if (afCallback != null) {
					leTag.onload = leTag.onreadystatechange = function(){
						if (leTag.ready) {
							return false;
						}
						if (!leTag.readyState || leTag.readyState == "loaded" || leTag.readyState == 'complete') {
							leTag.ready = true;
							afCallback(asUrl);
						}
					};
				}
				leHead.appendChild(leTag);
				return true;
			},		
			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);
				}
			},
			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;
			},			
			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);
			}
		}
	}


}