(function(f) {
	function A(a, c) {
		var b = f.extend({}, B, c);
		return a.each(function() {
			var d = f(this);
			if (!d.hasClass(p)) {
				d.find("." + b.listClass).find("." + b.itemClass).hide();
				d.data(n, u(b, b.initialScale, b.radius));
				for (e in v) {
					d.bind(e + k, d, v[e]);
				}
				d.addClass(p)
			}
		})
	}

	function C(a) {
		var c = f(this),b = f(a.target),d = f.radmenu.container;
		b.hasClass(d.itemClz) || (b = b.closest("." + d.itemClz));
		var g = b.parents("." + d.itemClz).length > 0;
		b = b.index();
		g ? c.radmenu(b) : c.parents("." + d.clz).radmenu(b);
		o(a)
	}

	function o(a) {
		if (f.support.opacity) {
			a.stopPropagation();
		}
		else {
			window.event.cancelBubble = true
		}
	}

	function u(a, c, b) {
		return f.extend({}, a, {radius:b * c})
	}

	function w(a) {
		return parseInt(Math.random() * a)
	}

	function j(a) {
		var c = a.data;
		return{menu:c,opts:c.data(n),raditems:function() {
			return c.find("." + f.radmenu.container.itemClz)
		}}
	}

	function q(a, c, b) {
		if (c == b) {
			b = c - 1;
		}
		var d = f(a.raditems()[c]),g = a.raditems()[b];
		c > b ? d.insertBefore(g) : d.insertAfter(g);
		D(a, c < b)
	}

	function E(a, c) {
		var b = [];
		a.each(function(d) {
			var g = f(this);
			d = r(d, a.length, c);
			var h = "transform:rotate(" + d.angle + "deg); ";
			b.push("<div class='" + f.radmenu.container.itemClz + "' ");
			b.push("style='");
			b.push("position:absolute;display:none;");
			b.push("left:" + d.left + "px;");
			b.push("top:" + d.top + "px;");
			if (c.rotate) {
				for (rot in i.opts) {
					b.push(i.opts[rot] + h);
				}
			}
			b.push("'>");
			b.push(g.html());
			b.push("</div>")
		});
		return b.join("")
	}

	function x(a, c) {
		return 2 * Math.PI * parseFloat(a / c)
	}

	function r(a, c, b, d) {
		var g = b.radius,h = x(a, c);
		h += F(b.angleOffset);
		var l = b.centerX + Math.cos(h) * g;
		g = b.centerY + Math.sin(parseInt(h * 100) / 100) * g;
		a = b.rotate ? b.getRotation(h *
			180 / Math.PI, a, c) : 0;
		c = b.rotate ? x(1, c) * 180 / Math.PI : 0;
		return{left:l,top:g,angle:a,animObj:{left:l,top:g,radrotate:(d == true ? "-=" : "+=") + c}}
	}

	function F(a) {
		return a * Math.PI / 180
	}

	function D(a, c) {
		var b = a.raditems(),d = b.length;
		b.each(function(g) {
			var h = f(this),l = r(g, d, a.opts, c);
			h.animate(l.animObj, a.opts.animSpeed, a.opts.animEasing, function() {
				g == d - 1 && a.opts.afterAnimation(a)
			})
		})
	}

	var k = ".radmenu",n = "options" + k,s = "prevoptions" + k,p = "ui-radmenu-parent",B = {listClass:"list",itemClass:"item",activeItemClass:"active",
		selectEvent:null,onSelect:function() {
		},radius:10,angleOffset:0,centerX:0,centerY:0,animSpeed:500,animEasing:"swing",initialScale:1,scaleAnimSpeed:0,scaleAnimEasing:"swing",scaleAnimOpts:{},onScaleItem:function() {
		},afterAnimation:function() {
		},onShow:function(a) {
			a.show()
		},onHide:function(a) {
			a.hide()
		},onNext:function() {
			return true
		},onPrev:function() {
			return true
		},rotate:false,getRotation:function(a) {
			return a
		}};
	f.radmenu = {container:{html:"<div></div>",css:{position:"relative"},clz:"radial_div",itemClz:"radial_div_item"}};
	f.fn.radmenu = function(a, c) {
		try {
			var b = f(this),d = typeof a;
			if (arguments.length == 0 || d == "object") {
				return A(b, a);
			} else if (d == "string") {
				return a == "items" || a == "opts" ? b.triggerHandler(a + k) : b.trigger(a + k, c || null);
			} else if (d == "number") {
				return b.trigger("select" + k, a)
			}
		} catch(g) {
			return"error : " + g
		}
	};
	var v = {opts:function(a) {
		return j(a).opts
	},show:function(a, c) {
		var b = j(a),d = f.radmenu.container;
		b.menu.find("." + d.clz).remove();
		var g = b.menu.find("." + b.opts.itemClass),h = f(d.html).addClass(d.clz).css(d.css).html(E(g, b.opts));
		g = h.find("." + d.itemClz);
		b.opts.selectEvent != null && g.bind(b.opts.selectEvent, C);
		h.appendTo(b.menu);
		typeof c == "function" ? c(g) : b.opts.onShow(g);
		o(a)
	},hide:function(a) {
		var c = j(a),b = c.menu.find("." + f.radmenu.container.clz);
		c.opts.onHide(b.find("." + f.radmenu.container.itemClz));
		b.remove();
		o(a)
	},select:function(a, c) {
		var b = j(a);
		c = f(b.raditems().get(c));
		c.siblings().removeClass(b.opts.activeItemClass);
		c.addClass(b.opts.activeItemClass);
		b.opts.onSelect(c);
		o(a)
	},next:function(a) {
		a = j(a);
		a.opts.onNext(a) && q(a,
			a.raditems().length - 1, 0)
	},prev:function(a) {
		a = j(a);
		a.opts.onPrev(a) && q(a, 0, a.raditems().length - 1)
	},shuffle:function(a) {
		a = j(a);
		var c = a.raditems().length;
		q(a, w(c), w(c))
	},destroy:function(a) {
		a = j(a);
		a.menu.data(n, null).data(s, null).removeClass(p).unbind(k);
		return a.menu
	},items:function(a) {
		return j(a).raditems()
	},scale:function(a, c) {
		var b = j(a);
		if (c) {
			var d = b.opts;
			a = f.radmenu.container;
			var g = b.menu.data(s);
			g || b.menu.data(s, g = d);
			var h = b.menu.find("." + a.itemClz),l = u(d, c, g.radius);
			b.menu.data(n, l);
			h.each(function(m) {
				var y =
					f(this);
				m = r(m, h.length, l);
				var t = {top:m.top,left:m.left};
				if (typeof d.scaleAnimOpts == "object") {
					t = f.extend({}, d.scaleAnimOpts, t);
				}
				y.animate(t, d.scaleAnimSpeed, d.scaleAnimEasing);
				b.opts.onScaleItem(y, c, m)
			})
		}
		return b.menu
	}},i = {};
	i.attr = undefined;
	i.opts = ["","-webkit-","-moz-","-ms-","-o-"];
	i.cssattrs = ["","Webkit","Moz","ms","O"];
	i.getCSSAttr = function(a) {
		if (this.attr) {
			return this.attr;
		}
		return this.attr = function() {
			for (var c = 0; c < i.cssattrs.length; c++) {
				var b = i.cssattrs[c] + "Transform";
				if (a[0].style[b]) {
					return b
				}
			}
			return"transform"
		}()
	};
	i.getTransformValue = function(a) {
		return jQuery.style(a[0], i.getCSSAttr(a))
	};
	var z = {};
	z.cur = f.fx.prototype.cur;
	f.fx.prototype.cur = function() {
		if (this.prop == "radrotate") {
			var a = f(this.elem);
			if (a = i.getTransformValue(a) || "none") {
				if ((a = a.match(/rotate\(([^)]+)\)/)) && a[1]) {
					return parseFloat(a[1]);
				}
			}
			return 0
		}
		return z.cur.apply(this, arguments)
	};
	f.fx.step.radrotate = function(a) {
		var c = f(a.elem);
		c.css(i.getCSSAttr(c), "rotate(" + a.now + "deg)")
	}
})(jQuery);

