(function ($, undefined){
var uuid = 0, slice = Array.prototype.slice, _cleanData = $.cleanData;
$.cleanData = function (elems){
for (var i = 0, elem;
(elem = elems[i]) != null ; i++ ){
try {
$(elem).triggerHandler("remove");
}
catch (e) {
}
}
_cleanData(elems);
}
;
$.widget = function (name, base, prototype){
var fullName, existingConstructor, constructor, basePrototype, proxiedPrototype = {
}
, namespace = name.split(".")[0];
name = name.split(".")[1];
fullName = namespace + "-" + name;
if (!prototype) {
prototype = base;
base = $.Widget;
}
$.expr[":"] [fullName.toLowerCase()] = function (elem){
return !!$.data(elem, fullName);
}
;
$[namespace] = $[namespace] || {
}
;
existingConstructor = $[namespace][name];
constructor = $[namespace][name] = function (options, element){
if (!this._createWidget) {
return new constructor(options, element);
}
if (arguments.length) {
this._createWidget(options, element);
}
}
;
$.extend(constructor, existingConstructor, {
version: prototype.version,
_proto: $.extend({
}
, prototype),
_childConstructors: [] }
);
basePrototype = new base();
basePrototype.options = $.widget.extend({
}
, basePrototype.options);
$.each(prototype, function (prop, value){
if (!$.isFunction(value)) {
proxiedPrototype[prop] = value;
return ;
}
proxiedPrototype[prop] = (function (){
var _super = function (){
return base.prototype[prop].apply(this, arguments);
}
, _superApply = function (args){
return base.prototype[prop].apply(this, args);
}
;
return function (){
var __super = this._super, __superApply = this._superApply, returnValue;
this._super = _super;
this._superApply = _superApply;
returnValue = value.apply(this, arguments);
this._super = __super;
this._superApply = __superApply;
return returnValue;
}
;
}
)();
}
);
constructor.prototype = $.widget.extend(basePrototype, {
widgetEventPrefix: existingConstructor? basePrototype.widgetEventPrefix: name}
, proxiedPrototype, {
constructor: constructor,
namespace: namespace,
widgetName: name,
widgetFullName: fullName}
);
if (existingConstructor) {
$.each(existingConstructor._childConstructors, function (i, child){
var childPrototype = child.prototype;
$.widget(childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto);
}
);
delete existingConstructor._childConstructors;
}
else {
base._childConstructors.push(constructor);
}
$.widget.bridge(name, constructor);
}
;
$.widget.extend = function (target){
var input = slice.call(arguments, 1), inputIndex = 0, inputLength = _AN_Read_length("length", input), key, value;
for (; inputIndex < inputLength; inputIndex++ ){
for (key in input[inputIndex]){
value = input[inputIndex][key];
if (input[inputIndex].hasOwnProperty(key) && value !== undefined) {
if ($.isPlainObject(value)) {
target[key] = $.isPlainObject(target[key])? $.widget.extend({
}
, target[key], value): $.widget.extend({
}
, value);
}
else {
target[key] = value;
}
}
}
}
return target;
}
;
$.widget.bridge = function (name, object){
var fullName = object.prototype.widgetFullName || name;
$.fn[name] = function (options){
var isMethodCall = typeof options === "string", args = slice.call(arguments, 1), returnValue = this;
options = !isMethodCall && _AN_Read_length("length", args)? $.widget.extend.apply(null , [options] .concat(args)): options;
if (isMethodCall) {
this.each(function (){
var methodValue, instance = $.data(this, fullName);
if (!instance) {
return $.error("cannot call methods on " + name + " prior to initialization; " + "attempted to call method '" + options + "'");
}
if (!$.isFunction(instance[options]) || options.charAt(0) === "_") {
return $.error("no such method '" + options + "' for " + name + " widget instance");
}
methodValue = instance[options].apply(instance, args);
if (methodValue !== instance && methodValue !== undefined) {
returnValue = methodValue && methodValue.jquery? returnValue.pushStack(methodValue.get()): methodValue;
return false ;
}
}
);
}
else {
this.each(function (){
var instance = $.data(this, fullName);
if (instance) {
instance.option(options || {
}
)._init();
}
else {
$.data(this, fullName, new object(options, this));
}
}
);
}
return returnValue;
}
;
}
;
$.Widget = function (){
}
;
$.Widget._childConstructors = [] ;
$.Widget.prototype = {
widgetName: "widget",
widgetEventPrefix: "",
defaultElement: "
",
options: {
disabled: false ,
create: null }
,
_createWidget: function (options, element){
element = $(element || this.defaultElement || this)[0];
this.element = $(element);
this.uuid = uuid++ ;
this.eventNamespace = "." + this.widgetName + this.uuid;
this.options = $.widget.extend({
}
, this.options, this._getCreateOptions(), options);
this.bindings = $();
this.hoverable = $();
this.focusable = $();
if (element !== this) {
$.data(element, this.widgetFullName, this);
this._on(true , this.element, {
remove: function (event){
if (_AN_Read_target("target", event) === element) {
this.destroy();
}
}
}
);
this.document = $(element.style? element.ownerDocument: element.document || element);
this.window = $(this.document[0].defaultView || this.document[0].parentWindow);
}
this._create();
this._trigger("create", null , this._getCreateEventData());
this._init();
}
,
_getCreateOptions: $.noop,
_getCreateEventData: $.noop,
_create: $.noop,
_init: $.noop,
destroy: function (){
this._destroy();
this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData($.camelCase(this.widgetFullName));
this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName + "-disabled " + "ui-state-disabled");
this.bindings.unbind(this.eventNamespace);
this.hoverable.removeClass("ui-state-hover");
this.focusable.removeClass("ui-state-focus");
}
,
_destroy: $.noop,
widget: function (){
return this.element;
}
,
option: function (key, value){
var options = key, parts, curOption, i;
if (_AN_Read_length("length", arguments) === 0) {
return $.widget.extend({
}
, this.options);
}
if (typeof key === "string") {
options = {
}
;
parts = key.split(".");
key = parts.shift();
if (parts.length) {
curOption = options[key] = $.widget.extend({
}
, this.options[key]);
for (i = 0; i < _AN_Read_length("length", parts) - 1; i++ ){
curOption[parts[i]] = curOption[parts[i]] || {
}
;
curOption = curOption[parts[i]];
}
key = parts.pop();
if (value === undefined) {
return curOption[key] === undefined? null : curOption[key];
}
curOption[key] = value;
}
else {
if (value === undefined) {
return this.options[key] === undefined? null : this.options[key];
}
options[key] = value;
}
}
this._setOptions(options);
return this;
}
,
_setOptions: function (options){
var key;
for (key in options){
this._setOption(key, options[key]);
}
return this;
}
,
_setOption: function (key, value){
this.options[key] = value;
if (key === "disabled") {
this.widget().toggleClass(this.widgetFullName + "-disabled ui-state-disabled", !!value).attr("aria-disabled", value);
this.hoverable.removeClass("ui-state-hover");
this.focusable.removeClass("ui-state-focus");
}
return this;
}
,
enable: function (){
return this._setOption("disabled", false );
}
,
disable: function (){
return this._setOption("disabled", true );
}
,
_on: function (suppressDisabledCheck, element, handlers){
var delegateElement, instance = this;
if (typeof suppressDisabledCheck !== "boolean") {
handlers = element;
element = suppressDisabledCheck;
suppressDisabledCheck = false ;
}
if (!handlers) {
handlers = element;
element = this.element;
delegateElement = this.widget();
}
else {
element = delegateElement = $(element);
this.bindings = this.bindings.add(element);
}
$.each(handlers, function (event, handler){
function handlerProxy(){
if (!suppressDisabledCheck && (instance.options.disabled === true || $(this).hasClass("ui-state-disabled"))) {
return ;
}
return (typeof handler === "string"? instance[handler]: handler).apply(instance, arguments);
}
if (typeof handler !== "string") {
handlerProxy.guid = handler.guid = handler.guid || handlerProxy.guid || $.guid++ ;
}
var match = event.match(/^(\w+)\s*(.*)$/), eventName = match[1] + instance.eventNamespace, selector = match[2];
if (selector) {
delegateElement.delegate(selector, eventName, handlerProxy);
}
else {
element.bind(eventName, handlerProxy);
}
}
);
}
,
_off: function (element, eventName){
eventName = (eventName || "").split(" ").join(this.eventNamespace + " ") + this.eventNamespace;
element.unbind(eventName).undelegate(eventName);
}
,
_delay: function (handler, delay){
function handlerProxy(){
return (typeof handler === "string"? instance[handler]: handler).apply(instance, arguments);
}
var instance = this;
return _AN_Call_settimeout("setTimeout", window, handlerProxy, delay || 0);
}
,
_hoverable: function (element){
this.hoverable = this.hoverable.add(element);
this._on(element, {
mouseenter: function (event){
$(event.currentTarget).addClass("ui-state-hover");
}
,
mouseleave: function (event){
$(event.currentTarget).removeClass("ui-state-hover");
}
}
);
}
,
_focusable: function (element){
this.focusable = this.focusable.add(element);
this._on(element, {
focusin: function (event){
$(event.currentTarget).addClass("ui-state-focus");
}
,
focusout: function (event){
$(event.currentTarget).removeClass("ui-state-focus");
}
}
);
}
,
_trigger: function (type, event, data){
var prop, orig, callback = this.options[type];
data = data || {
}
;
event = $.Event(event);
event.type = (type === this.widgetEventPrefix? type: this.widgetEventPrefix + type).toLowerCase();
_AN_Write_target("target", event, false , this.element[0]);
orig = event.originalEvent;
if (orig) {
for (prop in orig){
if (!(prop in event)) {
event[prop] = orig[prop];
}
}
}
this.element.trigger(event, data);
return !($.isFunction(callback) && callback.apply(this.element[0], [event] .concat(data)) === false || event.isDefaultPrevented());
}
}
;
$.each({
show: "fadeIn",
hide: "fadeOut"}
, function (method, defaultEffect){
$.Widget.prototype["_" + method] = function (element, options, callback){
if (typeof options === "string") {
options = {
effect: options}
;
}
var hasOptions, effectName = !options? method: options === true || typeof options === "number"? defaultEffect: options.effect || defaultEffect;
options = options || {
}
;
if (typeof options === "number") {
options = {
duration: options}
;
}
hasOptions = !$.isEmptyObject(options);
options.complete = callback;
if (options.delay) {
element.delay(options.delay);
}
if (hasOptions && $.effects && $.effects.effect[effectName]) {
element[method](options);
}
else if (effectName !== method && element[effectName]) {
element[effectName](options.duration, options.easing, callback);
}
else {
element.queue(function (next){
$(this)[method]();
if (callback) {
callback.call(element[0]);
}
next();
}
);
}
}
;
}
);
}
)(jQuery);