#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <FL/Fl.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Scrollbar.H>
#include <FL/Fl_Scroll.H>
#include <FL/Fl_Output.H>
#include <FL/Fl_Input.H>
#include <FL/Fl_Float_Input.H>
#include <FL/Fl_Int_Input.H>
#include <FL/Fl_Secret_Input.H>
#include <FL/Fl_Multiline_Input.H>
#include <FL/Fl_Box.H>

#include "comp.h"
#include "recoup.h"
#include "comp-series.h"

Fl_Double_Window *win = 0;
Fl_Group         *main_area = 0;
Fl_Output        *out = 0;
Fl_Scrollbar     *scrollbar_H = 0;
Fl_Scrollbar     *scrollbar_V = 0;

Fl_Input *titleinput=(Fl_Input *)1;
Fl_Input *input[28];
Fl_Input *shares[8];
Fl_Input *price[8];
Fl_Input *tiers[9];

Fl_Input *recouploss[3];
Fl_Input *compseries[3];

Fl_Input *output[74];
Fl_Input *ticker[8];
Fl_Input *filename1=(Fl_Input *)1;

Fl_Button *d = 0;
Fl_Button *c = 0;
Fl_Button *b = 0;
Fl_Button *e = 0;
Fl_Button *f = 0;
Fl_Button *g = 0;
Fl_Button *h = 0;

//Fl_Input_::static_value ()
Fl_Box *title1 = 0;
Fl_Box *title2 = 0;
Fl_Box *title3 = 0;
Fl_Box *title4 = 0;
Fl_Box *title5 = 0;
Fl_Box *title6 = 0;
Fl_Box *title7 = 0;
Fl_Box *title8 = 0;
Fl_Box *blank1 = 0;
Fl_Box *blank2 = 0;

int X = 0;
int Y = 0;
int test1;
double numarray[50];
char varstring[50];
char title[1024] = "lscomp";


void button1_cb(Fl_Widget *,void *) {
        numarray[0] = atof(input[0]->value());
        numarray[1] = atof(input[1]->value());
        numarray[2] = atof(input[2]->value());
        numarray[3] = comp(numarray[0], numarray[1], numarray[2]);
        test1 = sprintf(varstring, "%.05lf", numarray[3]);
        output[0]->value( varstring );
	win->redraw();
}


double tiers_func(double price1, double shares1, double change)
{
        double tiers;
        tiers=((shares1*price1)+change)/shares1;
        return tiers;
}


void button2_cb(Fl_Widget *,void *) {

	int counter1=0;
	int counter2=0;
	int counter3=0;
	int counter4;
	int counter5=1;
	int rownumber;

	for(rownumber=1; rownumber<9; rownumber++)
        {	//8 rows
		
		for(counter4=1; counter4<10; counter4++)
		{	//9 times
	                numarray[4] = atof(price[counter2]->value()); //price
	                numarray[5] = atof(shares[counter3]->value()); //shares
        	        numarray[6] = atof(tiers[counter1]->value()); //tier
                	numarray[7] = tiers_func( numarray[4] , numarray[5] , numarray[6] );
                	counter1++;
                	test1 = sprintf(varstring, "%.05lf", numarray[7]);
                	output[counter5]->value(varstring);
			counter5++;
		}
		counter1=0;
		counter3++;
		counter2++;
	}
			

win->redraw();

}


void button3_cb(Fl_Widget *,void *) {
        win->label(titleinput->value());
	win->redraw();
}



void loadfile () {
	FILE* fp1;
	char linestring[100];
	int linenum=0;
	int i;
        const char *token;
        const char *line;
        const char *search = " ";

	//FILE* fp2;
	//filename1->value()
	//printf("save.\n");
        if( ( fp1 = fopen( filename1->value(), "r" ) ) == NULL ) {
                fprintf( stderr, "Error opening %s\n", filename1->value() );
		return;
                //exit( 1 );
        }
        while( fgets(linestring, sizeof(linestring), fp1) != NULL)
        {
		if(linenum == 0){
			token = strtok(linestring, search);
			for(i=0; i<9; i++){
				//token = strtok(NULL, search);
				tiers[i]->value(token);
				token = strtok(NULL, search);
				//printf("%s\n", token);
			}
			//i=0;
		}else{
			token = strtok(linestring, search);
			//for(i=0; i<3; i++){
				//i=0;
				//token = strtok(NULL, search);
				ticker[linenum-1]->value(token);
				token = strtok(NULL, search);
				shares[linenum-1]->value(token);
				token = strtok(NULL, search);
				price[linenum-1]->value(token);
			//}

		}

		linenum++;

	}
	fclose(fp1);

	return;

}

void savefile () {
	int count1;
        FILE* fp1;
        //FILE* fp2;
	//filename1->value()
	//char temp[100];
	//strcpy(filelocation, filename1->value());
	if (fp1 = fopen(filename1->value(), "w")){
		for (count1 = 0; count1 < 9; count1++){
			fprintf(fp1, "%s ", tiers[count1]->value() );
		}
		fprintf(fp1, "\n");
                for (count1 = 0; count1 < 8; count1++){
                        fprintf(fp1, "%s ", ticker[count1]->value() );
			fprintf(fp1, "%s ", shares[count1]->value() );
			fprintf(fp1, "%s ", price[count1]->value() );
			fprintf(fp1, "\n");
                }




	}
	
	fclose( fp1 );
	return;
}


void button4_cb(Fl_Widget *,void *) {
	savefile();        
        win->redraw();
}


void button5_cb(Fl_Widget *,void *) {
        loadfile();
        win->redraw();
}


void button6_cb(Fl_Widget *,void *) {
	numarray[0] = atof(recouploss[0]->value());
	numarray[1] = recoup(numarray[0]);
	test1 = sprintf(varstring, "%.05lf", numarray[1]);
        recouploss[1]->value(varstring);
        win->redraw();          
}


void button7_cb(Fl_Widget *,void *) {
	numarray[0] = atof(compseries[0]->value());
	strcpy(varstring, compseries[1]->value());
	numarray[1] = compseriesfunc(numarray[0], varstring);
	test1 = sprintf(varstring, "%.05lf", numarray[1]);
	compseries[2]->value(varstring);
	win->redraw();
}


void Scrollbar_CB(Fl_Widget*, void *) {
	int counter1;
	int counter2;
	int counter3;
	int modulo1;
	int i, x, y;
	X=scrollbar_H->value();
	Y=scrollbar_V->value();

	//main_area->resize(0-X, 0-Y, 1025, 775);
	//main_area->position(0-X, 0-Y);
	

	titleinput->resize(400-X,25-Y,200,25);
	filename1->resize(5-X, 945-Y, 230, 25);
	d->resize(500-X,50-Y,100,25);
	e->resize(5-X,900-Y,115,25);
	f->resize(130-X,900-Y,115,25);

	title1->resize(1-X,1-Y,400,50);
	title2->resize(1-X,51-Y,50,105);
	title3->resize(1-X, 156-Y, 50, 105);
	title4->resize(1-X, 261-Y, 600, 50);
	title5->resize(1-X, 311-Y, 100, 105);
	title6->resize(255-X, 385-Y, 760, 61);
	title7->resize(600-X, 0-Y, 400, 50);
	title8->resize(600-X, 120-Y, 400, 50);
	blank1->resize(1150+X, 1100+Y , 1, 1);
	//blank2->resize(1100+X, 850+Y , 1, 1);

	ticker[0]->resize(5-X, 471-Y, 60, 25);
        ticker[1]->resize(5-X, 526-Y, 60, 25);
        ticker[2]->resize(5-X, 581-Y, 60, 25);
        ticker[3]->resize(5-X, 636-Y, 60, 25);
        ticker[4]->resize(5-X, 691-Y, 60, 25);
        ticker[5]->resize(5-X, 746-Y, 60, 25);
        ticker[6]->resize(5-X, 801-Y, 60, 25);
        ticker[7]->resize(5-X, 856-Y, 60, 25);

	recouploss[0]->resize(700-X, 50-Y, 150, 25);
	recouploss[1]->resize(700-X, 85-Y, 150, 25);
	g->resize(900-X,85-Y,115,25);

	compseries[0]->resize(600-X, 190-Y, 150, 25);
	compseries[1]->resize(750-X, 190-Y, 250, 35);
	compseries[2]->resize(600-X, 235-Y, 150, 25);
	h->resize(800-X,235-Y,115,25);

	b->resize(400-X,200-Y,155,25);
	input[0]->resize(210-X, 60-Y, 150, 25);
	input[1]->resize(210-X, 95-Y, 150, 25);
	input[2]->resize(210-X, 130-Y, 150, 25);

	x=255;
	y=355;
	for(i=0; i<9; i++)
	{
		tiers[i]->resize(x-X, y-Y, 80, 25);
		x+=85;
	}


	output[0]->resize(210-X, 200-Y, 155, 25);

	x=70;
	y=471;
	for(i=0; i<8; i++)
	{
		shares[i]->resize(x-X, y-Y, 80, 25);
		y += 55;
	}

	x=155;
        y=471;
        for(i=0; i<8; i++)
        {
                price[i]->resize(x-X, y-Y, 80, 25);
                y += 55;
        
        
        }


        y=471;
        counter3=1;
        for(counter1=1; counter1<9; counter1++)
        {       //do all 8 rows  
                x=255;
                for(counter2=1; counter2<10; counter2++)
                {       //do 9 per row
                        
                        output[counter3]->resize(x-X, y-Y, 80, 25);
                        //main_area->add(output[counter3]);
                        x+=85;
                        counter3++;
                }
                y+=55;
         
        }


	c->resize(500-X,900-Y,155,25);

	
	//main_area->resize(X, Y, 775, 775); 

	//main_area->redraw();
	win->redraw();
	//scrollbar_H->redraw();
	//scrollbar_V->redraw();
}


int main(int argc, char **argv) {

	win = new Fl_Double_Window(1050,1000,title);
        int x = 160;
        int y = 10;
	int i;
	int counter1;
	int counter2;
        int counter3;
	int modulo1;

	main_area = new Fl_Group(0, 0, 1025, 975); 
	main_area->begin();
        
	titleinput = new Fl_Input(400, 25, 200, 25, "window title:");
	titleinput->align(FL_ALIGN_TOP);
	titleinput->value("lscomp");
	titleinput->box(FL_BORDER_BOX);
	main_area->add(titleinput);

	d = new Fl_Button(500,50,100,25,"Change");
	d->callback(button3_cb);	
	main_area->add(d);

	//This box used to controll/stop resizing of other widgets
	blank1 = new Fl_Box(1150,1100, 1, 1, "");
	blank1->box(FL_BORDER_BOX);
	blank1->hide();
	main_area->add(blank1);
	main_area->resizable(blank1);


	////////////Compounds area/////////////////////////

	title1 = new Fl_Box(1, 1, 400, 50, "Compounds Needed for Goal");
	title1->box(FL_BORDER_BOX);
	main_area->add(title1);

	title2 = new Fl_Box(1, 51, 50, 105, "Input"); //y += 50;
	title2->box(FL_BORDER_BOX);
	main_area->add(title2);


        input[0] = new Fl_Input(210, 60, 150, 25, "Starting Principle:"); //y += 35;
        input[0]->type(1);
        input[0]->value("1000");
        input[0]->box(FL_BORDER_BOX);
	main_area->add(input[0]);
        
        input[1] = new Fl_Input(210, 95, 150, 25, "rate:"); //y += 35;
        input[1]->type(1);
        input[1]->value("1.5");
        input[1]->box(FL_BORDER_BOX);
	//input[1]->textcolor((Fl_Color)4);
	main_area->add(input[1]);

        input[2] = new Fl_Input(210, 130, 150, 25, "ending principle:"); //y += 70;
        input[2]->type(1); 
        input[2]->value("1200");
        input[2]->box(FL_BORDER_BOX);
	main_area->add(input[2]);



	title3 = new Fl_Box(1, 156, 50, 105, "Output");
	title3->box(FL_BORDER_BOX);
	main_area->add(title3);

        output[0] = new Fl_Input(210, 200, 155, 25, "# of times:"); //y += 70;
        output[0]->type(1);
        output[0]->box(FL_BORDER_BOX);
        main_area->add(output[0]);

        b = new Fl_Button(400,200,155,25,"Calculate"); //y += 35;
        b->callback(button1_cb);
	main_area->add(b);


	///////////Tiers Area ///////////////////

	title4 = new Fl_Box(1, 261, 600, 50, "Share Price tiers for $ change");
	title4->box(FL_BORDER_BOX);
	main_area->add(title4);

	title5 = new Fl_Box(1, 311, 100, 105, "Input");
	title5->box(FL_BORDER_BOX);
	main_area->add(title5);

        title6 = new Fl_Box(255, 385, 760, 61, "Output: Prices for $ changes");
        title6->box(FL_BORDER_BOX);
        main_area->add(title6);

        ticker[0] = new Fl_Input(5, 471, 60, 25, "Ticker:");
        ticker[0]->align(FL_ALIGN_TOP);
        ticker[0]->value("#1");
	ticker[0]->textsize(16);
	ticker[0]->textcolor((Fl_Color)4);
        ticker[0]->box(FL_BORDER_BOX);
        main_area->add(ticker[0]);

        ticker[1] = new Fl_Input(5, 526, 60, 25, "Ticker:");
        ticker[1]->align(FL_ALIGN_TOP);
        ticker[1]->value("#2");
        ticker[1]->textsize(16);
	ticker[1]->textcolor((Fl_Color)1);
        ticker[1]->box(FL_BORDER_BOX);
        main_area->add(ticker[1]);

        ticker[2] = new Fl_Input(5, 581, 60, 25, "Ticker:");
        ticker[2]->align(FL_ALIGN_TOP);
        ticker[2]->value("#3");
        ticker[2]->textsize(16);
	ticker[2]->textcolor((Fl_Color)4);
        ticker[2]->box(FL_BORDER_BOX);
        main_area->add(ticker[2]);

        ticker[3] = new Fl_Input(5, 636, 60, 25, "Ticker:");
        ticker[3]->align(FL_ALIGN_TOP);
        ticker[3]->value("#4");
        ticker[3]->textsize(16);
	ticker[3]->textcolor((Fl_Color)1);
        ticker[3]->box(FL_BORDER_BOX);
        main_area->add(ticker[3]);

        ticker[4] = new Fl_Input(5, 691, 60, 25, "Ticker:");
        ticker[4]->align(FL_ALIGN_TOP);
        ticker[4]->value("#5");
        ticker[4]->textsize(16);
	ticker[4]->textcolor((Fl_Color)4);
        ticker[4]->box(FL_BORDER_BOX);
        main_area->add(ticker[4]);

        ticker[5] = new Fl_Input(5, 746, 60, 25, "Ticker:");
        ticker[5]->align(FL_ALIGN_TOP);
        ticker[5]->value("#6");
        ticker[5]->textsize(16);
	ticker[5]->textcolor((Fl_Color)1);
        ticker[5]->box(FL_BORDER_BOX);
        main_area->add(ticker[5]);

        ticker[6] = new Fl_Input(5, 801, 60, 25, "Ticker:");
        ticker[6]->align(FL_ALIGN_TOP);
        ticker[6]->value("#7");
        ticker[6]->textsize(16);
	ticker[6]->textcolor((Fl_Color)4);
        ticker[6]->box(FL_BORDER_BOX);
        main_area->add(ticker[6]);

        ticker[7] = new Fl_Input(5, 856, 60, 25, "Ticker:");
        ticker[7]->align(FL_ALIGN_TOP);
        ticker[7]->value("#8");
        ticker[7]->textsize(16);
	ticker[7]->textcolor((Fl_Color)1);
        ticker[7]->box(FL_BORDER_BOX);
        main_area->add(ticker[7]);


	x=255;
	y=355;	
	counter1=-400;	

	for(i=0; i<9; i++)
	{
        	tiers[i] = new Fl_Input(x, y, 80, 25, "Change:"); //x += 70;
		tiers[i]->align(FL_ALIGN_TOP);
        	tiers[i]->type(1);
		test1 = sprintf(varstring, "%d", counter1 );		
        	tiers[i]->value(varstring);
		counter1+=100;
        	tiers[i]->box(FL_BORDER_BOX);
		main_area->add(tiers[i]);
		x += 85;
	}

        x=70;
        y=471;
        counter1=100;
        
        for(i=0; i<8; i++)
        {
                shares[i] = new Fl_Input(x, y, 80, 25, "Shares:"); //x += 70;
                shares[i]->align(FL_ALIGN_TOP);
                shares[i]->type(1);
                test1 = sprintf(varstring, "%d", counter1 );
                shares[i]->value(varstring);
                counter1+=100;
                tiers[i]->box(FL_BORDER_BOX);
                main_area->add(shares[i]);
                y += 55;
        }

        x=155;
        y=471;
        counter1=10;
        
        for(i=0; i<8; i++)
        {
                price[i] = new Fl_Input(x, y, 80, 25, "Price:"); //x += 70;
                price[i]->align(FL_ALIGN_TOP);
                price[i]->type(1);
                test1 = sprintf(varstring, "%d", counter1 );
                price[i]->value(varstring);
                counter1+=5;
                price[i]->box(FL_BORDER_BOX);
                main_area->add(price[i]);
                y += 55;   
        }

	y=471;
	counter3=1;
	for(counter1=1; counter1<9; counter1++)
	{	//do all 8 rows

		x=255;		
		for(counter2=1; counter2<10; counter2++)
		{	//do 9 per row

        		output[counter3] = new Fl_Input(x, y, 80, 25, ""); //y += 70;
			output[counter3]->align(FL_ALIGN_TOP);
        		output[counter3]->type(1);
        		output[counter3]->box(FL_BORDER_BOX);
        		main_area->add(output[counter3]);
			x+=85;
			counter3++;
		}
		y+=55;

	}



        filename1 = new Fl_Input(5, 945, 230, 25, "filename:");
        filename1->align(FL_ALIGN_TOP);
        filename1->value("save1.txt");
        filename1->box(FL_BORDER_BOX);
        main_area->add(titleinput);



        
        c = new Fl_Button(500,900,155,25,"Calculate");
        c->callback(button2_cb);
	main_area->add(c);

        e = new Fl_Button(5,900,115,25,"Save");
        e->callback(button4_cb);
        main_area->add(e);

        f = new Fl_Button(130,900,115,25,"Load");
        f->callback(button5_cb);
        main_area->add(f);

	//////////Recoup Area////////////

        title7 = new Fl_Box(600, 0, 400, 25, "Recoup");
        title7->box(FL_BORDER_BOX);
        main_area->add(title7);

        recouploss[0] = new Fl_Input(700, 50, 150, 25, "% Loss:");
	recouploss[0]->type(1);
        //recouploss[0]->align(FL_ALIGN_TOP);
        recouploss[0]->value("-10");   
        recouploss[0]->box(FL_BORDER_BOX);
        main_area->add(recouploss[0]);

        recouploss[1] = new Fl_Input(700, 85, 150, 25, "% to Recoup:");
        recouploss[1]->type(1);
        //recouploss[0]->align(FL_ALIGN_TOP);
        //recouploss[1]->value("-10");   
        recouploss[1]->box(FL_BORDER_BOX);   
        main_area->add(recouploss[1]);

        g = new Fl_Button(900,85,115,25,"Calc");
        g->callback(button6_cb);
        main_area->add(g);







	////////Comp Series Area///////////

        title8 = new Fl_Box(600, 120, 400, 50, "Comp series");
        title8->box(FL_BORDER_BOX);
        main_area->add(title8);

	compseries[0] = new Fl_Input(600, 190, 150, 25, "Start Principle:");
	compseries[0]->type(1);
	compseries[0]->align(FL_ALIGN_TOP);
	compseries[0]->value("1000");
	compseries[0]->box(FL_BORDER_BOX);
	main_area->add(compseries[0]);


	compseries[1] = new Fl_Multiline_Input(750,190,250,35,"Rates:");
	compseries[1]->align(FL_ALIGN_TOP);
	//compseries[1]->tooltip("Input field for short text with newlines (Alt-M)");
	compseries[1]->wrap(1);
	main_area->add(compseries[1]);

        compseries[2] = new Fl_Input(600, 235, 150, 25, "End Principle:");
        compseries[2]->type(1);
	compseries[2]->align(FL_ALIGN_TOP);
        //compseries[2]->value("");
        compseries[2]->box(FL_BORDER_BOX);
        main_area->add(compseries[2]);

        h = new Fl_Button(800,235,115,25,"Calc");
        h->callback(button7_cb);
        main_area->add(h);




	main_area->end();

        // Create Horizontal scrollbar
        scrollbar_H = new Fl_Scrollbar(0,975,1050,25,"");
        scrollbar_H->type(FL_HORIZONTAL);
        scrollbar_H->slider_size(.5);              // the fractional size of the scrollbar's tab, 1/2 scollbar's size
        scrollbar_H->bounds(0,1050);              // min/max value of the slider's positions
        ((Fl_Valuator*)scrollbar_H)->value(0.0); // the initial value (in fltk1.3+ you can use scrollbar->value(150);
        scrollbar_H->step(10);                     // force step rate to 10 (slider move changes value: 100, 110, 120..)
        scrollbar_H->callback(Scrollbar_CB, (void*)&out);

        // Create Vertical scrollbar    H        W
        scrollbar_V = new Fl_Scrollbar(1025,0,25,975,"");
        scrollbar_V->type(FL_VERTICAL);
        scrollbar_V->slider_size(.5);              // the fractional size of the scrollbar's tab, 1/2 scollbar's size
        scrollbar_V->bounds(0,975);              // min/max value of the slider's positions
        ((Fl_Valuator*)scrollbar_V)->value(0.0); // the initial value (in fltk1.3+ you can use scrollbar->value(150);
        scrollbar_V->step(10);                     // force step rate to 10 (slider move changes value: 100, 110, 120..)
        scrollbar_V->callback(Scrollbar_CB, (void*)&out);


	win->resizable(main_area);

	win->end();
	win->show();
	Scrollbar_CB(0,0);                  // show scrollbar's initial position
	return(Fl::run());
}

