YUE.onDOMReady(function(){

	var params = window.ACParams;

	if (typeof params !== 'object') return;

	var form = get(params.form), target;

	function override(original, builder){
		return function(){
			return builder(original);
		};
	}

	function sendRequest(callback, options){
		options = options || {};
		
		var url = options.url || params.url;
		var data = options.data || params.params || null;
		var method = options.method || params.method || 'GET';

		if (typeof url !== 'string') return;

		data = toQueryString(data);

		data && (url += ((url.indexOf('?') === -1) ? '?' : '&') + data);

		YAHOO.util.Connect.asyncRequest(method, url, {
			success: function(res){
				var response = JSON.decode(res && res.responseText);
				response && callback(response);
			},
			failure: function(){
				form && form.submit();
				redirect();
			},
			timeout: options.timeout || 2000
		}, params.data || null);
	}

	function parseURI(uri){
		uri = uri.split('?');
		var url = uri[0],
			params = uri[1],
			object = {};

		params = params.split('&');

		for (var i = 0, l = params.length; i < l; i++){
			var param = params[i],
				index = param.indexOf('=') + 1,
				value = index ? param.substr(index) : '',
				key = index ? param.substr(0, index - 1) : '';
			key && value && (object[key] = value);
		}

		return {url: url, query: object};
	}

	function toQueryString(object){
		if (!object) return null;

		var queryString = [], value, result;

		for (var key in object){
			value = object[key];
			if (typeof value === 'string'){
				result = key + '=' + value;
				queryString.push(result);
			}
		}
		return queryString.join('&');
	}

	function getElement(selector, filter){
		var el, els = [];
		var match, id, tag, cls, t;
		var expression = /^#[\w-]+$/;
		var combinator = /^(?:#([\w-]+))?\s*([\w-]+|\*)?\.?([\w-]+)?$/;

		if (!selector) return null;

		if (selector.nodeType) return selector;

		if (typeof selector === 'string'){
			if (expression.test(selector)) el = get(selector.slice(1));
			else if (match = combinator.exec(selector)){
				id = get(match[1]);
				tag = match[2];
				cls = match[3];
				if (cls){
					if (!id || selector.indexOf(' ') > -1){
						els = YUD.getElementsByClassName(cls, tag, id);
					} else {
						t = id.className.replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, '');
						if (t.indexOf(cls) > -1) el = id;
					}
				} else if (tag) els = (id || document).getElementsByTagName(tag);
			}
		}

		return el || (filter ? els[0] : els);
	}

	function redirect(url){
		url = url || (target && target.href) || null;
		url && (window.location.href = url);
	}

	function onsubmit(){
		try {
			sendRequest(function(data){
				if (data.result === 'true'){
					var params = data.params;
					if (typeof params === 'object'){
						for (var key in params){
							var value = params[key];
							if (value){
								var input = document.createElement('input');
								input.name = key;
								input.value = value;
								input.type = 'hidden';
								form.appendChild(input);
							}
						}
					}
				}
				form.submit();
			});
		} catch (e){
			form.submit();
		}
	}

	var element = get(params.element);
	element && sendRequest(function(data){
		element.style.display = data.result !== 'true' ? 'none' :'block';
	});

	var flag;
	var handler = params.handler;
	if (typeof handler === 'string') handler = getElement(handler);
	else if (typeof handler === 'object' && 'length' in handler){
		var item, array = handler;
		handler = [];
		for (var i = 0, l = array.length; i < l; i++){ 
			item = getElement(array[i]);
			if (!item) continue;
			if (item.nodeType){
				handler.push(item);
				continue;
			}
			for (var j = 0, k = item.length; j < k; j++){
				if (item[j].nodeType) handler.push(item[j]);
			}
		}
	}
	
	YUE.on(handler, 'click', function(ev){
		YUE.preventDefault(ev);
		if (flag) return;
	
		var element = this, 
			href = element.href;
			
		if (element.form){
			flag = true;
			form = element.form;
			return onsubmit();
		}
		if (element.nodeName.toLowerCase() === 'a'){
			if (!href || /javascript:/i.test(href)) return;
			flag = true;
			target = element;
			sendRequest(function(data){
				if (data.result === 'true'){
					var uri = parseURI(href),
						url = uri.url,
						query = uri.query,
						params = data.params;
					for (var key in params) query[key] = params[key];

					url += ('?' + toQueryString(query));
					return redirect(url);
				}
				redirect(href);
			});
		}
	});

	if (form && !form.submit.nodeName){
		form.submit = override(form.submit, function(original){
			form.submit = original;
			onsubmit();
		});
	}

});
