var ajax = {
    lastdata : null,
    handler  : {}
};
var a = ajax.lastdata;


$.fn.hl_external = function() {

    $(this).filter("[@target$='_blank']").addClass('external');

}



$.fn.ajaxlink = function( options ) {
//console.group('$.ajaxlink()');

	var settings = {
        animation: null
	};

	if( options ) {
		$.extend(settings, options);
	}

    $(this).each( function(i) {
        $(this).bind("click.ajax", function() { ajax.ajaxlink ( this, settings.animation ); return false; });
    });

//console.groupEnd('$.ajaxlink()');
return this;
}



$.fn.ajaxform = function( options ) {

    // -=Forms=- //
    forms = this;
    // $(forms).fix();
    $(forms).each( function(i) {
        form = forms[i];
        $(form).bind('submit.ajaxForm', function() {
            // $.fck.update();
            fdata = $(this).formSerialize(true);
            fdata = fdata+'&'+$(this).find(e.additional_elements_wrapper + 'input[type=button]').fieldSerialize(false);
            urli = $(this).attr('action') || window.location.href;
            $.ajax({
                type     : "POST",
                url      : urli,
                data     : fdata,
                dataType : "json",
                success  : function(data, status) { ajax.handle  (data, status); }
            });
        return false;
        });

    });

}




ajax.ajaxlink = function ( element, animate ) {


    var newurl = $(element).attr('href');
    if (!animate) {
        animate = $(element).is('.action') ? false : true;
    }

    console.warn(newurl);

    if (animate == true)
    // -=Official links=- //
    {
        $.ajax({
            type     : "GET",
            url      : newurl,
            dataType : "json",
            beforeSend : function(XMLHttpRequest) { ajax.beforesend(this) },
            success  : function(data, status) { ajax.handle  (data, status); }
        });

    }
    else
    // -=Shortcuts=- //
    {
            $.ajax({
                type     : "GET",
                url      : newurl,
                dataType : "json",
                success  : function(data, status) { ajax.handle  (data, status); }
                // complete : function(http,   data) { ajax.error   (http, data); }
            });
    }


}




ajax.beforesend = function(XMLHttpRequest) {
    url = XMLHttpRequest.url;
    ajax.history.try_add(url);
}


ajax.error = function(request, data) {
    // -=Error happens=- //
    console.warn('ajax.error!');
    console.debug(request);

}













ajax.handle = function(data, status) {

    ajax.lastdata = data;
    a = ajax.lastdata;

    if (data.data.geo) {
        ajax.handler.geo(data.data.geo);
    }

    if (!json.data) {
        console.error('Ajax handler accepts only formated json objects, html returned');
        console.debug(data);
        console.groupEnd('ajax.handle()');
        return;
    }

    if ( !json.type || json.type == '' ) {
        console.error('Type of json object not set: expected json object in format { type : "type", data : {} }');
        console.groupEnd('ajax.handle()');
        return;
    }


    ajax.handler.debug(json);


    if (typeof(ajax.handler[data.type]) == 'function') {
        eval("ajax.handler."+data.type+"(data.data)");
    }
    else {
        console.error('Please create a function *ajax.handler.'+data.type+'* in file *ajax.handlers.js*');
    }


}

