/**
 * Carib data
 * 
 * @version $Id: data.js 546 2009-09-11 15:35:29Z  $
 */

ns('Carib.Order.Data');

/**
 * Record
 * 
 * @param {Object} fields all fields and its default values
 * @param {Object} values values to be set after record constructing
 */
Carib.Order.Data.Record = function(fields, values) {
  this.id = Carib.Order.Data.Record.generateId();
  this.initial = fields;
  this.data = {};
  this.dirty = false;
  this.modified = {};
  this._owned_set = null;
  
  $.extend(this.data, fields, values);
}

Carib.Order.Data.Record.generateId = (function() {
  var id = 0;
  return function() { return ++ id; }
})();

Carib.Order.Data.Record.prototype = {
  get: function(name) {
    return this.data[name];
  },
  
  set: function(name, value) {
    this.data[name] = value;
    this.dirty = true;
    this.modified[name] = true;
  },
  
  has: function(name) {
    return this.data[name] !== undefined;
  },
  
  _setRecordset: function(recordset) {
    this._owned_set = recordset;
  },
  
  _unsetRecordset: function() {
    this._owned_set = null;
  },
  
  commit: function(silent) {
    if(this._owned_set && !silent)
      this._owned_set._commitRecord(this);
      
    this.dirty = false;
    this.modified = {};  
  },
  
  setId: function(id) {
    this.id = id;
  },
  
  getId: function() {
    return this.id;
  },
  
  reset: function() {
    this.data = this.initial;
  },
  
  isDirty: function() {
    return this.dirty;
  },
  
  importValues: function(values) {
    $.extend(this.data, values);
  }
}


/**
 * Contacts 
 */
Carib.Order.Data.CommonInfo = function(values) {
  Carib.Order.Data.CommonInfo.superclass.constructor.call(this, {
    name: '', // наименование агенства или ФИО частного лица
    phones: '', // телефоны
    email: '', // email
    budget: 0, // планируемый бюджет
    travel_duration: '', // продолжительность тура (ночей)
    folks: 0, // количество человек
    start_date: new Date(), // дата вылета
    arrival_date: new Date(), // дата прибытия
    additional_info: ''
  }, values);
}

utils.extend(Carib.Order.Data.CommonInfo, Carib.Order.Data.Record);


/**
 * Residence
 */
Carib.Order.Data.Residence = function(values) {
  Carib.Order.Data.Residence.superclass.constructor.call(this, {
    country_id: 0, // id страны
    country_name: '', // название страны
    city_id: 0, // id города/курорта
    city_name: '', // название города
    tour_id: 0, // id тура
    tour_name: '', // название тура
    hotel_id: 0, // id отель
    hotel_name: '', // название отеля
    nights: 1, // количество ночей
    number_category_id: 0, // id типа номера
    number_category_name: '', // название типа номера
    placing_category_id: 0, // id категория размещения
    placing_category_name: '', // название категории размещения
    food_type_id: 0, // id типа питания
    food_type_name: '', // название типа питания
    excursions: new Carib.Order.Data.Recordset(), // экскурсии
    transfer: '' // трансферы
  }, values);
}

utils.extend(Carib.Order.Data.Residence, Carib.Order.Data.Record, {
  importValues: function(values) {
    Carib.Order.Data.Residence.superclass.importValues.call(this, values);
    if(values.excursions)
      this.data.excursions = this.data.excursions.getClone();
  }  
});


/**
 * Country
 */
Carib.Order.Data.Country = function(values) {
  Carib.Order.Data.Country.superclass.constructor.call(this, {
    id: 0,
    name: '' // название
  }, values);
}

utils.extend(Carib.Order.Data.Country, Carib.Order.Data.Record);


/**
 * City
 */
Carib.Order.Data.City = function(values) {
  Carib.Order.Data.City.superclass.constructor.call(this, {
    id: 0, 
    name: '' // название
  }, values);
}

utils.extend(Carib.Order.Data.City, Carib.Order.Data.Record);


/**
 * Tour
 */
Carib.Order.Data.Tour = function(values) {
  Carib.Order.Data.Tour.superclass.constructor.call(this, {
    id: 0, 
    name: '', // название
    duration: 1, // продолжительность
    description_file: '' // файл с описанием
  }, values);
}

utils.extend(Carib.Order.Data.Tour, Carib.Order.Data.Record);


/**
 * Excursion
 */
Carib.Order.Data.Excursion = function(values) {
  Carib.Order.Data.Excursion.superclass.constructor.call(this, {
    id: 0, 
    name: '' // название
  }, values);
}

utils.extend(Carib.Order.Data.Excursion, Carib.Order.Data.Record);


/**
 * Hotel
 */
Carib.Order.Data.Hotel = function(values) {
  Carib.Order.Data.Hotel.superclass.constructor.call(this, {
    id: 0,
    name: '' // название
  }, values);
}

utils.extend(Carib.Order.Data.Hotel, Carib.Order.Data.Record);


/**
 * Number category
 */
Carib.Order.Data.NumberCategory = function(values) {
  Carib.Order.Data.NumberCategory.superclass.constructor.call(this, {
    id: 0,
    name: '' // название
  }, values);
}

utils.extend(Carib.Order.Data.NumberCategory, Carib.Order.Data.Record);


/**
 * Placing category
 */
Carib.Order.Data.PlacingCategory = function(values) {
  Carib.Order.Data.PlacingCategory.superclass.constructor.call(this, {
    id: 0,
    name: '' // название
  }, values);
}

utils.extend(Carib.Order.Data.PlacingCategory, Carib.Order.Data.Record);


/**
 * Food type
 */
Carib.Order.Data.FoodType = function(values) {
  Carib.Order.Data.FoodType.superclass.constructor.call(this, {
    id: 0,
    name: '' // название
  }, values);
}

utils.extend(Carib.Order.Data.FoodType, Carib.Order.Data.Record);


/**
 * Tourist
 */
Carib.Order.Data.Tourist = function(values) {
  Carib.Order.Data.Tourist.superclass.constructor.call(this, {
    surname: '', // фамилия
    name: '', // имя
    birthday: new Date(), // дата рождения
    sex: 'М', // пол
    passport_number: '', // номер паспорта
    passport_date: new Date(), // дата выдачи
    passport_hand: '', // кем выдан
    has_child: false, // наличие ребенка
    child_age: 0, // возраст ребенка
    visa: 'да', // наличие визы
    insurance: 'да', // наличие страховки
    additional_info: '' // дополнительная информация 
  }, values);
}

utils.extend(Carib.Order.Data.Tourist, Carib.Order.Data.Record);


/**
 * Order
 * 
 * @param {Object} values
 */
Carib.Order.Data.Order = function(values) {
  Carib.Order.Data.Order.superclass.constructor.call(this, {
    residence: new Carib.Order.Data.Residence(), // проживание
    airfare: '', // авиаперелеты
    guide: '', // гид переводчик
    language: '', // язык
    comment: '' // коментарий
  }, values);
}

utils.extend(Carib.Order.Data.Order, Carib.Order.Data.Record, {
  importValues: function(values) {
    Carib.Order.Data.Order.superclass.importValues.call(this, values);
    if(values.residence) {
      this.data.residence = new Carib.Order.Data.Residence();
      this.data.residence.importValues(values.residence.data);
    }
  },
  
  isTourDefined: function() {
    return this.data.residence.data.tour_id != 0;
  }
});
