Index: controlies/trunk/applications/controlies/views/laptops/form_history.html
===================================================================
--- controlies/trunk/applications/controlies/views/laptops/form_history.html	(nonexistent)
+++ controlies/trunk/applications/controlies/views/laptops/form_history.html	(revision 352)
@@ -0,0 +1,128 @@
+<script language="javascript">
+
+    $(function() {
+        $("#name").focus();
+        $("#saveButton").button({ icons: { primary: "ui-icon-disk"}});
+        $("#cancelButton")
+            .button({ icons: { primary: "ui-icon-close"}})
+            .click( function(){ $('#dialog-form').dialog('close'); });
+    });
+
+    function restartStyle(){
+        $("#form_data p span").css("color","black");
+        $('#message').html("");
+    }
+
+
+    function print_grid_historical(){  
+          jQuery("#table_history #list_history").jqGrid({
+                url:"/controlies/laptops/call/json/listHistorical",
+                data: "{}",
+                datatype: 'json',
+                mtype: 'GET',
+                contentType: "application/json; charset=utf-8",
+                complete: function(jsondata, stat) {
+                    if (stat == "success") {
+                        var thegrid = jQuery("#table_history #list_history")[0];
+                        thegrid.addJSONData(JSON.parse(jsondata.responseText).d);
+                    }
+                },
+                
+                colNames:['Fecha/Hora','Estado','Login','Nombre','Comentario'],
+                colModel:[ 
+                    {name:'datetime',index:'datetime', width:60, align:"center"},
+                    {name:'state',index:'state', width:60, align:"center"},
+                    {name:'username',index:'username', width:50, align:"center"},
+                    {name:'name',index:'name', width:100, align:"center"},             
+                    {name:'comment',index:'comment', width:100, align:"center"}
+                ],
+                postData:{id_laptop:$("#form_data_history #id_laptop").val()},
+                rowNum:25,
+                height:150,
+                width: 780,
+                rowList:[25,50,75],  
+                pager: '#pager_history', 
+                sortname: 'datetime', 
+                autowidth: false,
+                viewrecords: true, 
+                sortorder: "desc", 
+                caption:"Historial"    
+        
+          }); 
+          jQuery("#list_history").jqGrid('navGrid','#pager_history',{add:false,edit:false,del:false,search:false,refresh:false});
+        
+            jQuery("#list_history").jqGrid('navButtonAdd','#pager_history',{
+                    caption: "Insertar",
+                    buttonicon :'ui-icon-plus',
+                    onClickButton : function (){ 
+                        addRecord();
+                    } 
+            }); 
+            jQuery("#list_history").jqGrid('navButtonAdd','#pager_history',{
+                    caption: "Borrar", 
+                    buttonicon :'ui-icon-trash',
+                    onClickButton : function (){ 
+                        deleteRecord();
+                } 
+            }); 
+    }
+
+    function send(){
+
+        restartStyle();
+        jQuery.post('call/json/modify', jQuery("#form_data").serialize(), function(result) {
+            switch(result.response){
+                case "OK":{
+                    jQuery('#message').html("Operación realizada correctamente").css("color","green").effect("highlight", {"color":"yellow"}, 1000);
+					jQuery("#list").trigger("reloadGrid");					
+					setTimeout("$('#dialog-form').dialog('close')",1000);
+                    break;
+                }
+                case "fail":{
+                    jQuery('#message').html("Se produjo un error").effect("highlight", {"color":"yellow"}, 1000);
+                    break;
+                }
+                case "serial_number_exists":{
+                    jQuery('#numero_serieTag').css("color","red");
+                    jQuery('#numero_serie').effect("highlight", {"color":"yellow"}, 1000).focus();
+                    jQuery('#message').html("Ya existe ese número de serie").effect("slide");                  
+                    break;
+                }
+                default:{
+                    jQuery('#'+result.response+"Tag").css("color","red");
+                    jQuery('#'+result.response).effect("highlight", {"color":"yellow"}, 1000).focus();
+                    jQuery('#message').html("Hay campos vacíos o incorrectos").effect("slide");
+                    break;
+                }
+            }
+        });
+
+        return false;
+    }
+
+</script>
+ 
+<form id="form_data_history" onsubmit="return send();">
+    <input type="hidden" id="action" name="action"/>
+    <input type="hidden" id="id_laptop" name="id_laptop"/>    
+    <div style="text-align:center;">
+		    <b>Marca / Modelo:</b>&nbsp;<span id="id_trademark"></span>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
+		    <b>Número Serie:</b>&nbsp;<span id="serial_number"></span>
+    </div>
+    <br><br>
+    <div>
+        <div id="table_history" class="centerGrid">
+            <table width="100%" align="center">
+            <tr>
+                <td style="width:2%"></td>
+                <td style="text-align:center;"><table id="list_history" width="100%"></table></td>
+                <td style="width:2%"></td>
+            </tr>
+            </table>
+            <div id="pager_history" style=""></div> 
+            <div id="filter_history" style="margin-left:30%;display:none">Buscar nada</div>
+        </div>
+    </div>
+    <div id="message" style="text-align:center; font-weight:bold; color:red; padding:3px; "></div>
+    <div style="text-align:center;"><button type="button" id="cancelButton" style="width:100px;">Cerrar</button></div>       
+</form>
\ No newline at end of file

Property changes on: controlies/trunk/applications/controlies/views/laptops/form_history.html
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: controlies/trunk/applications/controlies/views/laptops/index.html
===================================================================
--- controlies/trunk/applications/controlies/views/laptops/index.html	(revision 351)
+++ controlies/trunk/applications/controlies/views/laptops/index.html	(revision 352)
@@ -95,7 +95,13 @@
                         deleteRecord();
                 } 
             }); 
-        
+            jQuery("#list").jqGrid('navButtonAdd','#pager',{
+                    caption: "Historial", 
+                    buttonicon :'ui-icon-clock',
+                    onClickButton : function (){ 
+                        history();
+                } 
+            }); 
           
           jQuery("#list").jqGrid('filterToolbar'); 
        
@@ -159,8 +165,6 @@
 				getAllLaptopTypes();
 
 				jQuery("#form_data #action").val("modify");
-				jQuery("#form_data #user").attr("readonly","true");
-				jQuery("#form_data #user").css("background-color","#DDD");
 				jQuery("#form_data #messageForm").html("Todos los campos son obligatorios");
 				
 				jQuery.post('call/json/getLaptopData',{ id_laptop: id }, function(result) {						
@@ -209,6 +213,42 @@
             }).dialog('open');
     }
 
+    function history(){
+			var id;
+
+			jQuery("#messageLoading").show();
+			
+			var id = rowSelected();
+			if(id==false)
+				return false;
+
+			jQuery("#dialog-form").html("").css("display","none");
+			jQuery("#dialog-form").load("form_history.html", function() {
+				jQuery("#form_data_history #id_laptop").val(id);				
+				print_grid_historical();
+				jQuery("#form_data_history #action").val("modify");
+								
+				jQuery.post('call/json/getLaptopData',{ id_laptop: id }, function(result) {						
+
+					jQuery("#form_data_history #id_laptop").val(result.response['id_laptop']);
+					jQuery("#form_data_history #serial_number").html(result.response['serial_number']);
+					jQuery("#form_data_history #id_trademark").html(result.response['id_trademark']);					
+
+					x = (jQuery(window).width()-850)/2;
+					y = (jQuery(window).height()-500)/2;
+					
+					jQuery("#messageLoading").hide();
+					
+					jQuery("#dialog-form").dialog({
+						resizable: false,
+						modal: true,
+						width: 850,
+						title: "Historial Portátil"
+					}).dialog('option', 'position', [x, y]);                        
+				});               
+			});
+    }
+
     function getAllLaptopTypes(){
             $.post("/controlies/laptops/call/json/getAllLaptopTypes",   function(result) {
                 $.each( result.response, function(i, l){
@@ -219,5 +259,5 @@
 </script>
 
 <script type="text/javascript">
-  jQuery(document).ready(function(){  print_grid();}); 
+  jQuery(document).ready(function(){ print_grid();}); 
 </script>
Index: controlies/trunk/applications/controlies/controllers/laptops.py
===================================================================
--- controlies/trunk/applications/controlies/controllers/laptops.py	(revision 351)
+++ controlies/trunk/applications/controlies/controllers/laptops.py	(revision 352)
@@ -44,9 +44,20 @@
     response = l.process(request.vars["action"])
     return dict(response = response)            
 
+@service.json
+@auth.requires_login()
+def listHistorical():    
+    my = SQLiteConnection()
+    l = Laptops(my,"","","")
+    response = l.listHistorical(request.vars)
+    return response
+
 def laptops():
     return dict()
 
+def form_history():
+    return dict()
+
 def form():
     return dict()
 
Index: controlies/trunk/applications/controlies/modules/Laptops.py
===================================================================
--- controlies/trunk/applications/controlies/modules/Laptops.py	(revision 351)
+++ controlies/trunk/applications/controlies/modules/Laptops.py	(revision 352)
@@ -136,7 +136,50 @@
 
         return { "page":page, "total":totalPages, "records":len(rows), "rows":rows[start:finish] }
 
+    def listHistorical(self,args):
+        db = self.SQLite.getDB()
 
+        sql = "SELECT * FROM laptops_historical lh INNER JOIN states s ON lh.id_state=s.id_state"
+        sql = sql + " WHERE lh.id_laptop='"+args["id_laptop"]+"'"
+        sql = sql + " ORDER BY "+args['sidx']+" "+args['sord']
+        print sql
+        result = db.executesql(sql)
+        print result[0]
+        rows = []
+        for reg in result:
+            row = {
+                "id":reg[0],
+                "cell":[reg[2],reg[9],reg[3],reg[4],reg[6]],
+                "datetime":reg[2],
+                "state":reg[9],
+                "username":reg[3],
+                "name":reg[4],
+                "comment":reg[6]
+            }
+            rows.append(row)
+
+        # grid parameters
+        limit = int(args['rows'])
+        page = int(args['page'])
+        start = limit * page - limit
+        finish = start + limit;             
+                    
+        # grid parameters
+        if len(rows) > 0:
+            totalPages = floor( len(rows) / int(limit) )
+            module = len(rows) % int(limit)
+
+            if module > 0:
+                totalPages = totalPages+1
+        else:
+            totalPages = 0
+
+        if page > totalPages:
+            page = totalPages
+
+        return { "page":page, "total":totalPages, "records":len(rows), "rows":rows[start:finish] }
+
+
     def add(self):
         sql = "INSERT INTO laptops (id_laptop, serial_number, id_trademark) "
         sql = sql + "VALUES(null,'"+self.serial_number+"','"+self.id_trademark+"')"
@@ -184,7 +227,7 @@
 
         db = self.SQLite.getDB()
         result = db.executesql(sql)
-        print result
+
         dataLaptop = {
             "id_laptop":str(result[0][0]),
             "serial_number":result[0][1],
