
function AddFriend(aoConf){
	var U=iUtil();
    var obj = {};
    obj.data = {};
    obj.view = {};
    obj.ctrl = {};
    obj.dom = {};
    obj.event = {};        
	
	obj.ctrl.wrapperId="add_friend_layer";
    obj.ctrl.styleSheet="http://xfiles.cdnmyspace.cn/dir/uibox/uikit/addFriend/style.css";
    obj.ctrl.tip="跟TA说几句话吧，100字以内（选填）";
	obj.ctrl.curUser={};
	
	AddFriend.buildUI=buildUI;
	
    init();
    return obj;
    
    function init(){
		var lxTriggers=(aoConf&&aoConf.triggers)||U.byClass("ctrl_add_friend_trigger");
		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");
				var lsImage=leTarget.getAttribute("uimage");
				obj.ctrl.curUser={UserId:lsId,DisplayName:lsName,Image:lsImage};
				buildUI(obj.ctrl.curUser);		
			}
		}		
    }

	function buildUI(aoData,axHideObj){
		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 class="nick_name">',aoData.DisplayName,'</span>为好友</span>',
			'	</dt>',
			'	<dd class="hr"></dd>',
			'	<dd class="step1Wrapper">',
			'		<div class="textWrapper">',
			'			<img class="avatar" src="',aoData.Image,'" alt="" />',
			'			你将把<span class="nick_name">',aoData.DisplayName,'</span>加为好友				',
			'		</div>',
			'		<div class="inputWrapper">',
			'			<textarea>跟TA说几句话吧，100字以内（选填）</textarea>',
			'			<span class="follow"><input type="checkbox" checked />同时关注TA</span>',
			'			<span class="count">*还可输入<span>100</span>个字</span>',
			'		</div>',
			'		<div class="optWrapper">',
			'			<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">好友请求发送成功，请等待对方通过。</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("nick_name",leWrapper,"span")[0],
			nickName2:U.byClass("nick_name",leWrapper,"span")[1],
			textarea:leWrapper.getElementsByTagName("textarea")[0],
			checkbox:leWrapper.getElementsByTagName("input")[0],			
			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]	
		}
		wordCounter(obj.ctrl.wrapperId);
		obj.popLayer=PopLayer({
			popLayer:leWrapper,
			topDiff:-100
		});
		if(axHideObj){
			obj.popLayer.ctrl.obstacleTags=axHideObj;
		}
		listen();
	
		checkLogin(aoData.UserId,function(asData){
			if(asData == "true"){				
				checkRelation(aoData.UserId,function(asData){
					var loData=U.json2Obj(asData);					
					if(loData.result==0){
						obj.popLayer.show();									
					}else if(loData.result==2){
						location.href=loData.url;
					}else if(loData.result==100){
						obj.popLayer.show();
						obj.dom.step1.style.display="none";
						obj.dom.step3.innerHTML="对方已经给您发送好友请求了";
						obj.dom.step3.style.display="block";		
					}else{
						obj.popLayer.show();
						obj.dom.step1.style.display="none";
						obj.dom.step3.innerHTML=loData.message;
						obj.dom.step3.style.display="block";							
					}
				});				
			}else{
				location.href="http://loginv2.myspace.cn/modules/cnlogin/pages/Login.aspx";
			}
		});		
	}
	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(obj.dom.textarea,"focus",inputFocusHandler);
		U.addEvent(obj.dom.textarea,"blur",inputBlurHandler);
		
		U.addEvent(window,"resize",onPageChange);
		U.addEvent(window,"scroll",onPageChange);
	}
	function inputFocusHandler(){
		if(obj.dom.textarea.value == obj.ctrl.tip){
			obj.dom.textarea.value = "";
		}			
	}
	function inputBlurHandler(){
		if(obj.dom.textarea.value == ""){
			obj.dom.textarea.value = obj.ctrl.tip;
		}
	}
	function onPageChange(){
		obj.popLayer.resize();
	}
	function close(){
		clearTimeout(obj.ctrl.timer);
		obj.popLayer.hide();
	}
	
	
	function submit(){
		var loCountImage = new Image();
		loCountImage.src = "http://count.myspace.cn/images/addfri1234.gif";
		
		
		var lsVal=obj.dom.textarea.value;
		if(obj.ctrl.tip==lsVal){
			lsVal="";
		}
		var loRequest = {
			"webservices":"http://ajax.myspace.cn/_Common/AjaxService/profileservice.asmx/MakeFriends",
			"values":['{"friendId":',obj.ctrl.curUser.UserId,',"msg":"',lsVal,'","follow":true}'].join(""),
			"contentType":"application/json"
		}
	
		U.loadAjax(loRequest,action,"ajax");
		//action('{result:1}')
		function action(asData){			
			var loData=U.json2Obj(asData);
			obj.dom.step1.style.display="none";
			if(loData.result == 0){
				obj.dom.step2.style.display="block";
				obj.ctrl.timer=setTimeout(function(){
					obj.popLayer.hide();
				},5000);
			}else if(loData.result == 2){
				close();
				location.href=loData.url;
			}else{
				obj.dom.step3.innerHTML=loData.message;
				obj.dom.step3.style.display="block";
			}
			obj.popLayer.resize();				
		}
	}
	function checkRelation(asId,afCallback){
		var loRequest = {
			"webservices":"http://ajax.myspace.cn/_Common/AjaxService/profileservice.asmx/GetFriendRequestStatus",
			"values":'{"friendId":'+asId+'}',
			"contentType":"application/json"
		};
		U.loadAjax(loRequest,afCallback,"ajax");
	}	
	function checkLogin(asId,afCallback){
		var loRequest = {
			"webservices":"http://ajax.myspace.cn/_Common/AjaxService/profileservice.asmx/IsUserLogIn",
			"values":'{"friendId":'+asId+'}',
			"contentType":"application/json"
		};
		U.loadAjax(loRequest,afCallback,"ajax");
	}
	function wordCounter(asWrapperId){
			var leWrapper = document.getElementById(asWrapperId);
			if(!leWrapper){
				return false;
			}
			
		    var liMax = 100;
		    var liLeft = liMax;	
			
			var dom = {
					keyWord:leWrapper.getElementsByTagName("textarea")[0],
					tip:U.byClass("count",leWrapper,"span")[0]
				};
			listen();
			
			function listen(){
			    U.addEvent(dom.keyWord, "keyup", caculate);
			    U.addEvent(dom.keyWord, "paste", caculate);			
			}	    
		    function caculate(){
	            liLeft = liMax - dom.keyWord.value.length;
	            if (liLeft > 0) {
	                dom.tip.innerHTML = "*还可输入" + liLeft + "个字";
	            } else {
	                setTimeout(function(){dom.keyWord.value = dom.keyWord.value.substring(0, liMax);},200);
	                dom.tip.innerHTML = '<span style="color:red">*已经达到最大长度</span>';
	            }
		    }
		}	

	function PopLayer(aoConf){
		var obj = {};
		obj.dom = {
			popLayer:aoConf.popLayer,
			mask:null,
			obstacles:null
		}
		obj.event = {};
		obj.ctrl = {};
		obj.ctrl.obstacleTags = ["select","object","embed"];
		if(aoConf.hideObj){
			obj.ctrl.obstacleTags = aoConf.hideObj;
		}
		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/ajax.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].ajax == 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(){				
						var lsGUID="_autoCallBackAjax_"+Math.floor(Math.random()*16000).toString(16);
						window[lsGUID] = afCallback;
						aoObj.callback=lsGUID;
						aoObj.url = aoObj.webservices;
						aoObj.data = aoObj.values;
						window.frames[lsFrameName].ajax(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);
			}
		}
	}


}