/************************************************************
Description: Safecar(TM): Catalog/Finder of products for for supported car models
Version:     1.2

Copyright 2010 Avi Halachmi, All rights reserved.
Any usage (comercial or other) is prohibited without prior approval by Avi Halachmi.

Written by: Avi Halachmi (avihpit@yahoo.com, Tel.: +972(54)7575-419)



-----------------------------
Changelog:

Version 1.0 (2010-02-26)
- Initial version

Version 1.1 (2010-03-03)
- Added timestamp
- Few cleanups

Version 1.2 (2010-03-08)
- separated generator from main html container

Version 1.3 (2010-12-09)
- Multilingual DB support
************************************************************/
function $(id){return document.getElementById(id);};
function span(text, _class, dir, style, title){
    return "<span"+
        (_class?(" class='"+_class+"' "):"")+
        (dir?(" dir='"+dir+"' "):"")+
        (style?(" style='"+style+"'"):"")+
        (title?(" title='"+title+"'"):"")+
        ">"+text+"</span>";
}
function span_data(text, dir){
    return span(text, "data", dir, "color:green;font-weight:bold;");
};
function dbg(text){
    try{
    $("output_debug").innerHTML+=""+text+"<br/>";
    }catch(e){}
}

function test_getOutput(){
    var db=safecar_products_db;
    var res="";
    
    var dbProps=getDbProperties(db);
    res+="DB properties:<br/>lang: '"+span_data(dbProps.lang)+"'<br/>text-direction: '"+span_data(dbProps.dir)+"'<br/>timestamp:"+span_data(dbProps.timestamp)+" ("+new Date(dbProps.timestamp)+")<br/><br/>";
    var dir=dbProps.dir;

    res+="Translations:<br/>";
    for (var t in dbProps.translations)
        res+=t+": "+span_data(dbProps.translations[t], dir)+"<br/>";
    res+="<br/><br/>";

    for (var makerIx=0, maker; maker=getPropertiesForMakerIx(db,makerIx) ; makerIx++){
        res+="Model: "+         span_data(maker.name, dir)+"<br/>";
        res+="min/max year: "+  span_data(maker.minYear+"/"+maker.maxYear)+"<br/>";
        res+="Categories:<br/>";
        for (c in maker.categories)
            res+=span(c+": "+span_data(maker.categories[c], dir), "", "ltr")+"</br>";
        
        res+="Engines: "+       span_data(maker.engines)+"<br/>";
        res+="<br/>";
        
        var rows=getDisplayRowsArray(db, {makerIx:makerIx, categoryIx:-1, engine:-1});
        //dbg("result rows len="+rows.length);
        
        if (rows) for(var i in rows){
            var row=rows[i];
            res+="<div>"
                +"maker: "+span_data(row.maker, dir)+", "
                +"model: "+span_data(row.model, dir)+", "
                +"engine: "+span_data(row.engine)   +", "
                +"years: ";
            
            for (var year in row.years)
                res+=span_data(year)+"(MAKAT:"+span_data(row.years[year].makat)+") ";
            
            res+="<br/>";
            
            res+="</div>";
        }
        res+="------------------------------<br/><br/>";
    }
    
    return res;
}

var g_filter={};
var g_db=safecar_products_db;
dbgObj(g_db, "main database");//debug

var g_displayLang="-LANG-";
var g_dir="-DIR-"
var g_leftRight="-LEFT-RIGHT-";
setLanguageIfSupported(g_db.languages.defaultLang);

function setLanguageIfSupported(langCode){
    g_displayLang=  getBestMatchingLanguageCode(g_db, langCode);
    g_dir=          g_db.languages[g_displayLang].dir.toLowerCase();
    g_leftRight=    (g_dir=="rtl")?"right":"left";
    return g_displayLang;
}

var g_cursor_pointer=(navigator.appName=="Microsoft Internet Explorer")?"hand":"pointer";

var g_debug=0;
function createPage(filter){
    
    function getFnameDateStr(ts){
        function fix2(n){return n>=10?n:"0"+n;}
        var d= new Date(ts);
        return ""+d.getFullYear()+"-"+fix2(1+d.getMonth())+"-"+fix2(d.getDate())+"-"+fix2(d.getHours())+fix2(d.getMinutes())+"-"+fix2(d.getSeconds());
    }
    
    if (g_debug){
        $("models_container").innerHTML+=test_getOutput();
        return;
    }
    
    $("models_container").dir=g_dir;
    $("models_container").className="dir_"+g_dir;
    $("models_container").style.textAlign=g_leftRight;
    
    var nav=generatePlainNav(g_db, filter);
    $("output_nav_makers").innerHTML=nav.makers;
    $("output_nav_cats").innerHTML=nav.cats;
    $("output_nav_engines").innerHTML=nav.engines;

    $("output_updated").innerHTML=span(
            getDbProperties(g_db).translations["update_date"][g_displayLang]+": "+(new Date(getDbProperties(g_db).timestamp)).toLocaleDateString(),
            "output_updated",
            g_dir,
            false,
            getFnameDateStr(getDbProperties(g_db).timestamp)
    );
    
    $("output_results").innerHTML=getResults(g_db, filter);
}

function navMaker(makerIx){
    g_filter.makerIx=makerIx;
    g_filter.categoryIx=-1;
    g_filter.engine=-1;
    createPage(g_filter);
}
function navCat(catIx){
    g_filter.categoryIx=catIx;
    g_filter.engine=-1;
    createPage(g_filter);
}
function navEngine(engine){
    g_filter.engine=engine;
    createPage(g_filter);
}

//uses implicit g_displayLang
function getResults(db, filter){
    function compare(a,b){
        if (a>b) return 1;
        if (a<b) return -1;
        return 0;
    }
    
    function sortf_ascendingModel(a,b){return compare(a.model[g_displayLang], b.model[g_displayLang]);}
    function sortf_descendingEngines(a,b){return compare(b.engine, a.engine);}
    
    var res="";
    var rows=getDisplayRowsArray(db, filter, g_displayLang);
    if (!rows.length)
        return span("[ "+db.translations.no_products[g_displayLang]+" ]", null, g_dir);//"[No-Products-found]";
    
    rows.sort(sortf_ascendingModel).sort(sortf_descendingEngines);
        
    res+="<table cellspacing=0>";
    
    for (var i in rows){
        var row=rows[i];
        var cls_row="";
        if (i==rows.length-1)
            cls_row+=" last_row";
        if (i==0)
            cls_row+=" first_row";
        cls_row+=(i%2)?" odd":" even";

        res+="<tr class='"+cls_row+"'>";
        var title=row.debug_modelId?(" title='"+row.debug_modelId+"' "):"";
        res+="<td class='model' dir="+g_dir+" "+title+">"+row.maker[g_displayLang]+" "+row.model[g_displayLang]+"</td><td class='engine'>"+row.engine+"</td>";
        res+="<td class='separator'></td>";
        
        for (var y =row.makerMaxYear; y>=row.makerMinYear; y--){
            if (row.years[y]){
                var year=row.years[y];
                var makat=""+year.makat;
                if (!isNaN(makat)&&(""+makat).length>=6)
                    makat=makat.substr(0,3)+"-"+makat.substr(3);
                
                if (g_displayLang != "he" && ((""+makat)==db.translations.product_id_in_progress.he))
                    makat=db.translations.product_id_in_progress[g_displayLang];//hack, makat can be hebrew name. translate this specific 'in progress'
                
                var excelLine=year.debug_line?("\r\nLine:"+year.debug_line):"";
                res+="<td dir='"+g_dir+"' class='year' title='"+getDbProperties(db).translations["product_id"][g_displayLang]+": "+makat+excelLine+"'>"+y+"</td>";
            
            } else {
                res+="<td class='empty_year'></td>";
            }
        }
        res+="<td class='row_trailer'></td>";
        res+="</tr>";
    }

    res+="</table>";
    return res;
}


/* functionality:
1. display:
    a. display all makers, selected is the current one
    b. display all categories for maker. selected is current or "all" by default
    c. display all engines for cat/maker. selected is current or "all" by default

2. navigation:
    a. clicking a maker changes maker and sets cat=-1, engine=-1 and re-display
    b. clicking a cat/all changes cat, resets engines and re-display
    c. clicking an engine/all changes engine and re-display
*/
//uses implicitly: g_displayLang, g_leftRight, g_cursor_pointer, g_dir
function generatePlainNav(db, filter){
    function selectedClass(isSelected){
        return isSelected?"submenuselected":"submenu";
    }
    function sortByItems0_and_concatItems1(itemsArray){
        itemsArray.sort(function(itemA, itemB){
                            if (itemA[0]==itemB[0]) return 0;
                            return (itemA[0]>itemB[0])?1:-1;
                        });

        var res="";
        for (var i=0; i<itemsArray.length; i++)
            res+=itemsArray[i][1];
            
        return res;
    }

    var res="";

    var dbProps=getDbProperties(db);

    var cats=null;
    var engines=null;
    
    //vertical manufacturers list. fixed size, needs sorting according to lang.
    var resm="<table dir='"+dbProps.dir+"'><tr class='submenuheader'><th colspan=2 style='text-align:"+g_leftRight+"'>"+dbProps.translations.manufacturer[g_displayLang]+"</th></tr>";
    var resmItemsArray=[];
    for (var i=0, makerProps; makerProps=getPropertiesForMakerIx(db,i, g_displayLang) ; i++){
        //resm+=
        resmItemsArray[resmItemsArray.length]=[(""+makerProps.name).toLowerCase(), 
            "<tr class='"+selectedClass(filter.makerIx==i)+"'><td style='cursor:"+g_cursor_pointer+";' onclick='javascript:navMaker("+i+")' class='maker_prefix'>&nbsp;</td><td><a class='"+selectedClass(filter.makerIx==i)+"' href='javascript:navMaker("+i+")'>"+makerProps.name+"</a></td></tr>"
            ];
        if (i==filter.makerIx){
            cats=makerProps.categories;
            engines=getEnginesForCat(db, i, filter.categoryIx, g_displayLang);
            //alert("engines for maker "+i+", catix "+filter.categoryIx+": "+engines);
        }
    }
    resm+=sortByItems0_and_concatItems1(resmItemsArray);
    
    resm+="</tr></table>";
    res+=resm;
    
    var resc="";
    if (cats){
        resc+="<table dir='"+g_dir+"'><tr class='submenuheader'><th>"+dbProps.translations.model[g_displayLang]+":</th>";
        if (cats.length>1)
            resc+="<td class='"+selectedClass(filter.categoryIx==-1)+"'><a class='"+selectedClass(filter.categoryIx==-1)+"' href='javascript:navCat(-1)'>"+dbProps.translations.all[g_displayLang]+"</a></td>";
        else
            filter.categoryIx=0;
            
        var rescItemsArray=[];
        for (var i in cats){
            if ((""+cats[i]).indexOf("*")<0){
                //resc+=
                rescItemsArray[rescItemsArray.length]=[(""+cats[i]).toLowerCase(),
                "<td class='"+selectedClass(filter.categoryIx==i)+"'><a class='"+selectedClass(filter.categoryIx==i)+"' href='javascript:navCat("+i+")'>"+cats[i]+"</a></td>"
                ];
            }
        }
        resc+=sortByItems0_and_concatItems1(rescItemsArray);
        
        resc+="</tr></table>";
        res+=resc;
    } else {
        resc+="<table><tr>&nbsp;<td></td></tr></table>";
    }
    
    var rese="";
    if (engines){
        rese="<table dir='"+dbProps.dir+"'><tr class='submenuheader'><th>"+dbProps.translations.engine[g_displayLang]+":</th>";
        if (engines.length>1)
            rese+="<td class='"+selectedClass(filter.engine==-1)+"'><a class='"+selectedClass(filter.engine==-1)+"' href='javascript:navEngine(-1)'>"+dbProps.translations.all[g_displayLang]+"</a></td>";
        else
            filter.engine=engines[0];
            
        //dbg("engines.length="+engines.length);
        for (var i=engines.length-1; i>=0; i--){
            rese+="<td class='"+selectedClass(filter.engine==engines[i])+"'><a class='"+selectedClass(filter.engine==engines[i])+"' href='javascript:navEngine("+engines[i]+")'>"+engines[i]+"</a></td>";
        }
        rese+="</tr></table>";
        res+=rese;
    } else {
        rese+="<table><tr>- no engines -<td></td></tr></table>";
    }
    
    return {makers:resm, cats:resc, engines:rese};
}

function filterFromTexts(makerText, catText, engineText){
    var filter={makerIx:-1, modelIx:-1, engine:-1};
}

function showhide(id){
    var s=$(id).style;
    if (s.display=="none")
        s.display="block";
    else
        s.display="none";
}

