﻿jQuery.mvc = {};
jQuery.mvc.animation = 'fadeIn';
jQuery.mvc.animationSpeed = '';
jQuery.mvc.showLoginBox = false;

jQuery.mvcJson = function( url, callback ) {
    jQuery.mvc.request(url, null, "POST", true, null, callback);
};

jQuery.fn.mvcJsonForm = function(callback) {
    var t = jQuery(this);
    var url = t.attr('action');
    jQuery.mvc.request(url, null, "POST", true, t.serialize(), callback);
}

jQuery.fn.mvcAjaxForm = function(showResultIn, callback) 
{
    var t = jQuery(this);
    var serialised = t.serialize();    
    var url = t.attr('action');
    jQuery.mvc.request(url, showResultIn, "POST", false, serialised, callback);
}
	    
jQuery.mvc.request = function( url, showResultIn, type, json, data, callback ) {
    if (typeof(jQuery.mvc.originalState) == 'undefined')
        jQuery.mvc.originalState = jQuery(document.body).html();
        
    if (jQuery.isFunction(data))
    {
	    callback = data;
	    data = "";
    }

    if (!data)
    {
	    data = "";
    }        
    
    if (jQuery.isFunction(showResultIn))
    {
	    callback = showResultIn;
	    showResultIn = null;
    }
    
    if (showResultIn)
    {
        showResultIn = jQuery(showResultIn);
    }
    
    return jQuery.ajax({
	    type: type,
	    url: url,
	    data: data,
	    cache: false,
	    timeout:30000,
	    success: function(resultObj) {
	        jQuery.mvc.processRequest(resultObj, callback,false,showResultIn);	        
	    },
	    error: function(resultObj, status) {
	        jQuery.mvc.processRequest(resultObj, null, true, showResultIn);	        
        },
	    dataType: (json ? "json" : null),
	    beforeSend: (!json ? null : function(xml) {
	        xml.setRequestHeader("X-IsJson", "true");
	    })
    });
};

jQuery.mvc.clearMessages = function() {
    jQuery('#errors').html('');
    jQuery('#messages').html('');
}

jQuery.fn.mvcAddMessage = function(msg) {
    var t = jQuery(this);
    if (t.html() == '')
        t.html('<ul></ul>');
    var ul = jQuery('ul', t);
    ul.append('<li>' + msg + '</li>');
}

jQuery.mvc.processRequest = function (resultObj, callback, isError, showResultIn) {

    jQuery.mvc.clearMessages()
    
    var msgContainer = jQuery('#messages');
    var errorContainer = jQuery('#errors');
    var errorParent = jQuery('#errors-container');
    var msgParent = jQuery('#messages-container');    
    
    var result = true;
    var errorSet = false;
    if (jQuery.isFunction(callback))
    {
	    result = callback(resultObj);
    }        
    
    if (result != false && typeof(resultObj) != 'undefined')
    {
        if (msgContainer && typeof(resultObj.Messages) != 'undefined')
        {
            jQuery(resultObj.Messages).each(function(t){
                msgContainer.mvcAddMessage(this);                
            });
        }	
        
        if (errorContainer && typeof(resultObj.Errors) != 'undefined')
        {	
            jQuery(resultObj.Errors).each(function(t) {
                errorContainer.mvcAddMessage(this);                
            });            
            errorSet = true;
        }
    }
    if (result && showResultIn)
    {
        var html = typeof(resultObj.responseText) == 'undefined' ? resultObj : resultObj.responseText;            
        
        showResultIn = jQuery(showResultIn);        
        var resId = showResultIn.attr('ID');        
        var containsId = html.indexOf(resId);
        if (containsId == -1)
        {
		    showResultIn.html(html);
        }
        else
        {
		    showResultIn.replaceWith(html);
        }
        
        showResultIn = jQuery('#' + resId);
        if(jQuery.mvc.animation)
            showResultIn.hide();

        var ajaxMsg = jQuery('#ajaxmessages');        
        msgContainer.html(ajaxMsg.html());        
        ajaxMsg.remove();
        
        var errorMsg = jQuery('#ajaxerrors');
        errorContainer.html(errorMsg.html());
        errorMsg.remove();
        
        errorSet = errorMsg.size() > 0;
        
        jQuery('a.ajaxlink', showResultIn).ajaxify();
        
	  $(showResultIn).show();        
    }
    
    if (isError && !errorSet)
    {
		tb_remove();
    }
    
    return result;
}
jQuery.mvc.initialize = function() {
    if (typeof(jQuery.mvc.originalState) != 'undefined')
		jQuery(document.body).html(jQuery.mvc.originalState);
		jQuery('a.ajaxlink').ajaxify();
    
    $("#loading").ajaxStart(function(){
      
       $(this).show();
       tb_show("Loading", '#TB_inline?width=415&height=122&inlineId=loading_box_container', null);
       var overlay = $('#TB_overlay');
       overlay.removeClass('TB_overlayBG');
       overlay.unbind('click');
     });
    $("#loading").ajaxStop(function(){		
		tb_remove();
		$(this).hide();		
		if (jQuery.mvc.showLoginBox)
		{
			setTimeout(jQuery.mvc.lauchLoginBox, 300);
		}
     });
}

jQuery.mvc.lauchLoginBox = function()
{
	tb_show("LOGIN", '#TB_inline?width=415&height=122&inlineId=login_box_container', null);
	jQuery.mvc.showLoginBox = false;
	var overlay = $('#TB_overlay');
    overlay.unbind('click');
}

jQuery().ready(function() {
    jQuery.mvc.initialize();
})

jQuery.fn.ajaxify = function() {
    return this.each(function() {
        var link = jQuery(this);
        if (typeof link.attr('href') != 'undefined' && link.attr('href').substr(1, 1) != '#')
        {
		link.attr('href', '#' + link.attr('href')); 		

            link.click(function()
            {
			    var selected = $(".menu a.selected");
			    link.addClass("selected");			
			    var target = link.attr('meta:ajaxtarget');
			    var hash = link.attr('href').substr(0,1);
			    var url = link.attr('href');
			    while (hash == '#') {
				url = url.substr(1);
				hash = url.substr(0,1);
			}
                
			jQuery.mvc.request(url, target, "GET", false, 'fullpage=true', function(resultObj)
			{
				selected.each(function()
				{			
					$(this).removeClass("selected");
					var targetDiv = $(this).attr("meta:ajaxtarget");				
					$(targetDiv).hide();
				});
							
				return true;			
			});			
			
			return false;						
            });
            
        }
    })
};
jQuery.ajaxHistory.initialize(jQuery.mvc.initialize);