[dev] [commit] r978 - phplib templates/admin wwwbase/admin wwwbase/js wwwbase/styles wwwbase/styles/jquery-wm

automailer at dexonline.ro automailer at dexonline.ro
Fri Sep 6 17:49:26 EEST 2013


Author: cata
Date: Fri Sep  6 17:49:26 2013
New Revision: 978

Log:
Add a rudimentary window manager to lexemEdit.php, so that different roles
can customize the layout according to their needs.
TODO: read the cookie and restore the window geometry on page load.

Added:
   wwwbase/js/jquery-wm.js
   wwwbase/js/jquery.cookie.js
   wwwbase/styles/jquery-wm/
   wwwbase/styles/jquery-wm/clear.gif   (contents, props changed)
   wwwbase/styles/jquery-wm/jquery.wm.default.icons.png   (contents, props changed)
   wwwbase/styles/jquery-wm/main.css
Modified:
   phplib/SmartyWrap.php
   templates/admin/lexemEdit.ihtml
   templates/admin/pageLayout.ihtml
   wwwbase/admin/lexemEdit.php
   wwwbase/js/lexemEdit.js
   wwwbase/styles/flex.css
   wwwbase/styles/lexemEdit.css

Modified: phplib/SmartyWrap.php
==============================================================================
--- phplib/SmartyWrap.php	Fri Sep  6 15:27:04 2013	(r977)
+++ phplib/SmartyWrap.php	Fri Sep  6 17:49:26 2013	(r978)
@@ -152,21 +152,22 @@
       case 'jqueryui':           self::$cssFiles[1] = 'lightness-1.10.3/jquery-ui-1.10.3.custom.min.css'; break;
       case 'jqgrid':             self::$cssFiles[2] = 'ui.jqgrid.css?v=3'; break;
       case 'elfinder':           self::$cssFiles[4] = 'elfinder.min.css?v=1'; break;
-      case 'zepu':               self::$cssFiles[5] = 'zepu.css?v=56'; break;
-      case 'polar':              self::$cssFiles[6] = 'polar.css?v=31'; break;
-      case 'mobile':             self::$cssFiles[7] = 'mobile.css?v=15'; break;
-      case 'flex':               self::$cssFiles[8] = 'flex.css?v=10'; break;
-      case 'paradigm':           self::$cssFiles[9] = 'paradigm.css?v=1'; break;
-      case 'hangman':            self::$cssFiles[10] = 'hangman.css?v=3'; break;
-      case 'mill':               self::$cssFiles[11] = 'mill.css?v=2'; break;
-      case 'lexemEdit':          self::$cssFiles[12] = 'lexemEdit.css?v=4'; break;
-      case 'jcrop':              self::$cssFiles[13] = 'jquery.Jcrop.min.css?v=2'; break;
+      case 'windowEngine':       self::$cssFiles[5] = 'jquery-wm/main.css'; break;
+      case 'zepu':               self::$cssFiles[6] = 'zepu.css?v=56'; break;
+      case 'polar':              self::$cssFiles[7] = 'polar.css?v=31'; break;
+      case 'mobile':             self::$cssFiles[8] = 'mobile.css?v=15'; break;
+      case 'flex':               self::$cssFiles[9] = 'flex.css?v=10'; break;
+      case 'paradigm':           self::$cssFiles[10] = 'paradigm.css?v=1'; break;
+      case 'hangman':            self::$cssFiles[11] = 'hangman.css?v=3'; break;
+      case 'mill':               self::$cssFiles[12] = 'mill.css?v=2'; break;
+      case 'lexemEdit':          self::$cssFiles[13] = 'lexemEdit.css?v=4'; break;
+      case 'jcrop':              self::$cssFiles[14] = 'jquery.Jcrop.min.css?v=2'; break;
       case 'easyui':
-        self::$cssFiles[14] = 'easyui/default/easyui.css?v=1';
-        self::$cssFiles[15] = 'easyui/icon.css?v=1';
+        self::$cssFiles[15] = 'easyui/default/easyui.css?v=1';
+        self::$cssFiles[16] = 'easyui/icon.css?v=1';
         break;
-      case 'select2':            self::$cssFiles[16] = 'select2/select2.css?v=3'; break;
-      case 'gallery':            self::$cssFiles[17] = 'lightbox.css'; break;
+      case 'select2':            self::$cssFiles[17] = 'select2/select2.css?v=3'; break;
+      case 'gallery':            self::$cssFiles[18] = 'lightbox.css'; break;
       default:
         FlashMessage::add("Cannot load CSS file {$id}");
         util_redirect(util_getWwwRoot());
@@ -189,19 +190,21 @@
       case 'tablesorter':      self::$jsFiles[7] = 'jquery.tablesorter.min.js?v=2'; break;
       case 'pager':            self::$jsFiles[8] = 'jquery.tablesorter.pager.js'; break;
       case 'elfinder':         self::$jsFiles[9] = 'elfinder.min.js?v=1'; break; 
-      case 'dex':              self::$jsFiles[10] = 'dex.js?v=24'; break;
-      case 'flex':             self::$jsFiles[11] = 'flex.js?v=2'; break;
-      case 'mobile':           self::$jsFiles[12] = 'mobile.js?v=2'; break;
-      case 'hangman':          self::$jsFiles[13] = 'hangman.js?v=5'; break;
-      case 'mill':             self::$jsFiles[14] = 'mill.js?v=3'; break;
-      case 'wotd':             self::$jsFiles[15] = 'wotd.js?v=1';
-      case 'lexemEdit':        self::$jsFiles[16] = 'lexemEdit.js?v=5'; break;
-      case 'jcrop':            self::$jsFiles[17] = 'jquery.Jcrop.min.js?v=2'; break;
-      case 'easyui':           self::$jsFiles[18] = 'jquery.easyui.min.js?v=1'; break;
-      case 'select2':          self::$jsFiles[19] = 'select2.min.js?v=3'; break;
-      case 'select2Dev':       self::$jsFiles[20] = 'select2Dev.js?v=2'; break;
-      case 'visualTag':        self::$jsFiles[21] = 'visualTag.js'; break;
-      case 'gallery':         self::$jsFiles[22] = 'lightbox-2.6.min.js'; break;
+      case 'windowEngine':     self::$jsFiles[10] = 'jquery-wm.js'; break;
+      case 'cookie':           self::$jsFiles[11] = 'jquery.cookie.js?v=1'; break;
+      case 'dex':              self::$jsFiles[12] = 'dex.js?v=24'; break;
+      case 'flex':             self::$jsFiles[13] = 'flex.js?v=2'; break;
+      case 'mobile':           self::$jsFiles[14] = 'mobile.js?v=2'; break;
+      case 'hangman':          self::$jsFiles[15] = 'hangman.js?v=5'; break;
+      case 'mill':             self::$jsFiles[16] = 'mill.js?v=3'; break;
+      case 'wotd':             self::$jsFiles[17] = 'wotd.js?v=1';
+      case 'lexemEdit':        self::$jsFiles[18] = 'lexemEdit.js?v=5'; break;
+      case 'jcrop':            self::$jsFiles[19] = 'jquery.Jcrop.min.js?v=2'; break;
+      case 'easyui':           self::$jsFiles[20] = 'jquery.easyui.min.js?v=1'; break;
+      case 'select2':          self::$jsFiles[21] = 'select2.min.js?v=3'; break;
+      case 'select2Dev':       self::$jsFiles[22] = 'select2Dev.js?v=2'; break;
+      case 'visualTag':        self::$jsFiles[23] = 'visualTag.js'; break;
+      case 'gallery':          self::$jsFiles[24] = 'lightbox-2.6.min.js'; break;
       default:
         FlashMessage::add("Cannot load JS script {$id}");
         util_redirect(util_getWwwRoot());

Modified: templates/admin/lexemEdit.ihtml
==============================================================================
--- templates/admin/lexemEdit.ihtml	Fri Sep  6 15:27:04 2013	(r977)
+++ templates/admin/lexemEdit.ihtml	Fri Sep  6 17:49:26 2013	(r978)
@@ -25,21 +25,31 @@
 
   {include file="admin/lexemEditActions.ihtml"}
 
-<div class="box">
-  <div class="boxTitle">Proprietăți</div>
-  <div class="boxContents">
+  <div id="wmCanvas"></div>
+
+  <div class="box" data-id="properties" data-title="Proprietăți" data-left="0" data-top="0" data-width="330" data-height="320">
     <table>
       <tr>
         <td><label for="lexemForm">nume:</label></td>
         <td>
-          <input type="text" id="lexemForm" name="lexemForm" value="{$lexem->form|escape}" size="40" {if !$canEdit.form}readonly{/if}/>
-
+          <input type="text" id="lexemForm" name="lexemForm" value="{$lexem->form|escape}" size="20" {if !$canEdit.form}readonly{/if}/>
+  
           <span class="tooltip" title="Cuvântul-titlu. Accentul trebuie indicat chiar și pentru lexemele monosilabice, altfel paradigma nu va
           conține deloc accente. Valoarea acestui câmp este folosită la căutări și este vizibilă public la afișarea flexiunilor unui cuvânt. Odată
           ce un lexem a fost inclus în LOC, numele și descrierea lexemului mai pot fi modificate numai de către moderatorii LOC."> </span>
         </td>
-
-        <td class="rightColumn"><label for="lexemSourceIds">surse:</label></td>
+      </tr>
+  
+      <tr>
+        <td><label for="lexemDescription">descriere:</label></td>
+        <td>
+          <input type="text" id="lexemDescription" name="lexemDescription" value="{$lexem->description|escape}" size="20"
+                 placeholder="opțională, pentru diferențierea omonimelor" {if !$canEdit.description}readonly{/if}/>
+        </td>
+      </tr>
+  
+      <tr>
+        <td><label for="lexemSourceIds">surse:</label></td>
         <td>
           <select id="lexemSourceIds" name="lexemSourceIds[]" multiple="multiple" {if !$canEdit.sources}readonly{/if}>
             {foreach from=$sources item=s}
@@ -48,48 +58,36 @@
           </select>
         </td>
       </tr>
-
+  
       <tr>
-        <td><label for="lexemDescription">descriere:</label></td>
-        <td>
-          <input type="text" id="lexemDescription" name="lexemDescription" value="{$lexem->description|escape}" size="40"
-                 placeholder="opțională, pentru diferențierea omonimelor" {if !$canEdit.description}readonly{/if}/>
-        </td>
-
-        <td class="rightColumn"><label for="lexemTags">etichete:</label></td>
+        <td><label for="lexemTags">etichete:</label></td>
         <td>
-          <input type="text" id="lexemTags" name="lexemTags" value="{$lexem->tags|escape}" size="40"
+          <input type="text" id="lexemTags" name="lexemTags" value="{$lexem->tags|escape}" size="20"
                  placeholder="explicații despre sursa flexiunii" {if !$canEdit.tags}readonly{/if}/>
           <span class="tooltip" title="O scurtă clasificare, vizibilă public, care marchează sursa flexiunii. Pentru cuvintele cu flexiuni în DOOM-ul
           curent (DOOM2 în acest moment), ea poate fi vidă. Sursele pot reprezenta dicționare, autori cunoscuți, inclusiv părerea moderatorului, dar
           trebuie documentate clar aceste situații."> </span>
         </td>
       </tr>
-
+  
       <tr>
-        <td><label for="variantOfId">variantă a lui:</label></td>
+        <td><label for="hyphenations">silabisiri:</label></td>
         <td>
-          <input id="variantOfId" name="variantOfId" value="{$lexem->variantOfId}" type="text" {if !$canEdit.variants}readonly{/if}/>
-          <span class="tooltip"
-                title="Variantele nu pot avea sensuri, exemple, variante sau etimologii proprii. Ele pot avea pronunții și silabisiri proprii."> </span>
+          <input id="hyphenations" name="hyphenations" type="text" value="{$lexem->hyphenations}" size="20"
+                 placeholder="opționale, despărțite prin virgule" {if !$canEdit.hyphenations}readonly{/if}>
         </td>
-
-        <td class="rightColumn"><label for="variantIds">variante:</label></td>
+        </tr>
+  
+      <tr>
+        <td><label for="pronunciations">pronunții:</label></td>
         <td>
-          <input id="variantIds" name="variantIds" value="{','|implode:$variantIds}" type="text" {if !$canEdit.variants}readonly{/if}/>
-          <span class="tooltip"
-                title="Variantele nu pot avea sensuri, exemple, variante sau etimologii proprii. Ele pot avea pronunții și silabisiri proprii."> </span>
+          <input id="pronunciations" name="pronunciations" type="text" value="{$lexem->pronunciations}" size="20"
+                 placeholder="opționale, despărțite prin virgule" {if !$canEdit.pronunciations}readonly{/if}>
         </td>
       </tr>
-
+  
       <tr>
-        <td><label for="hyphenations">silabisiri:</label></td>
-        <td>
-          <input id="hyphenations" name="hyphenations" type="text" value="{$lexem->hyphenations}" size="40"
-                 placeholder="opționale, despărțite prin virgule" {if !$canEdit.hyphenations}readonly{/if}>
-        </td>
-
-        <td class="rightColumn"><label for="lexemIsLoc">inclus în LOC:</label></td>
+        <td><label for="lexemIsLoc">inclus în LOC:</label></td>
         <td>
           {if $canEdit.isLoc}
             <input type="checkbox" id="lexemIsLoc" name="lexemIsLoc" value="1" {if $lexem->isLoc}checked="checked"{/if}/>
@@ -101,108 +99,114 @@
           numai de către un set restrâns de administratori ai LOC."> </span>
         </td>
       </tr>
-
+  
       <tr>
-        <td><label for="pronunciations">pronunții:</label></td>
-        <td>
-          <input id="pronunciations" name="pronunciations" type="text" value="{$lexem->pronunciations}" size="40"
-                 placeholder="opționale, despărțite prin virgule" {if !$canEdit.pronunciations}readonly{/if}>
-        </td>
-
-        <td class="rightColumn"><label for="needsAccent">necesită accent:</label></td>
+        <td><label for="needsAccent">necesită accent:</label></td>
         <td>        
           <input type="checkbox" id="needsAccent" name="needsAccent" value="1" {if !$lexem->noAccent}checked{/if}/>
           <span class="tooltip" title="Majoritatea lexemelor necesită accent. Excepție fac cuvintele compuse, denumirile științifice de animale și
           plante, elementele de compunere etc."> </span>
         </td>
       </tr>
-
+  
+      <tr>
+        <td><label for="variantOfId">variantă a lui:</label></td>
+        <td>
+          <input id="variantOfId" name="variantOfId" value="{$lexem->variantOfId}" type="text" {if !$canEdit.variants}readonly{/if}/>
+          <span class="tooltip"
+                title="Variantele nu pot avea sensuri, exemple, variante sau etimologii proprii. Ele pot avea pronunții și silabisiri proprii."> </span>
+        </td>
+      </tr>
+  
+      <tr>  
+        <td><label for="variantIds">variante:</label></td>
+        <td>
+          <input id="variantIds" name="variantIds" value="{','|implode:$variantIds}" type="text" {if !$canEdit.variants}readonly{/if}/>
+          <span class="tooltip"
+                title="Variantele nu pot avea sensuri, exemple, variante sau etimologii proprii. Ele pot avea pronunții și silabisiri proprii."> </span>
+        </td>
+      </tr>
+  
       {if $homonyms}
         <tr>
           <td>omonime:</td>
-          <td colspan="3">
-            {foreach from=$homonyms item=h key=i}
-              {if $i}|{/if}
+          <td>
+            {foreach from=$homonyms item=h}
               <a href="lexemEdit.php?lexemId={$h->id}">{include file="common/bits/lexemName.ihtml" lexem=$h}</a>
-              [{$h->modelType}{$h->modelNumber}{$h->restriction}]
+              {$h->modelType}{$h->modelNumber}{$h->restriction}<br/>
             {/foreach}
           </td>
         </tr>
       {/if}
     </table>
   </div>
-</div>
 
-<div class="box">
-  <div class="boxTitle">Paradigmă</div>
-  <div class="boxContents">
-
-    {if $canEdit.paradigm}
-      model:   
-      <select name="modelType" id="modelTypeListId" onchange="return updateModelList(false)">
-        {foreach from=$modelTypes item=mt}
-          <option value="{$mt->code|escape}"
-            {if $mt->code == $lexem->modelType}selected{/if}
-            >{$mt->code|escape}
-          </option>
-        {/foreach}
-      </select>
-      <select name="modelNumber" id="modelListId">
-        {foreach from=$models item=m}
-          <option value="{$m->number}"
-            {if $m->number == $lexem->modelNumber}selected{/if}
-            >{$m->number}{if !$m->id}*{/if} ({$m->exponent})
-          </option>
+  <div class="box" data-id="paradigm" data-title="Paradigmă" data-left="345" data-top="0" data-width="650" data-height="320">
+    <div>
+      {if $canEdit.paradigm}
+        model:
+        <select name="modelType" id="modelTypeListId" onchange="return updateModelList(false)">
+          {foreach from=$modelTypes item=mt}
+            <option value="{$mt->code|escape}"
+              {if $mt->code == $lexem->modelType}selected{/if}
+              >{$mt->code|escape}
+            </option>
+          {/foreach}
+        </select>
+        <select name="modelNumber" id="modelListId">
+          {foreach from=$models item=m}
+            <option value="{$m->number}"
+              {if $m->number == $lexem->modelNumber}selected{/if}
+              >{$m->number}{if !$m->id}*{/if} ({$m->exponent})
+            </option>
+          {/foreach}
+        </select>
+        <br/>
+  
+        restricții:
+        <input type="checkbox" id="restrS" name="restr[]" value="S" {if $restrS}checked{/if}/><label for="restrS">Singular</label>
+         
+        <input type="checkbox" id="restrP" name="restr[]" value="P" {if $restrP}checked{/if}/><label for="restrP">Plural</label>
+         
+        <input type="checkbox" id="restrU" name="restr[]" value="U" {if $restrU}checked{/if}/><label for="restrU">Unipersonal</label>
+         
+        <input type="checkbox" id="restrI" name="restr[]" value="I" {if $restrI}checked{/if}/><label for="restrI">Impersonal</label>
+         
+        <input type="checkbox" id="restrT" name="restr[]" value="T" {if $restrT}checked{/if}/><label for="restrT">Trecut</label>
+        <br/>
+  
+        {foreach from=$suggestedLexems item=l}
+          {include file="common/bits/lexemName.ihtml" lexem=$l accent=1}
+          {include file="common/bits/similarModel.ihtml" similar=$l} |
         {/foreach}
-      </select>
-
-      restricții:
-      <input type="checkbox" id="restrS" name="restr[]" value="S" {if $restrS}checked{/if}/><label for="restrS">Singular</label>
-       
-      <input type="checkbox" id="restrP" name="restr[]" value="P" {if $restrP}checked{/if}/><label for="restrP">Plural</label>
-       
-      <input type="checkbox" id="restrU" name="restr[]" value="U" {if $restrU}checked{/if}/><label for="restrU">Unipersonal</label>
-       
-      <input type="checkbox" id="restrI" name="restr[]" value="I" {if $restrI}checked{/if}/><label for="restrI">Impersonal</label>
-       
-      <input type="checkbox" id="restrT" name="restr[]" value="T" {if $restrT}checked{/if}/><label for="restrT">Trecut</label>
+        <input id="similarLexemId" type="text" name="similarLexemId"/>
+      {else}
+        <input type="hidden" name="modelType" value="{$lexem->modelType}"/>
+        <input type="hidden" name="modelNumber" value="{$lexem->modelNumber}"/>
+        {if $restrS}<input type="hidden" name="restr[]" value="S"/>{/if}
+        {if $restrP}<input type="hidden" name="restr[]" value="P"/>{/if}
+        {if $restrU}<input type="hidden" name="restr[]" value="U"/>{/if}
+        {if $restrI}<input type="hidden" name="restr[]" value="I"/>{/if}
+        {if $restrT}<input type="hidden" name="restr[]" value="T"/>{/if}
+        <b>{include file="common/bits/lexemName.ihtml" lexem=$lexem}</b> se flexionează conform modelului
+        {$lexem->modelType}{$lexem->modelNumber}{$lexem->restriction}.
+      {/if}
+  
+      {if $ifMap}
+        {include file="common/paradigm/current/paradigm.ihtml" lexem=$lexem ifMap=$ifMap modelType=$modelType}
+      {/if}
       <br/>
-
-      sugestii:
-      {foreach from=$suggestedLexems item=l}
-        {include file="common/bits/lexemName.ihtml" lexem=$l accent=1}
-        {include file="common/bits/similarModel.ihtml" similar=$l} |
-      {/foreach}
-      <input id="similarLexemId" type="text" name="similarLexemId"/>
-    {else}
-      <input type="hidden" name="modelType" value="{$lexem->modelType}"/>
-      <input type="hidden" name="modelNumber" value="{$lexem->modelNumber}"/>
-      {if $restrS}<input type="hidden" name="restr[]" value="S"/>{/if}
-      {if $restrP}<input type="hidden" name="restr[]" value="P"/>{/if}
-      {if $restrU}<input type="hidden" name="restr[]" value="U"/>{/if}
-      {if $restrI}<input type="hidden" name="restr[]" value="I"/>{/if}
-      {if $restrT}<input type="hidden" name="restr[]" value="T"/>{/if}
-      <b>{include file="common/bits/lexemName.ihtml" lexem=$lexem}</b> se flexionează conform modelului
-      {$lexem->modelType}{$lexem->modelNumber}{$lexem->restriction}.
-    {/if}
-
-    {if $ifMap}
-      {include file="common/paradigm/current/paradigm.ihtml" lexem=$lexem ifMap=$ifMap modelType=$modelType}
-    {/if}
-    <br/>
-
-    Comentarii despre paradigmă:
-    <br/>
-
-    <textarea name="lexemComment" rows="3" cols="60" class="commentTextArea"
-              placeholder="Dacă observați greșeli în paradigmă, notați-le în acest câmp și ele vor fi semnalate unui moderator cu drept de gestiune a LOC."
-              >{$lexem->comment|escape}</textarea>
+  
+      Comentarii despre paradigmă:
+      <br/>
+  
+      <textarea name="lexemComment" rows="3" cols="60" class="commentTextArea"
+                placeholder="Dacă observați greșeli în paradigmă, notați-le în acest câmp și ele vor fi semnalate unui moderator cu drept de gestiune a LOC."
+                >{$lexem->comment|escape}</textarea>
+    </div>
   </div>
-</div>
 
-<div class="box">
-  <div class="boxTitle">Sensuri</div>
-  <div id="meaningTreeContainer" class="boxContents">
+  <div class="box meaningTreeContainer" data-id="meaningTree" data-title="Sensuri" data-left="10" data-top="330" data-width="960" data-height="280" data-minimized="1">
     {include file="common/bits/meaningTree.ihtml" meanings=$meanings id="meaningTree"}
 
     <div id="meaningMenu">
@@ -222,12 +226,9 @@
       <input type="hidden" name="structSealed" value="{$lexem->structSealed}"/>
     {/if}
   </div>
-</div>
 
-{if $canEdit.meanings}
-  <div class="box">
-    <div class="boxTitle">Editorul de sensuri</div>
-    <div class="boxContents">
+  {if $canEdit.meanings}
+    <div class="box" data-id="meaningEditor" data-title="Editorul de sensuri" data-left="10" data-top="30" data-width="960" data-height="280" data-minimized="1">
       <table class="meaningEditor">
         <tr>
           <td class="leftColumn" rowspan="5">
@@ -283,17 +284,15 @@
         </tr>
       </table>
     </div>
-  </div>
-{/if}
+  {/if}
+
+  <div class="box" data-id="definitions" data-title="Definiții asociate ({$searchResults|@count})" data-left="0" data-top="335" data-width="995" data-height="300">
+    <div>
+      <a href="#" class="defFilterLink">toate</a>
+      <a href="#" class="defFilterLink structured">structurate</a>
+      <a href="#" class="defFilterLink unstructured">nestructurate</a>
+    </div>
 
-<div class="box">
-  <div class="boxTitle">
-    Definiții asociate ({$searchResults|@count})
-    <a href="#" class="defFilterLink">toate</a>
-    <a href="#" class="defFilterLink structured">structurate</a>
-    <a href="#" class="defFilterLink unstructured">nestructurate</a>
-  </div>
-  <div class="boxContents">
     {foreach from=$searchResults item=row}
       <div class="defWrapper {if $row->definition->structured}structured{else}unstructured{/if}" id="def_{$row->definition->id}">
         <div data-code="0" data-active class="rep internal">{$row->definition->internalRepAbbrev|escape}</div>
@@ -346,9 +345,6 @@
       </div>
     {/if}
   </div>
-</div>
-
-{include file="admin/lexemEditActions.ihtml"}
 </form>
 
 <script>

Modified: templates/admin/pageLayout.ihtml
==============================================================================
--- templates/admin/pageLayout.ihtml	Fri Sep  6 15:27:04 2013	(r977)
+++ templates/admin/pageLayout.ihtml	Fri Sep  6 17:49:26 2013	(r978)
@@ -9,7 +9,9 @@
   </head>
 
   <body>
-    {include file="admin/header.ihtml" title=$sectionTitle count=$sectionCount showSources=$sectionSources}
+    {if !$noAdminHeader}
+      {include file="admin/header.ihtml" title=$sectionTitle count=$sectionCount showSources=$sectionSources}
+    {/if}
     {include file="admin/recentlyVisited.ihtml"}
     {include file="common/flashMessages.ihtml"}
     {include file="common/errorMessage.ihtml"}

Modified: wwwbase/admin/lexemEdit.php
==============================================================================
--- wwwbase/admin/lexemEdit.php	Fri Sep  6 15:27:04 2013	(r977)
+++ wwwbase/admin/lexemEdit.php	Fri Sep  6 17:49:26 2013	(r978)
@@ -135,9 +135,10 @@
 SmartyWrap::assign('models', FlexModel::loadByType($lexem->modelType));
 SmartyWrap::assign('canEdit', $canEdit);
 SmartyWrap::assign('allStatuses', util_getAllStatuses());
-SmartyWrap::addCss('easyui', 'jqueryui', 'paradigm', 'select2', 'lexemEdit');
-SmartyWrap::addJs('easyui', 'jqueryui', 'select2', 'select2Dev', 'lexemEdit');
+SmartyWrap::addCss('easyui', 'jqueryui', 'paradigm', 'select2', 'lexemEdit', 'windowEngine');
+SmartyWrap::addJs('easyui', 'jqueryui', 'select2', 'select2Dev', 'lexemEdit', 'windowEngine', 'cookie');
 SmartyWrap::assign('sectionTitle', "Editare lexem: {$lexem->form} {$lexem->modelType}{$lexem->modelNumber}{$lexem->restriction}");
+SmartyWrap::assign('noAdminHeader', true);
 SmartyWrap::displayAdminPage('admin/lexemEdit.ihtml');
 
 /**************************************************************************/

Added: wwwbase/js/jquery-wm.js
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ wwwbase/js/jquery-wm.js	Fri Sep  6 17:49:26 2013	(r978)
@@ -0,0 +1,341 @@
+/*jquery.WM.js - Window Manager for jQuery.
+ * Copyright (c) 2009 Philip Collins
+ * Licensed under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ * modified by cata -- do not replace without diffing
+ */
+(function($){
+  var $win,lastMouseX,lastMouseY,zIndex=100000,minH,minW=160,newWinOffset=50;
+
+  var isIE = navigator.userAgent.match(/MSIE/);
+
+  var template = '<div class=window><div class=windowtitlebar><img src=/favicon.ico width=16 height=16 class=titlebaricon><div class=titlebartext></div><div class=horizbuts><div class=minimizebut title=minimize></div><div class=restorebut title=restore></div><div class=maximizebut title=maximize></div><div class=closebut title=close></div></div></div><div class=windowcontent></div><div class=resizer-tl></div><div class=resizer-t></div><div class=resizer-tr></div><div class=resizer-r></div><div class=resizer-br></div><div class=resizer-b></div><div class=resizer-bl></div><div class=resizer-l></div></div>';
+
+  var resizerP = $('<div id=resizerproxy>').mousemove(function(e){
+    if (resizeMask & 1) {
+      resizerPos.top += (lastMouseY-e.pageY) * -1;
+      var a=resizerPos.parentH-resizerPos.top-resizerPos.bottom-minH;
+      if (a<0) resizerPos.top+=a;
+    }
+    else if (resizeMask & 4) {
+      resizerPos.bottom += (lastMouseY-e.pageY);
+      var a=resizerPos.parentH-resizerPos.top-resizerPos.bottom-minH;
+      if (a<0) resizerPos.bottom+=a;
+    }
+    if (resizeMask & 8) {
+      resizerPos.left += (lastMouseX-e.pageX) * -1;
+      var a=resizerPos.parentW-resizerPos.left-resizerPos.right-minW;
+      if (a<0) resizerPos.left+=a;
+    }
+    else if (resizeMask & 2) {
+      resizerPos.right += (lastMouseX-e.pageX);
+      var a=resizerPos.parentW-resizerPos.left-resizerPos.right-minW;
+      if (a<0) resizerPos.left+=a;
+    }
+    lastMouseX = e.pageX;
+    lastMouseY = e.pageY;
+    resizerC.css(resizerPos);
+    return false;
+  })
+  .mouseup(function(){
+    resizerP.hide();
+    $win.css(resizerPos).WM('ensure_viewable');
+    $win = undefined;
+    return false;
+  });
+
+  var resizerC=$('<div>').appendTo(resizerP);
+
+  var resizerPos,resizeMask; // top=1,right=2,bottom=4,left=8
+
+  var onStartResize = function(e){
+    var rv = this.className.match(/resizer\-(\w+)/);
+    if (rv.length != 2) return true;
+    var type = rv[1];
+    resizeMask = 0;
+    if (type[0]=='t') resizeMask |= 1;
+    else if (type[0]=='b') resizeMask |= 4;
+    if (type.match(/l/)) resizeMask |= 8;
+    else if (type.match(/r/)) resizeMask |= 2;
+    $win = $(this).closest('.window')
+      .removeClass('minimized').removeClass('maximized').removeData('oldPos');
+    minH = $win.find('> .windowtitlebar').height() + 5;
+    resizerPos = getPos($win);
+    resizerPos.right = resizerPos.parentW-$win.outerWidth()-resizerPos.left;
+    resizerPos.bottom = resizerPos.parentH-$win.outerHeight()-resizerPos.top;
+    resizerPos.width = resizerPos.height = 'auto';
+    lastMouseX = e.pageX;
+    lastMouseY = e.pageY;
+    resizerC.css(resizerPos);
+    resizerP.show();
+    return false;
+  };
+
+  var moverP = $('<div id=moverproxy>').mousemove(function(e){
+    moverPos.top += (lastMouseY-e.pageY) * -1;
+    moverPos.left += (lastMouseX-e.pageX) * -1;
+    lastMouseX = e.pageX;
+    lastMouseY = e.pageY;
+    moverC.css(moverPos);
+    return false;
+  })
+  .mouseup(function(){
+    moverP.hide();
+    $win.css(moverPos).WM('ensure_viewable').removeClass('moving');
+    $win = undefined;
+    return false;
+  });
+
+  var moverPos={left:0,top:0,right:'auto',bottom:'auto',width:0,height:0};
+  var moverC=$('<div>').appendTo(moverP);
+  var lastClick=0;
+  var onStartMove = function(e){
+    if (e.button && e.button==2) return true;
+    $win = $(this).closest('.window');
+    // if dbdclick title bar, then maximize
+    if (!isIE)
+    var t1 = new Date().getTime();
+    if (t1 - lastClick <= 250) {
+      lastClick = 0;
+      $win.triggerHandler('dblclick');
+      return false;
+    }
+
+    lastClick = t1;
+    $win.WM('raise');
+    moverPos = getPos($win);
+    moverPos.width = $win.width();
+    moverPos.height = $win.height();
+    moverPos.bottom = moverPos.right = 'auto';
+    moverC.css(moverPos);
+    moverP.show();
+    lastMouseX = e.pageX;
+    lastMouseY = e.pageY;
+    return false;
+  };
+
+  // take fixed pos into account
+  var getPos=function(w){
+    var p = w.offset();  
+    p.top -= $(document).scrollTop();
+    p.left -= $(document).scrollLeft();
+    p.parentW = $(window).width();
+    p.parentH = $(window).height();
+    return p;
+  };
+
+  // save win current position (called before max or mining a win) 
+  var savePos=function(w){
+    if (! w.data('oldPos')) {
+      var p = getPos(w);
+      w.data('oldPos',{top:p.top,left:p.left,right:'auto',
+        bottom:'auto',width:w.width(),height:w.height()});
+    }
+  };
+
+  var cancelBubble = function(){ return false; };
+  var onClickWindow = function(){$(this).closest('.window').WM('raise');return true;};
+  var onClickMinimizeBut = function(){$(this).closest('.window').WM('minimize');return false;};
+  var onClickRestoreBut = function(){$(this).closest('.window').WM('restore');return false;};
+  var onClickMaximizeBut = function(){$(this).closest('.window').WM('maximize');return false;};
+  var onClickCloseBut = function(){$(this).closest('.window').WM('close');return false;};
+  var onDblClickTitlebar=function(){
+    var w = $(this).closest('.window');
+    if (w.hasClass('maximized')) w.WM('restore');
+    else w.WM('maximize');
+    return false;
+  };
+  moverP[0].onselectstart=resizerP[0].onselectstart=cancelBubble;
+
+    
+  var methods = {};
+  methods.ensure_viewable=function(){
+    this.filter('.window').each(function(){
+      var w = $(this);
+      var p = getPos(w);
+      if (p.top < 0)
+        w.css('top',0);
+      else if (p.parentH - p.top < 20)
+        w.css('top',p.parentH - 20);
+      if (p.left + w.width() < 80)
+        w.css({left:w.width()*-1+80,width:w.width(),right:'auto'});
+      else if (p.parentW - p.left < 30)
+        w.css('left',p.parentW - 30);
+    });
+    return this;
+  };
+
+  methods.minimize = function() {
+    this.each(function(){
+      var w = $(this);
+      if (! w.is('.window')) return true;
+      w.removeClass('maximized');
+      savePos(w);
+      minH = w.find('>.windowtitlebar').height()-5;
+      w.css({left:'auto',top:'auto',right:0,width:300,height:minH,zIndex:100000})
+       .removeClass('focused')
+       .addClass('minimized'); 
+    });
+    $().WM('retileMin');
+    return this;
+  };
+
+  methods.retileMin=function(){
+    var r = 0;
+    var b = 0;
+    $('.window.minimized').each(function(i) {
+      $(this).css({ 'bottom': b, 'right': r });
+      r += $(this).width();
+      var spaceLeft = $(this).offset().left;
+      if (spaceLeft < $(this).width()) {
+        b += $(this).find('>.windowtitlebar').height();
+        r = 0;
+      }
+    });
+    return this;
+  };
+
+  methods.maximize = function() {
+    var retile;
+    this.each(function(){
+      var w = $(this);
+      if (! w.is('.window')) return true;
+      if (w.hasClass('minimized')) {
+        w.removeClass('minimized');
+        retile=1;
+      }
+      savePos(w);
+      w.css({left:0,top:0,bottom:0,right:0,width:'auto',height:'auto'})
+       .WM('raise').addClass('maximized'); 
+    });
+    if (retile) $().WM('retileMin');
+    return this;
+  };
+
+  methods.restore = function() {
+    var retile;
+    this.each(function(){
+      var w = $(this);
+      if (! w.is('.window')) return true;
+      if (w.hasClass('minimized')) {
+        w.removeClass('minimized');
+        retile=1;
+      }
+      else {
+        w.removeClass('maximized');
+      }
+      w.css(w.data('oldPos'))
+       .removeData('oldPos')
+       .WM('ensure_viewable');
+    });
+    if (retile) $().WM('retileMin');
+    this.WM('raise');
+    return this;
+  };
+
+  methods.raise = function() {
+    var w = this.filter('.window:first');
+    if (w.length==0||w.hasClass('focused')) return this;
+    $(".window.focused").removeClass('focused');
+    w.addClass('focused').css('zIndex',++zIndex);
+    return this;
+  };
+
+  methods.close = function() {
+    return this.filter('.window').remove();
+  };
+
+  methods.open = function(lnk,target,opts) {
+    if (! opts) opts = {};
+    var w = $(template);
+
+    var nam = opts.name;
+    if (! nam && lnk) { 
+      var rv = lnk.match(/([^\/]+)$/);
+      if (rv) nam = rv[1].replace(/\.[^\.]+$/,'');
+    }
+
+    if (! nam) nam = opts.title || target;
+    if (nam) nam = nam.replace(/[^A-Za-z0-9]/g,'');
+    if (! nam) nam = 'default';
+    w.addClass('windowname_' + nam);
+
+    // smart window placement
+    newWinOffset+=10;
+    if (newWinOffset > 400) newWinOffset = 50;
+    w.css('top',newWinOffset).css('left',newWinOffset);
+
+    // hook in resizer handles
+    $('.resizer-tl,.resizer-t,.resizer-tr,.resizer-r,.resizer-br,.resizer-b,'+
+      '.resizer-bl,.resizer-l',w).mousedown(onStartResize);
+
+    // raise window if clicked
+    w.click(onClickWindow);
+
+    // hook in titlebar actions
+    var tb=$('.windowtitlebar',w);
+    tb.mousedown(onStartMove);
+    tb.dblclick(onDblClickTitlebar);
+    var buts = tb.find('> .horizbuts').mousedown(cancelBubble).children();
+    buts.eq(0).click(onClickMinimizeBut);
+    buts.eq(1).click(onClickRestoreBut);
+    buts.eq(2).click(onClickMaximizeBut);
+    buts.eq(3).click(onClickCloseBut);
+
+    // set default window title
+    var tbt = tb.children('.titlebartext').text(opts.title||lnk||'');
+    tbt[0].onselectstart = cancelBubble;
+    tbt[0].unselectable = "on";
+
+    // place window
+    $(window.top.document.body).append(w);
+
+    // open iframe if external link
+    if (! lnk) {} // do nothing
+
+    // if content is url, load in iframe
+    else if (typeof lnk == 'string') {
+
+      // if external link, add external favicon
+      var m = lnk.match(/^(https?\:\/\/)([^\/]+)/);
+      if (m && m[2] != document.location.hostname) 
+        w.find('.titlebaricon').attr('src', m[1]+m[2]+"/favicon.ico");
+      $('<iframe src="'+lnk+'" target="'+target+'"></iframe>'+
+        '<div class=iframecover></div>')
+        .appendTo(w.find('.windowcontent')); 
+    }
+
+    // else let jquery append it
+    else w.find('.windowcontent').append(lnk);
+
+    w.WM('raise');
+    return w;
+  };
+
+  $.fn.WM = function(method) {
+    if (method in methods) {
+      return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+    } else if (typeof method === 'object' || ! method) {
+      return methods.init.apply(this, arguments);
+    } else {
+      $.error('Method ' +  method + ' does not exist on jQuery.colorramp');
+    }
+  };
+
+  // if anchor clicked having target=_child open link as child window
+  $(document).delegate('a.jquery-wm','click',function(e){
+    if (e.button > 0) return true;
+    var t = $(this);
+    window.top.jQuery().WM('open',this.href,this.target,
+      {title:t.attr('title')||t.text().substr(0,100)});
+    return false;
+  });
+
+  // make sure all child windows are on screen when window resizes
+  $(window).resize(function(){$('.window').WM('ensure_viewable');return true;});
+
+  $(function(){
+    if (isIE) $(document.body).addClass('IE');
+    $(document.body).append(moverP).append(resizerP);
+  });
+})(jQuery);

Added: wwwbase/js/jquery.cookie.js
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ wwwbase/js/jquery.cookie.js	Fri Sep  6 17:49:26 2013	(r978)
@@ -0,0 +1,96 @@
+/*!
+ * jQuery Cookie Plugin v1.3.1
+ * https://github.com/carhartl/jquery-cookie
+ *
+ * Copyright 2013 Klaus Hartl
+ * Released under the MIT license
+ */
+(function (factory) {
+	if (typeof define === 'function' && define.amd) {
+		// AMD. Register as anonymous module.
+		define(['jquery'], factory);
+	} else {
+		// Browser globals.
+		factory(jQuery);
+	}
+}(function ($) {
+
+	var pluses = /\+/g;
+
+	function decode(s) {
+		if (config.raw) {
+			return s;
+		}
+		return decodeURIComponent(s.replace(pluses, ' '));
+	}
+
+	function decodeAndParse(s) {
+		if (s.indexOf('"') === 0) {
+			// This is a quoted cookie as according to RFC2068, unescape...
+			s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
+		}
+
+		s = decode(s);
+
+		try {
+			return config.json ? JSON.parse(s) : s;
+		} catch(e) {}
+	}
+
+	var config = $.cookie = function (key, value, options) {
+
+		// Write
+		if (value !== undefined) {
+			options = $.extend({}, config.defaults, options);
+
+			if (typeof options.expires === 'number') {
+				var days = options.expires, t = options.expires = new Date();
+				t.setDate(t.getDate() + days);
+			}
+
+			value = config.json ? JSON.stringify(value) : String(value);
+
+			return (document.cookie = [
+				config.raw ? key : encodeURIComponent(key),
+				'=',
+				config.raw ? value : encodeURIComponent(value),
+				options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
+				options.path    ? '; path=' + options.path : '',
+				options.domain  ? '; domain=' + options.domain : '',
+				options.secure  ? '; secure' : ''
+			].join(''));
+		}
+
+		// Read
+		var cookies = document.cookie.split('; ');
+		var result = key ? undefined : {};
+		for (var i = 0, l = cookies.length; i < l; i++) {
+			var parts = cookies[i].split('=');
+			var name = decode(parts.shift());
+			var cookie = parts.join('=');
+
+			if (key && key === name) {
+				result = decodeAndParse(cookie);
+				break;
+			}
+
+			if (!key) {
+				result[name] = decodeAndParse(cookie);
+			}
+		}
+
+		return result;
+	};
+
+	config.defaults = {};
+
+	$.removeCookie = function (key, options) {
+		if ($.cookie(key) !== undefined) {
+			// Must not alter options, thus extending a fresh object...
+			$.cookie(key, '', $.extend({}, options, { expires: -1 }));
+			return true;
+		}
+		return false;
+	};
+
+}));

Modified: wwwbase/js/lexemEdit.js
==============================================================================
--- wwwbase/js/lexemEdit.js	Fri Sep  6 15:27:04 2013	(r977)
+++ wwwbase/js/lexemEdit.js	Fri Sep  6 17:49:26 2013	(r978)
@@ -1,4 +1,5 @@
 struct_anyChanges = false;
+$.cookie.json = true;
 
 function lexemEditInit() {
   $('#meaningTree').tree({
@@ -52,7 +53,7 @@
     initSelection: select2InitSelectionAjax,
     minimumInputLength: 1,
     multiple: true,
-    width: '333px',
+    width: '173px',
   });
 
   $('#variantOfId').select2({
@@ -60,8 +61,8 @@
     allowClear: true,
     initSelection: select2InitSelectionAjaxSingle,
     minimumInputLength: 1,
-    placeholder: 'alegeți un lexem (opțional)',
-    width: '333px',
+    placeholder: '(opțional)',
+    width: '173px',
   });
 
   $('#associateDefinitionId').select2({
@@ -80,12 +81,11 @@
   $('.toggleRepLink').click(toggleRepClick);
   $('.toggleStructuredLink').click(toggleStructuredClick);
   $('.defFilterLink').click(defFilterClick);
-  $('.boxTitle').click(boxTitleClick);
 
   $('#lexemSourceIds').select2({
     matcher: sourceMatcher,
     placeholder: 'surse care atestă flexiunea',
-    width: '333px',
+    width: '173px',
   });
   // Disable the select2 when the HTML select is disabled. This doesn't happen by itself.
   $('#lexemSourceIds').select2('readonly', $('#lexemSourceIds').is('[readonly]'));
@@ -98,6 +98,32 @@
 
   $('.mergeLexem').click(mergeLexemButtonClick);
   $('.similarLink').click(similarLinkClick);
+
+  var props = ['left', 'top', 'width', 'height'];
+
+  $('.box').each(function() {
+    var $w = $().WM('open');
+    $w.find('.titlebartext').text($(this).attr('data-title'));
+    $w.attr('data-id', $(this).attr('data-id'));
+    for (var i = 0; i < props.length; i++) {
+      if (typeof($(this).attr('data-' + props[i])) != 'undefined') {
+        var value = parseInt($(this).attr('data-' + props[i]));
+        if (props[i] == 'left') {
+          value += parseInt($('#wmCanvas').offset().left);
+        } else if (props[i] == 'top') {
+          value += parseInt($('#wmCanvas').offset().top);
+        }
+        $w.css(props[i], value + 'px');
+      }
+    }
+    if ($(this).attr('data-minimized')) {
+      $w.WM('minimize');
+    }
+    $w.find('.windowcontent').append($(this).children());
+    $('#wmCanvas').append($w);
+  });
+  $('.window.minimized').each(function() { $(this).WM('raise'); });
+  $('#resizerproxy').mouseup(resizerSetCookie);
 }
 
 function sourceMatcher(term, text) {
@@ -341,10 +367,6 @@
   return false;
 }
 
-function boxTitleClick() {
-  $(this).next('.boxContents').slideToggle();
-}
-
 function mergeLexemButtonClick() {
   var id = $(this).attr('id').split('_')[1];
   $('input[name=mergeLexemId]').val(id);
@@ -372,3 +394,25 @@
     $(this).prop('checked', restriction.indexOf($(this).val()) != -1);
   });
 }
+
+function resizerSetCookie() {
+  var data = {};
+  alert(data);
+  $('.window').each(function() {
+    var params = { minimized: $(this).hasClass('minimized') };
+    if (params.minimized) {
+      var p = $(this).data('oldPos');
+      params.left = p.left;
+      params.top = p.top;
+      params.width = p.width;
+      params.height = p.height;
+    } else {
+      params.left = $(this).offset().left;
+      params.top = $(this).offset().top;
+      params.width = $(this).width();
+      params.height = $(this).height();
+    }
+    data[$(this).attr('data-id')] = params;
+  });
+  $.cookie('lexemEdit', data, { expires: 365 });
+}

Modified: wwwbase/styles/flex.css
==============================================================================
--- wwwbase/styles/flex.css	Fri Sep  6 15:27:04 2013	(r977)
+++ wwwbase/styles/flex.css	Fri Sep  6 17:49:26 2013	(r978)
@@ -361,6 +361,7 @@
 
 .ui-tooltip {
   font-size: 12px;
+  z-index: 200000; /* Make it work with the window manager */
 }
 
 .select2Edit {

Added: wwwbase/styles/jquery-wm/clear.gif
==============================================================================
Binary file. No diff available.

Added: wwwbase/styles/jquery-wm/jquery.wm.default.icons.png
==============================================================================
Binary file. No diff available.

Added: wwwbase/styles/jquery-wm/main.css
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ wwwbase/styles/jquery-wm/main.css	Fri Sep  6 17:49:26 2013	(r978)
@@ -0,0 +1,177 @@
+.window {
+  position: fixed;
+  border: 1px outset #036;
+  width: 400px;
+  height: 300px;
+  border-radius: 6px;
+  border-color: #1d4266;
+  background-color: #1d4266;
+}
+
+.window.maximized {
+  border-width: 0;
+}
+
+#resizerproxy,#moverproxy {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 999999999;
+  display: none;
+}
+#resizerproxy > div,#moverproxy > div {
+  position: absolute;
+  border: 2px solid #666666;
+  border-radius: 6px;
+}
+
+.windowtitlebar {
+  position: absolute;
+  top: 1px;
+  left: 1px;
+  right: 1px;
+  height: 24px;
+  overflow: hidden;
+  background-color: #AAB;
+  cursor: default;
+  border-bottom: 1px solid #002c57;
+}
+
+.window.focused .windowtitlebar {
+  background-color: #036;
+}
+
+.windowtitlebar > .horizbuts {
+  position: absolute;
+  top: 0;
+  width: 59px;
+  right: 0;
+  bottom: 0;
+}
+
+.horizbuts > * {
+  float: left;
+  width: 16px;
+  height: 16px;
+  border: 1px outset #9B9DC9;
+  margin: 3px 1px 0 0;
+  background: #ccc url(jquery.wm.default.icons.png) no-repeat scroll;
+  border-color: #bbb;
+  border-radius: 2px;  
+}
+.horizbuts > *:hover {
+  background-color: #ddd;
+}
+
+.horizbuts > .minimizebut {
+  background-position: -3px 0;
+}
+.horizbuts > .maximizebut {
+  background-position: -32px -1px;
+}
+.horizbuts > .closebut {
+  background-position: -47px -1px;
+}
+.horizbuts > .restorebut {
+  display: none;
+  background-position: -18px -1px;
+}
+.window.maximized .horizbuts > .maximizebut { display: none; }
+.window.maximized .horizbuts > .restorebut { display: block; }
+.window.minimized .horizbuts > .minimizebut { display: none; }
+.window.minimized .horizbuts > .restorebut { display: block; }
+
+
+.windowcontent {
+  border: 1px inset #9B9DC9;
+  border-bottom: 0;
+  position: absolute;
+  top: 25px;
+  right: 1px;
+  left: 1px;
+  bottom: 2px;
+  overflow: auto;
+  background-color: white;
+}
+
+.autohide .windowtitlebar {
+  opacity: 0;
+  transition: opacity .25s ease-in-out;
+  -moz-transition: opacity .25s ease-in-out;
+  -webkit-transition: opacity .25s ease-in-out;
+  z-index: 99999999;
+}
+
+.autohide .windowtitlebar:hover,
+.autohide.minimized .windowtitlebar {
+  opacity: 1;
+}
+
+.autohide .windowcontent {
+  top: 1px;
+}
+
+.window.minimized .windowcontent {
+  display: none;
+}
+
+.windowcontent > iframe {
+  border: 0;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 2;
+}
+.windowcontent > .iframecover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  z-index: 3;
+}
+.window.focused > .windowcontent > .iframecover {
+  z-index: 1;
+}
+.window.moving > .windowcontent > .iframecover {
+  z-index: 3 !important;
+}
+.resizer-tl { position: absolute; left: -2px; top: -2px; width: 6px; height: 6px; cursor: nw-resize; }
+.resizer-t  { position: absolute; left: 6px; right: 6px; top: -2px; height: 6px; cursor: n-resize;}
+.resizer-tr { position: absolute; right: -2px; top: -2px; width: 6px; height: 6px; cursor: ne-resize;}
+.resizer-r  { position: absolute; top: 6px; bottom: 6px; right: -2px; width: 6px; cursor: e-resize; }
+.resizer-br { position: absolute; right: -2px; bottom: -2px; width: 6px; height: 6px; cursor: se-resize;}
+.resizer-b  { position: absolute; left: 6px; right: 6px; bottom: -2px; height: 6px; cursor: s-resize; }
+.resizer-bl { position: absolute; left: -2px; bottom: -2px; width: 6px; height: 6px; cursor: sw-resize;}
+.resizer-l  { position: absolute; top: 6px; bottom: 6px; left: -2px; width: 6px; cursor: w-resize;}
+
+.titlebaricon {
+  position: absolute;
+  left: 4px;
+  top: 4px;
+  width: 16px;
+  height: 16px;
+  overflow: hidden;
+}
+
+.titlebartext {
+  position: absolute;
+  color: white;
+  font-weight: bold;
+  left: 24px;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  overflow: hidden;
+}
+
+/* IE needs to think there is an image in some divs otherwise it optimizes them away */
+.IE #resizerproxy,.IE #moverproxy,
+.IE .resizer-tl, .IE .resizer-t, .IE .resizer-tr, .IE .resizer-r,
+.IE .resizer-br, .IE .resizer-b, .IE .resizer-bl, .IE .resizer-l {
+  background: url(clear.gif);
+}

Modified: wwwbase/styles/lexemEdit.css
==============================================================================
--- wwwbase/styles/lexemEdit.css	Fri Sep  6 15:27:04 2013	(r977)
+++ wwwbase/styles/lexemEdit.css	Fri Sep  6 17:49:26 2013	(r978)
@@ -1,39 +1,20 @@
-.lexemEditActions {
-  margin: 5px 0px;
+body {
+  margin: 2px;
 }
 
 .box {
-  border: 1px solid #444;
-  -webkit-box-shadow: 2px 2px 5px #424242;
-  box-shadow: 2px 2px 5px #424242;
-  -moz-box-shadow: 2px 2px 5px #424242;
-  margin-bottom: 10px;
-  margin-right: 10px;
-}
-
-.boxTitle {
-  background: #444 url("../img/icons/cog.png") no-repeat 5px 6px;
-  color: white;
-  cursor: pointer;
-  font-weight: bold;
-  padding: 5px 5px 5px 25px;
-}
-
-.boxTitle a {
-  color: white;
-  margin-left: 20px;
-  font-weight: normal;
-}
-
-.boxContents {
-  padding: 5px;
+  display: none;
 }
 
 #stemNode {
   display: none;
 }
 
-#meaningTreeContainer {
+#wmCanvas {
+  margin: 2px;
+}
+
+#meaningTree {
   padding-right: 100px;
 }
 
@@ -202,3 +183,33 @@
 .select2-container-multi, .select2-result {
   font-size: 12px;
 }
+
+.lexemEditActions {
+  margin: 0px 0px;
+}
+
+/* Window manager settings */
+.titlebaricon {
+  display: none;
+}
+
+.titlebartext {
+  left: 10px;
+  top: 3px
+}
+
+.closebut {
+  display: none;
+}
+
+.windowtitlebar > .horizbuts {
+  width: 39px;
+}
+
+.windowcontent {
+  padding: 3px;
+}
+
+.select2-drop {
+  z-index: 200000 !important; /* Make it work with the window manager */
+}


More information about the Dev mailing list