var MediaView = new Class({
    element: null,
    itemControlContainerElement: null,
    items: Array(),
    currentItemIndex: -1,
    nextItemTimeout: null,
    isRunning: true,
    decreaseHeightBy: 0,
    colorOverlay: null,
    isPaused: false,

    initialize: function(element,itemControlContainerElement){
        this.element = element;
        this.itemControlContainerElement = itemControlContainerElement;

        if( isNaN(this.decreaseHeightBy = parseInt(this.element.get("decreaseHeightBy"))) )
        {
            this.decreaseHeightBy = 0;
        }

        var items = this.element.getChildren();
        for( var i = 0; i < items.length; i++ )
        {
            switch( items[i].get("tag") )
            {
                case "img":
                    this.items[this.items.length] = new MediaViewItemImage(this,items[i].get("src"),items[i].get("alt"));
                    break;
                case "a":
                    this.items[this.items.length] = new MediaViewItemAnchorImage(this,items[i]);
                    break;
                case "div":
                    if( items[i].hasClass("video") == true )
                    {
                        this.items[this.items.length] = new MediaViewItemVideo(this,items[i].get("text"));
                        break;
                    }
                default:
                    alert("Unknown medium type element: " + items[i].get("tag"));
            }
        }
        this.element.empty();

        this.colorOverlay = new Element("div");
        this.colorOverlay.addClass("colorOverlay");
        this.colorOverlay.setStyle("opacity",0.03);

        for( var i = 0; i < this.items.length; i++ )
        {
            var el = this.items[i].getElement();
            el.addEvent("mouseenter",this.onItemMouseEnter.bind(this));
            el.addEvent("mouseleave",this.onItemMouseLeave.bind(this));
            this.items[i].hide(true);
            el.inject(this.element);

            if(( this.itemControlContainerElement != null ) && ( this.items.length > 1 ))
            {
                var itemControl = new Element("div");
                itemControl.addClass("MediaViewItemControl");
                itemControl.mediaViewItemIndex = i;
                itemControl.addEvent("mouseenter",this.onControlMouseEnter.bind(this));
                itemControl.addEvent("mouseleave",this.onControlMouseLeave.bind(this));
                itemControl.addEvent("click",this.onControlClick.bind(this));
                itemControl.inject(this.itemControlContainerElement);
            }
        }

        //this.colorOverlay.inject(this.element);

        if( this.items.length > 0 )
        {
            this.nextItem();
        }
        window.addEvent("resize",this.onResize.bind(this));

        var curve = new Element("div");
        curve.addClass("curve");
        curve.inject(this.element);
    },
    nextItem: function(mediaViewItemIndex){
        clearTimeout(this.nextItemTimeout);
        if( this.isPaused == false )
        {
            if( this.currentItemIndex != -1 )
            {
                this.items[this.currentItemIndex].hide();
            }
            if( mediaViewItemIndex == null )
            {
                this.currentItemIndex++;
            }
            else
            {
                this.currentItemIndex = mediaViewItemIndex;
            }
            if(( this.currentItemIndex >= this.items.length ) || ( this.currentItemIndex < 0 ))
            {
                this.currentItemIndex = 0;
            }
            this.items[this.currentItemIndex].show();

            if( this.itemControlContainerElement != null )
            {
                var itemControls = this.itemControlContainerElement.getChildren("div.MediaViewItemControl");
                for( var i = 0; i < itemControls.length; i++ )
                {

                    if( itemControls[i].mediaViewItemIndex == this.currentItemIndex )
                    {
                        itemControls[i].addClass.delay(250,itemControls[i],Array("current"));
                    }
                    else
                    {
                        itemControls[i].removeClass("current");
                    }
                }
            }
        }

        if( this.isRunning == true )
        {
            this.nextItemTimeout = this.nextItem.delay(MediaView.ITEMDELAY,this);
        }
    },
    prevItem: function(){
        var index = this.currentItemIndex-1;
        if( index < 0 )
        {
            index = this.items.length-1;
        }
        return this.nextItem(index);
    },
    onControlMouseEnter: function(){
        clearTimeout(this.nextItemTimeout);
        this.wasRunning = this.isRunning;
        this.isRunning = false;
    },
    onControlMouseLeave: function(){
        this.isRunning = this.wasRunning;
        this.nextItemTimeout = this.nextItem.delay(MediaView.ITEMDELAY,this);
    },
    onControlClick: function(e){
        clearTimeout(this.nextItemTimeout);
        this.nextItem(e.target.mediaViewItemIndex);
    },
    onItemMouseEnter: function(){
        clearTimeout(this.nextItemTimeout);
        this.wasRunning = this.isRunning;
        this.isRunning = false;
    },
    onItemMouseLeave: function(){
        this.isRunning = this.wasRunning;
        this.nextItemTimeout = this.nextItem.delay(MediaView.ITEMDELAY,this);
    },
    onResize: function(){
        for( var i = 0; i < this.items.length; i++ )
        {
            this.items[i].onResize();
        }
    },
    play: function(){
        this.isPaused = false;
    },
    pause: function(){
        this.isPaused = true;
    }
});
MediaView.ITEMDELAY = 5000;

MediaView.updateInstances = function(){
    var views = $$("div.MediaView");
    for( var i = 0; i < views.length; i++ )
    {
        if( views[i].instance != null )
        {
            continue;
        }
        var controlContainer = document.id(views[i].get("MediaViewItemControlId"));
        views[i].instance = new MediaView(views[i],controlContainer);
    }
};

MediaView.playInstances = function(){
    var views = $$("div.MediaView");
    for( var i = 0; i < views.length; i++ )
    {
        if( views[i].instance == null )
        {
            continue;
        }
        views[i].instance.play();
    }
};

MediaView.pauseInstances = function(){
    var views = $$("div.MediaView");
    for( var i = 0; i < views.length; i++ )
    {
        if( views[i].instance == null )
        {
            continue;
        }
        views[i].instance.pause();
    }
};
