if(typeof tws_Global == 'undefined' || typeof tws_Global === null) {
	var tws_Global = {
		loaded: [],
		callbacks: [],
		
		scriptLoaded: function(objName)
		{
			tws_Global.loaded.push(objName);
			setTimeout("tws_Global.runCallbacks()",1);
		},
		
		runCallbacks: function()
		{
			for(var i =0 ; i < tws_Global.callbacks.length; i++)
			{
				if(tws_Global.callbacks[i] !== true)
				{
					try
					{
						tws_Global.callbacks[i]();
						tws_Global.callbacks[i] = true;
					}
					catch(e)
					{
						try { console.log(e); } catch(e) {}
					}
				}
			}
		},
		
		setCallback: function(func)
		{
			try
			{
				if(!func())
				{
					tws_Global.callbacks.push(func);
				}
			}
			catch(e)
			{
				tws_Global.callbacks.push(func);
			}
		}
	}
};

var tws_GEO =
{
    baseURL : "http://geo.tibaco.net/",
	cookieName	: "tws_GEO",
	doc	: null,
	xml : null,
	
	setSiteID: function(siteID)
    {
    	tws_Global.siteID = siteID;
    },
	
    getData: function() {
    	if(!this._readCookie('tws_geo')) {
            var script = document.createElement('script');
            script.id = 'tws_geo';
            script.src = this.baseURL + 'locateip?output=js';
            script.type = 'text/javascript';
            document.getElementsByTagName("head")[0].appendChild(script);
    	} else {
    		this.xml = this._readCookie('tws_geo');
    	}
    },

	getIPAddress: function() {
		if (this._setData()) {
            ip = this.doc.getElementsByTagName("geo")[0].getAttribute("ip");
        }
        if(typeof ip != 'undefined') {
        	return ip;
        }
        return null;
	},

	getRegionCode: function() {
		if (this._setData()) {
            code = this.doc.getElementsByTagName("region")[0].getAttribute("code");
        }
        if(typeof code != 'undefined') {
        	return code;
        }
        return null;
	},

	getAreaName: function() {
		if (this._setData()) {
            area = this.doc.getElementsByTagName("area")[0].getAttribute("code");
        }
        if(typeof area != 'undefined') {
        	return area;
        }
        return null;
	},

	getCountryCode: function() {
		if (this._setData()) {
            country = this.doc.getElementsByTagName("country")[0].getAttribute("code");
        }
        if(typeof country != 'undefined') {
        	return country;
        }
        return null;
	},

	getCountryName: function() {
		if (this._setData()) {
            country = this.doc.getElementsByTagName("country")[0].nodeValue;
        }
        if(typeof country != 'undefined') {
        	return country;
        }
        return null;
	},

	getCityName: function() {
		if (this._setData()) {
            city = this.doc.getElementsByTagName("city")[0].nodeValue;
        }
        if(typeof city != 'undefined') {
        	return city;
        }
        return null;
	},

	getContinentCode: function() {
		if (this._setData()) {
            if(this.doc.getElementsByTagName("continent")[0])
            	continent = this.doc.getElementsByTagName("continent")[0].getAttribute('code');
        }
        if(typeof continent != 'undefined') {
        	return continent;
        }
        return null;
	},

	getLongitude: function() {
		if (this._setData()) {
            longitude = this.doc.getElementsByTagName("longitude")[0].nodeValue;
        }
        if(typeof longitude != 'undefined') {
        	return longitude;
        }
        return null;
	},

	getLatitude: function() {
		if (this._setData()) {
            latitude = this.doc.getElementsByTagName("latitude")[0].nodeValue;
        }
        if(typeof latitude != 'undefined') {
        	return latitude;
        }
        return null;
	},
	
	getSiteOrder: function() {	
		var country		= "";
		var continent	= "";
		var prefs		= [];
		if (this._setData()) {
            country = this.doc.getElementsByTagName("country")[0].getAttribute("code");
            if(this.doc.getElementsByTagName("continent")[0])
            	continent = this.doc.getElementsByTagName("continent")[0].getAttribute('code');
        }
        switch(country)
        {   // Backup domains: 105 - eu, 110 - biz, 112 - asia
        	case 'NL': prefs = [101,105,110]; break;
        	case 'BE': prefs = [102,101,105,110]; break;
        	case 'FR': prefs = [103,105,110]; break;
        	case 'DE': prefs = [105,128,110]; break;
        	case 'SE': prefs = [108,105,110]; break;
        	case 'US': prefs = [109,110,105]; break;
        	case 'CN': prefs = [113,112,110]; break;
        	case 'JP': prefs = [114,112,110]; break;
        	case 'KR': prefs = [115,112,110]; break;
        	case 'IR': prefs = [116,105,110]; break;
        	case 'VN': prefs = [117,112,110]; break;
        	case 'BR': prefs = [118,136,110,105]; break;
        	case 'CO': prefs = [119,122,110,105]; break;
        	case 'RU': prefs = [120,105,110]; break;
        	case 'IT': prefs = [121,105,110]; break;
			case 'ES': prefs = [122,105,110]; break;
        	case 'IN': prefs = [123,112,110]; break;
        	case 'PH': prefs = [124,112,110]; break;
        	case 'PK': prefs = [125,112,110]; break;
        	case 'FI': prefs = [126,105,110]; break;
        	case 'LT': prefs = [127,105,110]; break;
        	case 'AT': prefs = [128,105,110]; break;
        	case 'DK': prefs = [129,105,110]; break;
        	case 'MX': prefs = [130,122,110,105]; break;
        	case 'ID': prefs = [131,112,110]; break;
        	case 'GR': prefs = [132,105,110]; break;
        	case 'NO': prefs = [133,105,110]; break;
        	case 'IE': prefs = [134,105,110]; break;
        	case 'HU': prefs = [135,105,110]; break;
        	case 'PT': prefs = [136,105,110]; break;
        	default	 :
        		switch(continent)
        		{
        			case 'EU': case 'AF': prefs = [105,110,112]; break;
        			case 'AS': case 'OC': prefs = [112,110,105]; break;
        			default: prefs = [110,105,112]; break;
        		}
        		break;
        }
        for(var i = 101; i <= 136; i++)
        {
        	if(i == 104) continue; // Site ID 104 does not exist yet
        	if(!this._inArray(i,prefs)) prefs.push(i);
        }
        
        return prefs;
	},

	_inArray: function (needle, haystack, field)
	{
	    if (needle == null || haystack == null || !(typeof haystack == "object" && haystack.length))
	    {
	        return false;
	    }
	
	    for (var i = 0; i < haystack.length; i++)
	    {
	        if (haystack[i] == needle) return true;
	        if (typeof field != "undefined" && field && typeof eval("haystack[i]." + field) != "undefined")
	        {
	            if (eval("haystack[i]." + field) == needle) return true;
	        }
	    }
	    return false;
	},

	_setData: function() {
		if (!this._readCookie('tws_geo') && this.xml != null)
			this._createCookie('tws_geo',this.xml);
		if (this.doc != null) {
			return true;
		} else if (this.doc == null && this.xml != null) {
			this.doc = this._stringToXML(this.xml);
			if(this.doc) {
				return true;
			}
		}

		return false;
    },

    _createCookie: function(name,value) {
		document.cookie = name+"="+value+"; path=/";
	},

	_readCookie: function(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	},

	_stringToXML: function(string)
    {
        var xmlDoc;
        if (window.ActiveXObject)
        {
            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.loadXML(string);
        }
        else if (document.implementation && document.implementation.createDocument)
        {
            var domParser = new DOMParser();
            xmlDoc = domParser.parseFromString(string, 'application/xml');
        }
        return xmlDoc;
    },
    
    loaded: tws_Global.scriptLoaded('tws_GEO')

};

tws_GEO.getData();
