/*
*   SoundCloud Custom Player jQuery Plugin
*   Author: Matas Petrikas, matas@soundcloud.com
*   Copyright (c) 2009  SoundCloud Ltd.
*   Licensed under the MIT license:
*   http://www.opensource.org/licenses/mit-license.php
*
*   Usage:
*   <a href="http://soundcloud.com/matas/hobnotropic" class="sc-player">My new dub track</a>
*   The link will be automatically replaced by the HTML based player
*/
; (function($) {
    // Convert milliseconds into Hours (h), Minutes (m), and Seconds (s)
    var timecode = function(ms) {
        var hms = function(ms) {
            return {
                h: Math.floor(ms / (60 * 60 * 1000)),
                m: Math.floor((ms / 60000) % 60),
                s: Math.floor((ms / 1000) % 60)
            };
        } (ms),
        tc = [];
        // Timecode array to be joined with '.'
        if (hms.h > 0) {
            tc.push(hms.h);
        }

        tc.push((hms.m < 10 && hms.h > 0 ? "0" + hms.m: hms.m));
        tc.push((hms.s < 10 ? "0" + hms.s: hms.s));

        return tc.join('.');
    };

    var debug = false,
    useSandBox = false,
    log = function(args) {
        if (debug && window.console && window.console.log) {
            window.console.log.apply(window.console, arguments);
        }
    },
    domain = useSandBox ? 'sandbox-soundcloud.com': 'soundcloud.com',
    apiKey = 'htuiRd1JP11Ww0X72T1C3g',
    scApiUrl = function(url) {
        return (/api./.test(url) ? url + '?': 'http://api.' + domain + '/resolve?url=' + url + '&') + 'format=json&consumer_key=' + apiKey + '&callback=?';
    };


    var audioEngine = function() {
        var html5AudioAvailable = function() {
            var state = false;
            try {
                var a = new Audio();
                state = a.canPlayType && (/maybe|probably/).test(a.canPlayType('audio/mpeg'));
                // let's enable the html5 audio on selected mobile devices first, unlikely to support Flash
                // the desktop browsers are still better with Flash, e.g. see the Safari 10.6 bug
                // comment the following line out, if you want to force the html5 mode
                state = state && (/iPad|iphone|mobile|pre/ / i).test(navigator.userAgent);
            } catch(e) {
                // there's no audio support here sadly
                }
            return state;
        } (),
        callbacks = {
            onReady: function() {
				log('onReady');
                $(document).trigger('scPlayer:onAudioReady');
            },
            onPlay: function( data ) {
	            $(document).trigger('scPlayer:onMediaPlay',[ data ]);
                $(document).trigger('scPlayer:onMediaStart',[ data ]);
            },
            onPause: function( data ) {
                $(document).trigger('scPlayer:onMediaPause',[ data ]);
            },
            onEnd: function( data ) {
                $(document).trigger('scPlayer:onMediaEnd',[ data ]);
            },
            onBuffer: function(percent) {
                $(document).trigger({
                    type: 'scPlayer:onMediaBuffering',
                    percent: percent
                });
            }
        };

        var html5Driver = function() {
            var player = new Audio(),
            onTimeUpdate = function(event) {
                var obj = event.target,
                buffer = ((obj.buffered.length && obj.buffered.end(0)) / obj.duration) * 100;
                // ipad has no progress events implemented yet
                callbacks.onBuffer(buffer);
                // anounce if it's finished for the clients without 'ended' events implementation
                if (obj.currentTime === obj.duration) {
                    callbacks.onEnd({mediaId:currentTrackId});
                }
            },
            onProgress = function(event) {
                var obj = event.target,
                buffer = ((obj.buffered.length && obj.buffered.end(0)) / obj.duration) * 100;
                callbacks.onBuffer(buffer);
            },
			onPlay = function(event)
			{
				callbacks.onPlay({mediaId:currentTrackId});
			},
			onPause = function(event)
			{
				callbacks.onPause({mediaId:currentTrackId});
			},
			onEnd = function( event )
			{
				callbacks.onEnd({mediaId:currentTrackId});
			};

            $('<div class="sc-player-engine-container"></div>').appendTo(document.body).append(player);

            // prepare the listeners
            player.addEventListener('play', onPlay, false);
            player.addEventListener('pause', onPause, false);
            player.addEventListener('ended', onEnd, false);
            player.addEventListener('timeupdate', onTimeUpdate, false);
            player.addEventListener('progress', onProgress, false);

            return {
                load: function(track) {
                    player.pause();
					log('load :',track,track.stream_url);
                    player.src = track.stream_url;
                    player.load();
                    player.play();
                },
                play: function() {
                    player.play();
                },
                pause: function() {
                    player.pause();
                },
                seek: function(relative) {
                    if (isNaN(player.duration)) return false;
                    player.currentTime = player.duration * relative;
                    player.play();
                },
                getDuration: function() {
                    return player.duration;
                },
                getPosition: function() {
                    return player.currentTime;
                }
            };

        };



        var flashDriver = function() {
            var engineId = 'scPlayerEngine',
            player,
            flashHtml = function(url) {
                var swf = 'http://player.' + domain + '/player.swf?url=' + url + '&amp;enable_api=true&amp;player_type=engine&amp;object_id=' + engineId;
                if ($.browser.msie) {
                    return '<object height="100%" width="100%" id="' + engineId + '" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" data="' + swf + '">' +
                    '<param name="movie" value="' + swf + '" />' +
                    '<param name="allowscriptaccess" value="always" />' +
                    '</object>';
                } else {
                    return '<object height="100%" width="100%" id="' + engineId + '" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">' +
                    '<embed allowscriptaccess="always" height="100%" width="100%" src="' + swf + '" type="application/x-shockwave-flash" name="' + engineId + '" />' +
                    '</object>';
                }
            };



            // listen to audio engine events
            // when the loaded track is ready to play
            soundcloud.addEventListener('onPlayerReady',
            function(flashId, data) {
                player = soundcloud.getPlayer(engineId);
                callbacks.onReady();
            });

            // when the loaded track finished playing
            soundcloud.addEventListener('onMediaEnd', callbacks.onEnd);

            // when the loaded track is still buffering
            soundcloud.addEventListener('onMediaBuffering',
            function(flashId, data) {
                callbacks.onBuffer(data.percent);
            });

            // when the loaded track started to play
            soundcloud.addEventListener('onMediaPlay', callbacks.onPlay);

            // when the loaded track is was paused
            soundcloud.addEventListener('onMediaPause', callbacks.onPause);

            return {
                load: function(track) {
                    var url = track.permalink_url;
                    if (player) {
                        player.api_load(url);
                    } else {
                        // create a container for the flash engine (IE needs this to operate properly)
                        $('<div class="sc-player-engine-container"></div>').appendTo(document.body).html(flashHtml(url));
                    }
                },
                play: function() {
                    player && player.api_play();
                },
                pause: function() {
                    player && player.api_pause();
                },
                seek: function(relative) {
                    player && player.api_seekTo((player.api_getTrackDuration() * relative));
                },
                getDuration: function() {
                    return player && player.api_getTrackDuration && player.api_getTrackDuration();
                },
                getPosition: function() {
                    return player && player.api_getTrackPosition && player.api_getTrackPosition();
                }
            };
        };

        return html5AudioAvailable ? html5Driver() : flashDriver();
    } ();



    var autoPlay = false,
    players = [],
    updates = {},
    currentUrl,
	currentTrackId,
	gup = function( name )
	{
	  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	  var regexS = "[\\?&]"+name+"=([^&#]*)";
	  var regex = new RegExp( regexS );
	  var results = regex.exec( window.location.href );
	  if( results == null )
	    return "";
	  else
	    return results[1];
	},
    // ok nothing needs to be changed here
    loadTracksData = function($player, links) {
        var index = 0,
        playerObj = {
            node: $player,
            tracks: []
        },
        loadUrl = function(link) {
            $.getJSON(scApiUrl(link.url),
            function(data) {
                // log('data loaded', link.url, data);
                index += 1;

                if (data.tracks) {
                    // log('data.tracks', data.tracks);
                    playerObj.tracks = playerObj.tracks.concat(data.tracks);
                } else if (data.duration) {
                    // log('data.duration')
                    // a secret link fix, till the SC API returns permalink with secret on secret response
                    data.permalink_url = link.url;
                    // if track, add to player
                    playerObj.tracks.push(data);
                } else if (data.username) {
                    // log('data.username', data.username)
                    // if user, get his tracks or favorites
                    if (/favorites/.test(link.url)) {
                        links.push({
                            url: data.uri + '/favorites'
                        });
                    } else {
                        links.push({
                            url: data.uri + '/tracks'
                        });
                    }
                } else if ($.isArray(data)) {
                    // log('data isArray', data);
                    playerObj.tracks = playerObj.tracks.concat(data);
                }

                if (links[index]) {
                    // if there are more track to load, get them from the api
                    loadUrl(links[index]);
                } else {
                    // log('all tracks now loaded');
                    // if loading finishes, anounce it to the GUI
                    playerObj.node.trigger({
                        type: 'onTrackDataLoaded.scPlayer',
                        playerObj: playerObj
                    });
                }
            });
        };
        // update the players queue
        players.push(playerObj);

        // load first tracks
        loadUrl(links[index]);
    },
    artworkImage = function(track, loadArtwork) {
        if (!loadArtwork) {
            return '<div class="sc-loading-artwork">Loading Artwork</div>';
        } else if (track.artwork_url) {
            return '<img src="' + track.artwork_url.replace('-large', '-t300x300') + '"/>';
        } else {
            return '<div class="sc-no-artwork">No Artwork</div>';
        }
    },
    updateTrackInfo = function($player, track, flashDefault) {
        // update the current track info in the player
        $('.sc-info', $player).each(function(index) {
            //$('h3', this).html('<a href="' + track.permalink_url + '">' + track.title + '</a>');
            $('h3', this).html(track.title);
            //$('h4', this).html('by <a href="' + track.user.permalink_url + '">' + track.user.username + '</a>');
            $('p', this).html(track.description || 'no Description');
        });
		
		
		if(flashDefault) return;
		
        // update the artwork
        $('.sc-artwork', $player).each(function(index) {
            var $item = $(this),
            itemTrack = $item.data('sc-track');

            if (itemTrack === track) {
                // show track artwork
                $item
                .addClass('active')
                .find('.sc-loading-artwork')
                .each(function(index) {
                    // if the image isn't loaded yet, do it now
                    $(this).removeClass('sc-loading-artwork').html(artworkImage(track, false));
                });
            } else {
                // reset other artworks
                $item.removeClass('active');
            }
        });

        // cache the references to most updated DOM nodes in the progress bar
        updates = {
            $buffer: $('.sc-buffer', $player),
            $played: $('.sc-played', $player),
            position: $('.sc-position', $player)[0]
        };

        // update the track duration in the progress bar
        $('.sc-duration', $player).html(timecode(track.duration));
        // put the waveform into the progress bar
        $('.sc-waveform-container', $player).html('<img src="' + track.waveform_url + '" />');

        $player.trigger('onPlayerTrackSwitch.scPlayer', [track]);
    },
    play = function(track) {
        var url = track.permalink_url;
        log('play audioEngine :', audioEngine, url);
		
        if (currentUrl === url) {
            // log('will play');
            audioEngine.play();
        } else {
            currentUrl = url;
            log('play audioEngine will load :', url);
            audioEngine.load(track);
            autoPlay = true;
        }
    },
    updatePlayStatus = function(player, status) {
        if (status) {
            // reset all other players playing status
            $('div.sc-player.playing').removeClass('playing');
        }
        $(player)
        .toggleClass('playing', status)
        .trigger((status ? 'onPlayerPlay': 'onPlayerPause') + '.scPlayer');
    },
    onPlay = function(player) {
		log("onPlay")
        var track = player.data('sc-player').track;
		currentTrackId = track.id;
        updateTrackInfo(player, track);
        updatePlayStatus(player, true);
        play(track);
    },
    onPause = function(player) {
        updatePlayStatus(player, false);
        audioEngine.pause();
    },
    onSeek = function(relative) {
        audioEngine.seek(relative);
    },
    positionPoll,
    hasEngineEvents,
    addAudioEngineEvents = function()
    {
		log('addAudioEngineEvents')
        // only need one set of event listeners
        if (hasEngineEvents == true) return;

        log('addedAudioEvents');
        // listen to audio engine events
        $(document)
        .bind('scPlayer:onAudioReady',
        function(event) {
            log('onPlayerReady: audio engine is ready');
            audioEngine.play();
        })
        // when the loaded track started to play
        .bind('scPlayer:onMediaPlay',
        function(event) {
			
            clearInterval(positionPoll);
            positionPoll = setInterval(function() {
                var duration = audioEngine.getDuration() * 1000;
                var position = audioEngine.getPosition();
                updates.$played.css('width', ((position / audioEngine.getDuration()) * 100) + '%');
                updates.position.innerHTML = timecode(position * 1000);
            },
            50);
        })
        // when the loaded track is was paused
        .bind('scPlayer:onMediaPause',
        function(event) {
            clearInterval(positionPoll);
        })
        .bind('scPlayer:onMediaEnd',
        function(event) {
			//
			log('scPlayer:onMediaEnd');
            if (autoPlay) {
                $('.sc-track').click();
            }
        })
        .bind('scPlayer:onMediaBuffering',
        function(event) {
            updates.$buffer.css('width', event.percent + '%');
        });

        hasEngineEvents = true;
    },
	hasEventsTracking,
	getAudioTitle = function( id )
	{
		return $('#'+id).data('sc-player').track.title;
	},
    addEventsTracking = function()
    {
	

		log('addEventsTracking')
        // only need one set of event listeners
        if (hasEventsTracking == true) return;

        log('addingEventsTracking');

		// // listen to audio engine events
        $(document)
        // when the loaded track started to play
        .bind('scPlayer:onMediaStart',
        function(event, data) {
			log('onMediaStart', data, getAudioTitle(data.mediaId), _gaq);
			_gaq.push(['_trackEvent', "Audio", "Play", "Audio ~ play : " + getAudioTitle(data.mediaId)]);
        })
        // when the loaded track is was paused
        .bind('scPlayer:onMediaPause',
        function(event, data) {
            log('onMediaPause', data, getAudioTitle(data.mediaId));
			_gaq.push(['_trackEvent', "Audio", "Pause", "Audio ~ pause : " + getAudioTitle(data.mediaId)]);
        })
        .bind('scPlayer:onMediaEnd',
        function(event, data) {
			log('onMediaEnd', data, getAudioTitle(data.mediaId));
			_gaq.push(['_trackEvent', "Audio", "Finished", "Audio ~ complete : " + getAudioTitle(data.mediaId)]);
        });

        hasEventsTracking = true;
    },
	showPlaylist = function( increase, wrapper )
	{
		var currentPlaylistScreen = wrapper.data('screen');
		
		( increase ) ? currentPlaylistScreen++ : ( currentPlaylistScreen > 0 ) ? currentPlaylistScreen-- : 0;
		
		var opts = $.fn.scPlayer.defaults;

		log('createPlaylist', opts.limit, currentPlaylistScreen );
		
		//
		var tracks = wrapper.data('playerObj').tracks
        var tracksLength = (opts.limit != false) ? Math.min( opts.limit, tracks.length) :  tracks.length;
		

		// work out min & max video indexes
		var minIndex = (opts.limit != false) ? ( currentPlaylistScreen * opts.limit ) : 0;
		var maxIndex = (opts.limit != false) ? Math.min( ((minIndex + tracksLength)-1),  tracks.length) : tracksLength;
		
		log("showing " + minIndex + " - " + maxIndex);
		
		// clear wrapper
		wrapper.empty();
		
		// create players
		for (var i = minIndex; i <= maxIndex; i++)
		{
			if(!tracks[i]) continue;
			//
			var player = (opts.defaultFlash) ? createFlashPlayer( opts, tracks[i] ) : createHTMLPlayer(opts, tracks[i]);
			wrapper.append(player);
		}
		//
		
		if(opts.limit != false && tracks.length > opts.limit){
			
			// create navigation
			var scNav = wrapper.append('<div class="sc-navigation"></div>').find('.sc-navigation');

			// create previous button 
			if(tracks.length > opts.limit && currentPlaylistScreen > 0)
					scNav.append('<a class="sc-previous" href="#scPrevious" title="Previous tracks">Previous</a>');

			// create next button 	
			if(tracks.length > opts.limit && maxIndex < tracks.length-1 )
					scNav.append('<a class="sc-next" class="" href="#scNext" title="Next tracks">Next</a>');

			scNav.append('<div class="clear"></div>');
		}
		
		//
		wrapper.data('screen',currentPlaylistScreen);
		
		//
		//$('#vimeo').setScolling('widget : soundcloud');
		log("EHEHEH");
		wrapper.setScolling('widget :soundcloud');
	},
	createFlashPlayer = function( opts, track ){
				
		var $player = $('<div id="'+track.id+'" class="sc-player"></div>').data('sc-player', {
            track: track
        });
		//
		if(opts.loadArtwork)
        	$artworks = $('<div class="sc-artwork"></div>').appendTo($player);
		//
		//var $info = $('<div class="sc-info"><h3></h3><h4></h4><p></p></div>').appendTo($player),
		
		var $info = $('<div class="sc-info"><h3></h3><p></p></div>').appendTo($player),
		engineId = 'scPlayerEngine',
		playerType = 'artwork',
        flashHtml = function(url) {
			log('flashHtml',url);
			
            var swf = 'http://player.' + domain + '/player.swf?url=' + url + '&amp;enable_api=true&amp;player_type='+playerType+'&amp;object_id=' + engineId;
	
			return '<object id="'+track.id+'" height="81" width="100%">' +
			'<param name="movie" value="http://player.soundcloud.com/player.swf?url='+url+'&amp;show_comments=true&amp;auto_play=false&amp;color='+opts.color+'&amp;enable_api=true"></param>'+
			'<param name="allowscriptaccess" value="always"></param>' +
			'<param name="wmode" value="opaque">'+
			'<embed id="'+track.id+'" name="'+track.id+'" wmode="opaque" allowscriptaccess="always" height="81" src="http://player.soundcloud.com/player.swf?url='+url+'&amp;show_comments=true&amp;auto_play=false&amp;color='+opts.color+'&amp;enable_api=true" type="application/x-shockwave-flash" width="100%">' +
			'</embed>'+
			'</object>';
			
        };
		
		// set up the first track info
        updateTrackInfo($player, track, true);

		//$player.append('<div id="" class=""></div>');
		
		return $player.append( flashHtml(track.permalink_url) );
		
	},
    createHTMLPlayer = function(opts, track) {
		
        var $player = $('<div id="'+track.id+'" class="sc-player"></div>').data('sc-player', {
            track: track
        });
		
		//
		if(opts.loadArtwork)
        	$artworks = $('<div class="sc-artwork"></div>').appendTo($player);
		//
		var $info = $('<div class="sc-info"><h3></h3><p></p></div>').appendTo($player),
		
		$controlsWrapper = $('<div class="sc-controls-wrapper"></div>').appendTo($player),
        $controls = $('<div class="sc-left sc-controls"></div>').appendTo($controlsWrapper),
		$timeIndicators = $('<div class="sc-right sc-time-indicators"><span class="sc-position"></span> | <span class="sc-duration"></span></div>').appendTo($controlsWrapper),
        $mindContent = $('<div class="sc-mid"></div>').appendTo($controlsWrapper);
		
        // enable autoplay if set in the options
        autoPlay = opts.autoPlay;

        // adding controls to the player
        $player
          .find('.sc-controls')
            .append('<a href="#play" class="sc-play">Play</a> <a href="#pause" class="sc-pause hidden">Pause</a>');
			
		$player
			.find('.sc-mid')
			.append('<div class="sc-track"></div>')
          		.append('<div class="sc-scrubber"></div>')
                      .find('.sc-scrubber')
                        .append('<div class="sc-time-span"><div class="sc-waveform-container"></div><div class="sc-buffer"></div><div class="sc-played"></div></div>');

		$player
			.find('.sc-track')
				.append('<a href="' + track.permalink_url + '">' + track.title + '</a><span class="sc-track-duration">' + timecode(track.duration) + '</span>')
		
        // create an item in the artwork list
		if(opts.loadArtwork)
		{
	        $(artworkImage(track, opts.loadArtwork))
	        .appendTo($artworks)
	        .data('sc-track', track);
		}

        $player.trigger('onPlayerInit.scPlayer');

        // update the element before rendering it in the DOM
        $player.each(function() {
            if ($.isFunction(opts.beforeRender)) {
                opts.beforeRender.call(this, track);
            }
        });

        if (!opts.defaultFlash) {
            // set the first track's duration
            $('.sc-duration', $player)[0].innerHTML = timecode(track.duration);
            $('.sc-position', $player)[0].innerHTML = timecode(0);
        }
        // set up the first track info
        updateTrackInfo($player, track, false);

        //
        return $player;
    }



    // Generate custom skinnable HTML/CSS/JavaScript based SoundCloud players from links to SoundCloud resources
    $.scPlayer = function(options, node) {
        var opts = $.extend({},
        $.fn.scPlayer.defaults, options),
        $source = node && $(node),
        $wrapper = $('<div class="sc-player-wrapper"><p>Loading</p></div>'),
        links = opts.links || $.map($('a', $source).add($source.filter('a')),
        function(val) {
            return {
                url: val.href,
                title: val.innerHTML
            };
        });
		
		log('using flash as default :', opts.defaultFlash);
        
        // init the player GUI, when the tracks data was laoded
        $wrapper.bind('onTrackDataLoaded.scPlayer',
        function(event) {
	
            log('onTrackDataLoaded.scPlayer', event.playerObj);
			
			$(this).data('screen',-1);
			$(this).data('playerObj', event.playerObj);
			
			//
			showPlaylist( true, $(this) );
        });

        // load and parse the track data from SoundCloud API
        loadTracksData($wrapper, links);

        // replace the DOM source (if there's one)
        $source.each(function(index) {
            $(this).replaceWith($wrapper);
        });

        return $wrapper;
    };

    // plugin wrapper
    $.fn.scPlayer = function(options) {
        return this.each(function() {
            $.scPlayer(options, this);
        });
    };

    // default plugin options
    $.fn.scPlayer.defaults = {
        // do something with the dom object before you render it, add nodes, get more data from the services etc.
        beforeRender: function(tracksData) {
            var $player = $(this);
        },
        // initialization, when dom is ready
        onDomReady: function() {

            log('Dom Ready');
            // update default flash opt if we have flash avaliable
            this.defaultFlash = (typeof swfobject == 'object' && swfobject.hasFlashPlayerVersion("9.0.18") && this.defaultFlash) ? true: false;
			//
			if(gup('noFlash') == '1') 
				this.defaultFlash = false;
			
            // add audioevents if needed
            if (!this.defaultFlash) addAudioEngineEvents();
			//
			addEventsTracking();
            // create players
            $('a.sc-player, div.sc-player').scPlayer();
        },
        autoPlay: false,
        loadArtwork: false,
        defaultFlash: true,
		color:'FF70E5',
		limit:5
    };


    // the GUI event bindings
    //--------------------------------------------------------
	//
	$('.sc-navigation a.sc-next').live('click',function(event){
		log('navigaiton click');
		
		showPlaylist( true, $(this).closest('.sc-player-wrapper') );
		return false;
	});
	
	//
	$('.sc-navigation a.sc-previous').live('click',function(event){
		log('navigaiton click');
		
		showPlaylist( false, $(this).closest('.sc-player-wrapper') );
		return false;
	});
	
    // toggling play/pause
    $('a.sc-play, a.sc-pause').live('click',
    function(event) {
        // simulate the click in the tracklist
        var $track = $(this).closest('.sc-player').find('.sc-track').click();
        return false;
    });

    // selecting tracks in the playlist
    $('.sc-track').live('click',
    function(event) {
        var $track = $(this),
        $player = $track.closest('.sc-player'),
        play = $player.is(':not(.playing)') || $track.is(':not(.active)');

        if (play) {
            onPlay($player);
        } else {
            onPause($player);
        }
        //
        $track.toggleClass('active');
        //
        $('.artworks', $player).each(function(index) {
            $(this).toggleClass('active');
        });

        return false;
    });

    var scrub = function(node, xPos) {
        var $scrubber = $(node).closest('.sc-time-span'),
        $buffer = $scrubber.find('.sc-buffer'),
        $available = $scrubber.find('.sc-waveform-container img'),
        $player = $scrubber.closest('.sc-player'),
        relative = Math.min($buffer.width(), (xPos - $available.offset().left)) / $available.width();
        //
        onSeek(relative);
    };

    var onTouchMove = function(ev) {
        if (ev.targetTouches.length === 1) {
            scrub(ev.target, ev.targetTouches && ev.targetTouches.length && ev.targetTouches[0].clientX);
            ev.preventDefault();
        }
    };

    // seeking in the loaded track buffer
    $('.sc-time-span')
    .live('click',
    function(event) {
        scrub(this, event.pageX);
        return false;
    })
    .live('touchstart',
    function(event) {
        this.addEventListener('touchmove', onTouchMove, false);
        event.originalEvent.preventDefault();
    })
    .live('touchend',
    function(event) {
        this.removeEventListener('touchmove', onTouchMove, false);
        event.originalEvent.preventDefault();
    });

    // -------------------------------------------------------------------
    // the default Auto-Initialization
    $(function() {
        if ($.isFunction($.fn.scPlayer.defaults.onDomReady)) {
            $.fn.scPlayer.defaults.onDomReady();
        }
    });

})(jQuery);

