/*!
 * $Id: flib.js 1282 2010-10-14 07:49:36Z Gavin $
 */
(function( w, $ ) {
	var FUI = function(){
		this.user = {}
		this.data = {};
		this.cache = new Array();
		this.cachectrl = new Array();
	};
	FUI.prototype = {
		//~ cache dealing
		getCache:function(key) {
			var d = this.cache[key];
			var t = this.datetime();
			if (d==undefined || t >= d.expires) {
				return '';
			}
			return d;
		},
		setCache:function(key, value) {
			this.cache[key] = value;
		},
		clearCache:function(key) {
			this.cacheDirty(key);
		},
		clearCacheAll:function() {
			this.cache = new Array();
			this.cachectrl = new Array();
		},
		cacheDirty:function(url) {
			var key = hex_md5(url);
			var cd  = this.getCache(key);
			cd.expires = this.datetime();
			this.setCache(key, cd);
		},
				
		//~ util function
		datetime: function() {
			var now = new Date();
			var Y = now.getFullYear();
			var m = now.getMonth()+1;
			var d = now.getDate();
			var H = now.getHours();
			var i = now.getMinutes();
			var s = now.getSeconds();
			if (m<10) m = '0'+m;
			if (d<10) d = '0'+d;
			if (H<10) H = '0'+H;
			if (i<10) i = '0'+i;
			if (s<10) s = '0'+s;
			return ''+Y+'-'+m+'-'+d+' '+H+':'+i+':'+s;
		},
		time: function() {
			var now = new Date();
			return parseInt(now.getTime()/1000);
		},
		
		//~ override jquery ajax method
		ajax:function(options) {
			$.ajax(options);
		},
		load:function(url, data, callback) {
			$.load(url, data, callback);
		},
		get:function(url, data, callback) {
			$.get(url, data, callback);
		},
		getJSON:function(url, data, callback) {
			if (typeof data == 'function') {
				callback = data;
				data = '';
			}
			else {
				data.maxage = data.maxage != undefined ? parseInt(data.maxage) : 900;	//900=15*60
			}
			var key = hex_md5(url);
			var cd  = this.getCache(key);
			if (cd && data.maxage>0) {
				callback(cd);
			}
			else {
				var oThis = this;
				if (this.cachectrl[key] == undefined) {
					this.cachectrl[key] = {ajaxing: 0};
				}
				if (this.cachectrl[key].ajaxing) {
					return;
				}
				this.cachectrl[key].ajaxing = 1;
				$.getJSON(url, data, function(d){
					oThis.setCache(key, d);
					callback(d);
					oThis.cachectrl[key].ajaxing = 0;
				});
			}
		},
		getScript:function(url, callback) {
			$.getScript(url, callback);
		},
		post:function(url, data, callback) {
			if (typeof data == 'function') {
				callback = data;
				data = {};
			}
			$.ajax({
				url: url,
				type:'post',
				data: data,
				dataType: 'json',
				success: function(data){
					callback(data);
				}
			});
		},
		getHash:function() {
			var hash = w.location.hash.trim();
			if (hash) {
				hash = hash.substring(1);
			}else {
				hash = '';
			}
			return hash;
		},
		getYearsOptHtml:function(selVal, yearName) {
			if (selVal==undefined) selVal = '';
			if (yearName==undefined) yearName = '年';
			var num = 100;
			var html='',seleted = '';
			var oDate = new Date();
			var start = oDate.getFullYear();
			var end = start - num;
			for(var i=start; i > end; i--) {
				seleted = '';
				if (i==selVal) {
					seleted = ' selected="selected"';
				}
				html += '<option value="'+i+'"'+seleted+'>'+i+yearName+'</option>';
			}
			return html;	
		},
		getMonthsOptHtml:function(selVal, monthName) {
			if (selVal==undefined) selVal = '';
			if (monthName==undefined) monthName = '月';
			var html='',seleted = '';
			var val = '';
			for(var i=1; i < 13; i++) {
				val = i;
				if (i < 10 ) {
					val = '0'+i;
				}
				seleted = '';
				if (val==selVal) {
					seleted = ' selected="selected"';
				}
				html += '<option value="'+val+'"'+seleted+'>'+val+monthName+'</option>';
			}
			return html;	
		},
		getDaysOptHtml:function(year, month, selVal, dayName) {
			if (selVal==undefined) selVal = '';
			if (dayName==undefined) dayName = '日';
			var html='',seleted = '';
			var num = this.getMonthMaxday(year, month);
			var val = '';
			for(var i=1; i <= num; i++) {
				val = i;
				if (i < 10 ) {
					val = '0'+i;
				}
				seleted = '';
				if (val==selVal) {
					seleted = ' selected="selected"';
				}
				html += '<option value="'+val+'"'+seleted+'>'+val+dayName+'</option>';
			}
			return html;	
		},
		isSmoothyear:function(year) {
			return year%100==0 ? (year%400==0?true:false ) : (year%4==0?true:false );
		},
		getMonthMaxday:function(year, month){
			//~ must cast type because switch statement use strict compare: ===
			year = parseInt(year);
			month = parseInt(month);
			var maxday = 31;
			switch(month){
				case 2:
					maxday = this.isSmoothyear(year) ? 29 : 28;
					break;
				case 4: case 6: case 9: case 11:
					maxday = 30;
					break;
				default:					
					maxday = 31; 
			}
			return maxday;
		},
		getLocationHtml:function(parentVal, selVal) {			
			if (w.locadb==undefined) {
				alert('locadb未被载入');
				return '';
			}
			var locadb = w.locadb;
			if (selVal==undefined) selVal = '';
			
			var pos = parentVal.indexOf(':');
			var parentId = parentVal;
			if (pos>0) {
				parentId = parentVal.substring(0,pos);
			}
			pos = selVal.indexOf(':');
			if (pos>0) {
				selVal = selVal.substring(0,pos);
			}
			var html='', seleted='';
			for(var i=0; i < locadb.length; i++) {
				if (locadb[i][2] == parentId) {
					seleted = '';
					if (locadb[i][0]==selVal) {
						seleted = ' selected="selected"';
					}
					html += '<option value="'+locadb[i][0]+':'+locadb[i][1]+'"'+seleted+'>'+locadb[i][1]+'</option>';
				}
			}
			return html;
		},
		addEvent: function(obj, evenTypeName, fn) {
			if (obj.addEventListener) {
				obj.addEventListener(evenTypeName, fn, true);
				return true;
			} else if (obj.attachEvent) {
				return obj.attachEvent("on" + evenTypeName, fn);
			} else {
				return false;
			}
		},
		removeEvent: function(obj, evenTypeName, fn) {
			if (obj.removeEventListener) {
				obj.removeEventListener(evenTypeName, fn, true);
				return true;
			} else if (obj.detachEvent) {
				var r = obj.detachEvent("on" + evenTypeName, fn);
				return r;
			} else {
				alert("Error.");
			}
		},
		getEvent: function(evt) {
			evt = evt ? evt : (window.event ? window.event : null);
			if ($.browser.mozilla) {
				evt.srcElement = evt.target;
				evt.btn = evt.button + 1;
			} else {
				evt.btn = evt.button;
			}
			return evt;
		},
		getPosition: function(obj) {
			var top = 0;
			var left = 0;
			var width = obj.offsetWidth;
			var height = obj.offsetHeight;
			while (obj.offsetParent) {
				top += obj.offsetTop;
				left += obj.offsetLeft;
				obj = obj.offsetParent;
			}
			return {
				"top" : top,
				"left" : left,
				"width" : width,
				"height" : height
			};
		},
		toHidePop: function(evt) {
			evt = F.getEvent(evt);
			source = evt.srcElement;
			if (evt.keyCode == 9)
				F.hidePopDialog();
			while (source.parentNode) {
				if (source.className == "femDialog") {
					return;
				}
				source = source.parentNode;
			}
			F.hidePopDialog();			
		},
		hidePopDialog: function() {
			F.removeEvent(document.body, "keyup", F.toHidePop);
			F.removeEvent(document.body, "mousedown", F.toHidePop);
			var dl = document.getElementById("femDialog");
			if (dl) {
				dl.style.display = "none";
			}
		},
		showFemDialog:function(x, y) {
			var dl = document.getElementById("femDialog");
			if (!dl) {
				dl = document.createElement("div");
				dl.className = "femDialog";
				dl.id = "femDialog";
				document.body.appendChild(dl);
			}
			if (!!window.editorContainerDom)
				window.editorContainerDom.appendChild(dl);
			dl.style.display = "";
			dl.style.left = x + "px";
			dl.style.top = y + "px";
			F.addEvent(w.document.body, "keyup", F.toHidePop);
			F.addEvent(w.document.body, "mousedown", F.toHidePop);
			return dl;
		},
		showFemPanel: function(object,target,targetTips,regen) {
			var bP = this.getPosition(object);
			var pop = this.showFemDialog(bP.left + 1, bP.top + bP.height - 1);
			pop.innerHTML = this.femPanel(target, targetTips, regen);
			pop = null;
		},
		femPanel:function(target, targetTips, regen) {
			if (!regen && this.data.femPanel)
				return this.data.femPanel;
			var faceTable = "";
			var currVal = "";
			for (i = 0; i < 7; i++) {
				faceTable += "<tr>";
				for (var j = 0; j < 15; j++) {
					currVal = 15 * i + j + 100;
					if (parseInt(currVal) < 205) {
						currVal = 'e'+currVal;
						faceTable += '<td><img src="http://cache.f1img.com/em/qq/'
								+ currVal
								+ '.gif" onerror="null" onload="style.visibility=\'visible\';onload=null" onmouseover="this.style.borderColor=\'#366EAE\';" onmouseout="this.style.borderColor=\'#EEF7FF\';" onclick="F.femFillCommand(\''
								+ F.data.femDesc[currVal]
								+ '\',\''+target+'\',\''+targetTips+'\')" '
								+ 'title="'+F.data.femDesc[currVal]+'" width="24" style="visibility:hidden"/></td>';
					}else{
						faceTable += '<td></td>';
					}
				}	
				faceTable += "</tr>";
			}
			faceTable = '<table border="1" cellspacing="0" cellpadding="0" class="femFacePanel">' + faceTable + '</table>';
			this.data.femPanel = faceTable;
			return faceTable;
		},
		femFillCommand:function(em, target, targetTips) {
			var v = $(target).val().trim();
			if (v==targetTips) v='';
			$(target).val(v+'[/'+em+'] ').css('color','#444');
			this.hidePopDialog();
			this.locatePoint(target.substring(1),$(target).val().length);
		},
		locatePoint:function(id, position){
			var aCtrl = document.getElementById(id);
			if (aCtrl.setSelectionRange) {
				setTimeout(function() {aCtrl.setSelectionRange(position, position); aCtrl.focus();}, 0);
			}else if (aCtrl.createTextRange) {
				var textArea=document.getElementById(id);
				var tempText=textArea.createTextRange();
				tempText.collapse(true); 
				tempText.moveStart('character',-1+position);
				tempText.select();
			}
		}
	};
	
	w.F = w.FUI = new FUI();
	w.FDATA = {};
	w.GLOBAL_OPTION = {};
	w.PHP_SITEURL = '';
	w.MAIN_SITEURL = '';
	w.STATIC_SITEURL = '';
	w.emptypurl = '';
	w.F.data.femDesc = {
		//row 1
		'e100': '微笑',
		'e101': '撇嘴',
		'e102': '色',
		'e103': '发呆',
		'e104': '得意',
		'e105': '流泪',
		'e106': '害羞',
		'e107': '闭嘴',
		'e108': '睡',
		'e109': '大哭',
		'e110': '尴尬',
		'e111': '发怒',
		'e112': '调皮',
		'e113': '呲牙',
		'e114': '惊讶',
		//row 2
		'e115': '难过',
		'e116': '酷',
		'e117': '冷汗',
		'e118': '抓狂',
		'e119': '吐',
		'e120': '偷笑',
		'e121': '可爱',
		'e122': '白眼',
		'e123': '傲慢',
		'e124': '饥饿',
		'e125': '困',
		'e126': '惊恐',
		'e127': '流汗',
		'e128': '憨笑',
		'e129': '大兵',
		//row 3
		'e130': '奋斗',
		'e131': '咒骂',
		'e132': '疑问',
		'e133': '嘘...',
		'e134': '晕',
		'e135': '折磨',
		'e136': '衰',
		'e137': '骷髅',
		'e138': '敲打',
		'e139': '再见',
		'e140': '擦汗',
		'e141': '抠鼻',
		'e142': '鼓掌',
		'e143': '糗大了',
		'e144': '坏笑',
		//row 4
		'e145': '左哼哼',
		'e146': '右哼哼',
		'e147': '哈欠',
		'e148': '鄙视',
		'e149': '委屈',
		'e150': '快哭了',
		'e151': '阴险',
		'e152': '亲亲',
		'e153': '吓',
		'e154': '可怜',
		'e155': '菜刀',
		'e156': '西瓜',
		'e157': '啤酒',
		'e158': '篮球',
		'e159': '乒乓',
		//row 5
		'e160': '咖啡',
		'e161': '饭',
		'e162': '猪头',
		'e163': '玫瑰',
		'e164': '凋谢',
		'e165': '示爱',
		'e166': '爱心',
		'e167': '心碎',
		'e168': '蛋糕',
		'e169': '闪电',
		'e170': '炸弹',
		'e171': '刀',
		'e172': '足球',
		'e173': '瓢虫',
		'e174': '便便',
		//row 6
		'e175': '月亮',
		'e176': '太阳',
		'e177': '礼物',
		'e178': '拥抱',
		'e179': '强',
		'e180': '弱',
		'e181': '握手',
		'e182': '胜利',
		'e183': '抱拳',
		'e184': '勾引',
		'e185': '拳头',
		'e186': '差劲',
		'e187': '爱你',
		'e188': 'NO',
		'e189': 'OK',
		//row 7
		'e190': '爱情',
		'e191': '飞吻',
		'e192': '跳跳',
		'e193': '发抖',
		'e194': '怄火',
		'e195': '转圈',
		'e196': '磕头',
		'e197': '回头',
		'e198': '跳绳',
		'e199': '挥手',
		'e200': '激动',
		'e201': '街舞',
		'e202': '献吻',
		'e203': '左太极',
		'e204': '右太极'
	};
})(window, jQuery);
