Home > JavaScript > Cross-Domain Ajax Calls: The YUI Way

Cross-Domain Ajax Calls: The YUI Way

Ajax is one of the most important technology that is a part of web 2.0 applications. Unfortunately the Cross/Sub-domain communications through Ajax are not allowed in browsers due to the security restrictions imposed by them. There are few techniques through which a web developer can make Cross/Sub-domain Ajax calls. A method is using the browser’s Flash plug-in to make this communication possible. In this tutorial we are going to use the YUI framework to make Cross/Sub-domain Ajax calls.

Overview

The XMLHttpRequest object (also known as the XMLHTTP object in Microsoft Internet Explorer environment) is one of the most widely used JavaScript object in Web 2.0 applications. Through Ajax technology JavaScript can communicate with the server without loading the web page again and again. The communications between the browser and server will be done without interfering the front-end of the application. This particular feature revolutionized the web development arena like never before. Ajax has its own limitations, one of the most important limitation of Ajax is the difficulty for performing a Cross/Sub-domain communication.

Cross/Sub-Domain Communication in Ajax

Popular browsers has imposed certain security restrictions due to which JavaScript is unable to perform a Cross/Sub-Domain communication. A Cross/Sub-Domain can be considered as any of the following items:

  • An independent external web server like Yahoo!
  • A sub-domain in our web server is also considered as Cross Domain

The frustrating point from a web developer perspective is sub-domains can’t communicate with each other even if both domains resides in the same server.

Making Cross/Sub-Domain Communication in Ajax Possible

There are two popular methods through which Cross/Sub-Domain Ajax call can be possible:

  • Server-side Proxy
  • Using Flash

Server-side Proxy

This is the best method available without much drawbacks as this method completely relies on the capabilities of the Server-side language that uses the Web server for eg: PHP, C#, Java, Python, etc.

The proxy is nothing but a code snippet that communicates with the external server. In this method the Ajax call will be issued directly to the proxy not to the Cross/Sub-Domain resource. After receiving the request from the browser the proxy will in turn communicate with the Cross/Sub-Domain resource. Gather the result from the external server and serve the results to the browser.

If you want more information about server-side proxy you can read a more detailed article about this in Yahoo Developer Network.

Using Flash

In a way Flash is similar to Ajax as it does not allow to gather data from external server. But there is a way to do this and this is the method that we are going to exploit to make the Cross/Sub-Domain Ajax call possible.

If we place a cross-domain policy file in the external server we can make this communication a reality. Personally I prefer to use this method to make the sub-domain communication and trusted Cross/Sub-Domain communication (the one between two of my websites) possible rather than making a call to an independent external server. As we need to place a cross-domain policy file in the external server this method may not be suitable for communicating with an independent external server without proper access to it. If you can place a cross-domain policy file in any server that allows the communication from your site to the external server then you can make the communication with any available server.

Cross-Domain Policy File

This is a normal XML file with some predefined markup in it. The most common location for a cross-domain policy file on a server is the root directory of a domain with the file name as crossdomain.xml. I have furnished a typical cross-domain policy file code below, which allows the Cross/Sub-Domain communication possible from client (the one who seeks resources).

<cross-domain-policy>
	<allow-access-from domain="*"/>	
</cross-domain-policy>

If you do not want to allow any external server communicate with your server then you can use the following code, which allows communication from a specific server. In this case the external server which needs to be invoked will accept the communication only from yourdomain.com or http://www.yourdomain.com

<cross-domain-policy>
	<allow-access-from domain="yourdomain.com"/>
	<allow-access-from domain="www.yourdomain.com"/>
</cross-domain-policy>

If you are looking for more information about cross-domain policy file you can read it here.

The Tools We Use

  • YUI2 Framework sources
  • An empty Flash movie
  • Cross-Domain Policy File

YUI2 Framework sources

YAhoo User Interface or YUI is one of the heavily feature oriented JavaScript framework developed by Yahoo!. The framework is well documented, comes with lots of examples, etc. We are going to use YUI’s Connection Manager

To include the YUI source insert the following code either in web page’s head or body section.

<script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/yuiloader/yuiloader-min.js"></script> <!-- Serves directly from Yahoo!'s CDN -->
<script type="text/javascript"> 
	// Instantiate and configure YUI Loader: 
	(function() { 
			var loader = new YAHOO.util.YUILoader({ 
				base: "", 
				require: ["connection","dom","event"], 
				loadOptional: false, 
				combine: true, 
				filter: "MIN", 
				allowRollup: true, 
				onSuccess: function() { 
					//You can place any code that needs to be executed after loading YUI source files here.
				} 
			});  
			// Load the files using the insert() method. 
			loader.insert(); 
		})();
</script>

Empty Flash Movie

As this method uses Flash plugin of the user browser we need a flash movie to make this method work. Personally I uses a small empty flash movie for this purpose. This is because I don’t want to associate this method with any other special purpose flash movie that I use in my sites.

Cross-Domain Policy File

I have furnished the code of a generic cross-domain policy file below. You can use this code as a starting point and can change this in such a way that it suits your purpose.

<?xml version="1.0"?>
	<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
		<cross-domain-policy>
			<allow-access-from domain="yourdomain.com"/>
			<allow-access-from domain="www.yourdomain.com"/>
		</cross-domain-policy>

Copy the above code, save it in a file named crossdomain.xml. Replace yourdomain.com with your site’s correct domain name. As the last step place the saved crossdomain.xml file on the external web server’s root folder to which you want to make the communication from your site through Ajax. This is the most important step of in the whole process, without carrying out this step you’ll not be able to make this method work correctly.

Full Source Code

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <title>Cross-Domain Ajax Communication</title>
        <script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/yuiloader/yuiloader-min.js">
        </script>
    </head>
    <body>
        <div id="container">
        </div>
		<form>
			<input type="button" name="btnLoad" id="btnLoad" value="Make Cross Domain Ajax Call">
		</form>
        <script type="text/javascript">
            var Global = {};
			Global.makeAjaxCall = function(paramObject){
				if(YAHOO.lang.isUndefined(paramObject.url) || YAHOO.lang.trim(paramObject.url) === ""){
					alert("Provide a url to proceed further");
					return false;
				}
				paramObject.method = paramObject.method||"GET";
				paramObject.cache = paramObject.cache||false
				if(paramObject.xdr === true && (!YAHOO.lang.isUndefined(paramObject.url) || YAHOO.lang.trim(paramObject.url) !== "")){
					YAHOO.util.Connect.transport(paramObject.flashFile);
					YAHOO.util.Connect.xdrReadyEvent.subscribe(function() {						
						//This JS literal object is responsible for making the function calls after the Ajax call occur.						
						var callback = {
							success:function(o){
								//The cross-domain Ajax call is success
								YAHOO.util.Dom.get("container").innerHTML = o.responseText; //After the cross-domain Ajax we insert the response from external server to one of the elements in the DOM
							},
							failure:function(o){
								//The cross-domain Ajax call is failure
								alert("Ajax call failed");
							},
							cache:paramObject.cache,
							xdr:true //This parameter will tell we are going to make a cross-domain Ajax call through flash plugin.
						};
						//The following function call will make the Ajax call and pass the callback object
						YAHOO.util.Connect.asyncRequest(paramObject.method, paramObject.url, callback);
					});					
				}else{//Normal Ajax call will be handled by this section
					//This JS literal object is responsible for making the function calls after the Ajax call occur.						
					var callback = {
						success:function(o){
							//The cross-domain Ajax call is success
							YAHOO.util.Dom.get("container").innerHTML = o.responseText; //You can place your code here that needs to be executed afer the successful Ajax call
						},
						failure:function(o){
							alert("Ajax call failed");
						},
						cache:paramObject.cache
					};
					//The following function call will make the Ajax call and pass the callback object
					YAHOO.util.Connect.asyncRequest(paramObject.method, paramObject.url, callback);
				}				
			};
			/*The following function will load the YUI  modules: DOM, Event and Connection manager*/
            Global.loadYui = function(){
                var loader = new YAHOO.util.YUILoader({
                    base: "",
                    require: ["connection", "dom", "event"],
                    loadOptional: false,
                    combine: true,
                    filter: "MIN",
                    allowRollup: true,
                    onSuccess: function(){
                        //You can place any code that needs to be executed after loading YUI source files here.
						
						//After the YUI framework file loading we attach the event handler to the button available in the page. 
						YAHOO.util.Event.on("btnLoad", "click", function(){
							Global.makeAjaxCall(Global.argumentsObject);
						});
                    }
                });
				//The following function call will insert the YUI modules in the page DOM  
                loader.insert();                 
            };
			
			//A JS literal object that contains the arguments needs for the XDR communication
			Global.argumentsObject = {
				url: "http://www.theremoteserver.com/yourresourcefile.ext", //Replace this url with your own external server's url and resource name
				method:"GET", //By default GET
				cache:false, //Can be true or false
				xdr:true, //Should be true for XDR communications
				flashFile:"flash_file_path/flash_file_name.swf" //Please include the correct path of the flash movie that we are going to use to make this all possible. 
			};
			
			Global.onLoad = function(){
				Global.loadYui(); //Include YUI source in to the DOM
			}
			
			YAHOO.util.Event.onDOMReady(Global.onLoad); //JS code execution will be started after loading the DOM except images completely.
        </script>
    </body>
</html>

Dissect The Source

The code above code is a genric code which needs to be updated with your required details if you want to try this method. I have commented the source so that anyone can use it without any issues and can modify at their own will.

I have Placed the entire JavasScript code within a JavaScript literal object named Global to avoid cluttering the global namespace with our code. In other words we uses a custom namespace for our code, the entire functions, variables, etc will be within this namespace. This method organizes the code efficiently especially if you are dealing with large volume of code.

Everything starts with the following code.

YAHOO.util.Event.onDOMReady(Global.onLoad); 

This code will invoke the function onLoad which is inside the Global JavaScript object literal after completing the page’s DOM loading. Please note that this will not wait for page’s images to load for executing the function. This is the method of YUI equivalent to jQuery‘s $(document).ready() function.

Global.onLoad = function(){
	Global.loadYui(); //Include YUI source in to the DOM
};

This code will invoke the Global.loadYui function, which is responsible for loading YUI’s needed modules. You can load it via script tag but we are going to use JavaScript in anyway and thought of loading the framework files through JavaScript itself. One of the reason I’ve done like this is loading large script resources through script tags may take more time for completing the page loading. So what I’ve done was I’ve loaded the smallest module of YUI framework, which is YUI Loader utility using a script tag and loaded the rest of the framework resources through YUI Loader utility.

/*The following function will load the YUI  modules: <a href="http://developer.yahoo.com/yui/dom/" title="YUI Dom">Dom</a>, <a href="http://developer.yahoo.com/yui/event/" title="YUI Event">Event</a> and <a href="http://developer.yahoo.com/yui/connection/" title="YUI Connection Manager">Connection manager</a>*/
Global.loadYui = function () {
	var loader = new YAHOO.util.YUILoader({
		base: "",
		require: ["connection", "dom", "event"],
		loadOptional: false,
		combine: true,
		filter: "MIN",
		allowRollup: true,
		onSuccess: function () {
			//You can place any code that needs to be executed after loading YUI source files here.
			//After the YUI framework file loading we attach the event handler to the button available in the page. 
			YAHOO.util.Event.on("btnLoad", "click", function () {
				Global.makeAjaxCall(Global.argumentsObject);
			});
		}
	});
	//The following function call will insert the YUI modules in the page DOM  
	loader.insert();
};

The above code will perform three following things:

  • It will load YUI modules Connection, Dom and Event
  • After loading the YUI modules it will execute the onSuccss function
  • An onclick event handler will be attached to a button element whose ID is btnLoad

You need to edit the following code snippet with your own details before proceeding further

Global.argumentsObject = {
	url: "http://www.theremoteserver.com/yourresourcefile.ext",	//Replace this url with your own external server's url (the one in which you've placed the policy file) and resource name
	method: "GET",			//By default GET
	cache: false,	//Can be true or false
	xdr: true,	//Should be true for XDR communications
	flashFile: "flash_file_path/flash_file_name.swf" //Please include the correct path of the flash movie that we are going to use to make this all possible. 
};

Mostly you’ll need to change the first and the last properties of the Global.argumentsObject object literal with the correct details of yours. Make sure that you keep the xdr property value as true if you are intending Cross/Sub-Domain Ajax calls.

A click on the button will start the first stage of the Ajax call. This will invoke Global.makeAjaxCall function, which is responsible for making the Ajax call and handling the callbacks.

Global.makeAjaxCall = function (paramObject) {
	if (YAHOO.lang.isUndefined(paramObject.url) || YAHOO.lang.trim(paramObject.url) === "") {
		alert("Provide a url to proceed further");
		return false;
	}
	paramObject.method = paramObject.method || "GET";
	paramObject.cache = paramObject.cache || false
	if (paramObject.xdr === true && (!YAHOO.lang.isUndefined(paramObject.url) || YAHOO.lang.trim(paramObject.url) !== "")) {//Makes XDR Call 
		YAHOO.util.Connect.transport(paramObject.flashFile);
		YAHOO.util.Connect.xdrReadyEvent.subscribe(function () {
			//This JS literal object is responsible for making the function calls after the Ajax call occur.						
			var callback = {
				success: function (o) {
					//The cross-domain Ajax call is success this section will be executed
					YAHOO.util.Dom.get("container").innerHTML = o.responseText; //After the cross-domain Ajax we insert the response from external server to one of the elements in the DOM
				},
				failure: function (o) {
					//The cross-domain Ajax call is failure this section will be executed
					alert("Ajax call failed");
				},
				cache: paramObject.cache,
				xdr: true //This parameter will tell we are going to make a cross-domain Ajax call through flash plugin.
			};
			//The following function call will make the Ajax call and pass the callback object
			YAHOO.util.Connect.asyncRequest(paramObject.method, paramObject.url, callback);
		});
	} else { //Normal Ajax call will be handled by this section
		//This JS literal object is responsible for making the function calls after the Ajax call occur.						
		var callback = {
			success: function (o) {
				//The cross-domain Ajax call is success
				YAHOO.util.Dom.get("container").innerHTML = o.responseText; //You can place your code here that needs to be executed afer the successful Ajax call
			},
			failure: function (o) {
				alert("Ajax call failed");
			},
			cache: paramObject.cache
		};
		//The following function call will make the Ajax call and pass the callback object
		YAHOO.util.Connect.asyncRequest(paramObject.method, paramObject.url, callback);
	}
};

The above function accepts a object literal as its parameter. We’ll use the earlier defined Global.argumentsObject for this purpose. The parameter should contain a url value for proceeding with this method.

By default the HTTP method used is GET. If you want POST then you’ll have to specify it in Global.argumentsObject object.

By default the Ajax call cache will be false. If you want it to be true then specify it in Global.argumentsObject object.

Make sure that the xdr property in Global.argumentsObject object is true for making the Cross/Sub-Domain Ajax calls to work

The basic functionality of the above mentioned code is it will make an XDR call to the mentioned server, which contains the cross-domain policy file that I have mentioned earlier. After gathering the response from the external server JS will insert the response in a div element whose id is “container”.

Before making the Cross/Sub-domain Ajax call we need to initialize the Flash transport that we use (the flash movie). The following code will do that

YAHOO.util.Connect.transport(paramObject.flashFile);

We can proceed further only after finishing the Flash transport initialization. In our case we’ve subscribed the xdrReadyEvent, which will be executed after initializing the Flash correctly. We’ve achieved that using the following code

YAHOO.util.Connect.xdrReadyEvent.subscribe(function () {
	//This JS literal object is responsible for making the function calls after the Ajax call occur.						
	var callback = {
		success: function (o) {
			//The cross-domain Ajax call is success this section will be executed
			YAHOO.util.Dom.get("container").innerHTML = o.responseText; //After the cross-domain Ajax we insert the response from external server to one of the elements in the DOM
		},
		failure: function (o) {
			//The cross-domain Ajax call is failure this section will be executed
			alert("Ajax call failed");
		},
		cache: paramObject.cache,
		xdr: true //This parameter will tell we are going to make a cross-domain Ajax call through flash plugin.
	};
	//The following function call will make the Ajax call and pass the callback object
	YAHOO.util.Connect.asyncRequest(paramObject.method, paramObject.url, callback);
});

This code make sure that the Cross/Sub-Domain Ajax call will be made only after initializing the Flash transport, which is responsible for making the whole communication. The callback JavaScript object literal is an object passing the callbacks that needs to be executed after the Ajax call and also the required properties (cache and xdr) to YUI Connection Manager.

var callback = {
	success: function (o) {
		//The cross-domain Ajax call is success this section will be executed
		YAHOO.util.Dom.get("container").innerHTML = o.responseText; //After the cross-domain Ajax we insert the response from external server to one of the elements in the DOM
	},
	failure: function (o) {
		//The cross-domain Ajax call is failure this section will be executed
		alert("Ajax call failed");
	},
	cache: paramObject.cache,
	xdr: true //This parameter will tell we are going to make a cross-domain Ajax call through flash plugin.
};
YAHOO.util.Connect.asyncRequest(paramObject.method, paramObject.url, callback); //The Ajax calling code

The above JavaScript literal object will be passed to YUI’s Connection Manager’s asyncRequest function

The success function in the callback object literal will be execute if the Ajax call was a success and the Ajax object will be passed to the function from which the code can access the response either through using responseText or responseXML proerties.

YAHOO.util.Dom.get("container").innerHTML = o.responseText;

This code will just extract the response from the server and insert it in an HTML element whose ID is “container”

Summary

Web 2.0 uses Ajax technology extensively. Unfortuanately Ajax does not allow cross/sub-domain communications due to the security restrictions imposed by the browsers. This problem can be tackled either through a server-side proxy or through a method that uses the Flash plugin installed in the browsers (most of them). YUI’s Connection Manager provides a simple method for making this communication possible. This method is suitable for making any cross/sub-domain Ajax calls without much trouble.

About these ads
Categories: JavaScript
  1. April 23, 2013 at 11:12 am

    Link exchange is nothing else however it
    is just placing the other person’s web site link on your page at suitable place and other person will also do same for you.

  2. May 16, 2013 at 8:25 am

    Hiya! I know this is kinda off topic nevertheless I’d figured I’d ask.

    Would you be interested in exchanging links or maybe guest
    authoring a blog post or vice-versa? My website addresses a lot of the same topics as
    yours and I feel we could greatly benefit from each other.
    If you’re interested feel free to send me an e-mail. I look forward to hearing from you! Terrific blog by the way!

  3. May 28, 2013 at 12:59 am

    I was wondering if you ever considered changing the page layout of your site?

    Its very well written; I love what youve got
    to say. But maybe you could a little more in the way of content so people could connect with it better.
    Youve got an awful lot of text for only having
    1 or two pictures. Maybe you could space it out
    better?

  4. February 3, 2014 at 1:17 pm

    3jelly.com

    موقع يعظى استضافة مجانية غير محدودة وvps مجانا
    free unlimited hosting,free vps 1 gb ram,no cc , 1 year free,
    free domain name,3jelly.com, استضافة مجانية ,وvps
    مجانا

  5. June 9, 2014 at 6:54 pm

    znasz opieki nad starsze członkiem rodziny która może mieć choroba?

    Jeśli, to jest często wymagających przedsiębiorstwo.

    Trzeba upewnij się, krajać jakiś z twojego opiekun pozycja do
    poświęcamy prywatne czas dla siebie. Uczynić konsultacje codziennie spotkać znajomego lub Partner do posiłek lub filiżanka kawy.
    Pozwól sobie zezwolenie na pytanie innych ludzi do robienia ponad
    Twój odpowiedzialność jak zdrowie pracowników podczas przerwę.
    Możesz także przyjrzeć operatorzy udostępniona od szanowanym dorosły Kursy.
    szkolenie zarządzanie czasem Koniecznie się światło, jeszcze nie nadmiernej ilości.

    Jak może Era, to kluczowa odkryć równowagi w kategoriach biorąc w światło.
    To istotne, a światło słoneczne jest wspaniałym sposobem uzyskać witaminy D w twojej systemu, ale nadmierną ilością słońca słońcu może mieć Wyniki na starzenie skóra i rak skóry.
    Sterowanie Twój czas i wysiłek w słońcu i , gdy jesteś w to na zewnątrz, wykorzystanie istotna ochrony przeciwsłonecznej SPF.
    szkolenie zarządzanie czasem Aby znaleźć najlepsze wino do spotkania dowolny mąka musisz
    wiedzieć, jaki typ Wina uzupełnia w różnego rodzaju różne mięso.

    jeden z wielu najprostszych sposobów pamiętać co czerwone wino odebrać jest zazwyczaj spotkania
    się kolor wino z kolor różne mięso. Tytułem przykładu,
    najbardziej red napoje wina łączenie atrakcyjnie z czerwone mięso w
    tym mięso choć biały kolorowe napoje wina praca ładnie z
    biały kolorowe mięso jak owoce morza lub drób. szkolenie zarządzanie czasem Uczynić wzrok krople każdego z twojej ważne elegancja artykuły.
    Czy nie ty był się późno w nocy eksploatacja lub towarzyskich, będziesz ewentualnie ma przekrwione oczy codziennie .

    To może sprawić, że może cię wydają w wieku powyżej jesteś.

    Tylko wprowadzenie spadek lub para Visine może fix to wyzwanie,.
    Visine można również stosować i zapalenie z trądzik.

    Skorzystaj TAD do trądzik ognisk pozostawiając do suche.
    Twój warstwa skóry pojawi większe szybko .
    szkolenie zarządzanie czasem Chcesz pobyt rozległe życie codzienne i jak proces starzenia?
    Aby dłuższych, pozostaje korzystne. Badanie ma wystawiał, że osoby,
    które mają dobre postawa także zwykle mają długotrwałe i zdrowsze życia.
    Odszukaj na humor życia. Śmiech może Spadek, że wysokie ciśnienie
    krwi i pomocy pusty szczep właściwe z budowa ciała.
    Wielu badania wykazały przycisk dobre Zdolności z Rozrywka i dokładnie,
    jak może to zrobić czujesz, większe. szkolenie
    zarządzanie czasem Jeśli na konkretnego wieku i pewien w sprawie sposób założyć makijaż w komplementarne
    sposób proszę dźwigni produkty do makijażu zawodowcy
    w Twój sąsiedztwo dom towarowy. Zaznacz Producenci to apeluje do was i rzucać siebie dół w kanapy z bardzo najbardziej właściwy – szuka makijaż muzyka.
    Będą szczęśliwy świadczenia dużo darmo
    pomocne porady na Najprostszym sposobem przynieść Twój
    “teraz” Atrakcyjność się. Nie ważne, czy zakupu ich towarów lub w inny sposób nie jest całkowicie twoja
    decyzja, jednak Przekształcenie i doradztwo są bezpłatne i jeden masz zachować.
    szkolenie zarządzanie czasem Jeśli na konkretnego
    epoki i niejasna by sposób założyć produkty do makijażu w pochlebne sposób upewnij się, korzystać z makijaż zawodowcy w
    Zobacz centrum handlowe. Wybierz Producenci to
    garnitury ty i rzucać Twój własny dół z siedziba z bardziej
    wykwalifikowana – szuka kosmetyki pochwał. Są
    szczęśliwy do zaoferowania dużo darmo pomocne porady
    na najprostszym sposobem dostarczyć Twój “teraz” Atrakcyjność się.
    Niezależnie od tego, czy masz ich pozycji lub nie jest zupełnie pod kontrolą, a Przekształcenie oraz Pomoc są bezpłatne i własną nieruchomość aby pomóc
    utrzymać. szkolenie zarządzanie czasem Pomimo korzystnym dogmat
    Stare mężczyźni i kobiety trzeba Maksymalna kwota Reszta jak młode Osób,
    co może być Minimum 7 lub 8 godzin wieczór.

    Czy masz bardzo Reszta ale nadal czuć w ciągu dnia, Zobacz swoje lekarz dlatego, może masz bezdech .
    Osoby cierpi z bezdech wielokrotnie pauza wdechu i
    wydechu kiedy odpoczynku. Nie rozpatrywane, ten problem
    może doładowania szanse choroby układu krążenia wraz z
    innymi, Kłopoty. szkolenie zarządzanie czasem Mecz hot spożywcze na słodkie wina napojów.
    Szczególnie z wysoka temperatura Indyjska rodzimych wyżywienie, powinieneś
    wolne od wilgoci biało-kolorowe i czerwony napoje wina które są dość słodkie.
    Niektóre bardzo ładne par zaangażować Chenin Blanc,
    Gewurztraminer i Riesling. Jeśli zdecydujesz Riesling,
    try zmierzasz marka biorąc pod uwagę, że ich wyższe kwasowość nie mieć słodycz wydają się być jak widać.
    Te napoje wina działają jak podniebienia środki czyszczące pomóc korzystać z pikanterii z w Twojego posiłku.
    szkolenie zarządzanie czasem O najlepsze dieta będzie Program dramatycznie
    wzrost zdrowia i wygląd naskórka, paznokci i zamki.

    Pij jagody, dlatego, że są świetny w wzmocnienie skóry elastyczność.
    Weź w dużo truskawki, a oni pomagają ochronna minimalizowanie
    linie twarzy. Awokado są świetne, ponieważ dodaj Pomoc w
    komórce regeneracji. ostatniej, ale nie minimalna, staram się jeść mnóstwo owoce.
    Jagody Acai zawiera owoce dwa razy dużo contra – – utleniacze jak każdy

  6. August 14, 2014 at 5:51 am

    When someone writes an article he/she maintains the
    thought of a user in his/her mind that how
    a user can understand it. So that’s why this piece of writing is amazing.
    Thanks!

  7. kobieceporady.wordpress.com
    August 20, 2014 at 6:05 am

    I do not know if it’s just me or if perhaps everyone else encountering issues with your site.
    It looks like some of the text within your content are running off the screen. Can someone else
    please provide feedback and let me know if this is happening to them as well?
    This could be a problem with my internet browser because I’ve had this
    happen before. Appreciate it

  8. November 5, 2014 at 2:41 am

    Very good blog! Do you have any tips for aspiring writers?
    I’m hoping to start my own blog soon but I’m
    a little lost on everything. Would you propose starting with a
    free platform like WordPress or go for a paid option? There are so many options out there that
    I’m completely confused .. Any suggestions? Thanks!

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: