#1
  1. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2010
    Posts
    19
    Rep Power
    0

    Question Simple ELSE IF condition with document.referrer and window.location.href not working.


    Hi all!
    I have this very simple IF statement with document.referrer and window.location.href and it doesn't work.
    Can anyone suggest as to what I might be doing wrong?

    Code:
    else if ((document.referrer == undefined) || (!document.referrer) || (document.referrer == '') || (window.location.href.indexOf('referrer1') < 0)) {
    
    document.write('Condition 2 Activated!');
    document.write('<br>');
    
    var referrer1_paramPre = '';
    
    var userReferrerSearchTermPre = '';
    
    var IsCookieRequired = 'no';
    
    }
    Thank you for helping!
  2. #2
  3. A Not To Shabby Code Smurf
    Devshed Beginner (1000 - 1499 posts)

    Join Date
    Aug 2008
    Posts
    1,151
    Rep Power
    183
    You would just need to do it like this:
    Code:
    else if (document.referrer == "") {
    
    document.write('Condition 2 Activated!');
    document.write('<br>');
    
    var referrer1_paramPre = '';
    
    var userReferrerSearchTermPre = '';
    
    var IsCookieRequired = 'no';
    
    }
  4. #3
  5. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2010
    Posts
    19
    Rep Power
    0
    Originally Posted by web_loone08
    You would just need to do it like this:
    Code:
    else if (document.referrer == "") {
    
    document.write('Condition 2 Activated!');
    document.write('<br>');
    
    var referrer1_paramPre = '';
    
    var userReferrerSearchTermPre = '';
    
    var IsCookieRequired = 'no';
    
    }
    Hi web_loone08,
    So I can combine the first 3 checks into just one
    and what can I do about :
    (window.location.href.indexOf('referrer1') < 0)

    - xeirus.
  6. #4
  7. A Not To Shabby Code Smurf
    Devshed Beginner (1000 - 1499 posts)

    Join Date
    Aug 2008
    Posts
    1,151
    Rep Power
    183
    I would use split() instead of indexOf() and validate it; to check if it is undefined or not. Something like this:
    Code:
    else if (document.referrer == "" || document.location.href.split("?referrer1=")[1] == undefined) {
    
    document.write('Condition 2 Activated!');
    document.write('<br>');
    
    var referrer1_paramPre = '';
    
    var userReferrerSearchTermPre = '';
    
    var IsCookieRequired = 'no';
    
    }
    Last edited by web_loone08; May 29th, 2013 at 12:09 PM.
  8. #5
  9. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2010
    Posts
    19
    Rep Power
    0
    Originally Posted by web_loone08
    I would use split() instead of indexOf() and validate it; to check if it is undefined or not. Something like this:
    Code:
    else if (document.referrer == "" || document.location.href.split("?referrer1=")[1] == undefined) {
    
    document.write('Condition 2 Activated!');
    document.write('<br>');
    
    var referrer1_paramPre = '';
    
    var userReferrerSearchTermPre = '';
    
    var IsCookieRequired = 'no';
    
    }
    Thank you web_loone,
    Tried your idea as well, but doesn't work.

    This is very strange, both of these ELSE IF codes don't work if they are inside an existing IF statement.

    Any thoughts?
  10. #6
  11. No Profile Picture
    Super Moderator
    Devshed Specialist (4000 - 4499 posts)

    Join Date
    Jul 2003
    Posts
    4,008
    Rep Power
    2791
    You probably should not be using document.write. The method writes to the document stream, which is how the page is created when you first load it. Calling document.write will clear the entire document.

    https://developer.mozilla.org/en-US/...document.write.
    [PHP] | [Perl] | [Python] | [Java] != [JavaScript] | [XML] | [ANSI C] | [C++] | [LUA] | [MySQL] | [FirebirdSQL] | [PostgreSQL] | [HTML] | [XHTML] | [CSS]

    W3Fools - A W3Schools Intervention.
  12. #7
  13. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2010
    Posts
    19
    Rep Power
    0
    Originally Posted by Winters
    You probably should not be using document.write. The method writes to the document stream, which is how the page is created when you first load it. Calling document.write will clear the entire document.

    https://developer.mozilla.org/en-US/...document.write.
    Hi Winters,
    Removed document.write
    Still the same.
  14. #8
  15. No Profile Picture
    Super Moderator
    Devshed Specialist (4000 - 4499 posts)

    Join Date
    Jul 2003
    Posts
    4,008
    Rep Power
    2791
    What is 'not working'? This may well be a scope issue. Can you post all of the code, please.
    [PHP] | [Perl] | [Python] | [Java] != [JavaScript] | [XML] | [ANSI C] | [C++] | [LUA] | [MySQL] | [FirebirdSQL] | [PostgreSQL] | [HTML] | [XHTML] | [CSS]

    W3Fools - A W3Schools Intervention.
  16. #9
  17. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2010
    Posts
    19
    Rep Power
    0
    Originally Posted by Winters
    What is 'not working'? This may well be a scope issue. Can you post all of the code, please.
    If a user visits this page directly then the "document.referrer" would be empty/undefined/null/blank which is supposed to activate "Condition 3".
    I have 7 conditions, all of them work except Condition 3.
    Below is the entire code:

    Code:
    /*//////////////////////*/
    /* Entire Referring URL */
    /*//////////////////////*/
    document.write('Entire Referring URL:');
    document.write('<br>');
    var userReferrerFull = document.referrer;
    document.write(userReferrerFull);
    document.write('<br><br>');
    
    /*///////////////////*/
    // Referring Domain: */
    /*///////////////////*/
    document.write('Referring Domain:');
    document.write('<br>');
    var pathArray = document.referrer.split( '/' );
    var userReferrerDomain = pathArray[2];
    document.write(userReferrerDomain);
    document.write('<br><br>');
    
    /*/////////////////*/
    // Our Own Domain: */
    /*/////////////////*/
    // Find our own Domain Name
    var ThisDomainName = window.location.host;
    document.write('ThisDomainName:');
    document.write('<br>');
    document.write(ThisDomainName);
    document.write('<br><br>');
    
    document.write('window.location.href:');
    document.write('<br>');
    document.write(window.location.href);
    document.write('<br>');
    document.write('<br>');
    
    /*if ((document.referrer == "undefined") || (!document.referrer) || (document.referrer == "")) {
    
    document.write('<br>');
    document.write('Condition ZOOPIE DOOPIE Activated!');
    document.write('<br>');
    document.write('<br>');
    
    var referrer1_paramPre = '';
    
    var userReferrerSearchTermPre = '';
    
    var IsCookieRequired = 'no';
    
    }*/
    
    
    // this fixes an issue with the old method, ambiguous values
    // with this test document.cookie.indexOf( name + "=" );
    function Do_Cookie_Check( check_name ) {
    	// first we'll split this cookie up into name/value pairs
    	// note: document.cookie only returns name=value, not the other components
    	var a_all_cookies = document.cookie.split( ';' );
    	var a_temp_cookie = '';
    	var cookie_name = '';
    	var cookie_value = '';
    	var b_cookie_found = false; // set boolean t/f default f
    
    	for ( i = 0; i < a_all_cookies.length; i++ )
    	{
    		// now we'll split apart each name=value pair
    		a_temp_cookie = a_all_cookies[i].split( '=' );
    
    
    		// and trim left/right whitespace while we're at it
    		cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');
    
    		// if the extracted name matches passed check_name
    		if ( cookie_name == check_name )
    		{
    			b_cookie_found = true;
    			// we need to handle case where cookie has no value but exists (no = sign, that is):
    			if ( a_temp_cookie.length > 1 )
    			{
    				cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g, '') );
    			}
    			// note that in cases where cookie is initialized but no value, null is returned
    			return cookie_value;
    			break;
    		}
    		a_temp_cookie = ""; // used to be null instead of "" 
    		cookie_name = '';
    	}
    	if ( !b_cookie_found )
    	{
    		return ""; // used to be null instead of "" 
    	}
    }
    
    //////////////////////////////////////////////////////////////////
    // Do a Cookie Check to see if the Cookie Name returned "null"  //
    // if it did return "null", then run next step onwards or else  //
    // do nothing as shown in the end.                              //
    //////////////////////////////////////////////////////////////////
    if ( Do_Cookie_Check( 'refcookie' ) == "") // used to be null instead of "" 
    { 
    
    
    ///////////////////////////////////
    ///////////////////////////////////
    // parseUri 1.2.2
    // (c) Steven Levithan <stevenlevithan.com>
    // MIT License
    
    function parseUri (str) {
    	var	o   = parseUri.options,
    		m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
    		uri = {},
    		i   = 14;
    
    	while (i--) uri[o.key[i]] = m[i] || "";
    
    	uri[o.q.name] = {};
    	uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
    		if ($1) uri[o.q.name][$1] = $2;
    	});
    
    	return uri;
    };
    
    parseUri.options = {
    	strictMode: false,
    	key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
    	q:   {
    		name:   "queryKey",
    		parser: /(?:^|&)([^&=]*)=?([^&]*)/g
    	},
    	parser: {
    		strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
    		loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
    	}
    };
    ///////////////////////////////////
    ///////////////////////////////////
    
    // Check if the Referring Domain is external
    // or our own Domain Name
    if (userReferrerDomain.indexOf(ThisDomainName) > -1 ) {
        // Do Nothing !
        document.write('<font color="#FF0000">Referrer is ThisDomainName so doing nothing!</font>');
        document.write('<br>');
    
    document.write('Condition 1 Activated!');
    document.write('<br>');
    
    var referrer1_paramPre = '';
    
    var userReferrerSearchTermPre = '';
    
    var IsCookieRequired = 'no';
    
    }
    // Option 2
    // Visitor is from a Referrer's Site
    else if (window.location.href.indexOf('referrer1') > -1 ) {
    
    document.write('Condition 2 Activated!');
    document.write('<br>');
    
    function gup( name )
    {
        name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
        var regexS = "[\\?&]"+name+"=([^&#]*)";
        var regex = new RegExp( regexS );
        var results = regex.exec( window.location.href );
    	if( results == null )
          return "";
        else
          return results[1];}
    
    var referrer1_paramPre = gup( 'referrer1' );
    
    var userReferrerSearchTermPre = 'N/A';
    
    var IsCookieRequired = 'yes';
    
    }
    // Option 3
    // Absolutely Direct Visitor
    //else if ((document.referrer == "undefined") || (!document.referrer) || (document.referrer == "") || (window.location.href.indexOf('referrer1') < 0)) {
    else if ((document.referrer == "undefined") || (!document.referrer) || (document.referrer == "")) {
    
    document.write('Condition 3 Activated!');
    document.write('<br>');
    
    var referrer1_paramPre = '';
    
    var userReferrerSearchTermPre = '';
    
    var IsCookieRequired = 'no';
    
    }
    // Option 4
    // User is referred from Google
    else if (userReferrerDomain.indexOf('google') > -1 ) {
    
    document.write('Condition 4 Activated!');
    document.write('<br>');
    
    var referrer1_paramPre = userReferrerDomain;
    
    var userReferrerSearchTermPre = parseUri(document.referrer).queryKey.q;
    
    var IsCookieRequired = 'yes';
    
    }
    // Option 5
    // User is referred from Bing
    else if (userReferrerDomain.indexOf('bing') > -1 ) {
    
    document.write('Condition 5 Activated!');
    document.write('<br>');
    
    var referrer1_paramPre = userReferrerDomain;
    
    var userReferrerSearchTermPre = parseUri(document.referrer).queryKey.q;
    
    var IsCookieRequired = 'yes';
    
    }
    // Option 6
    // User is referred from Yahoo
    else if (userReferrerDomain.indexOf('yahoo') > -1 ) {
    
    document.write('Condition 6 Activated!');
    document.write('<br>');
    
    var referrer1_paramPre = userReferrerDomain;
    
    var userReferrerSearchTermPre = parseUri(document.referrer).queryKey.p;
    
    var IsCookieRequired = 'yes';
    
    }
    // Option 7
    // User is referred from any other Site.
    else {
    
    document.write('Condition 7 Activated!');
    document.write('<br>');
    
    var referrer1_paramPre = userReferrerDomain;
    
    var userReferrerSearchTermPre = parseUri(document.referrer).relative;
    
    var IsCookieRequired = 'yes';
    
    }
    // decodeURIComponent decodes every ASCII
    // character in the URI except the + sign.
    // So, in the end we use the magic of
    // .replace(/\+/g, " ") which removes the
    // + sign throughout the string.
    document.write('Search Term:');
    document.write('<br>');
    var userReferrerSearchTerm = decodeURIComponent(userReferrerSearchTermPre).replace(/\+/g, " ");
    document.write(userReferrerSearchTerm);
    document.write('<br>');
    document.write('<br>');
    document.write('referrer1_param:');
    document.write('<br>');
    var referrer1_param = referrer1_paramPre;
    document.write(referrer1_param);
    document.write('<br>');
    document.write('<br>');
    document.write('IsCookieRequired:');
    document.write('<br>');
    document.write(IsCookieRequired);
    
    // Combine all VARs into one combined
    // Cookie value in order to be able
    // to store it all in one cookie.
    var CookieValuesCombined = ',,'+referrer1_param+',,'+userReferrerDomain+',,'+userReferrerSearchTerm+',,'; 
    
    
    function Set_Cookie( name, value, expires, path, domain, secure )
    {
    // set time, it's in milliseconds
    var today = new Date();
    today.setTime( today.getTime() );
    
    /*
    if the expires variable is set, make the correct
    expires time, the current script below will set
    it for x number of days, to make it for hours,
    delete * 24, for minutes, delete * 60 * 24
    */
    if ( expires )
    {
    expires = expires * 1000 * 60 * 60 * 24;
    }
    var expires_date = new Date( today.getTime() + (expires) );
    
    document.cookie = name + "=" +escape( value ) +
    ( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
    ( ( path ) ? ";path=" + path : "" ) +
    ( ( domain ) ? ";domain=" + domain : "" ) +
    ( ( secure ) ? ";secure" : "" );
    }
    
    
    // this fixes an issue with the old method, ambiguous values
    // with this test document.cookie.indexOf( name + "=" );
    function Get_Cookie( check_name ) {
    	// first we'll split this cookie up into name/value pairs
    	// note: document.cookie only returns name=value, not the other components
    	var a_all_cookies = document.cookie.split( ';' );
    	var a_temp_cookie = '';
    	var cookie_name = '';
    	var cookie_value = '';
    	var b_cookie_found = false; // set boolean t/f default f
    
    	for ( i = 0; i < a_all_cookies.length; i++ )
    	{
    		// now we'll split apart each name=value pair
    		a_temp_cookie = a_all_cookies[i].split( '=' );
    
    
    		// and trim left/right whitespace while we're at it
    		cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');
    
    		// if the extracted name matches passed check_name
    		if ( cookie_name == check_name )
    		{
    			b_cookie_found = true;
    			// we need to handle case where cookie has no value but exists (no = sign, that is):
    			if ( a_temp_cookie.length > 1 )
    			{
    				cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g, '') );
    			}
    			// note that in cases where cookie is initialized but no value, null is returned
    			return cookie_value;
    			break;
    		}
    		a_temp_cookie = null;
    		cookie_name = '';
    	}
    	if ( !b_cookie_found )
    	{
    		return null;
    	}
    }
    
    
    // this deletes the cookie when called
    function Delete_Cookie( name, path, domain ) {
    if ( Get_Cookie( name ) ) document.cookie = name + "=" +
    ( ( path ) ? ";path=" + path : "") +
    ( ( domain ) ? ";domain=" + domain : "" ) +
    ";expires=Thu, 01-Jan-1970 00:00:01 GMT";
    }
    
    
    // remember, these are the possible parameters for Set_Cookie:
    // name, value, expires, path, domain, secure
    if ( IsCookieRequired == 'yes' )
    {
    Set_Cookie( 'refcookie', CookieValuesCombined, '365', '/', '', '' );
    }
    else {}
    
    
    function WriteiFrameURL () { 
    var iFrameLocation = "refcount.php?referrer1_param="+referrer1_param+"&userReferrerDomain="+userReferrerDomain+"&userReferrerSearchTerm="+userReferrerSearchTerm; 
    document.write('<iframe src="' + iFrameLocation + '" name="test_referrer_counter" id="test_referrer_counter" width="5" height="5"  frameborder="0" allowTransparency="true">'); 
    } 
    //////////////////////////////////////////////////////////////////
    // Learnt the hard way, that unlike PHP, JavaScripts can't have //
    // same function names in If-Then-Else Statements. So have to   //
    // convert the Function to a VAR                                //
    //////////////////////////////////////////////////////////////////
    var WriteiFrameURL = WriteiFrameURL (); 
    
    ReservationURL = function ReservationURL () { 
    location.href = "https://www.domain.tld/file.php?referrer3="+referrer1_param+"&userReferrerDomain="+userReferrerDomain+"&userReferrerSearchTerm="+userReferrerSearchTerm; 
    }
    
    OnlineDepositURL = function OnlineDepositURL () { 
    location.href = "https://www.domain.tld/file.php?referrer3="+referrer1_param+"&userReferrerDomain="+userReferrerDomain+"&userReferrerSearchTerm="+userReferrerSearchTerm; 
    }
    
    }
    
    //////////////////////////////////////////////////////////////////
    // But if a Cookie already exist with some value in it, then    //
    // do nothing as shown below.                                   //
    //////////////////////////////////////////////////////////////////
    else {
    var Pre_Existing_Cookie_Value = Do_Cookie_Check( 'refcookie' );
    
    
    document.write('Pre_Existing_Cookie_Values :');
    document.write('<br>');
    var Pre_Existing_Cookie_Value_Final = Pre_Existing_Cookie_Value.split( ',,' );
    var Pre_Existing_Cookie_Value_referrer1_param = Pre_Existing_Cookie_Value_Final[1];
    var Pre_Existing_Cookie_Value_userReferrerDomain = Pre_Existing_Cookie_Value_Final[2];
    var Pre_Existing_Cookie_Value_userReferrerSearchTerm = Pre_Existing_Cookie_Value_Final[3];
    document.write(Pre_Existing_Cookie_Value_referrer1_param);
    document.write('<br>');
    document.write(Pre_Existing_Cookie_Value_userReferrerDomain);
    document.write('<br>');
    document.write(Pre_Existing_Cookie_Value_userReferrerSearchTerm);
    
    
    function WriteiFrameURL2 () { 
    var iFrameLocation = "refcount.php?referrer1_param="+Pre_Existing_Cookie_Value_referrer1_param+"&userReferrerDomain="+Pre_Existing_Cookie_Value_userReferrerDomain+"&userReferrerSearchTerm="+Pre_Existing_Cookie_Value_userReferrerSearchTerm; 
    document.write('<iframe src="' + iFrameLocation + '" name="test_referrer_counter" id="test_referrer_counter" width="20" height="20"  frameborder="0" allowTransparency="true">'); 
    } 
    var WriteiFrameURL = WriteiFrameURL2 (); 
    
    ReservationURL = function ReservationURL () { 
    location.href = "https://www.domain.tld/file.php?referrer3="+Pre_Existing_Cookie_Value_referrer1_param+"&userReferrerDomain="+Pre_Existing_Cookie_Value_userReferrerDomain+"&userReferrerSearchTerm="+Pre_Existing_Cookie_Value_userReferrerSearchTerm; 
    }
    
    OnlineDepositURL = function OnlineDepositURL () { 
    location.href = "https://www.domain.tld/file.php?referrer3="+Pre_Existing_Cookie_Value_referrer1_param+"&userReferrerDomain="+Pre_Existing_Cookie_Value_userReferrerDomain+"&userReferrerSearchTerm="+Pre_Existing_Cookie_Value_userReferrerSearchTerm; 
    }
    
    }
  18. #10
  19. No Profile Picture
    Super Moderator
    Devshed Specialist (4000 - 4499 posts)

    Join Date
    Jul 2003
    Posts
    4,008
    Rep Power
    2791
    You are splitting the domain and not ensuring that the domain split as expected before referencing the third index of the array.

    I put this in and the third conditional triggers as expected.
    Javascript Code:
    var userReferrerDomain = (pathArray[2]) ? pathArray[2] : 'default';
    [PHP] | [Perl] | [Python] | [Java] != [JavaScript] | [XML] | [ANSI C] | [C++] | [LUA] | [MySQL] | [FirebirdSQL] | [PostgreSQL] | [HTML] | [XHTML] | [CSS]

    W3Fools - A W3Schools Intervention.
  20. #11
  21. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2010
    Posts
    19
    Rep Power
    0
    Originally Posted by Winters
    You are splitting the domain and not ensuring that the domain split as expected before referencing the third index of the array.

    I put this in and the third conditional triggers as expected.
    Javascript Code:
    var userReferrerDomain = (pathArray[2]) ? pathArray[2] : 'default';
    Wow! It does work! Thank you very much.
    But can you please explain me what is 'default' for?
  22. #12
  23. No Profile Picture
    Super Moderator
    Devshed Specialist (4000 - 4499 posts)

    Join Date
    Jul 2003
    Posts
    4,008
    Rep Power
    2791
    You split the domain name into an array called 'pathArray'. If there is no referring domain, your script is still trying to split it into it's component pieces and then assign part of it to the variable 'userReferrerDomain'. This was causing your script to throw a tantrum.

    Javascript Code:
    var userReferrerDomain = ('Is There A Referring Domain') ? 'Yes, assign the domain name' : 'No, use a default name for the domain name';
    [PHP] | [Perl] | [Python] | [Java] != [JavaScript] | [XML] | [ANSI C] | [C++] | [LUA] | [MySQL] | [FirebirdSQL] | [PostgreSQL] | [HTML] | [XHTML] | [CSS]

    W3Fools - A W3Schools Intervention.
  24. #13
  25. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2010
    Posts
    19
    Rep Power
    0
    Originally Posted by Winters
    You split the domain name into an array called 'pathArray'. If there is no referring domain, your script is still trying to split it into it's component pieces and then assign part of it to the variable 'userReferrerDomain'. This was causing your script to throw a tantrum.

    Javascript Code:
    var userReferrerDomain = ('Is There A Referring Domain') ? 'Yes, assign the domain name' : 'No, use a default name for the domain name';
    Ok Winters, this explanation in "idiot proof" language made much more sense to a dummy like me! Thank you.
    One final question please:
    Can I use
    ''
    or
    'undefined'
    instead of 'default'?

    Thank you indeed.
  26. #14
  27. No Profile Picture
    Super Moderator
    Devshed Specialist (4000 - 4499 posts)

    Join Date
    Jul 2003
    Posts
    4,008
    Rep Power
    2791
    You can use whatever you prefer for the string.
    [PHP] | [Perl] | [Python] | [Java] != [JavaScript] | [XML] | [ANSI C] | [C++] | [LUA] | [MySQL] | [FirebirdSQL] | [PostgreSQL] | [HTML] | [XHTML] | [CSS]

    W3Fools - A W3Schools Intervention.

IMN logo majestic logo threadwatch logo seochat tools logo