//--- URL encoding helpers
var Url = {

    // public method for url encoding
    encode : function (string) {
        return escape(this._utf8_encode(string));
    },

    // public method for url decoding
    decode : function (string) {
        return this._utf8_decode(unescape(string));
    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}

//--- this flag controls, if the url parameters shall be URL encopded
//--- Set this flag to true if the connector uses the URL mapping 
//--- with a native portal URL for accessing the liveserver content iView
//--- Set this flag to false if the connector uses the URL mapping 
//--- with a pcd: URL for accessing the liveserver content iView
var urlParamsPatch = false;

//--- get connector URL from plain content URL
function getConnectorUrl(url, connectorId) {
	if (url.length > 0) {
		return ('XMLNAVURL' + connectorId + '://' + url);
	}
	return(url);
}

//--- navigate to node that has the given launch url (on specified connector)
//--- and show the page with the provided url
function portalNavigateUrl(url, connectorId) {
	portalNavigateUrlWithContext(url, '', connectorId);
}

//--- navigate to node that has the given contextUrl (on specified connector)
//--- and show the page with the provided url. The parameter winmode can be used
//--- to control the target window:
//--- 	 mode 0 for internal window,
//--- 	 mode 1 for external window with content,
//--- 	 mode 2 for external window with full navigation 
function portalNavigateUrlWithContext(url, contextUrl, connectorId, winmode) {
	//alert('portalNavigateUrlWithContext url=' +url);
	
	//--- check if url contains parameters
	if (urlParamsPatch && url.indexOf("?") != -1 && (contextUrl === undefined || contextUrl == "")) {
		contextUrl = url.substring(0, url.indexOf("?"));
		url = Url.encode(url);
	}
	
	if (connectorId === undefined) {
    	connectorId = "1";
  	}
  	if (winmode === undefined) {
    	winmode = 0;
  	}
  	
  	if (winmode == 3) {
  		top.document.location = "/irj/portal?NavigationTarget=" + escape(getConnectorUrl(url, connectorId))
  								+ "&NavigationContext=" + escape(getConnectorUrl(contextUrl, connectorId));
  	} else {
  		var postArray = new Array();
		//alert('parent.EPCM.doNavigate(' + getConnectorUrl(url, connectorId) + ', ' + winmode + ', ' + getConnectorUrl(contextUrl, connectorId) + ', postArray=' + postArray + ')');
		//parent.EPCM.doNavigate(getConnectorUrl(url, connectorId), winmode, '', '', '', '', getConnectorUrl(contextUrl, connectorId), postArray);
		EPCM.relaxDocumentDomain();
		EPCM.doNavigate(getConnectorUrl(url, connectorId), winmode, '', '', '', '', getConnectorUrl(contextUrl, connectorId), postArray);
	}
}

//--- relax document domain
function relaxDocumentDomain () {
	if (!document.domain.search(/^\d+\.\d+\.\d+\.\d+$/) >=0 ) {
		var lnDotPos = document.domain.indexOf( "." );
 		if (lnDotPos >= 0) {
 			document.domain = document.domain.substr( lnDotPos + 1 );
 		}
 	}
}
relaxDocumentDomain();



