﻿

(function () {
	var scroll_list = function(option) {
		this.mask = sina.D.$(option.mask) || null;
		this.content = sina.D.$(option.content) || null;
		this.arrLeft = sina.D.$(option.arrLeft) || null;
		this.arrRight = sina.D.$(option.arrRight) || null;
		this.cellWidth = option.cellWidth || null;
		this.speed = option.speed || 10;
		this.playCount = option.playCount || 1;
		this.autoPlay = option.autoPlay || false;
		this.autoPlayTime = option.autoPlayTime || 5;
		this.timers = null;
		this.m_s = 0;
		this.init();
	};
	scroll_list.prototype = {
		move: function(d) {
			var w = this.content.getWidth();
			var m = Math.floor(w/this.cellWidth)/2;
			var s = this.mask.scrollLeft + (this.playCount*this.cellWidth*d);
			if (s > ((m+1)*this.cellWidth)) {
				this.mask.scrollLeft -= m * this.cellWidth;
			}else if (s < 0) {
				this.mask.scrollLeft += m * this.cellWidth;
			}
			this.moving(d);
		},
		moving: function(d) {
			var self = this;
			self.m_s += self.speed;
			if(Math.floor(self.m_s/self.cellWidth) >= self.playCount) {
				self.mask.scrollLeft += (self.speed-(self.m_s-(self.playCount*self.cellWidth)))*d;
				self.m_s = 0;
				return;
			}
			self.mask.scrollLeft += self.speed * d;
			setTimeout(function(){self.moving(d);}, 10);
		},
		auto_play: function() {
			var self = this;
			if(self.timers) {
				clearTimeout(self.timers)
				self.timers = null;
			}
			self.move(1);
			self.timers = setTimeout(function(){self.auto_play();}, self.autoPlayTime*1000);
		},
		set_auto: function(e, obj) {
			var self = this;
			var target = e.relatedTarget || e.toElement;
			if (!obj.contains(target)) {
				if(!self.timers) self.timers = setTimeout(function(){self.auto_play();}, self.autoPlayTime*1000);
			}
		},
		clear_auto: function() {
			var self = this;
			clearTimeout(self.timers);
			self.timers = null;
		},
		init: function() {
			var self = this;
			self.arrLeft.addListener("click", function(){self.move(1);});
			self.arrRight.addListener("click", function(){self.move(-1);});
			self.content.innerHTML += self.content.innerHTML;
			var n = self.content.$T("li").length;
			self.content.setWidth(n * self.cellWidth);
			self.playCount = self.playCount > Math.floor(n/4) ? Math.floor(n/4) : self.playCount;
			self.mask.scrollLeft = 0;
			if(self.autoPlay) {
				setTimeout(function(){self.auto_play();}, self.autoPlayTime*1000);
				self.content.onmouseout = function(e) {
					e = e || window.event;
					self.set_auto(e, this);
				};
				self.arrLeft.onmouseout = function(e) {
					e = e || window.event;
					self.set_auto(e, this);
				};
				self.arrRight.onmouseout = function(e) {
					e = e || window.event;
					self.set_auto(e, this);
				};
				self.content.onmouseover = function() {
					self.clear_auto();
				};
				self.arrLeft.onmouseover = function() {
					self.clear_auto();
				};
				self.arrRight.onmouseover = function() {
					self.clear_auto();
				};
			}
		}
	};
	sina.D.set_ns("sina.D.scroll_list", scroll_list);
	
	var tab = function(option) {
		this.tabs = sina.D.$(option.tabs) || null;
		this.view = sina.D.$(option.view) || null;
		this.action = option.action || "mouseover";
		this.handler = option.func || null;
		this.tabsArray = new Array();
		this.viewArray = new Array();
		this.init();
	};
	tab.prototype = {
		active: function(t) {
			var n = this.tabsArray.length;
			var m = this.viewArray.length;
			if(n == m) {
				for(var i=0;i<n;i++) {
					var _tab = this.tabsArray[i];
					var _view = this.viewArray[i];
					_tab.setClass("");
					_view.hide();
					if(t.getAttribute("tab") == _view.getAttribute("tab")) _view.show();
				}
			}else {
				for(var i=0;i<n;i++) {
					var _tab = this.tabsArray[i];
					_tab.setClass("");
				}
				if(this.handler) this.handler(t);
			}
			t.setClass("active");
		},
		init: function() {
			var self = this;
			if(this.tabs) {
				var _tabs = this.tabs.$T("*");
				var n = _tabs.length;
				for(var i=0;i<n;i++) {
					if(_tabs[i].getAttribute("tab")) {
						_tabs[i].addListener(self.action, function(){self.active(this);}.bindNode(_tabs[i]));
						this.tabsArray.push(_tabs[i]);
					}
				}
			}
			if(this.view) {
				var _view = this.view.$T("*");
				var m = _view.length;
				for(var j=0;j<m;j++) {
					if(_view[j].getAttribute("tab")) this.viewArray.push(_view[j]);
				}
			}
			if(this.tabsArray.length > 0) this.active(this.tabsArray[0]);
		}
	};
	sina.D.set_ns("sina.D.tab", tab);
	
	var slide_menu = function(option) {
		this.menu = sina.D.$(option.menu) || null;
		this.speed = option.speed || 20;
		this.expandAuto = option.expandAuto || false;
		this.expandByUrl = option.expandByUrl != false ? true : false;
		this.alwaysExpand = option.alwaysExpand || false;
		this.handler = option.func || null;
		this.expanding = null;
		this.init();
	};
	slide_menu.prototype = {
		show_sub: function(e, _item) {
			var mid = null;
			while(_item && _item != this.menu) {
				if(_item.tagName.toLowerCase() == "li" && _item.getAttribute("mid")) {
					if(_item.getAttribute("mid").indexOf("main_") != -1) {
						mid = _item.getAttribute("mid");
						mid = mid.replace("main", "sub");
						var _sub = this.get_sub_by_mid(mid);
						if(!_sub) return;
						if(e) {
							if(this.expanding && this.expanding != _sub && !this.expanding.contains(_sub)) this.scroll_up(this.expanding);
							this.toggle_sub(e, _sub);
							this.expanding = _sub;
							e = false;
						}else {
							this.toggle_sub(e, _sub);
							this.expanding = _sub;
						}
					}
				}
				_item = _item.parentNode;
			}
		},
		toggle_sub: function(e, sub_menu) {
			var meh = sub_menu.getAttribute("meh");
			var sub_sub = sub_menu.$T("ul");
			var n = sub_sub.length;
			for(var i=0;i<n;i++) {
				if(!sub_sub[i].visible()) meh -= sub_sub[i].getAttribute("meh");
			}
			if(e) {
				sub_menu.visible() ? this.scroll_up(sub_menu) : this.scroll_down(sub_menu, meh);
			}else {
				this.scroll_down(sub_menu, meh);
			}
		},
		scroll_up: function(sub_menu) {
			var self = this;
			var lh = 0;
			var height = sub_menu.getHeight();
			height -= this.speed;
			if(height < 0) {
				lh = height;
				height = 0;
			}
			sub_menu.setHeight(height);
			var sub_p = sub_menu.parentNode;
			while(sub_p && sub_p != this.menu) {
				if(sub_p.tagName.toLowerCase() == "ul" && sub_p.getAttribute("mid")) {
					if(sub_p.getAttribute("mid").indexOf("sub_") != -1) {
						var h = sub_p.getHeight();
						h -= this.speed;
						if(height == 0) h -= (this.speed + lh);
						sub_p.setHeight(h);
					}
				}
				sub_p = sub_p.parentNode;
			}
			if(height > 0) {
				setTimeout(function(){self.scroll_up(sub_menu);}, 20);
			}else {
				sub_menu.hide();
			}
		},
		scroll_down: function(sub_menu, meh) {
			var self = this;
			sub_menu.show();
			var height = sub_menu.getHeight();
			var offsetMove = Math.min(this.speed, (meh - height));
			height += offsetMove;
			sub_menu.setHeight(height);
			if(height < meh) {
				setTimeout(function(){self.scroll_down(sub_menu, meh);}, 5);
			}
		},
		auto_hide: function() {
			if(!this.alwaysExpand) {
				var main_menu = this.menu.$T("ul")[0];
				var menu_sub = main_menu.$T("ul");
				var n = menu_sub.length;
				for(var i=0;i<n;i++) {
					menu_sub[i].hide();
					menu_sub[i].setHeight(0);
				}
			}
		},
		init_sub: function(sub_menu, i) {
			sub_menu.setAttribute("mid", "sub_" + i);
			var meh = sub_menu.getHeight();
			var sub_sub = sub_menu.$T("ul");
			var n = sub_sub.length;
			for(var i=0;i<n;i++) {
				if(!sub_sub[i].visible()) meh -= sub_sub[i].getHeight();
			}
			sub_menu.setAttribute("meh", meh);
		},
		get_sub_by_mid: function(mid) {
			var menu_sub = this.menu.$T("ul");
			var n = menu_sub.length;
			for(var i=0;i<n;i++) {
				if(menu_sub[i].getAttribute("mid") == mid) return menu_sub[i];
			}
			return null;
		},
		expand_auto: function() {
			if(this.expandAuto) {
				var menu_item = this.menu.$T("li");
				var n = menu_item.length;
				for(var i=0;i<n;i++) {
					if(menu_item[i].getAttribute("auto") == "true") {
						this.show_sub(false, menu_item[i]);
						return;
					}
				}
			}
		},
		expand_by_url: function() {
			var _a = this.menu.$T("a");
			var n = _a.length;
			for(var i=0;i<n;i++) {
				var _href = _a[i].getAttribute("href");
				if(location.href.indexOf(_href) != -1 && _href.indexOf("#") < _href.length-1) {
					var _item = _a[i].parentNode;
					while(_item && _item != this.menu) {
						if(_item.tagName.toLowerCase() == "li" && _item.getAttribute("mid")) {
							this.show_sub(false, _item);
							return;
						}
						_item = _item.parentNode;
					}
				}
			}
		},
		init: function() {
			var self = this;
			this.menu.style.visibility = "visible";
			var main_menu = this.menu.$T("ul")[0];
			var menu_item = main_menu.$T("li");
			var n = menu_item.length;
			for(var i=0;i<n;i++) {
				var _item = menu_item[i];
				if(_item.tagName.toLowerCase() == "li"){
					var _a = _item.$T("a")[0];
					var _href = _a.getAttribute("href");
					if(_href.substr(_href.length-1,1) == "#") _a.setAttribute("href", "javascript:void(null)");
					_a.onfocus = function() {
						this.blur();
					};
					var sub_menu = _item.$T("ul");
					if(sub_menu.length > 0) {
						this.init_sub(sub_menu[0], i);
						_item.setAttribute("mid", "main_" + i);
						_a.onclick = function() {
							if(!self.alwaysExpand) self.show_sub(true, this);
						};
					}else {
						_a.onclick = function() {
							if(self.handler) self.handler(this);
						};
					}
				}
			}
			this.auto_hide();
			if(this.expandAuto) {
				this.expand_auto();
			}
			if(this.expandByUrl) {
				this.expand_by_url();
			}
		}
	};
	sina.D.set_ns("sina.D.slide_menu", slide_menu);
	
	var tip = function(option) {
		this.container = sina.D.$(option.container) || null;
		this.tipStyle = option.tipStyle || null;
		this.tipType = option.tipType != "active" ? "static" : "active";
		this.handler = option.func || null;
		this.container = !this.container ? document : this.container;
		this.tipDiv = sina.D.$$("div");
		this.init();
	};
	tip.prototype = {
		show: function(o,e) {
			this.tipDiv.updateHtml("");
			if(this.tipType == "static") {
				this.tipDiv.updateHtml(o.getAttribute("tip"));
			}else {
				if(this.handler) this.tipDiv.updateHtml(this.handler(o));
			}
			this.tipDiv.show();
			this.set_pos(e);
		},
		hide: function(e) {
			e = e || window.event;
			var source = e.target || e.srcElement;
			var target = e.relatedTarget || e.toElement;
			if (!source.contains(target)) {
				this.tipDiv.hide();
			}
		},
		set_pos: function(e) {
			e = e || window.event;
			var x = e.x ? e.x : e.pageX;
			var y = e.y ? (e.y + sina.D.getScroll()) : e.pageY;
			var w = document.documentElement.clientWidth;
			var h = document.documentElement.clientHeight + sina.D.getScroll();
			if((x + this.tipDiv.getWidth()) > w) {
				x -= this.tipDiv.getWidth();
			}else {
				x += 10;
			}
			if((y + this.tipDiv.getHeight()) > h) {
				y -= this.tipDiv.getHeight();
			}else {
				y += 15;
			}
			this.tipDiv.setPosition(x, y);
		},
		init: function() {
			var self = this;
			var tip_nodes = this.container.$T("*");
			var n = tip_nodes.length;
			for(var i=0;i<n;i++) {
				if(tip_nodes[i].getAttribute("tip")) {
					tip_nodes[i].addListener("mouseover", function(e){self.show(this,e);}.bindNode(tip_nodes[i]));
					tip_nodes[i].addListener("mouseout", function(e){self.hide(e);});
					tip_nodes[i].addListener("mousemove", function(e){self.set_pos(e);});
				}
			}
			this.tipDiv.setClass(this.tipStyle);
			this.tipDiv.style.position = "absolute";
			this.tipDiv.hide();
			document.body.appendChild(this.tipDiv);
		}
	};
	sina.D.set_ns("sina.D.tip", tip);
	
	var sim_select = function(option) {
		this.oSelect = sina.D.$(option.selectId) || null;
		this.activeStyle = option.activeStyle || "active";
		this.handler = option.func || null;
		this.selSelect = null;
		this.selOption = null;
		this.selArray = new Array();
		this.selected = null;
		this.init();
	};
	sim_select.prototype = {
		active: function(t) {
			if(this.selected) this.selected.setClass("");
			t.setClass(this.activeStyle);
			this.selected = t;
		},
		select_it: function(t) {
			this.selSelect.updateHtml(t.getAttribute("title"));
			this.selSelect.setAttribute("value", t.getAttribute("value"));
			this.selOption.hide();
			if(this.handler) this.handler(t.getAttribute("value"));
		},
		show_option: function() {
			var n = this.selArray.length;
			for(var i=0;i<n;i++) {
				var _item = this.selArray[i];
				_item.setClass("");
			}
			this.set_option_position();
			this.selOption.toggle();
		},
		set_option_position: function() {
			var x = this.selSelect.getLeft();
			var y = this.selSelect.getTop();
			var w = this.selSelect.getWidth();
			var h = this.selSelect.getHeight();
			y += h;
			this.selOption.setWidth(w);
			this.selOption.setPosition(x,y);
		},
		sel_blur: function(e) {
			e = e || window.event;
			var source = e.target || e.srcElement;
			if (source != this.selOption && source != this.selSelect && !this.selOption.contains(source)) {
				if(this.selOption.visible()) this.selOption.hide();
			}
		},
		get_obj: function() {
			var _nodes = this.oSelect.$T("*");
			var n = _nodes.length;
			for(var i=0;i<n;i++) {
				if(_nodes[i].getAttribute("type") == "select") {
					this.selSelect = _nodes[i];
				}else if(_nodes[i].getAttribute("type") == "option") {
					this.selOption = _nodes[i];
				}
			}
		},
		init: function() {
			var self = this;
			this.get_obj();
			if(this.selSelect && this.selOption) {
				var sel_items = this.selOption.$T("li");
				var n = sel_items.length;
				for(var i=0;i<n;i++) {
					var _item = sel_items[i];
					_item.addListener("mouseover", function(){self.active(this);}.bindNode(_item));
					_item.addListener("click", function(){self.select_it(this);}.bindNode(_item));
					this.selArray.push(_item);
					if(_item.getAttribute("selected") == "selected") {
						this.selSelect.updateHtml(_item.getAttribute("title"));
						
					}
				}
				this.selSelect.style.cursor = "pointer";
				this.selOption.style.position = "absolute";
				this.selOption.hide();
				this.selSelect.addListener("click", function(){self.show_option();});
				document.addListener("mousedown", function(e){self.sel_blur(e);});
			}
		}
	};
	sina.D.set_ns("sina.D.sim_select", sim_select);
	
	var note = function(option) {
		this.oNote = sina.D.$(option.area) || null;
		this.height = option.lineHeight || 15;
		this.count = option.displayCount || 1;
		this.delay = option.delay || 5;
		this.delay = this.delay * 1000;
		this.interval = new Array();
		this.oHeight = this.height * this.count;
		this.init();
	};
	note.prototype = {
		start: function() {
			var self = this;
			if(this.oNote.scrollHeight - this.oHeight <= this.oNote.scrollTop) {
				this.oNote.scrollTop = this.oNote.scrollHeight / 2 - this.oHeight;
			}
			this.clear_interval(1);
			this.interval[1] = setInterval(function(){self.scroll_note();}, 5);
		},
		scroll_note: function() {
			this.oNote.scrollTop++;
			if(this.oNote.scrollTop % this.oHeight == 0) {
				this.clear_interval(1);
			}
		},
		set_interval: function() {
			var self = this;
			this.interval[0] = setInterval(function(){self.start();}, this.delay);
		},
		clear_interval: function(i) {
			clearInterval(this.interval[i]);
		},
		init: function() {
			var self = this;
			this.oNote.innerHTML += this.oNote.innerHTML;
			this.oNote.setHeight(this.oHeight);
			this.oNote.style.overflow = "hidden";
			this.oNote.style.padding = "0px";
			this.oNote.scrollTop = 0;
			if(this.oNote.scrollHeight > this.oHeight) {
				this.oNote.addListener("mouseover", function(){self.clear_interval(0);});
				this.oNote.addListener("mouseout", function(){self.set_interval();});
				this.set_interval();
			}
		}
	};
	sina.D.set_ns("sina.D.note", note);
	
	var spread = function(option) {
		this.oNote = sina.D.$(option.area) || null;
		this.tHeight = option.tHeight || 25;
		this.activeStyle = option.activeStyle || "active";
		this.autoRetract = option.autoRetract || false;
		this.firstExpand = option.firstExpand || false;
		this.itemArray = new Array();
		this.init();
	};
	spread.prototype = {
		active: function(o) {
			if(o.getAttribute("state") == "retract") {
				this.expand(o);
			}else if(o.getAttribute("state") == "expand") {
				this.retract(o);
			}
		},
		expand: function(o) {
			if(this.autoRetract) {
				var n = this.itemArray.length;
				for(var i=0;i<n;i++) {
					this.retract(this.itemArray[i]);
				}
			}
			o.setHeight(o.getAttribute("eh"));
			o.setAttribute("state", "expand");
			o.addClass(this.activeStyle);
		},
		retract: function(o) {
			o.setHeight(this.tHeight);
			o.setAttribute("state", "retract");
			o.delClass(this.activeStyle);
		},
		init: function() {
			var self = this;
			var _item = this.oNote.$T("*");
			var n = _item.length;
			for(var i=0;i<n;i++) {
				if(_item[i].getAttribute("spr")) {
					_item[i].addListener("click", function(){self.active(this);}.bindNode(_item[i]));
					_item[i].setAttribute("eh", _item[i].getHeight());
					_item[i].style.overflow = "hidden";
					this.itemArray.push(_item[i]);
					if(!this.firstExpand) {
						this.retract(_item[i]);
						_item[i].setAttribute("state", "retract");
					}else {
						_item[i].setAttribute("state", "expand");
						_item[i].addClass(this.activeStyle);
					}
				}
			}
		}
	};
	sina.D.set_ns("sina.D.spread", spread);
	
	var slider = function(option) {
		this.drager = sina.D.$(option.drager) || null;
		this.axle = sina.D.$(option.axle) || null;
		this.arrLeft = sina.D.$(option.arrLeft) || null;
		this.arrRight = sina.D.$(option.arrRight) || null;
		this.unitRate = option.unitRate || 0.1;
		this.initRate = option.initRate || 0;
		this.handler = option.func || null;
		this.x0 = 0;
		this.x1 = 0;
		this.xLen = null;
		this.xMin = null;
		this.xMax = null;
		this.rate = 0;
		this.move = false;
		this.init();
	};
	slider.prototype = {
		dragStart: function(o,e) {
			if (!window.captureEvents) {
				o.setCapture();
			}else {
				window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
			}
			this.x0 = e.clientX;
			this.x1 = o.getLeft();
			this.move = true;
		},
		dragIng: function(o,e) {
			if(this.move) {
				var x = this.x1 + e.clientX - this.x0;
				if (x <= this.xMax && x >= this.xMin) {
					o.style.left = this.x1 + e.clientX - this.x0 + "px";
					this.rate = this.get_rate();
				}else if (x > this.xMax) {
					o.style.left = this.xMax + "px";
					this.rate = 1;
				}else if (x < this.xMin) {
					o.style.left = this.xMin + "px";
					this.rate = 0;
				}
				this.action(this.rate);
			}
		},
		dragEnd: function(o) {
			if(this.move) {
				if (!window.captureEvents) {
					o.releaseCapture();
				}else {
					window.releaseEvents(Event.MOUSEMOVE|Event.MOUSEUP);
				}
				this.move = false;
			}
		},
		btn_move: function(d) {
			this.drager.style.left = this.unitRate * this.xLen * d + this.drager.getLeft() + "px";
			if (this.drager.getLeft() > this.xMax) {
				this.drager.style.left = this.xMax + "px";
			}else if (this.drager.getLeft() < this.xMin) {
				this.drager.style.left = this.xMin + "px";
			}
			this.rate = this.get_rate();
			this.action(this.rate);
		},
		go_site: function(r) {
			this.drager.style.left = r * this.xLen + this.xMin + "px";
			if (this.drager.getLeft() > this.xMax) {
				this.drager.style.left = this.xMax + "px";
			}else if (this.drager.getLeft() < this.xMin) {
				this.drager.style.left = this.xMin + "px";
			}
			this.rate = this.get_rate();
			this.action(this.rate);
		},
		action: function(r) {
			r = Math.round(r * 100) / 100;
			if(this.handler) this.handler(r);
		},
		get_rate: function() {
			var rate = (this.drager.getLeft() - this.xMin) / this.xLen;
			return rate;
		},
		init: function() {
			var self = this;
			this.xLen = this.axle.getWidth() - this.drager.getWidth();
			this.xMin = this.axle.getLeft();
			this.xMax = this.xMin + this.xLen;
			this.arrLeft.addListener("click", function(){self.btn_move(-1);});
			this.arrRight.addListener("click", function(){self.btn_move(1);});
			this.drager.onmousedown = function(e) {
				e = e || window.event;
				self.dragStart(this,e);
			};
			document.addListener("mousemove", function(e) {
				e = e || window.event;
				self.dragIng(self.drager,e);
			});
			document.addListener("mouseup", function(e) {
				e = e || window.event;
				self.dragEnd(self.drager);
			});
			this.go_site(this.initRate);
		}
	};
	sina.D.set_ns("sina.D.slider", slider);
})();




















