public function GetPropertyEditorUrl($courseId, $stylesheetUrl, $notificationFrameUrl = null)
 {
     // The local parameter map just contains method methodParameters.  We'll
     // now create a complete parameter map that contains the web-service
     // params as well the actual method params.
     $request = new ServiceRequest($this->_configuration);
     $parameterMap = array('action' => 'properties.view');
     $parameterMap['package'] = 'AppId|' . $this->_configuration->getAppId() . '!PackageId|' . $courseId;
     $parameterMap['appid'] = $this->_configuration->getAppId();
     $parameterMap['ts'] = gmdate("YmdHis");
     if (isset($notificationFrameUrl)) {
         $parameterMap['notificationframesrc'] = $notificationFrameUrl;
     }
     if (isset($stylesheetUrl)) {
         $parameterMap['stylesheet'] = $stylesheetUrl;
     }
     // Construct the url, concatonate all parameters as query string parameters
     $url = $this->_configuration->getScormEngineServiceUrl() . "/widget";
     //$cnt = 0;
     //foreach ($parameterMap as $key => $value)
     //{
     // Create a query string with URL-encoded values
     //    $url .= ($cnt++ == 0 ? "?" : "&").$key."=".$parameterMap[$key];
     //}
     $url .= '?' . $request->signParams($this->_configuration->getSecurityKey(), $parameterMap);
     //if (url.Length > 2000)
     //    throw new ApplicationException("URL > 2000 bytes");
     return $url;
 }