﻿// ================================================================================================================	
// JFormara
//
// Performs a JSON call to Formarama to retrieve data from the database. Can be used cross-domain
//
// Constructor: JFormarama(event_c)         example: myJF=new JFormarama('753C1DA3-2FE5-46FA-91CB-346CC622E69E')
// methods:
//              setWhere(whereclause)       sets the where clause in a query                   example: myJF.setWhere=("[destination]='Halong'")
//              setWhat(whatclause)         sets the fields clause in a query                  example: myJF.setWat=("[destination],[image]")
//              setOrder(orderclause)       sets the order by clause in a query                example: myJF.setOrder=("[tip_date] desc'")
//              debug(flag)                 creates a debug div on the botton of the window    example: myJF.debug(true)
//              clear()                     clears the what,where and order clause             example: myJF.clear()
//              send(callback_functionname) performs a JSON request and sends data to callback example: myJF.send('mycallback')
//              getEvent()                  returns the current event_c                        example: myJF.getevent()

//              callback receives a data structure as the last parameter
//
//              Tools: 
//              JFToArray(data) creates a one dimensional array with rows alternating for each field retrieved

//                  example: if the setWhat method had two fields:    myJF.setWat=("[destination],[image]")
//                      myJF.send("mycallback(1,2,3)")

//                      function mycallback(a,b,c, data) {
//                          data=JFToArray(data)
//                          for (i=0;i< data.length;i=i+2) {
//                              alert("Destination: " + data[i])
//                              alert("Image: " + data[i+1])
//                          }
//                      }

//              JFToTable(data,hide) returns a html string with a table structure of the data, including fieldnames in the header
//              hide: a string of columnames seperated by a comma of columns that should be hidden
//              Notes:
//              * Only fields which are 'public' can be retrieved
//              * all fieldnames must be put in between square brackets []
//              * fieldnames are the same as defined in the Formarama form editor
//              * in addition to these fieldnames, the following fields can be retrieved:
//                      [submitted]         the timestamp when the record was inserted
//                      [subscriber ID]     integer unique record number
//                      
//              * send method is always asynchronous                         
//              * use the build-in debugger!   myJF.debug(true)    
//              * when using dates in the where clase specify them as yyyymmdd                   
//              * JFTable: the following style classes are available:
//                      jftable  
//                      jfth          
//                      jfth + column number                 
//                      jftheven & jfthodd
//                      jftreven & jftrodd
//                      jftd + column number  
//                      jftdeven & jftdodd
//                                      
//              --------------------------------------------------------------------------                          
//              code example:
//              
//              // get all images from halong
//
//              myJF=new JFormarama('753C1DA3-2FE5-46FA-91CB-346CC622E69E')
//              myJF.setWhat=("[image]")                       
//              myJF.setWhere=("[destination]='Halong'")                         
//              myJF.send("mycallback")                     
//                                       
//              function mycallback(somedata) {
//                  var html=""
//                  for (i=0;i< somedata.length;i++) {
//                     myhtml=myhtml+somedata[i]+"<br>"
//                  }              
//                  document.getElementById("mydiv").innerHTML=html
//              }
//
//              vBase: see JFTest.asp for documentation
//

// ================================================================================================================	


// ================================================================================================================	
function JFormarama(event_c) {
    this.event_c=event_c;
    this.where="";
    this.what="";
    this.order="";
    this.callback="";
}

JFormarama.prototype.setLocal=function(flag)  {
    this.local=flag;
};

JFormarama.prototype.isLocal=function()  {
    return this.local;
};

JFormarama.prototype.forceRemote=function(flag)  {
    this.forceRemote=flag;
};

JFormarama.prototype.setEvent=function(event_c)  {
    this.event_c=event_c;
};

JFormarama.prototype.clear=function()  {
    this.where="";
    this.what="";
    this.order="";
    this.callback="";
};

JFormarama.prototype.getEvent=function()  {
    return this.event_c;
};

JFormarama.prototype.setWhere=function(where)  {
    if (where) {
        where=replace(where,"&gt;",">");
        where=replace(where,"&lt;","<");
        this.where=encodeURIComponent(where);
    }
};

JFormarama.prototype.setWhat =function(what) {
    if (what) {this.what=encodeURIComponent(what);}
};

JFormarama.prototype.setOrder =function (order) {
    if (order) {this.order=encodeURIComponent(order);}
};

JFormarama.prototype.debug=function(debug)  {
    if (debug) {this.debug=debug;}
};

JFormarama.prototype.send = function(callback) {
    if (!this.event_c) {
        alert("JFormarama: event_c not set");
        return;
    }
    if (!callback) {
        alert("JFormarama: no callback given in JFormarama.send");
        return;
    }
    if (this.local === true) {
        extra = "";
        if (this.forceRemote === true) { extra = "&forceremote=1"; }
        src = "http://localhost/formarama/json.asp?event_c=" + this.event_c + "&query_what=" + this.what + "&callback=" + callback + "&query_where=" + this.where + "&query_order=" + this.order + extra;
    }
    else {
        src = "http://www.formarama.com/json.asp?event_c=" + this.event_c + "&query_what=" + this.what + "&callback=" + callback + "&query_where=" + this.where + "&query_order=" + this.order;
    }
    request = new JSONscriptRequest(src, "js");
    request.buildScriptTag();
    request.addScriptTag();

    if (this.debug === true) {
        if (gebi("debugger_" + this.event_c)) {
            gebi("debugger_" + this.event_c).parentNode.removeChild(gebi("debugger_" + this.event_c));
        }
        newdiv = document.createElement("div");
        newdiv.id = "debugger_" + this.event_c;
        newdiv.style.borderStyle = "Solid";
        newdiv.style.borderWidth = 2;
        newdiv.style.overflow = "auto";
        document.body.appendChild(newdiv);
        newiframe = document.createElement("iframe");
        newiframe.id = "debugiframe_" + this.event_c;
        newiframe.style.width = "100%";
        newiframe.style.borderWidth = 0;
        src = replace(src, "<", "&lt;");
        src = replace(src, ">", "&gt;");

        html = newdiv.innerHTML = "Event: " + this.event_c + "<br><br><b>json was called as follows:</b> " + src + "</br></br>";
        html = html + "<b>formarama/json.asp responded as follows:";
        newdiv.innerHTML = html;

        newdiv.appendChild(newiframe);

        newiframe.src = src;
    }
};



//===================================================================
function JFToTable(data, hidecolumns) {
//      transforms a JFormarama data object to a table
        var str="";
        var i,rec;
        if (data.items.length>0) {
            str=str+"<table class=jftable><tr>";
            rec = data.items[0]; 
            var j=0;
            var thclass="jftheven";
            var n,alist; 
            for(n in rec) {
                if (thclass === "jftheven") { thclass = "jfthodd"; } else { thclass = "jftheven"; }
                alist = hidecolumns.split(",");

                display = "";
                for (i = 0; i < alist.length; i++) {
                    if (alist[i] !== "") {
                        if (n.toUpperCase() === alist[i].toUpperCase()) {
                            display = "style=display:none";
                        }
                    }
                }

                str=str+"<td "+display+" class='jfth jfth"+j+" "+thclass+"'>"+n+"</td>";
            }
            str=str+"</tr>";
            var aclass="jftreven";
            for (i=0;i< data.items.length;i++) {
                if (aclass==="jftreven") {aclass="jftrodd";} else {aclass="jftreven";}
                str=str+"<tr class="+aclass+">";
                rec = data.items[i];
                j=1;
                var tdclass="jftdeven";
                
                for(n in rec) {
                    if (tdclass === "jftdeven") { tdclass = "jftdodd"; } else { tdclass = "jftdeven"; }
                    display = "";
                    for (j = 0; j < alist.length; j++) {
                        if (alist[j] !== "") {

                            if (n.toUpperCase() === alist[j].toUpperCase()) {
                                display = "style=display:none";
                            }
                        }
                    }
                    var aval = rec[n]
                    if (aval === null) { aval = "&nbsp;" }

                    str=str+"<td "+display+" class='jftd"+j+" "+tdclass+"'>"+aval+"</td>";
                    j++;
                }
                str=str+"</tr>";
                
            }
            str = str + "</table>";
            str = replace(str, "&lt;", "<");
            str = replace(str, "&gt;", ">");
            return str;
        }    

}


// ======================================================================	
function JFToArray(jsonstuff) {

//      transforms a JFormarama data object to a one dimensional table

    var j=0  ;
    var myarray = [];
    for (i=0;i< jsonstuff.items.length;i++) {
        var rec = jsonstuff.items[i];
        var n;    
        for(n in rec) {
            myarray[j]=rec[n];
            j++;
        }
    }
    return myarray;
}
//========================================================================================
function JFormaramaCallback(index, target, pattern, classname, data) {


    pattern = decodeURIComponent(pattern);
    //var adiv = $("." + classname)[index];
    var adiv = $("#" + target).find("." + classname)[index];

    
    var jtemplate = false;
    if (adiv.id) {
        jtemplate = jQuery("#" + adiv.id + " .jtemplate");
        if (jtemplate.length > 0) {
            jtemplate = jtemplate[0];
            jtemplate.parentNode.removeChild(jtemplate);
        }
    }

    if (pattern.toLowerCase().indexOf("table") !== -1) {
        var hide = trim(replace(pattern, "table", ""));
        adiv.innerHTML = JFToTable(data, hide);
        if (jtemplate) {adiv.appendChild(jtemplate); }
        checkLast(target, classname, adiv);
        return;
    }
    var str = "";

    var rec = data.items[0];
    nfields = 0;
    var n;
    for (n in rec) {nfields++; }
    data = JFToArray(data);

    if (adiv.className.find("dropdown")) {str = str + "<select>";}

    for (var i = 0; i < data.length; i = i + nfields) {
        newpat=pattern;
        if (i===data.length-nfields) {
            // for the last one, only between the brackets
            if (newpat.indexOf("[")!==-1) {
                ipos=newpat.indexOf("[")+1;
                newpat=newpat.substr(ipos);
                newpat=newpat.substr(0,newpat.indexOf("]"));
            }
        }   
        else {
            if (newpat.indexOf("[")!==-1) {newpat=newpat.substr(0,newpat.indexOf("["));}
        }
        for (var j=0;j<nfields;j++) {
            aval = data[i + j];
            //if (aval === "null") { aval = "&nbsp;" }
            //if (aval === "null") { aval = "&nbsp;" }
            if (aval === null) { aval = "&nbsp;" }
            
            ipos = newpat.indexOf("*");
            newpat=newpat.substr(0,ipos)+aval+newpat.substr(ipos+1);
        }
        str = str + newpat;
        if (adiv.className.find("dropdown")) { str = str + "<option>"+newpat+"</option>"; }

    }
    if (adiv.className.find("dropdown")) {str = str + "</select>";}
    str = replace(str, "&lt;", "<");
    str = replace(str, "&gt;", ">");

    adiv.innerHTML = str;

    if (jtemplate) {adiv.appendChild(jtemplate); }
    checkLast(target, classname, adiv);

}

//========================================================================================
function JFormaramaStuff(target, debug) {
    //var alist = $(".jFormarama")    // <--- doesn't work cause of piggybacks. [i] might point to the wrong div
    var alist = $("#" + target).find(".jformarama");

    for (var i = 0; i < alist.length; i++) {

        if (!alist[i].className.find("jformaramadone")) {
            var c = trim(alist[i].innerHTML);
            c = replace(replace(c, "&lt;", "<"), "&gt;", ">");
            var myJF=new JFormarama(c.split("|")[0]);
            myJF.setWhat(c.split("|")[1]);
            nfields=c.split("|")[1].split(",").length;
            //if (!forceRemote)  {myJF.setLocal(true);}
            myJF.setWhere(c.split("|")[2]);
            if (debug) { myJF.debug(true); }
            myJF.setOrder(c.split("|")[3]);
            var pattern = c.split("|")[4];
            if (pattern) {
                pattern=replace(pattern," ","%20");
                pattern=replace(pattern,"&nbsp;","%20");
            }
            else {
                pattern="table";
            }
            pattern = replace(pattern, "\'", "'");
            pattern = replace(pattern, "\n", "");
            
            myJF.send('JFormaramaCallback(' + i + ',"' + target + '","' + pattern + '","jformarama")');
            alist[i].innerHTML = "<img src=" + vbasepath + "images/wait.gif>";
            alist[i].style.display = "inline-block";
            //alist[i].style.display=""
            //alist[i].style.display="block";

        }
    }
}

var cdbicounter = 0;  // unique id for a cdbi table

//========================================================================================
function jCDBIStuff(target, debug) {
    var jtemplate = false;
    //var alist = $(".jcdbi");
    var alist = $("#" + target).find(".jcdbi");
    var src="";
    for (var i = 0; i < alist.length; i++) {

        if (CDBIDatabase === "") {alert("No CDBI Database defined in site_d for this site");return; }


        if (!alist[i].className.find("jcdbidone")) {
            if (alist[i].id) {
                jtemplate = jQuery("#" + alist[i].id + " .jtemplate");
                if (jtemplate.length > 0) {
                    jtemplate = jtemplate[0];
                    jtemplate.parentNode.removeChild(jtemplate);
                }
            }
            var c = trim(alist[i].innerHTML);

            alist[i].innerHTML = "<img src=" + vbasepath + "images/wait.gif>";
            alist[i].style.display = "inline-block";

            // -------------------------------------------------------------------------------------
            // here for an ad-hoc query. <div class="jcdbi">select a,b,c from d|printpattern</div>
            // -------------------------------------------------------------------------------------

            if (c.toUpperCase().find("SELECT")) {   // <-------- <div class="jcdbi">select a,b,c from d|printpattern</div>
                if (jtemplate) {alist[i].appendChild(jtemplate); }
                //alert(1)
                if (!c.find("|")) {c = c + "|"; }
                c = replace(replace(c, "&lt;", "<"), "&gt;", ">");

                var query = c.split("|")[0];
                query = replace(query, "&nbsp;", " ");
                query = encodeURIComponent(query);

                var pattern = c.split("|")[1];
                if (pattern === "") {pattern = "table"; }

                pattern = replace(pattern, " ", "%20");
                pattern = replace(pattern, "&nbsp;", "%20");
                pattern = replace(pattern, "\n", "");
                pattern = replace(pattern, "'", "\"");

                pattern = encodeURIComponent(pattern);

                src = vbasepath + "jcdbi.asp?site_key=" + site_key + "&database=" + CDBIDatabase + "&query=" + query + "&callback=JFormaramaCallback(" + i + ",\"" + target + "\",\"" + pattern + "\",\"jcdbi\")";
                request = new JSONscriptRequest(src, "js");
                request.buildScriptTag();
                request.addScriptTag();
            }

            // -------------------------------------------------------------------------------------
            // here for full-blown CDBI table
            // -------------------------------------------------------------------------------------

            else { // <-------- <div class="jcdbi">view=&table=&where=&whereval=&maskfldstring=&maskvalstring=&skipfldstring=&viewmode=&showwhere&sort_on=&allowswitch=&defaultpagesize=&returnpage=page_c</div>
                //           can also include c_ihf c_iwf c_ihl c_iwl (like image width form / list)
                cdbicounter++;

                if (jtemplate) {alist[i].appendChild(jtemplate); }

                src = vbasepath + "cdbi/single.asp";
                src = src + "?site_key=" + site_key;
                src = src + "&md5hash=" + md5Hash;
                src = src + "&cdbicounter=" + cdbicounter;
                src = src + "&database=" + CDBIDatabase;
                src = src + "&vbasepath=" + encodeURIComponent(vbasepath);
                src = src + "&" + c;
                src = replace(src, "&amp;", "&");
                src = replace(src, "&&", "&");
                getPageAsJSON(src, "singleCallback('" + target + "'," + i + ")");
            }                

        }
    }
}

//========================================================================================
function singleCallback(target, i, data) {
    var adiv = $("#" + target).find(".jcdbi")[i];

    var jtemplate = false;
    if (adiv.id) {
        jtemplate = jQuery("#" + adiv.id + " .jtemplate");
        if (jtemplate.length > 0) {
            jtemplate = jtemplate[0];
            jtemplate.parentNode.removeChild(jtemplate);
        }
    }



    if (typeof data === "object") { data = toArray(data); }
    adiv = $("#" + target).find(".jcdbi")[i];
    //$(adiv).addClass("jcdbidone")
    adiv.innerHTML = data;

    if (jtemplate) { adiv.appendChild(jtemplate); }
    if (gebi('waiting')) { gebi('waiting').style.display = 'none'; }
    if (gebi('widthdiv')) gebi('widthdiv').style.display = '';
    setTextContainers()
    setTextContainers()
    $(".popper").hover(function(e) { showCDBIPop(e,this.getAttribute('helptext')); }, function() { killPop(); });
    
    checkLast(target, "jcdbi", adiv);
}

//========================================================================================
function jReplace(targetId, varnames, varvalues) {

    //<div class="jcdbi">select top 10 hashers_c,'<span onclick="jReplace(''depending'', ''hashers_c'', '''+cast(hashers_c as varchar(20))+''')">'+hashers_e+'</span>',hash_name_I,runs	 from hashers_total|</div>

    //<div id="depending"><div class="jtemplate"  >select * from hashers_total where hashers_c='{hashers_c}'</div></div>

    var target = gebi(targetId);
    var jtemplate = jQuery("#" + targetId + " .jtemplate")[0];
    var a = jtemplate.innerHTML;
    var varlist = varnames.split(",");
    var vallist = varvalues.split(",");
    for (var i=0; i<varlist.length;i++) {
        a = replace(a, "{" + varlist[i] + "}", vallist[i]);
    }
    $(target).addClass('jcdbi').removeClass('jcdbidone').css("display", "none").html(a);
    target.appendChild(jtemplate);
    jCDBIStuff(replace(getContainer(target), "_scroller", ""));
}


//========================================================================================
function checkLast(target, classname, adiv) {
    //alert(target + " " + $("#" + target).find(".jcdbi,.jformarama").length)
    var count = 0;
    $("#" + target).find(".jcdbi,.jformarama").each(function() {
        if (!this.className.find("done")) { count++; }
    });

    $(adiv).addClass(classname + "done");
    if (count === 1) { // hey, this is the last call. so we need to set the pagesize
        if (haveScrollbar || target.find("modal")) {
            setVsize(target, "checkLast 1");
        }
        else {
            setVsize("all", "checkLast 2");
        }
        //alert(target+"_scroller")
        //setGlider(target+"_scroller")
    }
}




       

