Location: PHPKode > projects > MySonar > mysonar-gui-1.0/model-1.0.php
<?php
/**
 * mySonar GUI - Version 1.0
 * mySonar (reachable under mySonar.de) is a platform for Location Based Mobile Networking. 
 * Users can find friends, flirts, partys and places arround by uses their mobile devices.
 * The application has several components. One of the components is the graphical user interface 
 * to access a XML Web Service layer, the services, kernel and database behind. This source file
 * belongs to that component.
 * 
 * Copyright (C) 2008 mySonar GbR, Markus Heussen
 * 
 * This program is free software; you can redistribute it and/or modify it under the terms of the 
 * GNU General Public License as published by the Free Software Foundation; only GPLv2.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along with this program; 
 * if not, see <http://www.gnu.org/licenses/>.
 */

defined("ACCESS") or die("Direct access to this resource is not allowed.");
session_start();

class Model {
	var $Client;
	var $MySonar;
	
	public function __construct($MySonar) {
		$this->MySonar = $MySonar;
		ini_set("soap.wsdl_cache_enabled", $this->MySonar->getProperty("wsdlcache"));
		try {
			$this->Client = new SoapClient($this->MySonar->getProperty("wsdl"), array("encoding" => $this->MySonar->getProperty("encoding")));
		} catch (Exception $e) {
			echo "Es ist ein fataler Fehler aufgetreten.";
		}
	}
		
	public function goto($URL) {
		header("Location: ".$URL);
	}
				
	public function getMobileDevice($HttpUserAgent) {
		$Security = new Security();
		$Security->APIKey = ($_SESSION["APIKey"]!="" ? $_SESSION["APIKey"]:$this->MySonar->getProperty("apikey"));
		$Metadata = new Metadata();
		$Metadata->HttpUserAgent = $HttpUserAgent;
		// request
		$getMobileDevice = new getMobileDevice();
		$getMobileDevice->Request->Security = $Security;
		$getMobileDevice->Request->Metadata = $Metadata;
		// call
		try {
			$getMobileDeviceResponse = $this->Client->getMobileDevice($getMobileDevice);
			$MobileDeviceID = $getMobileDeviceResponse->Response->Metadata->MobileDeviceID;
			return ($MobileDeviceID!="" ? $MobileDeviceID:null);
		} catch (Exception $fault) {
			return null;
		}
	}
	
	public function login($username, $password) {
		$Security = new Security();
		$Security->APIKey = ($_SESSION["APIKey"]!="" ? $_SESSION["APIKey"]:$this->MySonar->getProperty("apikey"));
		$Security->Username = $username;
		$Security->Password = $password;
		// request
		$login = new login();
		$login->Request->Security = $Security;
		// call
		try {
			$loginResponse = $this->Client->login($login);
			$_SESSION["Security"] = $loginResponse->Response->Security;
			$_SESSION["User"] = $loginResponse->Response->User;
			$_SESSION["Location"] = $loginResponse->Response->Location;
			$_SESSION["Picture"] = $loginResponse->Response->Picture;
			$_SESSION["SonarPreferences"] = $loginResponse->Response->SonarPreferences;
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}

	public function getNewPassword($Username, $MobilePhoneNumber, $Birth) {
		$Security = new Security();
		$Security->APIKey = ($_SESSION["APIKey"]!="" ? $_SESSION["APIKey"]:$this->MySonar->getProperty("apikey"));
		// request
		$getNewPassword = new getNewPassword();
		$getNewPassword->Request->Security = $Security;
		$getNewPassword->Request->User->Username = $Username;
		$getNewPassword->Request->User->MobilePhoneNumber = $MobilePhoneNumber;
		$getNewPassword->Request->User->Birth = $Birth;
		// call
		try {
			$getNewPasswordResponse = $this->Client->getNewPassword($getNewPassword);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}	
	
	public function logout() {
		// request
		$logout = new logout();
		$logout->Request->Security = $_SESSION["Security"];
		$APIKey = $_SESSION["Security"]->APIKey; // dont loose the apikey because it may be one of a partner (and not the default)
		$WirelessDevice = $_SESSION["WirelessDevice"]; // dont loose the apikey because it may be one of a partner (and not the default)
		try {
			$logoutResponse = $this->Client->logout($logout);
			session_destroy();
			unset($this->Client);
			session_start();
			$_SESSION["APIKey"] = $APIKey; // set api key because it may be one of a partner different to the default api key of mysonar.de
			$_SESSION["WirelessDevice"] = $WirelessDevice; // set api key because it may be one of a partner different to the default api key of mysonar.de
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function createUser($User, $Code=null) {
		$Security = new Security();
		$Security->APIKey = $this->MySonar->getProperty("apikey");
		$Security->Username = $User->Username;
		$Security->Password = $User->Password;
		$Coupon = new Coupon();
		$Coupon->Type = "SONAR"; // $onar notes to be registered
		$Coupon->Code = $Code;
		if ($User->Birth!="") $User->Birth = substr($_GET["Birth"],4)."-".substr($_GET["Birth"],2,2)."-".substr($_GET["Birth"],0,2);
		// request
		$createUser = new createUser();
		$createUser->Request->Security = $Security;
		$createUser->Request->User = $User;
		$createUser->Request->Coupon = $Coupon;
		try {
			$createUserResponse = $this->Client->createUser($createUser);
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}				
	}
	
	public function sendPing($query, $start, $limit, $profile="DEFAULT") {
		$Options = new Options();
		$Options->Profile = $profile;
		$Options->StartIndex = $start;
		$Options->Limit = $limit;
		// request
		$sendPing = new sendPing();
		$sendPing->Request->Security = $_SESSION["Security"];
		$sendPing->Request->Options = $Options;
		if ($profile=="DEFAULT") {
			$sendPing->Request->Location->Address = $query;
			$sendPing->Request->Location->CountryCode = "DE";
		} else $sendPing->Request->Query = $query; 
		try {
			$sendPingResponse = $this->Client->sendPing($sendPing);
			$Options = $sendPingResponse->Response->Options;
			$_SESSION["Location"] = $sendPingResponse->Response->Location;
			$list = $sendPingResponse->Response->Object;
			if (is_object($list)) { $list = array($list); }
			$resultset = array("Options" => $Options, "Objects" => $list);
			return $resultset;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function getMap($locations, $lid, $zoom, $start, $limit, $address, $type="DEFAULT") {
		$l = explode(",", $locations, 50);
		$list = array();
		$i=0;
		while ($i<=(count($l)-1)) {
			$Location = new Location();
			$Location->ID = $l[$i];
			$list[$i] = new Object();
			$list[$i]->Location = $Location;
			$i++;
		}
		$Map = new Map();
		if ($zoom) $Map->Zoom = $zoom;
		if ($lid>0) $Map->Focus = $lid;
		$Map->Type = $type;
		$getMap = new getMap();
		$getMap->Request->Security = $_SESSION["Security"];
		$getMap->Request->Map = $Map;
		$getMap->Request->Object = $list;
		try {
			$getMapResponse = $this->Client->getMap($getMap);
			$Map = $getMapResponse->Response->Map;
			$Objects = $getMapResponse->Response->Object;
			$Image = base64_decode($Map->Image);
			switch ($Map->MimeType) {
				case "image/jpeg": $suffix = ".jpg"; break;
				case "image/gif": $suffix = ".gif"; break;
				case "image/png": $suffix = ".png"; break;
				case "image/x-png": $suffix = ".png"; break;
			}
			$Filename = $Map->Filename;
			$handle = fopen($this->MySonar->getProperty("tempdir").$Filename, "w");
			$bytes = fwrite($handle, $Image);
			fclose($handle);
			return array($Map, $Objects);
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
	
	public function getProfile($user = null, $thumb = true) {
		$result = array();
		$username = ($user!=null ? $user:$_SESSION["User"]->Username);
		$getProfile = new getProfile();
		$getProfile->Request->Security = $_SESSION["Security"];
		$getProfile->Request->User->Username = $username;
		try {
			$getProfileResponse = $this->Client->getProfile($getProfile);
			$User = $getProfileResponse->Response->User;
			$Location = $getProfileResponse->Response->Location;
			$result[0] = $User;
			$Pictures = $getProfileResponse->Response->Picture;
			if ($Pictures!=null) {
				if (is_object($Pictures)) $Pictures = array($Pictures);
				foreach ($Pictures as $Picture) {
					if ($Picture->Data!=null && $Picture->Thumbnail==$thumb) {
						$Image = base64_decode($Picture->Data);
						$handle = fopen($this->MySonar->getProperty("tempdir").$Picture->Filename, "w");
						$bytes = fwrite($handle, $Image);
						fclose($handle);
					}
				}
				$result[1] = $Pictures;
			} else $result[1] = null;
			$result[2] = $Location;
			return $result; // index 0 = User, index 1 = Pictures (small and thumbnail)
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
	
	public function getSonarPreferences() {
		$getSonarPreferences = new getSonarPreferences();
		$getSonarPreferences->Request->Security = $_SESSION["Security"];
		try {
			$getSonarPreferencesResponse = $this->Client->getSonarPreferences($getSonarPreferences);
			$SonarPreferences = $getSonarPreferencesResponse->Response->SonarPreferences;
			return $SonarPreferences;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
	
	public function confirmUser($code) {
		$confirmUser = new confirmUser();
		$confirmUser->Request->Security = $_SESSION["Security"];
		$confirmUser->Request->Security->Password = $code; 
		try {
			$confirmUserResponse = $this->Client->confirmUser($confirmUser);
			$_SESSION["User"] = $confirmUserResponse->Response->User;
			return $_SESSION["User"];
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
	
	public function updateSonarPreferences($preferences) {
		$updateSonarPreferences = new updateSonarPreferences();
		$updateSonarPreferences->Request->Security = $_SESSION["Security"];
		$updateSonarPreferences->Request->SonarPreferences = $preferences;
		try {
			$updateSonarPreferencesResponse = $this->Client->updateSonarPreferences($updateSonarPreferences);
			$SonarPreferences = $updateSonarPreferencesResponse->Response->SonarPreferences;
			$_SESSION["SonarPreferences"] = $SonarPreferences;
			return $SonarPreferences;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
	
	public function getPicture($thumbnail = false) {
		try {
			$getPicture = new getPicture();
			$getPicture->Request->Security = $_SESSION["Security"];
			$getPictureResponse = $this->Client->getPicture($getPicture);
			$Pictures = $getPictureResponse->Response->Picture;
			if (is_object($Pictures)) $Pictures = array($Pictures);
			foreach ($Pictures as $Picture) {
				if ($Picture->Thumbnail==$thumbnail) {
					$filename = $this->MySonar->getProperty("tempdir").$Picture->Filename;
					$handle = fopen($filename, "w");
					$bytes = fwrite($handle, base64_decode($Picture->Data));
					fclose($handle);
					return $Picture;
				}
			}
			return $Pictures[0]; // return first picture
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
	
	public function setPicture($file) {
		$SonarErrors = new SonarErrors();
		if (!$file["Data"]) $SonarErrors->addError(906, "No image found.");
		else {
			set_time_limit(0); // deactivate timeout because of slow upload by mobile
			switch($file["Data"]["error"]) {
				case 1 : $SonarErrors->addError(901, "Image size to large for server."); break; // max. php.ini
				case 2 : $SonarErrors->addError(902, "Image size to large for programm."); break; // max. 250 kb
				case 3 : $SonarErrors->addError(903, "File only partly loaded."); break; 
				case 4 : $SonarErrors->addError(904, "Could not load file"); break;
				case 6 : $SonarErrors->addError(900, "Internal client error."); break; // tmp directory missing on server
				case 7 : $SonarErrors->addError(900, "Internal client error."); break; // could not save file to harddisc
				case 8 : $SonarErrors->addError(905, "Loading cancelled."); break; // uploading interrupted
			}
			if ($file["Data"]["type"]!="image/jpeg" && 
				$file["Data"]["type"]!="image/jp2" && 
				$file["Data"]["type"]!="image/jpx" && 
				$file["Data"]["type"]!="image/pjpeg" && 
				$file["Data"]["type"]!="image/jpg" && 
				$file["Data"]["type"]!="image/gif" && 
				$file["Data"]["type"]!="image/png" && 
				$file["Data"]["type"]!="image/x-png") $SonarErrors->addError(907, "File type not supported: ".$file["Data"]["type"]);
		}
		if ($SonarErrors->hasErrors()) return $SonarErrors;
		else {
			switch ($file["Data"]["type"]) {
				case "image/jp2": $suffix = ".jpg"; break;
				case "image/jpx": $suffix = ".jpg"; break;
				case "image/pjpeg": $suffix = ".jpg"; break;
				case "image/jpeg": $suffix = ".jpg"; break;
				case "image/jpg": $suffix = ".jpg"; break;
				case "image/gif": $suffix = ".gif"; break;
				case "image/png": $suffix = ".png"; break;
				case "image/x-png": $suffix = ".png"; break;
				default: $suffix = ".pic"; break;
			}
			$filename = $_SESSION["Security"]->Token."_".time().$suffix;
			// move file to client-tmp folder
			if (move_uploaded_file($file["Data"]["tmp_name"], $this->MySonar->getProperty("uploaddir").$filename)) {
				// get file
				$handle = fopen($this->MySonar->getProperty("uploaddir").$filename, 'rb');
				$size = filesize($this->MySonar->getProperty("uploaddir").$filename);
				$buffer = fread($handle, $size);
				fclose($handle);
				$ImageData = base64_encode($buffer);
				// create picture
				$Picture = new Picture();
				$Picture->Data = $ImageData;
				$Picture->MimeType = $file["Data"]["type"];
				// call sonar server
				$setPicture = new setPicture();
				$setPicture->Request->Security = $_SESSION["Security"];
				$setPicture->Request->Picture = $Picture;
				unlink($this->MySonar->getProperty("uploaddir").$filename);
				try {
					$setPictureResponse = $this->Client->setPicture($setPicture);
					$Pictures = $setPictureResponse->Response->Picture;
					$_SESSION["Picture"] = $Pictures;
					return $Pictures; // returns two pictures (index 0 = small image, index 1 = thumbnail)
				} catch (Exception $fault) {
					return $this->getSonarErrors($fault);
				}
			} else return $this->getSonarErrors(900, "Internal Client error.");
		} 
	}

	public function deletePicture() {
		// request
		$deletePicture = new deletePicture();
		$deletePicture->Request->Security = $_SESSION["Security"];
		try {
			$deletePictureResponse = $this->Client->deletePicture($deletePicture);
			$_SESSION["Picture"] = null;
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function updateUser($user, $option) {
		switch ($option) {
			case "Birth": if ($user->Birth=="") return $this->getSonarErrors(421); break;
		}
		$updateUser = new updateUser();
		$updateUser->Request->Security = $_SESSION["Security"];
		$updateUser->Request->User = $user;
		try {
			$updateUserResponse = $this->Client->updateUser($updateUser);
			$User = $updateUserResponse->Response->User;
			$_SESSION["User"] = $User;
			return $User;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function getStatistics() {
		$getStatistics = new getStatistics();
		$getStatistics->Request->Security = $_SESSION["Security"];
		try {
			$getStatisticsResponse = $this->Client->getStatistics($getStatistics);
			$Statistics = $getStatisticsResponse->Response->Statistics;
			return $Statistics;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}	
	
	public function getTab($Options) {
		$getTab = new getTab();
		$getTab->Request->Security = $_SESSION["Security"];
		$getTab->Request->Options = $Options;
		try {
			$getTabResponse = $this->Client->getTab($getTab);
			$Statistics = $getTabResponse->Response->Statistics;
			$Modules = $getTabResponse->Response->Module;
			return array($Statistics, $Modules);
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}	
		
	public function getLastLocations() {
		// request
		$getLastLocations = new getLastLocations();
		$getLastLocations->Request->Security = $_SESSION["Security"];
		try {
			$getLastLocationsResponse = $this->Client->getLastLocations($getLastLocations);
			return $getLastLocationsResponse->Response->Location;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function setLocation($address) {
		// request
		$setLocation = new setLocation();
		$setLocation->Request->Security = $_SESSION["Security"];
		$setLocation->Request->Location->Address = $address;
		$setLocation->Request->Location->CountryCode = "DE";
		try {
			$setLocationResponse = $this->Client->setLocation($setLocation);
			$_SESSION["Location"] = $setLocationResponse->Response->Location; 
			return $_SESSION["Location"];
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}	
	
	public function sendMessage($Message) {
		$sendMessage = new sendMessage();
		$sendMessage->Request->Security = $_SESSION["Security"];
		$sendMessage->Request->Message = $Message;
		try {
			$sendMessageResponse = $this->Client->sendMessage($sendMessage);
			return $sendMessageResponse->Response->Message; 
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function getInbox() {
		$getInbox = new getInbox();
		$getInbox->Request->Security = $_SESSION["Security"];
		try {
			$getInboxResponse = $this->Client->getInbox($getInbox);
			return $getInboxResponse->Response->Message; 
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function getOutbox() {
		$getOutbox = new getOutbox();
		$getOutbox->Request->Security = $_SESSION["Security"];
		try {
			$getOutboxResponse = $this->Client->getOutbox($getOutbox);
			return $getOutboxResponse->Response->Message; 
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
		
	public function getMessage($id) {
		$getMessage = new getMessage();
		$getMessage->Request->Security = $_SESSION["Security"];
		$getMessage->Request->Message->ID = $id;
		try {
			$getMessageResponse = $this->Client->getMessage($getMessage);
			return $getMessageResponse->Response->Message;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
		
	public function deleteMessage($ID) {
		$deleteMessage = new deleteMessage();
		$deleteMessage->Request->Security = $_SESSION["Security"];
		$deleteMessage->Request->Message->ID = $ID;
		try {
			$deleteMessageResponse = $this->Client->deleteMessage($deleteMessage);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}		

	public function setPointOfInterest($Object) {
		$setPointOfInterest = new setPointOfInterest();
		$setPointOfInterest->Request->Security = $_SESSION["Security"];
		$setPointOfInterest->Request->Object = $Object;
		try {
			$setPointOfInterestResponse = $this->Client->setPointOfInterest($setPointOfInterest);
			return $setPointOfInterestResponse->Response->Object;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}	

	public function createGroup($Group) {
		$createGroup = new createGroup();
		$createGroup->Request->Security = $_SESSION["Security"];
		$createGroup->Request->Group = $Group;
		try {
			$createGroupResponse = $this->Client->createGroup($createGroup);
			return $createGroupResponse->Response->Group;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}	

	public function setArticle($Article) {
		$setArticle = new setArticle();
		$setArticle->Request->Security = $_SESSION["Security"];
		$setArticle->Request->Article = $Article;
		try {
			$setArticleResponse = $this->Client->setArticle($setArticle);
			$Article = $setArticleResponse->Response->Article;
			$Group = $setArticleResponse->Response->Group;
			return array($Article,$Group);
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}		

	public function setTopic($Article) {
		$setTopic = new setTopic();
		$setTopic->Request->Security = $_SESSION["Security"];
		$setTopic->Request->Article = $Article;
		try {
			$setTopicResponse = $this->Client->setTopic($setTopic);
			$Article = $setTopicResponse->Response->Article;
			$Group = $setTopicResponse->Response->Group;
			return array($Article,$Group);
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}

	public function updateTopic($Article) {
		$updateTopic = new updateTopic();
		$updateTopic->Request->Security = $_SESSION["Security"];
		$updateTopic->Request->Article = $Article;
		try {
			$updateTopicResponse = $this->Client->updateTopic($updateTopic);
			$Article = $updateTopicResponse->Response->Article;
			$Group = $updateTopicResponse->Response->Group;
			return array($Article,$Group);
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
			
	public function updateArticle($Article) {
		$updateArticle = new updateArticle();
		$updateArticle->Request->Security = $_SESSION["Security"];
		$updateArticle->Request->Article = $Article;
		try {
			$updateArticleResponse = $this->Client->updateArticle($updateArticle);
			$Article = $updateArticleResponse->Response->Article;
			$Group = $updateArticleResponse->Response->Group;
			return array($Article,$Group);
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
			
	public function updatePointOfInterest($Object) {
		$updatePointOfInterest = new updatePointOfInterest();
		$updatePointOfInterest->Request->Security = $_SESSION["Security"];
		$updatePointOfInterest->Request->Object = $Object;
		try {
			$updatePointOfInterestResponse = $this->Client->updatePointOfInterest($updatePointOfInterest);
			return $updatePointOfInterestResponse->Response->Object;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}	
		
	public function getTermsAndConditions() {
		$Security = new Security();
		$Security->APIKey = $this->MySonar->getProperty("apikey");
		$getTermsAndConditions = new getTermsAndConditions();
		$getTermsAndConditions->Request->Security = $Security;
		try {
			$getTermsAndConditionsResponse = $this->Client->getTermsAndConditions($getTermsAndConditions);
			return $getTermsAndConditionsResponse->Response->Terms;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}	
	
	public function checkInvitationCode($mobilephonenumber, $invitationcode) {
		$Security = new Security();
		$Security->APIKey = $this->MySonar->getProperty("apikey");
		$Security->Token = $invitationcode;
		$User = new User();
		$User->MobilePhoneNumber = $mobilephonenumber;
		$checkInvitationCode = new checkInvitationCode();
		$checkInvitationCode->Request->Security = $Security;
		$checkInvitationCode->Request->User = $User;
		try {
			$checkInvitationCodeResponse = $this->Client->checkInvitationCode($checkInvitationCode);
			$User = $checkInvitationCodeResponse->Response->User;
			return $User;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function getFriends($Username="") {
		$getFriends = new getFriends();
		$getFriends->Request->Security = $_SESSION["Security"];
		if ($Username!="") $getFriends->Request->Object->User->Username = $Username;
		try {
			$getFriendsResponse = $this->Client->getFriends($getFriends);
			return $getFriendsResponse->Response->Object;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function getFlirts() {
		$getFlirts = new getFlirts();
		$getFlirts->Request->Security = $_SESSION["Security"];
		try {
			$getFlirtsResponse = $this->Client->getFlirts($getFlirts);
			return $getFlirtsResponse->Response->Object;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function getBalance() {
		$getBalance = new getBalance();
		$getBalance->Request->Security = $_SESSION["Security"];
		try {
			$getBalanceResponse = $this->Client->getBalance($getBalance);
			return $getBalanceResponse->Response->Account;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function pay($Transaction) {
		$pay = new pay();
		$pay->Request->Security = $_SESSION["Security"];
		$pay->Request->Transaction = $Transaction;
		try {
			$payResponse = $this->Client->pay($pay);
			$resultset = array($payResponse->Response->Account, $payResponse->Response->Transaction);
			return $resultset;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function activateCoupon($Coupon) {
		$activateCoupon = new activateCoupon();
		$activateCoupon->Request->Security = $_SESSION["Security"];
		$activateCoupon->Request->Coupon = $Coupon;
		try {
			$activateCouponResponse = $this->Client->activateCoupon($activateCoupon);
			return $activateCouponResponse->Response->Coupon;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function getCoupon($Coupon) {
		$getCoupon = new getCoupon();
		$getCoupon->Request->Security = $_SESSION["Security"];
		$getCoupon->Request->Coupon = $Coupon;
		try {
			$getCouponResponse = $this->Client->getCoupon($getCoupon);
			return $getCouponResponse->Response->Coupon;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
						
	public function getFriendshipRequests() {
		$getFriendshipRequests = new getFriendshipRequests();
		$getFriendshipRequests->Request->Security = $_SESSION["Security"];
		try {
			$getFriendshipRequestsResponse = $this->Client->getFriendshipRequests($getFriendshipRequests);
			return $getFriendshipRequestsResponse->Response->User;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
					
	public function changePassword($Password) {
		$changePassword = new changePassword();
		$changePassword->Request->Security = $_SESSION["Security"];
		$changePassword->Request->Security->Password = $Password;
		try {
			$changePasswordResponse = $this->Client->changePassword($changePassword);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
					
	public function getPendingPOIs() {
		$getPendingPOIs = new getPendingPOIs();
		$getPendingPOIs->Request->Security = $_SESSION["Security"];
		try {
			$getPendingPOIsResponse = $this->Client->getPendingPOIs($getPendingPOIs);
			return $getPendingPOIsResponse->Response->Object;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
			
	public function setInvitation($User, $Message) {
		$setInvitation = new setInvitation();
		$setInvitation->Request->Security = $_SESSION["Security"];
		$setInvitation->Request->User = $User;
		$setInvitation->Request->Message = $Message;
		try {
			$setInvitationResponse = $this->Client->setInvitation($setInvitation);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}
	}
	
	public function getGroupByAPIKey() {
		$getGroupByAPIKey = new getGroupByAPIKey();
		$getGroupByAPIKey->Request->Security->APIKey = $this->MySonar->getProperty("apikey");
		try {
			$getGroupByAPIKeyResponse = $this->Client->getGroupByAPIKey($getGroupByAPIKey);
			return $getGroupByAPIKeyResponse->Response->Security->Group;
		} catch (Exception $fault) {
			return null;
		}
	}

	public function getPointOfInterest($ID) {
		$getPointOfInterest = new getPointOfInterest();
		$getPointOfInterest->Request->Security = $_SESSION["Security"];
		$getPointOfInterest->Request->Object->ID = $ID;
		try {
			$getPointOfInterestResponse = $this->Client->getPointOfInterest($getPointOfInterest);
			$Object = $getPointOfInterestResponse->Response->Object;
			return $Object;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}	

	public function getGroup($Options, $Group) {
		$getGroup = new getGroup();
		$getGroup->Request->Security = $_SESSION["Security"];
		$getGroup->Request->Options = $Options;
		$getGroup->Request->Group = $Group;
		try {
			$getGroupResponse = $this->Client->getGroup($getGroup);
			$Options = $getGroupResponse->Response->Options;
			$Group = $getGroupResponse->Response->Group;
			return array($Options, $Group);
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}

	public function joinGroup($Group) {
		$joinGroup = new joinGroup();
		$joinGroup->Request->Security = $_SESSION["Security"];
		$joinGroup->Request->Options = $Options;
		$joinGroup->Request->Group = $Group;
		try {
			$joinGroupResponse = $this->Client->joinGroup($joinGroup);
			$Group = $joinGroupResponse->Response->Group;
			return $Group;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}

	public function leaveGroup($Group) {
		$leaveGroup = new leaveGroup();
		$leaveGroup->Request->Security = $_SESSION["Security"];
		$leaveGroup->Request->Group = $Group;
		try {
			$leaveGroupResponse = $this->Client->leaveGroup($leaveGroup);
			$Group = $leaveGroupResponse->Response->Group;
			return $Group;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
		
	public function getArticle($Article) {
		$getArticle = new getArticle();
		$getArticle->Request->Security = $_SESSION["Security"];
		$getArticle->Request->Article = $Article;
		try {
			$getArticleResponse = $this->Client->getArticle($getArticle);
			$Article = $getArticleResponse->Response->Article;
			$Group = $getArticleResponse->Response->Group;
			return array($Article, $Group);
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
		
	public function deleteArticle($Article) {
		$deleteArticle = new deleteArticle();
		$deleteArticle->Request->Security = $_SESSION["Security"];
		$deleteArticle->Request->Article = $Article;
		try {
			$deleteArticleResponse = $this->Client->deleteArticle($deleteArticle);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
		
	public function deleteTopic($Article) {
		$deleteTopic = new deleteTopic();
		$deleteTopic->Request->Security = $_SESSION["Security"];
		$deleteTopic->Request->Article = $Article;
		try {
			$deleteTopicResponse = $this->Client->deleteTopic($deleteTopic);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
		
	public function deleteGroup($Group) {
		$deleteGroup = new deleteGroup();
		$deleteGroup->Request->Security = $_SESSION["Security"];
		$deleteGroup->Request->Group = $Group;
		try {
			$deleteGroupResponse = $this->Client->deleteGroup($deleteGroup);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
			
	public function getTopic($Article) {
		$getTopic = new getTopic();
		$getTopic->Request->Security = $_SESSION["Security"];
		$getTopic->Request->Article = $Article;
		try {
			$getTopicResponse = $this->Client->getTopic($getTopic);
			$Article = $getTopicResponse->Response->Article;
			$Group = $getTopicResponse->Response->Group;
			return array($Article, $Group);
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
			
	public function deletePointOfInterest($ID) {
		$deletePointOfInterest = new deletePointOfInterest();
		$deletePointOfInterest->Request->Security = $_SESSION["Security"];
		$deletePointOfInterest->Request->PointOfInterest->ID = $ID;
		try {
			$deletePointOfInterestResponse = $this->Client->deletePointOfInterest($deletePointOfInterest);
			$PointOfInterest = $deletePointOfInterestResponse->Response->PointOfInterest;
			return $PointOfInterest;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}	
	
	public function setFriendship($User, $Message) {
		$setFriendship = new setFriendship();
		$setFriendship->Request->Security = $_SESSION["Security"];
		$setFriendship->Request->Object->User = $User;
		$setFriendship->Request->Message = $Message;
		try {
			$setFriendshipResponse = $this->Client->setFriendship($setFriendship);
			$Object = $setFriendshipResponse->Response->Object;
			return $Object;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}	
	
	public function setBestFriend($User) {
		$setBestFriend = new setBestFriend();
		$setBestFriend->Request->Security = $_SESSION["Security"];
		$setBestFriend->Request->User = $User;
		try {
			$setBestFriendResponse = $this->Client->setBestFriend($setBestFriend);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
	
	public function putEyesOn($User) {
		$putEyesOn = new putEyesOn();
		$putEyesOn->Request->Security = $_SESSION["Security"];
		$putEyesOn->Request->User = $User;
		try {
			$setBestFriendResponse = $this->Client->putEyesOn($putEyesOn);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
	
	public function deleteBestFriend($User) {
		$deleteBestFriend = new deleteBestFriend();
		$deleteBestFriend->Request->Security = $_SESSION["Security"];
		$deleteBestFriend->Request->User = $User;
		try {
			$deleteBestFriendResponse = $this->Client->deleteBestFriend($deleteBestFriend);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
	
	public function removeEyesOn($User) {
		$removeEyesOn = new removeEyesOn();
		$removeEyesOn->Request->Security = $_SESSION["Security"];
		$removeEyesOn->Request->User = $User;
		try {
			$removeEyesOnResponse = $this->Client->removeEyesOn($removeEyesOn);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
	
	public function blockEyesOn($User) {
		$blockEyesOn = new blockEyesOn();
		$blockEyesOn->Request->Security = $_SESSION["Security"];
		$blockEyesOn->Request->User = $User;
		try {
			$blockEyesOnResponse = $this->Client->blockEyesOn($blockEyesOn);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
			
	public function deleteFriendship($User) {
		$deleteFriendship = new deleteFriendship();
		$deleteFriendship->Request->Security = $_SESSION["Security"];
		$deleteFriendship->Request->User = $User;
		try {
			$deleteFriendshipResponse = $this->Client->deleteFriendship($deleteFriendship);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}

	public function confirmFriendship($User) {
		$confirmFriendship = new confirmFriendship();
		$confirmFriendship->Request->Security = $_SESSION["Security"];
		$confirmFriendship->Request->User = $User;
		try {
			$confirmFriendshipResponse = $this->Client->confirmFriendship($confirmFriendship);
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}	

	public function deleteCurrentLocation() {
		$deleteCurrentLocation = new deleteCurrentLocation();
		$deleteCurrentLocation->Request->Security = $_SESSION["Security"];
		try {
			$deleteCurrentLocationResponse = $this->Client->deleteCurrentLocation($deleteCurrentLocation);
			$_SESSION["Location"] = NULL;
			return true;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}	

	public function getStatement($Period, $StartDate=null) {
		$getStatement = new getStatement();
		$getStatement->Request->Security = $_SESSION["Security"];
		$getStatement->Request->Statement->Period = ($Period>0 ? $Period:1);
		if ($StartDate!=null) $getStatement->Request->Statement->StartDate = $StartDate;
		try {
			$getStatementResponse = $this->Client->getStatement($getStatement);
			return $getStatementResponse->Response->Statement;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}

	public function doVote($Vote) {
		$doVote = new doVote();
		$doVote->Request->Security = $_SESSION["Security"];
		$doVote->Request->Vote = $Vote;
		try {
			$doVoteResponse = $this->Client->doVote($doVote);
			return $doVoteResponse->Response->Vote;
		} catch (Exception $fault) {
			return $this->getSonarErrors($fault);
		}	
	}
		
	// HELPER FUNCTIONS
	
	private function getSonarErrors($fault) {
		$message = array();
		// server specific
		$message[400] = "Daten unvollst&auml;ndig.";
		$message[401] = "Du bist nicht angemeldet.";
		$message[402] = "Du wurdest abgemeldet, weil du zu lange inaktiv warst.";
		$message[403] = "Mitglied konnte nicht gel&ouml;scht werden.";
		$message[404] = "Mitglied nicht gefunden.";
		$message[405] = "Aktivierung fehlgeschlagen.";
		$message[406] = "Nickname oder Handynummer schon vorhanden.";
		$message[407] = "Aktualisierung fehlgeschlagen.";
		$message[408] = "Du kannst dich nicht selbst einladen.";
		$message[409] = "Upload gescheitert.";
		$message[410] = "Aktueller Standort konnte nicht gel&ouml;scht.";
		$message[411] = "Standort fehlt.";
		$message[412] = "Session ung&uuml;ltig oder abgelaufen.";
		$message[414] = "Land nicht unterst&uuml;tzt.";
		$message[415] = "Benutzername und/oder Passwort zu kurz (min. 3 Zeichen).";
		$message[416] = "Infotext zu lang.";
		$message[418] = "Falsche E-Mail Adresse.";
		$message[419] = "Falsche Handynummer.";
		$message[420] = "Nachricht zu lang.";
		$message[421] = "Falsches Geburtsdatum oder Mindestalter unterschritten.";
		$message[422] = "Falscher Wert im Feld 'Geschlecht'.";
		$message[423] = "Standort fehlt.";
		$message[424] = "Falscher Wert im Feld 'SonarRange'.";
		$message[425] = "Standort(e) nicht gefunden.";
		$message[426] = "Nachricht fehlt.";
		$message[427] = "Keine Bilder gefunden.";
		$message[428] = "Falscher Wert im Feld 'ObjectType'.";
		$message[429] = "Mindestalter unterschritten.";
		$message[430] = "Bildtyp wird nicht unterst&uuml;tzt.";
		$message[431] = "Unzul&auml;ssige &Auml;nderung.";
		$message[432] = "Handynummer und Geburtsdatum sind unbekannt.";
		$message[433] = "Keine Objekte gefunden.";
		$message[460] = "Fehler bei der Geokodierung. Standort nicht ermittelbar.";
		$message[461] = "Fehler bei der Geokodierung. Standort unbekannt.";
		$message[462] = "Fehler bei der Geokodierung. Angabe zu ungenau.";
		$message[463] = "Fehler bei der Geokodierung. Geokodierung des Standorts unzul&auml;ssig.";
		$message[470] = "Keine Nachrichten.";
		$message[471] = "Handynr. oder Code falsch.";
		$message[472] = "Einladung nicht verschickt.";
		$message[473] = "Absender ben&ouml;tigt.";
		$message[474] = "Empf&auml;nger ben&ouml;tigt.";
		$message[475] = "Typ des Point of Internet nicht unterst&uuml;tzt.";
		$message[476] = "Beginn in Vergangenheit.";
		$message[477] = "Ende liegt vor dem Beginn.";
		$message[478] = "Name und Beschreibung sind Pflicht.";
		$message[479] = "Nachricht konnte nicht gel&ouml;scht werden.";
		$message[480] = "Bitte nur einen Point of Interest setzen.";
		$message[481] = "Point of Interest konnte nicht gespeichert werden.";
		$message[482] = "Keine Kontakte gefunden.";
		$message[483] = "Kontaktanfrage gescheitert.";
		$message[484] = "Best&auml;tigung fehlgeschlagen.";
		$message[485] = "Keine Kontaktanfrage f&uuml;r dich.";
		$message[486] = "Kontakt besteht bereits.";
		$message[487] = "Kein best&auml;tigter Kontakt.";
		$message[488] = "Nachricht konnte nicht versendet werden.";
		$message[489] = "Nicht erlaubt.";
		$message[490] = "SMS konnte nicht versendet werden.";
		$message[491] = "Maximale Anzahl an besten Freunden erreicht.";
		$message[492] = "Nur best&auml;tigte Kontakte k&ouml;nnen BestFriends werden.";
		$message[493] = "Es besteht schon eine beste Freundschaft.";
		$message[494] = "Der Empf&auml;nger wurde schon mal eingeladen.";
		$message[495] = "BEF konnte nicht gel&ouml;scht werden.";
		$message[496] = "Nee, der User will nicht flirten.";
		$message[497] = "Maximale Anzahl an EyesOn erreicht.";
		$message[498] = "Da sind deine Augen schon drauf!";
		$message[499] = "Point of Interest konnte nicht gefunden werden.";
		$message[500] = "Fataler interner Fehler (Server).";
		$message[502] = "Freischalt-Code, Passwort oder Nachricht konnte nicht versendet werden.";
		$message[503] = "Dienst derzeit nicht verf&uuml;gbar.";
		$message[504] = "Der API-Key ist ung&uuml;ltig.";
		$message[600] = "Du kannst nur Augen auf andere schmei&szlig;en.";
		$message[601] = "Auge konnte nicht entfernt werden.";
		$message[602] = "Schon gespeichert.";
		$message[603] = "Keine Flirts gefunden.";
		$message[604] = "Breite liegt nicht zwischen 100 und 500 Pixel.";
		$message[605] = "H&ouml;he liegt nicht zwischen 100 und 500 Pixel.";
		$message[606] = "Fehler beim Vermerk (min. 1, max. 50 Zeichen).";
		$message[607] = "Der Mindestbetrag liegt bei 1 \$onar.";
		$message[608] = "Du hast zu wenig Guthaben.";
		$message[609] = "Zeitraum unzul&auml;ssig (1 bis 30 Tage).";
		$message[610] = "Nachrichtentyp nicht unterst&uuml;tzt.";
		$message[611] = "Aktivierung nur als Admin m&ouml;glich.";
		$message[612] = "Gespeicherter POI ist von einem anderern Typ.";
		$message[613] = "SMS-Text zu lang.";
		$message[614] = "SMS-Empf&auml;nger muss in deinen Kontakten sein.";
		$message[615] = "Nickname zu lang.";
		$message[616] = "Geldschein falsch, schon eingezahlt oder abgelaufen.";
		$message[617] = "Das geht nur, wenn ihr beide flirten wollt.";
		$message[618] = "Du musst zuerst deine Handynr. angeben und aktivieren.";
		$message[619] = "Die Handynummer existiert schon.";
		$message[620] = "Der Empf&auml;nger hat keine Handynummer angegeben.";
		$message[621] = "Stichwort fehlt.";
		$message[622] = "UID fehlt.";
		$message[623] = "PID fehlt.";
		$message[624] = "Coupon-Typ nicht unterst&uuml;tzt.";
		$message[625] = "Schl&uuml;ssel f&uuml;r Sichtbarkeit nicht unterst&uuml;tzt.";
		$message[626] = "Karte kann nicht angezeigt werden.";
		$message[627] = "Du kannst dich nicht selbst blocken.";
		$message[628] = "Flirt konnte nicht geblocked werden.";
		$message[629] = "Bitte bewerte entweder ein Mitglied oder einen POI.";
		$message[630] = "Bewertung muss zwischen 1 (sehr gut) und 5 (mangelhaft) liegen.";
		$message[631] = "Du kannst nur einmal bewerten.";
		$message[632] = "Statusmeldung zu lang.";
		$message[633] = "Gruppenname nicht angegeben oder zu lang (max. 50 Zeichen).";
		$message[634] = "Beschreibung nicht angegeben oder zu lang (max. 255 Zeichen).";
		$message[635] = "Gruppe konnte nicht angelegt werden. Existiert schon?";
		$message[636] = "Gruppe nicht gefunden. M&ouml;glicherweise wurde sie gel&ouml;scht.";
		$message[637] = "Beitrag nicht gefunden.";
		$message[638] = "Beitrag konnte nicht gespeichert werden.";
		$message[639] = "Du hast keine Schreibrechte in dieser Gruppe.";
		$message[640] = "Referenz auf Hauptbeitrag nicht gesetzt.";
		$message[641] = "Referenzbeitrag nicht gefunden.";
		$message[642] = "Das Thema muss zwischen 1 und 50 Zeichen haben.";
		$message[643] = "Der Text muss mindestens 1 Zeichen lang sein.";
		$message[644] = "Thema konnte nicht gespeichert werden.";
		$message[645] = "ID der Gruppe fehlt oder ist falsch.";
		$message[646] = "Du musst erst deine Handynr. angeben und best&auml;tigen.";
		$message[647] = "Zugangsdaten konnten nicht per SMS versendet werden.";
		$message[648] = "Point of Interest noch nicht freigeschaltet.";
		$message[649] = "Unzul&auml;ssige Kategorie.";
		$message[650] = "Keine Themen gefunden.";
		$message[651] = "Du bist bereits Mitglied.";
		$message[652] = "Du bist kein Mitglied der Gruppe.";
		$message[653] = "Als Gruppenadmin kannst du die Gruppe nicht verlassen.";
		$message[654] = "Du bist nicht berechtigt.";
		$message[655] = "Artikel, Thema oder Gruppe konnte nicht gel&ouml;scht werden.";
		$message[656] = "Bitte Ort, ggf. mit Str. und Hausnr. eingeben.";
		$message[657] = "Artikel oder Thema konnte nicht ge&auml;ndert werden.";
		$message[658] = "Operation nicht erlaubt f&uuml;r diese ID.";
		$message[659] = "Mindestwert unterschritten oder Betrag nicht durch hundert Teilbar (z. B. richtig 300, falsch 350).";
		$message[660] = "Empf&auml;ngername zu kurz (min. 5 Zeichen).";
		$message[661] = "Stra&szlig; zu kurz (min. 5 Zeichen).";
		$message[662] = "PLZ und Ort zu kurz (min. 5 Zahlen und 3 Zeichen).";
		$message[663] = "Empf&auml;nger nicht erlaubt.";
		$message[664] = "Kartentyp ung&uuml;ltig.";
		$message[665] = "Nutzungsbedingungen konnten nicht abgerufen werden.";
		$message[666] = "Du musst vorher deinen Standort lokalisieren.";
		$message[667] = "Du hast den Code bereits eingel&ouml;st.";
		$message[668] = "Kein mobiles Endger&auml;t.";
		$message[669] = "Mehr als ein Ger&auml;t gefunden. Bitte User-Agent pr&uuml;fen.";
		// clientspecific error messages 
		$message[900] = "Fataler interner Fehler (Client).";
		$message[901] = "Bild zu gro&szlig; f&uuml;r Rechner.";
		$message[902] = "Bild zu gro&szlig; f&uuml;r Anwendung.";
		$message[903] = "Bild nur teilweise geladen.";
		$message[904] = "Upload gescheitert.";
		$message[905] = "Upload abgebrochen.";
		$message[906] = "Kein Bild gefunden.";
		$message[907] = "Unzul&auml;ssiger Dateityp.";
		$code = $fault->faultactor;
		if ($code==412 || $code==401 || $code==402) $_SESSION["Security"]=null; //session_destroy(); // server logged out user
		// send email
		if ($code==500) {
			$headers = "From: ".$this->MySonar->getProperty("fatal_error_email_address")."\nReply-To: ".$this->MySonar->getProperty("fatal_error_email_address")."\nContent-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nMIME-Version: 1.0";
			mail($this->MySonar->getProperty("fatal_error_email_address"), "Kritischer Fehler aufgetreten", print_r($fault, true), $headers);
		}
		if ($message[$code]==null) return new SonarErrors(500, "Unerwarteter Server-Fehler aufgetreten.");
		else return new SonarErrors($code, $message[$code]) ;
	}
	
	public function getHelp($key, $language = "DE") {
		$help = array();
		// faq
		$help["menu"] = new Help(
			"Fragen &amp; Antworten",
			'<p>Hier findest du h&auml;ufig gestellte Fragen. Falls keine passende Antwort dabei ist, findest du sie vielleicht &uuml;ber PC auf unserer Website www.mysonar.de. Oder schreib uns einfach eine <a href="index.php?m=sendMessage&Recipient='.$this->MySonar->getProperty("admin_username").'&Text=Liebes mySonar-Team!">Nachricht</a>.</p>
			<p><span class="nav">
			<p class="li">&middot; <a href="index.php?m=getHelp&key=q1">Kann man mich beobachten?</a></p>
			<p class="li">&middot; <a href="index.php?m=getHelp&key=q2">Ist mySonar wirklich kostenlos?</a></p>
			<p class="li">&middot; <a href="index.php?m=getHelp&key=q3">Welchen Handy-Tarif brauch ich?</a></p>
			<p class="li">&middot; <a href="index.php?m=getHelp&key=q4">Krieg ich mit Werbung-Spam?</a></p>
			<p class="li">&middot; <a href="index.php?m=getHelp&key=q5">Mu&szlig; ich meine Handynr. angeben?</a></p>
			<p class="li">&middot; <a href="index.php?m=getHelp&key=q6">Was sind denn BEFs?</a></p>
			<p class="li">&middot; <a href="index.php?m=getHelp&key=q7">Wann kriegen BEFs SMS?</a></p>
			<p class="li">&middot; <a href="index.php?m=getHelp&key=q8">Ein Auge auf Flirts werfen?</a></p>
			</span></p>'
		);
		$help["q1"] = new Help(
			"Beobachtung m&ouml;glich?",
			'<p>Nein. Dein Handy wird nicht tats&auml;chlich geortet. Du kannst deinen Standort frei w&auml;hlen und die Genauigkeit selbst festlegen. Au&szlig;erdem kannst du dich f&uuml;r andere v&ouml;llig unsichtbar machen.</p>'
		);
		$help["q2"] = new Help(
			"Wirklich kostenlos?",
			'<p>Ja. Unsere Mitglieder sind vor allem junge Leute. Da sitzt das Geld manchmal eher knapp. Deshalb ist und bleibt die Nutzung von <span class="my">my</span><span class="sonar">Sonar</span> kostenlos. Nat&uuml;rlich nimmt der Mobilfunkanbieter - genauso wie auch dein jetziger Internet-Provider - Geb&uuml;hren f&uuml;r die Einwahl ins mobile Internet. Die befinden sich aber derzeit im freien Fall. So teuer wie man immer bef&uuml;rchtet, ist das mobile Web n&auml;mlich gar nicht.</p>'
		);
		$help["q3"] = new Help(
			"Richtiger Handy-Tarif?",
			'<p>Gute Frage und herzlich willkommen im Tarifdschungel der Mobilfunkanbieter! Seit Ende 2007 haben die Anbieter ihre Preise f&uuml;r die Nutzung des Mobile Internet drastisch gesenkt. Sie bieten jetzt so genannte Flatrates als Zusatztarife an. Mit einem solchen Tarif kannst du <span class="my">my</span><span class="sonar">Sonar</span> beliebig oft und beliebig lange nutzen. Das macht dann am meisten Spa&szlig;! Es gibt Internet-Flatrates schon f&uuml;r 9,95 Euro pro Monat. Am besten du informierst dich bei deinem Netzbetreiber. Wichtig: F&uuml;r <span class="my">my</span><span class="sonar">Sonar</span> brauchst du keinen Datentarif.</p>'
		);
		$help["q4"] = new Help(
			"Werbung-Spamming?",
			'<p>Nein. Richtig ist, dass wir uns &uuml;ber Werbung refinanzieren. Aber du erh&auml;ltst von uns niemals reine Werbebotschaften und schon gar nicht auf dein Handy. Werbung schalten wir immer nur in Verbindung mit einem Nutzen. Wenn dich <span class="my">my</span><span class="sonar">Sonar</span> z. B. informiert, dass deine Freunde in der N&auml;he sind, dann h&auml;ngen wir an diese Info eine Werbebotschaft dran. Vielleicht laden euch dann Bistros oder Eiscafes in der N&auml;he auf eine Erfrischung ein.</p>'
		);
		$help["q5"] = new Help(
			"Handynr. notwendig?",
			'<p>Nein. <span class="my">my</span><span class="sonar">Sonar</span> funktioniert auch ohne. Allerdings stehen dir manche Funktionen ohne Handynummer nicht zu Verf&uuml;gung. So k&ouml;nnen wir dich z. B. nicht informieren, wenn Freunde oder Flirts in deiner N&auml;he sind. Au&szlig;erdem kannst du keine Gratis-SMS an deine Freunde versenden. Es spricht unserer Meinung nach auch nichts dagegen, deine Handynummer anzugeben. Sie bleibt geheim, wir geben sie nicht weiter und du erh&auml;lst keine unerw&uuml;nschten SMS oder Anrufe. Das ist ein Versprechen!</p><p><a href="index.php?m=updateUser&Option=MobilePhoneNumber">Handynummer angeben</a></p>'
		);
		$help["q6"] = new Help(
			"Was sind BEFs?",
			'<p>BEF steht f&uuml;r BestFriend. <span class="my">my</span><span class="sonar">Sonar</span> informiert deine besten Freunde, wenn du in ihrer N&auml;he bist. Du kannst bis zu 5 deiner Freunde zu BestFriends machen.</a></p>'
		);
		$help["q7"] = new Help(
			"Wann kriegen BEFs SMS?",
			'<p>Deine BestFriends bekommen eine SMS-Info mit deinem Standort und der Entfernung, wenn...<p>(1) du deinen Standort wechselst und<br/>(2) du eine Suche startest und<br/>(3) deine Freunde gerade off sind und<br/>(4) sie am selben Tag online und<br/>(4) in deiner N&auml;he waren.</p>Die N&auml;he bestimmen deine Freunde &uuml;ber ihre Umkreis-Einstellungen selbst. SMS werden aber maximal bis 5km verschickt und nat&uuml;rlich nur, wenn deine Freunde ihre Handynr. angegeben und best&auml;tigt haben.</p>'
		);
		$help["q8"] = new Help(
			"Auge auf Flirts werden?",
			'<p>Du kannst ein Auge auf Flirts werfen und wirst per SMS informiert, wenn sie in der N&auml;he sind. Du erf&auml;hrst, wie weit dein Flirt von dir entfernt ist. Den genauen Standort siehst du aber nur, wenn dein Flirt das auch zugelassen hat. Die N&auml;he bestimmst du selbst &uuml;ber deine Umkreis-<a href="index.php?m=getSonarPreferences">Einstellungen</a>. Eine SMS bekommst du nur, wenn du offline bist. Nat&uuml;rlich mu&szlig;t du vorher deine Handynummer angegeben und best&auml;tigt haben ;-)</p><p><a href="index.php?m=updateUser&Option=MobilePhoneNumber">Handynummer angeben</a></p>'
		);
		// general questions to mySonar
		$help["q901"] = new Help(
			"Was sind City Manager?",
			'<p>Das sind Leute, die f&uuml;r dich in einer Stadt oder Region unterwegs sind, um neue Kooperationspartner und interessante Locations zu finden. Und da der SMS-Versand ja Kohle kostet, suchen City Manager auch Werbepartner und werden im Gegenzug anteilig am Umsatz von <span class="my">my</span><span class="sonar">Sonar</span> beteiligt.</p>'
		);
		$help["q902"] = new Help(
			"Was sind \$onars?",
			'<p>$onar hei&szlig;t die offizielle W&auml;hrung in <span class="my">my</span><span class="sonar">Sonar</span>. Wir zahlen dir $onars, wenn du Freunde einl&auml;dtst und interessante Locations meldest. F&uuml;r $onars kannst du dir dann SMS-Nachrichten an Freunde kaufen. Eine SMS kostet 30 $onars.</p>'
		);
		$help["q903"] = new Help(
			"Wasn f&uuml;rn Geldschein?",
			'<p><span class="my">my</span><span class="sonar">Sonar</span> hat eine eigene offizielle W&auml;hrung, die $onars. Wenn dir jemand einen $onar-Geldschein gegeben hat, dann kannst du seinen Gegenwert auf dein Konto bei <span class="my">my</span><span class="sonar">Sonar</span> gutschreiben lassen. Dazu mu&szlig;t du einfach nur den aufgedruckten Code angeben und schon kriegst du das Geld. F&uuml;r $onars kannst du z. B. kostenlose SMS an Freunde senden oder Rabatte von unseren Partnern bekommen.</p>'
		);		
		$help["q904"] = new Help(
			'Mit $onars bezahlen',
			'<p>Einige Unternehmen akzeptieren $onar-Banknoten als Zahlungsmittel. Du kannst also $onars von deinem Konto abheben und damit vor Ort bezahlen. Hier siehst du eine Liste unserer Partner, die $onars akzeptieren:<p><a href="index.php?m=getPointOfInterest&amp;ID=171">Discothek BaCa, Nettetal</a></p></p>'
		);		
		// fields
		$help["MobilePhoneNumber"] = new Help(
			"Deine Handynummer",
			'<p><span class="my">my</span><span class="sonar">Sonar</span> informiert dich kostenlos per SMS, wenn deine Freunde in der N&auml;he sind oder sie mit dir zu einer Party gehen m&ouml;chten.</p><p>Das geht nat&uuml;rlich nur, wenn du uns deine Handynummer gibst. Und mach dir keine Sorgen! Die Nummer bleibt geheim, und du bekommst auch keine unerw&uuml;schten SMS (z. B. Werbung oder Spam).</p><p><a href="index.php?m=updateUser&Option=MobilePhoneNumber">Handynummer angeben</a></p>'
		);		
		$help["QueryDEFAULT"] = new Help(
			"Suche mit Standort",
			'<p>Standardm&auml;&szlig;ig durchsucht <span class="my">my</span><span class="sonar">Sonar</span> deine Umgebung und findet alle Mitglieder und Pl&auml;tze (Points Of Interest) in der N&auml;he. Hierf&uuml;r brauchen wir deinen aktuellen Aufenthaltsort. Schreib ihn doch einfach z. B. von einem Stra&szlig;enschild ab. Je genauer deine Angabe, desto genauer ist auch die Suche. Ort, Stra&szlig;e und Hausnummer sind bis wenige Meter genau. Aber es reicht, wenn du die Stadt oft auch einen Stadtteil oder sogar nur eine Stra&szlig;e angibst. Die Angaben kannst du einfach durch Leerzeichen voneinander trennen.</p>'
		);		
		$help["QueryUSER"] = new Help(
			"Suche nach Leuten",
			'<p>Bei der Suche nach Leuten durchsucht <span class="my">my</span><span class="sonar">Sonar</span> alle Mitglieder-Profile nach deinem Stichwort oder der eingegebenen User-ID (UID) und versucht deine Eingabe zu finden. Wir suchen auch nach &Uuml;bereinstimmungen in Kurz-Infos von Mitgliedern.</p>'
		);		
		$help["QueryUID"] = new Help(
			"Suche mit UID",
			'<p>Mitgliederprofile haben in <span class="my">my</span><span class="sonar">Sonar</span> eine eindeutige Nummer, die so genannte UID (User Identifier). Manchmal wird dir jemand eine solche UID mitteilen. &Uuml;ber die UID-Suche kannst du das Profil dann sofort finden.</p>'
		);		
		$help["QueryPID"] = new Help(
			"Suche mit PID",
			'<p>Point Of Interests haben in <span class="my">my</span><span class="sonar">Sonar</span> eine eindeutige Nummer, die so genannte PID (POI Identifier). Manchmal wird dir jemand eine solche PID mitteilen. &Uuml;ber die PID-Suche kannst du das Profil des Point Of Interests dann sofort finden.</p>'
		);		
		$help["QueryKEY"] = new Help(
			"Suche mit Stichwort",
			'<p>Bei der Suche mit einem Stichwort durchsucht <span class="my">my</span><span class="sonar">Sonar</span> alle Profile und versucht dein Stichwort zu finden. Hier&uuml;ber kannst du dann einfach nach Namen von Mitgliedern oder Pl&auml;tzen (Points Of Interest) oder User- bzw. POI-IDs suchen. Wir suchen auch nach &Uuml;bereinstimmungen in Kurz-Infos von Mitgliedern und Beschreibungen von Pl&auml;tzen.</p>'
		);		
		// modules
		$help["mod0"] = new Help(
			"News aus meinem Netzwerk",
			'<p>Damit du immer auf dem Laufenden bleibst, informiert dich <span class="my">my</span><span class="sonar">Sonar</span> &uuml;ber die Aktivit&auml;ten deiner Kontakte.</p><p>Folgende Aktivit&auml;ten werden aufgelistet:</p><p>&middot; Aufnahme neuer Kontakte<br/>&middot; Statusmeldungen<br/>&middot; neue Profilfotos<br/>&middot; neue Kurzinfos im Profil<br/>&middot; neue Points of Interest (POI)<br/>&middot; neue POI-Bewertungen</p><p>Es werden nur Aktivit&auml;ten bzw. Informationen deiner direkten Kontakte angezeigt.</p>'
		);
		$help["mod1"] = new Help(
			"Kontakte meiner Kontakte",
			'<p><span class="my">my</span><span class="sonar">Sonar</span> stellt dir Mitglieder vor, die zum Netzwerk deiner Freunde bzw. Kontakte geh&ouml;ren. Hier kannst du sehen, wen du &uuml;ber zwei Ecken kennst bzw. kennen lernen k&ouml;nntest.</p>'
		);
		$help["mod2"] = new Help(
			"Die n&auml;chsten Geburtstage",
			'<p>So kannst du keinen Geburtstag vergessen!</p><p><span class="my">my</span><span class="sonar">Sonar</span> zeigt dir an, wem du aus deinem Netzwerk als n&auml;chstes gratulieren solltest. Schreib ihnen doch eine kurze Message per Mail oder SMS. Oder &uuml;berweise ihnen ein paar von deinen $onars als Geburtstagsgeschenk.</p><p>Es werden nur die Geburtstage deiner direkten Kontakte angezeigt und selbstverst&auml;ndlich nur dann, wenn deine Kontakte ihr Geburtsdatum hinterlegt haben. Die Liste bezieht sich auf einen Zeitraum von sechs Monaten.</p>'
		);
		$help["mod6"] = new Help(
			"Beitr&auml;ge aus meinen Gruppen",
			'<p>Immer wenn in deinen Gruppen neue Beitr&auml;ge verfasst werden, findest du sie hier. Die neuesten Beitr&auuml;ge erscheinen oben.</p>'
		);
		$help["mod3"] = new Help(
			"Meine Gruppen",
			'<p>Hier listen wir deine Gruppen auf. Gruppen, in denen du erst k&uuml;zlich beigetreten bist, stehen oben.</p>'
		);
		$help["mod4"] = new Help(
			"Meine Kontakte online",
			'<p>Hier siehst du, ob deine Freunde und Bekannte gerade online sind und wann sie sich zuletzt innerhalb von <span class="my">my</span><span class="sonar">Sonar</span> bewegt haben. Wenn sie l&auml;nger als 15 Minuten inaktiv waren, werden sie automatisch ausgeloggt. Dann verschwinden sie auch aus dieser &Uuml;bersicht.</p>'
		);
		$help["mod5"] = new Help(
			"Neue Gruppen",
			'<p>Hier siehst du die neuen Gruppen, die du selbst oder andere Mitglieder gegr&uuml;ndet haben.</p>'
		);
		$help["mod7"] = new Help(
			"Kennst du schon...?",
			'<p>Hier stellen wir dir einige Mitglieder vor, die ihr Profil ausgef&uuml;llft und ein Foto hinterlegt haben. Die Auswahl erfolgt ansonsten v&ouml;llig zuf&auml;llig.</p>'
		);
		$help["mod8"] = new Help(
			"Die letzten Logins",
			'<p>Hier zeigen wir dir, wer sich zuletzt am Dienst angemeldet hatte.</p>'
		);
		$help["imprint"] = new Help(
			"Impressum",
			'<div class="border"><p>'.$this->MySonar->getProperty("company_slogan").'</p></div>
			<p><strong class="highlight">Betreiber</strong><br/>'.$this->MySonar->getProperty("company_name").'<br/>'.$this->MySonar->getProperty("company_street").'<br/>'.$this->MySonar->getProperty("company_location").'</p>
			<p>'.$this->MySonar->getProperty("company_phone").'<br/>'.$this->MySonar->getProperty("company_fax").'<br/>'.$this->MySonar->getProperty("company_email").'<br/>'.($_SESSION["Security"] ? '<a href="index.php?m=sendMessage&Recipient='.$this->MySonar->getProperty("admin_username").'">Nachricht schreiben</a>':'').'</p>
			<p><strong class="highlight">Gesch&auml;ftsf&uuml;hrer</strong><br/>
			'.$this->MySonar->getProperty("ceo_name").'<br/>
			Phone '.$this->MySonar->getProperty("ceo_phone").'<br/>
			E-Mail '.$this->MySonar->getProperty("ceo_email").'<br/>
			'.($_SESSION["Security"] ? '<a href="index.php?m=sendMessage&amp;Recipient='.$this->MySonar->getProperty("ceo_username").'">Nachricht schreiben</a> | <a href="index.php?m=getProfile&amp;Username='.$this->MySonar->getProperty("ceo_username").'">Zum Profil</a>':'').' 
			</p>
			<p><strong class="highlight">Vertriebsleiter</strong><br/>
			'.$this->MySonar->getProperty("cso_name").'<br/>
			Phone '.$this->MySonar->getProperty("cso_phone").'<br/>
			E-Mail '.$this->MySonar->getProperty("cso_email").'<br/>
			'.($_SESSION["Security"] ? '<a href="index.php?m=sendMessage&amp;Recipient='.$this->MySonar->getProperty("cso_username").'">Nachricht schreiben</a> | <a href="index.php?m=getProfile&amp;Username='.$this->MySonar->getProperty("cso_username").'">Zum Profil</a>':'').' 
			</p>
			<p><strong class="highlight">Haftung</strong><br/>Trotz sorgf&auml;ltiger inhaltlicher Kontrolle &uuml;bernehmen wir keine Haftung f&uuml;r die Inhalte externer Links. F&uuml;r den Inhalt der verlinkten Seiten sind ausschlie&szlig;lich deren Betreiber verantwortlich.</p>'
		);
		$help["about"] = new Help(
			"&Uuml;ber uns",
			'<p>
			<span class="my">my</span><span class="sonar">Sonar</span> ist Deutschlands erste standortbezogene Handy-Community mit eigener W&auml;hrung. 
			&Uuml;ber <span class="my">my</span><span class="sonar">Sonar</span> lokalisieren Nutzer &uuml;ber ihr Handy Freunde, Flirts, Partys und 
			Pl&auml;tze in ihrer Umgebung. Der kostenlose mobile Service l&auml;uft auf jedem internetf&auml;higen Handy ohne zus&auml;tzliche 
			Installationen und ist eine innovative Kombination aus Navigationsger&auml;t und Social Network. Mitglieder von <span class="my">my</span><span class="sonar">Sonar</span> 
			finden Menschen und Pl&auml;tze in der unmittelbaren Umgebung in einer Navi-typischen kartografischen Darstellung. Wenn sie offline sind, 
			informiert der Dienst automatisch per Free-SMS, wenn etwas Interessantes in der N&auml;he passiert. Attraktive Funktionen des 
			Web 2.0 wie Freundesnetzwerke, Geburtstagserinnerungen und Gruppen runden das Angebot ab. Und das Beste: <span class="my">my</span><span class="sonar">Sonar</span>
			belohnt die Meldung von interessanten Locations mit $onar-Dollar, der eigenen W&auml;hrung. F&uuml;r $onars k&ouml;nnen Nutzer kostenlose 
			SMS an ihre Kontakte versenden und bei <span class="my">my</span><span class="sonar">Sonar</span>-Partnern vor Ort real bezahlen.
			</p>
			<p>
			Die Location Based Mobile Networking-Plattform mySonar.de wird von der mySonar GbR mit Gesch&auml;ftssitz in Nettetal betrieben. 
			Gesch&auml;ftspartnern bietet das Unternehmen eine attraktive Werbeplattform f&uuml;r Location Based Advertising, mit denen sie ihre 
			Kunden genau dort erreichen, wo sie gerade sind. Außerdem k&ouml;nnen Funktionen und Datenbank von <span class="my">my</span><span class="sonar">Sonar</span> 
			&uuml;ber White Labeling kostenlos in eigene Angebote integriert werden, um so Zusatzerträge zu erzielen.
			</p>'
		);
		return $help[$key];
	}
	
}
?>
Return current item: MySonar