# This patch file was generated by NetBeans IDE
# This patch can be applied using context Tools: Apply Diff Patch action on respective folder.
# It uses platform neutral UTF-8 encoding.
# Above lines and this line are ignored by the patching process.
Index: moodle/lib/blocklib.php
--- moodle/lib/blocklib.php Base (1.129.2.7)
+++ moodle/lib/blocklib.php Locally Modified (Based On 1.129.2.7)
@@ -575,9 +575,22 @@
                 // This configuration will make sure that even if somehow the weights
                 // become not continuous, block move operations will eventually bring
                 // the situation back to normal without printing any warnings.
+                /*
                 if(!empty($pageblocks[$instance->position][$instance->weight - 1])) {
                     $other = $pageblocks[$instance->position][$instance->weight - 1];
+                }*/
+
+                if(!empty($pageblocks[$instance->position][$instance->weight - 1])) {
+                    //define instance's position in the array
+                    foreach($pageblocks[$instance->position] as $instancekeysindex => $index ){
+                        if($pageblocks[$instance->position][$instancekeysindex]->blockid == $instance->blockid){
+                            $instanceindex = $instancekeysindex;
                 }
+                    }
+                    $other = $pageblocks[$instance->position][$instanceindex - 1];
+                }
+
+                
                 if(!empty($other)) {
                     ++$other->weight;
                     if (!empty($pinned)) {
@@ -592,6 +605,7 @@
                 } else {
                     update_record('block_instance', $instance);
                 }
+                
             }
         break;
         case 'movedown':
@@ -612,9 +626,20 @@
                 // This configuration will make sure that even if somehow the weights
                 // become not continuous, block move operations will eventually bring
                 // the situation back to normal without printing any warnings.
-                if(!empty($pageblocks[$instance->position][$instance->weight + 1])) {
+                /*if(!empty($pageblocks[$instance->position][$instance->weight + 1])) {
                     $other = $pageblocks[$instance->position][$instance->weight + 1];
+                }*/
+
+                if(!empty($pageblocks[$instance->position][$instance->weight + 1])) {
+                    //define instance's position in the array
+                    foreach($pageblocks[$instance->position] as $instancekeysindex => $index ){
+                        if($pageblocks[$instance->position][$instancekeysindex]->blockid == $instance->blockid){
+                            $instanceindex = $instancekeysindex;
                 }
+                    }
+                    $other = $pageblocks[$instance->position][$instanceindex + 1];
+                }
+                
                 if(!empty($other)) {
                     --$other->weight;
                     if (!empty($pinned)) {
@@ -629,18 +654,31 @@
                 } else {
                     update_record('block_instance', $instance);
                 }
+                
             }
         break;
         case 'moveleft':
             if(empty($instance))  {
                 error('Invalid block instance for '. $blockaction);
             }
-
             // Where is the instance going to be moved?
             $newpos = $page->blocks_move_position($instance, BLOCK_MOVE_LEFT);
-            $newweight = (empty($pageblocks[$newpos]) ? 0 : max(array_keys($pageblocks[$newpos])) + 1);
+            //$newweight = 0; //(empty($pageblocks[$newpos]) ? 0 : max(array_keys($pageblocks[$newpos])) + 1);
+            $newweight = 0;// ((empty($pageblocks[$newpos]) || ( array_key_exists('pinned', $pageblocks[$newpos][max(array_keys($pageblocks[$newpos]))]) ) ) ? 0 : $pageblocks[$newpos][max(array_keys($pageblocks[$newpos])) ]->weight + 1);
 
+            if(!empty($pinned) && $pageblocks[$newpos][max(array_keys($pageblocks[$newpos])) ]->weight >= 0  ){
+                $newweight = $pageblocks[$newpos][max(array_keys($pageblocks[$newpos])) ]->weight + 1;
+                
+            }else if($pageblocks[$newpos][max(array_keys($pageblocks[$newpos])) ]->weight >= 0 && (!array_key_exists('pinned', $pageblocks[$newpos][max(array_keys($pageblocks[$newpos]))]) )) {
+                //make sure it's not pinned array
+                $newweight = $pageblocks[$newpos][max(array_keys($pageblocks[$newpos])) ]->weight + 1;
+                
+            }
+            
             blocks_execute_repositioning($instance, $newpos, $newweight, $pinned);
+            
+
+           
         break;
         case 'moveright':
             if(empty($instance))  {
@@ -649,8 +687,15 @@
 
             // Where is the instance going to be moved?
             $newpos    = $page->blocks_move_position($instance, BLOCK_MOVE_RIGHT);
-            $newweight = (empty($pageblocks[$newpos]) ? 0 : max(array_keys($pageblocks[$newpos])) + 1);
+            //$newweight = (empty($pageblocks[$newpos]) ? 0 : max(array_keys($pageblocks[$newpos])) + 1);
+            //$newweight = ((empty($pageblocks[$newpos]) || ( array_key_exists('pinned', $pageblocks[$newpos][max(array_keys($pageblocks[$newpos]))]) ) ) ? 0 : $pageblocks[$newpos][max(array_keys($pageblocks[$newpos])) ]->weight + 1);
+            $newweight = 0; //
 
+            if(!empty($pinned) && $pageblocks[$newpos][max(array_keys($pageblocks[$newpos])) ]->weight >= 0  ){
+                $newweight = $pageblocks[$newpos][max(array_keys($pageblocks[$newpos])) ]->weight + 1;
+            }else if($pageblocks[$newpos][max(array_keys($pageblocks[$newpos])) ]->weight >= 0  && (!array_key_exists('pinned', $pageblocks[$newpos][max(array_keys($pageblocks[$newpos]))]) )) {
+                $newweight = $pageblocks[$newpos][max(array_keys($pageblocks[$newpos])) ]->weight + 1;
+            }
             blocks_execute_repositioning($instance, $newpos, $newweight, $pinned);
         break;
         case 'add':
@@ -746,7 +791,8 @@
 
     // Close the weight gap we 'll leave behind
     if (!empty($pinned)) {
-        $sql = 'UPDATE '. $CFG->prefix .'block_instance SET weight = weight - 1 '.
+        //$sql = 'UPDATE '. $CFG->prefix .'block_instance SET weight = weight - 1 '.
+        $sql = 'UPDATE '. $CFG->prefix .'block_pinned SET weight = weight - 1 '.
                         'WHERE pagetype = \''. $instance->pagetype.
                         '\' AND position = \'' .$instance->position.
                         '\' AND weight > '. $instance->weight;
