
var yantarDefault = {
    STATUS_OK     : 0,
    STATUS_FAILED : 1
};

var core = yantarDefault.core = function() {
	
    var ajaxLoaderEnabled = true;
    var ajaxLoaderCounter = 0;
	
    var handleAddMark = function(container, markAvg) {
        container.html('<ol class="markActions"><li><span class="rateStars" style="width:'  + markAvg*24 + 'px">'  + markAvg + '</span></li></ol>'); 
    };

    var addMark = function(obj) {
    	
        obj.stopImmediatePropagation();
        var clickedElement = $(obj.target);

        var markContainer = clickedElement.parents('.mark');
        var markActions = clickedElement.parents('.markActions').html();

        markContainer.html("Zapamiętywaniecore. oceny...");

        $.post(
            clickedElement.attr('mark_url'),
            {
                id : clickedElement.attr('object_id'),
                mark : clickedElement.attr('mark_value')
            },
            function(data) {
                if (data.status == yantarDefault.STATUS_OK && data != null) {
                    handleAddMark(markContainer, data.markAvg);
                } else {
                    markContainer.html('<ol class="markActions"><li><span class="rateStars">0</span></li></ol>');
                    $(pub.initialize);
                }
            }, 'json');
    };
    
    var loadAjaxContent = function() {
    	
        $('.asynchronous').each(function(index, container) {

            var container = $(container);
            var url = container.attr('source');

            $.getJSON(url, function(jsonData) {
                if(jsonData.status == yantarDefault.STATUS_OK){

                    var parentContainer = container.parent();
                    container.replaceWith(jsonData.html);
                    core.postAjaxContentHooks.each(function(index, item) {
                        if (typeof item == 'function')  item(parentContainer);
                    });
                }
            });

        });
    };
    
    var handleAjaxPaging = function (event) {
    	
        event.stopImmediatePropagation();

        var urlRequest = $(this).attr('href');
        var commentDiv = $(this).closest("div.paged").attr("id");
        
        $.ajax({
            url: urlRequest,
            dataType: 'json',
            success: function(data){

                if(data.status == yantarDefault.STATUS_OK){
                    $("#"+commentDiv+" ul").html(data.html);
                }
                core.bindAjaxPaging($("#"+commentDiv+" ul"));
            }
        });
        return false;
    };
    
    var pub = {

        isEnabledAjaxLoader : function() {
            return ajaxLoaderEnabled;
        },
        enableAjaxLoader : function() {
            ajaxLoaderEnabled = true;
        },
        disableAjaxLoader : function() {
            ajaxLoaderEnabled = false;
        },
        showAjaxLoader : function () {
    	
            if (ajaxLoaderEnabled) {
                ajaxLoaderCounter++;
                $("#ajaxLoaderIndicator").show();
            }
        },
    		
        hideAjaxLoader : function () {
    			
            if (ajaxLoaderCounter > 0 && (--ajaxLoaderCounter) == 0) $("#ajaxLoaderIndicator").hide();
        },
    		
        bindShowDiet : function (parentObject) {
    			
            parentObject.find('ul.dietDay > li').unbind();
            parentObject.find('ul.dietDay > li').mouseenter(
                function(){
                    var list = $(this).children('div').children('ul');
	
                    if(list.attr('checked') != 'true') {
                        $.post(
                            '/recipe/getForDay',
                            {
                                date : $(this).parents('.dietDay').attr('date'),
                                daytime : list.attr('daytime')
                            },
                            function(data) {
                                if (data.status == yantarDefault.STATUS_OK) {
                                    var i = 0;
                                    var count = data.recipes.length;
                                    list.attr('checked', 'true');
                                    for(i = 0; i < count; i++) {
                                        list.html('<li><a href=" ' + data.recipes[i].link
                                            + '">' + data.recipes[i].name + '</a></li>');
                                    }
                                }
	    	                            
                                if (data.msg != undefined) {
                                    list.html('<p>'+data.msg+'</p>');
                                }
                            }, 'json');
                    }
	
                    $('ul.dietDay > li').removeAttr("id");
                    $(this).children('div').show();
                }
                ).mouseleave(
                function(){
                    $('ul.dietDay > li div').hide();
                });
	
            parentObject.find('ul.dietDay > li').click(
                function(){
                    if($(this).attr('id') == "active") {
                        $(this).removeAttr("id");
                        $(this).children('div').hide();
                    }else {
                        $('ul.dietDay > li').removeAttr("id");
                        $(this).attr('id','active');
                    }
                }
                );
        },
    		
        bindMarkClicks : function(parentObject) {
	    	
            var collection = typeof(parentObject) == 'undefined' ? $(".markActions li") : parentObject.find(".markActions li");
            collection.unbind();
            collection.click(addMark);
        },
        bindAjaxPaging : function(parentObject) {
			
            var collection = typeof(parentObject) == 'undefined' ? $("a[id^='page_']") : parentObject.find("a[id^='page_']");
            collection.unbind();
            collection.click(handleAjaxPaging);
        },
        postAjaxContentHooks : $([]),
        registerPostAjaxHooks : function() {
        	
            hookList = this.postAjaxContentHooks;
            $(arguments).each(function(index, item) {
                hookList.push(item);
            });
            this.postAjaxContentHooks = hookList;
        },
        initialize : function() {
        	
            core.bindMarkClicks();
            core.bindAjaxPaging();
            core.registerPostAjaxHooks(core.bindMarkClicks, core.bindAjaxPaging, core.bindShowDiet);
            loadAjaxContent();
        }
    };

    $(pub.initialize);
    return pub;

}();

core.get = $.get;
$.get = function(url, data, callback, dataType) {
	
    core.showAjaxLoader();
	
    callbackFunction = core.isEnabledAjaxLoader() ? function(data, textStatus, XMLHttpRequest) {
        callback(data, textStatus, XMLHttpRequest);
        core.hideAjaxLoader();
    } : callback;
	
    core.get(url, data, callbackFunction, dataType);
}
