/*
 * Copyright (c) Dynamoid Oy 2005-2011
 * All Rights Reserved
 */
(function($) {
window.TrinketCollection = function(uid, image_id) {
	this.trinkets = null;
	this.inited = false;
	this.pendingChanges = false;

	this.uid = uid;
	this.image_id = image_id;

	this.trinkets = new Array();

	this.trinketsInDB = new Hash();

	// Init event handler for trinket selecting
	$(document).mousedown(function cbMousedown(event) {
		if ($(event.target).hasClass('trinket-editor') || $(event.target).parents('.trinket-editor').length !== 0) {
		} else {
			this.blur();
		}
	}.bind(this));
};

	
TrinketCollection.prototype = {

	show: function() {
		this.inited = true;
		this.move();
	},

	addTrinket: function(trinket) {
		var inDB = !!arguments[1];

		if (inDB) {
			this.trinketsInDB.set(trinket.trinket_id, trinket.trinket_id);
		}

		this.trinkets.push(trinket);
	},

	move: function() {
		if (!this.inited || this.editing) {
			return;
		}

		var time_d = 0;

		if (this.time_o > 0) {
			time_d = (new Date() - this.time_o) / 1000;
		}
		this.time_o = new Date();

		if (time_d > 0.1) {
			time_d = 0.1;
		}

		var moved = false;
		$.each(this.trinkets, function itTrinket(index, trinket) {
			moved = trinket.move(this) || moved;
		}.bind(time_d));

		window.setTimeout(this.move.bind(this), moved ? 50 : 250);
	},

	edit: function(){
		this.editMode = true;
		$.each(this.trinkets, function itTrinket(index, trinket) {
			trinket.edit();
		});
	},

	blur: function(){
		$.each(this.trinkets, function itTrinket(index, trinket) {
			trinket.blur();
		});
	},

	addTrinketAjax: function(trinket_type_id) {
		new Ajax.Request('/user_didget.php', {
			method: 'get',
			parameters: {
				action: 'didget_get_by_type',
				didget_type: 'type_trinket',
				didget_type_id: trinket_type_id
			},
			onSuccess: this.addTrinketAjaxOnSuccess.bind(this)
		});
	},

	addTrinketAjaxOnSuccess: function(transport) {
		var trinkets;
		if (trinkets = transport.headerJSON.trinkets){
			window.jsonTrinket = trinkets[0];
		}
	},

	setPendingChanges: function() {
		this.pendingChanges = true;
	},

	changesPending: function() {
		return this.pendingChanges;
	},

	save: function() {
		var json_trinkets = {};
		$.each(this.trinkets, function itTrinket(index, trinket) {
			json_trinkets[trinket.trinket_id] = trinket.getData();
		});

		new Ajax.Request('/user_didget.php', {
			method: 'get',
			parameters: {
				action: 'didget_save_all',
				didget_type: 'type_trinket',
				image_id: this.image_id,
				json_trinkets: Object.toJSON(json_trinkets)
			},
			onSuccess: this.trinketsSaveAjaxOnSuccess.bind(this)

		});
	},

	trinketsSaveAjaxOnSuccess: function(transport) {
		this.pendingChanges = false;
		this.trinketsInDB = $H(JSON.parse(transport));
	},

	addInlineTrinket: function(trinket_id, x, y){
		var jsonTrinket = null;
		window.jsonTrinkets[trinket_id].each(function itTrinket(inlineTrinket) {
			if (inlineTrinket.image_id == '' || inlineTrinket.image_id == null) {
				//HOX: Make sure this gets set to null when picking the trinket!
				inlineTrinket.image_id = this.image_id;
				jsonTrinket = inlineTrinket;
				throw $break;
			}
		});
		this.updateDidgetBrowserCount(trinket_id, -1);
		var trinket2 = new Trinket(
			Trinkets,
			jsonTrinket['usertrinket_id'],
			jsonTrinket['trinket_id'],
			jsonTrinket['gift_stamp'],
			jsonTrinket['name'],
			x,
			y,
			jsonTrinket['z'],
			jsonTrinket['file'],
			jsonTrinket['width'],
			jsonTrinket['height'],
			jsonTrinket['interaction_style'],
			jsonTrinket['thumb']
		);
		Trinkets.addTrinket(trinket2);
		return trinket2;
	},

	updateDidgetBrowserCount: function(trinket_type_id, change) {
		var countElement = $('#usertrinket_' + trinket_type_id + ' .trinketamount');
		if (countElement.length) {
			var count = parseInt(countElement.html().strip()) + change;

			countElement.replaceWith('<div class="trinketamount">' + count + '</div>');

			//restore reference to countElement after it gets lost because of Element.replace
			countElement = $('div#usertrinket_' + trinket_type_id + ' div.trinketamount');

			if (count > 1) {
				countElement.show();
			} else {
				countElement.hide();
			}

			if (count == 0) {
				$('#usertrinket_' + trinket_type_id).addClass('disabled');
			} else {
				$('#usertrinket_' + trinket_type_id).removeClass('disabled');
				var disabled_msg = $('#usertrinket_' + trinket_type_id + ' .disabled_msg');
				if (disabled_msg.length) {
					disabled_msg.hide();
				}
			}
		}

	},

	stopEditing: function() {
		if (!this.editMode) {
			return;
		}
		this.editMode = false;

		$.each(this.trinkets, function itTrinket(index, trinket) {
			trinket.stopEditing();
			//Hide unsaved trinkets
			if (!this.trinketsInDB.get(trinket.trinket_id)) {
				//trinket.pick();
				trinket.destroy();
			}
		}.bind(this));
	},

	pickAll: function() {
		$.each(this.trinkets, function itTrinket(index, trinket) {
			window.Trinkets.pick(trinket);
		});
	},

	pick: function(trinket) {
		if (typeof trinket != 'object') {
			trinket = this.getTrinketById(trinket);
		}
		trinket.pick(true);

		//set picked trinkets image_id back to null
		if (window.jsonTrinkets && window.jsonTrinkets[trinket.type_id]) {
			window.jsonTrinkets[trinket.type_id].each(function itTrinket(e) {
				if (e.usertrinket_id == trinket.trinket_id) {
					e.image_id = null;
				}
			}.bind(trinket));
		}
		this.updateDidgetBrowserCount(trinket.type_id, +1);

		//remove trinket from internal array
		this.trinkets = this.trinkets.without(trinket);
	},

	trinketTypeIdFromId: function(trinketId) {
		return trinketId.substr(trinketId.lastIndexOf('_') + 1, 20);
	},


	/**
	 * returns the trinket object with the given trinket id
	 */
	getTrinketById: function(trinketId) {
		var result = false;

		$.each(this.trinkets, function itTrinket(index, trinket) {
			if (trinket.trinket_id == this) {
				result = trinket;
				return false;
			}
		}.bind(trinketId));

		return result;
	}
};

})(jQuery);

