var BookOnlineModel = new Class({
  JSONhandler: false,
  decorator: false,
  settings: false,
  date: false,
  currentStep: 1,
  
  initialize: function ()
  {
    this.JSONhandler = new JSONhandler( this );
    this.decorator = new Decorator( this );
  },
  
  init: function ( callback )
  {
    this.reload( callback, false );
  },
  
  reload: function ( callback, date )
  {
    this.settings = data.settings;
    callback();
  },
  
  repaint: function ( )
  {
  	for( v in bs.view) {
			if( typeof(bs.view[v]) == "object") {
    	  if (v == "popup") continue;
			  bs.view[v].repaint();
			}
  	}
  },
  
  step: function ( index, loaded )
  {
    if (index == 2 && !loaded) return this.retrieveTimes();
    if (index == 3 && !loaded) return this.checkBooking();
    if (this.currentStep == "error") {
      $("raError").style.display = "none";
    } else {
      $("raStep["+this.currentStep+"]").style.display = "none";
    }
    $("raStep["+index+"]").style.display = "";
    this.currentStep = index;
  },
  
  error: function ( error, step)
  {
    $("raStep["+this.currentStep+"]").style.display = "none";
    $("raError").getElement("div.content").innerHTML = error;
    var anchor = $("raError").getElement("div.steps").getElement("a");
    anchor.removeEvents("click");
    anchor.step = step;
    anchor.addEvent("click",function() { bs.model.step(this.step); return false; });
    $("raError").style.display = "";
    this.currentStep = "error";
  },
  
  retrieveTimes: function ( )
  {
    var date = $("date").value;
    var element;
    
    if (this.currentStep == "error") {
      element = $("raError");
    } else {
      element = $("raStep["+this.currentStep+"]");
    }
    
    element.setStyle("opacity","0.5");
    element.getElement("div.steps").setStyle("display","none");
    
    var me = this;
    function JSONCallback( data ) { 
      element.setStyle("opacity","1.0");
      element.getElement("div.steps").setStyle("display","");
      if (data.error == 1) return me.error(data.message, data.step);
     
      var reloadTimes = false;
      if ($("time").options.length <= 0) {
        reloadTimes = true;
      } else {
        var options = $("time").options;
        if (options.length != data.times.length) {
          reloadTimes = true;
        } else {
          for (var i = 0; i < data.times.length; i++) {
            if (!options[i] || data.times[i] != options[i].value) {
              reloadTimes = true;
              break;
            }
          }
        }
      }
      
      if (reloadTimes) {
        $("time").innerHTML = "";
        for (var i = 0; i < data.times.length; i++) {
          var opt = new Element("option",{"value":data.times[i]});
          opt.innerHTML = data.times[i];
          $("time").appendChild(opt);
        }
      }

      var options = $("time").options;
      for (var i = 0; i < options.length; i++) {
        if (data.disabled && data.disabled.length && data.disabled.contains(options[i].value)) {
          options[i].disabled = true;
          options[i].style.textDecoration = "line-through";
        } else {
          options[i].disabled = false;
          options[i].style.textDecoration = "none";
        }
      }
      me.step(2,true);
    };
    this.JSONhandler.JSONRequest(JSON_TIMES, JSONCallback, date);
  },
  
  checkBooking: function ( )
  {
    var date = $("date").value;
    var persons = $("persons").value;
    var time = $("time").value;

    if (this.currentStep == "error") {
      element = $("raError");
    } else {
      element = $("raStep["+this.currentStep+"]");
    }
    
    element.setStyle("opacity","0.5");
    element.getElement("div.steps").setStyle("display","none");
    var me = this;
    function JSONCallback( data ) { 
      element.setStyle("opacity","1.0");
      element.getElement("div.steps").setStyle("display","");

      if (data.error == 1) {
        me.error(data.message, data.step);
      } else {
        me.decorator.decorate("BookOnline.model.checkBooking", {"date": date, "persons": persons, "time": time, "data": data} );
        me.step(3,true);
      }
    };
    this.JSONhandler.JSONRequest(JSON_CHECK, JSONCallback, date, time, persons);
  },
  
  phoneCheck: function ( element )
  {
    if (element.value.length > 10 || element.value.search("[^0-9]") >= 0) {
      $("phoneMessage").innerHTML = "foutief nummer";
      $("phoneMessage").addClass("error");
    } else {
      $("phoneMessage").innerHTML = (10-element.value.length)+" tekens over";
      $("phoneMessage").removeClass("error");
    }
  },
  
  save: function ( )
  {
    var date = $("date").value;
    var persons = $("persons").value;
    var time = $("time").value;
    
    var info = {
      'name': $("name").value,
      'phone': $("phone").value,
      'notes': $("notes").value
    };
    
    if (this.settings.online_fields.indexOf("gender") >= 0) info.gender = $("gender").value;
    if (this.settings.online_fields.indexOf("email") >= 0) {
      info.email = $("email").value;
      
      if ($("welcome_type_email"))
        info.welcome_type = ($("welcome_type_email").checked?"email":"sms");
    }
    
    this.decorator.decorate("BookOnline.model.save", {"info": info, "date": date, "time": time} );
    $("raStep["+this.currentStep+"]").setStyle("opacity","0.5");
    $("raStep["+this.currentStep+"]").getElement("div.steps").setStyle("display","none");
    var me = this;
    function JSONCallback( data ) { 
      $("raStep["+me.currentStep+"]").setStyle("opacity","1.0");
      $("raStep["+me.currentStep+"]").getElement("div.steps").setStyle("display","");
      if (data.error == 1) {
        me.error(data.message, data.step);
      } else me.step(4);
    };
    this.JSONhandler.JSONRequest(JSON_SAVE, JSONCallback, date, time, persons, info);    
  }
});

