diff --git a/application/controllers/LibraryController.php b/application/controllers/LibraryController.php
index 1d8755f1e..452999acf 100644
--- a/application/controllers/LibraryController.php
+++ b/application/controllers/LibraryController.php
@@ -29,7 +29,6 @@ class LibraryController extends Zend_Controller_Action
{
$this->view->headScript()->appendFile('/js/campcaster/onready/library.js','text/javascript');
$this->view->headScript()->appendFile('/js/contextmenu/jjmenu.js','text/javascript');
- $this->view->headScript()->appendFile('/js/campcaster/library/context-menu.js','text/javascript');
$this->view->headLink()->appendStylesheet('/css/contextmenu.css');
$this->_helper->layout->setLayout('library');
@@ -46,22 +45,33 @@ class LibraryController extends Zend_Controller_Action
$id = $this->_getParam('id');
$type = $this->_getParam('type');
- $callback = 'window["contextMenu"]';
$params = '/format/json/id/#id#/type/#type#';
$pl_sess = $this->pl_sess;
if($type === "au") {
- $menu[] = array('action' => '/Library/delete'.$params, 'title' => 'Delete');
+ $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Library/delete'.$params, 'callback' => 'window["deleteAudioClip"]'),
+ 'title' => 'Delete');
- if(isset($pl_sess->id))
- $menu[] = array('action' => '/Playlist/add-item'.$params, 'title' => 'Add To Playlist');
+ if(isset($pl_sess->id)) {
+ $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Playlist/add-item'.$params, 'callback' => 'window["setSPLContent"]'),
+ 'title' => 'Add to Playlist');
+ }
}
else if($type === "pl") {
- $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Playlist/delete'.$params, 'callback' => $callback), 'title' => 'Delete');
+ $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Playlist/delete'.$params, 'callback' => 'window["deletePlaylist"]'),
+ 'title' => 'Delete');
+
+ if(!isset($pl_sess->id) || $pl_sess->id !== $id) {
+ $menu[] = array('action' =>
+ array('type' => 'ajax',
+ 'url' => '/Playlist/edit/view/spl'.$params,
+ 'callback' => 'window["openDiffSPL"]'),
+ 'title' => 'Edit');
+ }
}
@@ -93,7 +103,8 @@ class LibraryController extends Zend_Controller_Action
return;
}
}
-
+
+ $this->view->id = $id;
}
public function contentsAction()
diff --git a/application/controllers/PlaylistController.php b/application/controllers/PlaylistController.php
index 2fca21295..e0d7136cd 100644
--- a/application/controllers/PlaylistController.php
+++ b/application/controllers/PlaylistController.php
@@ -19,6 +19,7 @@ class PlaylistController extends Zend_Controller_Action
->addActionContext('set-cue', 'json')
->addActionContext('move-item', 'json')
->addActionContext('close', 'json')
+ ->addActionContext('edit', 'json')
->addActionContext('delete-active', 'json')
->addActionContext('delete', 'json')
->initContext();
@@ -44,6 +45,28 @@ class PlaylistController extends Zend_Controller_Action
$this->_helper->redirector('index');
}
+ private function changePlaylist($pl_id){
+
+ $pl_sess = $this->pl_sess;
+
+ if(isset($pl_sess->id)) {
+
+ $pl = Playlist::Recall($pl_sess->id);
+ if($pl !== FALSE) {
+ $this->closePlaylist($pl);
+ }
+ }
+
+ $userInfo = Zend_Auth::getInstance()->getStorage()->read();
+
+ $pl = Playlist::Recall($pl_id);
+ if($pl === FALSE) {
+ return FALSE;
+ }
+ $pl->lock($userInfo->id);
+ $pl_sess->id = $pl_id;
+ }
+
private function closePlaylist($pl)
{
$userInfo = Zend_Auth::getInstance()->getStorage()->read();
@@ -68,10 +91,9 @@ class PlaylistController extends Zend_Controller_Action
$pl = new Playlist();
$pl_id = $pl->create("Test Zend Auth");
$pl->setPLMetaData('dc:creator', $userInfo->login);
- $pl->lock($userInfo->id);
//set this playlist as active id.
- $pl_sess->id = $pl_id;
+ $this->changePlaylist($pl_id);
$this->_helper->redirector('metadata');
}
@@ -102,12 +124,22 @@ class PlaylistController extends Zend_Controller_Action
public function editAction()
{
- $this->view->headScript()->appendFile('/js/campcaster/playlist/playlist.js','text/javascript');
+ $this->view->headScript()->appendFile('/js/campcaster/playlist/playlist.js','text/javascript');
+ $pl_id = $this->_getParam('id', null);
+ $display = $this->_getParam('view', null);
+ if(!is_null($pl_id)) {
+ $this->changePlaylist($pl_id);
+ }
+
$pl = $this->getPlaylist();
$this->view->pl = $pl;
- $this->view->playlistcontents = $pl->getContents();
+
+ if($display === 'spl') {
+ $this->view->html = $this->view->render('sideplaylist/index.phtml');
+ unset($this->view->pl);
+ }
}
public function addItemAction()
@@ -138,6 +170,7 @@ class PlaylistController extends Zend_Controller_Action
{
$oldPos = $this->_getParam('oldPos');
$newPos = $this->_getParam('newPos');
+ $display = $this->_getParam('view');
$pl = $this->getPlaylist();
@@ -229,6 +262,8 @@ class PlaylistController extends Zend_Controller_Action
unset($pl_sess->id);
}
}
+
+ $this->view->id = $id;
}
public function deleteActiveAction()
diff --git a/application/controllers/SearchController.php b/application/controllers/SearchController.php
index 79ae0ea62..a96248964 100644
--- a/application/controllers/SearchController.php
+++ b/application/controllers/SearchController.php
@@ -27,6 +27,8 @@ class SearchController extends Zend_Controller_Action
$this->_helper->layout->setLayout('search');
$this->view->headScript()->appendFile('/js/campcaster/onready/search.js','text/javascript');
+ $this->view->headScript()->appendFile('/js/contextmenu/jjmenu.js','text/javascript');
+ $this->view->headLink()->appendStylesheet('/css/contextmenu.css');
$this->_helper->actionStack('display', 'search');
$this->_helper->actionStack('contents', 'library');
diff --git a/application/views/scripts/library/contextMenuPartial.phtml b/application/views/scripts/library/contextMenuPartial.phtml
new file mode 100644
index 000000000..31b484496
--- /dev/null
+++ b/application/views/scripts/library/contextMenuPartial.phtml
@@ -0,0 +1 @@
+
text ?>
diff --git a/public/css/jquery.contextMenu.css b/public/css/jquery.contextMenu.css
new file mode 100644
index 000000000..5b2dd9069
--- /dev/null
+++ b/public/css/jquery.contextMenu.css
@@ -0,0 +1,62 @@
+/* Generic context menu styles */
+.contextMenu {
+ position: absolute;
+ width: 120px;
+ z-index: 99999;
+ border: solid 1px #CCC;
+ background: #EEE;
+ padding: 0px;
+ margin: 0px;
+ display: none;
+}
+
+.contextMenu LI {
+ list-style: none;
+ padding: 0px;
+ margin: 0px;
+}
+
+.contextMenu A {
+ color: #333;
+ text-decoration: none;
+ display: block;
+ line-height: 20px;
+ height: 20px;
+ background-position: 6px center;
+ background-repeat: no-repeat;
+ outline: none;
+ padding: 1px 5px;
+ padding-left: 28px;
+}
+
+.contextMenu LI.hover A {
+ color: #FFF;
+ background-color: #3399FF;
+}
+
+.contextMenu LI.disabled A {
+ color: #AAA;
+ cursor: default;
+}
+
+.contextMenu LI.hover.disabled A {
+ background-color: transparent;
+}
+
+.contextMenu LI.separator {
+ border-top: solid 1px #CCC;
+}
+
+/*
+ Adding Icons
+
+ You can add icons to the context menu by adding
+ classes to the respective LI element(s)
+*/
+
+.contextMenu LI.edit A { background-image: url(images/page_white_edit.png); }
+.contextMenu LI.cut A { background-image: url(images/cut.png); }
+.contextMenu LI.copy A { background-image: url(images/page_white_copy.png); }
+.contextMenu LI.paste A { background-image: url(images/page_white_paste.png); }
+.contextMenu LI.delete A { background-image: url(images/page_white_delete.png); }
+.contextMenu LI.quit A { background-image: url(images/door.png); }
diff --git a/public/js/campcaster/library/library.js b/public/js/campcaster/library/library.js
index 773a29641..258278022 100644
--- a/public/js/campcaster/library/library.js
+++ b/public/js/campcaster/library/library.js
@@ -12,23 +12,51 @@ function getType() {
return tr_id[0];
}
+function deleteItem(type, id) {
+ var tr_id;
+
+ tr_id = type+"_"+id;
+
+ $("#library_display tr#" +tr_id).remove();
+}
+
+function deleteAudioClip(json) {
+ if(json.message) {
+ alert(json.message);
+ return;
+ }
+
+ deleteItem("au", json.id);
+}
+
+function deletePlaylist(json) {
+ if(json.message) {
+ alert(json.message);
+ return;
+ }
+
+ deleteItem("pl", json.id);
+}
+
+function addLibraryItemEvents() {
+ $('#library_display tr[id ^= "au"]')
+ .draggable({
+ helper: 'clone'
+ });
+
+ $('#library_display tr:not(:first-child)')
+ .jjmenu("rightClick",
+ [{get:"/Library/context-menu/format/json/id/#id#/type/#type#"}],
+ {id: getId, type: getType},
+ {xposition: "mouse", yposition: "mouse"});
+
+}
+
function setLibraryContents(data){
$("#library_display tr:not(:first-child)").remove();
$("#library_display").append(data);
- /*
- $('#library_display tr[id ^= "au"]')
- .contextMenu({menu: 'audioMenu'}, contextMenu)
- .draggable({
- helper: 'clone'
- });
-
- $('#library_display tr[id ^= "pl"]')
- .contextMenu({menu: 'plMenu'}, contextMenu)
- .draggable({
- helper: 'clone'
- });
- */
+ addLibraryItemEvents()
}
function setUpLibrary() {
@@ -55,27 +83,5 @@ function setUpLibrary() {
$.post(url, {ob: ob, order: order}, setLibraryContents);
});
- /*
- $('#library_display tr[id ^= "au"]')
- .contextMenu({menu: 'audioMenu'}, contextMenu)
- .draggable({
- helper: 'clone'
- });
-
- $('#library_display tr[id ^= "pl"]')
- .contextMenu({menu: 'plMenu'}, contextMenu)
-
- */
-
- $('#library_display tr:not(:first-child)')
- .draggable({
- helper: 'clone'
- });
-
- $('#library_display tr:not(:first-child)')
- .jjmenu("rightClick",
- [{get:"/Library/context-menu/format/json/id/#id#/type/#type#"}],
- {id: getId, type: getType},
- {xposition: "mouse", yposition: "mouse"});
-
+ addLibraryItemEvents()
}
diff --git a/public/js/campcaster/library/spl.js b/public/js/campcaster/library/spl.js
index f57da75db..e307afc63 100644
--- a/public/js/campcaster/library/spl.js
+++ b/public/js/campcaster/library/spl.js
@@ -28,7 +28,7 @@ function addSPLItem(event, ui){
if(tr.get(0).tagName === 'LI')
return;
- id = tr.attr('id');
+ id = tr.attr('id').split("_").pop();
url = '/Playlist/add-item/format/json';
url = url + '/id/'+id;
@@ -90,6 +90,15 @@ function deleteSPL() {
$.post(url, noOpenPL);
}
+function openDiffSPL(json) {
+
+ $("#side_playlist")
+ .empty()
+ .append(json.html);
+
+ setUpSPL();
+}
+
function setUpSPL() {
$("#spl_sortable").sortable();
diff --git a/public/js/contextmenu/jjmenu.js b/public/js/contextmenu/jjmenu.js
index 41dd33534..48f75ea4b 100644
--- a/public/js/contextmenu/jjmenu.js
+++ b/public/js/contextmenu/jjmenu.js
@@ -285,6 +285,8 @@
/* do action on menu item */
function doAction(act) {
+ $("#jjmenu_main").hide();
+
if (act) {
switch (act.type) {
@@ -302,7 +304,6 @@
case "ajax":
$.getJSON(uReplace(act.url), function(data) {
-
var cb = eval(act.callback);
if (typeof(cb) == "function") {
diff --git a/public/js/contextmenu/jquery.contextMenu.js b/public/js/contextmenu/jquery.contextMenu.js
new file mode 100644
index 000000000..c884d8ced
--- /dev/null
+++ b/public/js/contextmenu/jquery.contextMenu.js
@@ -0,0 +1,211 @@
+// jQuery Context Menu Plugin
+//
+// Version 1.01
+//
+// Cory S.N. LaViska
+// A Beautiful Site (http://abeautifulsite.net/)
+//
+// More info: http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/
+//
+// Terms of Use
+//
+// This plugin is dual-licensed under the GNU General Public License
+// and the MIT License and is copyright A Beautiful Site, LLC.
+//
+if(jQuery)( function() {
+ $.extend($.fn, {
+
+ contextMenu: function(o, callback) {
+ // Defaults
+ if( o.menu == undefined ) return false;
+ if( o.inSpeed == undefined ) o.inSpeed = 150;
+ if( o.outSpeed == undefined ) o.outSpeed = 75;
+ // 0 needs to be -1 for expected results (no fade)
+ if( o.inSpeed == 0 ) o.inSpeed = -1;
+ if( o.outSpeed == 0 ) o.outSpeed = -1;
+ // Loop each context menu
+ $(this).each( function() {
+ var el = $(this);
+ var offset = $(el).offset();
+ // Add contextMenu class
+ $('#' + o.menu).addClass('contextMenu');
+ // Simulate a true right click
+ $(this).mousedown( function(e) {
+ var evt = e;
+ evt.stopPropagation();
+ $(this).mouseup( function(e) {
+ e.stopPropagation();
+ var srcElement = $(this);
+ $(this).unbind('mouseup');
+ if( evt.button == 1 ) {
+ // Hide context menus that may be showing
+ $(".contextMenu").hide();
+ // Get this context menu
+ var menu = $('#' + o.menu);
+
+ if( $(el).hasClass('disabled') ) return false;
+
+ // Detect mouse position
+ var d = {}, x, y;
+ if( self.innerHeight ) {
+ d.pageYOffset = self.pageYOffset;
+ d.pageXOffset = self.pageXOffset;
+ d.innerHeight = self.innerHeight;
+ d.innerWidth = self.innerWidth;
+ } else if( document.documentElement &&
+ document.documentElement.clientHeight ) {
+ d.pageYOffset = document.documentElement.scrollTop;
+ d.pageXOffset = document.documentElement.scrollLeft;
+ d.innerHeight = document.documentElement.clientHeight;
+ d.innerWidth = document.documentElement.clientWidth;
+ } else if( document.body ) {
+ d.pageYOffset = document.body.scrollTop;
+ d.pageXOffset = document.body.scrollLeft;
+ d.innerHeight = document.body.clientHeight;
+ d.innerWidth = document.body.clientWidth;
+ }
+ (e.pageX) ? x = e.pageX : x = e.clientX + d.scrollLeft;
+ (e.pageY) ? y = e.pageY : y = e.clientY + d.scrollTop;
+
+ // Show the menu
+ $(document).unbind('click');
+ $(menu).css({ top: y, left: x }).fadeIn(o.inSpeed);
+ // Hover events
+ $(menu).find('A').mouseover( function() {
+ $(menu).find('LI.hover').removeClass('hover');
+ $(this).parent().addClass('hover');
+ }).mouseout( function() {
+ $(menu).find('LI.hover').removeClass('hover');
+ });
+
+ // Keyboard
+ $(document).keypress( function(e) {
+ switch( e.keyCode ) {
+ case 38: // up
+ if( $(menu).find('LI.hover').size() == 0 ) {
+ $(menu).find('LI:last').addClass('hover');
+ } else {
+ $(menu).find('LI.hover').removeClass('hover').prevAll('LI:not(.disabled)').eq(0).addClass('hover');
+ if( $(menu).find('LI.hover').size() == 0 ) $(menu).find('LI:last').addClass('hover');
+ }
+ break;
+ case 40: // down
+ if( $(menu).find('LI.hover').size() == 0 ) {
+ $(menu).find('LI:first').addClass('hover');
+ } else {
+ $(menu).find('LI.hover').removeClass('hover').nextAll('LI:not(.disabled)').eq(0).addClass('hover');
+ if( $(menu).find('LI.hover').size() == 0 ) $(menu).find('LI:first').addClass('hover');
+ }
+ break;
+ case 13: // enter
+ $(menu).find('LI.hover A').trigger('click');
+ break;
+ case 27: // esc
+ $(document).trigger('click');
+ break
+ }
+ });
+
+ // When items are selected
+ $('#' + o.menu).find('A').unbind('click');
+ $('#' + o.menu).find('LI:not(.disabled) A').click( function() {
+ $(document).unbind('click').unbind('keypress');
+ $(".contextMenu").hide();
+ // Callback
+ if( callback ) callback( $(this).attr('href').substr(1), $(srcElement), {x: x - offset.left, y: y - offset.top, docX: x, docY: y} );
+ return false;
+ });
+
+ // Hide bindings
+ setTimeout( function() { // Delay for Mozilla
+ $(document).click( function() {
+ $(document).unbind('click').unbind('keypress');
+ $(menu).fadeOut(o.outSpeed);
+ return false;
+ });
+ }, 0);
+ }
+ });
+ });
+
+ // Disable text selection
+ if( $.browser.mozilla ) {
+ $('#' + o.menu).each( function() { $(this).css({ 'MozUserSelect' : 'none' }); });
+ } else if( $.browser.msie ) {
+ $('#' + o.menu).each( function() { $(this).bind('selectstart.disableTextSelect', function() { return false; }); });
+ } else {
+ $('#' + o.menu).each(function() { $(this).bind('mousedown.disableTextSelect', function() { return false; }); });
+ }
+ // Disable browser context menu (requires both selectors to work in IE/Safari + FF/Chrome)
+ $(el).add($('UL.contextMenu')).bind('contextmenu', function() { return false; });
+
+ });
+ return $(this);
+ },
+
+ // Disable context menu items on the fly
+ disableContextMenuItems: function(o) {
+ if( o == undefined ) {
+ // Disable all
+ $(this).find('LI').addClass('disabled');
+ return( $(this) );
+ }
+ $(this).each( function() {
+ if( o != undefined ) {
+ var d = o.split(',');
+ for( var i = 0; i < d.length; i++ ) {
+ $(this).find('A[href="' + d[i] + '"]').parent().addClass('disabled');
+
+ }
+ }
+ });
+ return( $(this) );
+ },
+
+ // Enable context menu items on the fly
+ enableContextMenuItems: function(o) {
+ if( o == undefined ) {
+ // Enable all
+ $(this).find('LI.disabled').removeClass('disabled');
+ return( $(this) );
+ }
+ $(this).each( function() {
+ if( o != undefined ) {
+ var d = o.split(',');
+ for( var i = 0; i < d.length; i++ ) {
+ $(this).find('A[href="' + d[i] + '"]').parent().removeClass('disabled');
+
+ }
+ }
+ });
+ return( $(this) );
+ },
+
+ // Disable context menu(s)
+ disableContextMenu: function() {
+ $(this).each( function() {
+ $(this).addClass('disabled');
+ });
+ return( $(this) );
+ },
+
+ // Enable context menu(s)
+ enableContextMenu: function() {
+ $(this).each( function() {
+ $(this).removeClass('disabled');
+ });
+ return( $(this) );
+ },
+
+ // Destroy context menu(s)
+ destroyContextMenu: function() {
+ // Destroy specified context menus
+ $(this).each( function() {
+ // Disable action
+ $(this).unbind('mousedown').unbind('mouseup');
+ });
+ return( $(this) );
+ }
+
+ });
+})(jQuery);