
if (typeof API == 'undefined') 
    API = {};

API.toplayer = new function(){

    var stack = Array();
    this.add = function(params){
		var index = stack.push(new toplayer(params));
        return stack[index-1];
    }
    this.getStack = function(){
		return stack;		
    }
    
    this.closeAll = function(){
    	if(stack.length > 0){
    		$.each(stack,function(){
        		this.close();    		
        	});
        	stack = Array();
    	}    	
    }
    
    var toplayer = function(settings){
    
        var instance = this;
        var params = {
        	noCache: true,
            url: null,
            width: null,
            height: null,
            cssClass: null,
            buttons: null,
            onClose: null,
            showClose: true,
            closeLabel: 'Zamknij',
            closeOnMask: true,
            fadeInTime : 1000,
            fadeOutTime : 500,
            position: null,
            mask: {
        		container: 'body'
        	}, 
            layer: {
                label: 'No Label',
                content: '<p></p>',
                container: 'body',
                multiple: true,
                onBuild: null
            },
            onReady: null            
        };
        $.extend(true, params, settings);
        var mask, layer, layerCnt, h3;
        
        this.init = function(){
        	if(params.mask != null){
                mask = instance.buildMask();
                mask.show();
        	}
            if (params.url) {
                instance.getLayerFromUrl(params.url);
            }else{
                instance.createLayer(params.layer.label, params.layer.content);
            }
        }
        
        this.buildMask = function(){
        	
            var mask = $('.tl_mask');
            if (mask.size() == 0) {
                mask = $('<div class="tl_mask">');
                $(params.mask.container).append(mask);
            }

            var resize = function(){

            	var height = $(document).height();
                var width = $(document).width();
                mask.css({
                    height: height,
                    width: width
                });     
            }
            resize();
            $(window).resize(function(){            	
            	resize();            	
            });
            
            mask.hide();            
            
            if (params.closeOnMask) {
                mask.unbind('click');
                mask.click(function(){
                    instance.close();
                });
            }
            return mask;
        }
        this.buildLayer = function(title, html){
        
        	var layer = null;        	
            if (params.layer.multiple) {
            	layer = $('<div class="tl">');
            }else{
            	layer = $('.tl:last');
            	layer = (layer.size() == 0)?  $('<div class="tl">') : layer;
            	layer.html('');            	
            }
            if (params.cssClass) {
                layer.addClass(params.cssClass);
            }
            
            var head = $('<div class="tl_head">');
            h3 = $('<h3>');
            if (params.showClose) {
                var close = $('<a class="close" href="#close">' + params.closeLabel + '</a>');
                close.click(function(){
                    instance.close();
                });
                head.append(close);
            }
            h3.html(title);
            head.append(h3);
            
            var cnt = $('<div class="tl_cnt ajaxContent noresize">');
            cnt.html(html);
            layerCnt = cnt;
            var foot = $('<div class="tl_foot">');
            var buttons = null;
            if (params.buttons) {
                buttons = $('<ul>');
                $.each(params.buttons, function(key, value){
                    
                    buttons.append(instance.buildButton({
                        label: value.label,
                        href: value.href,
                        cssClass: value.cssClass,
                        action: value.action                        
                    }));
                });
                foot.html(buttons);
            }
            
            layer.append(head);
            layer.append(cnt);
            foot.css({
                width: params.width
            });
            layer.append(foot);
            
            layer.css({
                width: params.width,
                height: params.height                
            });
            layer.hide();
            $(params.layer.container).append(layer);
            if(params.position != null){
            	layer.css(params.position);            	
            }else{
                var top = ($(window).height() - layer.outerHeight()) / 2;
                var left = ($(window).width() - layer.outerWidth()) / 2;
                layer.css({
                    top: top,
                    left: left
                });
            }

            layer.fadeIn(params.fadeInTime);
            if(typeof params.layer.onBuild == 'function'){            	
            	params.layer.onBuild({
            		layer: layer,            		
            		head: head,
            		heading: h3,
            		content: cnt,
            		foot: foot,
            		buttons: buttons,
            		instance: instance
            	});
            }
            return layer;
        }
        this.setLayerCnt = function(cnt){
            layerCnt.html('');
            layerCnt.append(cnt);
            var close = layerCnt.find('.btn_close');
            close.unbind('click');
            close.click(function(){
                instance.close();
                return false;
            });
        }
        this.getLayerFromUrl = function(url){
        	version = '';
        	if(params.noCache){
        		time = new Date();
        		if(url.indexOf('?') != -1){
        			version = '&v='+time.getTime();
        		}else{
        			version = '?v='+time.getTime();
        		}
        	} 
            $.get(url+version, {}, function(data){
            	newData = $(data);
                params.layer.content = newData;
                instance.createLayer(params.layer.label, params.layer.content);
            }, 'html');
        }
        
        this.createLayer = function(label, content){
            layer = instance.buildLayer(label, content);
            if(params.position == null){

                var newPosition = function(elm,layer){
                    var top = ($(window).height() - layer.outerHeight()) / 2;
                    var left = ($(window).width() - layer.outerWidth()) / 2;
                    layer.stop(true,true);                    
                    layer.animate({
                        top: top + $(elm).scrollTop(),
                        left: left + $(elm).scrollLeft()
                    });                	
                }    
                newPosition(document,layer);
                
                $(window).resize(function(){
                	newPosition(this,layer);
                });
                $(document).scroll(function(e){
                	newPosition(this,layer);
                });
            } 
            if(typeof params.onReady == 'function'){ 
            	params.onReady(layer,content);            	
            }
            if(typeof Cufon != 'undefined') Cufon.refresh();
            return layer;
        }
        this.buildButton = function(params){
        
            label = params.label || 'TopLayer';
            href = params.href || '#';
            cssClass = params.cssClass || '';
            action = params.action || null;
            
            var button = $('<li>');
            if (cssClass) 
                button.addClass(cssClass);
            var label = (href) ? $('<a href="' + href + '"><span>' + label + '</span></a>') : $('<span>' + label + '</span>');
            button.append(label);
            if (typeof action == 'function') {
                button.click(function(event){
                    action(event, instance);
                    return false;
                });
            }
            return button;
            
        }
        this.close = function(){
        	if(layer)
            layer.fadeOut(params.fadeOutTime);
            if (mask && $('.tl').size() == 1) {
            	mask.fadeOut(params.fadeOutTime);
            }
            setTimeout(function(){
            	layer.remove();
            	if (mask && $('.tl').size() == 0) {                	 	                
    	            mask.remove();                	
                }
            },params.fadeOutTime);
            
            if (typeof params.onClose == 'function') {
                params.onClose();
            }
        }
        $(document).ready(function(){
            instance.init();
        });
    }
    
}

