(function(){
	//indexmodule.js 
	//for TOM index module
	// 2009-2-6
	// qinming@tomonline-inc.com

	isIE = document.all ? true : false;

	function getCookie(name){//取cookies函数
		var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));   
	    if(arr != null) return unescape(arr[2]); return null;   
	  
	}   

	function setCookie(name, value){//两个参数，一个是cookie的名子，一个是值   
		var Days = 365; //此 cookie 将被保存 30 天   
		var exp  = new Date();    //new Date("December 31, 9998");   
		exp.setTime(exp.getTime() + Days*24*60*60*1000);   
		document.cookie = name + "="+ escape(value) + ";expires=" + exp.toGMTString();   
	}
	
	if(typeof $ == 'undefined'){
		$ = function(id){
			return ("string" == typeof id) ? document.getElementById(id) : id;
		}
	};
	
	var Each = function(list, fun){
		for (var i = 0, len = list.length; i < len; i++) { fun(list[i], i); }
	};
	
	var Bind = function(object, func){
		return function(){
			return func.apply(object, arguments);
		}
	};
	
	TOMIndexModule = {
		init: function(config){
			this.config = config;
			this.config.listLen = this.config.defaultConfig.length;
			
			//this.modDefaultCookieArray = [];
			this.mDC = this.config.defaultConfig; // 默认的设置
			this.mCC = []; //cookie中的设置  Cookie Config
			this.mUC = []; //改变中的设置 User Config
		
			//check if first time visit
			var first = getCookie(this.config.sFirstCookieName);
			if(first == null){
				this.toggle(this.config.modulePanelId, 1);
				setCookie(this.config.sFirstCookieName, 1)
			}else{
				this.toggle(this.config.modulePanelId, 0);
			}
			
			var mod_cookie = getCookie(this.config.sCookieName);
			if(mod_cookie != null){
				var t = this.configUnserialize(mod_cookie);
				if(t.length != this.mDC.length){ //页面 已更改了模块配置 重新设置cookie
					this.configCopy(this.mCC, this.mDC);
					setCookie(this.config.sCookieName, this.configSerialize(this.mCC));
				}else{
					this.mCC = t;
				}
			}else{
				this.configCopy(this.mCC, this.mDC);
				setCookie(this.config.sCookieName, this.configSerialize(this.mCC));
			}
			
			this.configCopy(this.mUC, this.mCC);
			
			$(this.config.btnModulePanel).onclick = Bind(this, function(){
				this.toggle(this.config.modulePanelId);
			});
			
			$(this.config.btnModuleSave).onclick = Bind(this, function(){
				this.save();
				this.toggle(this.config.modulePanelId, 0);
			});
			
			$(this.config.btnModuleCancel).onclick = Bind(this, function(){
				this.cancel();
				this.toggle(this.config.modulePanelId, 0);
			});
			
			$(this.config.btnModuleReset).onclick = Bind(this, function(){
				this.reset();
				this.toggle(this.config.modulePanelId, 0);
			});
			
			//init list
			this.initList(this.mUC);
			this.reload();
		},
		
		initList: function(list){
			//init list
			var ul = $(this.config.modulePanelId).getElementsByTagName('ul')[0];
			for(i = 0; i < this.config.listLen; i++){
				var li = document.createElement('li');
				var input = document.createElement('input');
				input.type = "checkbox";
				input.id = this.config.moduleCbPrefix + list[i].id;

				if(list[i].show == 1){
					input.checked = true;
				}

				oThis = this;
				input.onclick = function(){
					/(\d+)/.test(this.id);
					var id = parseInt(RegExp.$1);
					for(var i = 0; i < list.length; i++){
						if(oThis.mUC[i].id == id){
							oThis.mUC[i].show = oThis.mUC[i].show ^ 1;
						}
					}
				};
				li.appendChild(input);
				li.appendChild(document.createTextNode(list[i].title));
				ul.appendChild(li);
			}
			
			if(isIE){ // fix IE checkbox display 
				for(i = 0; i < this.config.listLen; i++){
					if(list[i].show == 1){
						$(this.config.moduleCbPrefix + list[i].id).checked = true;
					}
				}
			}
		},
		
		configCopy: function(dst, src){
			//dst.clear();
			dst.length = 0;
			for(var i = 0; i < src.length; i++){
				var a = {};
				a.id = src[i].id;
				a.show = src[i].show;
				a.title = src[i].title;
				dst.push(a);
			}
		},
		
		configSerialize: function(config){
			var a = [];
			Each(config, function(o){
				a.push(o.id + ':' + o.show + ':' + o.title);
			});
			return a.join('|');
		},
		
		configUnserialize: function(configString){
			var a = configString.split('|');
			var r = [];
			Each(a, function(o, i){
				var tmp = o.split(':');
				var it = {};
				it.id = parseInt(tmp[0]);
				it.show = parseInt(tmp[1]);
				it.title = tmp[2];
				a[i] = it;
			});
			return a;
		},
		
		toggle: function(){
			var toggleobject = ("string" == typeof arguments[0]) ? $(arguments[0]) : arguments[0];
			if(arguments.length == 2){
				var bStatus = arguments[1];
				if(parseInt(bStatus) == 1){
					toggleobject.style.display = 'block';
				}
				else{
					toggleobject.style.display = 'none';
				}
			}else{
				if(toggleobject.style.display == 'none')
					toggleobject.style.display = 'block';
				else
					toggleobject.style.display = 'none';
			}
		},
		
		setDisplay: function(toggleobject, show){
			switch(show){
				case 1:
					toggleobject.style.display = 'inline';
					break;
				case 0:
					toggleobject.style.display = 'none';
			}
		},
		
		reset: function(){
			this.clear();
			this.initList(this.mDC);
			this.configCopy(this.mCC, this.mDC);
			this.configCopy(this.mUC, this.mDC);
			setCookie(this.config.sCookieName, this.configSerialize(this.mCC));
			this.reload();
		},
		
		save: function(){
			this.configCopy(this.mCC, this.mUC);
			this.clear();
			this.initList(this.mCC);
			setCookie(this.config.sCookieName, this.configSerialize(this.mCC));
			this.reload();
		},
		
		cancel: function(){
			this.clear();
			this.initList(this.mCC);
			this.configCopy(this.mUC, this.mCC);
		},
		
		clear: function(){
			var ul = $(this.config.modulePanelId).getElementsByTagName('ul')[0];
			while(ul.firstChild){
				ul.removeChild(ul.firstChild);
			}
		},
		
		reload: function(){ //重新显示HTML
			for(i = 0; i < this.config.listLen; i++){
				this.setDisplay( $(this.config.modulePanelPrefix + this.mCC[i].id), this.mCC[i].show );
			}
		}
	}
	
})();
