/*
 * Copyright (C) 2005-2006 Kouji Sugisawa. All rights reserved.
 */

package jp.sourceforge.livez.dao;

import java.io.Serializable;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * iモード端末情報を提供します。
 * 
 * @author 杉澤 浩二
 */
public class Imode implements Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * デフォルトコンストラクタです。
	 */
	public Imode() {}

	/**
	 * 機種名を保持します。
	 */
	private String name;

	/**
	 * 機種名を返します。
	 * 
	 * @return 機種名
	 */
	public String getName() {
		return name;
	}

	/**
	 * 機種名を設定します。
	 * 
	 * @param name 機種名
	 */
	public void setName(final String name) {
		this.name = StringUtils.defaultIfEmpty(name, null);
	}

	/**
	 * 製品名を保持します。
	 */
	private String productName;

	/**
	 * 製品名を返します。
	 * 
	 * @return 製品名
	 */
	public String getProductName() {
		return productName;
	}

	/**
	 * 製品名を設定します。
	 * 
	 * @param productName 製品名
	 */
	public void setProductName(final String productName) {
		this.productName = StringUtils.defaultIfEmpty(productName, null);
	}

	/**
	 * シリーズ名を保持します。
	 */
	private String seriesName;

	/**
	 * シリーズ名を返します。
	 * 
	 * @return シリーズ名
	 */
	public String getSeriesName() {
		return seriesName;
	}

	/**
	 * シリーズ名を設定します。
	 * 
	 * @param seriesName シリーズ名
	 */
	public void setSeriesName(final String seriesName) {
		this.seriesName = StringUtils.defaultIfEmpty(seriesName, null);
	}

	/**
	 * i-HTMLバージョンを保持します。
	 */
	private Float html;

	/**
	 * i-HTMLバージョンを返します。
	 * 
	 * @return i-HTMLバージョン
	 */
	public Float getHtml() {
		return html;
	}

	/**
	 * i-HTMLバージョンを設定します。
	 * 
	 * @param html i-HTMLバージョン
	 */
	public void setHtml(final Float html) {
		this.html = html;
	}

	/**
	 * i-XHTMLバージョンを保持します。
	 */
	private Float xhtml;

	/**
	 * i-XHTMLバージョンを返します。
	 * 
	 * @return i-XHTMLバージョン
	 */
	public Float getXhtml() {
		return xhtml;
	}

	/**
	 * i-XHTMLバージョンを設定します。
	 * 
	 * @param xhtml i-XHTMLバージョン
	 */
	public void setXhtml(final Float xhtml) {
		this.xhtml = xhtml;
	}

	/**
	 * ブラウザ文字表示桁数を保持します。
	 */
	private Integer browserColumn;

	/**
	 * ブラウザ文字表示桁数を返します。
	 * 
	 * @return ブラウザ文字表示桁数
	 */
	public Integer getBrowserColumn() {
		return browserColumn;
	}

	/**
	 * ブラウザ文字表示桁数を設定します。
	 * 
	 * @param browserColumn ブラウザ文字表示桁数
	 */
	public void setBrowserColumn(final Integer browserColumn) {
		if (browserColumn == null || browserColumn <= 0)
			this.browserColumn = null;
		else
			this.browserColumn = browserColumn;
	}

	/**
	 * ブラウザ文字表示行数を保持します。
	 */
	private Integer browserRow;

	/**
	 * ブラウザ文字表示行数を返します。
	 * 
	 * @return ブラウザ文字表示行数
	 */
	public Integer getBrowserRow() {
		return browserRow;
	}

	/**
	 * ブラウザ文字表示行数を設定します。
	 * 
	 * @param browserRow ブラウザ文字表示行数
	 */
	public void setBrowserRow(final Integer browserRow) {
		if (browserRow == null || browserRow <= 0)
			this.browserRow = null;
		else
			this.browserRow = browserRow;
	}

	/**
	 * ブラウザの幅(ピクセル単位)で保持します。
	 */
	private Integer browserWidth;

	/**
	 * ブラウザの幅(ピクセル単位)を返します。
	 * 
	 * @return ブラウザの幅(ピクセル単位)
	 */
	public Integer getBrowserWidth() {
		return browserWidth;
	}

	/**
	 * ブラウザの幅(ピクセル単位)を設定します。
	 * 
	 * @param browserWidth ブラウザの幅(ピクセル単位)
	 */
	public void setBrowserWidth(final Integer browserWidth) {
		if (browserWidth == null || browserWidth <= 0)
			this.browserWidth = null;
		else
			this.browserWidth = browserWidth;
	}

	/**
	 * ブラウザの高さ(ピクセル単位)を保持します。
	 */
	private Integer browserHeight;

	/**
	 * ブラウザの高さ(ピクセル単位)を返します。
	 * 
	 * @return ブラウザの高さ(ピクセル単位)
	 */
	public Integer getBrowserHeight() {
		return browserHeight;
	}

	/**
	 * ブラウザの高さ(ピクセル単位)を設定します。
	 * 
	 * @param browserHeight ブラウザの高さ(ピクセル単位)
	 */
	public void setBrowserHeight(final Integer browserHeight) {
		if (browserHeight == null || browserHeight <= 0)
			this.browserHeight = null;
		else
			this.browserHeight = browserHeight;
	}

	/**
	 * 待受け画面の幅(ピクセル単位)を保持します。
	 */
	private Integer screenWidth;

	/**
	 * 待受け画面の幅(ピクセル単位)を返します。
	 * 
	 * @return 待受け画面の幅(ピクセル単位)
	 */
	public Integer getScreenWidth() {
		return screenWidth;
	}

	/**
	 * 待受け画面の幅(ピクセル単位)を設定します。
	 * 
	 * @param screenWidth 待受け画面の幅(ピクセル単位)
	 */
	public void setScreenWidth(final Integer screenWidth) {
		if (screenWidth == null || screenWidth <= 0)
			this.screenWidth = null;
		else
			this.screenWidth = screenWidth;
	}

	/**
	 * 待受け画面の高さ(ピクセル単位)を保持します。
	 */
	private Integer screenHeight;

	/**
	 * 待受け画面の高さ(ピクセル単位)を返します。
	 * 
	 * @return 待受け画面の高さ(ピクセル単位)
	 */
	public Integer getScreenHeight() {
		return screenHeight;
	}

	/**
	 * 待受け画面の高さ(ピクセル単位)を設定します。
	 * 
	 * @param screenHeight 待受け画面の高さ(ピクセル単位)
	 */
	public void setScreenHeight(final Integer screenHeight) {
		if (screenHeight == null || screenHeight <= 0)
			this.screenHeight = null;
		else
			this.screenHeight = screenHeight;
	}

	/**
	 * 白黒画面かどうかを保持します。
	 */
	private boolean monochrome;

	/**
	 * 白黒画面かどうかを返します。
	 * 
	 * @return 白黒画面かどうか
	 */
	public boolean isMonochrome() {
		return monochrome;
	}

	/**
	 * 白黒画面かどうかを設定します。
	 * 
	 * @param monochrome 白黒画面かどうか
	 */
	public void setMonochrome(final boolean monochrome) {
		this.monochrome = monochrome;
	}

	/**
	 * 色数または階調数を保持します。
	 */
	private Integer color;

	/**
	 * 色数または階調数を返します。
	 * 
	 * @return 色数または階調数
	 */
	public Integer getColor() {
		return color;
	}

	/**
	 * 色数または階調数を設定します。
	 * 
	 * @param color 色数または階調数
	 */
	public void setColor(final Integer color) {
		if (color == null || color <= 0)
			this.color = null;
		else
			this.color = color;
	}

	/**
	 * JPEG 画像対応状況を保持します。
	 */
	private boolean jpeg;

	/**
	 * JPEG 画像対応状況を返します。
	 * 
	 * @return JPEG画像対応状況
	 */
	public boolean isJpeg() {
		return jpeg;
	}

	/**
	 * JPEG 画像対応状況を設定します。
	 * 
	 * @param jpeg JPEG画像対応状況
	 */
	public void setJpeg(final boolean jpeg) {
		this.jpeg = jpeg;
	}

	/**
	 * iモーション対応バージョンを保持します。
	 */
	private String imotion;

	public String getImotion() {
		return imotion;
	}

	public void setImotion(final String imotion) {
		this.imotion = imotion;
	}

	/**
	 * PDF対応状況を保持します。
	 */
	private boolean pdf;

	public boolean isPdf() {
		return pdf;
	}

	public void setPdf(final boolean pdf) {
		this.pdf = pdf;
	}

	/**
	 * キャラ電対応状況を保持します。
	 */
	private boolean charaDen;

	public boolean isCharaDen() {
		return charaDen;
	}

	public void setCharaDen(final boolean charaDen) {
		this.charaDen = charaDen;
	}

	/**
	 * トルカ対応状況を保持します。
	 */
	private boolean toruca;

	public boolean isToruca() {
		return toruca;
	}

	public void setToruca(final boolean toruca) {
		this.toruca = toruca;
	}

	/**
	 * iチャネル対応状況を保持します。
	 */
	private boolean ichannel;

	public boolean isIchannel() {
		return ichannel;
	}

	public void setIchannel(final boolean ichannel) {
		this.ichannel = ichannel;
	}

	/**
	 * メニューアイコン対応状況を保持します。
	 */
	private boolean menuIcon;

	public boolean isMenuIcon() {
		return menuIcon;
	}

	public void setMenuIcon(final boolean menuIcon) {
		this.menuIcon = menuIcon;
	}

	/**
	 * バーコード対応バージョンを保持します。
	 */
	private Float barcode;

	public Float getBarcode() {
		return barcode;
	}

	public void setBarcode(final Float barcode) {
		this.barcode = barcode;
	}

	/**
	 * SSL対応状況を返します。
	 */
	private Integer ssl;

	public Integer getSsl() {
		return ssl;
	}

	public void setSsl(final Integer ssl) {
		this.ssl = ssl;
	}

	/**
	 * 背面画面情報を保持します。
	 */
	private ImodeSubscreen subscreen;

	/**
	 * 背面画面情報を返します。
	 * 
	 * @return 背面画面情報
	 */
	public ImodeSubscreen getSubscreen() {
		return subscreen;
	}

	/**
	 * 背面画面情報を設定します。
	 * 
	 * @param subscreen 背面画面情報
	 */
	public void setSubscreen(final ImodeSubscreen subscreen) {
		this.subscreen = subscreen;
	}

	/**
	 * iアプリ情報を保持します。
	 */
	private ImodeIappli iappli;

	/**
	 * iアプリ情報を返します。
	 * 
	 * @return iアプリ情報
	 */
	public ImodeIappli getIappli() {
		return iappli;
	}

	/**
	 * iアプリ情報を設定します。
	 * 
	 * @param iappli iアプリ情報
	 */
	public void setIappli(final ImodeIappli iappli) {
		this.iappli = iappli;
	}

	/**
	 * iモード Flash 情報を保持します。
	 */
	private ImodeFlash flash;

	/**
	 * iモード Flash 情報を返します。
	 * 
	 * @return iモード Flash 情報
	 */
	public ImodeFlash getFlash() {
		return flash;
	}

	/**
	 * iモード Flash 情報を設定します。
	 * 
	 * @param flash iモード Flash 情報
	 */
	public void setFlash(final ImodeFlash flash) {
		this.flash = flash;
	}

	/**
	 * デコメール情報を保持します。
	 */
	private ImodeDecomail decomail;

	public ImodeDecomail getDecomail() {
		return decomail;
	}

	public void setDecomail(final ImodeDecomail decomail) {
		this.decomail = decomail;
	}

	/**
	 * 写真フレーム画像情報のリストを保持します。
	 */
	private List<ImodeFrame> frames;

	/**
	 * 写真フレーム画像情報のリストを返します。
	 * 
	 * @return 写真フレーム画像情報のリスト
	 */
	public List<ImodeFrame> getFrames() {
		return frames;
	}

	/**
	 * 写真フレーム画像情報のリストを設定します。
	 * 
	 * @param frames 写真フレーム画像情報のリスト
	 */
	public void setFrames(final List<ImodeFrame> frames) {
		this.frames = frames;
	}

	@Override
	public int hashCode() {
		return HashCodeBuilder.reflectionHashCode(this);
	}

	@Override
	public boolean equals(final Object obj) {
		return EqualsBuilder.reflectionEquals(this, obj);
	}

	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
	}

}
