//package hussam.wireless.thikr;  //MIDlets probably should not
//be countained in a package!!!

/** Tasbeeh Program
 *
 *
 *@author Hussam Al-Mulhim حسام الملحم
 *@version 1.8
 */

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;
import java.util.*;


public class Tasbeeh extends MIDlet implements CommandListener{
	RecordStore store;
	Vector tasbeeh;
	Canvas canvas;
	Form addForm;
	AboutForm aboutForm;
	List changeFontList;
	DeleteForm deleteForm;
	Display display;
	Thikr thikr;
	final int BASE=49;
	Command about;
	Command exit;
	Command restart;
	Command back;
	Command delete;
	Command add;
	Command restore;
	Command changeFont;
	Font font;
	static final String PROGRAM_NAME="Tasbeeh";
	static final String VERSION="1.8";
	static final String CODE="UTF-16";
	boolean loaded;

	public Tasbeeh(){
		loaded=false;
		System.out.println("Constructor()");
	}
	public void startApp(){
		if(!loaded)load();
		aboutForm=new AboutForm();
		display = Display.getDisplay(this);
		font=Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_SMALL);
		canvas=new Canvas(){
			Thikr thikr;
			public void paint(Graphics g){
				g.setFont(font);
				g.setColor(0,0,0);
				g.fillRect(0,0,canvas.getWidth(),canvas.getHeight());
				g.setColor(250,250,250);
				Thikr t;
				int i;
				final int rowHeight=font.getHeight();
				for(i=0;i<tasbeeh.size();i++){
					t=((Thikr)tasbeeh.elementAt(i));
			//		g.drawString((i+1)+" "+t.thikrName()+":"+t.getCount(), 0,i*20, Graphics.TOP|Graphics.RIGHT);
					g.drawString(""+(i+1), 0,i*rowHeight, 0);
			        g.drawString(" "+t.thikrName(), 10,i*rowHeight, 0);
			        g.drawString(":", 55,i*rowHeight, 0);
			        g.drawString(""+t.getCount(), 100,i*rowHeight, 0);
				}
				if(thikr!=null)g.drawString(thikr.sentence(), 0,i*rowHeight, 0);

			}
			protected void keyPressed(int keyCode){
				int key=keyCode-BASE;

				try{
					thikr=(Thikr)tasbeeh.elementAt(key);
					thikr.increment();

				}catch(ArrayIndexOutOfBoundsException e){

				}
				repaint();

			}
		};
		//These two methods are for mobiles having MIDP2
//		canvas.setTicker(new Ticker("سبح الله واحفظ عدد ما سبحت بالضغط على الأرقام."));
//		canvas.setTitle("المسبح");

		exit=new Command("خروج", Command.EXIT, 1);
		about=new Command("مساعدة", Command.HELP, 1);
		back=new Command("رجوع", Command.BACK, 1);
		add=new Command("إضافة ذكر",Command.ITEM, 2);
		delete=new Command("مسح ذكر" ,Command.ITEM, 5);
		restore=new Command("استعادة ضبط البرنامج",Command.ITEM, 10);
		changeFont=new Command("تغيير حجم الخظ", Command.ITEM, 1);
		restart=new Command("إعادة", Command.OK, 1);
		canvas.addCommand(exit);
		canvas.addCommand(restart);
		canvas.addCommand(about);
		canvas.addCommand(add);
		canvas.addCommand(delete);
		canvas.addCommand(restore);
		canvas.addCommand(changeFont);
		aboutForm.addCommand(back);
		display.setCurrent(canvas);
		canvas.setCommandListener(this);
		aboutForm.setCommandListener(this);

		addForm=new AddForm();
		deleteForm=new DeleteForm();
		changeFontList=new ChangeFontList();

	}
	void setFont(int value012){
		switch(value012){
				case 0:font=Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_SMALL);
				break;
				case 1:font=Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
				break;
				case 2:font=Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE);
				break;
		}
	}
    public void pauseApp () {
    	System.out.println("Pausing..");
	  	save();
	  	notifyPaused();
	}
	public void load(){
		try{
			store=RecordStore.openRecordStore(PROGRAM_NAME, true);

		}catch(RecordStoreException e){
			e.printStackTrace();
		}
		tasbeeh=new Vector();
		try{
			RecordEnumeration enm=store.enumerateRecords(null,null,true);
			byte[]b=null;
			while(enm.hasNextElement()){
				b=enm.nextRecord();
				String dat=new String(b,CODE);
				System.out.println(dat);

				String sentence=dat.substring(0, dat.indexOf((int)'>'));
				dat=dat.substring(dat.indexOf((int)'>')+1,dat.length());
				System.out.println(sentence);

				String thikrName=dat.substring(0, dat.indexOf((int)'>'));
				dat=dat.substring(dat.indexOf((int)'>')+1,dat.length());
				System.out.println(thikrName);

				String s=dat.substring(0, dat.indexOf((int)'>'));
				dat=dat.substring(dat.indexOf((int)'>')+1,dat.length());
				System.out.println(s);
				int size=Integer.parseInt(s);

				String c=dat;//.substring(0, dat.indexOf((int)'>'));
				int count=Integer.parseInt(c);
				tasbeeh.addElement(new Thikr(thikrName,sentence,size, count));
			}
			store.closeRecordStore();
			loaded=true;
		}catch(Exception e){
			e.printStackTrace();
			loaded=false;
		}//*/
		finally{
			try{
				store.closeRecordStore();
			}catch(RecordStoreException e){
			//	e.printStackTrace();
			}
		}


		if(!loaded){
			loadDefault();
		}


	}
	public void loadDefault(){
		tasbeeh.removeAllElements();
		tasbeeh.addElement(new Thikr("تسبيح","سبحان الله", 100, 0));
		tasbeeh.addElement(new Thikr("تحميد", "الحمدلله",  100, 0));
		tasbeeh.addElement(new Thikr( "تكبير", "الله أكبر",   100, 0));
		loaded=true;
	}
	public void save(){
		try{

			RecordStore.deleteRecordStore(PROGRAM_NAME);
			store=RecordStore.openRecordStore(PROGRAM_NAME, true);
		}catch(RecordStoreException e){
			e.printStackTrace();
		}
		for(int i=tasbeeh.size()-1;i>=0;i--){
			try{
				store.addRecord(((Thikr)tasbeeh.elementAt(i)).data(),0,((Thikr)tasbeeh.elementAt(i)).data().length);

			}catch(RecordStoreException e){
				e.printStackTrace();
			}catch(java.io.UnsupportedEncodingException e){
				e.printStackTrace();
			}
		}
		try{
			store.closeRecordStore();
		}catch(RecordStoreException e){
			e.printStackTrace();
		}
	}
	public void destroyApp(boolean unconditional) {
		System.out.println("Distroying");
		save();
		notifyDestroyed();
	}

	public void commandAction(Command c, Displayable s) {

		switch(c.getCommandType()){
	    	case Command.EXIT:destroyApp(true); break;
	    	case Command.HELP:
	    		display.setCurrent(aboutForm);
	    		break;
	    	case Command.OK:
	    		Thikr t;
	    		for(int i=0;i<tasbeeh.size();i++){
	    			t=(Thikr)tasbeeh.elementAt(i);
	    			t.startOver();
	    		}
	    		canvas.repaint();
	    		break;
	    	case Command.BACK:
	    		display.setCurrent(canvas);
	    		break;
			case Command.ITEM:
				if(c==restore){
					loadDefault();
					canvas.repaint();
				}
				else if(c==add){
					display.setCurrent(addForm);
				}
				else if(c==delete){
					deleteForm.update();
					display.setCurrent(deleteForm);
				}else if(c==changeFont){
					display.setCurrent(changeFontList);
				}
				break;


	    }


	}
//*/
	class AboutForm extends Form {
		AboutForm(){
			super("حول البرنامج");
			append("برنامج المسبح\n");
			append("تطوير حسام الملحم");
			append("\n");
			append("الإصدار");
			append(VERSION);
			append("\n");
			append("جوال 0504812912");
			append("\n");
			append("http://faculty.kfupm.edu.sa/MISAC/Hussam/");
			append("\n");
			append("مع الشكر والتقدير للفريق العربي للبرمجة");
			append("\n");
			append("www.arabteam2000.com");
			append("\n");
			append(" لإصدارات جديدة أو برامج جديدة توجه إلى الصفحات السابقة.");
		}
	}
	class ChangeFontList extends List implements CommandListener{
		Command ok;
		ChangeFontList(){
			super("حجم الخط", List.EXCLUSIVE);
			append("صغير",null);
			append("وسط",null);
			append("كبير",null);
			ok=new Command("موافق", Command.OK,1);
			addCommand(ok);
			setCommandListener(this);
		}
		public void commandAction(Command c, Displayable d){
			setFont(getSelectedIndex());
			display.setCurrent(canvas);
		}
	}
	class DeleteForm extends List implements CommandListener{
		Command back;
		Command delete;
		DeleteForm(){
			super("قائمة الأذكار", List.EXCLUSIVE);
			update();
			back=new Command("رجوع", Command.BACK, 1);
			delete=new Command("حذف", Command.OK, 2);
			setCommandListener(this);
			addCommand(back);
			addCommand(delete);

		}
		public void update(){
			while(size()!=0)delete(0);
			for(int i=0;i<tasbeeh.size();i++){
				Thikr thikr=(Thikr)tasbeeh.elementAt(i);
				append(thikr.thikrName(),null);
			}
		}
		public void commandAction(Command c, Displayable d){
			if(c==back){
				display.setCurrent(canvas);
			}
			else if(c==delete){
				tasbeeh.removeElementAt(getSelectedIndex());
				delete(getSelectedIndex());
			}

		}
	}
	class AddForm extends Form implements CommandListener{
		TextField sentence;
		TextField name;
		TextField length;
		Command ok;
		Command back;
		AddForm(){
			super("إضافة ذكر");
			name=new TextField("اسم الذكر", "تهليل",50, TextField.ANY);
			sentence=new TextField("جملة الذكر", "لا إله إلا الله",50, TextField.ANY);
			length=new TextField("عدد التكرار", ""+10,50, TextField.NUMERIC);
			ok=new Command("موافق", Command.OK,1);
			back=new Command("رجوع", Command.BACK,1);
			append(name);
			append(sentence);
			append(length);
			addCommand(ok);
			addCommand(back);
			setCommandListener(this);
		}
		public void commandAction(Command c, Displayable d){
			if(c==back){
				display.setCurrent(canvas);

			}else if(c==ok)
			if(name.getString().trim().length()>0)
				if(sentence.getString().trim().length()>0)
					if(length.getString().trim().length()>0){
						tasbeeh.addElement(new Thikr(name.getString().trim(),
												sentence.getString().trim(),
												Integer.parseInt(length.getString().trim()),
												0));
						display.setCurrent(canvas);
					}
		}
	}

}



class Thikr {
	String sentence;
	String thikrName;
	int size;
	int count;

	Thikr(String thikrName, String sentence, int size, int start){
		this.thikrName=thikrName;
		this.sentence=sentence;
		this.size=size;
		count=start;
	}
	public void startOver(){
		count=0;
	}
	public String sentence(){
		return sentence;
	}
	public String thikrName(){
		return thikrName;
	}
	public int size(){
		return size;
	}
	public void increment(){
		count++;
		if(count>=size)count=size;
	}
	public boolean finished(){
		return (count==size);
	}
	public void increment(int amount){
		count+=amount;
		if(count>=size)count=size;
	}
	public void setCounter(int amount){
		count=amount;
	}
	public int getCount(){
		return count;
	}
	byte[] data()throws java.io.UnsupportedEncodingException{
		int position=0;
		byte[]b=null;
		String dat=sentence+'>'+thikrName+'>'+size+'>'+getCount();
		b=dat.getBytes(Tasbeeh.CODE);

		return b;
	}
}
