﻿if (typeof jQuery == 'undefined') {  
   alert('Error: jQuery v1.4.2 has not been loaded!');  
} else {
    RoundBoxSettingsCounter = 0;
    _roundBoxRegistered = new Array();
    
    RoundBoxSettings = {
        top: null,
        _loading_image : '/img/loading.gif',
        close_image   : '/img/closelabel.gif',
        image_types   : [ 'png', 'jpg', 'jpeg', 'gif' ],
        html : '\
  <div class="roundbox" style="display:none;"> \
    <div class="popup"> \
      <table> \
        <tbody> \
          <tr> \
            <td class="tl"/><td class="b"/><td class="tr"/> \
          </tr> \
          <tr> \
            <td class="b"/> \
            <td class="body"> \
              <div class="content"> \
              </div> \
              <div class="footer"> \
                <a href="#" class="close" onclick="return false"> \
                  <img title="close" class="close_image" /> \
                </a> \
              </div> \
            </td> \
            <td class="b"/> \
          </tr> \
          <tr> \
            <td class="bl"/><td class="b"/><td class="br"/> \
          </tr> \
        </tbody> \
      </table> \
    </div> \
  </div>'
    }

    RoundBox = function(targetCtr, panelId, settings) {
        // check if in the previous request the same rounbox was created, and if so - remove it
        var regBox = null;
        for (var i = 0; i < _roundBoxRegistered.length; i++) {
            regBox = _roundBoxRegistered[i];
            if (regBox.targetCtr.id == targetCtr.id && regBox.panelId == panelId) {
                jQuery(regBox.targetCtr).remove();
                regBox.instance.get_panel().remove();
                Array.removeAt(_roundBoxRegistered, i);
                break;
            }
        }

        Array.add(_roundBoxRegistered, {
            targetCtr: targetCtr,
            panelId: panelId,
            settings: settings,
            instance: this
        });

        this._id = panelId;
        this._settings = settings;
        this._targerCtr = jQuery(targetCtr);
        this._init();
    }
    RoundBox.prototype = {
        _panel: null,
        _settings: null,

        _init: function() {
            if (this._isInited) return;
            var self = this;

            var settings = {};
            jQuery.extend(settings, RoundBoxSettings, this._settings);
            this._settings = settings;
            var pnlId = this._id + "RoundBox";
            var pnl = jQuery(RoundBoxSettings.html);
            pnl[0].id = pnlId.substr(1, pnlId.length - 1);
            jQuery('img[class^=close_image]', pnl).attr('src', this._settings.close_image);
            pnl.insertBefore(this._id);
            //jQuery('form').append(pnl);
            jQuery(this._id).appendTo(jQuery('.content', pnl));
            jQuery('.buttons', pnl)
                .appendTo(jQuery('.footer', pnl));

            var preload = [new Image(), new Image()];
            preload[0].src = this._settings.close_image;
            preload[1].src = this._settings._loading_image;

            pnl.find('.b:first, .bl, .br, .tl, .tr').each(function() {
                preload.push(new Image());
                preload.slice(-1).src = jQuery(this).css('background-image').replace(/url\((.+)\)/, 'jQuery1');
            });
            this._panel = pnl;

            jQuery('.close', pnl).click(function() { self.close() });
            jQuery('.close_image', pnl).attr('src', this._settings.close_image);


            var image_types = this._settings.image_types.join('|')
            image_types = new RegExp('\.' + image_types + 'jQuery', 'i')

            this._targerCtr.click(function() { self._click_handler() })
            if (jQuery(this._targerCtr).is() == 'a') {
                alert('a');
                jQuery(this._targerCtr).attr('onclick', 'return false');
            }
            this._isInited = true;
        },

        _click_handler: function() {
            if (this.onShow != null)
                this.onShow(this)
            if (this.cancelRoundBox) return;
            this._loading()
            var pnl = this._panel;
            if (this._settings.body_style)
                jQuery('.body', pnl).css(this._settings.body_style);
            if (this._settings.close_button_style)
                jQuery('.close', pnl).css(this._settings.close_button_style);
            if (this._settings.footer_style)
                jQuery('.footer', pnl).css(this._settings.footer_style);
            if (this._settings.content_style)
                jQuery('.content', pnl).css(this._settings.content_style);

            // support for rel="facebox[.inline_popup]" syntax, to add a class
            var klass;
            if (this._targerCtr.attr('rel')) {
                klass = this._targerCtr.attr('rel').match(/roundbox\[\.(\w+)\]/)
                if (klass) klass = klass[1]
            }

            // div
            if (this._targerCtr.attr('href').match(/#/)) {
                var url = window.location.href.split('#')[0]
                var target = this._targerCtr.attr('href').replace(url, '')
                RoundBox.reveal(jQuery(target).show(), klass, this._panel)

                // image
            } else if (this._targerCtr.attr('href').match(image_types)) {
                var image = new Image()
                image.onload = function() {
                    RoundBox.reveal('<div class="image"><img src="' + image.src + '" /></div>', klass, pnl)
                }
                image.src = this.href

                // ajax
            } else {
                jQuery.get(this._targerCtr.attr('href'), function(data) { RoundBox.reveal(data, klass, pnl) })
            }

            return false
        },

        _loading: function() {
            if (jQuery('._loading', this._panel).length == 1) return true

            jQuery('.body', this._panel).children().hide().end().
              append('<div class="_loading"><img src="' + this._settings._loading_image + '"/></div>')

            var pageScroll = RoundBox.getPageScroll()
            gTop = (this._settings.top ? this._settings.top : (RoundBox.getPageHeight() / 10));
            this._panel.css({
                top: gTop,
                left: pageScroll[0]
            }).show()

            var self = this;
            jQuery(document).bind('keydown', function(e) {
                if (e.keyCode == 27) self.close()
            })
        },

        get_panel: function() {
            return this._panel;
        },

        open: function(){
            this._click_handler();
        },
        
        close: function() {
            if (this.onHide != null)
                this.onHide(this);
            var self = this;
            this._panel.fadeOut(function() {
                jQuery('.content', self._panel).removeClass().addClass('content')
            })
            return false
        }
    }
    
    RoundBox.reveal = function(data, klass, pnl) {
        if (klass) jQuery('.content', pnl).addClass(klass)
        jQuery('.content', pnl).append(data)
        jQuery('._loading', pnl).remove()
        jQuery('.body', pnl).children().fadeIn('normal')
    }
    
    RoundBox.getPageScroll = function() {
        var xScroll, yScroll;
        if (self.pageYOffset) {
          yScroll = self.pageYOffset;
          xScroll = self.pageXOffset;
        } else if (document.documentElement && document.documentElement.scrollTop) {	 // Explorer 6 Strict
          yScroll = document.documentElement.scrollTop;
          xScroll = document.documentElement.scrollLeft;
        } else if (document.body) {// all other Explorers
          yScroll = document.body.scrollTop;
          xScroll = document.body.scrollLeft;	
        }
        return new Array(xScroll,yScroll) 
    }

    // adapter from getPageSize() by quirksmode.com
    RoundBox.getPageHeight = function() {
        var windowHeight
        if (self.innerHeight) {	// all except Explorer
          windowHeight = self.innerHeight;
        } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
          windowHeight = document.documentElement.clientHeight;
        } else if (document.body) { // other Explorers
          windowHeight = document.body.clientHeight;
        }	
        return windowHeight
    }    
    
}
