/**
 * 缺图标点击
 * <a href="#" onclick="if(oEditTag) {oEditTag.tagSearchGlobal();return false;}" title="全局搜索此标签"><img src="${style}/icn_tag_search.gif" border='0'></a>
 */
var jst_tag_list = new String('\
    <span class="n_ f13 c07 g_c_hand" title="全局搜索此标签" onclick="if(oEditTag) {oEditTag.tagSearchGlobal();return false;}">${tagName} :</span>\
    <span class="c06">\
      &nbsp;<a href="#" onclick="if(oEditTag) return oEditTag.searchTagFromType(1);">相片(<span id="thisPhotoNum" style="float:none;display:inline;">${photoNum}</span>)</a>&nbsp;<label class="bd1c">|</label>\
      &nbsp;<a href="#" onclick="if(oEditTag) return oEditTag.searchTagFromType(3);">日志(<span id="thisBlogNum" style="float:none;display:inline;">${blogNum}</span>)</a>&nbsp;<label class="bd1c">|</label>\
      &nbsp;<a href="#" onclick="if(oEditTag) return oEditTag.searchTagFromType(4);">收藏(<span id="thisRcNum" style="float:none;display:inline;">${favNum}</span>)</a>\
    </span>\
');



/**
 *
 */
var jst_search_photo_content = new String('\
    <div>\
      {for photo in photoList}\
        <div class="g_p_left g_c_pdin"><a href="http://${photo.userName|parentDomain}${prefix}/${oEditTag.urlPre}Photo.do?photoId=${photo.id}" target="_blank"><img class="g_img_02 bd01" src="${photo.squareUrl}" /></a></div>\
      {/for}\
    </div>\
    <div class="g_p_clear g_t_space">&nbsp;</div>\
');
/**
 *
 */
var jst_search_blog_content = new String('\
    <div>\
    {if blogList != null && blogList.length > 0}\
      {for b in blogList}\
		<div class="g_c_mvdn g_c_pdin g_t_left">\
		  <div class="g_c_pdin"><span class="a_a g_t_14 g_t_bold c07" href="http://${b.userName|default:""|parentDomain}/${b.permalink}" target="_blank">${b.title|default:""|escape}</span></div>\
		  <div class="g_c_pdin"><span class="a_a c06" href="http://${b.userName|default:""|parentDomain}" target="_blank">\
		  {if b.userNickname != null && b.userNickname != ""}\
			  ${b.userNickname|escape}\
		  {else}\
		  	  ${b.userName}\
		  {/if}\
		  </span>&nbsp;&nbsp;<label class="c09" style="margin-left:26px;">${NetEase.DateTime.formatDate(b.publishTime,"yyyy-MM-dd HH:mm:ss")}</label></div>\
		  <div class="g_c_pdin c07">${b.contentPlainText|default:""|escape}</div>\
		</div>\
      {/for}\
    {else}\
    {/if}\
    </div>\
');
/**
 *	收藏
 */
var jst_search_fav_content = new String('\
    <table border="0" cellspacing="0" cellpadding="0">\
      <tr><td class="c09">收藏名</td><td class="c09">类型</td><td class="c09">收藏者</td><td class="c09">描述</td></tr>\
	  {for rc in rcList}\
		<tr><td><a class="c05" href="http://${rc.userName|parentDomain}/${oEditTag.urlPre}Resource.do?selectId=${rc.id}" target="_blank">${rc.name|default:""|escape}</a></td>\
		<td class="c08">{if rc.type == "music"}音乐专辑{elseif rc.type == "rss"}RSS目录{elseif rc.type == "book"}在线书架{elseif rc.type == "web"}网址档案{elseif rc.type == "list"}个性列表{/if}</td>\
		<td><a class="c06" href="http://${rc.userName|parentDomain}" target="_blank">\
			{if rc.nickName != null && rc.nickName != ""}\
				${rc.nickName|escape}\
			{else}\
				${rc.userName}\
			{/if}\
		</a></td><td class="c08">${rc.description|default:""|escape}</td></tr>\
	  {/for}\
	</table>\
');

//去除标签管理中的相片数和收藏数相关的显示, wuyingqiang 2009.11.16

// 管理标签页面
var tag_all_jst = new String('\
	<div id="$$_item_list" class="g_c_enable">\
	<div id="$$_item_base">\
	<table border="0" cellspacing="0" cellpadding="0">\
	 <tr>\
	   {if oEditTag.isEdit==true}\
       <td class="c09 g_w_35 g_t_left" style="font-size:12px;">标签</td>\
       <td class="c09 g_w_15 g_c_hand" style="font-size:12px;"><div id="bc" onclick="if(oEditTag){return oEditTag._sortTagList(this);}">日志数<span class="n_ k8" id="bcimg">&nbsp;</span></div></td>\
       <td class="c09 g_w_10" style="font-size:12px;">编辑</td>\
       <td class="c09 g_w_10" style="font-size:12px;">删除</td>\
       {else}\
       <td class="c09 g_w_40 g_t_left" style="font-size:12px;">标签</th>\
       <td class="c09 g_w_20 g_c_hand" style="font-size:12px;"><div id="bc" onclick="if(oEditTag){return oEditTag._sortTagList(this);}">日志数<span class="n_ k8" id="bcimg">&nbsp;</span></div></td>\
       {/if}\
     </tr>\
    </table>\
    </div>\
    {for item in itemList}\
    {if item.tagName!=""}\
    <div id="$$_item_${item.id}" class="setDragOnlyClass">\
    <table border="0" cellspacing="0" cellpadding="0">\
    <tr>\
      {if oEditTag.isEdit==true}\
      <td id="$$_td${item.id}" class="g_t_left g_w_35" onclick="if(oEditTag){return oEditTag.searchTagFromEl($(\'$$_a${item.id}\'), null);}"><div style="word-wrap:break-word;word-break:break-all;overflow:hidden;"><a class="c07" href="#" id="$$_a${item.id}">${item.tagName|default:""|escape}</a></div></td>\
      <td class="g_w_15 g_c_hand c08" id="$$_bn${item.id}" onclick="if(oEditTag){return oEditTag.searchTagFromEl($(\'$$_a${item.id}\'), null);}">\
      {else}\
      <td id="$$_td${item.id}" class="g_t_left g_w_40" onclick="if(oEditTag){return oEditTag.searchTagFromEl($(\'$$_a${item.id}\'), null);}"><div style="word-wrap:break-word;word-break:break-all;overflow:hidden;"><a class="c07" href="#" id="$$_a${item.id}">${item.tagName|default:""|escape}</a></div></td>\
      <td class="g_w_20 g_c_hand c08" id="$$_bn${item.id}" onclick="if(oEditTag){return oEditTag.searchTagFromEl($(\'$$_a${item.id}\'), null);}">\
      {/if}\
		{if (oEditTag.iVisitorRank>100)}\
			${item.blogCount|default:0}\
		{elseif (oEditTag.iVisitorRank==100)}\
			${item.friendBlogCount|default:0}\
		{else}\
			${item.guestBlogCount|default:0}\
		{/if}\
	  </td>\
      <td class="g_w_10"><span class="n_ e7b g_c_hand e" name="editTagButton" onclick="if(oEditTag){oEditTag.tagEditing=true; return ${objName}.editItem(\'${item.id}\',this);}">&nbsp;</span><span class="n_ e8b d">&nbsp;</span></td>\
	  <td class="g_w_10"><span class="n_ n6 g_c_hand e" name="deleteTagButton" onclick="if(oEditTag){return ${objName}.deleteItem(\'${item.id}\',this);}">&nbsp;</span><span class="i_ i27 d">&nbsp;</span></td>\
	 </tr>\
	<tr><td colspan="4">\
	<div id="$$_item_frame_${item.id}">\
	<div id="resultFrame${item.id}" class="bd01 g_c_mvdn g_p_center" style="display:none;width:609px;">\
      	<div class="g_c_mvdn" id="search_blogresultFrame${item.id}">\
      		<div class="g_h_25 g_t_left g_c_pdin selitm">\
      			<div id="mark_blogresultFrame${item.id}" class="g_p_right g_w_40 g_t_right"></div>\
      			<span class="g_t_bold c08">日志</span>\
      		</div>\
      		<div id="_$_search_blog_contentresultFrame${item.id}" class="g_t_center"></div>\
		</div>\
	</div></div>\
	</td></tr>\
	</table></div>\
	{/if}\
	{forelse}\
	    <div id="$$_item_to_add">\
	    	 {if oEditTag.isEdit==true}\
	    	     目前没有标签，请先为日志添加新的标签。\
	    	 {else}\
			    目前没有标签。\
			 {/if}\
		</div>\
	{/for}\
	</div>\
');

//原有代码备份
//var tag_all_jst = new String('\
//	<div id="$$_item_list" class="g_c_enable">\
//	<div id="$$_item_base">\
//	<table border="0" cellspacing="0" cellpadding="0">\
//	 <tr>\
//	   {if oEditTag.isEdit==true}\
//       <td class="c09 g_w_35 g_t_left" style="font-size:12px;">标签</td>\
//       <td class="c09 g_w_15 g_c_hand" style="font-size:12px;"><div id="bc" onclick="if(oEditTag){return oEditTag._sortTagList(this);}">日志数<span class="n_ k8" id="bcimg">&nbsp;</span></div></td>\
//       <td class="c09 g_w_15 g_c_hand" style="font-size:12px;"><div id="pc" onclick="if(oEditTag){return oEditTag._sortTagList(this);}">相片数<span id="pcimg" class="n_ k8">&nbsp;</span></div></td>\
//       <td class="c09 g_w_15 g_c_hand" style="font-size:12px;"><div id="lc" onclick="if(oEditTag){return oEditTag._sortTagList(this);}">收藏数<span id="lcimg" class="n_ k8">&nbsp;</span></div></td>\
//       <td class="c09 g_w_10" style="font-size:12px;">编辑</td>\
//       <td class="c09 g_w_10" style="font-size:12px;">删除</td>\
//       {else}\
//       <td class="c09 g_w_40 g_t_left" style="font-size:12px;">标签</th>\
//       <td class="c09 g_w_20 g_c_hand" style="font-size:12px;"><div id="bc" onclick="if(oEditTag){return oEditTag._sortTagList(this);}">日志数<span class="n_ k8" id="bcimg">&nbsp;</span></div></td>\
//       <td class="c09 g_w_20 g_c_hand" style="font-size:12px;"><div id="pc" onclick="if(oEditTag){return oEditTag._sortTagList(this);}">相片数<span id="pcimg" class="n_ k8">&nbsp;</span></div></td>\
//       <td class="c09 g_w_20 g_c_hand" style="font-size:12px;"><div id="lc" onclick="if(oEditTag){return oEditTag._sortTagList(this);}">收藏数<span id="lcimg" class="n_ k8">&nbsp;</span></div></td>\
//       {/if}\
//     </tr>\
//    </table>\
//    </div>\
//    {for item in itemList}\
//    {if item.tagName!=""}\
//    <div id="$$_item_${item.id}" class="setDragOnlyClass">\
//    <table border="0" cellspacing="0" cellpadding="0">\
//    <tr>\
//      {if oEditTag.isEdit==true}\
//      <td id="$$_td${item.id}" class="g_t_left g_w_35" onclick="if(oEditTag){return oEditTag.searchTagFromEl($(\'$$_a${item.id}\'), null);}"><div style="word-wrap:break-word;word-break:break-all;overflow:hidden;"><a class="c07" href="#" id="$$_a${item.id}">${item.tagName|default:""|escape}</a></div></td>\
//      <td class="g_w_15 g_c_hand c08" id="$$_bn${item.id}" onclick="if(oEditTag){return oEditTag.searchTagFromEl($(\'$$_a${item.id}\'), null);}">\
//      {else}\
//      <td id="$$_td${item.id}" class="g_t_left g_w_40" onclick="if(oEditTag){return oEditTag.searchTagFromEl($(\'$$_a${item.id}\'), null);}"><div style="word-wrap:break-word;word-break:break-all;overflow:hidden;"><a class="c07" href="#" id="$$_a${item.id}">${item.tagName|default:""|escape}</a></div></td>\
//      <td class="g_w_20 g_c_hand c08" id="$$_bn${item.id}" onclick="if(oEditTag){return oEditTag.searchTagFromEl($(\'$$_a${item.id}\'), null);}">\
//      {/if}\
//		{if (oEditTag.iVisitorRank>100)}\
//			${item.blogCount|default:0}\
//		{elseif (oEditTag.iVisitorRank==100)}\
//			${item.friendBlogCount|default:0}\
//		{else}\
//			${item.guestBlogCount|default:0}\
//		{/if}\
//	  </td>\
//	  {if oEditTag.isEdit==true}\
//	  <td class="g_w_15 g_c_hand c08" id="$$_pn${item.id}" onclick="if(oEditTag){return oEditTag.searchTagFromEl($(\'$$_a${item.id}\'), null);}">\
//	  {else}\
//	  <td class="g_w_20 g_c_hand c08" id="$$_pn${item.id}" onclick="if(oEditTag){return oEditTag.searchTagFromEl($(\'$$_a${item.id}\'), null);}">\
//	  {/if}\
//		{if (oEditTag.iVisitorRank>100)}\
//			${item.photoCount|default:0}\
//		{elseif (oEditTag.iVisitorRank==100)}\
//			${item.friendPhotoCount|default:0}\
//		{else}\
//			${item.guestPhotoCount|default:0}\
//		{/if}\
//	  </td>\
//	{if oEditTag.isEdit==true}\
//	  <td class="g_w_15 g_c_hand c08" id="$$_ln${item.id}" onclick="if(oEditTag){return oEditTag.searchTagFromEl($(\'$$_a${item.id}\'), null);}">${item.listCount|default:0}</td>\
//      <td class="g_w_10"><span class="n_ e7b g_c_hand e" name="editTagButton" onclick="if(oEditTag){oEditTag.tagEditing=true; return ${objName}.editItem(\'${item.id}\',this);}">&nbsp;</span><span class="n_ e8b d">&nbsp;</span></td>\
//	  <td class="g_w_10"><span class="n_ n6 g_c_hand e" name="deleteTagButton" onclick="if(oEditTag){return ${objName}.deleteItem(\'${item.id}\',this);}">&nbsp;</span><span class="i_ i27 d">&nbsp;</span></td>\
//	{else}\
//	  <td class="g_w_20 g_c_hand c08" id="$$_ln${item.id}" onclick="if(oEditTag){return oEditTag.searchTagFromEl($(\'$$_a${item.id}\'), null);}">${item.listCount|default:0}</td>\
//	{/if}\
//	 </tr>\
//	<tr><td colspan="6">\
//	<div id="$$_item_frame_${item.id}">\
//	<div id="resultFrame${item.id}" class="bd01 g_c_mvdn g_p_center" style="display:none;width:609px;">\
//		<div id="search_photoresultFrame${item.id}">\
//      		<div class="g_h_25 g_t_left g_c_pdin selitm">\
//      			<div id="mark_photoresultFrame${item.id}" class="g_p_right g_w_40 g_t_right"></div>\
//      			<span class="g_t_bold c08">相片</span>\
//      		</div>\
//      		<div id="_$_search_photo_contentresultFrame${item.id}" class="g_t_center"></div>\
//      	</div>\
//      	<div class="g_c_mvdn" id="search_blogresultFrame${item.id}">\
//      		<div class="g_h_25 g_t_left g_c_pdin selitm">\
//      			<div id="mark_blogresultFrame${item.id}" class="g_p_right g_w_40 g_t_right"></div>\
//      			<span class="g_t_bold c08">日志</span>\
//      		</div>\
//      		<div id="_$_search_blog_contentresultFrame${item.id}" class="g_t_center"></div>\
//		</div>\
//      	<div class="g_c_mvdn" id="search_favresultFrame${item.id}">\
//      		<div class="g_h_25 g_t_left g_c_pdin selitm">\
//      			<div id="mark_rcresultFrame${item.id}" class="g_p_right g_w_40 g_t_right"></div>\
//      			<span class="g_t_bold c08">收藏</span>\
//      		</div>\
//      		<div id="_$_search_fav_contentresultFrame${item.id}" class="g_t_center"></div>\
//		</div>\
//	</div></div>\
//	</td></tr>\
//	</table></div>\
//	{/if}\
//	{forelse}\
//	    <div id="$$_item_to_add">\
//	    	 {if oEditTag.isEdit==true}\
//	    	     目前没有标签，请先为日志、相片、收藏添加新的标签。\
//	    	 {else}\
//			    目前没有标签。\
//			 {/if}\
//		</div>\
//	{/for}\
//	</div>\
//');
/**
* NetEase ListModule
* 基于ajax的列表编辑器，使用prototype 和trimpath 库,同时配合js/utils.js 使用
* 主入口：new NetEase.ListModule
* 参数：loadParam：加载列表内容的加载函数的加载参数
*      loadFunc:　加载列表内容的加载函数
*	   props: 列表中的对象中要进行编辑的属性
*      propsFilter: 列表中的对象要进行编辑的每个属性,在编辑状态的text的maxlength
* 	   positions： 编辑状态属性的排版方式 [-1,0,1,2] -1 为空 0 为编辑 1 为确定 2 为取消 注意:0的个数要和props属性的个数一样,1,2只能出现一次
*      propsClass:   每个元素大width;
*      presentTemplate: 列表中内容呈现的trimpath 模板
*      presentShowId:  列表中内容呈现的id
*      objName: 该容器的实例名称
*      saveAddFunc: add操作的ajax函数
*	   saveEditFunc: edit操作的ajax函数
*	   saveDelFunc:  del操作的ajax函数
* 可选参数：
* 	   id: 当列表中的对象中不是以id作为主键的,设置自定义主键
*      attach: 列表中的对象的附属属性
*      keepLast: 是否保留上一次的值
*      presentParam: 列表中内容呈现的附属参数
*      alertMsg: 警告信息
*      dwrAlert: 外部消息提示函数,和DwrLogger一起使用
*      disableFunc: 每一项操作disable函数
*      enableFunc: 每一项操作enable函数
*      beforeAjaxFunc: 进行ajax前的增强函数
*	   afterAjaxFunc: 进行ajax后的增强函数
*      afterCancelFunc: 进行取消操作后的增强函数
*      allowDrag: 是否可以拖动
* 对外接口：
* 	1.new NetEase.ListModule(): 创建实例
*   2.addItem() : 增加列表内容
*   3.editItem(id) : 编辑列表内容       id为主键
*   4.deleteItem(id) : 要删除的列表内容  id为主键
*   5.getItemCount() : 返回列表中内容的个数
*   6.getAjaxType()  : 返回刚进行完哪个Ajax操作  0:无 1:load 2:add 3:edit 4:delete
* 备注：
*   1.列表中描述头的id 一定为 $$_item_base
*   2.列表中待添加的id 一定为 $$_item_to_add
*   3.列表中的内容的id 一定为 $$_item_*  (* 为主键)
*/

if (NetEase==undefined){
	var NetEase={};
}
NetEase.ListModule = Class.create();
NetEase.ListModule.prototype ={
	initialize: function(){
		this.options = Object.extend(
			{
				readOnly: false,
				firstLoad: true,
				loadParam:{},
				loadFunc: Prototype.emptyFunction,
				id:'id',
				props:[],   //[prop1,prop2,prop3,prop4]
				propsFilter:[], //[50,100,100,100]
				positions:[],
				propsClass:[],
				attach:{},  //其它属性
				keepLast:false,
				presentParam:{},
				presentTemplate:false,
				presentShowId:null,
				alertMsg:'关键词不能为空!',
				disableFunc:Prototype.emptyFunction,
				enableFunc:Prototype.emptyFunction,
				beforeAjaxFunc:Prototype.emptyFunction,
				afterAjaxFunc:Prototype.emptyFunction,
				afterCancelFunc:Prototype.emptyFunction,
				saveAddFunc:Prototype.emptyFunction,
				saveEditFunc:Prototype.emptyFunction,
				saveDelFunc:Prototype.emptyFunction,
				dwrAlert:false,
				allowDrag:false,
				setDragOnlyClass:'setDragOnlyClass',
				handleClass:'handleClass',
				saveSortBar:'saveSortBar',
				saveSortFunc:Prototype.emptyFunction,
				objName:null			
			}, arguments[0]||{});
		this.ajaxType=0;
		this.stat = 'normal';				
		this.listData=[];
		this._load();
	},

	_load:function(){
		this._disableAll();
		if(this.options.firstLoad){
				this.options.beforeAjaxFunc();
				this.options.loadFunc(this.options.loadParam,this._afterLoad.bind(this));
		}
		else{
			this._present(this.listData);
		}
	},

	_afterLoad:function(dataList){
		this.listData=[];		
		if(dataList!=null){
			dataList.each(this._iterator.bind(this));
		}
		this._present(this.listData);
		if(!this.options.readOnly)
			this._enableAll();
		this.ajaxType = 1;
		this.options.afterAjaxFunc();
	},

	_iterator:function(element){
		var key = this.options.id;
		element.attach = this.options.attach;
		element.id = element[key];
		this.listData.push(element);
	},
	
	_present:function(dataList){
		var data={param:this.options.presentParam,itemList:dataList,objName:this.options.objName};
		if(this.options.presentTemplate){
			var result = this.options.presentTemplate.process(data);
			if(this.options.presentShowId){
				$(this.options.presentShowId).innerHTML=result;
				if(this.options.allowDrag){
					var updateCallback = this._sortUpdate.bind(this);				
					Sortable.create('$$_item_list',{dropOnEmpty:true,tag:'div', containment:['$$_item_list'],zindex:50,handle:this.options.handleClass, 
						only: this.options.setDragOnlyClass, constraint:false,clone:false, overlap: 'vertical', format:  null, allowVerticalScroll: true,
						onUpdate: updateCallback
					});
					this.orginSeqString=decodeURIComponent(Sortable.serialize('$$_item_list')).replace(/\$\$_item_/ig, '');	
				}							
			}
		}
	},
	
	_sortUpdate: function(){
		var seqString=decodeURIComponent(Sortable.serialize('$$_item_list')).replace(/\$\$_item_/ig, '');
		this._sortListData(seqString);
		$(this.options.saveSortBar).style.display=(seqString!=this.orginSeqString)?'block':'none';		
		if(seqString!=this.orginSeqString){
			this._disableAll();
		}else{
			this._enableAll();			
		}		
	},
	
	_sortListData: function(seqString){
		if(seqString == null)
			return;
		var seqs = seqString.split(',');
		if(seqs.length==0)
			return;
		var tempData = [];
		for(var i=0;i<seqs.length;i++){			
			var element = this.listData.detect(this._detectItr.bind(this,seqs[i]));
			tempData.push(element);
		}
		this.listData = tempData;
	},
	
	cancelSort: function(){
		if(this.options.allowDrag){
			this._sortListData(this.orginSeqString);
			this._present(this.listData);
			$(this.options.saveSortBar).style.display='none';
			this._enableAll();
		}		
	},
	
	saveSort: function(){
		if(this.options.allowDrag){
			var seqString=decodeURIComponent(Sortable.serialize('$$_item_list')).replace(/\$\$_item_/ig, '');			
			this.options.saveSortFunc(seqString,this.options.attach,this._afterSaveSort.bind(this,seqString));
		}		
	},
	
	_afterSaveSort: function(seqString,stat){
		if(stat){
			this.orginSeqString = seqString;
			if(this.options.dwrAlert)
				this.options.dwrAlert("保存顺序成功!","ok");
			$(this.options.saveSortBar).style.display='none';
			this._enableAll();
		}else{
			if(this.options.dwrAlert)
				this.options.dwrAlert("保存顺序失败!","error");			
		}
	},
	
	_disableAll:function(){
		this.options.disableFunc();
	},

	_enableAll:function(){
		this.options.enableFunc();
	},
	
	_vaildPropFunc:function(targetId,objDstId){
		if($(targetId).value.length > 0){
			$(objDstId).disabled=false;
		}else{
			$(objDstId).disabled=true;
		}		
	},

	addItem:function(){
		this._disableAll();
		var _parentDiv = $('$$_item_base').parentNode;
		var _toAddDiv=$('$$_item_to_add');
		if(_toAddDiv)
//			_parentDiv.removeChild(_toAddDiv);
			Element.removeChild(_toAddDiv);
		var	cls="list_box_content1";
		var _newDiv = document.createElement("div");
		_newDiv.id="$$_item_in_add";
		_newDiv.className = cls;		
		var _table = document.createElement("table");
		var _tbody = document.createElement("tbody");
		var _tr = document.createElement("tr");
		var _td;		
		var posCode = -1;
		var propCode = -1;
		var key,filter,size;
		for(var i=0;i<this.options.positions.length;i++){
			_td = document.createElement("td");
			_td.className = this.options.propsClass[i];
			posCode = this.options.positions[i];
			if(posCode == -1){
			    _td.innerHTML='&nbsp;';
			}else if(posCode == 0){
				propCode ++;
				key = this.options.props[propCode];
				filter = this.options.propsFilter[propCode];
				_td.innerHTML='<input type="text" class="bd01 g_w_90 g_c_input g_htc_focus" id="$$_prop_'
						+key+'" maxlength="'+filter
						+'" onkeyup="'+
						this.options.objName+'._vaildPropFunc(\'$$_prop_'+this.options.props[0]+'\',\'$$_prop_submit\');" />';
			}else if(posCode == 1){
				_td.innerHTML='<input type="button" class="g_c_button bd01 butn c05" style="width:50px;" id="$$_prop_submit" value="确 定" onclick="'+this.options.objName+'._updateAddItem();" />';
			}else if(posCode == 2){
				_td.innerHTML='<input type="button" class="g_c_button bd01 butn c05" style="width:50px;" id="$$_prop_cancel" value="取 消" onclick="'+this.options.objName+'._cancelEditFunc();" />';
			}
		    _tr.appendChild(_td);
		}
		_tbody.appendChild(_tr);
		_table.appendChild(_tbody);
		_newDiv.appendChild(_table);
		_parentDiv.insertBefore(_newDiv, $('$$_item_base').nextSibling);
		if(this.options.props[0])
			$('$$_prop_'+this.options.props[0]).focus();	
		$('$$_prop_submit').disabled=true;
		this.stat = 'add';
	},
	
	_updateAddItem:function(){
		if(Trim($F('$$_prop_'+this.options.props[0]))==""){
			if(this.options.dwrAlert)
				this.options.dwrAlert(this.options.alertMsg,"info");
			else
				alert(this.options.alertMsg);
			return;
		}
		element={};
		element.attach = this.options.attach;
		for(var i=0;i<this.options.props.length;i++){
			var key = this.options.props[i];
			var value = Trim($F('$$_prop_'+this.options.props[i]));
			element[key]=value;
		}
		this.options.beforeAjaxFunc();		
		this.options.saveAddFunc(element,this._afterSaveAddFunc.bind(this,element));
		
	},
	
	_afterSaveAddFunc:function(element,id){
		var saveState = 0;
		if(id > '0'){
			element.id = id;
			this.listData.unshift(element);
			this._present(this.listData);
			this._enableAll();
			saveState = 1;
			this.stat = 'normal';
			if(this.options.dwrAlert)
				this.options.dwrAlert("增加成功!","ok");
		}else{
			if(this.options.dwrAlert)
				this.options.dwrAlert("增加失败!","info");
			else
				alert("增加失败!");
		}
		this.ajaxType = 2;
		this.options.afterAjaxFunc(element,saveState);								
	},
	
	editItem:function(id,obj){
		if(obj&&obj.disabled)
			return false;;
		var _div = $('$$_item_'+id);
		if(!_div)
			return false;			
		this._disableAll();
		_div.innerHTML = "";
		var element = this.listData.detect(this._detectItr.bind(this,id));
		var _td;
		var posCode = -1;
		var propCode = -1;
		var key,value,filter,size;
		
		var _table = document.createElement("table");
		var _tbody = document.createElement("tbody");
		var _tr = document.createElement("tr");
		for(var i=0;i<this.options.positions.length;i++){
			_td = document.createElement("td");
			_td.className = this.options.propsClass[i];
			posCode = this.options.positions[i];
			if(posCode == -1){
			    _td.innerHTML='&nbsp;';
			}else
			if(posCode == 0){
				propCode ++;
				key = this.options.props[propCode];
				value = element[key];
				if(value==null)
					value='';
				value = value.escape();
				filter = this.options.propsFilter[propCode];
				_td.innerHTML='<input type="text" class="bd01 g_w_90 g_c_input g_htc_focus" id="$$_prop_'
						+key+'" maxlength="'+filter
						+'" value="'+value+'" onkeyup="'+
						this.options.objName+'._vaildPropFunc(\'$$_prop_'+this.options.props[0]+'\',\'$$_prop_submit\');" />';
			}else
			if(posCode == 1){
				_td.innerHTML='<input type="button" class="g_c_button bd01 butn c05" style="width:50px;" id="$$_prop_submit" value="确 定" onclick="'+this.options.objName+'._updateEditFunc(\''+id+'\');" />';
			}else
			if(posCode == 2){
				_td.innerHTML='<input type="button" class="g_c_button bd01 butn c05" style="width:50px;" id="$$_prop_cancel" value="取 消" onclick="'+this.options.objName+'._cancelEditFunc();" />';
			}
		    _tr.appendChild(_td);
		}
		_tbody.appendChild(_tr);
		_table.appendChild(_tbody);
		_div.appendChild(_table);
		if(this.options.props[0]){	
			$('$$_prop_'+this.options.props[0]).focus();
			$('$$_prop_'+this.options.props[0]).select();
		}
		$('$$_prop_submit').disabled=true;
		this.stat = 'edit';
		return false;			
	},
	
	_detectItr:function(id,element){
		if(element.id == id)
			return true;
		return false;
	},
	
	_updateEditFunc:function(id){
		if(Trim($F('$$_prop_'+this.options.props[0]))==""){
			if(this.options.dwrAlert)
				this.options.dwrAlert(this.options.alertMsg,"info");
			else
				alert(this.options.alertMsg);
			return;
		}
		var element ={};
		var oldElement;
		element.id=id;
		element.attach=this.options.attach;
		for(var i=0;i<this.options.props.length;i++){
			var key = this.options.props[i];
			var value = Trim($F('$$_prop_'+this.options.props[i]));
			element[key]=value;
			if(this.options.keepLast){
				if(!element.oldElement || !oldElement){
					element.oldElement={};
					oldElement = this.listData.detect(this._detectItr.bind(this,id));
				}
				element.oldElement[key] = oldElement[key];
			}
		}
		this.options.beforeAjaxFunc();		
		this.options.saveEditFunc(element,this._afterSaveEditFunc.bind(this,element));		
	},
	
	_afterSaveEditFunc:function(element,stat){
		var saveState = 0;
		if(stat){
			this.listData.each(this._updateIter.bind(this,element));
			this._present(this.listData);
			this._enableAll();
			saveState = 1;
			this.stat = 'normal';
			if(this.options.dwrAlert)
				this.options.dwrAlert("更新成功!","ok");
		}else{
			if(this.options.dwrAlert)
				this.options.dwrAlert("更新失败!","error");
			else
				alert("更新失败!");
		}
		this.ajaxType = 3;
		this.options.afterAjaxFunc(element,saveState);				
	},
	
	_updateIter:function(element,e,index){
		if(element.id==e.id){		
			Object.extend(this.listData[index],element);
		}
	},
	
	_cancelEditFunc:function(){
		this._present(this.listData);
		this._enableAll();
		this.stat = 'normal';
		this.options.afterCancelFunc();				
	},

	deleteItem:function(id,obj){
		if(obj&&obj.disabled)
			return false;
		var promt=window.confirm("是否确定删除？");
		if(promt==true){			
			this._disableAll();
			var element = this.listData.detect(this._detectItr.bind(this,id));
			this.options.beforeAjaxFunc();		
			this.options.saveDelFunc(element,this._afterSaveDelFunc.bind(this,id));
		}
		return false;
	},
	
	_afterSaveDelFunc:function(id,stat){
		var saveState = 0;
		if(stat){
			this.listData = this.listData.reject(this._rejectIter.bind(this,id));
			this._present(this.listData);
			saveState = 1;			
			if(this.options.dwrAlert)
				this.options.dwrAlert("删除成功!","ok");
		}else{
			if(this.options.dwrAlert)
				this.options.dwrAlert("删除失败!","error");
			else
				alert("删除失败!");
		}
		this._enableAll();
		this.ajaxType = 4;
		this.options.afterAjaxFunc(id,saveState);				
	},
	
	sortBy:function(type){
		this._disableAll();
		if(!this.innerSort)
			this.innerSort={};
		if(this.innerSort[type] && this.innerSort[type]=="+"){
			this.listData = this.listData.sort(this._sortByIter.bind(this,type));
			this.listData = this._reverse(this.listData);
			this.innerSort[type]="-";
		}else{
			this.listData = this.listData.sort(this._sortByIter.bind(this,type));			
			this.innerSort[type]="+";
		}	
		this._present(this.listData);
		this._enableAll();		
	},
	
	_sortByIter:function(type,s1,s2){
		if(s1[type] instanceof String || s2[type] instanceof String)
			return (s1[type]+'').localeCompare((s2[type]+''));
		return s1[type] < s2[type] ? -1 : s1[type]> s2[type] ? 1 : 0;
	},
	
	_reverse:function(listData){
		var tempData=[];
		for(var i=0;i<listData.length;i++)
			tempData.unshift(listData[i]);
		return tempData;	
	},
			
	_rejectIter:function(id,element){
		if(id == element.id)
			return true;
		return false;
	},

	getAjaxType:function(){
		return this.ajaxType;
	}
} 
/*
* TextSuggest
*     类似google suggest的类
* 主入口：
*     new TextSuggest
* 参数：
*     sId：需要注入suggest功能的input id
* 可选参数：
*	  matchTextWidth: 是否和输入框的宽度一致
*	  selectedColor:  选中项的高亮颜色
*     matchAnywhere:  是否任何处匹配还是开始处匹配
*     ignoreCase:     是否忽略大小写
*     maxResultCount: 匹配项的最大个数
*     noMatchDataMsg: 没有匹配时显示的消息
*/
TextSuggest = Class.create();

TextSuggest.prototype = {
   initialize: function(sId){
      this.id          = sId;
      this.textInput   = $(this.id);
      this.suggestions = [];	// 记录从后台得到的匹配数据，缓存
      
      this.options = Object.extend({
         matchTextWidth     : true,
         selectedColor      : '#b1c09c',
         matchAnywhere      : false,
         ignoreCase         : false,
         maxResultCount     : 10,
         noMatchDataMsg		: '很遗憾，目前还没有匹配的数据'
      }, arguments[1] || {});
      
      this.injectSuggestBehavior();
   },

   injectSuggestBehavior: function(){
      if(isIE){
         this.textInput.autocomplete = "off";	// 消除ie默认的补全
	  }
      var keyEventHandler = new TextSuggestKeyHandler(this);	// 处理按键消息
      this.createSuggestionsDiv();	// 建立显示suggest的div
   },

   createSuggestionsDiv: function(){
      this.suggestionsDiv = document.createElement("div");

      var divStyle = this.suggestionsDiv.style;
      divStyle.position = 'absolute';
      divStyle.zIndex   = 101;
      divStyle.display  = "none";
	  divStyle.backgroundColor = "white";
	  divStyle.border = "1px solid #000000";
	  divStyle.overflow = "visible";
//	  divStyle.paddingLeft = "2px";
	  
      this.textInput.parentNode.appendChild(this.suggestionsDiv);
   },
   
   handleTextInput: function(){
     var previousRequest    = this.lastRequestString;	// 记录上次查询字串
     this.lastRequestString = this.textInput.value;
     if(this.lastRequestString == ""){
        this.hideSuggestions();
        this.lastRequestString = undefined;
     }
     else if(this.lastRequestString.indexOf(previousRequest) != 0){	
     	this.sendRequestForSuggestions();
     }
     else{	// 若是在原来查询字串的基础上添加，直接使用缓存，减少读取后台数据库
        this.buildList(false);
     }
   },

   // 处理上下方向键
   moveSelectionUp: function(){
      if(this.selectedIndex > 0){
         this.updateSelection(this.selectedIndex - 1);
      }
   },

   moveSelectionDown: function(){
      if(this.selectedIndex < (this.suggestions.length - 1)){
         this.updateSelection(this.selectedIndex + 1);
      }
   },

   updateSelection: function(n){
      var span = $(this.id + "_" + this.selectedIndex);
      if(span){
         span.style.backgroundColor = "";
      }
      this.selectedIndex = n;
      var span = $(this.id + "_" + this.selectedIndex);
      if (span){
         span.style.backgroundColor = this.options.selectedColor;
      }
   },
   
   sendRequestForSuggestions: function(){
     if(this.handlingRequest) {
        this.pendingRequest = true;
        return;
     }

     this.handlingRequest = true;
     
     TagBean.searchSuggest(this.lastRequestString, this.options.maxResultCount, this.options.matchAnywhere, this._loadSuggests.bind(this));
   },
   
   // 回调函数，服务器返回数据，进行处理	
   _loadSuggests: function(dataFromServer){
   	  this.createSuggestions(dataFromServer);
	  this.buildList(true);

      this.handlingRequest = false;

      if(this.pendingRequest){
         this.pendingRequest    = false;
         this.lastRequestString = this.textInput.value;
         this.sendRequestForSuggestions();
      }
   },
   
   // 根据返回数据，组装结果	
   createSuggestions: function(dataFromServer){
      this.suggestions = [];
      dataFromServer.each(function(e){
      	this.suggestions.push({text: e});
      }.bind(this));
   },
   
   buildList: function(bFromBackend){
       if(this.updateSuggestionsDiv(bFromBackend)){	// 若有匹配结果，高亮第一个结果
	       this.updateSelection(0);
	       this.showSuggestions();
       }
       else	// 没有匹配的，直接隐藏
       	   this.hideSuggestions();
//       this.showSuggestions();
   },
   
   updateSuggestionsDiv: function(bFromBackend){
      this.suggestionsDiv.innerHTML = "";
      var suggestLines = this.createSuggestionContent(bFromBackend);
      if(suggestLines.length == 0){
      	this.suggestionsDiv.innerHTML = "<span style='font-weight:bold;color:#0000FF;'>" + this.options.noMatchDataMsg + "</span>";
      	this.selectedIndex = -1;
      	return false;
      }
      
	  suggestLines.each(function(e){
	  	this.suggestionsDiv.appendChild(e);
	  }.bind(this));
         
      return true;
   },
   
   createSuggestionContent: function(bFromBackend){
	  var suggests = [];
	  var len = this.suggestions.length;
	  if(len == 0){	// 没有匹配数据
	  	return suggests;
	  }
	  
      var regExpFlags = "";
      if(this.options.ignoreCase)
         regExpFlags = 'i';
      var startRegExp = "^";
      if(this.options.matchAnywhere)
         startRegExp = '';

      var regExp  = new RegExp(startRegExp + this.lastRequestString, regExpFlags);
      
      if(!bFromBackend){
      	var aTmp = [];
      	this.suggestions.each(function(e){
      		var sTmp = e.text;
      		if(sTmp.match(regExp)){
      			aTmp.push({text: sTmp});
      		}
      	});
      	
      	this.suggestions = aTmp;
      	len = aTmp.length;
      }

	  for(var i=0; i<len; i++){
	      suggests.push(this.createSuggestionItem(i, regExp));
      }
      
      return suggests;
   },

   createSuggestionItem: function(n, regExp) {
      var suggestion = this.suggestions[n];

      var suggestItem = document.createElement("span");

      var itemStyle = suggestItem.style;
      itemStyle.width   = '100%';
      itemStyle.display = 'block';
      itemStyle.cursor = 'pointer';
      itemStyle.paddingBottom = '2px';
      suggestItem.id            = this.id + "_" + n;
      suggestItem.onmouseover   = this.mouseoverHandler.bindAsEventListener(this);
      suggestItem.onclick       = this.itemClickHandler.bindAsEventListener(this);

      var textValues = this.splitTextValues(suggestion.text, this.lastRequestString.length, regExp );

      var textMatchSpan = document.createElement("span");
      textMatchSpan.id            = this.id + "_match_" + n;
      var matchStyle = textMatchSpan.style;
      matchStyle.textDecoration = 'underline';
      matchStyle.fontWeight = 'bold';
      textMatchSpan.onmouseover   = this.mouseoverHandler.bindAsEventListener(this);
      textMatchSpan.onclick       = this.itemClickHandler.bindAsEventListener(this);

      textMatchSpan.appendChild(document.createTextNode(textValues.mid));

      suggestItem.appendChild(document.createTextNode(textValues.start));
      suggestItem.appendChild(textMatchSpan);
      suggestItem.appendChild(document.createTextNode(textValues.end));

      return suggestItem;
   },
   
   showSuggestions: function(){
      var divStyle = this.suggestionsDiv.style;
      if (divStyle.display == '')
         return;
      this.positionSuggestionsDiv();
      divStyle.display = '';
   },

   setInputFromSelection: function(){
     var suggestion  = this.suggestions[this.selectedIndex];
     this.textInput.value = suggestion.text;
     this.hideSuggestions();
   },
   
   hideSuggestions: function(){
      this.suggestionsDiv.style.display = 'none';
   },

   mouseoverHandler: function(e){
      var src = e.srcElement ? e.srcElement : e.target;
      var index = parseInt(src.id.substring(src.id.lastIndexOf('_')+1));
      this.updateSelection(index);
   },

   itemClickHandler: function(e){
      this.mouseoverHandler(e);
      this.hideSuggestions();
      this.textInput.focus();
      this.setInputFromSelection();
   },

   splitTextValues: function(text, len, regExp){
      var startPos  = text.search(regExp);
      var matchText = text.substring(startPos, startPos + len);
      var startText = startPos == 0 ? "" : text.substring(0, startPos);
      var endText   = text.substring(startPos + len);
      return {start: startText, mid: matchText, end: endText};
   },
   
   positionSuggestionsDiv: function(){
      var textPos = RicoUtil.toDocumentPosition(this.textInput);
      var divStyle = this.suggestionsDiv.style;
      divStyle.top  = (textPos.y + this.textInput.offsetHeight) + "px";
      divStyle.left = textPos.x + "px";

      if (this.options.matchTextWidth)
         divStyle.width = (this.textInput.offsetWidth - this.padding()) + "px";
   },
   
   padding: function(){
     try{
      var styleFunc = RicoUtil.getElementsComputedStyle;
      var lPad    = styleFunc(this.suggestionsDiv, "paddingLeft",      "padding-left");
      var rPad    = styleFunc(this.suggestionsDiv, "paddingRight",     "padding-right");
      var lBorder = styleFunc(this.suggestionsDiv, "borderLeftWidth",  "border-left-width");
      var rBorder = styleFunc(this.suggestionsDiv, "borderRightWidth", "border-right-width");

      lPad    = isNaN(lPad)    ? 0 : lPad;
      rPad    = isNaN(rPad)    ? 0 : rPad;
      lBorder = isNaN(lBorder) ? 0 : lBorder;
      rBorder = isNaN(rBorder) ? 0 : rBorder;

      return parseInt(lPad) + parseInt(rPad) + parseInt(lBorder) + parseInt(rBorder);
     }catch (e){
      return 0;
     }
   }
};

TextSuggestKeyHandler = Class.create();

TextSuggestKeyHandler.prototype = {
   initialize: function(textSuggest){
      this.textSuggest = textSuggest;
      this.input       = this.textSuggest.textInput;
      this.addKeyHandling();
   },

   addKeyHandling: function(){
      this.input.onkeyup    = this.keyupHandler.bindAsEventListener(this);
      this.input.onkeydown  = this.keydownHandler.bindAsEventListener(this);
      this.input.onblur     = this.onblurHandler.bindAsEventListener(this);
      if(isOpera)
         this.input.onkeypress = this.keyupHandler.bindAsEventListener(this);
   },

   keydownHandler: function(e){
      var upArrow   = 38;
      var downArrow = 40;

	  var key = e.keyCode;
      if(key == upArrow) {
         this.textSuggest.moveSelectionUp();
      }
      else if(key == downArrow){
         this.textSuggest.moveSelectionDown();
      }
   },

   keyupHandler: function(e){
      if(this.input.length == 0 && !isOpera)
         this.textSuggest.hideSuggestions();

     if(!this.handledSpecialKeys(e))
        this.textSuggest.handleTextInput();
   },

   handledSpecialKeys: function(e){
      var enterKey  = 13;
      var upArrow   = 38;
      var downArrow = 40;

      if(e.keyCode == upArrow || e.keyCode == downArrow){
         return true;
      }
      else if(e.keyCode == enterKey){
         this.textSuggest.setInputFromSelection();
         return true;
      }

      return false;
   },

   onblurHandler: function(e) {	// 焦点移开时，如果有高亮匹配选项，那么将此项写到input里去，然后隐藏div
      if(this.textSuggest.suggestionsDiv.style.display == '' && this.textSuggest.selectedIndex != -1)	// -1代表没有匹配数据
         this.textSuggest.setInputFromSelection();
      this.textSuggest.hideSuggestions();
   }
};

var RicoUtil = {
   getElementsComputedStyle: function(htmlElement, cssProperty, mozillaEquivalentCSS){
      if (arguments.length == 2)
         mozillaEquivalentCSS = cssProperty;

      var el = $(htmlElement);
      if(el.currentStyle)
         return el.currentStyle[cssProperty];
      else
         return document.defaultView.getComputedStyle(el, null).getPropertyValue(mozillaEquivalentCSS);
   },

   toDocumentPosition: function(element){
      return this._toAbsolute(element,false);
   },

   /**
    *  Compute the elements position in terms of the window viewport
    *  so that it can be compared to the position of the mouse (dnd)
    *  This is additions of all the offsetTop,offsetLeft values up the
    *  offsetParent hierarchy, ...taking into account any scrollTop,
    *  scrollLeft values along the way...
    *
    * IE has a bug reporting a correct offsetLeft of elements within a
    * a relatively positioned parent!!!
    **/
   _toAbsolute: function(element,accountForDocScroll){

      if(navigator.userAgent.toLowerCase().indexOf("msie") == -1)
         return this._toAbsoluteMozilla(element,accountForDocScroll);

      var x = 0;
      var y = 0;
      var parent = element;
      while(parent){
         var borderXOffset = 0;
         var borderYOffset = 0;
         if (parent != element){
            var borderXOffset = parseInt(this.getElementsComputedStyle(parent, "borderLeftWidth"));
            var borderYOffset = parseInt(this.getElementsComputedStyle(parent, "borderTopWidth"));
            borderXOffset = isNaN(borderXOffset) ? 0 : borderXOffset;
            borderYOffset = isNaN(borderYOffset) ? 0 : borderYOffset;
         }

         x += parent.offsetLeft - parent.scrollLeft + borderXOffset;
         y += parent.offsetTop - parent.scrollTop + borderYOffset;
         parent = parent.offsetParent;
      }

      if(accountForDocScroll){
         x -= this.docScrollLeft();
         y -= this.docScrollTop();
      }

      return { x:x, y:y };
   },

   /**
    *  Mozilla did not report all of the parents up the hierarchy via the
    *  offsetParent property that IE did.  So for the calculation of the
    *  offsets we use the offsetParent property, but for the calculation of
    *  the scrollTop/scrollLeft adjustments we navigate up via the parentNode
    *  property instead so as to get the scroll offsets...
    *
    **/
   _toAbsoluteMozilla: function(element,accountForDocScroll){
      var x = 0;
      var y = 0;
      var parent = element;
      while(parent){
         x += parent.offsetLeft;
         y += parent.offsetTop;
         parent = parent.offsetParent;
      }

      parent = element;
      while(parent &&
              parent != document.body &&
              parent != document.documentElement){
         if (parent.scrollLeft)
            x -= parent.scrollLeft;
         if (parent.scrollTop)
            y -= parent.scrollTop;
         parent = parent.parentNode;
      }

      if(accountForDocScroll){
         x -= this.docScrollLeft();
         y -= this.docScrollTop();
      }

      return { x:x, y:y };
   },

   docScrollLeft: function(){
      if(window.pageXOffset)
         return window.pageXOffset;
      else if(document.documentElement && document.documentElement.scrollLeft)
         return document.documentElement.scrollLeft;
      else if(document.body)
         return document.body.scrollLeft;
      else
         return 0;
   },

   docScrollTop: function(){
      if (window.pageYOffset)
         return window.pageYOffset;
      else if (document.documentElement && document.documentElement.scrollTop)
         return document.documentElement.scrollTop;
      else if (document.body)
         return document.body.scrollTop;
      else
         return 0;
   }
};
/**
 * 标签模块初始化函数
 * @param	{Boolean}	isEdit
 * 			编辑还是预览状态
 * @param	{Number}	iHostId
 * 			空间id
 * @param	{String}	sStyle
 * 			CSS style
 * @param	{String}	sIsGlobal
 * 			显示个人标签还是公众标签
 * @param	{String}	sType
 * 			默认显示相片，为"1"
 * @param	{String}	sTagId
 * 			tag id
 * @param	{Number}	iVisitorRank
 * 			访问者的权限？
 * @param	{String}	sServerName
 * 			server name
 * @return	{Void}
 */
var oEditTag;
// 此属性没放入EditTag内，因牵涉到修改的地方太多
var style;

// TODO 此参数是从其他文件读取的，待查，用于相册专业版，暂时不做改动，于新风格改版时
var g_urlPrefix="";

function initTagResourceFunc(isEdit, iHostId, sStyle, sIsGlobal, iVisitorRank, sServerName, mManageTag){
	this.style = sStyle;
	oEditTag = new EditTag(isEdit, iHostId, sIsGlobal, iVisitorRank, sServerName, mManageTag);
	oEditTag.manageAllTag();
}

EditTag = Class.create();
EditTag.prototype.initialize = fnInitEditTag;
EditTag.prototype.searchFromButt = fnSearchFromButt;
EditTag.prototype.manageAllTag = fnManageAllTag;
EditTag.prototype.searchTagFromEl = fnSearchTagFromEl;
EditTag.prototype.tagSearchGlobal = fnTagSearchGlobal;
EditTag.prototype.addTagFunc = fnAddTagFunc;

EditTag.prototype._tagRemoveSame = _fnTagRemoveSame;
EditTag.prototype._getTagObjMisc = _fnGetTagObjMisc;
EditTag.prototype._searchNow = _fnSearchNow;
EditTag.prototype._hideTagOther = _fnHideTagOther;
EditTag.prototype._searchTagAll = _fnSearchTagAll;
EditTag.prototype._genBlogCon = _fnGenBlogCon;
EditTag.prototype._genPhotoCon = _fnGenPhotoCon;
EditTag.prototype._genRcCon = _fnGenRcCon;
EditTag.prototype._showResByType = _fnShowResByType;
EditTag.prototype._loadAll = _fnLoadAll;
EditTag.prototype._loadAllCb = _fnLoadAllCb;
EditTag.prototype._loadBlogFirstCb = _fnLoadBlogFirstCb;
EditTag.prototype._loadPhotoFirstCb = _fnLoadPhotoFirstCb;
EditTag.prototype._loadRcFirstCb = _fnLoadRcFirstCb;
EditTag.prototype._phFilterFunc = _fnPhFilterFunc;
EditTag.prototype._bgFilterFunc = _fnBgFilterFunc;
EditTag.prototype._rcFilterFunc = _fnRcFilterFunc;
EditTag.prototype._showBlog = _fnShowBlog;
EditTag.prototype._showPhoto = _fnShowPhoto;
EditTag.prototype._showRc = _fnShowRc;
EditTag.prototype._showFail = _fnShowFail;
EditTag.prototype._getBNum = _fnGetBNum;
EditTag.prototype._getPNum = _fnGetPNum;
EditTag.prototype._getLNum = _fnGetLNum;
EditTag.prototype._setBNum = _fnSetBNum;
EditTag.prototype._setPNum = _fnSetPNum;
EditTag.prototype._setLNum = _fnSetLNum;
EditTag.prototype._sortTagList = _fnSortTagList;
EditTag.prototype._tagEnableObjFunc = _fnTagEnableObjFunc;
EditTag.prototype._tagDisableObjFunc = _fnTagDisableObjFunc;
EditTag.prototype._tagAfterCancelFunc = _fnTagAfterCancelFunc;
EditTag.prototype._rmTagFromList = _fnRmTagFromList;
EditTag.prototype._updateTagObjName = _fnUpdateTagObjName;
EditTag.prototype._getTagTotalNum = _fnGetTagTotalNum;
EditTag.prototype._setNeedRefresh = _fnSetNeedRefresh;
EditTag.prototype._putTag2List = _fnPutTag2List;
EditTag.prototype._tagAfterAjaxFunc = _fnTagAfterAjaxFunc;
EditTag.prototype._loadTagAllFunc = _fnLoadTagAllFunc;
EditTag.prototype._tagSaveAddTagFunc = _fnTagSaveAddTagFunc;
EditTag.prototype._tagSaveEditTagFunc = _fnTagSaveEditTagFunc;
EditTag.prototype._tagSaveDelTagFunc = _fnTagSaveDelTagFunc;
EditTag.prototype._loadResourceByType = _fnLoadResourceByType;

function fnInitEditTag(isEdit, iHostId, sIsGlobal, iVisitorRank, sServerName, mManageTag){
	// 管理标签页面下，预览时显示五列，编辑时显示七列
	this._iTagCols = 7;
	
	// 标签按日志、相片、收藏排序
	this._bBlogSort = true;
	this._bPhotoSort = true;
	this._bListSort = true;

	//所有tag的所有资源总数
	this._iTotalRcNum = 0 ;
	
	this._iBlogPageSize = 5;
	this._iBlogPrefetchMulti = 5;
	this._iPhotoPageSize = 21;//24;
	this._iPhotoPrefetchMulti = 5;
	this._iRcPageSize = 10;
	this._iRcPrefetchMulti = 5;
	
	this.mManageTag = mManageTag;

	this._oPhCachePage = null;
	this._oBgCachePage = null;
	this._oRcCachePage = null;
	
	this.isGlobal = false;
	
	//当前标签首次搜索时判断是否已结束
	this._bPhotoFirstSearchEnd = false;
	this._bBlogFirstSearchEnd = false;
	this._bRcFirstSearchEnd = false;
	
	//本标签已进行第一次搜索的标识，用来控制打开栏时是否进行新搜索
	this._bBlogFirstDone = false;
	this._bPhotoFirstDone = false;
	this._bRcFirstDone = false;
	
	//各栏打开关闭状态。true已打开,点击时须关闭
	this._bPhotoBarOpened = true;
	this._bBlogBarOpened = true;
	
	//所有标签页面
	this.tagAllList = null;
	// 当前所在页面是否是热门标签页面
	this._bCurIsHot = false;
	
	this._bTagEditing = false;
	//编辑、预览页面前缀
	this.urlPre = "edit";
	
	//全局tag搜索缓存链表
	this._aGlobalTagList = [];
	this._oGtCachePage = null;
	this._iGtPageSize = 50;
	//全局搜索时从input框输入搜索，此时不能从公众标签缓存中获得此标签对象，此参数表示是否需要查询TagStatistic得到此标签对象
	this._bNeedGetTagObj = false;
	// 防止多次点击
	this._bTagSearching = false;
	
	this._iHostId = iHostId;
	if(sIsGlobal == "true")
		this.isGlobal = true;
	//当前默认搜索Photo.1为Photo，type=3为Blog, 4为list, 0全部 
	this._iCurType = 0;
	//当前搜索的标签对象
	this._oCurTagObj = null;
	this.isEdit = isEdit;
	this.iVisitorRank = iVisitorRank;
	this.sServerName = sServerName;
	
	//tag去重
	this._tagRemoveSame();
}

/**
 * 搜索按钮的响应函数
 * @return	{Boolean}
 * 			false
 */
function fnSearchFromButt(){
	if(this._bTagSearching)	// 如果有点击tag搜索，不响应此按钮，直接返回
		return false;
		
//	this.manageHotTag();	// 如果此时在管理标签页面，需要切换回热门标签页面
	
	if($('tagShowPubBody') != null && $('tagShowPubBody').style.display != "none"){	// 根据显示情况，判断是在个人标签还是公众标签中搜索
		this.isGlobal = true;
	}
	
	var sTagFromInput = $("searchInput").value;
	if(sTagFromInput != ""){
		this._oCurTagObj = this._getTagObjMisc(sTagFromInput, -1);
		if(!this.isGlobal && this._oCurTagObj == null){	// 在个人标签页搜索，无对应标签
			this._showFail("本博客内不存在此标签！");
			return false;
		}
		else{	// 1. 在公众标签搜索，无对应标签，也让搜　2. 在个人标签页搜索，有对应标签
			this._searchNow(sTagFromInput, -1, "resultFrame$$hot", 1);
		}
		
		$("searchInput").value = "";
	}
	else{
		this._showFail("请输入标签名称！");
	}
	return false;
}

/**
 * 点击tag名称进行搜索
 * 分为两种
 * 1. 在热门标签页面里点tag名搜索，此时_bCurIsHot=true;搜索结果默认显示相片，即type=1
 * 2. 在管理标签页面里点tag名搜索，此时_bCurIsHot=false, sResFrameId=null;搜索结果里包含日志、相片、收藏，即type=0
 * @param	{Object}	el
 * 			DOM element
 * @param	{String}	sResFrameId
 * 			element id
 * @return	{Boolean}
 * 			false
 * @see		#_getTagObjMisc
 * @see		#_searchNow
 */
function fnSearchTagFromEl(el, sResFrameId){
	if(this._bTagEditing || this._bTagSearching)
		return false;
	var sTag;
	if(el == null)
		return false;
	if(isIE)
		sTag = el.innerText;
	else
		sTag = el.text;
	
	this._oCurTagObj = this._getTagObjMisc(sTag, -1);
	if(this._oCurTagObj)
		this._searchNow(sTag, this._oCurTagObj.id, sResFrameId, this._iCurType);
		
	return false;
}

/**
 * 搜索主体函数
 * @param	{String}	sTag
 * @param	{String}	sTagId
 * @param	{String}	sResFrameId
 * 			null -- 在管理标签页面里点tag搜索,用tag来找frame
 * 			非null -- 在热门标签页面里点tag搜索
 * @param	{Number}	iType
 * 			1为Photo，3为Blog, 4为收藏, 0全部
 * @return	{Boolean}
 * 			false
 * @see		#_hideTagOther
 * @see		#_searchTagAll
 */
function _fnSearchNow(sTag, sTagId, sResFrameId, iType){
	var tempResFrameId;
	// 管理标签页面
	// 每个标签都有两个元素
	// 1. LI, id以$$_item_开头，负责显示标签名、日志数、相片数、收藏数等
	// 2. DIV, id 以$$_item_frame_开头，负责显示点击此tag的搜索结果，默认不显示，名为resultFrame+tagId的div（真正显示结果的地方）隶属于这个div
	tempResFrameId = "resultFrame" + sTagId;
	this._hideTagOther(sTagId);
	if($("scGlobal"+ sTagId) == null){
		$("$$_td"+sTagId).innerHTML = "<span id='scGlobal"+ sTagId +"' class='n_ n4 c07 g_c_hand'>&nbsp;</span>"
									+ "<a href='#' id='$$_a"+ sTagId +"'>" + sTag.escape() + "</a>";//onclick='if(oEditTag) {oEditTag.tagSearchGlobal();return false;}'
		thickTheItem(sTagId);	// 加粗
		$("$$_item_frame_"+sTagId).style.display = "block";		// 显示搜索结果	
		$(tempResFrameId).style.display = "block";
//		if($('_$_search_photo_content'+tempResFrameId).innerHTML != ""){	// 缓存，如果以前搜过，直接显示
//			return;
//		}
	}else{	// 点击标签搜索后得到结果，再次点击当前标签时，隐藏搜索结果
		$("$$_td"+sTagId).innerHTML = "<a href='#' id='$$_a"+ sTagId +"'>" + sTag.escape() + "</a>";			
		thinTheItem(sTagId);
		
		$("$$_item_frame_"+sTagId).style.display = "none";		// 隐藏搜索结果
		return;
	}
	
	$(tempResFrameId).style.display = "block";
	
	//大小写	
	sTag = sTag.toLowerCase();
	
	this._sCurTag = sTag;
	this._oPhCachePage = null;
	this._oBgCachePage = null;
	this._oRcCachePage = null;
    this._bBlogFirstDone = false;
    this._bPhotoFirstDone = false;	
    this._bRcFirstDone = false;	
    	
 	this._bPhotoFirstSearchEnd = false;
 	this._bBlogFirstSearchEnd = false;
 	this._bRcFirstSearchEnd = false;
 	    
    this._searchTagAll(sTag, sTagId, tempResFrameId, iType);
    
    return false;
}

function thickTheItem(sTagId){
	$("$$_a"+sTagId).style.fontWeight = "600";
	$("$$_bn"+sTagId).style.fontWeight = "600";
//	$("$$_pn"+sTagId).style.fontWeight = "600";
//	$("$$_ln"+sTagId).style.fontWeight = "600";
}

function thinTheItem(sTagId){
	$("$$_a"+sTagId).style.fontWeight = "";
	$("$$_bn"+sTagId).style.fontWeight = "";
//	$("$$_pn"+sTagId).style.fontWeight = "";
//	$("$$_ln"+sTagId).style.fontWeight = "";
}

/**
 * 将管理标签页面里除tagId外的其他标签恢复成原始状态
 * @param	{String}	sTagId
 * 			当前被点击的标签id
 * @return	{Void}
 */
function _fnHideTagOther(sTagId){
	g_userTagList.each(function(e){
		var eF = $("resultFrame"+e.id);
		if(eF && e.id != sTagId && eF.innerHTML != ""){
			var a1 = $("$$_td"+e.id);
			if(a1){
				a1.innerHTML = "<a href='#' id='$$_a"+ e.id +"'>" + e.tagName.escape() + "</a>";			
				thinTheItem(e.id);
				$("resultFrame"+e.id).style.display = "none";
			}
		}
	});	
}

/**
 * 生成搜索结果
 * @param	{String}	sTag
 * @param	{String}	sTagId
 * @param	{String}	sResFrameId
 * @param	{Number}	iType
 * 			1为Photo，3为Blog, 4为收藏, 0全部
 * @return	{Boolean}
 * 			false
 * @see		#_genBlogCon
 * @see		#_genPhotoCon
 * @see		#_genRcCon
 * @see		#_loadAll
 */
function _fnSearchTagAll(sTag, sTagId, sResFrameId, iType){
	//容器都make
	this._genBlogCon(sTag, sTagId, sResFrameId);
	//this._genPhotoCon(sTag, sTagId, sResFrameId);	
	//this._genRcCon(sTag, sTagId, sResFrameId);

	this._loadAll(sTag, sTagId, sResFrameId, iType);
}

// 生成blog搜索结果显示容器
function _fnGenBlogCon(sTag, sTagId, sResFrameId){	
	$('_$_search_blog_content'+sResFrameId).innerHTML = "&nbsp;正在搜索日志...";
	
	if(this._oBgCachePage == null){
		this._oBgCachePage = new NetEase.CachePage({loadParam:{id:sTagId, tagName:sTag, type:3},
				loadFunc: this._loadResourceByType.bind(this),  
				presentFunc: this._showBlog.bind(this), 
				userPresentFuncParam:{resFrameId:sResFrameId},
				filterFunc: this._bgFilterFunc.bind(this),			
				pageSize: this._iBlogPageSize,
				markID: 'mark_blog'+sResFrameId,
				prefetch: true,
				prefetchMulti: this._iBlogPrefetchMulti,
				styleDir: style});	
	}
    this._bBlogFirstDone = true;									
	this._bBlogBarOpened = true;
}

function _fnGenPhotoCon(sTag, sTagId, sResFrameId){	
//	$('_$_search_photo_content' + sResFrameId).innerHTML = "正在搜索相片...";
//	
//	if(this._oPhCachePage == null){
//		this._oPhCachePage = new NetEase.CachePage({loadParam:{id:sTagId, tagName:sTag, type:1}, 
//				loadFunc: this._loadResourceByType.bind(this), 
//				presentFunc: this._showPhoto.bind(this), 
//				userPresentFuncParam:{resFrameId:sResFrameId},
//				filterFunc: this._phFilterFunc.bind(this),
//				pageSize: this._iPhotoPageSize,
//				markID: 'mark_photo'+sResFrameId,
//				prefetch: true,
//				prefetchMulti: this._iPhotoPrefetchMulti,
//				styleDir: style});	
//	}
//    this._bPhotoFirstDone = true;					
//	this._bPhotoBarOpened = true;
}

function _fnGenRcCon(sTag, sTagId, sResFrameId){	
//	$('_$_search_fav_content' + sResFrameId).innerHTML = "&nbsp;正在搜索收藏...";
//	
//	if(this._oRcCachePage == null){
//		this._oRcCachePage = new NetEase.CachePage({loadParam:{id:sTagId, tagName:sTag, type:4}, 
//				loadFunc: this._loadResourceByType.bind(this), 
//				presentFunc: this._showRc.bind(this), 
//				userPresentFuncParam:{resFrameId:sResFrameId},
//				filterFunc: this._rcFilterFunc.bind(this),
//				pageSize: this._iRcPageSize,
//				markID: 'mark_rc'+sResFrameId,
//				prefetch: true,
//				prefetchMulti: this._iRcPrefetchMulti,
//				styleDir: style});	
//	}
//    this._bRcFirstDone = true;					
//	this.rcBarOpened = true;
}

// 根据type显示结果显示框
function _fnShowResByType(type, id){
	//$("search_photo" + id).style.display = "none";
	$("search_blog" + id).style.display = "none";
	//$("search_fav" + id).style.display = "none";		
//	if(type==1 || type==0){
//		$("search_photo" + id).style.display = "";
//	}
	if(type==3 || type==0){
		$("search_blog" + id).style.display = "";
	}
//	if(type==4 || type==0){	
//		$("search_fav" + id).style.display = "";
//	}
}

//tag搜索总入口.
function _fnLoadAll(sTag, sTagId, sResFrameId, iType){
	var needRefresh = 0;
	this._oCurTagObj = this._getTagObjMisc(sTag, sTagId);
	if(this._oCurTagObj != null){
		needRefresh = this._oCurTagObj.needRefresh;
	}	

	// 决定相片、日志、收藏的显示与隐藏	
	this._showResByType(iType, sResFrameId);
	this._bTagSearching = true;

	TagBean.searchTagAll(sTag, 0, this._iBlogPageSize*(this._iBlogPrefetchMulti+1), 0, this._iPhotoPageSize*(this._iPhotoPrefetchMulti+1), 0, 
				this._iRcPageSize*(this._iRcPrefetchMulti+1), needRefresh, this.isGlobal, this._bNeedGetTagObj, iType, this.isEdit, 
				this._loadAllCb.bind(this, sTag, sTagId, sResFrameId, iType)
	);
}

function _fnLoadAllCb(sTag, sTagId, sResFrameId, iType, data){
	if(data == null){
		alert("页面超时！请重新登录！");
		return false;
	}
	
	//对于从左侧栏输入进行搜索时返回的TagObj(因为无法从当前客户端tag链表中得到)，在此处赋值给当前tag对象
	var tagObjList = data["tagObjList"];
	if(tagObjList && tagObjList.length>0){
		this._oCurTagObj = tagObjList[0];
	}
	//处理输入搜索时不存在的公众标签
	if(this._oCurTagObj == null){
		this._oCurTagObj = {tagName:sTag, id:-1};
	}
	
	//显示第一次搜索结果
	if(iType == 1 || iType == 0){
		//this._loadPhotoFirstCb(data, sTag, sTagId, sResFrameId);
	}
	if(iType == 3 || iType == 0){
		this._loadBlogFirstCb(data, sTag, sTagId, sResFrameId);
	}
	if(iType == 4 || iType == 0){	
		//this._loadRcFirstCb(data, sTag, sTagId, sResFrameId);
	}
	
	this._bTagSearching = false;
}

//首次载入时回掉显示搜索结果。判断统计数，并下翻一页显示搜索结果
function _fnLoadBlogFirstCb(data, sTag, sTagId, sResFrameId){
	var blogList = data["blogList"];
		
	if(blogList.length < this._iBlogPageSize*(this._iBlogPrefetchMulti+1)){
		this._bBlogFirstSearchEnd = true;
	}
	
	var bNumFromTag = 0;
	if(this._oCurTagObj != null){
		bNumFromTag = this._getBNum(this._oCurTagObj);
	}
			
	//blog
	var blogNum;
	if(blogList.length == 0){
		blogNum = 0;
	}else{
		//结果数，对新增tag避免了在客户端和session中的缓存一致维护工作
		//第一次搜索就已经结束的话，重置搜索计数
		if(this._bBlogFirstSearchEnd){
			blogNum = blogList.length;
		}else if(blogList[0].trackbackCount != null && blogList[0].trackbackCount != 0){
			//精确的统计数，后台重新计数后的结果数
			blogNum = blogList[0].trackbackCount;
		}else{
			blogNum = bNumFromTag;
		}
	}
	if($('$$_bn'+sTagId) != null){				// 管理标签页面的数字
		$('$$_bn'+sTagId).innerHTML = blogNum;
	}

	this._oBgCachePage.initCacheData(blogList, this._bBlogFirstSearchEnd);
	
	//发现计数不对，设置标识位
	if(blogNum != bNumFromTag && this._oCurTagObj != null){
		this._setNeedRefresh(sTag, blogNum, this._getPNum(this._oCurTagObj), this._getLNum(this._oCurTagObj));
	}
}
//首次载入时回掉。判断统计数，并下翻一页显示搜索结果
function _fnLoadPhotoFirstCb(data, sTag, sTagId, sResFrameId){
//	var photoList = data["photoList"];	
//	if(photoList.length < this._iPhotoPageSize*(this._iPhotoPrefetchMulti+1)){
//		this._bPhotoFirstSearchEnd = true;
//	}	
//	
//	var pNumFromTag = 0;
//	if(this._oCurTagObj != null){
//		pNumFromTag = this._getPNum(this._oCurTagObj);
//	}
//	
//	//photo
//	var photoNum;
//	if(photoList.length == 0){
//		photoNum = 0;
//	}else{
//		if(this._bPhotoFirstSearchEnd){
//			photoNum = photoList.length;
//		}else if(photoList[0].accessCount != 0 && photoList[0].accessCount != null){
//			photoNum = photoList[0].accessCount;
//		}else{
//			photoNum = pNumFromTag;
//		}
//	}
//	if($('$$_pn'+sTagId) != null){
//		$('$$_pn'+sTagId).innerHTML = photoNum;
//	}	
//
//	//this._oPhCachePage.initCacheData(photoList, this._bPhotoFirstSearchEnd);
//	
//	//发现计数不对，设置标识位
//	if(photoNum != pNumFromTag && this._oCurTagObj != null){
//		this._setNeedRefresh(sTag, this._getBNum(this._oCurTagObj), photoNum,  this._getLNum(this._oCurTagObj));
//	}
}
function _fnLoadRcFirstCb(data, sTag, sTagId, sResFrameId){
//	var rcList = data["rcList"];
//	if(rcList.length < this._iRcPageSize*(this._iRcPrefetchMulti+1)){
//		this._bRcFirstSearchEnd = true;
//	}		
//	
//	var lNumFromTag=0;
//	if(this._oCurTagObj != null){
//		lNumFromTag = this._getLNum(this._oCurTagObj);
//	}
//
//	//rc
//	var rcNum;
//	if(rcList.length == 0){
//		rcNum = 0;
//	}else{
//		if(this._bRcFirstSearchEnd){
//			rcNum = rcList.length;
//		}else if(rcList[0].tag != null && parseInt(rcList[0].tag) != 0){
//			rcNum = parseInt(rcList[0].tag);
//		}else{
//			rcNum = lNumFromTag;
//		}
//	}
//	if($('$$_ln'+sTagId)!=null){
//		$('$$_ln'+sTagId).innerHTML = rcNum;
//	}	
//
//	this._oRcCachePage.initCacheData(rcList, this._bRcFirstSearchEnd);	
//	
//	//发现计数不对，设置标识位
//	if(rcNum != lNumFromTag && this._oCurTagObj != null){
//		this._setNeedRefresh(sTag, this._getBNum(this._oCurTagObj), this._getPNum(this._oCurTagObj), rcNum);
//	}
}

function _fnLoadResourceByType(param, callBack){
	var needRf = 0;
	if(this._oCurTagObj) 
		needRf = this._oCurTagObj.needRefresh;
	switch(param.type){
		case 1:		// photo
			//TagBean.searchPhoto(param.tagName, param.offset, param.limit, needRf, this.isGlobal, this.isEdit, callBack);
			break;
		case 3:		// blog
			TagBean.searchBlog(param.tagName, param.offset, param.limit, needRf, this.isGlobal, this.isEdit, callBack);
			break;
		case 4:		// list
			//TagBean.searchList(param.tagName, param.offset, param.limit, needRf, this.isGlobal, this.isEdit, callBack);
			break;
	}
}

function _fnPhFilterFunc(data){
	data.each(function(e) { 
		e.createTimeStr = getLongDateTime(e.createTime);
	});
}
function _fnBgFilterFunc(data){}
function _fnRcFilterFunc(data){
	this._phFilterFunc(data);
}

//向前向后翻页都用此接口
function _fnShowPhoto(photos, param){
//	if(photos == null){
//		alert("页面超时！请重新登录！");
//		return false;
//	}
//	var total = this._oPhCachePage.getAllCachedData().length;
//	//考虑统计数多和少时两种情况
//	if(this._oCurTagObj &&
//		(photos.length < this._iPhotoPageSize || total > this._getPNum(this._oCurTagObj))){
//		if(total != this._getPNum(this._oCurTagObj)){
//			if(this._bCurIsHot)
//				$('thisPhotoNum').innerHTML = total;
//			if($('$$_pn'+this._oCurTagObj.id)!=null){
//				$('$$_pn'+this._oCurTagObj.id).innerHTML = total;
//			}					
//			this._setNeedRefresh(this._oCurTagObj.tagName, this._getBNum(this._oCurTagObj), total, this._getLNum(this._oCurTagObj));
//		}
//	}	
//	
//	$('_$_search_photo_content' + param.resFrameId).innerHTML = jst_search_photo_content.processUseCache({photoList:photos, urlPre:this.urlPre, prefix: g_urlPrefix});
//	if(photos.length == 0){
//		$('mark_photo' + param.resFrameId).style.display = "none";
//		$('_$_search_photo_content' + param.resFrameId).innerHTML = "无任何相片对应此标签！";
//	}
//	else {
//		$('mark_photo' + param.resFrameId).style.display = "";
//	}
}
function _fnShowBlog(blogs, param){
	if(blogs == null){
		alert("页面超时！请重新登录！");
		return false;
	}
	var total = this._oBgCachePage.getAllCachedData().length;
	//考虑统计数多和少时两种情况
	if(this._oCurTagObj &&
		(blogs.length < this._iBlogPageSize || total > this._getBNum(this._oCurTagObj))){	
		if(total != this._getBNum(this._oCurTagObj)){
			if(this._bCurIsHot)
				$('thisBlogNum').innerHTML = total;
			if($('$$_bn'+this._oCurTagObj.id) != null){
				$('$$_bn'+this._oCurTagObj.id).innerHTML = total;
			}	
			this._setNeedRefresh(this._oCurTagObj.tagName, total, this._getPNum(this._oCurTagObj), this._getLNum(this._oCurTagObj));
		}
	}
	
	$('_$_search_blog_content' + param.resFrameId).innerHTML = jst_search_blog_content.processUseCache({blogList:blogs,serverName:this.sServerName});
	if(blogs.length == 0){
		$('mark_blog' + param.resFrameId).style.display = "none";
		$('_$_search_blog_content' + param.resFrameId).innerHTML = "无任何日志对应此标签！";
	}
	else {
		$('mark_blog' + param.resFrameId).style.display = "";
	}
}
function _fnShowRc(rcs, param){
//	if(rcs == null){
//		alert("页面超时！请重新登录！");
//		return false;
//	}
//	var total = this._oRcCachePage.getAllCachedData().length;
//	//考虑统计数多和少时两种情况
//	if(this._oCurTagObj &&
//		(rcs.length < this._iRcPageSize || total > this._getLNum(this._oCurTagObj))){		
//		if(total != this._getLNum(this._oCurTagObj)){
//			if(this._bCurIsHot)
//				$('thisRcNum').innerHTML = total;
//			if($('$$_ln'+this._oCurTagObj.id) != null){
//				$('$$_ln'+this._oCurTagObj.id).innerHTML = total;
//			}					
//			this._setNeedRefresh(this._oCurTagObj.tagName, this._getBNum(this._oCurTagObj), this._getPNum(this._oCurTagObj), total);
//		}
//	}		
//
//	$('_$_search_fav_content' + param.resFrameId).innerHTML = jst_search_fav_content.processUseCache({rcList:rcs, urlPre:this.urlPre});
//	if(rcs.length == 0){
//		$('mark_rc' + param.resFrameId).style.display = "none";
//		//$('_$_search_fav_content' + param.resFrameId).innerHTML = "无任何收藏对应此标签！";
//	}
//	else {
//		$('mark_rc' + param.resFrameId).style.display = "";
//	}
}

// 点击左栏管理标签
function fnManageAllTag() {
	this._bCurIsHot = false;
	//显示管理分类div
	if (this.tagAllList == null) {
		this.tagAllList = new NetEase.ListModule({loadParam:null,loadFunc: this._loadTagAllFunc, id:'id',attach:null, props:['tagName'],positions:[0,-1,-1,-1,1,2], 
			keepLast:true,propsFilter:[36],presentTemplate:tag_all_jst,presentParam:{tagCols:this._iTagCols, visitorRank:this.iVisitorRank, isEdit:this.isEdit},
			propsClass:["g_w_20 g_t_left g_t_wrap","g_w_20 g_t_left g_t_wrap","g_w_25 g_t_left g_t_wrap","g_w_10 g_t_center","g_w_10 g_t_center","g_w_10 g_t_center","g_w_5 g_t_center"],
			presentShowId:'tagItemsList',alertMsg:'标签名称不能为空',
			disableFunc:this._tagDisableObjFunc,enableFunc:this._tagEnableObjFunc,
			saveAddFunc:this._tagSaveAddTagFunc,saveEditFunc:this._tagSaveEditTagFunc,saveDelFunc:this._tagSaveDelTagFunc,
			afterAjaxFunc:this._tagAfterAjaxFunc.bind(this),afterCancelFunc:this._tagAfterCancelFunc.bind(this),
			objName:'oEditTag.tagAllList'});
	}
}

//加载分类列表
function _fnLoadTagAllFunc(loadParams, callbackFunc) {
	callbackFunc(g_userTagList);
}

// 点击添加标签
function fnAddTagFunc(obj) {
	if(obj.disabled)	// 防止重复点击
		return;
	this.tagAllList.addItem();
}

// 新增标签，点确定
function _fnTagSaveAddTagFunc(element, callbackFunc) {
	//过滤逗号、引号，保留空格
	var sTag = element.tagName.replace(/[",，“”]/g, "");
	//去掉首尾空格
	sTag = Trim(sTag);
	//去掉连续空格	
	sTag = sTag.replace(/\s+/g, " ");
	sTag = sTag.toLowerCase();
	
	element.tagName = sTag;			
	var tagObj = getTagObjByTagname(element.tagName, element.id, g_userTagList);
	if(tagObj != null){
		alert("已存在同名标签“"+ sTag + "”，请输入其他名称的标签！");
		return false;
	}	
	TagBean.addTag(sTag, {
		callback: callbackFunc,
		errorHandler: function(errorString, ex) {
			filterWarning(ex, false);;
		}
	});
}

// 修改标签
function _fnTagSaveEditTagFunc(element, callbackFunc) {
	//过滤逗号、引号，保留空格
	var sTag = element.tagName.replace(/[",，“”]/g, "");	
	//去掉首尾空格
	sTag = Trim(sTag);
	//去掉连续空格	
	sTag = sTag.replace(/\s+/g, " ");
	sTag = sTag.toLowerCase();
		
	element.tagName = sTag;	
	for(var i=0; i<g_userTagList.length; i++){
		if(element.tagName==g_userTagList[i].tagName && g_userTagList[i].id!=element.id){
			alert("已存在同名标签“"+ sTag + "”，请输入其他名称的标签！");
			return false;
		}
	}	
	TagBean.updateTagnameInUser(element.id, sTag, {
		  callback: callbackFunc,
		  errorHandler: function(errorString, ex) {
			filterWarning(ex, false);
		  }
	});
}

function _fnTagSaveDelTagFunc(element, callbackFunc) {
	TagBean.clearTagResourseInUser(element.id, element.tagName, callbackFunc);
}

function _fnTagAfterAjaxFunc(element) {
	this._bTagEditing = false;
	if (this.tagAllList != null) {
		var type = this.tagAllList.getAjaxType();
		if (type == 2) {// add	
			this._putTag2List(element.id, element.tagName);
			dwrlog("添加标签成功！","ok");
		}
		if(type == 3){	// update
			this._updateTagObjName(element.id, element.tagName, element.oldElement.tagName);
			var hotEl = $('$$_hot_'+element.id);
			if(hotEl){
				if(isIE){
					hotEl.innerText = element.tagName;
				}else{
					hotEl.text = element.tagName;
				}
			}
			dwrlog("编辑标签成功！","ok");
		}
		if(type == 4){	// delete
			this._rmTagFromList(element);
			var hotEl = $('$$_hot_'+element);
			if(hotEl){
				Element.removeChild(hotEl);
			}
			dwrlog("删除标签成功！","ok");
		}
	}
}

function _fnPutTag2List(id, sTag){
	var obj = {};
	obj.id = id;
	obj.tagName = sTag;
	obj.photoCount = 0;	
	obj.blogCount = 0;
	obj.listCount = 0;
	obj.needRefresh = 0;	
	g_userTagList.push(obj);
}

function _fnUpdateTagObjName(sTagId, tagNew, tagOld){
	var tagObj = getTagObjByTagname(tagOld, sTagId, g_userTagList);
	if(tagObj != null){
		tagObj.tagName = tagNew;
	}
}

function _fnRmTagFromList(id){
	g_userTagList = g_userTagList.reject(function(e){
		return id == e.id;
	});		
}
function _fnTagAfterCancelFunc(){
	this._bTagEditing = false;
}

function _fnTagDisableObjFunc(){
	Element.replaceClassName("$$_item_list","g_c_enable","g_c_disable");	
	Element.replaceClassName("_$$_manage_tag_right_upmenu","g_c_enable","g_c_disable");
}

function _fnTagEnableObjFunc(){
	Element.replaceClassName("$$_item_list","g_c_disable","g_c_enable");	
	Element.replaceClassName("_$$_manage_tag_right_upmenu","g_c_disable","g_c_enable");
}

// 排序
function _fnSortTagList(e){
	var bTempSort;
	if(e.id == "bc"){	// 点日志数
		if(this.iVisitorRank == 10000){
			this.tagAllList.sortBy("blogCount");
		}else if(this.iVisitorRank == 100){
			this.tagAllList.sortBy("friendBlogCount");
		}else{
			this.tagAllList.sortBy("guestBlogCount");
		}		
		bTempSort = this._bBlogSort;
		this._bBlogSort = !this._bBlogSort;
	}
//	}else if(e.id == "pc"){	// 相片数
//		if(this.iVisitorRank == 10000){
//			this.tagAllList.sortBy("photoCount");
//		}else if(this.iVisitorRank == 100){
//			this.tagAllList.sortBy("friendPhotoCount");
//		}else{
//			this.tagAllList.sortBy("guestPhotoCount");
//		}	
//		bTempSort = this._bPhotoSort;
//		this._bPhotoSort = !this._bPhotoSort;
//	}else if(e.id == "lc"){	// 收藏数
//		this.tagAllList.sortBy("listCount");
//		bTempSort = this._bListSort;
//		this._bListSort = !this._bListSort;
//	}

	if(bTempSort){
		$(e.id+"img").className = "n_ k7";
	}else{
		$(e.id+"img").className = "n_ k8";
	}
	return false;
}

function _fnSetNeedRefresh(sTag, blogNum, photoNum, listNum){
	var tagObj = this._getTagObjMisc(sTag, -1);
	if(tagObj != null){
		this._setBNum(tagObj, blogNum);
		this._setPNum(tagObj, photoNum);
		this._setLNum(tagObj, listNum);
		tagObj.needRefresh = 1;
		TagBean.setNeedRefresh(tagObj.tagName, blogNum, photoNum, listNum, null);
	}
}

//权限相关的计数统计
function _fnGetTagTotalNum(tObj){
	if(this.iVisitorRank == 10000){
		return (tObj.photoCount+tObj.blogCount+tObj.listCount);
	}else if(this.iVisitorRank == 100){
		return (tObj.friendPhotoCount+tObj.friendBlogCount+tObj.listCount);
	}else{
		return (tObj.guestPhotoCount+tObj.guestBlogCount+tObj.listCount);
	}		
}
function _fnGetBNum(tObj){
	if(tObj && null != tObj.blogCount){
		if(this.iVisitorRank == 10000){
			return tObj.blogCount;
		}else if(this.iVisitorRank == 100){
			return tObj.friendBlogCount;
		}else{
			return tObj.guestBlogCount;
		}		
	}else{
		return 0;
	}
}

function _fnGetPNum(tObj){
	if(tObj && null != tObj.photoCount){
		if(this.iVisitorRank == 10000){
			return tObj.photoCount;
		}else if(this.iVisitorRank == 100){
			return tObj.friendPhotoCount;
		}else{
			return tObj.guestPhotoCount;
		}
	}else{
		return 0;
	}	
}
function _fnGetLNum(tObj){
	if(tObj && null != tObj.listCount){
		return tObj.listCount;
	}else{
		return 0;
	}		
}
function _fnSetBNum(tObj, i){
	if(this.iVisitorRank == 10000){
		tObj.blogCount = i;
	}else if(this.iVisitorRank == 100){
		tObj.friendBlogCount = i;
	}else{
		tObj.guestBlogCount = i;
	}		
}
function _fnSetPNum(tObj, i){
	if(this.iVisitorRank == 10000){
		tObj.photoCount = i;
	}else if(this.iVisitorRank == 100){
		tObj.friendPhotoCount = i;
	}else{
		tObj.guestPhotoCount = i;
	}		
}
function _fnSetLNum(tObj, i){
	tObj.listCount = i;
}

function _fnShowFail(msg){
	showInfo('status_bar', msg, 'info');
}

function fnTagSearchGlobal(){
	//当前默认搜索Photo.1为Photo，type=3为Blog, 4为list, 0全部 
	//var _sType = "photo";
	var _sType = "blog"
	if(this._iCurType == 3)
		_sType = "blog";
//	else if(this._iCurType == 4)
//		_sType = "resource";
	window.open("http://blog.163.com/search/?t=tag&q=" + encodeURIComponent(this._oCurTagObj.tagName) + "&o="+_sType);
}

/**
 * 封装用户空间搜索或者全局搜索 
 * @param	{String}	sTagName
 * @param	{String}	sTagId
 * @return	{Object}	
 * 			记录标签信息的object
 * @see		#getTagObjByTagname
 */
function _fnGetTagObjMisc(sTagName, sTagId){
	return getTagObjByTagname(sTagName, sTagId, g_userTagList);
}

/**
 * 标签去重
 */
function _fnTagRemoveSame(){
	var oldT;
	var newT;
	var newList = [];
	for(var i=0; i<g_userTagList.length; i++){
		oldT = g_userTagList[i];
		if(oldT){
			var j=0;
			for(j=0; j<i; j++){
				newT = newList[j];
				if(newT && newT.tagName==oldT.tagName)
					break;	
			}

			if(j == i){
				newList.push(oldT);
			}
		}
	}
	
	if(newList.length != g_userTagList.length){
		TagBean.structUserTags();                                                         
		g_userTagList = newList;
	}
}

