/*
    Copyright (C) 2009 ColorCyberWay
    All rights reserved
    jQuery Frame Player Plugin
*/

( function( $ ) {

$.fn.frameplayer = function( options ) {
    
    if ( typeof options == "object" ) {
        
        var settings = $.extend( {}, $.fn.frameplayer.defaults, options );
    
        return this.each( function() {
            var stage = $( this );
            stage.data( "settings", settings );
            stage.css({
                "background-image": "url(" + settings.img + ")",
                "background-position": "0 " + settings.vPosition,
                "width": settings.width + "px",
                "height": settings.height + "px"
            });
            
            if ( settings.autoPlay ) {
                stage.frameplayer( "play" );
            }
        });
        
    } else if ( typeof options == "string" && options == "options" ) {

        var newSettings = arguments[1];
        
        return this.each( function() {
            var stage = $( this );
            $.extend( stage.data( "settings" ), newSettings );
            if ( newSettings.img ) {
                stage.css( "background-image", "url(" + newSettings.img + ")" );
            } else if ( newSettings.vPosition ) {
                stage.css( "background-position", "0 " + newSettings.vPosition );
            } else if ( newSettings.width ) {
                stage.css( "width", newSettings.width + "px" );
            } else if ( newSettings.height ) {
                stage.css( "height", newSettings.height + "px" );
            }
        });
        
    } else if ( typeof options == "string" && options == "play" ) {
        
        return this.each( function() {
            var stage = $( this );
            var settings = stage.data( "settings" );
            
            stage.frameplayer( "pause" );
            
            var playTimer = setInterval( function() {
                playFrame( stage );
                stage.trigger( "step", [stage] );
            }, 1000 / settings.framerate );
        
            stage.data( "playTimer",  playTimer );
            stage.data( "playing", true );
            
            stage.trigger( "play", [stage] );
        });
        
    } else if ( typeof options == "string" && options == "pause" ) {

        return this.each( function() {
            var stage = $( this );
            var settings = stage.data( "settings" );
            var playTimer = stage.data( "playTimer" );
            if ( playTimer ) {
                clearInterval( stage.data( "playTimer" ));
                stage.removeData( "playTimer" );
            }
            stage.data( "playing", false );
            
            stage.trigger( "pause", [stage] );
        });

    } else if ( typeof options == "string" && options == "stop" ) {

        return this.each( function() {
            var stage = $( this );
            var settings = stage.data( "settings" );
            var hPosition = settings.reverse ? ( 1 - settings.framenum ) * settings.width + "px" : "0";
            stage.frameplayer( "pause" );
            settings.currentFrame = settings.reverse ? settings.framenum : 0;
            stage.css({
                "background-position": hPosition + " " + settings.vPosition
            })
            
            stage.trigger( "stop", [stage] );
        });

    }
};

$.fn.frameplayer.defaults = {
    img: null,
    width: 100,
    height: 100,
    framerate: 25,
    framenum: 5,
    currentFrame: 0,
    autoPlay: true,
    reverse: false,
    vPosition: "0px"
};

function playFrame( stage ) {
    var settings = stage.data( "settings" );
    if (( !settings.reverse && settings.currentFrame >= settings.framenum )
        || ( settings.reverse && settings.currentFrame <= 1 )) {
        stage.frameplayer( "pause" );
        settings.currentFrame = settings.reverse ? 0 : settings.framenum;
        stage.trigger( "complete", [stage] );
        return;
    }
    
    if ( settings.reverse ) {
        settings.currentFrame --;
    } else {
        settings.currentFrame ++;
    }
    
    stage.css({
        "background-position": ( 1 - settings.currentFrame ) * settings.width + "px " + settings.vPosition
    })
    
}

})( jQuery );