/* Author: 

*/
var com = {};
com.camerasim = {};

window.addEvent('domready', function () {

    new com.camerasim.Resize();
    new com.camerasim.EmbedForm('embed-overlay');
    
    $$('a.close-overlay').addEvent('click', function (event) {
        event.stop();
        Mediabox.close();
    });
});

com.camerasim.Resize = new Class({
    Implements: [Options, Events],
    
    options: {
        minWidth: 550,
        maxWidth: 738,
        extraHeight: 20
    },
    
    initialize: function (elm, options) {
        this.setOptions(options);    
        
        var size = this.getValidSize();
        
        $$('object').each(function (element) {
            if (element.setStyles) {
                element.setStyles({
                    width: size.width,
                    height: size.swfHeight
                });
            }
            
            element.width = parseInt(size.width);
            element.height = parseInt(size.swfHeight);
        });        
    },
    
    getValidSize: function (width) {
        var windowSize = window.getSize();

        if (windowSize.x < this.options.minWidth) {
            windowSize.x = this.options.minWidth;
        } 
        
        if (windowSize.x > this.options.maxWidth) {
            windowSize.x = this.options.maxWidth;
        }
        
        return {
            width: windowSize.x,
            height: windowSize.x + this.options.extraHeight,
            swfHeight: windowSize.x
        };                    
    }
});

com.camerasim.EmbedForm = new Class({
    Implements: [Options, Events],

    options: {
        url: 'http://camerasim.com/embed',
        embed: 'camera-simulator',
        width: 738,
        height: 758,
        settings: {
            lighting: '',       // l
            distance: '',       // d
            focallength: '',    // f
            mode: '',           // m
            iso: '',            // i
            aperature: '',      // a
            shutter: '',        // s
            tripod: ''          // t
        },
        maxWidth: 653,
        minWidth: 550,
        size: {
            small: {
                width: 550,
                height: 570
            },
            medium: {
                width: 640,
                height: 660
            },
            full: {
                width: 738,
                height: 758
            }
        }
    },

    initialize: function (elm, options) {
        this.setOptions(options);    
        
        this.elm = $(elm);
        
        if (! this.elm) {
            return;
        }
        
        var boundClickHandler = this.clickHandler.bind(this);
        var boundToggleClickHandler = this.toggleClickHandler.bind(this);
        var boundSettingsClickHandler = this.settingsClickHandler.bind(this);
        var boundSizeClickHandler = this.sizeClickHandler.bind(this);
        
        if ($('embed-button')) {
            $('embed-button').addEvent('click', boundClickHandler);
        }
        
        this.elm.getElements('.toggle').addEvent('click', boundToggleClickHandler);
        
        this.advancedForm = $('embed-advanced');
        this.advancedForm.set('morph', {
            link: 'cancel',
            duration: 100,
            transition: Fx.Transitions.Sine.easeOut
        });        
        
        this.advFormHidden = true;   

        this.elm.getElements('.setting').addEvent('click', boundSettingsClickHandler);
        this.codeTextarea = this.elm.getElement('#embed-code');
        this.codeTextarea.addEvent('click', function (event) {
            $(event.target).select();
        });
        
        this.elm.getElements('input[name=size]').addEvent('click', boundSizeClickHandler);
    },
    
    clickHandler: function (event) {
        event.stop();
        this.open();
    },
    
    open: function () {
        var size = window.getSize();
        
        if (size.x < this.options.minWidth) {
            size.x = this.options.minWidth;
        }
        
        if (size.x > this.options.maxWidth) {
            size.x = this.options.maxWidth;
        }

        var dimensions = size.x + ' 437';
        
        this.resetSize();
        this.hideAdvancedForm();
        Mediabox.open('#mb_embed', 'javascript trigger', dimensions);        
        
        this.codeTextarea.select();
        
        if (window.fdSliderController) {
            fdSliderController.redrawAll();
        }
    },
    
    toggleClickHandler: function (event) {
        event.stop();
        
        if (this.advFormHidden) {
            this.showAdvancedForm();
        } else {
            this.hideAdvancedForm();
        }     
    },
    
    showAdvancedForm: function () {
        this.advFormHidden = false;
        
        this.advancedForm.setStyle('display', 'block');
        
        if (! $$('.ie7 body')[0]) {
            this.advancedForm.morph({
                'opacity': 1,
                'height': 159
            });        
        } 
        
        this.elm.getElements('.toggle').addClass('down');                
    },
    
    hideAdvancedForm: function () {        
        this.advFormHidden = true;
        
        if (! $$('.ie7 body')[0]) {
            this.advancedForm.morph({
                'opacity': 0,
                'height': 0
            });            
        } else {
            this.advancedForm.setStyle('display', 'none');
        }
        
        this.elm.getElements('.toggle').removeClass('down');
        this.reset();
    },
    
    reset: function () {
        $$('.setting').each(function (item) {
            this.resetSetting(item);
        }.bind(this));    
        
        this.resetEmbedCode(); 
        this.advancedForm.getElements('p.label').set('text', '');            
    },
    
    resetSetting: function (setting) {
        if (setting.get('tag', 'select')) {
            setting.selectedIndex = 0;
            
            if (window.fdSliderController)
            {
                fdSliderController.updateSlider(setting.get('id'));
            }            
        }  
        
        if (
               setting.get('type') == 'radio'
            || setting.get('type') == 'checkbox'
        ) { 
            setting.set('checked', false);
        }
    },
    
    resetSize: function () {
        this.elm.getElement('input[value=full]').set('checked', 'checked');
    },
    
    settingsClickHandler: function (event) {
        
        var elm = $(event.target);
        var name = elm.get('name');
        var type = elm.get('type');
        var val = elm.get('value');

        switch (type) {
            case 'checkbox' :
                val = (elm.get('checked')) ? val : '';
            default :
                val = val;
        }

        this.options.settings[name] = val;
        
        this.updateEmbedCode();
    },
    
    sizeClickHandler: function (event) {
        var value = $(event.target).get('value');
        
        if (this.options.size[value]) {
            this.options.width = this.options.size[value].width;
            this.options.height = this.options.size[value].height;
        }
        
        this.updateEmbedCode();
    },
    
    getEmbedCode: function () {
        var template = '<iframe src="{url}/{embed}/{params}" frameborder="0" width="{width}" height="{height}" allowfullscreen></iframe>';
        var settings = this.options.settings;
        var params = {};
        var vars = {};
        
        if (settings.lighting) {
            params.l = settings.lighting;
        }
        if (settings.distance) {
            params.d = settings.distance;
        }
        if (settings.focallength) {
            params.f = settings.focallength;
        }
        if (settings.mode) {
            params.m = settings.mode;
        }
        if (settings.iso) {
            params.i = settings.iso;
        }
        if (settings.aperature) {
            params.a = settings.aperature;
        }
        if (settings.shutter) {
            params.s = settings.shutter;
        }        
        if (settings.tripod) {
            params.t = settings.tripod;
        }
        
        params = Object.toQueryString(params);
        
        params = (params) ? '?' + params : params;
        
        var vars = {
            width: this.options.width,
            height: this.options.height,
            url: this.options.url,
            embed: this.options.embed,
            params: params
        }
        
        var str = template.substitute(vars);
        
        return str;
    },
    
    updateEmbedCode: function () {
        var code = this.getEmbedCode();
        
        this.codeTextarea.set('value', code);
        try {
            this.codeTextarea.select();
        } catch (e) { }    
    },
    
    resetEmbedCode: function () {
        this.options.settings = {};
        this.options.width = this.options.size.full.width;
        this.options.height = this.options.size.full.height;
        this.updateEmbedCode();        
    }
});

com.camerasim.updateLabel = function (obj) {
    var select = $(obj.elem);
    
    select.fireEvent('click', {target: select});
    var label = select.getParent().getElement('.label');
    var value = select.getSelected().get('text');
    label.set('text', value);
};
