/**************************************************************
/**************************************************************

    Script        : multiBox
    Version        : 2.0
    Authors        : Samuel Birch
    Desc        : Supports jpg, gif, png, flash, flv, mov, wmv, mp3, html, iframe
    Licence        : Open Source MIT Licence
    Modified    : Liam Smart (liam_smart@hotmail.com) - MooTools 1.2 upgrade
    Usage        : window.addEvent('domready', function(){
                      //call multiBox
                      var initMultiBox = new multiBox({
                          mbClass: '.mb',//class you need to add links that you want to trigger multiBox with (remember and update CSS files)
                          container: $(document.body),//where to inject multiBox
                          descClassName: 'multiBoxDesc',//the class name of the description divs
                          path: './Files/',//path to mp3 and flv players
                          useOverlay: true,//use a semi-transparent background. default: false;
                          maxSize: {w:600, h:400},//max dimensions (width,height)
                          addDownload: true,//do you want the files to be downloadable?
                          pathToDownloadScript: './Scripts/ForceDownload.asp',//if above is true, specify path to download script (classicASP and ASP.NET versions included)
                          addRollover: true,//add rollover fade to each multibox link
                          addOverlayIcon: true,//adds overlay icons to images within multibox links
                          addChain: true,//cycle through all images fading them out then in
                          recalcTop: true,//subtract the height of controls panel from top position
                          addTips: true//adds MooTools built in 'Tips' class to each element (see: http://mootools.net/docs/Plugins/Tips)
                      });
                  });

**************************************************************/

//start multiBox class
var multiBox = new Class({
    
    //implements
    Implements: [Options],
    
    //options
    options:{
        initialWidth: 250,//initial width the box will open at before resizing
        initialHeight: 250,//initial height the box will open at before resizing
        useOverlay: false,//do you want to use a semi-transparent bacgground?
        contentColor: '#fff',//background colour of the content holder within the pop-up
        showNumbers: false,//show numbers such as "4 of 12"
        showControls: false,//show the previous/next, title, download etc
        descClassName: false,//class of description box
        movieWidth: 657,//default width of movie
        movieHeight: 300,//default height of movie
        offset: {x:0, y:0},//offset multiBox position
        fixedTop: false,//force multiBox to open at top of page
        path: './Files/',//path to mp3player and flvplayer etc
        openFromLink: true,//pop-up will slide in from the position of the element clicked
        useKeyboard: true,//allow keyboard shortcuts (esc: close, spacebar & right arrow: next, left arrow: previous)
        onOpen: new Class(),//make sure new class is loaded
        onClose: new Class()//make sure new class is loaded
    },

    //initialization
    initialize: function(options){
        //set options
        this.setOptions(options);

        //set variables
        this.openClosePos = {};
        this.timer = 0;
        this.contentToLoad = {};
        this.index = 0;
        this.opened = false;
        this.contentObj = {};
        this.containerDefaults = {};
        this.multiBox = [];
        this.families = [];
        this.content = [];
        this.currentGallery = null;
        
        //start multiBox
        if($$(this.options.mbClass).length > 0){this.start();};
    },
    
    //start multiBox
    start: function(){
        //there will be no next/previous buttons unless you specify them to a group
        $$(this.options.mbClass).each(function(el){
            //we must store original rel & title values to use later
            if($chk(el.get('rel'))){
                el.store('origRel',el.get('rel'));
            };
            if($chk(el.get('title'))){
                el.store('origTitle',el.get('title'));
            };
            //check if it has a rel="[group]"
            if(el.get('rel').test(/\[*?]/i)){
                //if there are more than 1 rel value, we need to split them to find our group
                if(el.get('rel').contains(',')){
                    //split then loop through each array instance of the split rel's
                    var tempArr = el.get('rel').split(',');
                    tempArr.each(function(temp,i){
                        if(temp.contains('[')){//only take out the rel relating to a [group]
                            //change this links relation to the temp variable
                            el.set('rel',temp);
                        };
                    },this);
                };
                //if rel isnt already in fanilies then create a new instance for it
                this.families.include(el.get('rel'));
            };
            
            //finally now we have put them into families, push each link with 'mbClass' into multiBox array
            this.multiBox.push(el);
        },this);
        
        //loop through each mb link seperating content into groups of families
        this.multiBox.each(function(el){
            //check rel contains a group
            if(el.get('rel').test(/\[*?]/i)){
                //we know the link has a group so loop through each family to find where it belongs
                this.families.each(function(fam,i){
                    //if the rel belongs to a family we make sure its pushed into correct family array within content array
                    if(el.get('rel') == fam){
                        //if there isnt a family array within content array to hold this family create one
                        if(!this.content[i]){
                            //create new gallery
                            this.content[i] = [];
                        };
                        //finally push link into appropriate family within content array
                        this.content[i].push(el);
                    };
                },this);
            };
        },this);
        
        //loop through each mb link seperating content into groups of families
        this.multiBox.each(function(el){
            //check rel DOESNT contain a group
            if(el.get('rel').test(/\[*?]/i) == false){
                //add link into content array as a single array as it doesnt belong to a family
                this.content.push([el]);
            };
        },this);
        
        this.container = new Element('div').addClass('MultiBoxContainer').inject(this.options.container,'inside');
        this.iframe = new Element('iframe', {
            'id': 'multiBoxIframe',
            'name': 'mulitBoxIframe',
            'src': 'javascript:void(0);',
            'frameborder': 0,
            'scrolling': 'no',
            'styles': {
                position: 'absolute',
                top: 0,
                left: 0,
                width: '100%',
                height: '100%',
                filter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)',
                opacity: 0
            }
        }).inject(this.container,'inside');

        this.box = new Element('div').addClass('MultiBoxContent').inject(this.container,'inside');
        this.closeButton = new Element('div').addClass('MultiBoxClose').inject(this.container,'inside').addEvent('click', this.close.bind(this));
        this.controlsContainer = new Element('div').addClass('MultiBoxControlsContainer').inject(this.container,'inside');
        this.controls = new Element('div').addClass('MultiBoxControls').inject(this.controlsContainer,'inside');
        this.previousButton = new Element('div').addClass('MultiBoxPrevious').inject(this.controls,'inside').addEvent('click', this.previous.bind(this));
        this.nextButton = new Element('div').addClass('MultiBoxNext').inject(this.controls,'inside').addEvent('click', this.next.bind(this));
        this.title = new Element('div').addClass('MultiBoxTitle').inject(this.controls,'inside');
        //this.number = new Element('div').addClass('MultiBoxNumber').inject(this.controls,'inside');
        this.description = new Element('div').addClass('MultiBoxDescription').inject(this.controls,'inside');
        
        //check user options and call functions accordingly
        if(this.options.useKeyboard){
            $(window.document).addEvent('keydown',function(e){
                if(e.key == 'right' || e.key == 'space'){
                    this.next();
                }else if(e.key == 'left'){
                    this.previous();
                }else if(e.key == 'esc'){
                    this.close();
                };
            }.bind(this));
        };
        if(this.options.useOverlay){
            this.overlay = new Overlay({
                container:this.options.container,
                onClick:this.close.bind(this)
            });
        };
        if(this.options.addOverlayIcon == true){
            this.addOverlayIcon(this.multiBox);
        };
        if(this.options.addRollover == true){
            this.addRollover(this.multiBox);
        };
        if(this.options.addChain == true){
            this.addChain(this.multiBox);
        };
        if(this.options.descClassName){
            this.descriptions = $$('.'+this.options.descClassName);
        };
        if(this.options.addDownload == true){
            this.addDownload(this.multiBox);
        };
        if(this.options.addTips == true){
            this.addTips(this.multiBox);
        };

        //if there is only one multiBox link don't show unneccesary buttons
        if(this.multiBox.length == 1){
            this.title.setStyle('margin-left',0);
            this.description.setStyle('margin-left',0);
            this.previousButton.setStyle('display','none');
            this.nextButton.setStyle('display','none');
            //this.number.setStyle('display','none');
        };
        
        new Element('div').setStyle('clear','both').inject(this.controls,'inside');
        
        //start breaking into content array to add event listeners to each link within each group
        this.content.each(function(el,i){
            //now we are left with each group as arrays
            el.each(function(group,i){
                //add event listener
                group.addEvent('click', function(e){
                    if (Browser.Engine.trident) $$('.mod_right2_table select').setStyle('display', 'none');
                    var myTarget = ($(e.target).match('a')) ? $(e.target) : $(e.target).getParent('a');
                    e.preventDefault();
                    this.open(el.indexOf(myTarget),el);
                }.bind(this));
                //check to see if link is an HTML element
                if(group.href.indexOf('#') > -1){
                    //grab it as an object
                    group.content = $(group.href.substr(group.href.indexOf('#')+1));
                    //hide the object
                    if(group.content){
                        group.content.setStyle('display','none');
                    };
                };
            },this);
        },this);
        
        this.containerEffects = new Fx.Morph(this.container,{duration:400});
        this.controlEffects = new Fx.Morph(this.controlsContainer,{duration:300});
        this.reset();
    },
    
    setContentType: function(element){
        var str = element.href.substr(element.href.lastIndexOf('.')+1).toLowerCase();
        var myRel = element.retrieve('origRel');
        var contentOptions = {};
        
        //retrieve original rel values and make sure there was one
        if($chk(myRel)){
            //split the options just incase there are more than 1
            var optArr = myRel.split(',');
            optArr.each(function(el){
                //make sure the group is ignored
                if(el.test(/\[*?]/i) != true){
                    var ta = el.split(':');
                    contentOptions[ta[0]] = ta[1];
                };
            });
        };
        
        if(contentOptions.type != undefined){
            str = contentOptions.type;
        };
        
        this.contentObj = {};
        this.contentObj.url = element.href;
        this.contentObj.xH = 0;
        
        if(contentOptions.width){
            this.contentObj.width = contentOptions.width;
        }else{
            this.contentObj.width = this.options.movieWidth;
        };
        if(contentOptions.height){
            this.contentObj.height = contentOptions.height;
        }else{
            this.contentObj.height = this.options.movieHeight;
        };
        if(contentOptions.panel){
            this.panelPosition = contentOptions.panel;
        }else{
            this.panelPosition = this.options.panel;
        };
        
        switch(str){
            case 'jpg':
            case 'jpeg':
            case 'gif':
            case 'png':
                this.type = 'image';
                break;
            case 'swf':
                this.type = 'flash';
                break;
            case 'flv':
                this.type = 'flashVideo';
                this.contentObj.xH = 70;
                break;
            case 'mov':
                this.type = 'quicktime';
                break;
            case 'wmv':
                this.type = 'windowsMedia';
                break;
            case 'rv':
            case 'rm':
            case 'rmvb':
                this.type = 'real';
                break;
            case 'mp3':
                this.type = 'flashMp3';
                this.contentObj.width = 320;
                this.contentObj.height = 70;
                break;
            case 'element':
                this.type = 'htmlelement';
                this.elementContent = element.content;
                this.elementContent.setStyles({
                    display: 'block',
                    opacity: 0,
                    width: 'auto'//added this to get htmlElement to behave
                });
                
                //check and see if styles are being applied to HTML content section
                if(this.elementContent.getStyle('width') != 'auto'){
                    this.contentObj.width = this.elementContent.getSize().x;
                };
                
                this.contentObj.height = this.elementContent.getSize().y;
                this.elementContent.setStyles({
                    display: 'none',
                    opacity: 1
                });
                break;
            default:
                this.type = 'iframe';
                if(contentOptions.req){
                    this.type = 'req';
                };
                break;
        }
    },
    
    reset: function(){
        this.container.setStyles({
            opacity: 0,
            display: 'none'
        });
        this.controlsContainer.setStyle('height',0);
        this.removeContent();
        this.previousButton.removeClass('MultiBoxButtonDisabled');
        this.nextButton.removeClass('MultiBoxButtonDisabled');
        this.opened = false;
    },
    
    getOpenClosePos: function(element){
        if(this.options.openFromLink){
            if(element.getFirst()){
                var w = element.getFirst().getCoordinates().width - (this.container.getStyle('border').toInt() * 2);
                if(w < 0){
                    w = 0;
                };
                var h = element.getFirst().getCoordinates().height - (this.container.getStyle('border').toInt() * 2);
                if(h < 0){
                    h = 0;
                };
                this.openClosePos = {
                    width: w,
                    height: h,
                    top: element.getFirst().getCoordinates().top,
                    left: element.getFirst().getCoordinates().left
                };
            }else{
                var w = element.getCoordinates().width - (this.container.getStyle('border').toInt() * 2);
                if(w < 0){
                    w = 0;
                };
                var h = element.getCoordinates().height - (this.container.getStyle('border').toInt() * 2);
                if(h < 0){
                    h = 0;
                };
                this.openClosePos = {
                    width: w,
                    height: h,
                    top: element.getCoordinates().top,
                    left: element.getCoordinates().left
                };
            };
        }else{
            if(this.options.fixedTop){
                var top = this.options.fixedTop;
            }else{
                var top = ((window.getHeight()/2)-(this.options.initialHeight/2)-this.container.getStyle('border').toInt())+this.options.offset.y;
            };
            this.openClosePos = {
                width: this.options.initialWidth,
                height: this.options.initialHeight,
                top: top,
                left: ((window.getWidth()/2)-(this.options.initialWidth/2)-this.container.getStyle('border').toInt())+this.options.offset.x
            };
        };
        return this.openClosePos;
    },
    
    open: function(index,currGal){
        //need to store current gallery and index of the object in gallery
        this.currentGallery = currGal;
        this.index = index;
        
        //grab id so description can be matched
        this.openId = this.currentGallery[this.index].getProperty('id');
        
        //check to see if mb is already open
        if(!this.opened){
            this.opened = true;
            
            if(this.options.useOverlay){
                this.overlay.show();
            };
            
            this.container.setStyles(this.getOpenClosePos(this.currentGallery[this.index]));
            this.container.setStyles({
                opacity: 0,
                display: 'block'
            });
            
            if(this.options.fixedTop){
                var top = this.options.fixedTop;
            }else{
                var top = document.body.getScroll().y+150;
                //alert(this.options.offset.y)
            };
            
        
           this.containerEffects.start({
                width: this.options.initialWidth,
                height: this.options.initialHeight,
                top: top,
                left: ((window.getWidth()/2)-(this.options.initialWidth/2)-this.container.getStyle('border').toInt())+this.options.offset.x,
                opacity: [0, 1]
            });
            
            this.load(this.currentGallery[this.index]);
        }else{
            if(this.options.showControls){
                this.hideControls();
            };
            this.getOpenClosePos(this.currentGallery[this.index]);
            this.timer = this.hideContent.bind(this).delay(500);
            this.timer = this.load.pass(this.currentGallery[this.index],this).delay(1100);
        };
    },
    
    getContent: function(element){
        this.setContentType(element);
        var desc = {};
        if(this.options.descClassName){
            this.descriptions.each(function(el,i){
                if(el.hasClass(this.openId)){
                    desc = el.clone();
                };
            },this);
        };
        this.contentToLoad = {
            title: element.retrieve('origTitle') || '&nbsp;',
            desc: desc,
            number: this.index+1
        };
    },
    
    close: function(){
        if(this.options.useOverlay){
            this.overlay.hide();
        };
        if(this.options.showControls){
            this.hideControls();
        };
        this.hideContent();
        this.containerEffects.cancel();
        this.zoomOut.bind(this).delay(500);
        this.options.onClose();
        if (Browser.Engine.trident) $$('.mod_right2_table select').setStyle('display', 'block');
    },
    
    zoomOut: function(){
        this.containerEffects.start({
            width: this.openClosePos.width,
            height: this.openClosePos.height,
            top: this.openClosePos.top,
            left: this.openClosePos.left,
            opacity: 0
        });
        this.reset.bind(this).delay(500);
    },
    
    load: function(element){
        this.box.addClass('MultiBoxLoading');
        this.getContent(element);
        if(this.type == 'image'){
            var xH = this.contentObj.xH;
            this.contentObj = new Asset.image(element.href,{onload:this.resize.bind(this)});
            this.contentObj.xH = xH;
        }else{
            this.resize();
        };
    },
    
    resize: function(){
        //only resize if values have been set to resize to
        if(this.options.maxSize != null){
            var maxW = this.options.maxSize.w.toInt();//declare max width at top of script
            var maxH = this.options.maxSize.h.toInt();//declare max height at top of script
            var dW = 0;//set initial final width to 0
            var dH = 0;//set initial final height to 0
            var h = dH = this.contentObj.height;//retrieve image height
            var w = dW = this.contentObj.width;//retrieve image width
            
            if((h >= maxH) && (w >= maxW)){
                if(h > w){
                    dH = maxH;
                    dW = ((w * dH) / h).toInt();
                }else{
                    dW = maxW;
                    dH = ((h * dW) / w).toInt();
                };
            }else if((h > maxH) && (w < maxW)){
                dH = maxH;
                dW = ((w * dH) / h).toInt();
            }else if((h < maxH) && (w > maxW)){
                dW = maxW;
                dH = ((h * dW) / w).toInt();
            };
            
            this.contentObj.height = dH;//resize image height
            this.contentObj.width = dW;//resize image width
        };
        
        if(this.options.fixedTop){
            var top = this.options.fixedTop;
        }else{
            var top = ((window.getHeight() / 2) - ((Number(this.contentObj.height) + this.contentObj.xH) / 2) - this.container.getStyle('border').toInt() + window.getScrollTop()) + this.options.offset.y;
        };
        var left = ((window.getWidth() / 2) - (this.contentObj.width / 2) - this.container.getStyle('border').toInt()) + this.options.offset.x;
        if(top < 0){
            top = 0;
        };
        if(left < 0){
            left = 0;
        };
        
        this.containerEffects.cancel();
        this.containerEffects.start({
            width: this.contentObj.width,
            height: Number(this.contentObj.height) + this.contentObj.xH,
            top: top,
            left: left,
            opacity: 1
        });
        this.timer = this.showContent.bind(this).delay(500);
    },
    
    showContent: function(){
        this.box.removeClass('MultiBoxLoading');
        this.removeContent();
        this.contentContainer = new Element('div', {
            'id': 'MultiBoxContentContainer',
            'styles': {
                opacity: 0,
                width: this.contentObj.width,
                height: (Number(this.contentObj.height)+this.contentObj.xH)
            }
        }).inject(this.box,'inside');

        if(this.type == 'image'){
            this.contentObj.inject(this.contentContainer,'inside');
        }else if(this.type == 'iframe'){
            new Element('iframe', {
                'id': 'iFrame'+new Date().getTime(),
                'width': this.contentObj.width,
                'height': this.contentObj.height,
                'src': this.contentObj.url,
                'frameborder': 0,
                'scrolling': 'auto'
            }).inject(this.contentContainer,'inside');
        }else if(this.type == 'htmlelement'){
            this.elementContent.clone().setStyle('display','block').inject(this.contentContainer,'inside');
        }else if(this.type == 'req'){
            var req = new Request.HTML({
                url: this.contentObj.url,
                method: 'get',
                evalScripts: true,
                onSuccess: function(responseTree,responseElements,responseHTML,responseJavaScript){
                    $('MultiBoxContentContainer').adopt(responseElements);
                }
            }).get();
        }else{
            this.obj = new Element('div').setProperties({id: 'MultiBoxMediaObject'}).inject(this.contentContainer,'inside');
            this.createEmbedObject();
            //if its a movie inject the object string into obj
            if(this.str){
                this.obj.set('html',this.str);
                this.str = null;//clear the value after using it
            };
        };
        
        this.contentEffects = new Fx.Morph(this.contentContainer,{duration:500});
        this.contentEffects.start({
            opacity: 1
        });
        
        this.title.set('html',this.contentToLoad.title);
        //this.number.set('html',this.contentToLoad.number+' of '+this.currentGallery.length);
        if(this.options.descClassName){
            //check to see if there is a desc override
            if(this.currentGallery[this.index].retrieve('origRel')){
                //declare variables
                var ignoreDesc = false;
                var myRel = this.currentGallery[this.index].retrieve('origRel');
                var optArr = myRel.split(',');
                //loop through each split looking for 'noDesc'
                optArr.each(function(el){
                    if(el.test('noDesc') == true){
                        ignoreDesc = true;
                    };
                });
            };
            //check and see if user wants to override default description setting for this element
            if(ignoreDesc != true){
                if(this.description.getFirst()){
                    this.description.getFirst().destroy();
                };
                this.contentToLoad.desc.inject(this.description,'inside').setStyle('display','block');
            };
        };

        if(this.options.showControls){
            this.timer = this.showControls.bind(this).delay(800);
        };
        
        if(this.options.addDownload){
            //get file path & name
            var filePath = this.currentGallery[this.index].href;
            var fileName = this.currentGallery[this.index].href.substring(this.currentGallery[this.index].href.lastIndexOf('/')+1);
            //build download link
            this.download.set('html','<a href="'+this.options.pathToDownloadScript+'?FilePath='+filePath+'" title="Download File '+fileName+'">Download File</a>');
        };
    },
    
    hideContent: function(){
        this.box.addClass('MultiBoxLoading');
        this.contentEffects.start({
            opacity: 0
        });
        this.removeContent.bind(this).delay(500);
    },
    
    removeContent: function(){
        if($('MultiBoxMediaObject')){
            $('MultiBoxMediaObject').empty();//so sound doesnt keep playing in IE
            $('MultiBoxMediaObject').dispose();//dispose() instead of destroy() as IE 6&7 crashes
        };
        if($('MultiBoxContentContainer')){
            $('MultiBoxContentContainer').dispose();//dispose() instead of destroy() as IE 6&7 crashes
        };
        if(this.description){
            this.description.empty();//empty description incase next element doesnt want to have one
        };
    },
    
    showControls: function(){
        if(this.container.getStyle('height') != 'auto'){
            this.containerDefaults.height = this.container.getStyle('height');
            this.containerDefaults.backgroundColor = this.options.contentColor;
            //controls box isnt taken into consideration when positioning the container from the top so correct this
            if(this.options.recalcTop == true){
                if(this.container.getStyle('top').toInt() > this.controls.getStyle('height').toInt()/2){
                    this.finalResize = new Fx.Morph(this.container,{duration:400});
                    this.finalResize.start({
                        top: this.container.getStyle('top').toInt()-(this.controls.getStyle('height').toInt()/2)
                    });
                };
            };
        };
        
        this.container.setStyle('height','auto');

        if(this.contentToLoad.number == 1){
            this.previousButton.addClass('MultiBoxPreviousDisabled');
        }else{
            this.previousButton.removeClass('MultiBoxPreviousDisabled');
        };
        if(this.contentToLoad.number == this.currentGallery.length){
            this.nextButton.addClass('MultiBoxNextDisabled');
        }else{
            this.nextButton.removeClass('MultiBoxNextDisabled');
        };
        
        this.controlEffects.start({
            'height': this.controls.getStyle('height')
        });
    },
    
    hideControls: function(num){
        this.controlEffects.start({'height': 0}).chain(function(){
            this.container.setStyles(this.containerDefaults);
        }.bind(this));
    },
    
    next: function(){
        if(this.index < this.currentGallery.length-1){
            this.index++;
            this.openId = this.currentGallery[this.index].getProperty('id');
            if(this.options.showControls){
                this.hideControls();
            };
            this.getOpenClosePos(this.currentGallery[this.index]);
            this.timer = this.hideContent.bind(this).delay(500);
            this.timer = this.load.pass(this.currentGallery[this.index],this).delay(1100);
        };
    },
    
    previous: function(){
        if(this.index > 0){
            this.index--;
            this.openId = this.currentGallery[this.index].getProperty('id');
            if(this.options.showControls){
                this.hideControls();
            };
            this.getOpenClosePos(this.currentGallery[this.index]);
            this.timer = this.hideContent.bind(this).delay(500);
            this.timer = this.load.pass(this.currentGallery[this.index],this).delay(1000);
        };
    },
    
    createEmbedObject: function(){
        if(this.type == 'flash'){
            var url = this.contentObj.url;
            var swfHolder = new Element('div').setProperties({id: 'swfHolder'}).inject(this.obj,'inside');
            var flashObj = new Swiff(url, {
                id: url,
                container: swfHolder,
                width: this.contentObj.width,
                height: this.contentObj.height
            });
        };
        
        if(this.type == 'flashVideo'){
            var url = this.contentObj.url;
            var swfHolder = new Element('div').setProperties({id: 'swfHolder'}).inject(this.obj,'inside');
            var flashObj = new Swiff(this.options.path+'flvplayer.swf', {
                id: url,
                container: swfHolder,
                width: this.contentObj.width,
                height: (Number(this.contentObj.height)+this.contentObj.xH),
                vars: {
                    path: url
                }
            });
        };
        
        if(this.type == 'flashMp3'){
            var url = this.contentObj.url;
            var swfHolder = new Element('div').setProperties({id: 'swfHolder'}).inject(this.obj,'inside');
            var flashObj = new Swiff(this.options.path+'mp3player.swf', {
                id: url,
                container: swfHolder,
                width: this.contentObj.width,
                height: (Number(this.contentObj.height)+this.contentObj.xH),
                vars: {
                    path: url
                }
            });
        };
        
        if(this.type == 'quicktime'){
            var url = this.contentObj.url;
            this.str = '<object  type="video/quicktime" classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab"';
            this.str += ' width="'+this.contentObj.width+'" height="'+this.contentObj.height+'">';
            this.str += '<param name="src" value="'+url+'" />';
            this.str += '<param name="autoplay" value="true" />';
            this.str += '<param name="controller" value="true" />';
            this.str += '<param name="enablejavascript" value="true" />';
            this.str += '<embed src="'+url+'" autoplay="true" pluginspage="http://www.apple.com/quicktime/download/" width="'+this.contentObj.width+'" height="'+this.contentObj.height+'"></embed>';
            this.str += '</object>';
        };
        
        if(this.type == 'windowsMedia'){
            var url = this.contentObj.url;
            this.str = '<object  type="application/x-oleobject" classid="CLSID:22D6f312-B0F6-11D0-94AB-0080C74C7E95" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,7,1112"';
            this.str += ' width="'+this.contentObj.width+'" height="'+this.contentObj.height+'">';
            this.str += '<param name="filename" value="'+url+'" />';
            this.str += '<param name="Showcontrols" value="true" />';
            this.str += '<param name="autoStart" value="true" />';
            this.str += '<embed type="application/x-mplayer2" src="'+url+'" Showcontrols="true" autoStart="true" width="'+this.contentObj.width+'" height="'+this.contentObj.height+'"></embed>';
            this.str += '</object>';
        };
        
        if(this.type == 'real'){
            var url = this.contentObj.url;
            this.str = '<object classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"';
            this.str += ' width="'+this.contentObj.width+'" height="'+this.contentObj.height+'">';
            this.str += '<param name="src" value="'+url+'" />';
            this.str += '<param name="controls" value="ImageWindow" />';
            this.str += '<param name="autostart" value="true" />';
            this.str += '<embed src="'+url+'" controls="ImageWindow" autostart="true" width="'+this.contentObj.width+'" height="'+this.contentObj.height+'"></embed>';
            this.str += '</object>';
        };
    },
    
    addOverlayIcon:function(element){
        //loop through each instance
        element.each(function(el,i){
            //if link contains an image ad overlay
            if(el.getElement('img')){
                //add position:relative to them so that icon is contained
                el.setStyle('position','relative');
                //inject a new div that is the overlay icon
                var overlayIcon = new Element('div').inject(el,'inside');
                overlayIcon.addClass('OverlayIcon');
                //IE6 causes too many issues due to lack of PNG support
                if(!Browser.Engine.trident4){
                    overlayIcon.setStyle('opacity',0);
                    overlayIcon.set('tween',{duration:3000,transition:Fx.Transitions.Expo.easeIn}).tween('opacity',1);
                };
            };
        });
    },
    
    addRollover:function(element){
        element.each(function(el,i){
            //if link contains an image ad overlay
            if(el.getElement('img')){
                //add event listeners
                el.addEvents({
                    'mouseenter': function(){
                        el.getElement('img').set('tween',{duration:200,transition:Fx.Transitions.linear}).tween('opacity',0.5);
                    },
                    'mouseleave': function(){
                        el.getElement('img').set('tween',{duration:400,transition:Fx.Transitions.linear}).tween('opacity',1);
                    }
                });
            };
        });
    },
    
    addChain:function(element){
        //create new array to hold all links with images to chain through
        var chainArray = [];
        //push link into chainArray if it contains an image
        element.each(function(el,i){
            //detect whether link contains image
            if(el.getElement('img')){
                chainArray.push(el);
            };
        });
        //now chain through each item in the new array
        chainArray.each(function(el,i){
            //detect whether link contains image
            if(el.getElement('img')){
                //chain through each multibox link that contains an image
                var HoverMe = new Chain();
                var hoverOn = function(){
                    el.getElement('img').set('tween',{duration:200,transition:Fx.Transitions.linear}).tween('opacity',0.5);
                };
                var hoverOff = function(){
                    el.getElement('img').set('tween',{duration:400,transition:Fx.Transitions.linear}).tween('opacity',1);
                };
                HoverMe.chain(hoverOn);
                HoverMe.chain(hoverOff);
                HoverMe.callChain.delay(2000+(i+1)*1000,HoverMe);
                HoverMe.callChain.delay((i+2)*1000,HoverMe);
            };
        });
    },
    
    addDownload:function(element){
        this.download = new Element('div').addClass('MultiBoxDownload').inject(this.controls,'inside').setStyle('margin-left',0);
    },
    
    addTips:function(element){
        element.each(function(el,i){
            //add MooTools tips
            if(el.get('title')){
                var toolTips = new Tips(el, {
                    onShow: function(el){el.fade(.9);},
                    onHide: function(el){el.fade(0);},
                    offsets: {'x':16,'y':5},
                    className: 'mbTips'
                });
            };
            //remove title so dont get duplication of title and MooTools tips
            if(el.getElement('img')){
                if(el.getElement('img').get('title')){
                    el.getElement('img').erase('title');
                };
                if(el.getElement('img').get('alt')){
                    el.getElement('img').erase('alt');
                };
            };
        });
    }
});