/*
new KT.friend(srcObjId,isSingle,callback,defaultUser)
	srcObjId		放好友选择器的容器ID
	isSingle		是否为单选，true:单选	false:多选
	callback		回调函数，回调参数为用户id列表，一维数组
	defaultUser		默认载入时选择的好友列表，一维数组
	preProcess		对friendList进行预处理

KT.friend.get();	返回选择的用户id列表，一维数组
KT.friend.del(user_id);		删除伙伴
*/
KT.friend = function(srcObjId,isSingle,done,defaultUser, preProcessCallback)
{
	this.srcObj = $(srcObjId);
	this.isSingle = isSingle;
	this.preProcessCallback= preProcessCallback;
	this.selectedUser = new Array();
	this.friendDiv = null;
	this.focusUser = null;
	this.selectedDiv = null;
	this.friendAllBtn = null;
	this.friendAll = null;
	this.friendList = null;
	this.searchUserList = new Array;
	this.searchUserListDiv = null;
	this.searchUser = null;
	this.removeUserArr = null;
	this.done = done;
	this.input = null;
	this.friendDiv = new Element("div",{
		"class":"fd_ch_n"
	}).inject(this.srcObj);
	
	this.friendAllBtn = new Element("img",{
		"src":"/images/btn_start.gif",
		"id":"_friend_all_btn_",
		"border":"0",
		"styles":{
			"cursor":"pointer",
			"float":"right"
		},
		"events":{
			"click":this.getFriendList.bind(this,this.showAllFriend.bind(this))
		}
	}).inject(
		new Element("div",{
			"class":"fd_b"
		}).inject(this.friendDiv)
	);
	this.selectedDiv = new Element("div",{
		"class":"fd_n",
		"events":{
			"click":function(){this.input.focus();}.bind(this)
		}
	}).inject(this.friendDiv);
	this.input = new Element("input",{
		"type":"text",
		"events":{
			"keydown":this.keyboardListener.bind(this),
			"keyup":this.inpChange.bind(this),
			"focus":this.doSearchUser.bind(this),
			"blur":this.closeSearchUser.bind(this)
		}
	}).inject(
		new Element("div",{
			"class":"fd_i"
		}).inject(this.selectedDiv)
	);
	if(KT.Chk.isArray(defaultUser) && defaultUser.length>0)
	{
		for(i=0;i<defaultUser.length;i++)
		{
			if(parseInt(defaultUser[i])>0)
			{
				this.selectedUser[this.selectedUser.length] = defaultUser[i];
			}
		}

		if(this.selectedUser.length>0)
		{
			this.getFriendList(this.showSelectedFriend.bind(this));
		}
	}
}

KT.friend.prototype.get = function() 
{
	if(this.isSingle)
	{
		if(this.selectedUser.length > 0)
			return this.selectedUser[0];
		else
			return null;
	}
	else
	{
		if(this.selectedUser.length > 0)
			return this.selectedUser;
		else
			return null;
	}
}

KT.friend.prototype.showSelectedFriend = function()
{
	if(this.isSingle)
	{
		if(this.selectedUser.length == 1)
		{
			this.input.value = this.friendList[this.selectedUser[0]].name;
			if(typeof this.done == "function")
			{
				this.done(this.get());
				this.selectedUser.empty();
			}
		}
	}
	else
	{
		this.selectedDiv.getElements("div.fd_o").each(function(item,index){item.destroy();});
		this.selectedUser.each(function(item,index){
			var tmp = new Element("div",{
				"id":"s_f_"+item,
				"class":"fd_o"
			});
			new Element("div",{
				"html":this.friendList[item].name,
				"class":"fd_o_n",
				"events":{
					"click":function(){this.selFocusUser(item);}.bind(this)
				}
			}).inject(tmp);
			new Element("div",{
				"class":"fd_o_b",
				"html":"Ｘ",
				"events":{
					"click":function(){
						this.deleteSelectFriend(item);
					}.bind(this)
				}
			}).inject(tmp)
			if(this.focusUser == item)
			{
				tmp.setStyle("background-color","#6666FF");
			}
			tmp.inject(this.input,"before");
		}.bind(this))
		this.input.focus();
	}
	this.showAllClose();
	if(this.selectedUser.length == 0)
		this.focusUser = null;
}
KT.friend.prototype.clear = function()
{
	this.selectedUser.empty();
	this.showSelectedFriend();
}
KT.friend.prototype.deleteSelectFriend = function(user_id)
{
	if(this.focusUser != null && this.selectedUser.length>0 && user_id == this.focusUser)
	{
		var i = this.selectedUser.indexOf(this.focusUser)+1;
		if(i>=this.selectedUser.length)
			i = this.selectedUser.length-2;
		this.focusUser = null;
		if(i>=0)
		{
			this.selFocusUser(this.selectedUser[i]);
		}
	}
	else
	{
		this.focusUser == null;
	}
	$("s_f_"+user_id).destroy();
	this.selectedUser.erase(user_id);
}

KT.friend.prototype.showAllClose = function()
{
	this.friendAllBtn.src= "/images/btn_start.gif";
	if(this.friendAll!=null)
	{
		this.friendAll.destroy();
		this.friendAll = null;
	}
}

KT.friend.prototype.showAllFriend = function()
{
	if(this.friendAllBtn.src.indexOf("btn_cont.gif") == -1)
	{
		this.friendAllBtn.src= "/images/btn_cont.gif";
		var t = this.friendDiv.getPosition();
		var s = this.friendDiv.getSize();
		var tt = t.y+s.y;
		var tl = t.x+s.x - 316;
		this.friendAll = new Element("div",{
			"class":"fd_ch_r",
			"styles":{
				"z-index":"9000",
				"position":"absolute",
				"top":tt+"px",
				"left":tl+"px"
			}
		}).inject(document.body);
		new Element("div",{
			"html":"请选择伙伴名",
			"class":"s"
		}).inject(this.friendAll);
		this.showAllFriendList().inject(this.friendAll);
		if(!this.isSingle)
		{
			new Element("input",{
				"type":"button",
				"value":"确定",
				"class":"fd_s_b",
				"events":{
					"click":this.showSelectedFriend.bind(this)
				}
			}).inject(this.friendAll);
		}
		else
		{
			new Element("div",{"html":"单击要选择好的名字","styles":{"padding":3}}).inject(this.friendAll);
		}

		if(!this.isSingle)
		{
			new Element("input",{
				"type":"button",
				"value":"清除",
				"class":"fd_s_b",
				"events":{
					"click":function(){
						this.selectedUser = new Array();
						this.friendAll.getElements("div.a_n")[0].getElements("li").each(function(item,index){item.getChildren()[0].checked = false;});
					}.bind(this)
				}
			}).inject(this.friendAll);

			new Element("input",{
				"type":"button",
				"value":"全选",
				"class":"fd_s_b",
				"events":{
					"click":function(){
						this.selectedUser = new Array();
						this.friendAll.getElements("div.a_n")[0].getElements("li").each(function(item,index){item.getChildren()[0].checked = true;
						this.selectedUser[this.selectedUser.length] = item.getChildren()[0].value}.bind(this));
					}.bind(this)
				}
			}).inject(this.friendAll);
		}
	}
	else
	{
		this.showSelectedFriend();
	}
	
	
	//alert(this.friendList);
	/*
	<div class="choose_rem">
		<div class="send">&nbsp;请选择发送对象</div>
	<div class="all_name">
	*/
}
/*
<ul>
		  <li><input name="frdname" type="checkbox" />艾菲</li>
</ul>
*/

KT.friend.prototype.showAllFriendList = function()
{
	var tmpdiv = new Element("div",{
		"class":"a_n"
	});
	var tmpul = new Element("ul",{});
	this.friendList.each(function(item,index,hash)
	//for(key in this.friendList)
	{
		//item = this.friendList[key];
		var tmpli = new Element("li",{}).inject(tmpul);
		if(this.isSingle)
		{
			tmpli.set("html",item.name);
			tmpli.setStyle("cursor","pointer");
			tmpli.addEvent("click",function(user_id){
				this.selectFriend(user_id);
			}.bind(this,item.user_id));
		}
		else
		{
			var chked = false;
			if(this.selectedUser.contains(item.user_id))
			{
				chked = true;
			}
			new Element("input",{
				"name":"friendItem",
				"userid":item.user_id,
				"value":item.user_id,
				"type":"checkbox",
				"checked":chked,
				"id":"friendItem"+item.user_id,
				"events":{
					"click":function(user_id){
						this.selectFriend(user_id);
					}.bind(this,item.user_id)
				}
			}).inject(tmpli);
			new Element("label",{
				"for":"friendItem"+item.user_id,
				"html":item.name
			}).inject(tmpli);
		}
	},this);
	tmpul.inject(tmpdiv);
	return tmpdiv;
}
KT.friend.prototype.selectFriend = function(user_id)
{
	if(this.isSingle)
	{
		this.selectedUser.empty();
		this.selectedUser[0] = user_id;
		this.showSelectedFriend();
	}
	else
	{
		if($("friendItem"+user_id).checked)
		{
			this.selectedUser.include(user_id);
		}
		else
		{
			this.selectedUser.erase(user_id);
		}
	}
}

KT.friend.prototype.removeUser = function(user_arr)
{
	if(this.friendList===null)
	{
		this.removeUserArr = user_arr;
		this.getFriendList(this.removeUser.bind(this));
		return false;
	}
	if(this.removeUserArr!==null)
	{
		for(var i=0;i<this.removeUserArr.length;i++)
		{
			if(KT.Chk.isObject(this.friendList[this.removeUserArr[i]]))
			{
				this.friendList.erase(this.removeUserArr[i]);
			}
		}
	}
}

KT.friend.prototype.getFriendList = function(callback)
{
	if(callback==null)
	{
		callback = function(){};
	}
	if(this.friendList===null)
	{
		new Request.JSON({url: "/friend/get_all.php?random="+(new  Date).getTime(),onSuccess: function(result,text)
		{
			this.friendList = new Hash();
			result.result.each(function(item, index){
				this.friendList[item["user_id"]] = item;
			}.bind(this));
			if(this.preProcessCallback != null && typeof this.preProcessCallback == "function"){
				this.preProcessCallback(this.friendList);
			}
			callback();
		}.bind(this)}).get({"add_user_arr":JSON.encode(this.selectedUser)});
	}
	else
	{
		callback();
	}
}

KT.friend.prototype.keyboardListener = function(e)
{
	if(this.isSingle)
	{
		return true;
	}
	if(this.input.value == "" && this.selectedUser.length>0)
	{
		if(e.code==8)
		{
			this.deleteSelectFriend(this.selectedUser.getLast());
			return true;
		}
		if(e.code==37)
		{
			if(this.focusUser == null)
			{
				this.selFocusUser(this.selectedUser.getLast());
			}
			else
			{
				var i = this.selectedUser.indexOf(this.focusUser)-1;
				(i<0)?this.selFocusUser(this.selectedUser.getLast()):this.selFocusUser(this.selectedUser[i]);
			}
			return true;
		}

		if(e.code==39)
		{
			if(this.focusUser == null)
			{
				this.selFocusUser(this.selectedUser[0]);
			}
			else
			{
				var i = this.selectedUser.indexOf(this.focusUser)+1;
				(i>=this.selectedUser.length)?this.selFocusUser(this.selectedUser[0]):this.selFocusUser(this.selectedUser[i]);
			}
			return true;
		}

		if(e.code==46)
		{
			if(this.focusUser != null)
			{
				this.deleteSelectFriend(this.focusUser);
			}
			return true;
		}
	}
	if(this.searchUserList.length>0)
	{
		if(e.code==32 || e.code==13)
		{
			this.selectedUser.include(this.searchUser);
			this.searchUser = null;
			this.showSelectedFriend();
			this.input.value = "";
			return false;
		}
		if(e.code==38)
		{
			var x = this.searchUserList.indexOf(this.searchUser);
			$("f_s_"+this.searchUser).removeClass("bg");
			x = ((x-1)<0)?this.searchUserList.length-1:x-1;
			this.searchUser = this.searchUserList[x];
			if($("f_s_"+this.searchUser)!=null)
				$("f_s_"+this.searchUser).addClass("bg");
			return false;
		}
		if(e.code==40)
		{
			var x = this.searchUserList.indexOf(this.searchUser);
			if($("f_s_"+this.searchUser)!=null)
				$("f_s_"+this.searchUser).removeClass("bg");
			x = ((x+1)>=this.searchUserList.length)?0:x+1;
			this.searchUser = this.searchUserList[x];
			if($("f_s_"+this.searchUser)!=null)
				$("f_s_"+this.searchUser).addClass("bg");
			return false;
		}
	}
}

KT.friend.prototype.inpChange = function(e)
{
	if(this.input.value == "")
		this.doSearchUser();
	if(e.code>46)
		this.getFriendList(this.doSearchUser.bind(this));
}

KT.friend.prototype.doSearchUser = function()
{
	this.searchUserList.empty();
	if(this.input.value != "")
	{
		this.friendList.each(function(item,index,hash){
			//reg = "/^"
			//reg += str+"[a-z]*";
			//reg += "/i";
			if(!this.selectedUser.contains(item.user_id))
			{
				if(item.name.match(new RegExp("^"+this.input.value+".*","i"))!== null)
				{
					this.searchUserList[this.searchUserList.length] = item.user_id;
				}
				else if(item.pinyin.match(new RegExp("^"+this.input.value+"[a-z]*","i"))!== null)
				{
					this.searchUserList[this.searchUserList.length] = item.user_id;
				}
				else
				{
					var reg = "^";
					for(i=0;i<this.input.value.length;i++)
					{
						if(this.input.value.charAt(i)>255)
						{
							reg = "";
							break;
						}
						var ns = this.input.value.charAt(i).toString().toUpperCase();
						reg += ns+"[a-z]*";
					}
					if(reg!="")
					{
						if(item.pinyin.match(new RegExp(reg,""))!== null)
						{
							this.searchUserList[this.searchUserList.length] = item.user_id;
						}
					}
				}
			}
		}.bind(this));
	}
	this.showSearchUser();
}

KT.friend.prototype.showSearchUser = function()
{
	var t = this.friendDiv.getPosition();
	var s = this.friendDiv.getSize();
	var ss = this.input.getPosition();
	var tt = t.y+s.y -1;
	var tl = ss.x;
	this.closeSearchUser();
	this.searchUserListDiv = new Element("div",{
		"class":"fd_ch_r2",
		"styles":{
			"position":"absolute",
			"top":tt+"px",
			"left":tl+"px"
		}
	}).inject(document.body);
	new Element("ul",{}).inject(this.searchUserListDiv);
	if(this.searchUserList.length >0 )
	{
		this.searchUserList.each(function(item,index){
			new Element("li",{
				"html":this.friendList[item].name,
				"id":"f_s_"+item,
				"styles":{
					"cursor":"pointer"				
				},
				"events":{
					"mousedown":function(){
						if(this.isSingle)
						{
							this.selectedUser = new Array(item);
						}
						else
						{
							this.selectedUser.include(item);
						}
						this.showSelectedFriend();
						this.closeSearchUser();
						this.input.value = "";						
					}.bind(this)
				}
			}).inject(this.searchUserListDiv.getChildren()[0])
		}.bind(this));

		if(this.searchUser!=null && $("f_s_"+this.searchUser)!=null)
		{
			$("f_s_"+this.searchUser).removeClass("bg");
		}
		$("f_s_"+this.searchUserList[0]).addClass("bg");
		this.searchUser = this.searchUserList[0];
	}
	else
	{
		new Element("li",{
			"class":"bg",
			"html":"输入好友的姓名或拼音查找好友！"
		}).inject(this.searchUserListDiv.getChildren()[0])
	}
}

KT.friend.prototype.selectSearchUser = function(user_id)
{
	if($("f_s_"+user_id)!=null)
	{
		$("f_s_"+user_id).addClass("bg");
		this.searchUser = user_id;
	}
}

KT.friend.prototype.closeSearchUser = function()
{
	if(this.searchUserListDiv != null)
	{
		this.searchUserListDiv.destroy();
		this.searchUserListDiv = null;
	}
}

KT.friend.prototype.selFocusUser = function(user_id)
{
	if(this.focusUser!=null)
		$("s_f_"+this.focusUser).setStyle("background-color","#e2e6ef");
	$("s_f_"+user_id).setStyle("background-color","#6666FF");	
	this.focusUser = user_id;
	this.input.focus();
}

KT.friend.delFromlistCB = function(uid,name) {
    var obj = $('friend'+uid);
    var efx = obj.get('tween', {property: 'opacity', duration: 500});
    efx.addEvent('complete',function() {
	obj.addClass('hiddenit');
    }.bind(this));
    efx.start(1,0);
}

KT.friend.delFromUserCB = function(uid, name) {
    $$('.addfriend')[0].innerHTML = '<a href="#" id="addf">+加为伙伴</a>';
    $('addf').addEvent('click',function(){
	//KT.friend.add(uid, name);
	KT.Scrip.create('{_$RESULT.info.user_id_}','addf');
    });
}

KT.friend.add = function(uid, name) {
    new Request.JSON({url: "/friend/request.php", onComplete: function(person){
	fDialog = new KT.Dialog({
		"title":"伙伴邀请",
		"width":310,
		"height":80,
		"alert":true,
		"content":'你已经向'+name+'发出伙伴邀请,请等待他的回复',
		"EB":false,
		"CB":false,
        "autoClose":true,
        "autoCloseTime":2000
	}).create();
    }}).post({
	'user_id': uid,
	'content':'<kt:name>'+KT.friend.viewer_id+'</kt:name>想成为您的伙伴<kt:req-button type="ajax" event="friend_add" label="同意，并与对方成为好友" tips="您已同意此请求，并与对方成为好友"/>'
    });
}

KT.friend.add_arr = function(ids) {
    new Request.JSON({url: "/friend/request_batch.php", onComplete: function(person){
		fDialog = new KT.Dialog({
			"title":"伙伴邀请",
			"width":200,
			"height":60,
			"alert":true,
			"content":'你已经向伙伴伙伴们发出邀请,请等待他的回复',
			"EB":false,
			"CB":false
		}).create();
    }}).post({
		'user_id_arr': JSON.encode(ids),
		'content':'<kt:name>'+KT.friend.viewer_id+'</kt:name>想成为您的伙伴<kt:req-button type="ajax" event="friend_add" label="同意，并与对方成为好友" tips="您已同意此请求，并与对方成为好友"/>'
    });
}

KT.friend.del = function(uid, name, cb)
{
	fDialog = new KT.Dialog({
		"title":"删除此伙伴？",
		"width":300,
		"height":100,
		"disableBG":true,
		"alert":true,
		"content":"<div style='text-align:left'>如果取消你们之间的伙伴关系,你将不会出现在对方的伙伴列表中,系统也不会发消息通知对方</div>",
		"EB":true,
		"EBCallback":function(){
			new Request.JSON({url: "/friend/delete.php", onComplete: function(person){
			    cb(uid,name);
			}}).post({'user_id': uid});
		},
		"CB":true,
		"EBCaption":"删除",
		"CBCaption":"取消"
	}).create();
}

