Index: svn_1.8.1_mod/1.8.1/frontends/php/include/locales/en_gb.inc.php
===================================================================
--- svn_1.8.1_mod/1.8.1/frontends/php/include/locales/en_gb.inc.php	(revision 10692)
+++ svn_1.8.1_mod/1.8.1/frontends/php/include/locales/en_gb.inc.php	(working copy)
@@ -1424,6 +1424,8 @@
 	'S_NONE'=>				'None',
 	'S_PROBLEM_IF_AT_LEAST_ONE'=>		'Problem, if at least one child has a problem',
 	'S_PROBLEM_IF_ALL'=>			'Problem, if all children have problems',
+	'S_PROBLEM_AVG'=>			'Average SLA of child nodes',
+        'S_PROBLEM_WEIGHT'=>                    'Weighted SLA of child nodes',
 	'S_SOFT'=>				'Soft',
 	'S_DO_NOT_CALCULATE'=>			'Do not calculate',
 	'S_CALCULATE_SLA'=>			'Calculate SLA',
Index: svn_1.8.1_mod/1.8.1/frontends/php/include/defines.inc.php
===================================================================
--- svn_1.8.1_mod/1.8.1/frontends/php/include/defines.inc.php	(revision 10692)
+++ svn_1.8.1_mod/1.8.1/frontends/php/include/defines.inc.php	(working copy)
@@ -277,6 +277,8 @@
 	define('SERVICE_ALGORITHM_NONE',	0);
 	define('SERVICE_ALGORITHM_MAX',		1);
 	define('SERVICE_ALGORITHM_MIN',		2);
+	define('SERVICE_ALGORITHM_AVG',         3);
+        define('SERVICE_ALGORITHM_WEIGHT',         4);
 
 	define('TRIGGER_MULT_EVENT_DISABLED',	0);
 	define('TRIGGER_MULT_EVENT_ENABLED',	1);
Index: svn_1.8.1_mod/1.8.1/frontends/php/include/services.inc.php
===================================================================
--- svn_1.8.1_mod/1.8.1/frontends/php/include/services.inc.php	(revision 10692)
+++ svn_1.8.1_mod/1.8.1/frontends/php/include/services.inc.php	(working copy)
@@ -19,7 +19,7 @@
 **/
 ?>
 <?php
-	function add_service($name,$triggerid,$algorithm,$showsla,$goodsla,$sortorder,$service_times=array(),$parentid,$childs){
+	function add_service($name,$triggerid,$algorithm,$showsla,$goodsla,$sortorder,$service_times=array(),$parentid,$childs,$weight=0){
 
 		foreach($childs as $id => $child){		//add childs
 			if((bccomp($parentid , $child['serviceid'])==0)){
@@ -34,11 +34,11 @@
 
 		remove_service_links($serviceid); //removes all links with current serviceid
 
-		$result =($parentid != 0)?(add_service_link($serviceid,$parentid,0)):(true); //add parent
+		$result =($parentid != 0)?(add_service_link($serviceid,$parentid,0,$weight)):(true); //add parent
 
 		foreach($childs as $id => $child){		//add childs
 			if(!isset($child['soft']) || empty($child['soft'])) $child['soft'] = 0;
-			$result = add_service_link($child['serviceid'],$serviceid,$child['soft']);
+			$result = add_service_link($child['serviceid'],$serviceid,$child['soft'],$weight);
 		}
 
 		if(!$result){
@@ -68,7 +68,7 @@
 		return $serviceid;
 	}
 
-	function	update_service($serviceid,$name,$triggerid,$algorithm,$showsla,$goodsla,$sortorder,$service_times=array(),$parentid,$childs){
+	function	update_service($serviceid,$name,$triggerid,$algorithm,$showsla,$goodsla,$sortorder,$service_times=array(),$parentid,$childs,$weight){
 		foreach($childs as $id => $child){		//add childs
 			if((bccomp($parentid , $child['serviceid'])==0)){
 				error('Service can\'t be parent and child in onetime.');
@@ -77,11 +77,11 @@
 		}
 		remove_service_links($serviceid); //removes all links with current serviceid
 
-		$result =($parentid != 0)?(add_service_link($serviceid,$parentid,0)):(true); //add parent
+		$result =($parentid != 0)?(add_service_link($serviceid,$parentid,0,$weight)):(true); //add parent
 
 		foreach($childs as $id => $child){		//add childs
 			if(empty($child['soft']) || !isset($child['soft'])) $child['soft'] = 0;
-			$result = add_service_link($child['serviceid'],$serviceid,$child['soft']);
+			$result = add_service_link($child['serviceid'],$serviceid,$child['soft'],$weight);
 		}
 
 		if(!$result) return FALSE;
@@ -118,7 +118,7 @@
 
 		while($row=DBfetch($result)){
 			$serviceid2 = add_service(expand_trigger_description_by_data($row),$row["triggerid"],"on",0,"off",99);
-			add_service_link($serviceid2,$serviceid,0);
+			add_service_link($serviceid2,$serviceid,0,$weight);
 		}
 		return	1;
 	}
@@ -269,7 +269,7 @@
 		return	TRUE;
 	}
 
-	function add_service_link($servicedownid,$serviceupid,$softlink){
+	function add_service_link($servicedownid,$serviceupid,$softlink,$weight=0){
 		if( ($softlink==0) && (is_service_hardlinked($servicedownid)==true) ){
 			error("cannot link hardlinked service.");
 			return	false;
@@ -282,7 +282,7 @@
 
 		$linkid=get_dbid("services_links","linkid");
 
-		$sql="INSERT INTO services_links (linkid,servicedownid,serviceupid,soft) values ($linkid,$servicedownid,$serviceupid,$softlink)";
+		$sql="INSERT INTO services_links (linkid,servicedownid,serviceupid,soft,weight) values ($linkid,$servicedownid,$serviceupid,$softlink,$weight)";
 		$result=DBexecute($sql);
 
 		if(!$result)
@@ -585,7 +585,7 @@
 
 	function	get_service_by_serviceid($serviceid)
 	{
-		$res = DBfetch(DBselect("SELECT * FROM services WHERE serviceid=".$serviceid));
+		$res = DBfetch(DBselect("SELECT *,weight FROM services, services_links WHERE serviceid=".$serviceid." and servicedownid=".$serviceid));
 		if(!$res)
 		{
 			error("No service with serviceid=[".$serviceid."]");
@@ -614,19 +614,25 @@
 		elseif($algorithm == SERVICE_ALGORITHM_MIN){
 			return S_PROBLEM_IF_ALL;
 		}
+		elseif($algorithm == SERVICE_ALGORITHM_AVG){
+                        return S_PROBLEM_AVG;
+		}
+                elseif($algorithm == SERVICE_ALGORITHM_WEIGHT){
+                        return S_PROBLEM_WEIGHT;
+		}
 		return S_UNKNOWN;
 	}
 
 	function get_service_childs($serviceid,$soft=0){
 		$childs = array();
 
-		$query = 'SELECT sl.servicedownid '.
+		$query = 'SELECT sl.servicedownid, sl.weight '.
 			' FROM services_links sl '.
 			' WHERE sl.serviceupid = '.$serviceid.($soft?'':' AND sl.soft <> 1');
 
 		$res =  DBSelect($query);
 		while($row = DBFetch($res)){
-			$childs[] = $row['servicedownid'];
+			$childs[] = $row['servicedownid'][$row['weight']];
 			$childs = zbx_array_merge($childs, get_service_childs($row['servicedownid']));
 		}
 		return $childs;
@@ -741,7 +747,7 @@
 		$algorithm = $rows['algorithm'];
 
 		if(SERVICE_ALGORITHM_NONE == $algorithm){
-			/* Do nothing */
+			/* Do nothing */ 
 		}
 		else if((SERVICE_ALGORITHM_MAX == $algorithm) || (SERVICE_ALGORITHM_MIN == $algorithm)){
 
@@ -866,4 +872,69 @@
 
 	return $result;
 }
+
+//fjrial
+function calculate_avg($serviceid, $period_start, $period_end){
+$result = DBselect('SELECT servicedownid FROM services_links WHERE serviceupid='.$serviceid);
+$ok = 0;
+$problem = 0;
+$ok_time = 0;
+$problem_time = 0;
+$downtime_time= 0;
+$childnumber=0;
+while ($row=DBfetch($result)){
+	$servicedownid = $row['servicedownid']; 
+	$sla_id = calculate_service_availability($servicedownid,$period_start,$period_end);
+        $ok = $ok + $sla_id['ok'];
+        $problem = $problem + $sla_id['problem'];
+	$ok_time = $ok_time + $sla_id['ok_time'];
+	$problem_time = $problem_time + $sla_id['problem_time'];
+	$downtime_time= $downtime_time + $sla_id['downtime_time'];
+	$childnumber+=1;
+	}
+
+$sla_time = array(
+                        'dt' => array('problem_time' => 0, 'ok_time' => 0),
+                        'ut' => array('problem_time' => 0, 'ok_time' => 0)
+                        );
+$sla_time['ok'] = $ok/$childnumber;
+$sla_time['problem'] = $problem/$childnumber;
+$sla_time['ok_time'] = $ok_time/$childnumber;
+$sla_time['problem_time'] = $problem_time/$childnumber;
+$sla_time['downtime_time'] = $downtime_time/$childnumber;
+
+return $sla_time;
+}
+
+function calculate_weight($serviceid, $period_start, $period_end){
+$result = DBselect('SELECT servicedownid,weight FROM services_links WHERE serviceupid='.$serviceid);
+$ok = 0;
+$problem = 0;
+$ok_time = 0;
+$problem_time = 0;
+$downtime_time= 0;
+while ($row=DBfetch($result)){
+        $servicedownid = $row['servicedownid'];
+        $sla_id = calculate_service_availability($servicedownid,$period_start,$period_end);
+        $ok = $ok + $sla_id['ok']*($row['weight']/100);
+        $problem = $problem + $sla_id['problem']*($row['weight']/100);
+        $ok_time = $ok_time + $sla_id['ok_time']*($row['weight']/100);
+        $problem_time = $problem_time + $sla_id['problem_time']*($row['weight']/100);
+        $downtime_time= $downtime_time + $sla_id['downtime_time']*($row['weight']/100);
+        }
+
+$sla_time = array(
+                        'dt' => array('problem_time' => 0, 'ok_time' => 0),
+                        'ut' => array('problem_time' => 0, 'ok_time' => 0)
+                        );
+$sla_time['ok'] = $ok;
+$sla_time['problem'] = $problem;
+$sla_time['ok_time'] = $ok_time;
+$sla_time['problem_time'] = $problem_time;
+$sla_time['downtime_time'] = $downtime_time;
+
+return $sla_time;
+}
+
+
 ?>
Index: svn_1.8.1_mod/1.8.1/frontends/php/services_form.php
===================================================================
--- svn_1.8.1_mod/1.8.1/frontends/php/services_form.php	(revision 10692)
+++ svn_1.8.1_mod/1.8.1/frontends/php/services_form.php	(working copy)
@@ -43,7 +43,8 @@
 		'group_serviceid'=>	array(T_ZBX_INT, O_OPT,	 P_SYS,	DB_ID,NULL),
 
 		'name'=>			array(T_ZBX_STR, O_OPT,  NULL,	NOT_EMPTY,	'isset({save_service})'),
-		'algorithm'=>		array(T_ZBX_INT, O_OPT,  NULL,	IN('0,1,2'),	'isset({save_service})'),
+		'algorithm'=>		array(T_ZBX_INT, O_OPT,  NULL,	IN('0,1,2,3,4'),	'isset({save_service})'),
+		'weight'=>		array(T_ZBX_INT, O_OPT,  NULL, BETWEEN(0,100), null),
 		'showsla'=>			array(T_ZBX_INT, O_OPT,  NULL,  IN('0,1'),null),
 		'goodsla'=>			array(T_ZBX_INT, O_OPT,  NULL,  BETWEEN(0,100),		null),
 		'sortorder'=>		array(T_ZBX_INT, O_OPT,  NULL,  BETWEEN(0,65535),	null),
@@ -88,13 +89,14 @@
 	check_fields($fields);
 
 //----------------------------------------------------------------------
-
 	$available_hosts = get_accessible_hosts_by_user($USER_DETAILS,PERM_READ_ONLY,PERM_RES_IDS_ARRAY);
 	$available_triggers = get_accessible_triggers(PERM_READ_ONLY, array(), PERM_RES_IDS_ARRAY);
 
 	if(isset($_REQUEST['serviceid']) && $_REQUEST['serviceid'] > 0){
-		$sql = 'SELECT s.* '.
-					' FROM services s '.
+		
+		$sql = 'SELECT s.*,sl.weight'.
+					' FROM services as s left outer join services_links as sl '.
+					' on s.serviceid=sl.servicedownid '.
 					' WHERE (s.triggerid IS NULL OR '.DBcondition('s.triggerid',$available_triggers).') '.
 						' AND s.serviceid='.$_REQUEST['serviceid'];
 		if(!$service = DBfetch(DBselect($sql))){
@@ -127,13 +129,13 @@
 			$result = update_service($service['serviceid'],
 				$_REQUEST['name'],$triggerid,$_REQUEST['algorithm'],
 				$_REQUEST['showsla'],$_REQUEST['goodsla'],$_REQUEST['sortorder'],
-				$service_times,$_REQUEST['parentid'],$childs);
+				$service_times,$_REQUEST['parentid'],$childs,$_REQUEST['weight']);
 		}
 		else {
 			$result = add_service(
 				$_REQUEST['name'],$triggerid,$_REQUEST['algorithm'],
 				$_REQUEST['showsla'],$_REQUEST['goodsla'],$_REQUEST['sortorder'],
-				$service_times,$_REQUEST['parentid'],$childs);
+				$service_times,$_REQUEST['parentid'],$childs,$_REQUEST['weight']);
 		}
 
 		$result = DBend()?$result:false;
@@ -378,6 +380,7 @@
 		$algorithm	= $service['algorithm'];
 		$showsla	= $service['showsla'];
 		$goodsla	= $service['goodsla'];
+		$weight		= $service['weight'];
 		$sortorder	= $service['sortorder'];
 		$triggerid	= $service['triggerid'];
 		$linktrigger	= isset($triggerid) ? 1 : 0;
@@ -431,7 +434,7 @@
 				'name' => $db_service_data['name'],
 				'serviceid' => $db_service_data['serviceid'],
 				'triggerid' => $db_service_data['triggerid'],
-				'soft' => $db_service_data['soft']
+				'soft' => $db_service_data['soft'],
 			);
 			if(str_in_array($child,	$childs)){
 				continue;
@@ -446,6 +449,7 @@
 		$goodsla	= get_request('goodsla',99.05);
 		$sortorder	= get_request('sortorder',0);
 		$algorithm	= get_request('algorithm',SERVICE_ALGORITHM_MAX);
+		$weight		= get_request('weight','0');
 		$triggerid	= get_request('triggerid',0);
 		$linktrigger	= get_request('linktrigger',0);
 //links
@@ -539,9 +543,12 @@
 
 //algorithm
 	$cmbAlg = new CComboBox('algorithm',$algorithm);
-	foreach(array(SERVICE_ALGORITHM_MAX, SERVICE_ALGORITHM_MIN, SERVICE_ALGORITHM_NONE) as $val)
+	 foreach(array(SERVICE_ALGORITHM_MAX, SERVICE_ALGORITHM_MIN, SERVICE_ALGORITHM_AVG, SERVICE_ALGORITHM_WEIGHT, SERVICE_ALGORITHM_NONE ) as $val)
 		$cmbAlg->addItem($val,algorithm2str($val));
 	$frmService->addRow(S_STATUS_CALCULATION_ALGORITHM, $cmbAlg);
+//weight
+        $frmService->addRow('Weight', new CTextBox('weight',$weight,3));
+
 //-------
 
 //SLA
@@ -744,6 +751,7 @@
 
 //sortorder
 	$frmService->addRow(S_SORT_ORDER_0_999, new CTextBox('sortorder',$sortorder,3));
+
 //---------
 
 	$frmService->addItemToBottomRow(new CButton('save_service',S_SAVE,'javascript: document.forms[0].action += \'?saction=1\';'));
Index: svn_1.8.1_mod/1.8.1/frontends/php/srv_status.php
===================================================================
--- svn_1.8.1_mod/1.8.1/frontends/php/srv_status.php	(revision 10692)
+++ svn_1.8.1_mod/1.8.1/frontends/php/srv_status.php	(working copy)
@@ -193,8 +193,15 @@
 			}
 
 			if($row['showsla'] == 1){
+//fjrial
+	        if ($row['algorithm']==3)
+                $stat = calculate_avg($row['serviceid'],$period_start,$period_end);
+		elseif ($row['algorithm']==4)
+		$stat = calculate_weight($row['serviceid'],$period_start,$period_end);
+                else
+                $stat = calculate_service_availability($row['serviceid'],$period_start,$period_end);
 
-				$stat = calculate_service_availability($row['serviceid'], $period_start, $period_end);
+			//	$stat = calculate_service_availability($row['serviceid'], $period_start, $period_end);
 				$p = min($stat['problem'], 20);
 				$sla_style = ($row['goodsla'] > $stat['ok'])?'on':'off';
 
