var ODINSHAG;
if (!ODINSHAG) ODINSHAG = {};

ODINSHAG.Sbox = function(settings) {
    if (settings) {
        this.imgLinks = 'a.sbox-img';
        //this.formLinks = 'a.sbox-form';
        this.formLinks = (settings.lnkId.indexOf('#') == -1 ? '#' + settings.lnkId : settings.lnkId);
        this.formBlockId = (settings.formBlockId.indexOf('#') == -1 ? '#' + settings.formBlockId : settings.formBlockId);
        this.formId = (settings.formId.indexOf('#') == -1 ? '#' + settings.formId : settings.formId);
        this.actionUrl = settings.ajax.actionUrl;
        this.faderOpacity = settings.faderOpacity;
        this.attachEvents();
        this.loaderSmallPath = 'images/loader-small.gif';
        this.formAjaxFields = settings.ajax.fields;
        this.errorText = 'пустое поле';
        this.iTimeoutId = null;
        
        this.captchaVarName = (settings.captcha.varName.length > 0 ? settings.captcha.varName : null);
        this.captchaContainerId = (settings.captcha.containerId.indexOf('#') == -1 ? '#' + settings.captcha.containerId : settings.captcha.containerId);
        
    } else {
        alert('Error! Empty settings.');
    } 
};

ODINSHAG.Sbox.prototype = {
    attachEvents: function() {
        var t = this;
        
        $(this.imgLinks).click(function(e) {
            e.stopPropagation();
            e.preventDefault();
            t.imgInit(this);
        });
        
        $(this.formLinks).click(function(e) {
            e.stopPropagation();
            e.preventDefault();
            t.formInit();
        });
    },
    
    imgInit: function(link) {
        var t = this;
        var title   = link.title || link.name || null;
        var baseURL = link.href || null;
        
        this.setCssStyles();
        this.setFader();
        
        // Orginal code by Cody Lindley edited by "Delo v saite".
        var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;
        var urlType = baseURL.toLowerCase().match(urlString);
        
        if (urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif' || urlType == '.bmp') {
            imgPreloader = new Image();
            imgPreloader.onload = function() {
                imgPreloader.onload = null;
                
                // Resizing large images - orginal by Christian Montoya edited by me.
                var pagesize = t.getPageSize();
                var x = pagesize[0] - 160;
                var y = pagesize[1] - 160;
                var imageWidth = imgPreloader.width;
                var imageHeight = imgPreloader.height;
                if (imageWidth > x) {
                    imageHeight = imageHeight * (x / imageWidth); 
                    imageWidth = x; 
                    if (imageHeight > y) { 
                        imageWidth = imageWidth * (y / imageHeight); 
                        imageHeight = y; 
                    }
                } else if (imageHeight > y) { 
                    imageWidth = imageWidth * (y / imageHeight); 
                    imageHeight = y; 
                    if (imageWidth > x) { 
                        imageHeight = imageHeight * (x / imageWidth); 
                        imageWidth = x;
                    }
                }// End Resizing
                
                var width = imageWidth;
                var height = imageHeight;
                
                var w = $('#sbox-window');
                w.html('<div id="sbox-close"><span>Закрыть</span></div> <div class="title">' + title + '</div> <img id="sbox-image" src="' + baseURL + '" width="' + imageWidth + '" height="' + imageHeight + '" alt="' + title + '" />');
                $('#sbox-close').click(t.deleteFader);
                t.sboxPosition(width + 60, height);
                $('#sbox-loader').remove();
                w.css('display', 'block');
            }
            
            imgPreloader.src = baseURL;
        }
    },
    
    formInit: function() {
        var t = this;
        
        if (this.formBlockId.length > 0) {
            this.setCssStyles();
            this.setFader();
            
            var w = $('#sbox-window'),
                f = $(this.formBlockId);
            
            w.css({'background-color': 'transparent', 'padding': '0', 'border': 'none'});
            w.html('<div id="sbox-close" style="top:15px; right:20px;"><span>Закрыть</span></div>');
            w.append(f.children());
            
            var closeLink = $('#sbox-close');
            
            w.unload(function() {
                closeLink.remove();
                f.append(w.children());
            });
            if (document.getElementById('cancel')){$('#cancel').click(t.deleteFader);}
            closeLink.click(t.deleteFader);
            t.sboxPosition(520, w.height() + 30);
            t.toglleFormButton($('#add-comm'), 0);
            
            $('#sbox-loader').remove();
            w.css('display', 'block');
            //$('#com-name').focus();
            
            this.validateForm();
            this.reloadCaptcha();
        }
    },
    
    validateForm: function() {
        var t = this;
        var fields = $(this.formId).find('[id^=com-]');
        var button = $('#add-comm');
        
        fields.each(function() {this.error = 1;});
        
        fields.keyup(function() {
            var flag = 1;
            var count = 0;
            
            if ($.trim(this.value).length > 0) {
                for (var i = 0; i < t.formAjaxFields.length; i++) {
                    if (t.formAjaxFields[i] == this.id) {
                        t.validateAjax(this, fields, button);
                        flag = 0;
                        break;
                    }
                }
                
                if (flag) {
                    $(this).css('border-color', '#4DBB44');
                    this.error = 0;
                }
            } else {
                $(this).css('border-color', '#F3130B');
                this.error = 1;
            }
            
            t.toglleFormButton(fields, button);
        });
        
        fields.focus(function() {
            $(this).next().html('');
        });
        
        fields.blur(function() {
            $(this).css('border-color', '#7F9DB9');
            var field = $(this);
            var flag  = 0;
            
            if ($.trim(this.value).length <= 0) {
                $(this).next().html(t.errorText);
                this.error = 1;
            } else {
                for (var i = 0; i < t.formAjaxFields.length; i++) {
                    if (t.formAjaxFields[i] == this.id) {
                        flag = 1;
                        break;
                    }
                }
                
                if (flag == 0) {
                    this.error = 0;
                    $(this).next().html('');
                }
            }
        });
    },
    
    validateAjax: function(field, fields, button) {
        var t = this;
        
        if (this.iTimeoutId != null) {
            clearTimeout(this.iTimeoutId);
            this.iTimeoutId = null;
        }
        
        this.iTimeoutId = setTimeout(function() {
            $.get(t.actionUrl, 
                {name: field.name, value: encodeURIComponent(field.value)},
                function(obj){
                    var arr = obj.split('|');
                    if (arr[0] == 0) {
                        field.error = 0;
                        $(field).css('border-color', '#4DBB44').next().html('');
                    } else {
                        field.error = 1;
                        $(field).css('border-color', '#F3130B').next().html(arr[1]);
                    }
                    
                    t.toglleFormButton(fields, button);
                }
            )}, 300
        );
    },
    
    reloadCaptcha: function() {
        var t = this;
        
        $('#reload-captcha').click(function() {
            $.get(t.actionUrl, 
                {name: t.captchaVarName},
                function(val){
                    $(t.captchaContainerId).html(val);
                }
            );
        });
    },
    
    toglleFormButton: function(fields, button) {
        var count = 0;
        
        for (var i = 0; i < fields.length; i++) {
            if (fields[i].error == 0) {
                count++;
            }
        }
        
        if (count == fields.length) {
            $(button).attr('disabled', false).css('cursor', 'default').removeClass('disabled');
        } else {
            $(button).attr('disabled', true).css('cursor', 'auto').addClass('disabled');
        }
    },
    
    setCssStyles: function() {
        var style = '<style type="text/css" sbox="true">';
        style += '.overlay{background-color:#373737;filter:alpha(opacity=' + this.faderOpacity * 100 + ');-moz-opacity:' + this.faderOpacity + ';opacity:' + this.faderOpacity + ';}';
        style += '.overlayMacFFBGHack{background:url(/images/macFFBgHack.png) repeat;}';
        if ($.browser.msie && $.browser.version == 6) {
            style += 'body{height:100%;} * html #fader{position:absolute;}';
            style += '#ie6-hideselect{width:100%;height:100%;position:absolute;top:0;left:0;background-color:#fff;border:none;z-index:1000;filter:alpha(opacity=0);}';
            //style += '* html #sbox-window{position:absolute;margin-top:expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + "px");}';
            style += '* html #sbox-loader{position:absolute;margin-top:expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + "px");}';
        }
        style += '</style>';
        $('head').append(style);
    },
    
    setFader: function() {
        var html = null, t = this;
        
        if ($.browser.msie && $.browser.version == 6) {
            var ie6H = $(document).height();
            if (document.getElementById('ie6-hideselect') === null) {
                html = '<iframe id="ie6-hideselect" style="height:' + ie6H + '"></iframe><div id="fader" style="height:' + ie6H + '"></div>';
            }
        } else {
            if(document.getElementById("fader") === null){
                html = '<div id="fader"></div>';
            }
        }
        
        var w = '<div id="sbox-window"></div>';
        var loader = '<div id="sbox-loader"><img src="images/sbox-loader.gif" alt="" width"208" height="13" /></div>';
        
        $('body').append(html).append(w).append(loader); //
        $('#fader').click(t.deleteFader);
        $('#sbox-loader').show();
        
        var userAgent = navigator.userAgent.toLowerCase();
        if (userAgent.indexOf('mac') != -1 && userAgent.indexOf('firefox') != -1) {
            $('#fader').addClass('overlayMacFFBGHack');
        } else {
            $('#fader').addClass('overlay');
        }
        
        document.onkeydown = function(e) {
            if (e == null) { // ie
                keycode = event.keyCode;
            } else { // mozilla
                keycode = e.which;
            }
            if (keycode == 27){ // close
                t.deleteFader();
            }
        }
    },
    
    deleteFader: function() {
        $('#sbox-close').unbind('click');
        $('head style[sbox=true]').remove();
        
        if ($.browser.msie && $.browser.version == 6) {
            $('#ie6-hideselect').trigger('unload').unbind().remove();
        }
        
        $(this.formId).find('[id^=com-]').unbind();
        $('#sbox-window, #fader').trigger('unload').unbind().remove();
        
        document.onkeydown = '';
        return false;
    },
    
    getPageSize: function() {
        var w = $(window).width();
        var h = $(window).height();
        arrayPageSize = [w,h];
        return arrayPageSize;
    },
    
    sboxPosition: function(w, h) {
        $('#sbox-window').css({'margin-top': $(window).scrollTop() - parseInt((h / 2), 10) + 'px', 'margin-left': '-' + parseInt(w / 2, 10) + 'px', 'width': parseInt(w, 10) + 'px'});
    }
};
