T.extend({
	sequence: function(options) {
		var settings = {
			thread: 4,
			timeout: 5000,
			dataType: "html",
			retry: function() {
				var retry = '<img src="' + baseUrl + '/lib/img/retry.png" onclick="T.sequence.retry(this, \'' + this.handle + '\');" style="cursor: pointer" title="错误，再试一次！" />';
				return [retry, retry, retry];
			},
			data: function(wrap) {
				return {q: encodeURIComponent(wrap.attr("link"))}
			}
		};
		options = $.extend(settings, options);
		
		this.sequence.list = this.sequence.list || {};
		
		return this.sequence.list[options.handle] = {
			options: options,
			process: function(wrap, data, r) {
				var space = wrap.find("td");
				data = typeof data == "string" ? data.split(',') : data;
				for(var i=0, n=this.options.map.length; i < n; i++) {
					if(r)
						space.eq(this.options.map[i]).html("").addClass('loading');
					else
						space.eq(this.options.map[i]).html(data[i]).removeClass('loading');
				}
				
				!r && this.options.plugin && T.sequence[this.options.plugin](this.options.handle, wrap, data);
			},
			recursive: function(wrap, data) {
				data && this.process(wrap, data);
				
				var self = this;
				if(this.options.elms.length > 0) {
					wrap = $( this.options.elms.shift() );
					if(wrap.data(this.options.handle) == 1)
						 return this.recursive();
					wrap.data(self.options.handle, 2);
					$.ajax({
						type: "GET",
						dataType: this.options.dataType,
						url: baseUrl + this.options.url,
						timeout: this.options.timeout,
						cache: false,
						data: this.options.data(wrap),
						success: function(data) {
							wrap.data(self.options.handle, 1);
							self.recursive(wrap, data);
						},
						error: function(XHR, TS) {
							wrap.data(self.options.handle, 0);
							self.recursive(wrap, self.options.retry());
						}
					});
				}
			},
			dispatch: function() {
				for(var i = 0; i < this.options.thread; i++)
					this.recursive();
				return this;
			},
			reinstall: function(args, undefined) {
				var elms = T.cache.elms.get(),
					stat = this.options.elms.length;
				
				for(var i=0, n=elms.length; i < n; i ++) {
					var wrap = $( elms[i] );
					if( wrap.data(this.options.handle) === 0) {
						this.process( wrap, '', true );
						this.options.elms.unshift(elms[i]);
					}
				}
				
				if(!stat) {
					this.dispatch().options.timeout = 5000;
				}
				
				return T.sequence.list;
			}
		};
	}
});

T.sequence.retry = function(img, handle) {
	var elm = $(img).closest("tr"),
		obj = this.list[handle],
		opt = obj.options,
		space = elm.find("td");
	
	for(var i=0, n=opt.map.length; i < n; i++) {
		space.eq(opt.map[i]).html("").addClass("loading");
	}

	if(opt.elms.length) {
		opt.elms.unshift(elm.get(0));
	} else {
		opt.elms = elm.get();
		opt.timeout = 6000;
		obj.recursive();
	}
}

$(function() {
	if(window.finish) {
		
		$.ajaxSetup({"timeout": 5000});
		var a_whois = $("#a_whois"), 
			a_reverse = $("#a_reverse"),
			a_reverse_more = $("#a_reverse_more");
		$.ajax({
			type: "GET",
			url: baseUrl + '/extra/whois/?q=' + window.finish,
			timeout: 8000,
			success: function(data) {
				a_whois.html(data);
			},
			error: function() {
				a_whois.html('查询失败， 请刷新重试。');
			}
		});
		
		if(window.finishIP) {
			$.ajax({
				type: "GET",
				dataType: "json",
				url: baseUrl + '/extra/reverse/?q=' + finishIP,
				timeout: 8000,
				success: function(data) {
					if(data.total > 1) 
						a_reverse_more.show();
					a_reverse.html(data.content);
				},
				error: function() {
					a_reverse.html('<p class="container">查询失败， 请刷新重试。</p>');
				}
			});
		}
		
		T.cache = {
			selms: $("#sList").find("tr"),
			relms: $("#rList").find("tr")
		};
		
		T.sequence({
			handle: "record",
			map: [2],
			url: "/extra/record",
			elms: T.cache.selms.get(),
			dataType: 'json',
			data: function(wrap) {
				return {
					t: wrap.attr("tran"),
					q: window.finish
				}
			}
		}).dispatch();
		
		T.sequence({
			handle: "slinks",
			map: [3],
			url: "/extra/slinks",
			elms: T.cache.selms.get(),
			dataType: 'json',
			data: function(wrap) {
				return {
					t: wrap.attr("tran"),
					q: window.finish
				}
			}
		}).dispatch();
		
		T.sequence({
			handle: "rank",
			map: [2],
			url: "/extra/rank",
			elms: T.cache.relms.get(),
			timeout: 9000,
			dataType: 'json',
			data: function(wrap) {
				return {
					t: wrap.attr("tran"),
					q: window.finish
				}
			}
		}).dispatch();
		T.history("domain", window.finish);
	}
	T.quick("domain");
});
