var OwUtils = function(){
    var langs = {};
    var messageTime = 10000;
    var $messageCont = $('<div class="ow_message_cont"></div>');
    var events = {};
    
    $(function(){
    	$messageCont.appendTo(document.body);
    });
    
    this.message = function( message, type, paramTime ){
        var $messageNode = $('<div class="ow_message_node '+type+'" style="display:none;"><a class="close_button" href="javascript://" onclick="$(this).parent().slideUp(200, function(){$(this).remove();})"></a>'+message+'</div>').appendTo($messageCont);
        if( paramTime == undefined ){
            paramTime = messageTime;
        }

        $messageNode.fadeIn(1000,
            function(){
                window.setTimeout(
                    function(){
                        $messageNode.fadeOut(1000,
                            function(){
                                $messageNode.remove();
                            }
                    );
                    }, paramTime
                );
            }
        );
    }

    this.error = function( message ){
    	this.message(message, 'error');
    };

    this.warning = function( message ){
    	this.message(message, 'warning');
    };

    this.info = function( message ){
    	this.message(message, 'info');
    };

    

   this.addScriptFiles = function( urlList, callback ){
        var scripts = $('script');

        //TODO: Sardar require once check
        
/*        var docScripts = [];
        
        for( var i = 0; i < scripts.length; i++  ){
            docScripts[i] = $(scripts[i]).attr('src');
        }*/

        var recursiveInclude = function(urlList, i){
        	
        	if( (i+1) == urlList.length )
        	{
        		$.getScript(urlList[i], callback);
        		return;
        	}

        	$.getScript(urlList[i], function(){recursiveInclude(urlList, ++i);});
        }
        
        recursiveInclude(urlList, 0);
    };

    /*this.addScriptFile = function( url, callback ){
        var scripts = $('script');

        for( var i = 0; i < scripts.length; i++  ){
            if( $(scripts[i]).attr('src') == $.trim(url) ){
                return;
            }
        }

        $.getScript(url, callback);

        //$('head').append( $('<script type="text/javascript" src="'+url.trim()+'"></script>') );
    };*/

    
    this.addScript = function( script ){
        eval(script);
    },

    this.addCssFile = function( url ){
       $('head').append($('<link type="text/css" rel="stylesheet" href="'+$.trim(url)+'" />'));
    },

    this.addCss = function( css ){
        $('head').append($('<style type="text/css">'+css+'</style>'));
    }

    this.getLanguageText = function(prefix, key, assignedVars)
    {
        if ( langs[prefix] === undefined ) {
                return prefix + '+' + key;
        }

        if ( langs[prefix][key] === undefined ) {
                return prefix + '+' + key;
        }

        var langValue = langs[prefix][key];

        if ( assignedVars ) {
                for( varName in assignedVars ) {
                        langValue = langValue.replace('{$'+varName+'}', assignedVars[varName]);
                }
        }

        return langValue;
    };

    this.registerLanguageKey = function(prefix, key, value)
    {
            if ( langs[prefix] === undefined ) {
                    langs[prefix] = {};
            }

            langs[prefix][key] = value;
    };
    
    this.inProgressNode = function(node)
    {
    	$(node).inprogress();
    }
    
    this.activateNode = function(node)
    {
    	$(node).activate();
    };
    
    this.showUsers = function(userIds, title)
    {
    	title = title || OW.getLanguageText('base', 'ajax_floatbox_users_title');
    	
    	this.ajaxFloatBox('BASE_CMP_FloatboxUserList', [userIds], {iconClass: "ow_ic_user", title: title});
    },
    
    this.getActiveFloatBox = function getFloatBox()
    {
    	if ( typeof window.OWActiveFloatBox == 'undefined' )
    	{
    		return false;
    	}
    	
    	return window.OWActiveFloatBox;
    },

    this.ajaxFloatBox = function(cmpClass, params, options)
    {
    	params = params || [];
    	
    	options = options || {};
    	options = $.extend({}, {
    		title: '',
    		width: false,
    		height: false,
    		iconClass: false
    	}, options);
    	
    	var preparePosition = function(box) {
    		
    		var position = {
    			top:(($(window).height()/2) - (box.$container.height()/2)),
    			left:(($(window).width()/2) - (box.$container.width()/2))
    		};
    		box.$container.css(position);
    	};
    	
    	var self = this,
    		rsp = this.ajaxFloatboxRsp,
    		jsonParams = JSON.stringify(params);
    		$preloader = $('<div class="ow_ajax_floatbox_preloader ow_preloader_content"></div>');
		
    	var floatBox = new OW_FloatBox({
            $title: options.title,
            $contents: $preloader,
            width: options.width,
            height: options.height,
            icon_class: options.iconClass
        });
    	
        var ajaxOptions = {
			url: this.ajaxFloatboxRsp + '?cmpClass=' + cmpClass + '&r=' + Math.random(),
			dataType: 'json',
			type: 'POST',
			data: {params: jsonParams},
			success: function(markup) {
				
				var contentHtml = markup.content;
				if ( !$(contentHtml).length )
				{
					contentHtml = '<span>' + contentHtml + '</span>';
				}
				
				floatBox.$body.html(contentHtml);

		        if (markup.styleSheets) {
		           	$.each(markup.styleSheets, function(i, o){
		           		OW.addCssFile(o);
		        	});
		        }
		        
		        if (markup.styleDeclarations) {
		        	OW.addCss(markup.styleDeclarations)
		        }
		        
		        if (markup.scriptFiles) {
		        	OW.addScriptFiles(markup.scriptFiles, function(){
		        		if (markup.onloadScript) {
		        			OW.addScript(markup.onloadScript);
		        		}
		        	});
		        }
		        
		        preparePosition(floatBox);
			}
		};
         
    	$.ajax(ajaxOptions);
    	
    	return floatBox;
    };
    
    this.bind = function(type, func)
	{
		if (events[type] == undefined) 
		{
			events[type] = [];
		}
						
		events[type].push(func);
				
	};
	
	this.trigger = function(type, params, applyObject)
	{
		if (events[type] == undefined) {
			return false;
		}
		
		applyObject = applyObject || this;
		params = params || [];
		
		for (var i = 0, func; func = events[type][i]; i++) 
		{
			if (func.apply(applyObject, params) === false) 
			{
				return false;
			}
		}
		
		return true;
	};
	
	this.unbind = function( type ) 
	{
		if (events[type] == undefined) {
			return false;
		}
		
		events[type] = [];
	};
	
	this.editLanguageKey = function( prefix, key, success )
	{
        var fb = OW.ajaxFloatBox("BASE_CMP_LanguageValueEdit", [prefix, key, true], {width: 520, title: this.getLanguageText('admin', 'edit_language')});
    
        OW.bind("admin.language_key_edit_success", function( e ) {
            fb.close();
            OW.unbind("admin.language_key_edit_success");
            success(e);
        });
	};
}



//Enable / Disable node
jQuery.fn.extend({
	inprogress: function() {
		this.each(function()
		{
			var $this = jQuery(this).addClass('ow_inprogress');
			this.disabled = true;
			
			if ( this.tagName != 'INPUT' && this.tagName != 'TEXTAREA' && this.tagName != 'SELECT' ) 
			{
				this.jQuery_disabled_clone = $this.clone().removeAttr('id').removeAttr('onclick').get(0);
				
				$this.hide()
					.bind('unload', function(){
						$this.activate();
					})
					.after(this.jQuery_disabled_clone);
			}
		});
		
		return this;
	},
	
	activate: function() {
		this.each(function()
		{
			var $this = jQuery(this).removeClass('ow_inprogress');
			this.disabled = false;
			
			if ( this.jQuery_disabled_clone )
			{
				jQuery(this.jQuery_disabled_clone).remove();
				this.jQuery_disabled_clone = null;
				
				jQuery(this)
					.unbind('unload', function(){
						$this.activate();
					})
					.show();
			}
		});
		
		return this;
	}
});

window.OW = new OwUtils();

function lg(o){
	console.log(o);
}

$( //8aa: resize fullsize images to fit to it's parendt width
	function (){
		if(typeof($) == 'undefined') return;
		
		$('.fullsize-image').hide();
		var node = $('.fullsize-image')[0];

		while( node = $(node).parent()[0]){
			
			if( node.tagName != 'DIV'){
				continue;
			}

			if($('.fullsize-image').width() > parseInt($(node).innerWidth()))
				$('.fullsize-image').width( (parseInt($(node).innerWidth()) - 10) + 'px' );

			$('.fullsize-image').show();
			break;
		}
		
	}
);
