//NBA MODULE SETUP SCRIPT
// qinming@tomonline-inc.com
// 2008-10-28
//

//window.onload = function(){ alert('onload'); }

//var isIE = document.all ? true : false;
//var nbamodClass = null;

if(typeof $ == 'undefined'){
	var $ = function(id){
		return ("string" == typeof id) ? document.getElementById(id) : id;
	}
};

if(typeof Class == 'undefined'){
	var Class = {
		create: function(){
			return function(){
				return this.initialize.apply(this, arguments);
			}
		}
	};
}


var Bind = function(object, func){
	return function(){
		return func.apply(object, arguments);
	}
};

var Extend = function(destination, source){
	for(var p in source){
		destination[p] = source[p];
	}
};


var Each = function(list, fun){
	for (var i = 0, len = list.length; i < len; i++) { fun(list[i], i); }
};

Extend(Array.prototype, {
	clear: function(){
		this.length = 0;
		return this;
	}
});

/*
dome Ready by qinming@tomonline-inc.com

usage:
  var dr = new domReady();
  dr.register(fnInit);
  //... register other init functions 
  dr.init();


*/
var domReady = Class.create();

domReady.prototype = {
	initialize: function(){
		this.initfuncs = [];
		if(window.onload != null){
			var oldLoad = window.onload;
			this.initfuncs.push(oldLoad);
		}
	},
	
	register: function(func){
		if("function" == typeof func){
			this.initfuncs.push(func);
		}else{
			alert( 'registering function: ' + func + "' is not a function");
		}
	},
	
	init: function(){
		window.onload = Bind(this, function(){
			for(var i = 0; i < this.initfuncs.length; i++)
				this.initfuncs[i].call();
		});
	}
};


var NBAModPage = {
	_init_nba_mod: function(){
		this.NBAModClass = new NBAMod(NBAModPage.opts);
	},
	
	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';
		}
	},

	optCopy: function(dst, src){
		dst.clear();
		for(var i = 0; i < src.length; i++){
			var a = {};
			a.id = src[i].id;
			a.display = src[i].display;
			dst.push(a);
		}
	},
	
	optSerialize: function(opt){
		var a = [];
		Each(opt, function(o){
			a.push(o.id + ':' + o.display);
		});
		return a.join('|');
	},
	
	optUnserialize: function(optString){
		var a = optString.split('|');
		var r = [];
		Each(a, function(o, i){
			var tmp = o.split(':');
			var it = {};
			it.id = parseInt(tmp[0]);
			it.display = parseInt(tmp[1]);
			a[i] = it;
		});
		return a;
	}
}
		
var NBAMod = Class.create();

NBAMod.prototype = {
	initialize: function(opts){
	
		this.setOpts(opts);
		this.modDefaultCookieArray = [];
		this.modCookieArray = [];
		this.modSetupChangeArray = [];
		
		NBAModPage.optCopy(this.modDefaultCookieArray, this.opts.modDefaultConfig);
		NBAModPage.optCopy(this.modSetupChangeArray, this.opts.modDefaultConfig);
		
		var mod_cookie = getCookie(this.opts.sCookieName);
		if(mod_cookie != null){
			this.modCookieArray = NBAModPage.optUnserialize(mod_cookie);
		}else{
			this.modCookieArray = this.opts.modDefaultConfig;
			setCookie(this.opts.sCookieName, NBAModPage.optSerialize(this.modCookieArray));
		}
		
		NBAModPage.optCopy(this.modSetupChangeArray, this.modCookieArray);
		
		$('nbamod_addmore').onclick = function(){ NBAModPage.toggle('modsetupdiv'); };
		
		$('nbamodsetup_btn_save').onclick = Bind(this, function(){ 
			NBAModPage.optCopy(this.modCookieArray, this.modSetupChangeArray);
			setCookie(this.opts.sCookieName, NBAModPage.optSerialize(this.modCookieArray));
			this.reloadMod();
			this.reloadModSetup();
			alert('設置已保存！');
			$('nbamodsetup_btn_cancel').click();
		}); 
		
		$('nbamod_reset').onclick = Bind(this, function(){
			if(confirm("確認恢復默認設置？")){
				NBAModPage.optCopy(this.modSetupChangeArray, this.modDefaultCookieArray);
				NBAModPage.optCopy(this.modCookieArray, this.modDefaultCookieArray);
				
				setCookie(this.opts.sCookieName, NBAModPage.optSerialize(this.modCookieArray));
				this.reloadModSetup();
				this.reloadMod();
				alert('已恢復默認設置！');
			}
		}); 
		
		$('nbamodsetup_btn_cancel').onclick = Bind(this, function(){
			NBAModPage.optCopy(this.modSetupChangeArray, this.modCookieArray);
			this.reloadModSetup();
			NBAModPage.toggle('modsetupdiv');
		});
		
		oThis = this;
		for(var x = 0; x < this.modSetupChangeArray.length; x++){
			var id = this.modSetupChangeArray[x].id;
			var itemId = this.opts.sModIdSetupPattern.replace(this.opts.sModIdReplace, id);
		
			$(itemId).onclick = function(){
				/(\d+)/.test(this.id);
				var modsetupid = parseInt(RegExp.$1);
				for(var x = 0; x < oThis.modSetupChangeArray.length; x++){
					var id = oThis.modSetupChangeArray[x].id;
					if(modsetupid == id){
						var itembtn = oThis.opts.sModIdSetupPattern.replace(oThis.opts.sModIdReplace, id);
						oThis.modSetupChangeArray[x].display = oThis.modSetupChangeArray[x].display == 0 ? 1 : 0;
						$(itembtn).className = oThis.modSetupChangeArray[x].display == 1 ? oThis.opts.modCurrentClassName : "";
					}
				}
			};
		};

		this.reloadModSetup();
		this.reloadMod();
	},
	
	setOpts: function(opts){
		this.opts = {
			sCookieName: "tom_nba_mod",
			sModIdPattern: "nba_mod_#ID#", // 模塊id模板
			sModIdReplace: "#ID#",
			sModIdSetupPattern: "nba_mod_setup_#ID#", // 模塊設置id模板
			modCurrentClassName: "current"
		}
		Extend(this.opts, opts || {});
	},
	
	reloadMod: function(){
		for( var index = 0; index < this.modCookieArray.length; index++){
			var n = this.modCookieArray[index].id;
			var id = this.opts.sModIdPattern.replace(this.opts.sModIdReplace, n);
			NBAModPage.toggle(id, this.modCookieArray[index].display);
		}
	},
	
	reloadModSetup: function(b){ // boolean . load deafult or saved status
		for( var index = 0; index < this.modCookieArray.length; index++){
			var n = this.modCookieArray[index].id;
			var id = this.opts.sModIdSetupPattern.replace(this.opts.sModIdReplace, n);
			var arr = this.modCookieArray;
			if(true === b){ // load deafult
				arr = this.modDefaultCookieArray;
			}
			if(parseInt(arr[index].display) == 1)
				$(id).className = this.opts.modCurrentClassName;
			else
				$(id).className = "";
		}
	},
	
	reset: function(){
		setCookie(this.opts.sCookieName, NBAModPage.optSerialize(this.modDefaultCookieArray));
		NBAModPage.optCopy(this.modCookieArray, this.modDefaultCookieArray);
		this.reloadMod();
		this.reloadModSetup(true);
		alert('設置已恢復！');
	},
	
	modCheck: function(s){
		/(\d+)/.test(s);
		var modsetupid = parseInt(RegExp.$1);
		Each(this.modSetupChangeArray, function(o){
			alert(modsetupid + ' ' + o.id);
			if(modsetupid == o.id){
				var itemId = oThis.opts.sModIdSetupPattern.replace(oThis.opts.sModIdReplace, o.id);
				o.display = o.display == 0 ? 1 : 0;
				$(itemId).className = o.display == 1 ? this.opts.modCurrentClassName : "";
			}
		});
	}
};

if("undefined" == typeof getCookie){
	function getCookie(name){
		var sRE = "(?:; )?" + name + "=([^;]*);?";
		var oRE = new RegExp(sRE);
		if(oRE.test(document.cookie)){
			return decodeURIComponent(RegExp.$1);
		}else{
			return null;
		}
	}

	function setCookie(sName, sValue, oExpires, sPath, sDomain, bSecure){
		var sCookie = sName + "=" + encodeURIComponent(sValue);
		if(oExpires)
			sCookie += "; expires=" + oExpires.toGMTString();
		if(sPath)
			sCookie += "; path=" + sPath;
		if(sDomain)
			sCookie += "; domain=" + sDomain;
		if(bSecure)
			sCookie += "; secure";
		document.cookie = sCookie;
	}
}