/*
 * jQuery history plugin
 * 
 * The MIT License
 * 
 * Copyright (c) 2006-2009 Taku Sano (Mikage Sawatari)
 * Copyright (c) 2010 Takayuki Miwa
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

(function($) {
    var locationWrapper = {
        put: function(hash, win) {
            (win || window).location.hash = this.encoder(hash);
        },
        get: function(win) {
            var hash = ((win || window).location.hash).replace(/^#/, '');
            try {
                return $.browser.mozilla ? hash : decodeURIComponent(hash);
            }
            catch (error) {
                return hash;
            }
        },
        encoder: encodeURIComponent
    };

    var iframeWrapper = {
        id: "__jQuery_history",
        init: function() {
            var html = '<iframe id="'+ this.id +'" style="display:none" src="javascript:false;" />';
            $("body").prepend(html);
            return this;
        },
        _document: function() {
            return $("#"+ this.id)[0].contentWindow.document;
        },
        put: function(hash) {
            var doc = this._document();
            doc.open();
            doc.close();
            locationWrapper.put(hash, doc);
        },
        get: function() {
            return locationWrapper.get(this._document());
        }
    };

    function initObjects(options) {
        options = $.extend({
                unescape: false
            }, options || {});

        locationWrapper.encoder = encoder(options.unescape);

        function encoder(unescape_) {
            if(unescape_ === true) {
                return function(hash){ return hash; };
            }
            if(typeof unescape_ == "string" &&
               (unescape_ = partialDecoder(unescape_.split("")))
               || typeof unescape_ == "function") {
                return function(hash) { return unescape_(encodeURIComponent(hash)); };
            }
            return encodeURIComponent;
        }

        function partialDecoder(chars) {
            var re = new RegExp($.map(chars, encodeURIComponent).join("|"), "ig");
            return function(enc) { return enc.replace(re, decodeURIComponent); };
        }
    }

    var implementations = {};

    implementations.base = {
        callback: undefined,
        type: undefined,

        check: function() {},
        load:  function(hash) {},
        init:  function(callback, options) {
            initObjects(options);
            self.callback = callback;
            self._options = options;
            self._init();
        },

        _init: function() {},
        _options: {}
    };

    implementations.timer = {
        _appState: undefined,
        _init: function() {
            var current_hash = locationWrapper.get();
            self._appState = current_hash;
            self.callback(current_hash);
            setInterval(self.check, 100);
        },
        check: function() {
            var current_hash = locationWrapper.get();
            if(current_hash != self._appState) {
                self._appState = current_hash;
                self.callback(current_hash);
            }
        },
        load: function(hash) {
            if(hash != self._appState) {
                locationWrapper.put(hash);
                self._appState = hash;
                self.callback(hash);
            }
        }
    };

    implementations.iframeTimer = {
        _appState: undefined,
        _init: function() {
            var current_hash = locationWrapper.get();
            self._appState = current_hash;
            iframeWrapper.init().put(current_hash);
            self.callback(current_hash);
            setInterval(self.check, 100);
        },
        check: function() {
            var iframe_hash = iframeWrapper.get(),
                location_hash = locationWrapper.get();

            if (location_hash != iframe_hash) {
                if (location_hash == self._appState) {    // user used Back or Forward button
                    self._appState = iframe_hash;
                    locationWrapper.put(iframe_hash);
                    self.callback(iframe_hash); 
                } else {                              // user loaded new bookmark
                    self._appState = location_hash;  
                    iframeWrapper.put(location_hash);
                    self.callback(location_hash);
                }
            }
        },
        load: function(hash) {
            if(hash != self._appState) {
                locationWrapper.put(hash);
                iframeWrapper.put(hash);
                self._appState = hash;
                self.callback(hash);
            }
        }
    };

    implementations.hashchangeEvent = {
        _init: function() {
            self.callback(locationWrapper.get());
            $(window).bind('hashchange', self.check);
        },
        check: function() {
            self.callback(locationWrapper.get());
        },
        load: function(hash) {
            locationWrapper.put(hash);
        }
    };

    var self = $.extend({}, implementations.base);

    if($.browser.msie && ($.browser.version < 8 || document.documentMode < 8)) {
        self.type = 'iframeTimer';
    } else if("onhashchange" in window) {
        self.type = 'hashchangeEvent';
    } else {
        self.type = 'timer';
    }

    $.extend(self, implementations[self.type]);
    $.history = self;
})(jQuery);

/**
 * mb_ajaxbox jQuery plugin
 * 
 */
(function($){
 	var	mboverlay = $('<div id="mb-overlay"></div>'),
		mbwrapper = $('<div id="mb-wrapper"></div>'),
		mbcontent = $('<div id="mb-content"></div>'),
		mbclose = $('<div id="mb-close"></div>'),
		mbclosebutton = $('<a id="closebutton" href="#">chiudi</a>'),
		isIE = $.browser.msie && $.browser.version < 10,
		IEfilter,
		selectedOptions = 
		{
			hideOnOverlayClick:true,
			closeButton:true,
			fnCallBack:null,
			contentSelector:"",
			backOnClose:false,
			fadeDuration:400
		} ;

	var _clear = function ()
	{
		if(mboverlay.hasClass('loading'))
		{
			mboverlay.removeClass('loading');
		}
		mboverlay.css('display', 'none');
		mbwrapper.css('display', 'none');
		mbclose.css('display', 'none');
		mbcontent.empty();
		if(isIE)
		{
			mboverlay.css('filter',IEfilter);	
		}
		mbcontent.css('display','block');
		$('body').css('overflow','auto');
	};
	
	_close = function () 
	{
		if (!selectedOptions.backOnClose)
		{
			var url = String(window.location.href);
			url = url.substring(0,url.indexOf('#'));
			window.location.href = url;
			
		}
		else
		{
			window.history.back();	
		}
	};
	
	_configure = function (options) {
		$.extend(selectedOptions, (typeof options == 'undefined')?{}:options);
		if (selectedOptions.hideOnOverlayClick)
		{
			mbwrapper.bind('click',_close);
			mbcontent.bind('click', 
				function (e)
				{
					e.stopPropagation();
				}
			)
		}
		else
		{
			mboverlay.unbind('click',_close);
		};
		mboverlay.css('background-color', selectedOptions.boxColor);
		mboverlay.css('opacity', String(selectedOptions.boxOpacity));
		mboverlay.css('-moz-opacity', String(selectedOptions.boxOpacity));
		mboverlay.css('filter', 'alpha(opacity=' + String(selectedOptions.boxOpacity * 100 + ')'));
		mboverlay.css('position','fixed');
		mboverlay.css('top', '0');
		mboverlay.css('left', '0');
		mboverlay.css('width', '100%');
		mboverlay.css('height', '100%');
	}
	
  	$.fn.mb_ajaxbox = function(options) {
		_configure(options);
		this.each(function()
		{
			var dc = $(this);
			if (String(dc.attr('href')) != 'undefined' || dc.attr('href') != '')
			{
				dc.click(function (e)
					{
						e.preventDefault();
						//$.mb_ajaxbox.carica(dc.attr('href'))
						var loc = window.location.href;
						var loc = loc.substring(0,loc.indexOf('#'));
						window.location.href = loc + '#' + dc.attr('href');
					});
			}
		})
 		return this;
  	};
	
	$.mb_ajaxbox = function (url)
	{
		$.mb_ajaxbox.carica(url);
	}
	
	$.mb_ajaxbox.init = function ()
	{
		if ($("#mb_overlay").length) {
			return;
		}
		$('body').append(mboverlay);
		$('body').append(mbwrapper);
		
		mbwrapper.append(mbcontent);
		mbwrapper.append(mbclose);
		mbclose.append(mbclosebutton);
		mbclosebutton.bind('click', function(e) {
			e.preventDefault();
			_close;
		} );
		mbclose.css('display', 'none');
		
		$(window).resize(
			function()
			{
				mbwrapper.css('top',$(document).scrollTop()+'px');
				mbwrapper.css('left','0');
				mbwrapper.css('width', String($(window).width()) + 'px');
				mbwrapper.css('height', String($(window).height()) + 'px');
			})
		
		mbwrapper.css('top',$(document).scrollTop);
		mbwrapper.css('left','0');
		mbwrapper.css('width', String($(window).width()) + 'px');
		mbwrapper.css('height', String($(window).height()) + 'px');
		
		IEfilter = mboverlay.css('filter');
		
		_configure({});
		var mb_clear = _clear;
		$.history.init(function(hash){
	        if(hash == "") {
	            mb_clear();
	        } else {
				$.mb_ajaxbox.carica(hash);
	        }
    	},
    	{ unescape: ",/?&" });
	};
	
	$.mb_ajaxbox.carica = function(url)
	{
		
		mbwrapper.css('top','0');
		mbwrapper.css('left','0');
		mbwrapper.css('width', String($(window).width()) + 'px');
		mbwrapper.css('height', String($(window).height() + $(document).scrollTop()) + 'px');
		
		mboverlay.addClass('loading');
		$('body').css('overflow','hidden');
		mbwrapper.css('overflow','auto');
		if (!selectedOptions.contentSelector)
		{
			url = url + ' ' + selectedOptions.contentSelector;
		}
		mboverlay.fadeIn(selectedOptions.fadeDuration, 
			function()
			{
				if (isIE)
				{
					mboverlay.css('filter', IEfilter);
				}
				mbcontent.load(url,
					function(responseText, textStatus, XNLHttpRequest)
						{
							mbcontent.html(responseText);
							mboverlay.removeClass('loading');
							mbwrapper.css('display', 'block')
							if (selectedOptions.closeButton)
							{
								mbclose.css('display', 'block');
							};
							$(window).trigger('resize');
							if(selectedOptions.fnCallBack)
							{
								selectedOptions.fnCallBack();
							}
							mboverlay.css('display', 'block');
						})			
			});
	}

	$(document).ready(function() {
		$.mb_ajaxbox.init();
	});
})( jQuery );

