Spade

Mini Shell

Directory:~$ /home/lmsyaran/www/joomla4/
Upload File

[Home] [System Details] [Kill Me]
Current File:~$ /home/lmsyaran/www/joomla4/media.js.tar

home/lmsyaran/public_html/media/com_easyblog/scripts_/media.js000064400000126015151161720250020616
0ustar00EasyBlog.module("media", function($){

	var module = this;


	var htmlentity = function(str) {

		return $("<div>").text(str)
					.html()
					.replace(/&/g, '&amp;')
					.replace(/"/g, '&quot;')
					.replace(/'/g, '&apos;');
	}

	var $Media, $Library, $Browser, $Uploader, DS;

	//
	// 1. Create media manager controller.
	//
	EasyBlog.Controller("Media",

		{
			defaultOptions: {

				debug: {
					logging: EasyBlog.debug,

					itemVisibility: false,

					delayConfiguration: 0,
					delayCommon: 0,
					delayBrowser: 0,
					delayUploader: 0,
					delayEditor: 0
				},

				ui: "#EasyBlogMediaManagerUI",


				overlay: {
					background: "black",
					opacity: 0
				},

				modal: {
					size: 0.9
				},

				recentActivities: {
					hideAfter: 3000
				},

				"{modalGroup}"    : ".mediaModalGroup",
				"{modal}"         : ".mediaModal",

				"{loaderModal}"   : ".loaderModal",
				"{uploaderModal}" : ".uploaderModal",
				"{browserModal}"  : ".browserModal",
				"{editorModal}"   : ".editorModal",

				"{modalContent}"  : ".modalContent",

				"{overlay}": ".media-overlay",

				"{modalDashboardButton}": ".dashboardButton",

				"{assetItem}": ".assetItem"
			}
		},

		function(self) { return {

			console: function(method, args) {

				if (!self.options.debug.logging) return;

				var console = window.console;

				if (!console) return;

				var method = console[method];

				if (!method) return;

				// Normal browsers
				if (method.apply) {
					method.apply(console, args);
				// IE
				} else {
					method(args.join(" "));
				}
			},

			assets: {},

			getAsset: function(name) {

				if (self.assets[name]===undefined) {

					var asset = self.assets[name] = $.Deferred();

					asset
						.done(function(){

							self.assetItem(".asset-type-"+name)
								.removeClass("loading done failed")
								.addClass("done");
						})
						.fail(function(){
							self.assetItem(".asset-type-"+name)
								.removeClass("loading done failed")
								.addClass("fail");
						});
				}

				return self.assets[name];
			},

			createAsset: function(name, factory, delay) {

				var asset = self.getAsset(name);
					asset.factory = factory;

				setTimeout(function(){
					asset.factory && asset.factory(asset);
				}, delay);

				return asset;
			},

			init: function() {

				// Globals
				$Media = self;

				self.IE = (function(){

				    var undef,
				        v = 3,
				        div = document.createElement('div'),
				        all = div.getElementsByTagName('i');

				    while (
				        div.innerHTML = '<!--[if gt IE ' + (++v) +
']><i></i><![endif]-->',
				        all[0]
				    );

				    return v > 4 ? v : undef;

				}());


				if( typeof( tinyMCE ) != 'undefined' )
				{

					// Caret position fix
					if (tinyMCE && tinyMCE.isIE && self.IE==9) {

						// Wait for TinyMCE to be ready
						var waitForTinyMCE = setInterval(function(){

							var editor = tinyMCE.editors.write_content;

							if (!editor) return;

							var events = "keydown.mediaManager mousedown.mediaManager
focus.mediaManager";

							$(editor.contentWindow)
								// Just in case it was binded
								.off(events)
								.on(events, function(){
									self.bookmark = {
										element: editor.selection.getEnd(),
										range: editor.selection.getBookmark(1).rng
									}
								});

							clearInterval(waitForTinyMCE);

						}, 500);
					}
				}

				// Remember the document body's original overflow property
				// Used with .hide();
				self.originalBodyOverflow =
$("body").css("overflow");

				// When "module/configuration" gets resolved,
				// file & folder indexing kicks in immediately
				// without waiting for the other assets to resolve.
				self.createAsset(
					"configuration",
					function(asset) {
						EasyBlog.module("media/configuration")
							.done(function() {
								var options = this;
								self.initialize(this);
								asset.resolve();
							})
							.fail(function(){
								asset.reject();
							});
					},
					self.options.debug.delayConfiguration
				);

				// Stylesheet & navigation is given priority because it needs to be
				// ready before uploader can initialize. And we need
				// uploader to be up & ready as fast as possible.
				self.createAsset(
					"common",
					function(asset) {
						EasyBlog.require()
							.script(
								"media/navigation"
							)
							.view(
								"media/recent.item",

								// Browser
								"media/browser",
								"media/browser.item-group",
								"media/browser.item",
								"media/browser.tree-item-group",
								"media/browser.tree-item",
								"media/browser.pagination-page",

								// Uploader
							    "media/browser.uploader",
							    "media/browser.uploader.item",

							    // Editor
								"media/editor",
								"media/editor.viewport",

								// Navigation
								"media/navigation.item",
								"media/navigation.itemgroup"
							)
							.language(
								"COM_EASYBLOG_MM_UNABLE_TO_FIND_EXPORTER",
								"COM_EASYBLOG_MM_GETTING_IMAGE_SIZES",
								"COM_EASYBLOG_MM_UNABLE_TO_RETRIEVE_VARIATIONS",
								"COM_EASYBLOG_MM_ITEM_INSERTED",
								"COM_EASYBLOG_MM_UPLOADING",
								"COM_EASYBLOG_MM_UPLOADING_STATE",
								"COM_EASYBLOG_MM_UPLOADING_PENDING",
								"COM_EASYBLOG_MM_UPLOAD_COMPLETE",
								"COM_EASYBLOG_MM_UPLOAD_PREPARING",
								"COM_EASYBLOG_MM_UPLOAD_UNABLE_PARSE_RESPONSE",
								"COM_EASYBLOG_MM_UPLOADING_LEFT",
								"COM_EASYBLOG_MM_CONFIRM_DELETE_ITEM",
								"COM_EASYBLOG_MM_CANCEL_BUTTON",
								"COM_EASYBLOG_MM_YES_BUTTON",
								"COM_EASYBLOG_MM_ITEM_DELETE_CONFIRMATION"
							)
							.stylesheet("media/style")
							.done(function() {
								asset.resolve();
							})
							.fail(function(){
								asset.reject();
							});
					},
					self.options.debug.delayCommon
				);

				// Load all uploader dependencies NOW so we can shave off
				// that extra 1-2 seconds that was used to wait for
				// "media/uploader" module to resolve.
				self.createAsset(
					"uploader",
					function(asset) {
						$.when(
							self.getAsset("configuration"),
							self.getAsset("common"),
							EasyBlog.require().script("media/uploader").done()
						)
						.done(function() {
							var modal = self.createModal("uploader");
							$Uploader = modal.controller = new
EasyBlog.Controller.Media.Uploader(modal.element, self.options.uploader);
							asset.resolve();
						})
						.fail(function(){
							asset.reject();
						});
					},
					self.options.debug.delayUploader
				);

				// Browser
				self.createAsset(
					"browser",
					function(asset) {
						$.when(
							self.getAsset("configuration"),
							self.getAsset("common"),
							EasyBlog.require().script("media/browser").done()
						)
						.done(function(){
							var modal = self.createModal("browser");
							$Browser = modal.controller = new
EasyBlog.Controller.Media.Browser(modal.element, self.options.browser);
							asset.resolve();
						})
						.fail(function(){
							asset.reject();
						});
					},
					self.options.debug.delayBrowser
				);

				// Editor
				self.createAsset(
					"editor",
					function(asset) {
						$.when(
							self.getAsset("browser"),
							EasyBlog.require().script("media/editor").done()
						)
						.done(function(){
							var modal = self.createModal("editor");
							modal.controller = new
EasyBlog.Controller.Media.Editor(modal.element, self.options.editor);
							asset.resolve();
						})
						.fail(function(){
							asset.reject();
						});
					},
					self.options.debug.delayEditor
				);

				// Progressive enhancement
				EasyBlog.require()
					.library("throttle-debounce")
					.done(function(){
						// Debounce self.setLayout(). Debouncing setLayout() is only useful
when
						// media explorer is doing resource-intensive thumbnail resizing.
						self.setLayout = $.debounce(200, self._setLayout);
					});
			},

			initialize: function(options) {

				// Inject subcontroller options with back-reference to media
				var media = {controller: {media: self}},
					options = $.extend(true, options, {browser: media, uploader: media,
library: media, editor: media, exporter: media});

				// Reload configuration
				self.update(options);

				// Globals
				DS = options.directorySeparator;

				// Render media manager UI
				var UI = $(self.options.ui);
				self.element.append(UI.html());
				UI.remove();

				// Set up overlay
				self.overlay()
					.css(self.options.overlay);

				// Set up loader
				self.loader = new
EasyBlog.Controller.Media.Loader(self.createModal("loader"),
{controller: {media: self}});

				// Implement media library
				self.element
					.implement(
						EasyBlog.Controller.Media.Library,
						self.options.library,
						function(){

						}
					);

				// Implement media exporter
				self.element
					.implement(
						EasyBlog.Controller.Media.Exporter,
						self.options.exporter
					);

				module.resolve();
			},

			// This will be replaced with a debounced function later on.
			setLayout: function() {

				self._setLayout();
			},

			// We are retaining direct access to non-debounced setLayout()
			// because we might need it sometimes.
			_setLayout: function() {

				self.layout = (self.element.hasClass("active")) ? $.uid() :
null;

				if (self.layout) {
					self.setModalLayout();
				}

				return self.layout;
			},

			modals: {},

			createModal: function(name) {

				var element = self.modal("."+name+"Modal");

				if (element.length < 1) {
					element = $('<div
class="mediaModal"></div>').addClass(name+"Modal").appendTo(self.modalGroup());
				}

				return self.modals[name] = {
					name: name,
					element: element
				}
			},

			activateModal: function(name, args) {

				if (self.modals[name]===undefined) {

					self.loader
						.when(self.assets[name])
						.done(function(){
							setTimeout(function(){
								self.activateModal(name, args);
							}, 1000);
						});

					return;
				}

				// If modal to activate is current modal, skip.
				if (self.currentModal===name) return true;

				var modal = self.modals[name];

				if (!modal) return false;

				self.deactivateModal(self.currentModal);

				self.currentModal = name;

				// This will also set modal layout
				self.show();

				// Trigger "modalActivate event"
				var controller = modal.controller;

				if (controller) {
					controller.trigger("modalActivate", args);
				}

				return true;
			},

			deactivateModal: function(name, args) {

				var modal = self.modals[name];

				if (!modal) return false;

				// Trigger "modalActivate event"
				var controller = modal.controller;

				if (controller) {

					try {
						controller.trigger("modalDeactivate", args);
					} catch (e) {
						console.error(e);
					}
				}

				modal.element.removeClass("active");

				self.currentModal = undefined;

				return true;
			},

			setModalLayout: function() {

				clearTimeout(self.setModalLayout.task);

				var modal = self.modals[self.currentModal];

				// Skip if modal does not exist, or no visible modal.
				if (!modal) return;

				// If no layout has been set, set it first.
				// setModalLayout will eventually be called again.
				if (!self.layout) return self._setLayout();

				// Show the modal
				modal.element.addClass("active");

				// Set the layout modal
				var controller = modal.controller;

				if (controller && $.isFunction(controller.setLayout)) {

					// This fixes an issue where the modal requires
					// more time than expected to paint on the screen.
					// Whenever the modal is painted on the screen,
					// its top/left is never 0.

					var task = function() {

						var offset = controller.element.offset();

						if (offset.top===0 || offset.left===0) {
							self.setModalLayout.task = setTimeout(task, 50);
						} else {
							controller.setLayout();
						}
					};

					task();
				}
			},

			show: function() {

				// This prevents scrolling of page body
				// $("body").css("overflow", "hidden");

				self.element
					.addClass("active");

				self._setLayout();

				// Conflict with certain mootools version
				// self.trigger("show");

				self.trigger("showModal");
			},

			hide: function() {

				self.element
					.removeClass("active");

				self.deactivateModal(self.currentModal);

				// $("body").css("overflow",
self.originalBodyOverflow);

				// Conflict with certain mootools version
				// self.trigger("hide");

				self.trigger("hideModal");
			},

			"{overlay} click": function() {
				self.hide();
			},

			"{window} resize": function() {
				self.setLayout();
			},

			"{modalDashboardButton} click": function(el, event) {

				// #debug:start
				if (event.shiftKey) return self.console("dir", [self]);
				// #debug:end

				self.hide();
			},

			// Sugar methods
			upload: function() { self.activateModal("uploader",
arguments); },
			browse: function() { self.activateModal("browser", arguments);
},
			edit  : function() { self.activateModal("editor", arguments);
}
		}}
	);

	EasyBlog.Controller("Media.Loader",

		{
			defaultOptions: {

			}
		},

		function(self) { return {

			init: function() {

			},

			when: function() {

				self.media.activateModal("loader");

				var queue = $.when.apply(null, arguments),

					onQueueDone = queue.done; // Keep an original copy of done method

					queue.id = $.uid();

				queue.done = function(callback) {

					onQueueDone(function(){

						// If we are still waiting for it
						if (self.currentQueueId==queue.id) {

							// then execute the callback
							callback && callback();
						}
					});
				}

				self.currentQueueId = queue.id;

				return queue;
			},

			"{self} hide": function() {

				self.currentQueueId = null;
			}
		}}
	);

	EasyBlog.Controller("Media.Prompt",

		{
			defaultOptions: {

				"{dialog}": ".modalPromptDialog",
				"{cancelButton}": ".promptCancelButton"
			}
		},

		function(self){ return {

			init: function() {

			},

			get: function(name) {

				var dialog = self.dialog("." + name);

				return self.instantiate(dialog);
			},

			instantiate: function(dialog) {

				var methods = {

					element: dialog,

					show: function() {

						dialog.addClass("active");

						self.element.addClass("active");

						return methods;
					},

					hide: function() {

						dialog.removeClass("active");

						self.element.removeClass("active");

						return methods;
					},

					state: function(state) {

						var lastState = dialog.data("lastPromptState");

						if (state===undefined) {

							return lastState;
						}

						var getStateElement = function(state) {
								return dialog.find(".promptState" + ".state-" +
state);
							},
							currentState = getStateElement(state),
							lastState = getStateElement(lastState);

						if (currentState.length < 1) {
							return;
						}

						lastState.removeClass("active");

						currentState.addClass("active");

						dialog.data("lastPromptState", state);

						return methods;
					}
				}

				return methods;
			},

			hideAll: function() {

				self.dialog().removeClass("active");

				self.element.removeClass("active");
			},

			"{cancelButton} click": function() {

				self.hideAll();
			}

		}}
	);

	EasyBlog.Controller("Media.Library",

		{
			defaultOptions: {
				// options for managing indexing of metas here

				places: [],

				place: {
					files: {},
					acl: {
						canCreateFolder: false,
						canUploadItem: false,
						canRenameItem: false,
						canRemoveItem: false,
						canCreateVariation: false,
						canDeleteVariation: false
					},
					populateImmediately: false
				}
			}
		},

		function(self) { return {

			init: function() {

				// Register itself to media
				self.media.library = self;

				$.each(self.options.places, function(i, place) {
					self.addPlace(place);
				});
			},

			places: {},

			getPlace: function(place) {

				// Skip going through all the tests below.
				if (!place) return;

				// Place (test using acl property)
				if (place.acl) {
					return place;
				}

				// Place ID or Key
				if (typeof place==="string") {
					return self.places[place.split("|")[0]];
				}
			},

			addPlace: function(place) {

				var place = self.places[place.id] = $.extend(
						{
							tasks: $.Threads({threadLimit: 1}),

							ready: $.Deferred(),

							baseFolder: function() {
								return self.getMeta(place.id + "|" +
self.media.options.directorySeparator);
							}
						},
						self.options.place,
						place
					);

					place.done = place.ready.done;

					place.fail = place.ready.fail;

					place.always = place.ready.always;


				var importJSON = function(data) {

					// When tree is not populated, it is an empty object.
					if ($.isEmptyObject(data)) return;

					// When tree is a string, it might be json string.
					if (typeof data === "string") {

						// Try to eval it.
						try { data = $.evalJSON(data); } catch(e) {}
					}

					return (typeof data === "object") ? data : undefined;
				}

				// Import initial file tree
				place.files = importJSON(place.files);

				if (place.files) {

					place.tasks.add(function(){
						self.importMeta(place.files);
						place.ready.resolve(place);
					});
				};

				place.populate = function() {

					if (place.populate.task!==undefined) return place.populate.task;

					place.populate.task = $.Deferred();

					// JomSocial & Flickr goes directly to getFileTree,
					// User & Shared folder getFolderTree first.
					place.populate[
						(/jomsocial|flickr/.test(place.id) || place.files) ?
"getFileTree" : "getFolderTree"
					]();

					return place.populate.task;
				};

				place.populate.getFolderTree = function() {

					// Get final folder tree
					return self.getRemoteMeta({place: place.id, foldersOnly: 1})
								.done(function(meta){

									// Import the folder tree
									place.tasks.add(function(){

										// #debug:start
										// var profiler = "Importing final folder tree for " +
place.id;
										// self.media.console("time", [profiler]);
										// #debug:end

										self.importMeta(meta);
										place.ready.resolve(place);

										// #debug:start
										// self.media.console("timeEnd", [profiler]);
										// #debug:end
									});

									place.populate.getFileTree();
								})
								.fail(function(){

									place.populate.task.reject(place);
									delete place.populate.task;

									place.ready.reject(place);
								});
				};

				place.populate.getFileTree = function() {

					// Get final file tree
					return self.getRemoteMeta({place: place.id})
								.done(function(meta){

									// Import the folder tree
									place.tasks.add(function(){

										// #debug:start
										// var profiler = "Importing final file tree for " +
place.id;
										// self.media.console("time", [profiler]);
										// #debug:end

										self.importMeta(meta);
										place.ready.resolve(place);
										place.populate.task.resolve(place);

										// #debug:start
										// self.media.console("timeEnd", [profiler]);
										// #debug:end
									});
								})
								.fail(function(){

									place.populate.task.reject(place);
									delete place.populate.task;
								});
				};

				if (place.populateImmediately) {
					place.populate();
				}

				return place;
			},

			meta: {},

			metadata: {}, // Extended data attribute for meta

			isMeta: function(meta) {

				return !(meta===undefined || !$.isPlainObject(meta) ||
$.isEmptyObject(meta));
			},

			get: function(key) {

				if (!self.meta.hasOwnProperty(key)) return;

				// Create a clone of the meta, keeping the original intact
				var meta = $.extend({}, self.meta[key]);

					// Extend meta with additional data attributes
					meta.data = self.metadata[key];

				return meta;
			},

			getKey: function(meta) {
				return (meta) ? meta.place + "|" + meta.path : null;
			},

			getParentKey: function(meta) {

				if (!meta) return;

				var key   = (typeof meta==="string") ? meta : (meta.key ||
self.getKey(meta)),
					start = key.indexOf(DS),
					end   = key.lastIndexOf(DS);

				return (end===key.length-1) ? undefined : key.substring(0, end +
((start===end) ? 1 : 0));
			},

			getMeta: function(meta) {

				// Skip going through all the tests below.
				if (!meta) return;

				// Meta
				if (self.isMeta(meta)) {

					// Try to get the updated meta,
					// if it doesn't work, just return the existing meta.
					return self.get(self.getKey(meta)) || meta;
				}

				// Key
				if (typeof meta==="string") {
					return self.get(meta); // meta == key
				}
			},

			getRemoteMeta: function(options) {

				var task = $.Deferred();
					task.retry = 0;

				var defaultOptions = {
						path: self.media.options.directorySeparator,
						retry: 3,
						retryAfter: 1000,
						variation: 0,
						foldersOnly: 0
					},
					options = $.extend(defaultOptions, options);

				// Don't do anything if place is not given
				if (options.place===undefined) {
					return task.rejectWith(task, "Error: Place not given!");
				}

				var loadRemoteMeta = (function() {

					task.loader =
						EasyBlog.ajax(
							"site.views.media.getMeta",
							options,
							{
								success: function(data) {
									task.resolveWith(task, arguments);
								},

								// Server-side error
								fail: function() {
									task.rejectWith(task, arguments);
								},

								// Network error
								error: function() {
									task.retry++;
									if (task.retry < options.retry) {
										loadRemoteMeta();
									} else {
										task.rejectWith(task, arguments);
									}
								}
							}
						);

					return arguments.callee;
				})();

				return task;
			},

			getMetaVariations: function(meta) {

				var meta = self.getMeta(meta);

				if (meta===undefined) return;

				return self.getRemoteMeta({place: meta.place, path: meta.path,
variation: 1})
						   .done(function(meta){
						   		self.addMeta(meta);
						    });
			},

			removeMetaVariation: function(meta, variationName) {

				var meta = self.getMeta(meta);

				if (meta===undefined) return;

				if (meta.variations===undefined) return;

				var variation;

				for (var i=0; i<meta.variations.length; i++) {

					if (meta.variations[i].name===variationName) {

						variation = meta.variations[i];

						meta.variations.splice(i, 1);

						break;
					}
				};

				return variation;
			},

			addMeta: function(meta) {

				var key = self.getKey(meta),
					existingMeta = self.getMeta(key);

				// If the meta passed in is the meta that we already have,
				// just return the existing meta.
				if (existingMeta && meta.hash===existingMeta.hash) return
existingMeta;

				// Create meta
				meta.key   = key;
				meta.hash  = $.uid();
				meta.group = (meta.type=="folder") ? "folders" :
"files";

				// Store parent key if this is not the top level folder
				meta.parentKey = self.getParentKey(meta);

				// Add friendly path
				var place = self.getPlace(meta.place);

				meta.friendlyPath =
					(meta.path===DS) ?
						place.title :
						place.title + meta.path.substring(meta.path.indexOf(DS),
meta.path.length);

				// Store it to our meta library
				self.meta[key] = meta;

				// Create metadata
				var data = meta.data = (self.metadata[key] || (self.metadata[key] =
$.eventable({})));

				// Additional metadata for folder type
				if (meta.type=="folder") {

					data.files   = data.files   || {};
					data.folders = data.folders || {};
					data.views   = data.views   || self.createMetaView(meta);
				}

				// For new meta, add to parent meta's view.
				if (!existingMeta) {

					var parentMeta = self.getMeta(meta.parentKey);

					if (parentMeta) {
						parentMeta.data.views.addMeta(meta);
					}

				// For existing meta, fire update event.
				} else {

					// Ensure events don't slow down adding of large list of metas
					setTimeout(function(){ meta.data.fire("updated", meta); },
0);
				}

				return meta;
			},

			removeMeta: function(meta) {

				var meta = self.getMeta(meta);

				if (meta===undefined) return;

				if (meta.type==="folder") {

					var folders = meta.data.folders,
						files = meta.data.files;

					for (key in folders) {
						self.removeMeta(key);
					}

					for (key in files) {
						self.removeMeta(key);
					}
				}

				// If this is not base folder
				if (meta.parentKey) {

					// Remove meta from parent
					var parentMeta = self.getMeta(meta.parentKey);

					if (parentMeta) {
						parentMeta.data.views.removeMeta(meta);
					}

					delete self.meta[meta.key];

					setTimeout(function(){ meta.data.fire("removed", meta); },
0);
				}

				return meta;
			},

			removeRemoteMeta: function(meta) {

				var task = $.Deferred();

				var meta = self.getMeta(meta);

				if (meta===undefined) {
					return task.rejectWith(task, "The file does not exist in the
media library.");
				}

				task.loader =
					EasyBlog.ajax(
						"site.views.media.delete",
						{
							place: meta.place,
							path: meta.path
						},
						{
							success: function() {

								self.removeMeta(meta);

								// Return the meta which is no longer in the library
								task.resolveWith(task, [meta]);
							},

							// Server-side error
							fail: function() {

								task.rejectWith(task, arguments);
							},

							// Network error
							error: function(xhr, errorStatus) {

								task.rejectWith(task, [errorStatus])
							}
						});

				return task;
			},

			createFolder: function(meta, name) {

				var task = $.Deferred();

				// Don't do anything if parent meta not found.
				var meta = self.getMeta(meta),
					place = meta.place;

				if (meta===undefined || meta.type!=="folder") {
					return task.rejectWith(task, "Parent folder was not
found.");
				}

				task.loader =
					EasyBlog.ajax(
						"site.views.media.createFolder",
						{
							place: place,
							path : meta.path + DS + name
						},
						{
							success: function(meta) {

								// #hack: Restore place property
								meta.place = place;
								var meta = self.addMeta(meta);

								task.resolveWith(task, [meta]);
							},

							// Server-side error
							fail: function() {

								task.rejectWith(task, arguments);
							},

							// Network error
							error: function(xhr, errorStatus) {

								task.rejectWith(task, [errorStatus])
							}
						}
					);

				return task;
			},

			importMeta: function(meta, recursive) {

				if (meta===undefined) return;

				if (meta.type!=="folder") return;

				if (recursive===undefined) recursive = true;

				// Remove the contents property
				// before adding into our meta library.
				var contents = meta.contents,
					length = contents.length;
					delete meta.contents;

					// Temporary hack
					contents.reverse();

				// If the folder meta was created before,
				// the update event is triggered by the parent.
				var folder = self.addMeta(meta),
					 data  = folder.data,
					_data  = {files: {}, folders: {}};

				var i = 0;

				while (i < length) {

					var meta  = self.addMeta(contents[i]),
						key   = meta.key,
						group = meta.group;

					_data[group][key] = delete data[group][key];

					i++;
				}

				for (key in data.files) {
					self.removeMeta(key);
				}

				for (key in data.folders) {
					self.removeMeta(key);
				}

				// Update to the new set of data
				data.folders = _data.folders;
				data.files   = _data.files;

				if (recursive) {
					for (key in data.folders) {
						self.importMeta(self.getMeta(key), recursive);
					}
				}

				return folder;
			},

			createMetaView: function(meta) {

				var view = {

					meta: meta,

					addMeta: function(meta) {

						for (mode in view.modes) {
							var viewMap = view.modes[mode][meta.group];
							viewMap && viewMap.add(meta);
						}
					},

					removeMeta: function(meta) {

						for (mode in view.modes) {
							var viewMap = view.modes[mode][meta.group];

							viewMap && viewMap.remove(meta);
						}
					},

					create: function(options) {

						var defaultOptions = {
							from: 0,
							to: 1024,
							mode: "dateModified",
							group: "files"
						};

						// Create monitor
						var monitor = $.Callbacks("unique memory");

						$.extend(

							monitor,

							defaultOptions,

							options,

							{
								uid: $.uid(),

								select: function(options) {

									// Update options
									$.extend(monitor, options);

									// Deregister from the previous map
									if (monitor.map) {
										delete monitor.map.monitors[monitor.uid];
									}

									monitor.map = view.modes[monitor.mode][monitor.group];

									// Register to the new map
									monitor.map.monitors[monitor.uid] = monitor;

									// #debug:start
									// self.media.console("log", ["Monitoring " +
monitor.group + " in " + meta.key, monitor]);
									// #debug:end

									return monitor.refresh();
								},

								updated: monitor.add,

								refresh: function() {

									return monitor.fire(monitor.map.slice(monitor.from, monitor.to));
								},

								destroy: function() {

									monitor.disable();

									if (monitor.map) {

										delete monitor.map.monitors[monitor.uid];
									}

									return monitor;
								}
							}
						);

						return monitor.select();
					}
				};

				// Extend view with view modes
				self.createViewModes(view);

				return view;
			},

			createViewModes: function(view) {

				// TODO: Make this extensible for other types of sort maps.
				view.modes = {
					dateModified: {
						folders: self.createViewMap(view, true), // Monkey patch
						files: self.createViewMap(view)
					}
				};

				return view;
			},

			// TODO: When createViewModes is extensible,
			//       this is only part of dateModified mode.
			createViewMap: function(view, folderGroup) {

				var map = $.extend([], {

					task: $.Threads({threadLimit: 1}),

					affectedIndex: [],

					add: function(meta) {

						map.task.add(function() {
							// TODO: Proper date modified insertion
							map.unshift(meta.key);
							map.affectedIndex.push(0);

							// Monkey patch to show folder tree in alphabetical order
							if (folderGroup) {
								map.sort().reverse();
							}

							map.refreshMonitor();
						});
					},

					remove: function(meta) {

						map.task.add(function() {

							var key = meta.key,
								i = map.length,
								position;

							while (i--) {
								if (map[i]===key) {
									position = i;
									break;
								}
							}

							if (position===undefined) return;

							map.splice(i, 1);
							map.affectedIndex.push(i);

							map.refreshMonitor();
						});
					},

					monitors: {},

					refreshMonitor: function() {

						clearTimeout(map.refreshMonitor.timer);

						map.refreshMonitor.timer = setTimeout(function(){

							var affectedIndex = map.affectedIndex;
							map.affectedIndex = [];

							map.task.add(function(){

								var l = affectedIndex.length,
									i = 0;

								for (id in map.monitors) {

									var monitor = map.monitors[id],
										from = monitor.from,
										to = monitor.to,
										i;

									for (i=0; i<l; i++) {

										var a = affectedIndex[i];

										if (a >= from || a <= to) {

											monitor.refresh();
											break;
										}
									}
								}
							});

						}, 250);
					}
				});

				return map;
			},

			search: function(keyword) {

				// TODO: Also remove DS from keyword
				if ($.trim(keyword)==="") return [];

				// #debug:start
				// var profiler = "Searching library using keyword '" +
keyword + "'";
				// self.media.console("time", [profiler]);
				// #debug:end

				var keyword = keyword.toLowerCase();

				var results = self.createMetaView({type: "search"});

				for (key in self.meta) {

					var parts = key.split("|"),
						place = parts[0],
						path = parts[1],
						meta = self.meta[key];

					if (/jomsocial|flickr/.test(place)) {
						// Note: This means that album name keyword cannot be matched.
						path = meta.title || "";
					}

					if (path.toLowerCase().match(keyword)) {
						results.addMeta(meta);
					}
				}

				// #debug:start
				// self.media.console("timeEnd", [profiler]);
				// #debug:end

				return results;
			}
		}}
	);

	EasyBlog.Controller("Media.Exporter",

		{
			defaultOptions: {

				view: {
					recentItem: "media/recent.item"
				},

				// Recent inserts
				"{recentActivities}"            :
".recentActivities",
				"{recentActivitiesDialog}"      : ".recentActivities
.modalPromptDialog",
				"{hideRecentActivitiesButton}"  : ".recentActivities
.promptHideButton",
				"{dashboardButton}"             : ".recentActivities
.dashboardButton",
				"{recentItemGroup}": ".recentItemGroup",
				"{recentItem}"     : ".recentItem"
			}
		},

		function(self){ return {

			init: function() {

				$Media.exporter = self;

				$Media.insert = self.insert;
			},

			handler: {},

			showDialog: function() {

				self.recentActivitiesDialog()
					.addClass("active");

				self.recentActivities()
					.css({top: 0, opacity: 1})
					.addClass("active");
			},

			hideDialog: function() {

				self.recentActivities()
					.animate({top: "-=50px", opacity: 0}, {duration: 250,
complete: function() {

							self.recentActivities()
								.removeClass("active");

							self.recentActivitiesDialog()
								.removeClass("active");
						}
					});
			},

			"{dashboardButton} click": function() {
				self.hideDialog();
			},

			"{hideRecentActivitiesButton} click": function() {

				self.hideDialog();
			},

			// Recent inserts
			insert: function(item, settings) {

				var meta = $Media.library.getMeta(item);

				if (meta===undefined) return;

				var task = self.create(meta.type, meta.key, settings);

				// Show dialog
				self.showDialog();

				// Create recent item
				task.recentItem =
					self.view.recentItem({meta: meta})
						.addClass("loading")
						.css({opacity: 0})
						.prependTo(self.recentItemGroup())
						.animate({opacity: 1}, {duration: 500, complete: function() {

							task
								.done(function(html) {

									if (html==="") {
										task.recentItem
											.removeClass("loading done")
											.addClass("error")
											.find(".itemProgress")
											.html($.language("COM_EASYBLOG_MM_UNABLE_TO_EXPORT_ITEM"));
									}

									if( typeof( tinyMCE ) != 'undefined' )
									{

										// If you are TinyMCE/JCE on IE
										if (tinyMCE && tinyMCE.isIE && $Media.IE==9) {

											// Get back the bookmark we stored just now
											var bookmark = $Media.bookmark;

											if (bookmark) {

												var editor = tinyMCE.editors.write_content;

												editor.selection.moveToBookmark({rng: bookmark.range});

												editor.execCommand('mceInsertContent', false, html);

											// Just in case we did not get the bookmark
											} else {

												EasyBlog.dashboard.editor.insert(html);
											}

										} else {

											EasyBlog.dashboard.editor.insert(html);
										}
									}
									else
									{
										EasyBlog.dashboard.editor.insert(html);
									}

									task.recentItem
										.removeClass("loading failed")
										.addClass("done")
										.find(".itemProgress")
										.html($.language("COM_EASYBLOG_MM_ITEM_INSERTED"));

									if ($Media.options.recentActivities.hideAfter > 0) {

										setTimeout(function(){ self.hideDialog(); },
$Media.options.recentActivities.hideAfter);
									}
								})
								.progress(function(message){

									if (task.recentItem.hasClass("done")) return;

									task.recentItem
										.find(".itemProgress")
										.html(message);
								})
								.fail(function(message){

									task.recentItem
										.removeClass("loading done")
										.addClass("error")
										.find(".itemProgress")
										.html(message);
								});
						}
					});

				return task;
			},

			create: function(type, key, settings) {

				var handler = self.handler[type],

					task = $.Deferred();

				if (handler===undefined) {

					var Exporter =
EasyBlog.Controller.Media.Exporter[$.String.capitalize(type)];

					if (Exporter===undefined) {

						task.reject($.language("COM_EASYBLOG_MM_UNABLE_TO_FIND_EXPORTER"));

						return task;
					}

					handler = self.handler[type] = new Exporter(self.element, $.extend({},
{settings: self.options[type], controller: { media: self.media }}));
				}

				handler.create(task, key, settings);

				return task;
			}

		}}
	);

	EasyBlog.Controller("Media.Exporter.File",

		{
			defaultOptions: {

				settings: {
					title: "",
					target: "_self",
					content: ""
				}
			}
		},

		function(self){ return {

			init: function() {

			},

			create: function(task, key, customSettings) {

				var settings = $.extend({}, self.options.settings, customSettings),

					meta = self.media.library.getMeta(key),

					link =
						$(document.createElement("A"))
							.attr({
								title: settings.title,
								target: settings.target,
								href: meta.url
							})
							.html((settings.content) ? settings.content : meta.title);

				task.resolve(link.toHTML());

				return task;
			}

		}}
	);

	EasyBlog.Controller("Media.Exporter.Folder",

		{
			defaultOptions: {

				settings: {

				}
			}
		},

		function(self){ return {

			init: function() {

			},

			create: function(task, key, customSettings) {

				var settings = $.extend({}, self.options.settings, customSettings),

					meta = self.media.library.getMeta(key),

					embedType = (meta.place=="jomsocial") ? "album" :
"gallery";

					settings.file = meta.path;

					settings.place = meta.place;

				var snippet = "[embed=" + embedType + "]" +
$.toJSON(settings) + "[/embed]";

				task.resolve(snippet);

				return task;
			}

		}}
	);

	EasyBlog.Controller("Media.Exporter.Image",

		{
			defaultOptions: {

				settings: {
					zoom: null, // variationName
					caption: null,
					enforceDimension: false,
					enforceWidth: null,
					enforceHeight: null,
					variation: null, // variationName
					defaultVariation: "thumbnail",
					defaultZoom: "original"
				}
			}
		},

		function(self){ return {

			init: function() {

			},

			create: function(task, key, customSettings) {

				var settings = $.extend({}, self.options.settings, customSettings),

					meta = self.media.library.getMeta(key),

					image = $(new Image());

					// Convert caption into html entities,
					// escape quotes and other special characters.
					var title = htmlentity(meta.title);

					image.attr({
						src: meta.thumbnail.url,
						alt: title,
						title: title
					});

				var resolve = function() {

						task.resolve(image.toHTML());
					},

					process = function() {

						var variations = {};

						$.each(meta.variations, function(i, variation) {
							variations[variation.name] = variation;
						});


						// Use provided variation, else use default variation, or the first
variation on the list.
						var variation = variations[settings.variation] ||
										variations[settings.defaultVariation] ||
										meta.variations[0];


						// Convert caption into html entities,
						// escape quotes and other special characters.
						var title = htmlentity(variation.title);

						// Use setting from selected variation
						image.attr({
							src: variation.url,
							alt: title,
							title: title
						});

						// Enforce dimension
						if (settings.enforceDimension) {

							if (settings.enforceWidth!==null &&
settings.enforceHeight!==null) {

								var sizes = $.Image.resizeWithin(
									variation.width, variation.height,
									settings.enforceWidth, settings.enforceHeight
								);

								// Turn it into whole number
								sizes.width = Math.floor(sizes.width);
								sizes.height = Math.floor(sizes.height);

								image.attr(sizes);
							}
						}

						// Image caption
						if (settings.caption!==null) {

							// Convert caption into html entities,
							// escape quotes and other special characters.
							var caption = htmlentity(settings.caption);

							image
								.addClass("easyblog-image-caption")
								.attr("title", caption);
						}

						// Image zooming capabilities
						if (settings.zoom!==null) {

							var zoomWith = variations[settings.zoom] ||
										   variations[settings.defaultZoom] ||
										   {url: meta.thumbnail.url, title: meta.title};

							var title = htmlentity(settings.caption || zoomWith.title ||
"");

							image =
								$("<a>")
									.addClass("easyblog-thumb-preview")
									.attr({
										href: zoomWith.url,
										title: title
									})
									.html(image);
						};

						resolve();
					}

				// If any of these criterias were true,
				// we need to retrieve the variations.
				if (settings.variation || settings.zoom || settings.enforceWidth ||
settings.enforceHeight) {

					// If the variations hasn't been loaded
					if (meta.variations===undefined) {

						task.notify($.language("COM_EASYBLOG_MM_GETTING_IMAGE_SIZES"));

						// Then get it first
						self.media.library.getMetaVariations(key)
							.done(function(metaWithVariations) {

								// Add variations to our meta
								meta = metaWithVariations;

								// Process the rest of the image settings
								process();
							})
							.fail(function() {

								// If the ajax call failed, reject task.
								task.reject($.language("COM_EASYBLOG_MM_UNABLE_TO_RETRIEVE_VARIATIONS"));
							});

					// If variations has been loaded,
					// process the rest of the image settings now.
					} else {

						process();
					}

				// If there are no fancy image settings,
				// the default one will work just fine.
				} else {

					resolve();
				}

				return task;
			}

		}}
	);

	EasyBlog.Controller("Media.Exporter.Audio",

		{
			defaultOptions: {
				width: 400,
				height: 24,
				autostart: false,
				controlbar: "bottom",
				backcolor: "#333333",
				frontcolor: "#ffffff"
			}
		},

		function(self){ return {

			init: function() {

			},

			create: function(task, key, customSettings) {

				var settings = $.extend({}, self.options.settings, customSettings),

					meta = self.media.library.getMeta(key);

					settings.file = meta.path;

					settings.place = meta.place;

				var snippet = "[embed=audio]" + $.toJSON(settings) +
"[/embed]";

				task.resolve(snippet);

				return task;
			}

		}}
	);

	EasyBlog.Controller("Media.Exporter.Video",

		{
			defaultOptions: {

				settings: {
					width: 400,
					height: 225,
					autostart: false,
					controlbar: "bottom",
					backcolor: "#333333",
					frontcolor: "#ffffff"
				}
			}
		},

		function(self){ return {

			init: function() {

			},

			create: function(task, key, customSettings) {

				var settings = $.extend({}, self.options.settings, customSettings),

					meta = self.media.library.getMeta(key);

					settings.file = meta.path;

					settings.place = meta.place;

				var snippet = "[embed=video]" + $.toJSON(settings) +
"[/embed]";

				task.resolve(snippet);

				return task;
			}

		}}
	);

	EasyBlog.Controller("MediaLauncher",

		{
			defaultOptions: {
				"{uploadImageButton}": ".uploadImageButton",
				"{chooseImageButton}": ".chooseImageButton"
			}
		},

		function(self) { return {

			init: function() {

				$("#media_manager_button").click(function(){
					EasyBlog.mediaManager.browse();
				});
			},

			"{uploadImageButton} click": function() {

				EasyBlog.mediaManager.upload();
			},

			"{chooseImageButton} click": function() {


				EasyBlog.mediaManager.browse();
			}
		}}
	);

	//
	// 2. Initialize media manager.
	//
	var container =
$(document.createElement("div")).attr("id",
"EasyBlogMediaManager").appendTo("body");

	EasyBlog.mediaManager = new EasyBlog.Controller.Media(container);
});

home/lmsyaran/public_html/j3/media/com_easyblog/scripts/media.js000064400000051273151177624330021007
0ustar00EasyBlog.module("media",function(e){var
t=this,n=function(t){return
e("<div>").text(t).html().replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")},r,i,s,o,u;EasyBlog.Controller("Media",{defaultOptions:{debug:{logging:EasyBlog.debug,itemVisibility:!1,delayConfiguration:0,delayCommon:0,delayBrowser:0,delayUploader:0,delayEditor:0},ui:"#EasyBlogMediaManagerUI",overlay:{background:"black",opacity:0},modal:{size:.9},recentActivities:{hideAfter:3e3},"{modalGroup}":".mediaModalGroup","{modal}":".mediaModal","{loaderModal}":".loaderModal","{uploaderModal}":".uploaderModal","{browserModal}":".browserModal","{editorModal}":".editorModal","{modalContent}":".modalContent","{overlay}":".media-overlay","{modalDashboardButton}":".dashboardButton","{assetItem}":".assetItem"}},function(n){return{console:function(e,t){if(!n.options.debug.logging)return;var
r=window.console;if(!r)return;var
e=r[e];if(!e)return;e.apply?e.apply(r,t):e(t.join("
"))},assets:{},getAsset:function(t){if(n.assets[t]===undefined){var
r=n.assets[t]=e.Deferred();r.done(function(){n.assetItem(".asset-type-"+t).removeClass("loading
done
failed").addClass("done")}).fail(function(){n.assetItem(".asset-type-"+t).removeClass("loading
done failed").addClass("fail")})}return
n.assets[t]},createAsset:function(e,t,r){var i=n.getAsset(e);return
i.factory=t,setTimeout(function(){i.factory&&i.factory(i)},r),i},init:function(){r=n,n.IE=function(){var
e,t=3,n=document.createElement("div"),r=n.getElementsByTagName("i");while(n.innerHTML="<!--[if
gt IE "+
++t+"]><i></i><![endif]-->",r[0]);return
t>4?t:e}();if(typeof
tinyMCE!="undefined"&&tinyMCE&&tinyMCE.isIE&&n.IE==9)var
t=setInterval(function(){var
r=tinyMCE.editors.write_content;if(!r)return;var
i="keydown.mediaManager mousedown.mediaManager
focus.mediaManager";e(r.contentWindow).off(i).on(i,function(){n.bookmark={element:r.selection.getEnd(),range:r.selection.getBookmark(1).rng}}),clearInterval(t)},500);n.originalBodyOverflow=e("body").css("overflow"),n.createAsset("configuration",function(e){EasyBlog.module("media/configuration").done(function(){var
t=this;n.initialize(this),e.resolve()}).fail(function(){e.reject()})},n.options.debug.delayConfiguration),n.createAsset("common",function(e){EasyBlog.require().script("media/navigation").view("media/recent.item","media/browser","media/browser.item-group","media/browser.item","media/browser.tree-item-group","media/browser.tree-item","media/browser.pagination-page","media/browser.uploader","media/browser.uploader.item","media/editor","media/editor.viewport","media/navigation.item","media/navigation.itemgroup").language("COM_EASYBLOG_MM_UNABLE_TO_FIND_EXPORTER","COM_EASYBLOG_MM_GETTING_IMAGE_SIZES","COM_EASYBLOG_MM_UNABLE_TO_RETRIEVE_VARIATIONS","COM_EASYBLOG_MM_ITEM_INSERTED","COM_EASYBLOG_MM_UPLOADING","COM_EASYBLOG_MM_UPLOADING_STATE","COM_EASYBLOG_MM_UPLOADING_PENDING","COM_EASYBLOG_MM_UPLOAD_COMPLETE","COM_EASYBLOG_MM_UPLOAD_PREPARING","COM_EASYBLOG_MM_UPLOAD_UNABLE_PARSE_RESPONSE","COM_EASYBLOG_MM_UPLOADING_LEFT","COM_EASYBLOG_MM_CONFIRM_DELETE_ITEM","COM_EASYBLOG_MM_CANCEL_BUTTON","COM_EASYBLOG_MM_YES_BUTTON","COM_EASYBLOG_MM_ITEM_DELETE_CONFIRMATION").stylesheet("media/style").done(function(){e.resolve()}).fail(function(){e.reject()})},n.options.debug.delayCommon),n.createAsset("uploader",function(t){e.when(n.getAsset("configuration"),n.getAsset("common"),EasyBlog.require().script("media/uploader").done()).done(function(){var
e=n.createModal("uploader");o=e.controller=new
EasyBlog.Controller.Media.Uploader(e.element,n.options.uploader),t.resolve()}).fail(function(){t.reject()})},n.options.debug.delayUploader),n.createAsset("browser",function(t){e.when(n.getAsset("configuration"),n.getAsset("common"),EasyBlog.require().script("media/browser").done()).done(function(){var
e=n.createModal("browser");s=e.controller=new
EasyBlog.Controller.Media.Browser(e.element,n.options.browser),t.resolve()}).fail(function(){t.reject()})},n.options.debug.delayBrowser),n.createAsset("editor",function(t){e.when(n.getAsset("browser"),EasyBlog.require().script("media/editor").done()).done(function(){var
e=n.createModal("editor");e.controller=new
EasyBlog.Controller.Media.Editor(e.element,n.options.editor),t.resolve()}).fail(function(){t.reject()})},n.options.debug.delayEditor),EasyBlog.require().library("throttle-debounce").done(function(){n.setLayout=e.debounce(200,n._setLayout)})},initialize:function(r){var
i={controller:{media:n}},r=e.extend(!0,r,{browser:i,uploader:i,library:i,editor:i,exporter:i});n.update(r),u=r.directorySeparator;var
s=e(n.options.ui);n.element.append(s.html()),s.remove(),n.overlay().css(n.options.overlay),n.loader=new
EasyBlog.Controller.Media.Loader(n.createModal("loader"),{controller:{media:n}}),n.element.implement(EasyBlog.Controller.Media.Library,n.options.library,function(){}),n.element.implement(EasyBlog.Controller.Media.Exporter,n.options.exporter),t.resolve()},setLayout:function(){n._setLayout()},_setLayout:function(){return
n.layout=n.element.hasClass("active")?e.uid():null,n.layout&&n.setModalLayout(),n.layout},modals:{},createModal:function(t){var
r=n.modal("."+t+"Modal");return
r.length<1&&(r=e('<div
class="mediaModal"></div>').addClass(t+"Modal").appendTo(n.modalGroup())),n.modals[t]={name:t,element:r}},activateModal:function(e,t){if(n.modals[e]===undefined){n.loader.when(n.assets[e]).done(function(){setTimeout(function(){n.activateModal(e,t)},1e3)});return}if(n.currentModal===e)return!0;var
r=n.modals[e];if(!r)return!1;n.deactivateModal(n.currentModal),n.currentModal=e,n.show();var
i=r.controller;return
i&&i.trigger("modalActivate",t),!0},deactivateModal:function(e,t){var
r=n.modals[e];if(!r)return!1;var
i=r.controller;if(i)try{i.trigger("modalDeactivate",t)}catch(s){console.error(s)}return
r.element.removeClass("active"),n.currentModal=undefined,!0},setModalLayout:function(){clearTimeout(n.setModalLayout.task);var
t=n.modals[n.currentModal];if(!t)return;if(!n.layout)return
n._setLayout();t.element.addClass("active");var
r=t.controller;if(r&&e.isFunction(r.setLayout)){var
i=function(){var
e=r.element.offset();e.top===0||e.left===0?n.setModalLayout.task=setTimeout(i,50):r.setLayout()};i()}},show:function(){n.element.addClass("active"),n._setLayout(),n.trigger("showModal")},hide:function(){n.element.removeClass("active"),n.deactivateModal(n.currentModal),n.trigger("hideModal")},"{overlay}
click":function(){n.hide()},"{window}
resize":function(){n.setLayout()},"{modalDashboardButton}
click":function(e,t){if(t.shiftKey)return
n.console("dir",[n]);n.hide()},upload:function(){n.activateModal("uploader",arguments)},browse:function(){n.activateModal("browser",arguments)},edit:function(){n.activateModal("editor",arguments)}}}),EasyBlog.Controller("Media.Loader",{defaultOptions:{}},function(t){return{init:function(){},when:function(){t.media.activateModal("loader");var
n=e.when.apply(null,arguments),r=n.done;return
n.id=e.uid(),n.done=function(e){r(function(){t.currentQueueId==n.id&&e&&e()})},t.currentQueueId=n.id,n},"{self}
hide":function(){t.currentQueueId=null}}}),EasyBlog.Controller("Media.Prompt",{defaultOptions:{"{dialog}":".modalPromptDialog","{cancelButton}":".promptCancelButton"}},function(e){return{init:function(){},get:function(t){var
n=e.dialog("."+t);return
e.instantiate(n)},instantiate:function(t){var
n={element:t,show:function(){return
t.addClass("active"),e.element.addClass("active"),n},hide:function(){return
t.removeClass("active"),e.element.removeClass("active"),n},state:function(e){var
r=t.data("lastPromptState");if(e===undefined)return r;var
i=function(e){return
t.find(".promptState.state-"+e)},s=i(e),r=i(r);if(s.length<1)return;return
r.removeClass("active"),s.addClass("active"),t.data("lastPromptState",e),n}};return
n},hideAll:function(){e.dialog().removeClass("active"),e.element.removeClass("active")},"{cancelButton}
click":function(){e.hideAll()}}}),EasyBlog.Controller("Media.Library",{defaultOptions:{places:[],place:{files:{},acl:{canCreateFolder:!1,canUploadItem:!1,canRenameItem:!1,canRemoveItem:!1,canCreateVariation:!1,canDeleteVariation:!1},populateImmediately:!1}}},function(t){return{init:function(){t.media.library=t,e.each(t.options.places,function(e,n){t.addPlace(n)})},places:{},getPlace:function(e){if(!e)return;if(e.acl)return
e;if(typeof e=="string")return
t.places[e.split("|")[0]]},addPlace:function(n){var
n=t.places[n.id]=e.extend({tasks:e.Threads({threadLimit:1}),ready:e.Deferred(),baseFolder:function(){return
t.getMeta(n.id+"|"+t.media.options.directorySeparator)}},t.options.place,n);n.done=n.ready.done,n.fail=n.ready.fail,n.always=n.ready.always;var
r=function(t){if(e.isEmptyObject(t))return;if(typeof
t=="string")try{t=e.evalJSON(t)}catch(n){}return typeof
t=="object"?t:undefined};return
n.files=r(n.files),n.files&&n.tasks.add(function(){t.importMeta(n.files),n.ready.resolve(n)}),n.populate=function(){return
n.populate.task!==undefined?n.populate.task:(n.populate.task=e.Deferred(),n.populate[/jomsocial|flickr/.test(n.id)||n.files?"getFileTree":"getFolderTree"](),n.populate.task)},n.populate.getFolderTree=function(){return
t.getRemoteMeta({place:n.id,foldersOnly:1}).done(function(e){n.tasks.add(function(){t.importMeta(e),n.ready.resolve(n)}),n.populate.getFileTree()}).fail(function(){n.populate.task.reject(n),delete
n.populate.task,n.ready.reject(n)})},n.populate.getFileTree=function(){return
t.getRemoteMeta({place:n.id}).done(function(e){n.tasks.add(function(){t.importMeta(e),n.ready.resolve(n),n.populate.task.resolve(n)})}).fail(function(){n.populate.task.reject(n),delete
n.populate.task})},n.populateImmediately&&n.populate(),n},meta:{},metadata:{},isMeta:function(t){return
t!==undefined&&!!e.isPlainObject(t)&&!e.isEmptyObject(t)},get:function(n){if(!t.meta.hasOwnProperty(n))return;var
r=e.extend({},t.meta[n]);return
r.data=t.metadata[n],r},getKey:function(e){return
e?e.place+"|"+e.path:null},getParentKey:function(e){if(!e)return;var
n=typeof
e=="string"?e:e.key||t.getKey(e),r=n.indexOf(u),i=n.lastIndexOf(u);return
i===n.length-1?undefined:n.substring(0,i+(r===i?1:0))},getMeta:function(e){if(!e)return;if(t.isMeta(e))return
t.get(t.getKey(e))||e;if(typeof e=="string")return
t.get(e)},getRemoteMeta:function(n){var r=e.Deferred();r.retry=0;var
i={path:t.media.options.directorySeparator,retry:3,retryAfter:1e3,variation:0,foldersOnly:0},n=e.extend(i,n);if(n.place===undefined)return
r.rejectWith(r,"Error: Place not given!");var s=function(){return
r.loader=EasyBlog.ajax("site.views.media.getMeta",n,{success:function(e){r.resolveWith(r,arguments)},fail:function(){r.rejectWith(r,arguments)},error:function(){r.retry++,r.retry<n.retry?s():r.rejectWith(r,arguments)}}),arguments.callee}();return
r},getMetaVariations:function(e){var
e=t.getMeta(e);if(e===undefined)return;return
t.getRemoteMeta({place:e.place,path:e.path,variation:1}).done(function(e){t.addMeta(e)})},removeMetaVariation:function(e,n){var
e=t.getMeta(e);if(e===undefined)return;if(e.variations===undefined)return;var
r;for(var
i=0;i<e.variations.length;i++)if(e.variations[i].name===n){r=e.variations[i],e.variations.splice(i,1);break}return
r},addMeta:function(n){var
r=t.getKey(n),i=t.getMeta(r);if(i&&n.hash===i.hash)return
i;n.key=r,n.hash=e.uid(),n.group=n.type=="folder"?"folders":"files",n.parentKey=t.getParentKey(n);var
s=t.getPlace(n.place);n.friendlyPath=n.path===u?s.title:s.title+n.path.substring(n.path.indexOf(u),n.path.length),t.meta[r]=n;var
o=n.data=t.metadata[r]||(t.metadata[r]=e.eventable({}));n.type=="folder"&&(o.files=o.files||{},o.folders=o.folders||{},o.views=o.views||t.createMetaView(n));if(!i){var
a=t.getMeta(n.parentKey);a&&a.data.views.addMeta(n)}else
setTimeout(function(){n.data.fire("updated",n)},0);return
n},removeMeta:function(e){var
e=t.getMeta(e);if(e===undefined)return;if(e.type==="folder"){var
n=e.data.folders,r=e.data.files;for(key in n)t.removeMeta(key);for(key in
r)t.removeMeta(key)}if(e.parentKey){var
i=t.getMeta(e.parentKey);i&&i.data.views.removeMeta(e),delete
t.meta[e.key],setTimeout(function(){e.data.fire("removed",e)},0)}return
e},removeRemoteMeta:function(n){var r=e.Deferred(),n=t.getMeta(n);return
n===undefined?r.rejectWith(r,"The file does not exist in the media
library."):(r.loader=EasyBlog.ajax("site.views.media.delete",{place:n.place,path:n.path},{success:function(){t.removeMeta(n),r.resolveWith(r,[n])},fail:function(){r.rejectWith(r,arguments)},error:function(e,t){r.rejectWith(r,[t])}}),r)},createFolder:function(n,r){var
i=e.Deferred(),n=t.getMeta(n),s=n.place;return
n===undefined||n.type!=="folder"?i.rejectWith(i,"Parent
folder was not
found."):(i.loader=EasyBlog.ajax("site.views.media.createFolder",{place:s,path:n.path+u+r},{success:function(e){e.place=s;var
e=t.addMeta(e);i.resolveWith(i,[e])},fail:function(){i.rejectWith(i,arguments)},error:function(e,t){i.rejectWith(i,[t])}}),i)},importMeta:function(e,n){if(e===undefined)return;if(e.type!=="folder")return;n===undefined&&(n=!0);var
r=e.contents,i=r.length;delete e.contents,r.reverse();var
s=t.addMeta(e),o=s.data,u={files:{},folders:{}},a=0;while(a<i){var
e=t.addMeta(r[a]),f=e.key,l=e.group;u[l][f]=delete o[l][f],a++}for(f in
o.files)t.removeMeta(f);for(f in
o.folders)t.removeMeta(f);o.folders=u.folders,o.files=u.files;if(n)for(f in
o.folders)t.importMeta(t.getMeta(f),n);return
s},createMetaView:function(n){var r={meta:n,addMeta:function(e){for(mode in
r.modes){var
t=r.modes[mode][e.group];t&&t.add(e)}},removeMeta:function(e){for(mode
in r.modes){var
t=r.modes[mode][e.group];t&&t.remove(e)}},create:function(t){var
n={from:0,to:1024,mode:"dateModified",group:"files"},i=e.Callbacks("unique
memory");return e.extend(i,n,t,{uid:e.uid(),select:function(t){return
e.extend(i,t),i.map&&delete
i.map.monitors[i.uid],i.map=r.modes[i.mode][i.group],i.map.monitors[i.uid]=i,i.refresh()},updated:i.add,refresh:function(){return
i.fire(i.map.slice(i.from,i.to))},destroy:function(){return
i.disable(),i.map&&delete
i.map.monitors[i.uid],i}}),i.select()}};return
t.createViewModes(r),r},createViewModes:function(e){return
e.modes={dateModified:{folders:t.createViewMap(e,!0),files:t.createViewMap(e)}},e},createViewMap:function(t,n){var
r=e.extend([],{task:e.Threads({threadLimit:1}),affectedIndex:[],add:function(e){r.task.add(function(){r.unshift(e.key),r.affectedIndex.push(0),n&&r.sort().reverse(),r.refreshMonitor()})},remove:function(e){r.task.add(function(){var
t=e.key,n=r.length,i;while(n--)if(r[n]===t){i=n;break}if(i===undefined)return;r.splice(n,1),r.affectedIndex.push(n),r.refreshMonitor()})},monitors:{},refreshMonitor:function(){clearTimeout(r.refreshMonitor.timer),r.refreshMonitor.timer=setTimeout(function(){var
e=r.affectedIndex;r.affectedIndex=[],r.task.add(function(){var
t=e.length,n=0;for(id in r.monitors){var
i=r.monitors[id],s=i.from,o=i.to,n;for(n=0;n<t;n++){var
u=e[n];if(u>=s||u<=o){i.refresh();break}}}})},250)}});return
r},search:function(n){if(e.trim(n)==="")return[];var
n=n.toLowerCase(),r=t.createMetaView({type:"search"});for(key in
t.meta){var
i=key.split("|"),s=i[0],o=i[1],u=t.meta[key];/jomsocial|flickr/.test(s)&&(o=u.title||""),o.toLowerCase().match(n)&&r.addMeta(u)}return
r}}}),EasyBlog.Controller("Media.Exporter",{defaultOptions:{view:{recentItem:"media/recent.item"},"{recentActivities}":".recentActivities","{recentActivitiesDialog}":".recentActivities
.modalPromptDialog","{hideRecentActivitiesButton}":".recentActivities
.promptHideButton","{dashboardButton}":".recentActivities
.dashboardButton","{recentItemGroup}":".recentItemGroup","{recentItem}":".recentItem"}},function(t){return{init:function(){r.exporter=t,r.insert=t.insert},handler:{},showDialog:function(){t.recentActivitiesDialog().addClass("active"),t.recentActivities().css({top:0,opacity:1}).addClass("active")},hideDialog:function(){t.recentActivities().animate({top:"-=50px",opacity:0},{duration:250,complete:function(){t.recentActivities().removeClass("active"),t.recentActivitiesDialog().removeClass("active")}})},"{dashboardButton}
click":function(){t.hideDialog()},"{hideRecentActivitiesButton}
click":function(){t.hideDialog()},insert:function(n,i){var
s=r.library.getMeta(n);if(s===undefined)return;var
o=t.create(s.type,s.key,i);return
t.showDialog(),o.recentItem=t.view.recentItem({meta:s}).addClass("loading").css({opacity:0}).prependTo(t.recentItemGroup()).animate({opacity:1},{duration:500,complete:function(){o.done(function(n){n===""&&o.recentItem.removeClass("loading
done").addClass("error").find(".itemProgress").html(e.language("COM_EASYBLOG_MM_UNABLE_TO_EXPORT_ITEM"));if(typeof
tinyMCE!="undefined")if(tinyMCE&&tinyMCE.isIE&&r.IE==9){var
i=r.bookmark;if(i){var
s=tinyMCE.editors.write_content;s.selection.moveToBookmark({rng:i.range}),s.execCommand("mceInsertContent",!1,n)}else
EasyBlog.dashboard.editor.insert(n)}else
EasyBlog.dashboard.editor.insert(n);else
EasyBlog.dashboard.editor.insert(n);o.recentItem.removeClass("loading
failed").addClass("done").find(".itemProgress").html(e.language("COM_EASYBLOG_MM_ITEM_INSERTED")),r.options.recentActivities.hideAfter>0&&setTimeout(function(){t.hideDialog()},r.options.recentActivities.hideAfter)}).progress(function(e){if(o.recentItem.hasClass("done"))return;o.recentItem.find(".itemProgress").html(e)}).fail(function(e){o.recentItem.removeClass("loading
done").addClass("error").find(".itemProgress").html(e)})}}),o},create:function(n,r,i){var
s=t.handler[n],o=e.Deferred();if(s===undefined){var
u=EasyBlog.Controller.Media.Exporter[e.String.capitalize(n)];if(u===undefined)return
o.reject(e.language("COM_EASYBLOG_MM_UNABLE_TO_FIND_EXPORTER")),o;s=t.handler[n]=new
u(t.element,e.extend({},{settings:t.options[n],controller:{media:t.media}}))}return
s.create(o,r,i),o}}}),EasyBlog.Controller("Media.Exporter.File",{defaultOptions:{settings:{title:"",target:"_self",content:""}}},function(t){return{init:function(){},create:function(n,r,i){var
s=e.extend({},t.options.settings,i),o=t.media.library.getMeta(r),u=e(document.createElement("A")).attr({title:s.title,target:s.target,href:o.url}).html(s.content?s.content:o.title);return
n.resolve(u.toHTML()),n}}}),EasyBlog.Controller("Media.Exporter.Folder",{defaultOptions:{settings:{}}},function(t){return{init:function(){},create:function(n,r,i){var
s=e.extend({},t.options.settings,i),o=t.media.library.getMeta(r),u=o.place=="jomsocial"?"album":"gallery";s.file=o.path,s.place=o.place;var
a="[embed="+u+"]"+e.toJSON(s)+"[/embed]";return
n.resolve(a),n}}}),EasyBlog.Controller("Media.Exporter.Image",{defaultOptions:{settings:{zoom:null,caption:null,enforceDimension:!1,enforceWidth:null,enforceHeight:null,variation:null,defaultVariation:"thumbnail",defaultZoom:"original"}}},function(t){return{init:function(){},create:function(r,i,s){var
o=e.extend({},t.options.settings,s),u=t.media.library.getMeta(i),a=e(new
Image),f=n(u.title);a.attr({src:u.thumbnail.url,alt:f,title:f});var
l=function(){r.resolve(a.toHTML())},c=function(){var
t={};e.each(u.variations,function(e,n){t[n.name]=n});var
r=t[o.variation]||t[o.defaultVariation]||u.variations[0],i=n(r.title);a.attr({src:r.url,alt:i,title:i});if(o.enforceDimension&&o.enforceWidth!==null&&o.enforceHeight!==null){var
s=e.Image.resizeWithin(r.width,r.height,o.enforceWidth,o.enforceHeight);s.width=Math.floor(s.width),s.height=Math.floor(s.height),a.attr(s)}if(o.caption!==null){var
f=n(o.caption);a.addClass("easyblog-image-caption").attr("title",f)}if(o.zoom!==null){var
c=t[o.zoom]||t[o.defaultZoom]||{url:u.thumbnail.url,title:u.title},i=n(o.caption||c.title||"");a=e("<a>").addClass("easyblog-thumb-preview").attr({href:c.url,title:i}).html(a)}l()};return
o.variation||o.zoom||o.enforceWidth||o.enforceHeight?u.variations===undefined?(r.notify(e.language("COM_EASYBLOG_MM_GETTING_IMAGE_SIZES")),t.media.library.getMetaVariations(i).done(function(e){u=e,c()}).fail(function(){r.reject(e.language("COM_EASYBLOG_MM_UNABLE_TO_RETRIEVE_VARIATIONS"))})):c():l(),r}}}),EasyBlog.Controller("Media.Exporter.Audio",{defaultOptions:{width:400,height:24,autostart:!1,controlbar:"bottom",backcolor:"#333333",frontcolor:"#ffffff"}},function(t){return{init:function(){},create:function(n,r,i){var
s=e.extend({},t.options.settings,i),o=t.media.library.getMeta(r);s.file=o.path,s.place=o.place;var
u="[embed=audio]"+e.toJSON(s)+"[/embed]";return
n.resolve(u),n}}}),EasyBlog.Controller("Media.Exporter.Video",{defaultOptions:{settings:{width:400,height:225,autostart:!1,controlbar:"bottom",backcolor:"#333333",frontcolor:"#ffffff"}}},function(t){return{init:function(){},create:function(n,r,i){var
s=e.extend({},t.options.settings,i),o=t.media.library.getMeta(r);s.file=o.path,s.place=o.place;var
u="[embed=video]"+e.toJSON(s)+"[/embed]";return
n.resolve(u),n}}}),EasyBlog.Controller("MediaLauncher",{defaultOptions:{"{uploadImageButton}":".uploadImageButton","{chooseImageButton}":".chooseImageButton"}},function(t){return{init:function(){e("#media_manager_button").click(function(){EasyBlog.mediaManager.browse()})},"{uploadImageButton}
click":function(){EasyBlog.mediaManager.upload()},"{chooseImageButton}
click":function(){EasyBlog.mediaManager.browse()}}});var
a=e(document.createElement("div")).attr("id","EasyBlogMediaManager").appendTo("body");EasyBlog.mediaManager=new
EasyBlog.Controller.Media(a)});