/*
Script for New York Pizza in Budapest.
Created by Peter Johansson, PJ Applications 2009
Requires xmltool.js to be loaded

ShoppingCart ver 1.01
- JavaScript based session object
copyright 2008 Thomas Frank
*/
// -------------------------- Setup of global variables ------------------------
loadXMLDoc("menu.xml");
var DishesNode = xmlhttp.responseXML.getElementsByTagName('Dishes')[0].childNodes;
var DefLang          = GetMeta('DefLang', 'en');
var DefActionPrefix  = '?page=';
var DefActionPostfix = '';
var DefOrderAction   = 'order'; // when a upsell is ready change to "upsell"
var ToppingPrice     = 200;
// -------------------------- Setup of global variables ends -------------------

var Cart_Output_Div = undefined;
var Cart_Order_Button = true;

ShoppingCart=function(){

    var x={};

    x.$={
        prefs:{
            memLimit:2000,
            autoFlush:true,
            crossDomain:false,
            includeProtos:false,
            includeFunctions:false
        },
        parent:x,
        clearMem:function(){
            for(var i in this.parent){if(i!="$"){this.parent[i]=undefined}};
            this.flush();
        },
        usedMem:function(){
            x={};
            return Math.round(this.flush(x)/1024);
        },
        usedMemPercent:function(){
            return Math.round(this.usedMem()/this.prefs.memLimit);
        },
        flush:function(x){
            var y,o={},j=this.$$;
            x=x||top;
            for(var i in this.parent){o[i]=this.parent[i]};
            o.$=this.prefs;
            j.includeProtos=this.prefs.includeProtos;
            j.includeFunctions=this.prefs.includeFunctions;
            y=this.$$.make(o);
            if(x!=top){return y.length};
            if(y.length/1024>this.prefs.memLimit){return false}
            x.name=y;
            return true;
        },
        getDomain:function(){
                var l=location.href
                l=l.split("///").join("//");
                l=l.substring(l.indexOf("://")+3).split("/")[0];
                while(l.split(".").length>2){l=l.substring(l.indexOf(".")+1)};
                return l
        },
        debug:function(t){
            var t=t||this,a=arguments.callee;
            if(!document.body){setTimeout(function(){a(t)},200);return};
            t.flush();
            var d=document.getElementById("ShoppingCartDebugDiv");
            if(!d){d=document.createElement("div");document.body.insertBefore(d,document.body.firstChild)};
            d.id="ShoppingCartDebugDiv";
            d.innerHTML='<div style="line-height:20px;padding:5px;font-size:11px;font-family:Verdana,Arial,Helvetica;'+
                        'z-index:10000;background:#FFFFCC;border: 1px solid #333;margin-bottom:12px">'+
                        '<b style="font-family:Trebuchet MS;font-size:20px">ShoppingCart.js - debug info:</b><br/><br/>'+
                        'Memory usage: '+t.usedMem()+' Kb ('+t.usedMemPercent()+'%)&nbsp;&nbsp;&nbsp;'+
                        '<span style="cursor:pointer"><b>[Clear memory]</b></span><br/>'+
                        top.name.split('\n').join('<br/>')+'</div>';
            d.getElementsByTagName('span')[0].onclick=function(){t.clearMem();location.reload()}
        },
        init:function(){
            var o={}, t=this;
            try {o=this.$$.toObject(top.name)} catch(e){o={}};
            this.prefs=o.$||t.prefs;
            if(this.prefs.crossDomain || this.prefs.currentDomain==this.getDomain()){
                for(var i in o){this.parent[i]=o[i]};
            }
            else {
                this.prefs.currentDomain=this.getDomain();
            };
            this.parent.$=t;
            t.flush();
            var f=function(){if(t.prefs.autoFlush){t.flush()}};
            if(window["addEventListener"]){addEventListener("unload",f,false)}
            else if(window["attachEvent"]){window.attachEvent("onunload",f)}
            else {this.prefs.autoFlush=false};
        }
    };

    x.$.$$={
        compactOutput:false,
        includeProtos:false,
        includeFunctions: false,
        detectCirculars:true,
        restoreCirculars:true,
        make:function(arg,restore) {
            this.restore=restore;
            this.mem=[];this.pathMem=[];
            return this.toJsonStringArray(arg).join('');
        },
        toObject:function(x){
            if(!this.cleaner){
                try{this.cleaner=new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}
                catch(a){this.cleaner=/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/}
            };
            if(!this.cleaner.test(x)){return {}};
            eval("this.myObj="+x);
            if(!this.restoreCirculars || !alert){return this.myObj};
            if(this.includeFunctions){
                var x=this.myObj;
                for(var i in x){if(typeof x[i]=="string" && !x[i].indexOf("JSONincludedFunc:")){
                    x[i]=x[i].substring(17);
                    eval("x[i]="+x[i])
                }}
            };
            this.restoreCode=[];
            this.make(this.myObj,true);
            var r=this.restoreCode.join(";")+";";
            eval('r=r.replace(/\\W([0-9]{1,})(\\W)/g,"[$1]$2").replace(/\\.\\;/g,";")');
            eval(r);
            return this.myObj
        },
        toJsonStringArray:function(arg, out) {
            if(!out){this.path=[]};
            out = out || [];
            var u; // undefined
            switch (typeof arg) {
            case 'object':
                this.lastObj=arg;
                if(this.detectCirculars){
                    var m=this.mem; var n=this.pathMem;
                    for(var i=0;i<m.length;i++){
                        if(arg===m[i]){
                            out.push('"JSONcircRef:'+n[i]+'"');return out
                        }
                    };
                    m.push(arg); n.push(this.path.join("."));
                };
                if (arg) {
                    if (arg.constructor == Array) {
                        out.push('[');
                        for (var i = 0; i < arg.length; ++i) {
                            this.path.push(i);
                            if (i > 0)
                                out.push(',\n');
                            this.toJsonStringArray(arg[i], out);
                            this.path.pop();
                        }
                        out.push(']');
                        return out;
                    } else if (typeof arg.toString != 'undefined') {
                        out.push('{');
                        var first = true;
                        for (var i in arg) {
                            if(!this.includeProtos && arg[i]===arg.constructor.prototype[i]){continue};
                            this.path.push(i);
                            var curr = out.length;
                            if (!first)
                                out.push(this.compactOutput?',':',\n');
                            this.toJsonStringArray(i, out);
                            out.push(':');
                            this.toJsonStringArray(arg[i], out);
                            if (out[out.length - 1] == u)
                                out.splice(curr, out.length - curr);
                            else
                                first = false;
                            this.path.pop();
                        }
                        out.push('}');
                        return out;
                    }
                    return out;
                }
                out.push('null');
                return out;
            case 'unknown':
            case 'undefined':
            case 'function':
                if(!this.includeFunctions){out.push(u);return out};
                arg="JSONincludedFunc:"+arg;
                out.push('"');
                var a=['\n','\\n','\r','\\r','"','\\"'];
                arg+=""; for(var i=0;i<6;i+=2){arg=arg.split(a[i]).join(a[i+1])};
                out.push(arg);
                out.push('"');
                return out;
            case 'string':
                if(this.restore && arg.indexOf("JSONcircRef:")==0){
                    this.restoreCode.push('this.myObj.'+this.path.join(".")+"="+arg.split("JSONcircRef:").join("this.myObj."));
                };
                out.push('"');
                var a=['\n','\\n','\r','\\r','"','\\"'];
                arg+=""; for(var i=0;i<6;i+=2){arg=arg.split(a[i]).join(a[i+1])};
                out.push(arg);
                out.push('"');
                return out;
        	default:
				out.push(String(arg));
				return out;
			}
		}
	};
	x.$.init();  
	return x;
}()

if (!ShoppingCart.Order){
  ShoppingCart.Order = new Array(0);
}

// Helpers
function GetaWord(name, altlang){
var S;
  try{
    if (altlang){
      S = GetaNodeValue('Words,' + name + ',' + altlang);
    }
    else{
      S = GetaNodeValue('Words,' + name + ',' + DefLang);
    }
  }
  catch(err){
    S = name;
  }
  return S;
}

function TranslateString(S, altlang){
var I;
var N = GetaNode('Words');
var A = S.split(',');
var R = '';
  if(!altlang) altlang = DefLang;
  if (N){
    for (I = 0; I < A.length; I++){
      try{
        R += N.getElementsByTagName(A[I])[0].getElementsByTagName(altlang)[0].firstChild.nodeValue;
        if (I < A.length - 1) R += ', ';
      }
      catch(err){
        R += A[I];
      }  
    }
  }
  else{
    R = A.tostring();
  }
  return R;
}

function GetaWordlist(filter){
var lst = null;
var I;
var A = new Array(0);
  try{
    lst = GetaNode('Words').childNodes;
  }
  catch(err){}
  if (lst){
    for (I = 0; I < lst.length; I++){
      if (!lst[I].getElementsByTagName('filter')[0]) continue;
      if (lst[I].getElementsByTagName('filter')[0].firstChild.nodeValue != filter) continue;
      A.push(Array(lst[I].nodeName, lst[I].getElementsByTagName(DefLang)[0].firstChild.nodeValue));
    }
  }
  return A;
}

function NodeFromID(ID){
var I;
var ItemID;
var Node = null;
  for (I = 0; I < DishesNode.length; I++){
    ItemID = DishesNode[I].attributes.getNamedItem('ID').value;
    if (ItemID == ID){
      Node = DishesNode[I];
      break;
    }
  }
  return Node;
}

function PrepareItem(ID){
var Node = NodeFromID(ID);
  if (Node){
    this.ID = ID;
    this.Name = Node.attributes.getNamedItem('Name').value;
    try{
      this.Price = eval(GetaChildValue(Node, 'Price'));
    }
    catch(err){  
      this.Price = 0;
    }  
    this.Size = '';
    this.Topping = '';
    this.Special = '';
    this.Action = GetaChildValue(Node, 'Action', '');
  }
}

function NewRawItem(ID){
  ShoppingCart.Current = new PrepareItem(ID);
  ShoppingCart.Current.Action = undefined;
}

function NewItem(ID, action){
  ShoppingCart.Current = new PrepareItem(ID);
  if (action) ShoppingCart.Current.Action = action;
  if (ShoppingCart.Current.Action){
    window.location.assign(DefActionPrefix + ShoppingCart.Current.Action + DefActionPostfix);
  }
  else AddToCart();
}

function GoToPage(action){
  window.location.assign(DefActionPrefix + action + DefActionPostfix);
}

function AddToCart(action){
var idx;
  if (ShoppingCart.Current){
    idx = ShoppingCart.Order.length;
    ShoppingCart.Order[idx] = ShoppingCart.Current;
    ShoppingCart.Current = undefined;
  }
  if (action){
    window.location.assign(DefActionPrefix + action + DefActionPostfix);
  }
//  ShowCart(); -- commented while testing
  ShowCart();
}

function RemoveFromCart(Index){
  ShoppingCart.Order.splice(Index, 1);
  ShowCart();
}

function order(){
var I;
var total = 0;
  for (I = 0; I < ShoppingCart.Order.length; I++){
    total += eval(ShoppingCart.Order[I].Price);
  }
  if (total > 0){
    window.location.assign(DefActionPrefix + DefOrderAction + DefActionPostfix);
  }
  else{
    alert(GetaWord('Cartempty'));
  }
}

function CartClick(){
  RemoveFromCart(this.id);
}

function CartOrderClick(){
var I;
var total = 0;
  for (I = 0; I < ShoppingCart.Order.length; I++){
    total += eval(ShoppingCart.Order[I].Price);
  }
  if (total > 0){
    window.location.assign(DefActionPrefix + DefOrderAction + DefActionPostfix);
  }
  else{
    alert(GetaWord('Cartempty'));
  }
}

function ShowCart(parent){
var Tbl, R, C, I, S, Txt, Btn;
var total = 0;
  Tbl = document.createElement('table');
  Tbl.className = 'CartFrame';
  R = Tbl.insertRow(Tbl.rows.length);
  C = R.insertCell(0);
  C.innerHTML = GetaWord('Yourselection');
  C.className = 'CartHeaderLeft';
  C = R.insertCell(1);
  C.innerHTML = GetaWord('Price');
  C.className = 'CartHeaderPrice';
  for (I = 0; I < ShoppingCart.Order.length; I++){
    total += eval(ShoppingCart.Order[I].Price);
    R = Tbl.insertRow(Tbl.rows.length);
    R.className = 'CartRow';
    R.id = I;
    if (Cart_Order_Button){
      R.onclick = CartClick;
    }  
    C = R.insertCell(0);
    C.className = 'CartItemLeft';
    S = ShoppingCart.Order[I].ID + ' ';
    S += ShoppingCart.Order[I].Name;
    if (ShoppingCart.Order[I].Size) S += '<br>' + GetaWord(ShoppingCart.Order[I].Size);
    if (ShoppingCart.Order[I].Topping) S += '<br>' + TranslateString(ShoppingCart.Order[I].Topping);
    if (ShoppingCart.Order[I].Special) S += '<br>' + ShoppingCart.Order[I].Special;
    C.innerHTML = S;

    C = R.insertCell(1);
    C.className = 'CartItemPrice';
    C.innerHTML = eval(ShoppingCart.Order[I].Price);

  }
  R = Tbl.insertRow(Tbl.rows.length);
  C = R.insertCell(0);
  C.className = 'CartFooterLeft';
  C.innerHTML = GetaWord('Eatin');
  C = R.insertCell(1);
  C.className = 'CartFooterPrice';
  C.innerHTML = total + '<br>';

  if (Cart_Order_Button){
    Btn = document.createElement('button');
    Btn.className = 'CartButton';
    Btn.innerHTML = GetaWord('Order');
    Btn.onclick = CartOrderClick;
    Txt = document.createTextNode(GetaWord('Cancel'));
  }
  if (parent) Cart_Output_Div = parent;
  if (Cart_Output_Div){
    Cart_Output_Div.innerHTML = '';
    Cart_Output_Div.appendChild(Tbl);
    if (Cart_Order_Button){
      Cart_Output_Div.appendChild(Btn);
      Cart_Output_Div.appendChild(Txt);
    }
  }  
}

