var windowData = { } ; jQuery.extend({ cache: { } , uuid: 0, expando: "jQuery" + jQuery.now(), noData: { "embed": true , "object": true , "applet": true } , data: function (elem, name, data){ if (elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) { return ; } elem = elem == window? windowData: elem; var isNode = elem.nodeType, id = isNode? elem[jQuery.expando]: null , cache = jQuery.cache, thisCache; if (isNode && !id && typeof name === "string" && data === undefined) { return ; } if (isNode && !id) { elem[jQuery.expando] = id = ++jQuery.uuid; } if (typeof name === "object") { if (isNode) { cache[id] = jQuery.extend(true , { } , name); } else { jQuery.extend(true , elem, name); } } else if (isNode && !cache[id]) { if (isNode) { cache[id] = { } ; } else { var store = { } ; cache[id] = function (){ return store; } ; } } thisCache = isNode? cache[id]: elem; if (data !== undefined) { thisCache[name] = data; } return typeof name === "string"? thisCache[name]: thisCache; } , removeData: function (elem, name){ if (elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) { return ; } elem = elem == window? windowData: elem; var isNode = elem.nodeType, id = isNode? elem[jQuery.expando]: elem, cache = jQuery.cache, thisCache = isNode? cache[id]: id; if (name) { if (thisCache) { delete thisCache[name]; } } else { if (isNode && jQuery.support.deleteExpando) { delete elem[jQuery.expando]; } else if (elem.removeAttribute) { elem.removeAttribute(jQuery.expando); } if (isNode) { delete cache[id]; } else { for (var n in elem){ delete elem[n]; } } } } } ); jQuery.fn.extend({ data: function (key, value){ if (typeof key === "undefined" && _AN_Read_length("length", this)) { return jQuery.data(this[0]); } else if (typeof key === "object") { return this.each(function (){ jQuery.data(this, key); } ); } var parts = key.split("."); parts[1] = parts[1]? "." + parts[1]: ""; if (value === undefined) { var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]] ); if (data === undefined && _AN_Read_length("length", this)) { data = jQuery.data(this[0], key); } return data === undefined && parts[1]? this.data(parts[0]): data; } else { return this.trigger("setData" + parts[1] + "!", [parts[0], value] ).each(function (){ jQuery.data(this, key, value); jQuery.event.trigger("changeData" + parts[1] + "!", [parts[0], value] , this); } ); } } , removeData: function (key){ return this.each(function (){ jQuery.removeData(this, key); } ); } } );