Separate Pathways CD

Peters first CD release featuring an eclectic mix of power pop, melodic rock and fiery rock guitar instrumental tracks. A CD for fans of guitar.
Click Image To Buy CD

Peter McCarthy -Separate Pathways CD

Click Image To Buy MP3 Album

Peter McCarthy -Separate Pathways MP3 Album Download

Purchase individual tracks

' + '
' + ''+ '
' + '', ratingBar:'' }; function init(playlistOptions) { $myJplayer = $('.ttw-music-player .jPlayer-container'); var jPlayerDefaults, jPlayerOptions; jPlayerDefaults = { swfPath: "jquery-jplayer", supplied: "mp3, oga", solution:'html, flash', cssSelectorAncestor: cssSelector.jPlayerInterface, errorAlerts: false, warningAlerts: false }; //apply any user defined jPlayer options jPlayerOptions = $.extend(true, {}, jPlayerDefaults, playlistOptions); $myJplayer.bind($.jPlayer.event.ready, function() { //Bind jPlayer events. Do not want to pass in options object to prevent them from being overridden by the user $myJplayer.bind($.jPlayer.event.ended, function(event) { playlistNext(); }); $myJplayer.bind($.jPlayer.event.play, function(event) { $myJplayer.jPlayer("pauseOthers"); $tracks.eq(current).addClass(attr(cssSelector.playing)).siblings().removeClass(attr(cssSelector.playing)); }); $myJplayer.bind($.jPlayer.event.playing, function(event) { playing = true; }); $myJplayer.bind($.jPlayer.event.pause, function(event) { playing = false; }); //Bind next/prev click events $(cssSelector.playerPrevious).click(function() { playlistPrev(); $(this).blur(); return false; }); $(cssSelector.playerNext).click(function() { playlistNext(); $(this).blur(); return false; }); $self.bind('mbInitPlaylistAdvance', function(e) { var changeTo = this.getData('mbInitPlaylistAdvance'); if (changeTo != current) { current = changeTo; playlistAdvance(current); } else { if (!$myJplayer.data('jPlayer').status.srcSet) { playlistAdvance(0); } else { togglePlay(); } } }); buildPlaylist(); //If the user doesn't want to wait for widget loads, start playlist now $self.trigger('mbPlaylistLoaded'); playlistInit(options.autoplay); }); $myJplayer.unbind($.jPlayer.event.ended + ".repeat"); //Initialize jPlayer $myJplayer.jPlayer(jPlayerOptions); } function playlistInit(autoplay) { current = 0; if (autoplay) { playlistAdvance(current); } else { playlistConfig(current); $self.trigger('mbPlaylistInit'); //$myJplayer.jPlayer("play"); } } function playlistConfig(index) { current = index; $myJplayer.jPlayer("setMedia", myPlaylist[current]); } function playlistAdvance(index) { playlistConfig(index); if (index >= options.tracksToShow) showMore(); $self.trigger('mbPlaylistAdvance'); $myJplayer.jPlayer("play"); } function playlistNext() { var index = (current + 1 = 0) ? current - 1 : myPlaylist.length - 1; playlistAdvance(index); } function togglePlay() { if (!playing) $myJplayer.jPlayer("play"); else $myJplayer.jPlayer("pause"); } function buildPlaylist() { var $ratings = $(); $tracksWrapper = $self.find(cssSelector.tracks); //set up the html for the track ratings for (var i = 0; i 0) { var $trackList = $(cssSelector.trackList); $tracksWrapper.height(showHeight); $trackList.addClass('show-more-button'); $trackList.find(cssSelector.moreButton).click(function() { $more = $(this); showMore(); }); } $tracks.find('.title').click(function() { playlistAdvance($(this).parents('li').data('index')); }); } function showMore() { if (isUndefined($more)) $more = $self.find(cssSelector.moreButton); $tracksWrapper.animate({height: showHeight + remainingHeight}, function() { $more.animate({opacity:0}, function() { $more.slideUp(function() { $more.parents(cssSelector.trackList).removeClass('show-more-button'); $more.remove(); }); }); }); } /*function duration(index) { return !isUndefined(myPlaylist[index].duration) ? myPlaylist[index].duration : '-'; }*/ function price(index) { return (!isUndefined(myPlaylist[index].price) ? options.currencySymbol + myPlaylist[index].price : ''); } function setBuyLink($track, index) { if (!isUndefined(myPlaylist[index].buy)) { $track.find(cssSelector.buy).addClass(attr(cssSelector.buyActive)).html(myPlaylist[index].buy); }else{$track.find(cssSelector.buy).addClass(attr(cssSelector.buyNotActive)); } } function setBuyyLink($track, index) { if (!isUndefined(myPlaylist[index].buyy)) { $track.find(cssSelector.buyy).addClass(attr(cssSelector.buyActive)).attr('href', myPlaylist[index].buyy).html(buyyText(index)); }else{$track.find(cssSelector.buyy).addClass(attr(cssSelector.buyyNotActive)); } } function setBuyyyLink($track, index) { if (!isUndefined(myPlaylist[index].buyyy)) { $track.find(cssSelector.buyyy).addClass(attr(cssSelector.buyActive)).attr('href', myPlaylist[index].buyyy).html(buyyyText(index)); }else{$track.find(cssSelector.buyyy).addClass(attr(cssSelector.buyyyNotActive)); } } function buyyyText(index) { return options.buyyyText; } function buyyText(index) { return options.buyyText; } function buyText(index) { //return (!isUndefined(myPlaylist[index].price) ? options.currencySymbol + myPlaylist[index].price : '') + ' ' + options.buyText; return options.buyText; } return{ init:init, playlistInit:playlistInit, playlistAdvance:playlistAdvance, playlistNext:playlistNext, playlistPrev:playlistPrev, togglePlay:togglePlay, $myJplayer:$myJplayer }; }; ratingsMgr = function() { var $tracks = $self.find(cssSelector.track); //Handler for when user hovers over a rating $(cssSelector.rating).find(cssSelector.ratingLevel).hover(function() { $(this).addClass('hover').prevAll().addClass('hover').end().nextAll().removeClass('hover'); }); //Restores previous rating when user is finished hovering (assuming there is no new rating) $(cssSelector.rating).mouseleave(function() { $(this).find(cssSelector.ratingLevel).removeClass('hover'); }); function bindEvents() { $(cssSelector.rating_succes).css('display','none'); //Set the new rating when the user clicks $(cssSelector.ratingLevel).click(function() { var $this = $(this), rating = $this.parent().children().index($this) + 1, index; var trackname = $(cssSelector.title+':first').text(); var postdata1 = 'action=my_special_ajax_call5&rating='+rating+'&trackname='+trackname; //alert(postdata1); jQuery.ajax({ type:'POST', url: ajaxurl, cache:false, data: postdata1, beforeSend:function(){ }, success:function(res){ $(cssSelector.rating_succes).html(res).fadeIn(500).delay(3000).fadeOut(500); //window.setTimeout(function(){location.reload()},2000); } }); $this.prevAll().add($this).addClass(attr(cssSelector.ratingLevelOn)).end().end().nextAll().removeClass(attr(cssSelector.ratingLevelOn)); }); } bindEvents(); }; interfaceMgr = function() { var $player, $title, $artist, $albumCover; function init() { $player = $(cssSelector.player), $title = $player.find(cssSelector.title), $artist = $player.find(cssSelector.artist), $albumCover = $player.find(cssSelector.albumCover); setDescription(); $self.bind('mbPlaylistAdvance mbPlaylistInit', function() { setTitle(); setArtist(); setRating('current', null, current); setCover(); }); } function buildInterface() { var markup, $interface; //I would normally use the templating plugin for something like this, but I wanted to keep this plugin's footprint as small as possible markup = '
' + ''+ '
' + '
' + '
View More...
' + '
' + '
' + '
'; $interface = $(markup).css({display:'none', opacity:0}).appendTo($self).slideDown('slow', function() { $interface.animate({opacity:1}); $self.trigger('mbInterfaceBuilt'); }); } function setTitle() { $title.html(trackName(current)); } function setArtist() { if (isUndefined(myPlaylist[current].artist)) $artist.parent(cssSelector.artistOuter).animate({opacity:0}, 'fast'); else { $artist.html(myPlaylist[current].artist).parent(cssSelector.artistOuter).animate({opacity:1}, 'fast'); } } function setCover() { $albumCover.animate({opacity:0}, 'fast', function() { if (!isUndefined(myPlaylist[current].cover)) { $("#check_cover").removeClass('classtohide'); var now = current; if(now == current){ $albumCover.css({opacity:1}).html(''); } }else{ document.getElementById("check_cover").className += " classtohide"; } }); } function setDescription() { if (!isUndefined(options.description)) $self.find(cssSelector.description).html(options.description).addClass(attr(cssSelector.descriptionShowing)).slideDown(); } return{ buildInterface:buildInterface, init:init } }; /** Common Functions **/ function trackName(index) { if (!isUndefined(myPlaylist[index].title)) return myPlaylist[index].title; else if (!isUndefined(myPlaylist[index].mp3)) return fileName(myPlaylist[index].mp3); else if (!isUndefined(myPlaylist[index].oga)) return fileName(myPlaylist[index].oga); else return ''; } function fileName(path) { path = path.split('/'); return path[path.length - 1]; } function setRating(type, $track, index) { if (type == 'track') { if (!isUndefined(myPlaylist[index].rating)) { applyTrackRating($track, myPlaylist[index].rating); } } else { //if the rating isn't set, use 0 var rating = !isUndefined(myPlaylist[index].rating) ? Math.ceil(myPlaylist[index].rating) : 0; applyCurrentlyPlayingRating(rating); } } function applyCurrentlyPlayingRating(rating) { //reset the rating to 0, then set the rating defined above $self.find(cssSelector.trackInfo).find(cssSelector.ratingLevel).removeClass(attr(cssSelector.ratingLevelOn)).slice(0, rating).addClass(attr(cssSelector.ratingLevelOn)); } /** Utility Functions **/ function attr(selector) { return selector.substr(1); } function runCallback(callback) { var functionArgs = Array.prototype.slice.call(arguments, 1); if ($.isFunction(callback)) { callback.apply(this, functionArgs); } } function isUndefined(value) { return typeof value == 'undefined'; } appMgr(); }; })(jQuery); (function($) { // $('img.photo',this).imagesLoaded(myFunction) // execute a callback when all images have loaded. // needed because .load() doesn't work on cached images // mit license. paul irish. 2010. // webkit fix from Oren Solomianik. thx! // callback function is passed the last image to load // as an argument, and the collection as `this` $.fn.imagesLoaded = function(callback) { var elems = this.filter('img'), len = elems.length; elems.bind('load', function() { if (--len