:: Forum >> Version 2 >>

HELP!!! CSV tbl.request fails on host

Hi all,

I am stuck with the problem.

I have built a page using html and javascript and it works fine from my local machine. As soon as I copy the file to the server and run it from there it does not work. The line it fails on is tbl.request();

I have been on this problem for too long and I think I need some more eyes. thanks in advance guys.

here's the full code:
<html>
<
head>
    <
script src="../../runtime/lib/aw.js"></script>
    <
link href="../../runtime/styles/xp/aw.css" rel="stylesheet"></link>
</
head>
<
body>
<
style>
    
#myGrid width600px;  margin0pxpadding0pxbackground#404040;}

    
#myGrid .aw-grid-row {height16pxborder-bottom1px solid #C6C6C6; }

    
#myGrid .aw-alternate-even .aw-column-{background#E0E0E0;}
    
#myGrid .aw-alternate-odd  .aw-column-{background#E0E0E0;}
    
#myGrid .aw-alternate-even {background#E7E7D6;}
    
#myGrid .aw-alternate-odd  {background#F7F3E7;}

    
#myGrid .aw-cells-selected {background: default; colorblack;}

    
#myGrid .aw-column-0  {width:  50pxborder-right1px solid #848484cursor:default;}
    
#myGrid .aw-column-1  {width110pxborder-right1px solid #C6C6C6cursor:hand;    }
    
#myGrid .aw-column-2  {width:  70pxborder-right1px solid #C6C6C6cursor:hand;    text-alignright; }
    
#myGrid .aw-column-3  {width:  70pxborder-right1px solid #C6C6C6cursor:hand;    text-alignright; }
    
#myGrid .aw-column-4  {width:  70pxborder-right1px solid #C6C6C6cursor:hand;    text-alignright; }
    
#myGrid .aw-column-5  {width:  70pxborder-right1px solid #C6C6C6cursor:hand;    text-alignright; }
    
#myGrid .aw-column-6  {width:  70pxborder-right1px solid #C6C6C6cursor:hand;    text-alignright; }
    
#myGrid .aw-column-7  {width:  70pxborder-right1px solid #C6C6C6cursor:hand;    text-alignright; }
    
#myGrid .aw-column-8  {width:  70pxborder-right1px solid #C6C6C6cursor:hand;    text-alignright; }
    
#myGrid .aw-column-9  {width:  70pxborder-right1px solid #C6C6C6cursor:hand;    text-alignright; }
    
#myGrid .aw-column-10 {width:  70pxborder-right1px solid #C6C6C6cursor:hand;    text-alignright; }
    
#myGrid .aw-column-11 {width:  70pxborder-right1px solid #C6C6C6cursor:hand;    text-alignright; }

    
#myGrid .aw-grid-headers {font-weightboldcursor:pointer;}
    
#myGrid .aw-grid-footers {background#E7E7D6border-top1px solid #C6C6C6border-bottom1px solid #C6C6C6; }
    
#myGrid .aw-grid-footers .aw-column-{background#E0E0E0;}
    
    
#myInpt {width:120%; height:100%; margin:-2pxmargin-left:-4px;}
</
style>

<
script>
//
//  had to add
//         e.select(); 
//    after 
//        e.setExpression("test", "this.value"); 
//    in 
//        lib/templates/input.js
//
//  for selecting the text in the edit of a cell.
//
    
new AW.CSV.Table
    
AW.CSV.Table.prototype.response = function(text){ 
        
this._rows text.split(/\r*\n/); 
        
this._data = []; // missing in beta3 
        
if (this.$owner) { 
            var 
sortCol this.$owner.getSortColumn();                // required for keeping sort
            
var sortDir this.$owner.getSortDirection(sortCol);    // required for keeping sort
    //        this.$owner.clearScrollModel(); // missing in beta3 
            
this.$owner.clearSelectionModel(); 
            
this.$owner.clearSortModel(); 
            
this.$owner.clearRowModel(); 
            
this.$owner.setRowCount(this.getCount()); 
            
this.$owner.refresh(); 
            if (
sortCol>= 0this.$owner.sort(sortColsortDir);  // added a resort to make sure sorting is kept after refresh.
        

    }; 
//
// Declaring objects...
//    
    
var tbl = new AW.CSV.Table;
    var 
obj = new AW.Grid.Extended;
    var 
str = new AW.Formats.String;
    var 
num = new AW.Formats.Number;
    var 
htm = new AW.Formats.HTML;
    var 
edt = new AW.UI.Input;
//
// Declaring some variables...
//    
    
var reloadid
    
var myCODE  ""
    
var myCODEc 0;
    var 
myCODEr 0;
    var 
myURL   "http://au.finance.yahoo.com/d/quotes.csv?s=";    // just remove the (au.) for US time.
    
var myCODES "BHP.AX,TLS.AX,CBA.AX,NAB.AX,WBC.AX,AXA.AX,RIO.AX,AGL.AX,ALL.AX,AMP.AX,ANZ.AX,AMC.AX,BIL.AX,BLD.AX,CCL.AX,CML.AX";
    var 
myCOLS  "&f=snc6p2l1b3b2ohgt1d1&e=.csv";                    // codes: http://gummy-stuff.org/Yahoo-data.htm
    
var myColor 2// column which colors cell data.
    
var myHeaders = ["Code""Name""+/-",  "%""Last""Bid""Ask""Open""High""Low""Time""Date"];
    var 
myFormats = [   str,    str,   num,  num,    num,   num,   num,    num,    num,   num,    str,    str];
    var 
myFooters = [];
//
// Initialising...
//
    
tbl.setURL(myURL+myCODES+myCOLS);
    
tbl.request();                                                            // Async retrieval of data 
    
obj.setCellModel(tbl);                                                    // row length set dynamically from data
    
obj.setHeaderText(myHeaders);                                            // set the headers
    
tbl.setFormats(myFormats);                                                // set the formats 
    
obj.setColumnCount(myHeaders.length);                                    // dynamic column length from data
    
obj.setId("myGrid");                                                    // necessary for CSS rules
    
obj.setCellEditable(false);                                                // disable editing on all
    
obj.setCellEditable(true 0);                                            // Enable editing on column 0
    
obj.setHeaderCount(1);                                                    // make sure only one header line.
    
obj.setSelectorVisible(false);                                            // remove row selector.
    
obj.setVirtualMode(false);                                                // disable virtual mode
    
obj.setFooterVisible(true);                                                // enable footer
    
obj.setFooterText(myFooters);                                            // set blank line text
    
obj.setFooterCount(1);                                                    // make sure only one footer line
    
obj.setFooterHeight(16);                                                // set standard row height
    
edt.setId("myInpt");                                                    // necessary for CSS rules
    
    
    
obj.defineCellProperty("color", function(colrow){ return colorCellthis.getCellText(myColorrow) ); }); 
    
obj.getCellTemplate(0).setStyle("color", function(){ return this.getControlProperty("color"); }); 
    
obj.getCellTemplate(2).setStyle("color", function(){ return this.getControlProperty("color"); }); 
    
obj.getCellTemplate(3).setStyle("color", function(){ return this.getControlProperty("color"); }); 
    
    
    
document.write(obj);

//
//    Required to capture edited text as it is typed...
//
    
obj.onCellTextChanged=function(val,col,row){                     
        
myCODE val;
        
myCODEc col;
        
myCODEr row;
    } 
//
//  Required to commit the change of edited text once editing complete.
//
    
obj.onCellValueChanged=function(val,col,row){
        if (
col==myCODEc && row==myCODEr) {
            
myCODE addCodeClean(myCODE);
            if (
myCODES.indexOf(myCODE)>=0myCODE="";
            if (
myCODE != val) {
                
updateCodes(myCODE,col,row);
                
//clearTimeout(reloadid);
                
reload(0);
            }
        }
    } 
//
//    Required for drag and drop of body...
//
    
obj.onCellMouseDown        = function(eventcolumnrow){ if (column>0dragstart(event) };
    
obj.onCellMouseUp        = function(eventcolumnrow){ dragstop() };
    
obj.onControlMouseUp    = function(event){ dragstop() };
//
//  Required for adding code to grid
//
    
obj.onFooterClicked     = function(event,index){ 
                                
//if (index==0){ 
                                    
obj.setFooterText(edt,0);
                                    
obj.getFootersTemplate(0,0).refresh();
                                    var 
edit edt.element().getElementsByTagName("input")[0];
                                    
edit.focus();
                                    
edit.select();
                                    
AW.attachEvent(edit"onblur"addCode);
                                    
AW.attachEvent(edit"onkeydown"addCodeKey);
                                
//} 
                              
};
//
//  Function that refreshes data in grid based on new myCODES list...
//
    
function reload(i){
        var 
now = new Date();
        
        
//document.getElementById("info2").innerHTML = myCODES;
        
        
tbl.setURL(myURL+myCODES+myCOLS);
        
tbl.request();
        for(var 
i=2;i<obj.getColumnCount();i++) obj.getCellTemplate(i).refresh();

        var 
now1 = new Date();
        var 
load = (now1-now) / 1000;
        
window.status "Last Response: " now1 " ... Live Response Time: " load " secs";
        
        if (
i==0) return reloadid;
        
        
reloadid=setTimeout('reload()'5000);  // 5 second refresh
    
}
//
//  Function that is fired onblur of input footer box.
//
    
function addCode(){
        var 
edit edt.element().getElementsByTagName("input")[0];
        
myCODE addCodeClean(edit.value);                // get and clean the code entered
        
AW.detachEvent(edit"onblur"addCode);
        
obj.setFooterText("",0);                        // remove the edit box.
        
obj.getFootersTemplate(0,0).refresh();            
        if (
myCODES.indexOf(myCODE)<0) {                // if code does not already exist in the list
            
myCODES myCODES "," myCODE;            // then add it
            //clearTimeout(reloadid);                
            
reload(0);                                    // and refresh data
        
}
    }
//
//    Function that captures the return key on footer edit box and fires the onblur event.
//
    
function addCodeKey(e){
        var 
code event.keyCode;
        if (
code == 13addCode(); 
    }
//
//  Function to clean code... (make it upper case and add extension of .AX for Australian Codes.)
//
    
function addCodeClean(c){
        
c.toUpperCase();
        if (
c.indexOf(".")<&& c.length>0)  return c+".AX";
        else return 
c;
    }
//
//  Function that updates the code list with the new value
//
    
function updateCodes(v,c,r){
        
str "";
        for (var 
x=0;x<obj.getRowCount();x++) {
            if (
c==&& r==xstr str "," v;
            else 
str str "," obj.getCellText(0,x);
        }
        
myCODES str.substr(1);
    }
//
//  Fucntion will be used later to color background of each cell changed.
//
    
function colorCell(v) {
        if (
v<0) return "#A00000";
        if (
v>0) return "#00A000";
        return 
"default";
    }
    function 
colorCellbackground(o,n,x,y) {
        if (
o) {     if (o[x]) obj.getCellTemplate(xy).setStyle("background""#C0F8C0"); 
                    if (
o[x]) obj.getCellTemplate(xy).setStyle("background""#F8C0C0"); }
    }


//
//  Dragging functions...
//
    
var dragapproved=false
    
var offsetxoffsetytmpxtmpymaxxmaxy
    
    
function dragstart(e){
        
dragapproved=true;
        
offsetx=event.clientX;
        
offsety=event.clientY
        
tmpx=obj.getScrollLeft();
        
tmpy=obj.getScrollTop();
        
maxx=obj.getScrollWidth() - document.getElementById("myGrid").offsetWidth 18;
        
maxy=obj.getScrollHeight() - document.getElementById("myGrid").offsetHeight 18;
        if (
document.getElementById("myGrid")) document.getElementById("myGrid").onmousemove=dragdrop
    
}
    
    function 
dragdrop(e){
        if (
dragapproved&&event.button==1){
            
x=tmpx+offsetx-event.clientX
            y
=tmpy+offsety-event.clientY
        
}
        if (
x<0)x=0;
        if (
y<0)y=0;
        if (
x>maxx)x=maxx;
        if (
y>maxy)y=maxy;
        
obj.setScrollLeft(x);
        
obj.setScrollTop(y);
    }
    
    function 
dragstop(){
        
dragapproved=false;
        if (
document.getElementById("myGrid")) document.getElementById("myGrid").onmousemove=null;
    }


</
script>
<
p></p>
<
input type="button" value="refresh" onclick="reload()"/>
<
input type="button" value="stop"    onclick="clearTimeout(reloadid);"/><br/>
<
p id="info" name="info" style="font-family:arial;font-size:12px">

Double click on a code and change it to change the item. <br>
Double click on a code and delete the text and it will delete the line. <br>
Click on the footer and add a code it will add a line to the list. <br>
Click and drag on the body data to scroll.

</
p>
<
p id="info2" name="info2" style="font:courier;font-size:10px">
</
p>
</
body>
</
html>
 
Alex from Sydney
Monday, January 9, 2006
Update on this problem,

I have reinstalled the original beta3 and ran the load csv.htm from the old examples. this worked. I then changed the seturl command to look at some simple text from yahoo...
http://finance.yahoo.com/d/quotes.csv?s=BHP,MSFT&f=snl1b3b2&e=.csv

if you run this in your browser its fine. But off the server it fails.

Any Ideas. Please ...

I am using ie
Alex from Sydney
Tuesday, January 10, 2006
Ive just done some debugging and I get a permission denied on the aw._http.open command. any ideas. ????
Alex from Sydney
Tuesday, January 10, 2006
I may be wrong, but with normal security settings on your browser, I am pretty sure you can't read data from another domain with Javascript, without getting errors. If you lower your security settings it may work. AFAIK you need to use the same domain to load data. Can anyone else confirm that?
Tony
Tuesday, January 10, 2006
yes, this is due to the cross-domain security restrictions - you can only request data from your own domain. You have to make data requests to another domains through a proxy script on your own server.
Alex (ActiveWidgets)
Tuesday, January 10, 2006
Thanks for the info guys, I have done this through asp.net code. I might try and use this to request the page first then return this to the CSV tbl.request
I'll let you know.
Alex from Sydney
Tuesday, January 10, 2006
Excellent! it worked... Thanks. Alex / Tony for your input...

here is the resulting .net code
<%@ Page Language="VB" Debug="true" %>
<%@ 
Import Namespace="System.Net" %>
<%@ 
Import Namespace="System.IO" %>
<
script language="VB" runat="server">

   
Sub Page_Load(Src As ObjectAs EventArgs)
      
dim astr
      dim URL2 
      URL2 
request.querystring("u")
      
URL2 replace(URL2,"-","&")          ' not the best way to pass params (I know)
      astr = readHtmlPage(URL2)
      myPage.Text = astr
   End Sub

   Function readHtmlPage(url As String) As String
      Dim objResponse As WebResponse
      Dim objRequest As WebRequest
      Dim result As String
      objRequest = System.Net.HttpWebRequest.Create(url)
      objResponse = objRequest.GetResponse()
      Dim sr As New StreamReader(objResponse.GetResponseStream())
      result = sr.ReadToEnd()
      sr.Close()
      return result
   End Function
</script>
<asp:literal id="myPage" runat="server"/>
 
And here is the modifed section of code from the above post

var myURL   "http://www.mydomain.com.au/aspdotnetcode.aspx?u=http://au.finance.yahoo.com/d/quotes.csv?s=";  
    var 
myCODES "BHP.AX,TLS.AX,CBA.AX,NAB.AX,WBC.AX,AXA.AX,RIO.AX,AGL.AX,ALL.AX,AMP.AX,ANZ.AX,AMC.AX,BIL.AX,BLD.AX,CCL.AX,CML.AX"
    var 
myCOLS  "-f=snc6p2l1b3b2ohgt1d1-e=.csv";      //note the & were changed to  -   here and are replaced by the .net code
 
change www.mydomain.com.au to your own domain and aspdotnetcode.aspx to the filename of the program above... and thats it.

Thanks again Alex(ActiveWidgets). Your grid is working a treat and is an Excellent project, the best ive seen on the net and I have been looking for a grid for a while. Let me know if you need any help.
Alex from Sydney
Tuesday, January 10, 2006
Exactly, that is what Alex was refering to as proxy which I normally call a tunnel to access data outside the domain. I use XMLHttpRequest methods to load the data, but not the built in AW library because I found the code I use to be simpler. But it's probably my lack of experience with AW code.
Tony
Tuesday, January 10, 2006
Thanks Tony, maybe you could post a sample of your code for reference as well.
Alex from Sydney
Tuesday, January 10, 2006
Here is my function. It's not using ASYNC but it works for most of my purposes. Also I also usually use POST that way if I need to POST data then I just pass to the function, otherwise I just pass GET in the URL.

function loadDoc(url,postdata) {
    
req false;
    if (
window.XMLHttpRequest) {
        
try req = new XMLHttpRequest(); } catch(e) { req false; }
    } else if (
window.ActiveXObject) {
           
try req = new ActiveXObject("Msxml2.XMLHTTP"); } 
        
catch(e) { 
            
try req = new ActiveXObject("Microsoft.XMLHTTP"); }
            
catch(e) { req false; }
        }
    }
    if(
req) {
        
req.open("POST"urlfalse);
        
req.onreadystatechange = function() {return true;}
        
req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        
req.send(postdata);
        return 
req.responseText;
    }
}
 
Tony
Tuesday, January 10, 2006



This topic is archived.

Back to support forum

Forum search