/*
2DO:

1) Beauty image change: fader + smooth resize + preloader
2) Preload images into #images_preload (?)
3) Stretch fader on to whole site
4) Disable scroll
5) Fading on gal show/hide

*/


$(document).ready(function() {
    dGallery.createDOMElements();
    dGallery.attachOpener();
});

function dGalleryClass() {
    this.gals = {};

    this.cfg = {
        "maxWidth": 500,
        "maxHeight": 500,
        "cycled": true,
        "fadeInTime": 200,
        "fadeOutTime": 100
    };

    this.fader;

    this.regExGalOpenerId = /(^|\s)gal_id_([a-z0-9_]+)($|\s)/i;
}

dGalleryClass.prototype.createGallery = function(galId) {
    this.gals[galId] = {
        "id": galId,
        "images": [],
        "lastImgIndex": 0,
        "galHolder": null
    };

    return this.gals[galId];
}

dGalleryClass.prototype.isValidGal = function(gal) {
    return (gal && (typeof(gal) != 'undefined') && gal.images && (typeof(gal.images) != 'undefined') && (gal.images.length > 0));
}

dGalleryClass.prototype.addImg = function(gal, prevUrl, fullUrl, title) {
    if (gal && (typeof(gal) != 'undefined')) {
        gal.images.push({
            "title": title,
            "prevUrl": prevUrl,
            "fullUrl": fullUrl
        });
    }
}

/* ========================================================================== */

dGalleryClass.prototype.showCurImg = function(gal) {
    if (this.isValidGal(gal)) {
        if ((gal.lastImgIndex >= gal.images.length) || (gal.lastImgIndex < 0)) {
            gal.lastImgIndex = 0;
        }

        /* Renew image */
        var imgHolder = gal.galHolder.find('.dGallery_img_holder');
        imgHolder.html('<img src="' + gal.images[gal.lastImgIndex].fullUrl + '" alt="" />');

        /* Label */
        gal.galHolder.find('.dGallery_label').html(gal.images[gal.lastImgIndex].title);

        /* Arows */
        this.showHideArrows(gal);
    }
}

dGalleryClass.prototype.showNextImg = function(gal) {
    if (this.isValidGal(gal)) {
        gal.lastImgIndex++;
        this.showCurImg(gal);
    }
}

dGalleryClass.prototype.showPrevImg = function(gal) {
    if (this.isValidGal(gal)) {
        gal.lastImgIndex--;
        if (gal.lastImgIndex < 0) {
            gal.lastImgIndex = gal.images.length - 1;
        }

        this.showCurImg(gal);
    }
}

/* ========================================================================== */

dGalleryClass.prototype.openGal = function(gal, index) {
    if (this.isValidGal(gal)) {
        this.createGalHolder(gal);

        this.showFader();
        gal.galHolder.addClass('opened');
        gal.galHolder.css('z-index', this.fader.css('z-index') - 0 + 1);

        this.showCurImg(gal);
    }
}

dGalleryClass.prototype.closeGal = function(gal, withoutFader) {
    if (typeof(withoutFader) == 'undefined') {
        withoutFader = false;
    }

    if (this.isValidGal(gal) && gal.galHolder && (typeof(gal.galHolder) != 'undefined')) {
        gal.galHolder.removeClass('opened');

        if (!withoutFader) {
            this.hideFader();
        }
    }
}

dGalleryClass.prototype.closeAllGals = function() {
    for (var i in this.gals) {
        this.closeGal(this.gals[i], true);
    }

    this.hideFader();
}

dGalleryClass.prototype.showHideArrows = function(gal) {
    if (!this.cfg.cycled && this.isValidGal(gal)) {
        if ((gal.lastImgIndex + 1) >= gal.images.length) {
            gal.galHolder.find('.dGallery_btn_next').hide();
        } else {
            gal.galHolder.find('.dGallery_btn_next').show();
        }

        if (gal.lastImgIndex > 0) {
            gal.galHolder.find('.dGallery_btn_prev').show();
        } else {
            gal.galHolder.find('.dGallery_btn_prev').hide();
        }
    }
}

dGalleryClass.prototype.hideFader = function() {
    //this.fader.fadeOut(this.cfg.fadeOutTime);
    this.fader.hide();
}

dGalleryClass.prototype.showFader = function() {
    //this.fader.fadeIn(this.cfg.fadeInTime);
    this.fader.show();
    if (typeof(resizeFaderDiv) == 'function') {
        resizeFaderDiv();
    }
}

/* ========================================================================== */

dGalleryClass.prototype.createGalHolder = function(gal) {
    if (gal && (typeof(gal) != 'undefined') && ((typeof(gal.galHolder) == 'undefined') || !gal.galHolder)) {
        var _this = this;
        var tmp;

        //Remove if exists
        $('#dGalleryGalHolder_' + gal.id).remove();

        /* Create holder */
        gal.galHolder = document.createElement('div');
        gal.galHolder.className = 'dGalleryGalHolder';
        gal.galHolder.id = 'dGalleryGalHolder_' + gal.id;

        $('body').append(gal.galHolder);

        gal.galHolder = $(gal.galHolder);

        /* Create border */
        tmp = document.createElement('div');
        tmp.className = 'bord_n';
        gal.galHolder.append(tmp);

        tmp = document.createElement('div');
        tmp.className = 'bord_e';
        gal.galHolder.append(tmp);

        tmp = document.createElement('div');
        tmp.className = 'bord_s';
        gal.galHolder.append(tmp);

        tmp = document.createElement('div');
        tmp.className = 'bord_w';
        gal.galHolder.append(tmp);

        tmp = document.createElement('div');
        tmp.className = 'corn_nw';
        gal.galHolder.append(tmp);

        tmp = document.createElement('div');
        tmp.className = 'corn_ne';
        gal.galHolder.append(tmp);

        tmp = document.createElement('div');
        tmp.className = 'corn_se';
        gal.galHolder.append(tmp);

        tmp = document.createElement('div');
        tmp.className = 'corn_sw';
        gal.galHolder.append(tmp);

        /* ====================================================== */

        /* Create label */
        tmp = document.createElement('div');
        tmp.className = 'dGallery_label';
        gal.galHolder.append(tmp);

        /* Create img holder */
        tmp = document.createElement('div');
        tmp.className = 'dGallery_img_holder';
        gal.galHolder.append(tmp);

        /* Create close btn */
        tmp = document.createElement('a');
        tmp.className = 'dGallery_btn_close';
        tmp.innerHTML = 'x';
        tmp.href = '#';
        tmp.onclick = function() {
            _this.closeGal(gal);
            return false;
        }
        gal.galHolder.append(tmp);

        /* Create prev btn */
        tmp = document.createElement('a');
        tmp.className = 'dGallery_btn_prev';
        tmp.innerHTML = '&lt;';
        tmp.href = '#';
        tmp.onclick = function() {
            _this.showPrevImg(gal);
            return false;
        }
        gal.galHolder.append(tmp);

        /* Create next btn */
        tmp = document.createElement('a');
        tmp.className = 'dGallery_btn_next';
        tmp.innerHTML = '&gt;';
        tmp.href = '#';
        tmp.onclick = function() {
            _this.showNextImg(gal);
            return false;
        }
        gal.galHolder.append(tmp);
    }
}

dGalleryClass.prototype.createDOMElements = function() {
    this.fader = $('#fader');

    if (this.fader.length == 0) {
        this.fader = document.createElement('div');
        this.fader.id = 'dGalleryFader';

        $('body').append(this.fader);
        this.fader = $(this.fader);
    }

    var _this = this;
    this.fader.click(function() {
        _this.closeAllGals();
    });
}

dGalleryClass.prototype.attachOpener = function() {
    var _this = this;

    $('.dGalleryOpener').each(function() {
        if (_this.regExGalOpenerId.test(this.className)) {
            var galId = RegExp.$2;
            if (_this.gals[galId] && (typeof(_this.gals[galId]) != 'undefined') && _this.gals[galId].images && (typeof(_this.gals[galId].images) != 'undefined') && (_this.gals[galId].images.length > 0)) {
                $(this).css('cursor', 'pointer');
                $(this).click(function() {
                    _this.openGal(_this.gals[galId]);
                });
            }
        }
    });
}

dGalleryClass.prototype.proto = function() {
}

/* ========================================================================== */

var dGallery = new dGalleryClass();
