/*
 * UI for GlobalSCM.net
 *
 * @Requirements:
 * 	---	jQuery Library
 *
 */
if ( typeof(GSCM)=="undefined" ){
	var GSCM = {};
}
GSCM.fn = {};
//Common Functions
GSCM.fn = {
	ie6 : function(){
		var flag = false;
		if ( $.browser.msie ){
			if ( $.browser.version.indexOf('6.') != -1 ){
				flag = true;
			}
		}
		return flag;
	},
	runJS : function( js ){
		try{
			window.eval( js );
		}
		catch ( e ){
		}
	},
	posScreenCenter : function( el ){
		var left = parseInt($(window).width()/2) - parseInt(el.width()/2);
		if ( left<0 ){
			left = 0;
		}
		var top = parseInt($(window).height()/2.5) - parseInt(el.height()/2) + $(window).scrollTop();
		if ( top<0 ){
			top = 0;
		}
		el.css({
			'left' : left,
			'top' : top
		});
	},
	t : function(t,data){
		for ( x in data ){
			t = t.replace( new RegExp("{"+x.toUpperCase()+"}", 'g'),data[x] );
		}
		return t;
	},
	json_decode : function( data ){
		try{
			data = window.eval("(" + data + ")");
		}
		catch ( e ){
			data = null;
		}
		return data;
	}
};

//Overlay
GSCM.Overlay = {
	_t : '<div id="uiOverlay"></div>',
	show : function(opts){
		var settings = $.extend({}, {
			opacity : 0.5,
			zIndex : 325
		}, opts);
		var el = $('#uiOverlay');
		if (el.size()==0){
			el = $(GSCM.Overlay._t);
			if ( GSCM.fn.ie6() ){
				var __refresh = function(){
					el.css({
						"top": $(window).scrollTop() + "px",
						'height' : $(window).height()+'px'
					});
				};
				el.css({
					'position' : 'absolute',
					'width' : '100%',
					'height' : $(window).height()+'px'
				});
				$(window).scroll(__refresh).resize(__refresh);
			}
			el.hide().appendTo('body');
		}
		el.css({
			'z-index':settings.zIndex
		});
		el.fadeTo('fast',settings.opacity);
	},
	hide : function(){
		var el = $('#uiOverlay');
		if (el.size()>0){
			el.fadeOut('slow');
		}
	}
};



//Overlay
GSCM.Dialog = {
	_t : '<div class="uiDialog" style="width: 500px; top: 147.5px;"><div class="uiDialogContainer"><div class="uiDialogContent">{CONTENT}</div></div></div>',
	_t_contextual : '<div class="uiContextualDialogPositioner"><div class="uiOverlay uiOverlaySmallHalo uiDialog uiContextualDialog uiOverlaySmallHaloArrowTop"><div class="uiOverlayContent dialog_content uiDialogContent">{CONTENT}</div><i class="uiOverlayArrow"></i></div></div>',
	_t_loading : '<div class="dialog_loading">Loading...</div>',
	_t_c : '<h2 class="dialog_title"><span>{TITLE}</span></h2><div class="dialog_content"><div class="dialog_body">{HTML}</div><div class="dialog_buttons clearfix"><div class="dialog_buttons_msg">{BUTTONS_MSG}</div><div>{BUTTONS}</div></div></div>',
	_t_contextual_c : '<div class="uiContextualDialogDefaultPadding "><div class="tip_content_status_wrapper">{HTML}</div></div><div class="uiOverlayFooter uiContextualDialogFooter uiBoxGray topborder dialog_buttons">{BUTTONS}</div>',
	_t_msg : '<div class="uiMessage uiMessage_{TYPE}"><p><i class="ico ico_msg_{TYPE}"></i>{MSG}</p></div>',
	_api : GSCM.url_base+'/ajax/gd.php',
	_wnd_data : {},
	_setData : function( id , data ){
		GSCM.Dialog._wnd_data[id] = data;
	},
	_getData : function( id ){
		if ( GSCM.Dialog._wnd_data && GSCM.Dialog._wnd_data[id] ){
			return GSCM.Dialog._wnd_data[id];
		}
		else{
			return null;
		}
	},
	_showLoading : function( id , opts ){
		var settings = $.extend({}, {
		}, opts);
		var wid = 'gscmdl_'+id;
		var el = $('#'+wid);
		if ( el.size() == 0 ){
			el = $( GSCM.fn.t(GSCM.Dialog._t,{content:GSCM.Dialog._t_loading}) );
			el.attr('id',wid);
			el.hide().appendTo('body');
		}
		el.css({
			'width' : '487px',
			'z-index' : '326'
		});
		GSCM.fn.posScreenCenter(el);
		el.fadeIn('fast');
	},
	_hideLoading : function( id ){
		var wid = 'gscmdl_'+id;
		var el = $('#'+wid);
		if ( el.size() > 0 ){
			el.fadeOut('fast',function(){
				$(this).remove();
			});
		}
	},
	//设置Dialog的内容、窗口栏
	_showWindow : function( id , opts ){
		var settings = $.extend({}, {
			title : '',
			title_icon : '',
			html : '',
			width : '',
			buttons : [{
				'name' : 'OKay',
				'action' : 'close',
				'class' : ''
			}],
			buttons_msg : '',
			contextual : false,
			top : '',
			left : ''
		}, opts);
		if ( settings.title == '' ){
			settings.title = 'GlobalSCM.net Dialog';
		}
		var wid = 'gscmd_'+id;
		var el = $('#'+wid);
		var _t = '';
		var _t_c = '';
		var divc = null;
		if ( settings.contextual ){
			_t = GSCM.Dialog._t_contextual;
			_t_c = GSCM.Dialog._t_contextual_c;
		}
		else{
			_t = GSCM.Dialog._t;
			_t_c = GSCM.Dialog._t_c;
		}
		if ( el.size() == 0 ){
			el = $( _t );
			el.attr('id',wid);
			el.hide().appendTo('body');
		}
		el.css({
			'z-index' : '326'
		});
		if ( settings.width ){
			el.css('width',settings.width);
		}
		var divc = el.find('.uiDialogContent');
		var tdata = {
			title : settings.title,
			buttons : '',
			buttons_msg : settings.buttons_msg,
			html : settings.html
		};
		var html_t = GSCM.fn.t(_t_c,tdata);
		divc.html( html_t );
		GSCM.fn.posScreenCenter(el);
		$(window).resize(function(){
			GSCM.fn.posScreenCenter(el);
		});
		if ( settings.top ){
			el.css({top:settings.top});
		}
		if ( settings.left ){
			el.css({left:settings.left});
		}
		if ( settings.title_icon ){
			divc.find('h2.dialog_title').addClass('dialog_title_'+settings.title_icon);
		}
		if ( settings.buttons && settings.buttons.length > 0 ){
			var button = null;
			var el_btn = null;
			var str_class = '';
			for ( i=0;i<settings.buttons.length;i++ ){
				str_class = '';
				
				button = settings.buttons[i];
				if ( typeof( button ) == 'string' ){
					$(button).appendTo(divc.find('.dialog_buttons'));
				}
				else{
					el_btn = $('<label class="uiButton uiButtonLarge '+(button['class']?button['class']:'')+'"><input type="button" value="'+button.name+'" /></label>');
					if ( button.action ){
						if ( button.action == 'close' ){
							el_btn.click( function(){
								GSCM.Dialog.hideWindowByEl(el);
							} );
						}
						else{
							var fn = button.action;
							el_btn.click( function(){
								eval( fn+'(el);' );
							} );
						}
					}
					
					if ( button.isConfirm ){
						el_btn.addClass('uiButtonConfirm');
					}
					el_btn.appendTo(divc.find('.dialog_buttons'));
				}
			}
		}
		//设置顶部Arrow
		if ( settings.contextual )
		{
			el.find('.uiOverlayArrow').css({
				'left' : '20px'
			});
		}

		GSCM.Dialog._initContentDOM(el);
		el.fadeIn('fast');
		return el;
	},
	_initContentDOM : function( el ){
		if ( bind_gui ){
			bind_gui( el );
		}
	},
	show : function( id , opts ){
		if ( !id ){
			return false;
		}
		var settings = $.extend({},{
			contextual : 0,
			ac : id,
			overlay : 1,
			loading : 1,
			data : {},
			top : 0,
			left : 0,
			onShow : null
		}, opts);
		if ( settings.ac == '' ){
			return false;
		}
		var wdata;
		if ( GSCM.Dialog._getData(id) )
		{
			wdata = GSCM.Dialog._getData(id);
			if ( wdata.xhr )
			{
				wdata.xhr.abort();
			}
		}
		if ( settings.overlay )
		{
			GSCM.Overlay.show();
		}
		wdata = {
			id : id,
			xhr : null
		};
		if ( settings.loading ){
			GSCM.Dialog._showLoading(id);
		}
		var aj_data = $.extend({
			ac : settings.ac
		},settings.data);
		var el;
		wdata.xhr = $.ajax({
			url: GSCM.Dialog._api+'?t='+new Date().getTime(),
			data : aj_data,
			type : 'post',
			success: function(data) {
				var data = GSCM.fn.json_decode(data);
				if ( data && data.settings ){
					GSCM.Dialog._hideLoading(id);
					if ( settings.contextual ){
						data.settings.contextual = 1;
						if ( !data.settings.top ){
							data.settings.top = settings.top;
							data.settings.left = settings.left;
						}
					}
					el = GSCM.Dialog._showWindow(id , data.settings);
					wdata.el = el;
					GSCM.Dialog._setData(id , wdata);
					if ( settings.onShow ){
						settings.onShow( el );
					}
				}
			},
			error : function(){
				GSCM.Dialog._hideLoading(id);
				GSCM.Overlay.hide();
			}
		});
		GSCM.Dialog._setData(id , wdata);
	},
	showContextual : function( id , opts ){
		if ( !id ){
			return false;
		}
		var settings = $.extend({},{
			ac : id,
			el : null,
			data : {}
		}, opts);
		if ( settings.ac == '' ){
			return false;
		}
		settings.contextual = 1;
		settings.overlay = 0;
		settings.loading = 0;
		if ( settings.el.size && settings.el.size() > 0 ){
			settings.top = settings.el.offset().top+settings.el.height()+"px";
			settings.left = settings.el.offset().left+"px";
		}
		GSCM.Dialog.show( id , settings );
	},
	hide : function( id ){
		if ( !id ){
			return false;
		}
		var wid = 'gscmd_'+id;
		var el = $('#'+wid);
		if ( el.size() > 0 )
		{
			GSCM.Dialog.hideWindowByEl(el);
		}
	},
	hideWindowByEl : function( el ){
		GSCM.Overlay.hide();
		el.fadeOut('fast',function(){
			$(this).remove();
		});
	},
	showInnerMessage : function( el , msg ){
		var data = $.extend({},{
			type : 'error',
			msg : ''
		}, msg );
		var el_msg = el.find('.uiMessage');
		if ( el_msg.size() > 0 ){
			el_msg.remove();
		}
		var msg_title = (data.msg&&data.msg.t)?data.msg.t:data.msg;
		el_msg = $( GSCM.fn.t( GSCM.Dialog._t_msg,{
			type : data.type,
			msg : msg_title
		}) );
		el_msg.insertAfter(el.find('.dialog_body'));
	},
	showMessage : function( msg ){
		var data = $.extend({},{
			type : 'success',
			msg : '',
			timeout : 3000
		}, msg );
		var wid = 'gscmdmsg';
		var el = $('#'+wid);
		if ( el.size() > 0 ){
			el.remove();
		}
		el = $( GSCM.fn.t(GSCM.Dialog._t,{content:GSCM.fn.t(GSCM.Dialog._t_msg,{type:data.type,msg:data.msg})}) );
		el.attr('id',wid);
		el.hide().appendTo('body');
		GSCM.fn.posScreenCenter(el);
		el.css({
			//'top' : '0px',
			'z-index' : '326'
		});
		el.fadeIn('fast');
		setTimeout(function(){
			el.fadeOut('slow');
		},data.timeout);
	},
	setStatusLoading : function( el ){
		el.find('.uiDialogContent').find('h2.dialog_title').addClass('dialog_title_loading');
	},
	clearStatusLoading : function( el ){
		el.find('.uiDialogContent').find('h2.dialog_title').removeClass('dialog_title_loading');
	}
};




//Selector
GSCM.Selector = {
	_t : '<div data-name="{NAME}" class="uiSelector uiSelectorNormal" title="{TITLE}"><div class="wrap"><a href="javascript:void(0);" class="uiSelectorButton uiButton {BUTTON_CLASS}">{BUTTON_ICON}<span class="uiButtonText">{BUTTON_LABEL}</span></a><div class="uiSelectorMenuWrapper uiToggleFlyout">{MENU}</div></div></div>',
	_t_button_icon : '<i class="mrs img img_{NAME}"></i>',
	_t_menu : '<div class="uiMenu uiSelectorMenu" role="menu"><ul class="uiMenuInner">{MENUITEM}</ul></div>',
	_t_menuitem : '<li data-value="{VALUE}" class="uiMenuItem uiMenuItemRadio uiSelectorOption {CHECKED}"><a rel="ignore" href="javascript:void(0);" tabindex="0" class="itemAnchor">{ICON}<span class="itemLabel fsm">{TEXT}</span></a></li>',
	_t_separator : '<li class="uiMenuSeparator"></li>',
	_timer : null,
	render : function( el_selects , opts ){
		if ( el_selects && el_selects.size && el_selects.size() > 0 ){
			var settings = $.extend({},{
				onChange : null
			}, opts);
			el_selects.each(function(){
				var onChange;
				var button_label = '';
				var button_icon = '';
				var button_class = '';
				var sdata = {};
				var tdata;
				var menulist;
				var menuitem;
				var el;
				var html;
				el_select = $(this);
				button_label = '';
				button_icon = '';
				button_class = '';
				sdata = {};
				button_icon = el_select.attr('ui-icon')?el_select.attr('ui-icon'):'';
				onChange = el_select.attr('gscm_onchange')?el_select.attr('gscm_onchange'):settings.onChange;
				if ( button_icon ){
					button_icon = GSCM.fn.t(GSCM.Selector._t_button_icon,{name:button_icon});
				}
				sdata.name = el_select.attr('name');
				sdata.data = [];
				el_select.find('option').each(function() {
					if ( $(this).attr('selected') )
					{
						button_label = $(this).text();
					}
					sdata.data.push({
						value: $(this).val(),
						text: $(this).text(),
						selected: $(this).attr('selected'),
						icon : $(this).attr('ui-icon')
					});
				});
				if ( !button_label ){
					button_label = sdata.data[0].text;
					sdata.data[0].selected = true;
				}
				if ( el_select.attr('ui-notext') == '1' ){
					button_class = button_class+' uiButtonNoText';
					button_label = '';
				}
				tdata = {
					name : sdata.name,
					button_icon : button_icon,
					button_label : button_label,
					button_class : button_class,
					title : el_select.attr('title')
				};
				menulist = '';
				menuitem = '';
				$.each(sdata.data,function(key,value){
					var checked = '';
					if ( value.selected ){
						checked = 'checked';
					}
					var menuitemicon = '';
					if ( value.icon )
					{
						menuitemicon = GSCM.fn.t(GSCM.Selector._t_button_icon,{name:value.icon});
					}
					if ( value.text ){
						if ( value.text == '---' && value.value == '' )
						{
							menulist = menulist+GSCM.Selector._t_separator;
						}
						else
						{
							menuitem = GSCM.fn.t( GSCM.Selector._t_menuitem , {
								value : value.value,
								text : value.text,
								checked : checked,
								icon : menuitemicon
							});
							menulist = menulist+menuitem;
						}
					}
				});
				tdata.menu = GSCM.fn.t(GSCM.Selector._t_menu,{menuitem:menulist});
				
				html = GSCM.fn.t(GSCM.Selector._t,tdata);
				el = $(html);
				el.insertAfter(el_select);
				el_select.appendTo(el);
				el.click( function(){
					var el = $(this).find('.wrap');
					if ( el.hasClass('openToggler') )
					{
						el.removeClass('openToggler');
						$(this).find('.uiSelectorButton').removeClass('uiButton_selected');
					}
					else
					{
						clearTimeout( GSCM.Selector.timer );
						el.addClass('openToggler');
						$(this).find('.uiSelectorButton').addClass('uiButton_selected');
					}
					return false;
				});
				el.find('.uiMenuItem').click( function(){
					var el_selector = $(this).parent().parent().parent().parent().parent();
					var val_old = el_selector.find('select').find('option:selected').val();
					var val = $(this).attr('data-value');
					var text = $(this).find('.itemLabel').html();
					if ( val != val_old )
					{
						el_selector.find('option').each(function(index){
							if ( $(this).attr('value') == val ){
								$(this).attr('selected','selected');
							}
							else{
								$(this).removeAttr('selected');
							}
						});
						if ( el_selector.find('.uiButtonNoText').size() == 0 )
						{
							el_selector.find('.uiButtonText').html( text );
						}
						el_selector.find('.uiMenuItem').removeClass('checked');
						$(this).addClass('checked');
						if ( onChange ){
							if ( typeof(onChange) == 'function' ){
								onChange( {
									el : el_selector,
									value : val,
									text : text
								});
							}
							else{
								eval(onChange+'({ el : el_selector, value : val,text : text});');
							}
						}
					}
				});
				el.focusout(function(){
					var _this = $( this );
					GSCM.Selector.timer = setTimeout( function(){
						_this.find('.wrap').removeClass('openToggler');
						_this.find('.uiSelectorButton').removeClass('uiButton_selected');
					} , 300 );
				})
			
			});
		}
	}
};




GSCM.ListView = {
	render : function( els , opts ){
		if ( els && els.size && els.size() > 0 ){
			var settings = $.extend({},{
				text : ''
			}, opts);
			var el;
			els.each(function(){
				el = $(this);
				el.find('.checkbox').removeAttr('checked');
				el.find('.checkableListItem').hover(function(){
					$(this).addClass('checkableListItem_hover');
				},function(){
					$(this).removeClass('checkableListItem_hover');
				});
				el.find('.checkableListItem').click(function(){
					if ( $(this).hasClass('checkableListItem_checked') )
					{
						$(this).removeClass('checkableListItem_checked');
						$(this).find('.checkbox').removeAttr('checked');
					}
					else
					{
						if ( !$(this).hasClass('multiColumnCheckable') )
						{
							$(this).parent().find('li').removeClass('checkableListItem_checked');
							$(this).parent().find('li').find('.checkbox').removeAttr('checked');
						}
						$(this).addClass('checkableListItem_checked');
						$(this).find('.checkbox').attr('checked','checked');
					}
					return false;
				});
				GSCM.ListView.setSummary(el,{
					'text':settings.text
				});
			});
		};
	},
	setSummary : function( el , opts ){
		var settings = $.extend({},{
			text : ''
		}, opts);
		if ( settings.text ){
			el.find('.listSummary').html(settings.text).show();
		}
		else{
			el.find('.listSummary').hide();
		}
	},
	filter : function( el , opts ){
		var settings = $.extend({},{

		}, opts);
	}
};




GSCM.Typeahead = {
	_t_head : '<li class="header"><a rel="ignore"><span class="text">{NAME}</span></a></li>',
	_t_item : '<li class="{TYPE}" tvalue="{VALUE}" ttype="{TYPE}"><a rel="ignore" href="{URL}"><img class="image" alt="" src="{IMAGE}"><span class="text">{TEXT}</span><span class="detail">{DETAIL}</span><span class="note">{NOTE}</span></a><div class="c"></div></li>',
	_t_calltoaction : '<li class="calltoaction"><a rel="ignore" href="{URL}"><span class="text"><span class="seeMore">{SUBJECT}<span class="arrow"></span></span><span class="subtext">{NOTE}</span></span></a></li>',
	_t_loading : '<li class="calltoaction calltoaction_loading"><i class="img ico ico_loading" /></li>',
	render : function( els , opts ){
		if ( els && els.size && els.size() > 0 ){
			var settings = $.extend({},{
			}, opts);
			var el;
			els.each(function(){
				el = $(this);
				el.find('.uiTypeaheadView').html('<div class="search"></div>');
			});
		};
	},
	listData : function( el , opts ){
		var settings = $.extend({},{
			clear : true,
			data : [],
			onClick : null
		}, opts);
		var el_search = el.find('.uiTypeaheadView .search');
		if ( el_search.size() > 0 ){
			var html = '';
			if ( settings.clear ){
				el_search.html('');
			}
			var list = [];
			var tmpdata = {};
			html = '';
			var calltoaction = null;
			var count = 0;
			$.each(settings.data,function(index){
				if ( settings.data[index]['type'] == 'calltoaction' ){
					calltoaction = settings.data[index];
				}
				else{
					list = settings.data[index]['list'];
					if ( settings.data[index]['title'] ){
						html = html+GSCM.fn.t(GSCM.Typeahead._t_head,{ name: settings.data[index]['title'] });
					}
					$.each(list,function(key){
						html = html + GSCM.fn.t(GSCM.Typeahead._t_item,{
							image: list[key]['image'],
							url: list[key]['url']?list[key]['url']:'javascript:void(0);',
							text: list[key]['text'],
							detail: list[key]['detail'],
							note: list[key]['note'],
							value: list[key]['value'],
							type: settings.data[index]['type']
						});
						count ++;
					});
				}
			});
			if ( calltoaction ){
				html = html + GSCM.fn.t(GSCM.Typeahead._t_calltoaction,{
					url : calltoaction.url,
					subject : calltoaction.subject,
					note : GSCM.fn.t(calltoaction.note,{num:count})
				});
			}
			if ( html ){
				html = '<ul>'+html+'</ul>';
				$(html).appendTo(el_search);
				GSCM.Typeahead._bind(el , {
					onClick : settings.onClick
				});
			}
		}
	},
	showLoading : function( el ){
		var el_search = el.find('.uiTypeaheadView .search');
		if ( el_search.size() > 0 ){
			var html = '<ul>';
			el_search.html('');
			html = html + GSCM.fn.t(GSCM.Typeahead._t_loading);
			html = html+'</ul>';
			$(html).appendTo(el_search);
			GSCM.Typeahead._bind(el);
		}
	},
	hideLoading : function( el ){
		if ( el.find('.uiTypeaheadView .search .calltoaction_loading').size() > 0 ){
			el.find('.uiTypeaheadView .search').html('');
		}
	},
	_bind : function( el , opts ){
		var settings = $.extend({},{
			onClick : null
		}, opts);
		if ( el.find('.uiTypeaheadView').size() > 0 ){
			el.find('.uiTypeaheadView').find('li').hover( function(){
				$(this).addClass('selected');
			},function(){
				$(this).removeClass('selected');
			}).click(function(){
				if ( settings.onClick ){
					settings.onClick( $(this) );
				}
			});
		}
	}
};



GSCM.Placeholder = {
	render : function( els , opts ){
		if ( els && els.size && els.size() > 0 ){
			var settings = $.extend({},{
			}, opts);
			var el;
			els.each(function(){
				el = $(this);
				if ( !el.parent().hasClass('placeholder_wrapper') ){
					var pdl = parseInt( el.css('padding-left').replace('px','') );
					var pdt = parseInt( el.css('padding-top').replace('px','') );
					el.wrap("<div class='placeholder_wrapper' style='position:relative; display:inline-block;'></div>");
					$('<i class="placeholder"></i>').html( el.attr('gplaceholder').replace(/ /,'&nbsp;') ).insertAfter( el ).css({
						'font-size' : el.css('font-size'),
						'left' : pdl>0?(pdl+'px'):'5px',
						'top' : pdt>0?(pdt+'px'):'2px'
					}).click(function(){
						$(this).prev().focus();
					});
					if ( !el.val() ){
//						el.val( el.attr('gplaceholder') ).attr('title',el.attr('gplaceholder'));
						$(this).parent().find('.gplaceholder').show();
					}
					else{
						el.addClass('uiPlaceholder_focus');
						$(this).parent().find('.placeholder').hide();
					}
					el.focusin(function(){
						if ( $(this).val() == $(this).attr('gplaceholder') ){
							$(this).val('');
						}
						$(this).addClass('uiPlaceholder_focus');
						$(this).parent().find('.placeholder').fadeOut('fast');
					}).focusout(function(){
						if ( $(this).val() == "" ){
							//$(this).val( $(this).attr('placeholder') );
							$(this).removeClass('uiPlaceholder_focus');
							$(this).parent().find('.placeholder').fadeIn('fast');
						}
					});
					var func = function(el){
						setTimeout(function(){
							if ( el.val() != '' ){
								el.parent().find('.placeholder').fadeOut('fast');
							}
						},1000);
					};
					func(el);
				}
			});
		};
	}
};





GSCM.Ajaxform = {
	_t_msg : '<tbody><tr><td colspan="{CTD}"><div class="uiMessage uiMessage_{TYPE}"><p><i class="ico ico_msg_{TYPE}"></i>{MSG}</p></div></td></tr></tbody>',
	_t_error_flag : '<div class="UIErrorFlag" style="left: 272px;"><div class="UIErrorFlag_Inner">{TITLE}</div></div>',
	render : function( els , opts ){
		if ( els && els.size && els.size() > 0 ){
			var settings = $.extend({},{
			}, opts);
			var el;
			els.each(function(){
				el = $(this);
				if ( el.attr('ajaxify') ){
					el.find("input[type=submit]").click(function(){
						$(this).addClass('aflag_clicked');
					});
					el.submit(function( evt ){
						GSCM.Ajaxform.showLoading(el);
						GSCM.Ajaxform.hideInnerMessage(el);
						var input;
						var customdata = {};
						var submitbutton = el.find(".aflag_clicked");
						if ( submitbutton.size() > 0 ){
							customdata[submitbutton.attr('name')] = submitbutton.attr('value');
						}
						var submitdata = GSCM.Ajaxform.getData( el , customdata );
						Ajax.fn.request({
							data : submitdata,
							onSuccess : function( ret ){
								GSCM.Ajaxform.showInnerMessage( el , {
									msg: ret.msg,
									type : 'success'
								});
								if ( ret.js ){
									try{
										eval( ret.js );
									}
									catch ( e ){}
								}
							},
							onError : function( ret ){
								GSCM.Ajaxform.showInnerMessage( el , {
									msg: ret.msg,
									type : 'error'
								});
								if ( ret.js ){
									try{
										window.eval( ret.js );
									}
									catch ( e ){}
								}
							},
							onComplete : function( data ){
								GSCM.Ajaxform.hideLoading(el);
							}
						});
						$(this).find("input[type=submit]").removeClass('aflag_clicked');
						return false;
					}).addClass('uiAjaxform');
				}
			});
		};
	},
	showInnerMessage : function( el , msg ){
		var data = $.extend({},{
			type : 'error',
			msg : ''
		}, msg );
		el.find('.UIErrorFlag').remove();
		if ( data.msg ){
			var show_inner = true;
			if ( data.msg.key ){
				var el_input = el.find('.input_'+data.msg.key);
				if ( el_input.size() > 0 ){
					show_inner = false;
					var el_flag = el_input.parent().find('.UIErrorFlag');
					var new_flag = GSCM.fn.t( GSCM.Ajaxform._t_error_flag,{title:data.msg.t});
					if ( el_flag.size() > 0 ){
						el_flag.replaceWith(new_flag);
					}
					else{
						$(new_flag).appendTo( el_input.parent() );
					}
				}
				else{
					data.msg = data.msg.t;
				}
			}
			if ( show_inner ){
				var el_msg = el.find('.uiMessage');
				if ( el_msg.size() > 0 ){
					el_msg.remove();
				}
				var ctd_base = el.find('tfoot').find('tr').first();
				if ( ctd_base.size() == 0 ){
					ctd_base = el.find('tbody').find('tr').first();
				}
				if ( ctd_base.size() > 0 ){
					var tds = ctd_base.find('td');
					var ctd_up = 0;
					tds.each(function(){
						var td = $(this);
						ctd_up = ctd_up + parseInt( $(this).attr('colspan') );
					});
					var ctd = 0;
					if ( ctd_up > 0 ){
						ctd = ctd_up+ctd_base.find('th').size();
					}
					else{
						ctd = ctd_base.find('td').size()+ctd_up+ctd_base.find('th').size();
					}
					el_msg = $( GSCM.fn.t( GSCM.Ajaxform._t_msg,{
						type : data.type,
						msg : data.msg,
						ctd : ctd
					}) );
					el_msg.insertAfter(el.find('tfoot').first());
				}
			}
		}
	},
	hideInnerMessage : function( el ){
		var el_msg = el.find('.uiMessage').remove();
	},
	showLoading : function( el ){
		el.find('.uiAjaxform_ico_loading').removeClass('hidden_elem');
	},
	hideLoading : function( el ){
		el.find('.uiAjaxform_ico_loading').addClass('hidden_elem');
	},
	getData : function( el , customdata ){
		var submitdata = '';
		el.find('input').each( function(){
			input = $(this);
			if ( input.attr("type") != "submit" ){
				if ( input.attr('name') ){
					if ( input.attr("type") == "checkbox" || input.attr("type") == "radio" ){
						if ( input.is(":checked") ){
							submitdata = submitdata+'&'+input.attr('name')+"="+input.val();
						}
					}
					else{
						submitdata = submitdata+'&'+input.attr('name')+"="+encodeURIComponent(input.val());	//一定要用string,否则不能提交数组
					}
				}
			}
		});
		el.find('textarea').each( function(){
			input = $(this);
			var flag = true;
			if ( typeof(tinyMCE)!="undefined" ){
				if ( input.attr('name') == 'content' ){
					flag = false;
				}
			}
			if ( input.attr('name') && flag ){
				submitdata = submitdata+'&'+input.attr('name')+"="+encodeURIComponent(input.val());
			}
		});
		el.find('select').each( function(){
			input = $(this);
			if ( input.attr('name') ){
				submitdata = submitdata+'&'+input.attr('name')+"="+encodeURIComponent(input.find('option:selected').val());
			}
		});
		if ( typeof(tinyMCE)!="undefined" ){
			if ( tinyMCE.get('txt_content') ){
				if ( tinyMCE.get('txt_content').getContent() ){
					submitdata = submitdata+'&'+"content"+"="+encodeURIComponent(tinyMCE.get('txt_content').getContent());
				}
			}
		}
		for( key in customdata ){
			submitdata = submitdata+'&'+key+"="+encodeURIComponent(customdata[key]);
		}
		return submitdata;
	}
};


GSCM.Swfupload = {
	_swfu : null,
	init : function( opts ){
		var settings = $.extend({},{
			data : null,
			file_types : "*.*",
			file_types_description : "All Files",
			button_placeholder_id : "uiButtonSwfupload",
			button_image_url : '',
			button_width : 0,
			button_height : 0,
			file_size_limit : '100 MB',
			multiple : true,
			file_queue_limit : 1000,
			autostart : true,
			file_dialog_complete_handler : null,	//在自动开始之前调用，如果返回值为false，则不上传
			upload_start_handler : null,
			upload_progress_handler : null,
			upload_error_handler : null,
			upload_success_handler : null,
			upload_complete_handler : null,
			file_queued_handler : null,
			file_queue_error_handler : null,
			debug : false
		}, opts );
		settings.data = $.extend({"PHPSESSID" : GSCM._pss , "ac" : "upload"}, settings.data );
		var s = {
			file_post_name : 'gscm_uploader',
			upload_url: "/uploader.php",
			flash_url : GSCM._rp+"js/swfupload.swf",
			button_window_mode : 'transparent',
			post_params: settings.data,
			file_size_limit : settings.file_size_limit,
			file_types : settings.file_types,
			file_types_description : settings.file_types_description,
			button_placeholder_id: settings.button_placeholder_id,
			upload_start_handler : settings.upload_start_handler,
			upload_progress_handler : settings.upload_progress_handler,
			upload_error_handler : settings.upload_error_handler,
			file_queue_error_handler : settings.file_queue_error_handler,
			upload_success_handler : function( file , server_data , received_response ){
				settings.upload_success_handler( file , server_data , received_response );
				try {
					this.startUpload();
				} catch (ex)  {
					
				}
			},
			upload_complete_handler : settings.upload_complete_handler,
			file_queued_handler : settings.file_queued_handler,
			debug: settings.debug
		};
		if ( settings.autostart ){
			s.file_dialog_complete_handler = function (numFilesSelected, numFilesQueued) {
				if ( !settings.file_dialog_complete_handler || (settings.file_dialog_complete_handler&&settings.file_dialog_complete_handler(numFilesSelected, numFilesQueued)) ){
					try {
						this.startUpload();
					} catch (ex)  {
						
					}
				}
			};
		}
		else{
			s.file_dialog_complete_handler = settings.file_dialog_complete_handler;
		}
		if ( settings.button_image_url && settings.button_width && settings.button_height ){
			s.button_image_url = settings.button_image_url;
			s.button_width = settings.button_width;
			s.button_height = settings.button_height;
		}
		if ( settings.multiple ){
			if ( !s.button_image_url ){
				s.button_image_url = "btn_choosefiles_swf.gif";
				s.button_width = "97";
				s.button_height = "22";
			}
			s.button_image_url = GSCM._rp+"images/"+GSCM._lang+"/"+s.button_image_url;
			s.file_queue_limit = settings.file_queue_limit;
			s.button_action = SWFUpload.BUTTON_ACTION.SELECT_FILES;
		}
		else{
			if ( !s.button_image_url ){
				s.button_image_url = "btn_choosefile_swf.gif";
				s.button_width = "86";
				s.button_height = "22";
			}
			s.button_image_url = GSCM._rp+"images/"+GSCM._lang+"/"+s.button_image_url;
			s.file_queue_limit = 1;
			s.button_action = SWFUpload.BUTTON_ACTION.SELECT_FILE;
		}
		GSCM.Swfupload._swfu = new SWFUpload(s);
		return GSCM.Swfupload._swfu;
	}
};




GSCM.Progressbar = {
	setPercent : function( el , percent ){
		if ( percent > 100 ){
			percent = 100;
		}
		else if ( percent < 0 ){
			percent = 0;
		}
		el.find('.uiProgressbar_inner').css({
			width : percent+"%"
		});
		el.find('.uiProgressbar_percent').html(percent+"%");
	},
	render : function( els , opts ){
		if ( els && els.size && els.size() > 0 ){
			var settings = $.extend({},{
				onCancel : null
			}, opts);
			var el;
			els.each(function(){
				el = $(this);
				el.find('.uiProgressbar_outer').css({
					width: (el.width()-50)+'px'
				});
				GSCM.Progressbar.setPercent( el , 0 );
				el.find('.uiProgressbar_cancel').click( function(){
					if ( settings.onCancel ){
						settings.onCancel();
					}
				});
			});
		};
	}
};


GSCM.GlobalSearch = {
	_t_loading : '',
	_api : 'ajax/ac.php',
	_el : null,
	_xhr : null,
	_timer : null,
	init : function(){
		GSCM.GlobalSearch._el = $('#navSearch .uiTypeahead');
		GSCM.Typeahead.render(GSCM.GlobalSearch._el);
		$('#txt_global_search').keydown(function(){
			if ( GSCM.GlobalSearch._xhr ){
				GSCM.GlobalSearch._xhr.abort()
			}
			clearTimeout( GSCM.GlobalSearch._timer );
			GSCM.Typeahead.showLoading(GSCM.GlobalSearch._el);
			GSCM.GlobalSearch._timer = setTimeout(function(){
				var q = $('#txt_global_search').val();
				if ( q ){
					GSCM.GlobalSearch._request({
						'q' : q,
						onSuccess : function( list ){
							GSCM.Typeahead.listData($('#navSearch .uiTypeahead'),{data:list});
						}
					});
				}
				else{
					GSCM.Typeahead.listData($('#navSearch .uiTypeahead'),{data:[]});
				}
			} , 600 );
				
		}).focusout(function(){
			setTimeout( function(){
				GSCM.GlobalSearch._el.find('.uiTypeaheadView').css({
					'visibility' : 'hidden'
				});
			} , 300 );
		}).focus(function(){
			GSCM.GlobalSearch._el.find('.uiTypeaheadView').css({
				'visibility' : ''
			});
		});
	},
	_request : function( opts ){
		var settings = $.extend({},{
			q : '',
			onSuccess : null
		}, opts);
		if ( GSCM.GlobalSearch._xhr ){
			GSCM.GlobalSearch._xhr.abort()
		}
		GSCM.GlobalSearch._xhr = Ajax.fn.request({
			data : {
				ac : 'gs',
				q : settings.q
			},
			onSuccess : function( ret ){
				if ( settings.onSuccess ){
					settings.onSuccess( ret.data );
				}
			},
			onComplete : function(){
				
			}
		});
	}
};



GSCM.Tokenizer = {
	_api : '',
	_t : '<div class="tokenarea"></div><div class="uiTypeahead"><div class="wrap"><input type="hidden" class="hiddenInput" autocomplete="off" value="" /><div class="innerWrap"><input type="text" title="{PLACEHOLDER}" value="" spellcheck="false" autocomplete="off" gplaceholder="{PLACEHOLDER}" class="inputtext textInput uiPlaceholder" style=""></div><div class="uiTypeaheadView"><div class="search"></div></div></div></div>',
	_t_token : '<span title="{TITLE}" class="removable uiToken">{TITLE}<input type="hidden" class="txt_value" value="{VALUE}" name="{NAME}"><input type="hidden" class="txt_title" value="{TITLE}" name="{NAME_TITLE}"><a href="#" title="Remove {TITLE}" class="remove uiCloseButton uiCloseButtonSmall"></a></span>',
	_t_resultitem : '<li class="{TYPE}"><input type="hidden" name="{TYPE}[]" value="{VALUE}" />{IMAGE}<span class="text">{TEXT}</span><div class="details"><span class="detailsContents">{DETAIL}</span></div></li>',
	_xhr : null,
	_timer : null,
	_list : null,
	render : function( els , opts ){
		if ( els && els.size && els.size() > 0 ){
			var settings = $.extend({},{
				api : '',
				api_type : 'init'		//init-数据只下载一次，之后的匹配在JS中进行，默认为每次获取数据
			}, opts);
			var el;
			els.each(function(){
				el = $(this);
				if ( !settings.api ){
					settings.api = el.attr('ajaxify');
				}
				if ( !settings.api ){
					return false;
				}
				el.addClass('tokenizer').addClass('clearfix').html( GSCM.fn.t(GSCM.Tokenizer._t,{
					'PLACEHOLDER' : el.attr('gplaceholder')?el.attr('gplaceholder'):''
				}) );
				el.click(function(){
					el.find('.textInput').focus();
				});
				el.find('.textInput').keydown( function( event ){
					if ( GSCM.Tokenizer._xhr ){
						GSCM.Tokenizer._xhr.abort();
					}
					clearTimeout( GSCM.Tokenizer._timer );
					if ( event.which == 8 && el.find('.textInput').val() == '' ){
						GSCM.Tokenizer.removeLastToken( el );
					}
					else{
						GSCM.Tokenizer._timer = setTimeout(function(){
							GSCM.Typeahead.showLoading( el );
							GSCM.Tokenizer._request({
								'q' : el.find('.textInput').val(),
								onSuccess : function( list ){
									GSCM.Typeahead.listData(el.find('.uiTypeahead'),{
										data:list,
										onClick:function( elli ){
											var token = {
												value : elli.attr('tvalue'),
												title : elli.find('.text').html(),
												name : elli.attr('ttype')+'[]',
												name_title : 't'+elli.attr('ttype')+'[]'
											};
											GSCM.Tokenizer.addToken( el , token );
										}
									});
								},
								onComplete : function(){
									GSCM.Typeahead.hideLoading( el );
								}
							});
						} , 100 );
					}
				});
				GSCM.Placeholder.render(el.find('.uiPlaceholder'));
			});
		};
	},
	addToken : function( el , token ){
		var obj = $.extend({},{
			value : '',
			title : '',
			name : '',
			name_title : ''
		}, token);
		if ( !obj.value || !obj.title ){
			return false;
		}
		var told = GSCM.Tokenizer.getTokenByValue( el , token.value );
		if ( !told ){
			var el_div = $(GSCM.fn.t(GSCM.Tokenizer._t_token,obj) );
			el_div.appendTo( el.find('.tokenarea') );
			el_div.find('.uiCloseButton').click(function(){
				el_div.fadeOut('fast',function(){
					$(this).remove();
				});
			});
		}
		el.find('.textInput').val('');
		el.find('.uiTypeaheadView .search').html('');
	},
	getTokenByValue : function( el , value ){
		var tokens = el.find('.uiToken');
		var ret = null;
		tokens.each(function(){
			t = $(this);
			if ( t.find('.txt_value').val() == value ){
				ret = t;
			}
		});
		return ret;
	},
	getTokenByTitle : function( el , title ){
		var tokens = el.find('.uiToken');
		tokens.each(function(){
			el = $(this);
			if ( el.find('.txt_title').val() == title ){
				return el;
			}
		});
		return null;
	},
	removeLastToken : function( el ){
		el.find('.uiToken').last().fadeOut('fast',function(){$(this).remove()});
	},
	_request : function( opts ){
		var settings = $.extend({},{
			ac : 'tk_c',
			q : '',
			onSuccess : null,
			onComplete : null
		}, opts);
		
		GSCM.ConnectionSearch.search({
			q : settings.q,
			search_name : true,
			onSuccess : function( list ){
				var newlist = [];
				var i;
				for( i=0;i<list.length;i++ ){
					newlist.push( {
						image : list[i]['photo'],
						text : list[i]['name'],
						detail : list[i]['company']+' '+list[i]['location'],
						note : '',
						url : '',
						value : list[i]['id']
					} );
				}
				if ( settings.onSuccess ){
					settings.onSuccess( [{type:'user',list:newlist}] );
				}
				if ( settings.onComplete ){
					settings.onComplete(  );
				}
			}
		});
		
//		if ( GSCM.Tokenizer._xhr ){
//			GSCM.Tokenizer._xhr.abort()
//		}
//		if ( !settings.q ){
//			if ( settings.onComplete ){
//				settings.onComplete();
//			}
//			return false;
//		}
//		GSCM.Tokenizer._xhr = Ajax.fn.request({
//			data : {
//				ac : settings.ac,
//				q : settings.q
//			},
//			onSuccess : function( ret ){
//				if ( settings.onSuccess ){
//					settings.onSuccess( ret.data );
//				}
//			},
//			onComplete : function(){
//				if ( settings.onComplete ){
//					settings.onComplete(  );
//				}
//			}
//		});
	},
	showResult : function( el , list ){
		var i;
		var html = '<ul>';
		var data;
		for(i=0;i<list.length;i++){
			data = $.extend({},{
				'image' : '',
				'text' : '',
				'detail' : '',
				'type' : '',
				'value' : 0
			}, list[i]);
			if ( data.value && data.text && data.type ){
				if ( data.image ){
					data.image = '<img src="'+data.image+'" />';
				}
				html = html + GSCM.fn.t( GSCM.Tokenizer._t_resultitem , data );
			}
		}
		html = html+'</ul>';
		el.find('.uiTypeaheadView .search').html(html);
	}
};




GSCM.Uploader = {
	_t : '<span id={BUTTON_ID} class="btn_upload"></span><ul class="filelist"></ul>',
	_t_fileitem : '<li class="{TYPE} clearfix"><input type="hidden" class="fid" value="{ID}" /><input type="text" class="fname" name="attachs_n[]" value="{NAME}" ><input type="hidden" class="fcode" name="attachs_c[]" /><div class="uiProgressbar"><div class="uiProgressbar_outer"><div style="width: 0%;" class="uiProgressbar_inner"></div></div><i class="uiProgressbar_percent">0%</i></div><div class="uploadSuccessPanel"></div><div class="uploadSuccessPanel"><a class="btn_del" href="javascript:void(0);" title="'+LANG['DELETE']+'">'+LANG['DELETE']+'</i></a></div></li>',
	_ds_default : {
		file_size_limit : "40 MB",
		file_types : "*.jpg; *.jpeg; *.gif; *.png; *.bmp; *.doc; *.docx; *.xls; *.xlsx; *.ppt; *.pptx; *.pdf; *.rar; *.zip;",
		file_types_description : "GlobalSCM Accept Files",
		file_queue_limit : 1000,
		multiple : true,
		debug : false
	},
	_ds_i1 : {
		file_size_limit : "10 MB",
		file_types : "*.jpg; *.jpeg; *.gif; *.png;",
		file_types_description : "Image Files (JPG, GIF, PNG)",
		button_image_url : 'btn-uploader-1.gif',
		button_width : '16',
		button_height : '16',
		multiple : false,
		debug : false
	},
	render : function( els , opts ){
		if ( els && els.size && els.size() > 0 ){
			var settings = $.extend({},{
			}, opts);
			var el;
			els.each(function(){
				el = $(this);
				var umode = el.attr('umode');
				var default_settings = {};
				if ( umode == 'i1' ){
					default_settings = GSCM.Uploader._ds_i1;
				}
				else{
					umode = 'default';
					default_settings = GSCM.Uploader._ds_default;
				}
				el.addClass('uiUploader_'+umode);
				var button_id = 'btn'+((new Date()).getTime());
				var t = GSCM.fn.t( GSCM.Uploader._t , {
					button_id : button_id
				});
				el.html( t );
				var swfu = GSCM.Swfupload.init( $.extend( default_settings , {
					button_placeholder_id : button_id,
					upload_progress_handler : function( file, bytesLoaded, bytesTotal ){
						var percent = parseInt(bytesLoaded*100/bytesTotal);
						var elfile = GSCM.Uploader.getFileitem( el , file.id );
						GSCM.Progressbar.setPercent( elfile.find('.uiProgressbar') , percent);
					},
					file_queued_handler : function( file ){
						var elfile = GSCM.Uploader.getFileitem( el , file.id );
						if ( elfile.size() == 0 ){
							GSCM.Uploader.addFileitem( el , file );
						}
					},
					upload_start_handler : function(){
						//alert ( 'upload start' );
					},
					upload_success_handler : function( file, server_data, receivedResponse ){
						var elfile = GSCM.Uploader.getFileitem( el , file.id );
						GSCM.Progressbar.setPercent(elfile.find('.uiProgressbar'),100);
						elfile.addClass("uploadSuccess");
						var data = GSCM.fn.json_decode( server_data );
						if ( data && data.code ){
							elfile.find('.fcode').val( data.code );
						}
					},
					upload_error_handler : function( file , err_code , err_msg ){
						//alert ( 'upload error: '+err_msg );
					},
					file_queue_error_handler : function( file , err_code , err_msg ){
						if ( err_code == SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT ){
							alert ( LANG['UPLOAD_FILES_SIZE_LIMIT'] );
						}
						else if ( err_code == SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED ){
							alert ( LANG['UPLOAD_FILES_EXCEEDS_LIMIT'] );
						}
						else if ( err_code == SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE ){
							alert ( LANG['UPLOAD_ZERO_BYTE'] );						
						}
						else if ( err_code == SWFUpload.QUEUE_ERROR.INVALID_FILETYPE ){
							alert ( LANG['UPLOAD_FILESTYPE_INVALID'] );						
						}
					},
					multiple : default_settings.multiple
				}));
				//GSCM.Uploader.addFileitem( el , { id : 'a1', name : '文件.txt', type : '' });
			});
		};
	},
	addFileitem : function( el , file ){
		var t = GSCM.fn.t( GSCM.Uploader._t_fileitem , {
			'type' : 'file',
			'name' : file.name,
			'id' : file.id
		} );
		var el_li = $(t);
		el_li.appendTo( el.find('ul.filelist') );
		el_li.find('.btn_del').click( function(){
			$(this).parent().parent().remove();
		});
	},
	getFileitem : function( el , id ){
		var lis = el.find('.filelist li');
		var ret = $('#404object');
		lis.each(function(){
			if ( id == $(this).find('.fid').val() ){
				ret = $(this);
			}
		});
		return ret;
	}
};



GSCM.ConnectionSearch = {
	_xhr : null,
	_list : null,
	search : function( opts ){
		var settings = $.extend({},{
			q : '',
			search_name : true,
			onSuccess : null
		}, opts);
		
		if ( !GSCM.ConnectionSearch._list ){
			GSCM.ConnectionSearch._request({
				onSuccess : function(){
					GSCM.ConnectionSearch._search(settings);
				}
			});
		}
		else{
			GSCM.ConnectionSearch._search(settings);
		}
	},
	_search : function( opts ){
		var settings = $.extend({},{
			q : '',
			limit : 10,
			search_name : true,
			onSuccess : null
		}, opts);
		var list = [];
		if( settings.q && GSCM.ConnectionSearch._list.length ){
			var i;
			var conn;
			var q = settings.q.toLowerCase();
			var count = 0;
			for( i=0; i<GSCM.ConnectionSearch._list.length; i++ ){
				flag = false;
				conn = GSCM.ConnectionSearch._list[i];
				if ( 	conn['fname'].toLowerCase().indexOf(q)!=-1 || 
						conn['lname'].toLowerCase().indexOf(q)!=-1 || 
						( !settings.search_name && conn['company'].toLowerCase().indexOf(q)!=-1 ) || 
						( !settings.search_name && conn['jobtitle'].toLowerCase().indexOf(q)!=-1 ) || 
						( !settings.search_name && conn['location'].toLowerCase().indexOf(q)!=-1 )
				){
					list.push( conn );
					count ++;
				}
				if ( count == settings.limit ){
					break;
				}
			}
		}
		if ( settings.onSuccess ){
			settings.onSuccess( list );
		}
		return list;
	},
	_request : function( opts ){
		var settings = $.extend({},{
			ac : 'tkc',
			onSuccess : null
		}, opts);
		if ( GSCM.ConnectionSearch._xhr ){
			GSCM.ConnectionSearch._xhr.abort();
			GSCM.ConnectionSearch._xhr = null;
		}
		GSCM.ConnectionSearch._xhr = Ajax.fn.request({
			data : {
				ac : settings.ac
			},
			onSuccess : function( ret ){
				GSCM.ConnectionSearch._list = ret.data;
				if ( settings.onSuccess ){
					settings.onSuccess();
				}
			},
			onComplete : function(){
			}
		});
	}
};



GSCM.Namecard = {
	_cache : {},
	_xhr : null,
	show : function( opts ){
		var settings = $.extend({},{
			id : 0,
			el : null,
			left : 0,
			top : 0,
			onShow : null,
			onComplete : null
		}, opts);
		if ( !settings.id || !settings.el ){
			return false;
		}
		var cache = null;
		var i=0;
		if ( GSCM.Namecard._cache['u'+settings.id] ){
			cache = GSCM.Namecard._cache['u'+settings.id];
		}
		if ( cache ){
			GSCM.Namecard._show( settings , cache );
		}
		else{
			if ( GSCM.Namecard._xhr ){
				GSCM.Namecard._xhr.abort();
				GSCM.Namecard._xhr = null;
			}
			GSCM.Namecard._xhr = Ajax.fn.request({
				data : {
					ac : 'nc',
					id : settings.id
				},
				onSuccess : function( ret ){
					GSCM.Namecard._show( settings , ret );
				}
			});
		}
	},
	_show : function( settings , ret ){
		GSCM.Namecard._cache['u'+settings.id] = ret;
		var el = $(ret.data);
		var cards = $('.namecard');
		$('.namecard').fadeOut('fast',function(){
			$(this).remove();
		});
		var top = settings.top;
		var left = settings.left;
		if ( left > 850 ){
			left = 850;
		}
		else if ( left < 0 ){
			left = 0;
		}
		if ( top < 0 ){
			top = 0;
		}
		el.hide().css({
			'top' : top+'px',
			'left' : left+'px'
		}).appendTo($('body')).fadeIn('fast');
		bind_linku_about();
		bind_follow( el );
		el.find('.btn_newmsg').click( bind_newmsg );
		el.hover( function(){
			el.addClass('hover1');
		},function(){
			el.removeClass('hover1');
			setTimeout(function(){
				if ( !el.hasClass('hover1') && !el.hasClass('hover2') ){
					el.fadeOut('fast',function(){
						$(this).remove();
					});
				}
			},300);
		});
		if ( settings.onShow ){
			settings.onShow( el );
		}
		if ( settings.onComplete ){
			settings.onComplete( el );
		}
	},
	getById : function( id ){
		if ( id ){
			return $('.namecard'+id);
		}
		else{
			return $('.namecard_notexist');
		}
	}
};



GSCM.ContextualDialog = {
	_t : '<div class="uiContextualDialogPositioner uiContextualDialogBelow"><div class="uiOverlay uiContextualDialog uiOverlayArrowTop"><div class="uiOverlayContent"><div class="uiContextualDialogContent"></div></div><i class="uiOverlayArrow" style="left: 15px;"></i></div></div>',
	_t_loading : '<div class="loading_panel"><i class="loadingIndicator"></i></div>',
	_xhr : null,
	show : function( opts ){
		var settings = $.extend({},{
			id : '',
			ac : '',
			data : {},
			left : 0,
			top : 0,
			width : 0,
			cache : true,		//是否缓存界面数据
			onload : null
		}, opts);
		if ( !settings.ac ){
			return null;
		}
		var el;
		var el_loading;
		var id = settings.id;
		if ( id ){
			el = $('#uiContextualDialog_'+id);
			if ( el.size() <= 0 ){
				el = null;
			}
			else{
				if ( settings.cache == false ){
					el.remove();
					el = null;
				}
			}
		}

		if ( !el ){
			el = $(GSCM.ContextualDialog._t);
			el_loading = $(GSCM.ContextualDialog._t_loading);
			el.css({
				left : settings.left+"px",
				top : settings.top+"px"
			});
			if ( id ){
				el.attr('id','uiContextualDialog_'+id)
			}
			el.find('.uiContextualDialog').css({
				width : settings.width+"px"
			});
			el_loading.appendTo( el.find('.uiContextualDialogContent') );
			el_loading.find('.loadingIndicator').show().css({'display':'inline-block'});
			el.hide().appendTo( $('body') );
			if ( GSCM.ContextualDialog._xhr ){
				GSCM.ContextualDialog._xhr.abort();
				GSCM.ContextualDialog._xhr = null;
			}
			settings.data.ac = settings.ac;
			GSCM.ContextualDialog._xhr = Ajax.fn.request({
				api : 'cd.php',
				data : settings.data,
				onSuccess : function( ret ){
					el_loading.hide();
					$(ret.data).appendTo( el.find('.uiContextualDialogContent') );
					if ( settings.onload ){
						settings.onload( el );
					}
				}
			});
			GSCM.AutoHide.render( el.find('.uiOverlay') , {
				time_waiting : 300,
				onhide : function( el_hide ){
					el_hide.parent().hide();
					el_hide.show();
				}
			});
			el.fadeIn();
		}
		else{
			el.css({
				left : settings.left+"px",
				top : settings.top+"px"
			});
			el.hide().fadeIn();
			if ( settings.onload ){
				settings.onload( el );
			}
		}
	}
};

GSCM.ListSelector = {
	_t : '<div class="uiSelectorMenuWrapper"><div role="menu" class="uiMenu uiSelectorMenu"><ul class="uiMenuInner">{LIST}</ul>{MORE}</div></div>',
	_t_item : '<li class="uiMenuItem uiMenuItemRadio uiSelectorOption {CLASS}" data-value="{DATA}"><a class="itemAnchor" href="javascript:void(0);"><span class="itemLabel fsm">{LABEL}</span></a><input type="hidden" name="{NAME}" value="{VALUE}" class="hidden_data" /></li>',
	_t_add_panel : '<div class="uiTextWrapper"><input type="text" class="inputtext uiPlaceholder txt_add" gplaceholder="{PLACEHOLDER}" /><label class="uiButton" id=""><input type="submit" value="{LABEL_BUTTON}" name="" class="btn_add"></label></div>',
	render : function( els , opts ){
		if ( els && els.size && els.size() > 0 ){
			var settings = $.extend({},{
				onChange : null,
				onAddValue : null
			}, opts);
			els.each(function(){
				var el = $(this);
				var items = el.find('.uiListSelectorItem');
				var html = '';
				items.each( function(){
					var line = $( this );
					
					html = html + GSCM.fn.t( GSCM.ListSelector._t_item , {
						value : line.find('input').is(':checked')?line.find('input').val():"",
						data : line.find('input').val(),
						label : line.find('.label').html(),
						name : line.find('input').attr('name'),
						'class' : (line.find('input').is(':checked')?'checked':'')
					});
				});
				var onChange = settings.onChange;
				if ( el.attr('gscm_onchange') ){
					onChange = el.attr('gscm_onchange');
				}
				var onAddValue = settings.onAddValue;
				if ( el.attr('gscm_onaddvalue') ){
					onAddValue = el.attr('gscm_onaddvalue');
				}
				
				if ( html ){
					var more = '';
					if ( el.attr('gscm_showaddvalue') == "1" ){
						more = more+GSCM.fn.t( GSCM.ListSelector._t_add_panel , {
							'PLACEHOLDER' : LANG['ADD'],
							'LABEL_BUTTON' : LANG['ADD']
						});
					}
					
					var el_t = $(GSCM.fn.t( GSCM.ListSelector._t , {
						'list' : html,
						'more' : more
					}));
					el_t.appendTo( el ).show().css({
						'position' : 'inherit'
					});
					GSCM.Placeholder.render(el_t.find('.txt_add'));
					el_t.find('.txt_add').keypress( function( evt ){
						if( evt.which == 13 ){
							GSCM.ListSelector._addText( el , {
								onAddValue : onAddValue,
								onChange : onChange
							});
						}
					} );
					el_t.find('.btn_add').click( function(){
						GSCM.ListSelector._addText( el , {
							onAddValue : onAddValue,
							onChange : onChange
						} );
					});
					GSCM.ListSelector._renderLine( el_t.find('.uiMenuItem') , {
						onChange : onChange
					} );
					items.remove();
				}
			});
		}
	},
	_renderLine : function( el_line , opts ){
		var settings = $.extend({},{
			onChange : null
		}, opts);
		var onChange = settings.onChange;
		el_line.click( function(){
			if ( $(this).hasClass('checked') ){
				$(this).removeClass('checked');
				$(this).find('input').val('');
			}
			else{
				$(this).addClass('checked');
				$(this).find('input').val( $(this).attr('data-value') );
			}
			$(this).parent().focus();
			var el_base = el_line.findParentByClass('uiListSelector');
			if ( onChange ){
				if ( typeof(onChange) == 'function' ){
					onChange( {
						el : el_base,
						data : GSCM.Ajaxform.getData(el_base),
						cdata : el_base.attr("gscm_customdata")
					});
				}
				else{
					eval(onChange+'({ el : el_base , data: GSCM.Ajaxform.getData(el_base) , cdata : el_base.attr("gscm_customdata") });');
				}
			}
		});
	},
	_addText : function( el , opts ){
		var opts = $.extend({},{
			onAddValue : null,
			onChange : null
		}, opts);
		var _t_add = '';
		var el_txt = el.find('.txt_add');
		if ( el_txt.val() ){
			var flag = GSCM.ListSelector._addLine(el,{
				value : el_txt.val(),
				data : el_txt.val(),
				label : el_txt.val(),
				name : 'gscm_listselector_new[]',
				'class' : 'checked gscm_list_newline'
			});
			if ( flag ){
				if ( opts.onAddValue ){
					if ( typeof( opts.onAddValue ) == 'function' ){
						opts.onAddValue( {
							value : el_txt.val()
						});
					}
					else{
						eval(opts.onAddValue+'({ value : el_txt.val() });');
					}
				}
				if ( opts.onChange ){
					if ( typeof(opts.onChange) == 'function' ){
						opts.onChange( {
							el : el,
							data : GSCM.Ajaxform.getData(el),
							cdata : el.attr("gscm_customdata")
						});
					}
					else{
						eval(opts.onChange+'({ el : el , data: GSCM.Ajaxform.getData(el) , cdata : el.attr("gscm_customdata") });');
					}
				}
				el_txt.val('');
			}
		}
	},
	_addLine : function( el , tdata ){
		tdata  = $.extend({},{
			value : '',
			data : '',
			label : '',
			name : '',
			'class' : ''
		}, tdata);
		var lines = el.find('.uiMenuItem');
		var flag = false;
		lines.each(function(){
			if ( $.trim( $(this).find('.itemLabel').html() ) == $.trim( tdata.label ) ){
				flag = true;
			}
		});
		if ( !flag ){
			var line = $( GSCM.fn.t( GSCM.ListSelector._t_item , tdata ) );
			line.hide().appendTo( el.find('.uiMenuInner') ).fadeIn();
			GSCM.ListSelector._renderLine( line );
			return true;
		}
		else{
			return false;
		}
	}
};





GSCM.AutoHide = {
	_timer_hide : null,
	render : function( els , opts ){
		if ( els && els.size && els.size() > 0 ){
			var settings = $.extend({},{
				time_waiting : 1000,
				onhide : null
			}, opts);
			els.each(function(){
				var el = $(this);
				el.hover( function(){
					clearTimeout( GSCM.AutoHide._timer_hide );
					GSCM.AutoHide._timer_hide = null;
				} , function(){
					GSCM.AutoHide._timer_hide = setTimeout( function(){
						el.fadeOut('fast',function(){
							el.hide();
							if ( settings.onhide ){
								settings.onhide( el );
							}
						});
						clearTimeout( GSCM.AutoHide._timer_hide );
						GSCM.AutoHide._timer_hide = null;
					} , settings.time_waiting );
				});
			});
		}
	}
};

