// Generated by CoffeeScript 1.3.3 /* Backbone-Articulation.js 0.3.1 (c) 2011, 2012 Kevin Malakoff. Backbone-Articulation may be freely distributed under the MIT license. https://github.com/kmalakoff/backbone-articulation */(function(){var Backbone,JSONS,LC,_,_native_bbcol_reset,_native_bbmod_change,_native_bbmod_clear,_native_bbmod_initialize,_native_bbmod_model_event,_native_bbmod_set,_native_bbmod_unset;_=!this._&&typeof require!="undefined"?require("underscore"):this._,_&&!_.VERSION&&(_=_._),Backbone=!this.Backbone&&typeof require!="undefined"?require("backbone"):this.Backbone,JSONS=!this.JSONS&&typeof require!="undefined"?require("json-serialize"):this.JSONS,LC=!this.LC&&typeof require!="undefined"?require("lifecycle"):this.LC,Backbone.Articulation=typeof exports!="undefined"?exports:{},Backbone.Articulation.VERSION="0.3.1",Backbone.Articulation.TYPE_UNDERSCORE_SINGULARIZE=!1,Backbone.Collection.prototype.toJSON=function(){var model,models_as_JSON,_i,_len,_ref;models_as_JSON=[],_ref=this.models;for(_i=0,_len=_ref.length;_i<_len;_i++)model=_ref[_i],models_as_JSON.push(model.toJSON());return models_as_JSON},Backbone.Collection.prototype.parse=function(resp,xhr){var articulated_model_attributes,model_resp,_i,_len;if(!resp||!_.isArray(resp))return resp;articulated_model_attributes=[];for(_i=0,_len=resp.length;_i<_len;_i++)model_resp=resp[_i],articulated_model_attributes.push(JSONS.deserialize(model_resp,{skip_type_field:!0}));return articulated_model_attributes},Backbone.Model.prototype.toJSON=function(){var class_name,json;json=JSONS.serialize(this.attributes,{properties:!0});if(json.hasOwnProperty(JSONS.TYPE_FIELD))return json;if(this.hasOwnProperty(JSONS.TYPE_FIELD))return json[JSONS.TYPE_FIELD]=this[JSONS.TYPE_FIELD],json;class_name=Object.getPrototypeOf(Object(this)).constructor.name;if(!class_name)return json;if(Backbone.Articulation.TYPE_UNDERSCORE_SINGULARIZE){if(!String.prototype.underscore)throw"Missing String.prototype.underscore";if(!String.prototype.singularize)throw"Missing String.prototype.singularize";json[JSONS.TYPE_FIELD]=class_name.underscore().singularize()}else json[JSONS.TYPE_FIELD]=class_name;return json},Backbone.Model.prototype.parse=function(resp,xhr){return resp?JSONS.deserialize(resp,{properties:!0,skip_type_field:!0}):resp},Backbone.Model.prototype._ownAttribute=function(key,value){if(!value)return;return value instanceof Backbone.Model||value instanceof Backbone.Collection?value:_.isArray(value)&&value.length&&value[0]instanceof Backbone.Model||value[0]instanceof Backbone.Collection?value:LC.own(value)},Backbone.Model.prototype._disownAttribute=function(key,value){if(!value)return;return value instanceof Backbone.Model||value instanceof Backbone.Collection?value:_.isArray(value)&&value.length&&value[0]instanceof Backbone.Model||value[0]instanceof Backbone.Collection?value:LC.disown(value)},_native_bbmod_initialize=Backbone.Model.prototype.initialize,Backbone.Model.prototype.initialize=function(){var key,result;result=_native_bbmod_initialize.apply(this,arguments);for(key in this._previousAttributes)this._previousAttributes[key]=this._ownAttribute(key,this._previousAttributes[key]);return result},_native_bbmod_set=Backbone.Model.prototype.set,Backbone.Model.prototype.set=function(attrs,options){var key;if(!attrs)return this;attrs.attributes&&(attrs=attrs.attributes);for(key in attrs){if(_.isEqual(this.attributes[key],attrs[key]))continue;this._previousAttributes&&this._previousAttributes.hasOwnProperty(key)&&this._disownAttribute(key,this._previousAttributes[key])}return _native_bbmod_set.apply(this,arguments)},_native_bbmod_unset=Backbone.Model.prototype.unset,Backbone.Model.prototype.unset=function(attr,options){return attr in this.attributes?(this._disownAttribute(attr,this.attributes[attr]),_native_bbmod_unset.apply(this,arguments)):this},_native_bbmod_clear=Backbone.Model.prototype.clear,Backbone.Model.prototype.clear=function(options){var key;for(key in this.attributes)this._disownAttribute(key,this.attributes[key]);if(options&&options.silent)for(key in this._previousAttributes)this._disownAttribute(key,this._previousAttributes[key]);return _native_bbmod_clear.apply(this,arguments)},_native_bbmod_change=Backbone.Model.prototype.change,Backbone.Model.prototype.change=function(options){var key,result;for(key in this._previousAttributes)this._disownAttribute(key,this._previousAttributes[key]);result=_native_bbmod_change.apply(this,arguments);for(key in this._previousAttributes)this._previousAttributes[key]=this._ownAttribute(key,this._previousAttributes[key]);return result},_native_bbcol_reset=Backbone.Collection.prototype._reset,Backbone.Collection.prototype._reset=function(){var model,_i,_j,_len,_len1,_ref,_ref1;if(this.models&&this.models.length)if(Backbone.Relational&&this.models[0]instanceof Backbone.RelationalModel){_ref=this.models;for(_i=0,_len=_ref.length;_i<_len;_i++)model=_ref[_i],Backbone.Relational.store.unregister(model),model.clear({silent:!0})}else{_ref1=this.models;for(_j=0,_len1=_ref1.length;_j<_len1;_j++)model=_ref1[_j],model.clear({silent:!0})}return _native_bbcol_reset.apply(this,arguments)},_native_bbmod_model_event=Backbone.Collection.prototype._onModelEvent,Backbone.Collection.prototype._onModelEvent=function(ev,model,collection,options){var key;if(ev==="destroy"){for(key in this._previousAttributes)this._disownAttribute(key,this._previousAttributes[key]);for(key in this.attributes)this._disownAttribute(key,this.attributes[key])}return _native_bbmod_model_event.apply(this,arguments)},!Backbone.RelationalModel||(Backbone.RelationalModel.prototype.toJSON=function(){var index,json,model_json,rel,value,_i,_j,_len,_len1,_ref;if(this.isLocked())return this.id;this.acquire(),json=Backbone.Model.prototype.toJSON.call(this),_ref=this._relations;for(_i=0,_len=_ref.length;_i<_len;_i++){rel=_ref[_i],value=json[rel.key];if(rel.options.includeInJSON===!0&&value&&typeof value=="object")json[rel.key]=_.isFunction(value.toJSON)?value.toJSON():value;else if(_.isString(rel.options.includeInJSON))if(!value)json[rel.key]=null;else if(value instanceof Backbone.Collection)json[rel.key]=value.pluck(rel.options.includeInJSON);else if(value instanceof Backbone.Model)json[rel.key]=value.get(rel.options.includeInJSON);else if(_.isArray(value)){json[rel.key]=[];for(index=_j=0,_len1=value.length;_j<_len1;index=++_j)model_json=value[index],_.isUndefined(model_json)||json[rel.key].push(model_json[rel.options.includeInJSON])}else value instanceof Object&&(json[rel.key]=value[rel.options.includeInJSON]);else delete json[rel.key]}return this.release(),json})}).call(this);