var SelectedTable=null;
var SelectedMVC=null;
var SelectedModel=null;


/*
* STRING BUFFER
*/
//simple class to add strings in much effectivier way than standart += operator
function StringBuffer(){
	this.__buffer = [];
}
//method add() is chainable
StringBuffer.prototype.add = function(s){
	this.__buffer.push(s);
	return this;
};
StringBuffer.prototype.join = function(){
	return this.__buffer.join('');
};




$(document).ready(function(){

	
	$("#example").accordion();
	$("#details > ul").tabs();
	$("#main > ul").tabs();
	$("#tables li").bind("click",tables_li_click);
	$("#mvc a").bind("click",mvc_a_click);
	$("#tables li:first").click();
	$("#main a:first").click();
	$("#bake").bind("click",bake);
	$("#generalSave").bind("change",generalSaveChange);


});

function generalSaveChange()
{
	var saveHandler,params;
	params = [];
	saveHandler =$(this).val(); 
	
	if(saveHandler == "")
	{
	 	$('#saveTab').html('<table><tr><td>Saving disabled</td></tr></table>');
	}
	else
	{
		$('#saveTab').html('');
		params.push({name:'data[general][save]:',value:saveHandler});
		$.post("/aydcodegen/save_handler_tab/",params,updateSaveHandlerTab);
	}
}

function updateSaveHandlerTab(data,status)
{

 $('#saveTab').html(data);
}

function show_assoc_details()
{
	return true;
	if($(this).attr("checked"))
	{
		//$("body").css({ opacity: 0.5});
		$("body").append('<div id="dialog"><h1>Dialog box</h1></div>');
		var top,left,bwidth,bheight,hwidth,hheight;
		
		bwidth = $("body").width();
		bheight = $("body").height();
		hwidth= 300;
		hheight=200;
		
		top =  (bheight - hheight)/2;
		left = (bwidth - hwidth)/2;
		
		$("#dialog").css({position:"absolute",top:top,left:left,width:hwidth,height:hheight,backgroundColor:"red"});
		$("#dialog h1").bind("click",function(){ $(this).parent().remove()});
	}
	else
	{
		$("#dialog").remove();
		//$("body").css({ opacity: 1});
	}
	
}


function bake()
{

	if(SelectedMVC=="model")
	{
		model();
	}
	else if(SelectedMVC=="controller")
	{
		controller();
	}
	else if(SelectedMVC=="view")
	{
		view();
	}
}

function mvc_a_click()
{
	SelectedMVC = $(this).attr("id");
	properties();
}


// handle table click (change working table)
function tables_li_click()
{
	//set main variable table and model with wich we working now
	SelectedTable = $(this).attr("table");
	SelectedModel = $(this).attr("model");
	
	//highligth selected table on list
	$("#tables li").removeClass("selected_table");
	$(this).addClass("selected_table");
	
	//make properties window
 	properties();
}


// show proper properties window
function properties()
{
	var html;
	
	html = "Properties for <i> "+SelectedMVC+" </i> - <b> "+SelectedTable+"</b>";
	
	if(SelectedMVC=="model")
	{
		html +=properties_model();
	}
	else if(SelectedMVC=="controller")
	{
		html +=properties_controller();
	}
	else if(SelectedMVC=="view")
	{
		html +=properties_view();
	}
	
	
	$("#properties").html(html);
	$("#add_assoc").click(addAssociation);
	$(".assoc").bind("click",show_assoc_details);
	
}

function properties_model()
{
	var prop;
	prop = new StringBuffer();
	
	//building main table
	prop.add('<table>');
	prop.add('<tr><th colspan="2">Main</th></tr>');
	prop.add('<tr><td>Name</td><td><input type="text" id="properties_name" value="'+SelectedModel+'"/></td></tr>');
	prop.add('<tr><td>Primary key</td><td><input type="text" id="properties_primary_key" value="id"/></td></tr>');
	prop.add('<tr><td>useDbConfig</td><td><input type="text" id="properties_use_db_config" value="default"/></td></tr>');
	prop.add('<tr><td>useTable</td><td><input type="text" id="properties_use_table" value="'+SelectedTable+'"/></td></tr>');
	prop.add('</table>');
	
		
	// building validations table
	prop.add('<table>');
	prop.add('<thead><tr><th colspan="2">Validations</th></tr></thead>');
	
	//walk trought model's fields 
	for(field in modelFields[SelectedTable])
	{
		// id,created,modified are hanlde automatic by cake
		// FIXME - 'id' should be primary key 
		if(field!='id' && field!='created' && field!='modified')
		{
			prop.add('<tr><td>'+field+'</td><td><select class="validations" id="validation_for_'+SelectedTable+'_'+field+'" field="'+field+'"><option value=""></option><option value="VALID_NOT_EMPTY">VALID_NOT_EMPTY</option><option value="VALID_EMAIL">VALID_EMAIL</option><option value="VALID_NUMBER">VALID_NUMBER</option><option value="VALID_YEAR">VALID_YEAR</option></select></td></tr>');
		}
	}
	prop.add('</table>');
	
	//building assoc table not used yet
	
	var assoc;
    assoc = __preperAssocTable(SelectedTable);
	prop.add('<table id="model_assoc">');
	
	prop.add('<tr><th colspan="5">Associations</th></tr>');
	prop.add('<tr><th colspan="3">'+__assocSelect(assoc)+'</th><th colspan="2"><input type="button" value="add" id="add_assoc"/></th></tr>');
	prop.add('<tr><th> HO</th><th >HM</th><th >BT</th><th >HABTM</th><th>Class</th></tr>');
		    

	
	for(alias in assoc)
	{
		//HO
		chk='';
		if(assoc[alias]['hasOne']!=undefined)
		{
			chk = 'checked="checked"';
		}
		prop.add('<tr><td><input type="checkbox" class="assoc" name="data[associations]['+alias+'][hasOne]" '+chk+' /></td>');
		
		//HM
		chk='';
		if(assoc[alias]['hasMany']!=undefined)
		{
			chk = 'checked="checked"';
		}
		prop.add('<td><input type="checkbox" class="assoc" name="data[associations]['+alias+'][hasMany]" '+chk+' /></td>');
		
		//BT
		chk='';
		if(assoc[alias]['belongsTo']!=undefined)
		{
			chk = 'checked="checked"';
		}
		prop.add('<td><input type="checkbox" class="assoc" name="data[associations]['+alias+'][belongsTo]" '+chk+' /></td>');
		
		//HABTM
		chk='';
		if(assoc[alias]['hasAndBelongsToMany']!=undefined)
		{
			chk = 'checked="checked"';
		}
		prop.add('<td><input type="checkbox" class="assoc" name="data[associations]['+alias+'][hasAndBelongsToMany]" '+chk+' /></td>');
		//Alias
		prop.add('<td>'+alias+'</td></tr>');
	}
	
	prop.add('</table>');
	
	return prop.join();
}

// makes select with model's names that was not added by automatic assosiations 
function __assocSelect(defAssoc)
{
	var sel,tmodel,i;
	sel = new StringBuffer();
	
	sel.add('<select id="more_assoc">');
	for(i in modelNames)
	{
		tmodel = modelNames[i];
		if(defAssoc[tmodel]==undefined)
		{
			sel.add('<option value="'+tmodel+'">'+tmodel+'</option>');
		}
	}
		
	sel.add('</select>');
	
	return sel.join();
}
// makes array for easy build UI table (assoc[MODEL_NAME][belongsTo] means table belongsTo MODEL_NAME)
function __preperAssocTable(table)
{
	var assoc;
	assoc = [];
	for(assocType in associations[table])
	{
			
			for(tmodel in associations[table][assocType])
			{
				alias  = associations[table][assocType][tmodel]['alias'];
				if(assoc[alias] == undefined)
				{
					assoc[alias]=[];
				}
				
				assoc[alias][assocType]=1;
			}
		
	} 
	
	return assoc;
}

// add additional associations row
// remove add model from select with additional models
function addAssociation()
{
	var alias;
	alias = $("#more_assoc").val();
	if(alias!=null)
	{
		$('#model_assoc').append('<tr><td><input type="checkbox" class="assoc" name="data[associations]['+alias+'][hasOne]"/></td><td><input type="checkbox" class="assoc" name="data[associations]['+alias+'][hasMany]"/></td><td><input type="checkbox" class="assoc" name="data[associations]['+alias+'][belongsTo]"/></td><td><input type="checkbox"  class="assoc" name="data[associations]['+alias+'][hasAndBelongsToMany]"/></td><td>'+alias+'</td></tr>');
		$("#more_assoc").find(':selected').remove();
		$(".assoc").bind("click",show_assoc_details);
	}
}


function properties_controller()
{
	var prop;
	prop = new StringBuffer();
	
	prop.add('<table>');
	prop.add('<tr><td>Scaffold</td><td><input type="checkbox" id="properties_scaffold"/></td></tr>');
	prop.add('<tr><td>Admin</td><td><input type="checkbox" id="properties_admin"/></td></tr>');
	prop.add('</table>');
  
  return prop.join();
}

function properties_view()
{
	var html;
  	html = '<table>';
  	html += '<tr><td>View</td><td><select id="properties_view"><option value="index">index</option><option value="add">add</option><option value="edit">edit</option><option value="view">view</option></select></td></tr>';
  	html += '</table>';

	return html;
}

/*
* Check for #generalSave value 
* return : array of paramters in cake post format 
*/
function getSaveParams()
{
	var params,save;
	params = [];
	if( (save=$('#generalSave').val())!="")
	{
		params.push({name:'data[general][save]',value:save});
		$('.'+save+'_tab').each(function(i,r)
							{
								params.push({name:r.name,value:$(r).val()});
							});
	}
	
	return params;
}

//handle model baking
function model()
{

	var params;
	params = [];
	
	params = params.concat(getSaveParams());
	
	params.push({name:'data[general][task]',value:$('#generalTask').val()});
	
	params.push({name:'data[properties][table]',value:SelectedTable});

	if($("#properties_name").val()!=SelectedModel)
    {
   		params.push({name:'data[properties][name]',value:$("#properties_name").val()});   		
    }
    
    if($("#properties_use_table").val()!=SelectedTable)
    {
   		params.push({name:'data[properties][use_table]',value:$("#properties_use_table").val()});
    }
    
    if($("#properties_use_db_config").val()!="default")
    {
   		params.push({name:'data[properties][use_db_config]',value:$("#properties_use_db_config").val()});
    }
    
    if($("#properties_primary_key").val()!="id")
    {
   		params.push({name:'data[properties][primary_key]',value:$("#properties_primary_key").val()});
    }
    
    $(".validations").each(function(i,sel)
    {
    	var val,field;
    	val =$(sel).val();
    	if(val!="")
    	{
    		field = $(sel).attr('field');
    		params.push({name: 'data[validations]['+field+']', value: val});
    	}
    });
    
    $(".assoc").each(function(i,sel)
    {
     	if($(sel).attr("checked"))
     	{
     		params.push({name: $(sel).attr("name"), value: true});
     	}
    });
    
    $.post("/aydcodegen/model/",params,response);
}

//handle controller baking
function controller()
{
	var params;
	params = [];
	
	params = params.concat(getSaveParams());
	params.push({name:'data[general][task]',value:$('#generalTask').val()});
	params.push({name:'data[properties][table]:',value:SelectedTable});
	    
	if($("#properties_admin").attr("checked"))
	{
   		params.push({name:'data[properties][admin]',value:"admin"});
	}
   
      
	if($("#properties_scaffold").attr("checked"))
	{
   		params.push({name:'data[properties][scaffold]',value:"scaffold"});
    }
    
	$.post("/aydcodegen/controller",params,response);
}

//handle view baking
function view()
{
	var params;
	params = [];
	params = params.concat(getSaveParams());
	params.push({name:'data[general][task]',value:$('#generalTask').val()});
	params.push({name:'data[properties][table]:',value:SelectedTable});
	params.push({name:'data[properties][view]:',value:$('#properties_view').val()});
		
	$.post("/aydcodegen/view",params,response);
	
}




function response(data,status)
{
	
	try
	{
		var myObject = eval('(' + data + ')');
		data = myObject;
		//all good we have json object
	}
	catch(Exception)
	{
		//something goes wrong 
		// replace new line from debug
		data = data.replace(/\n/g,"<br/>");
		data = data.replace(/\r/g," ");
	
		// turn error string output to json  
		var myJSONtext =' {"data":"'+data+'"}';
		var myObject = eval('(' + myJSONtext + ')');
		data = myObject['data'];
	}

	if(data['content'] == undefined)
	{
		// there was an error show all object
	 	$('#response_'+SelectedMVC).val(data);
	}
	else
	{
		//seems ok show content only
		$('#response_'+SelectedMVC).val(data['content']);
	}

}