var finishing_task_editor_instance_count = 0;
var finishing_task_editor_task_map;
var finishing_task_editor_cache = new Array();
var finishing_task_editor_object = new Object();

var global_instanceName = false;
var global_initData = false;
var global_canEditDetail = false;
var global_showDescription = false;
var global_fte_showTaskNoteColumn = false;
var global_ui_access = false;
var global_showThumbColumn = false;
var global_method_show_as_methodID = false;
var global_enable_public = false;
var global_finishing_editor_has_inited = false;
var global_finising_editor_input_note_tooltip_api = false;
var global_manual_create_task_flag = false;
var FINISHING_TASK_EDTOR_EVENTS = {'LOAD_COATING_METHOD_START':'LOAD_COATING_METHOD_START','LOAD_COATING_METHOD_END':'LOAD_COATING_METHOD_END'};
finishing_task_editor_cache["DEVICE_METHOD_OPTIONS"] = new Array();
finishing_task_editor_cache["PAPER_COATING_OPTIONS"] = new Array();
var finishing_task_editor_task_map = new Array();

function finishing_task_editor_get_data(sameRowObj,methodLevel)
{
	var selTaskObj = $(sameRowObj).parent().parent().find("select")[0];
	var methodListObj = $(sameRowObj).parent().parent().find("select")[1];
	//var optionListObj = $(sameRowObj).parent().parent().find("select")[2];
	var returnData;
	$.each(finishing_task_editor_task_map,function(i){	
		if(i.toLowerCase() == $(selTaskObj).val().toLowerCase())
		{
			returnData = finishing_task_editor_task_map[i];
			return false;
		}
	});
	if(methodLevel)
	{
		methodVal = $(methodListObj).val();
		if (methodVal == null)
			console.log('error!');
		$.each(returnData,function(i){
			if(i.toLowerCase() == methodVal.toLowerCase())
			{
				returnData = returnData[i];
				return false;
			}
		});
	}
	return returnData;
}
function finishing_task_editor_get_data_by_device_methodID(addressName,methodID)
{
	var returnData;
	$.each(finishing_task_editor_task_map,function(i){	
		if(i.toLowerCase() == addressName.toLowerCase())
		{
			returnData = finishing_task_editor_task_map[i];
			return false;
		}
	});
	$.each(returnData,function(i){
		if(i.toLowerCase() == methodID.toLowerCase())
		{
			returnData = returnData[i];
			return false;
		}
	});
	return returnData;
}

function _finishing_task_editor_toggle_table_title(instanceName)
{
	var $editor = $("#" + instanceName);
	if($editor.find("tr").length > 3)
	{
		$editor.find("tr:eq(2)").show();
	}else{
		$editor.find("tr:eq(2)").hide();
	}
		
}

function finishing_task_editor_add_row(instanceName,insertIndex,taskInfo)
{
	if(!taskInfo['device']){
		return;
	}
	var row_ui = '<tr>'+
				'<td nowrap><select onchange="finishing_task_editor_change_task(this)" class="finishing_task_editor_select"></select></td>'+
				'<td><select class="finishing_task_editor_select"></select></td>'+
				'<td><select class="finishing_task_editor_select"><option><option></select></td>';
				if(global_showDescription)
				{
					row_ui += '<td><input class="finishing_task_edit_input"/></td>';
				}

				if(global_fte_showTaskNoteColumn)
				{
					row_ui += '<td></td>';
				}
				if(global_showThumbColumn)
				{
					row_ui += '<td><div></div></td>';
				}
				if(global_canEditDetail)
				{
					row_ui += '<td nowrap><a onclick="javascript:finishing_task_editor_moveTr(this);return false;" value="up"><img width="12" height="12" class="up" src="/img/arrow-up.gif" style="cursor:hand;cursor:pointer;" alt=""></a>&nbsp<a  onclick="javascript:finishing_task_editor_moveTr(this);return false;" value="down"><img width="12" height="12" class="down" src="/img/arrow-down.gif" style="cursor:hand;cursor:pointer;"/></a>&nbsp;<a  onclick="javascript:$(finishing_task_editor_object).trigger(\'deletetask\',$(this).parent().parent().index() - 3);$(this).parent().parent().remove();_finishing_task_editor_toggle_table_title(\''+instanceName+'\');_finishing_task_editor_toggle_arrows(\''+instanceName+'\');return false;"><img width="11" height="13" border="0" src="/img/button-trash.gif" style="cursor:hand;cursor:pointer;"/></a>&nbsp;<a onclick="javascript:popup_edit_finishing_task_detail_dialog($(this).parent().parent(),$($(this).parent().parent()).data(\'taskData\'));return false;"><img width="12" height="13" border="0" src="/img/button-edit.gif" style="cursor:hand;cursor:pointer;"/></a></td>';
				
				}else{
					row_ui += '<td nowrap><a onclick="javascript:finishing_task_editor_moveTr(this);return false;" value="up"><img width="12" height="12" class="up" src="/img/arrow-up.gif" style="cursor:hand;cursor:pointer;" alt=""></a>&nbsp<a  onclick="javascript:finishing_task_editor_moveTr(this);return false;" value="down"><img width="12" height="12" class="down"  src="/img/arrow-down.gif" style="cursor:hand;cursor:pointer;"/></a>&nbsp;<a  onclick="javascript:$(finishing_task_editor_object).trigger(\'deletetask\',$(this).parent().parent().index() - 3);$(this).parent().parent().remove(); _finishing_task_editor_toggle_table_title(\''+instanceName+'\');_finishing_task_editor_toggle_arrows(\''+instanceName+'\');return false;"><img width="11" height="13" border="0" src="/img/button-trash.gif" style="cursor:hand;cursor:pointer;"/></a>&nbsp;</td>';
				
				}

				
				row_ui += '</tr>';

	if(insertIndex == null){
		insertIndex = $("#" + instanceName).find("tr").length - 1;
		
	}

	var afterTrObj = $("#" + instanceName).find("tr").get(insertIndex);
	$(afterTrObj).after(row_ui);
	
	var insertedTr = $("#" + instanceName).find("tr").get(insertIndex + 1);
	
	if(insertIndex%2 == 0)
	{
		$(insertedTr).attr("class","finishing_task_editor_row_a");
	}else{
		$(insertedTr).attr("class","finishing_task_editor_row_b");
	}

	var takListObj = $(insertedTr).find("select")[0];
	
	finishing_task_editor_init_select_task_list(takListObj,(taskInfo.device).toLowerCase());
	finishing_task_editor_change_task(takListObj,taskInfo);

	//save tasData to tr and replace task select with text
	if(taskInfo)
	{
		$(insertedTr).data("taskData",taskInfo);
	}
	//hide task select ui and show a text label
	//format task name to uppercase the first character
    var taskName = taskInfo.device.replace(/_/g," ");

    taskName     = UppercaseTheFirstLetter(taskName);
	$($(insertedTr).find("td").get(0)).append(taskName);
	$($(insertedTr).find("td").get(0)).attr("class","finishing_task_editor_option_label");
	
	$(insertedTr).find("td").css("background-color",$(insertedTr).css("background-color"));
	$($(insertedTr).find("td").get(1)).find("select:first").bind("change",function(event){
															var trObj = $(this).parent().parent();
															var tblObj = $(trObj).parent().parent();
															var position = $(this).position();
															position.left = position.left + $(this).width();
															//var $imgDiv = $(tblObj).next("div");	
															var $imgDiv = $(trObj).find("td:last").prev().find("div");
															$imgDiv.empty();
															if( position.top + 70 > $(window).height() + $(window).scrollTop())
															{
																position.top -= 70;
															}
															
															var taskData = finishing_task_editor_get_data(this,true);
															
															if(taskData == undefined)
																taskData = new Object();
															if(!taskData.thumb) {$imgDiv.hide(); return true;};
															
															
															$imgDiv.append("<img src='/img/ajax-loader_02.gif' alt=''>");
															$imgDiv.append("<img width='60' height='67' style='display:none' onError='$(this).prev().remove();' onAbort='$(this).prev().remove();' onload='$(this).prev().remove();$(this).show();' src='/user/images_estimating_tasks/"+taskData.thumb+"' alt=''>");	
															$imgDiv.css("left",position.left);
															$imgDiv.css("top",position.top);
															$imgDiv.show();
														});
	$($(insertedTr).find("td").get(2)).find("select:first").bind("change",function(event){
		finishing_task_editor_change_option(this,taskInfo);
	});
	$($(insertedTr).find("select").get(0)).hide();

	
	//always show the table title. the title may hidden when rows equal to 0
	_finishing_task_editor_toggle_table_title(instanceName);
	_finishing_task_editor_toggle_arrows(instanceName);
	_finishing_task_editor_apply_ui_access_to_ui(instanceName);
	//trigger task method change event, the event handle cause thumb image show
	$($(insertedTr).find("td").get(1)).find("select:first").trigger("change");
	
	//Hide tr if access is ""
	taskName = taskInfo.device;
	var uiaccess = _finishing_task_editor_get_task_ui_access(taskName);
	if(global_ui_access != false && uiaccess == "")
	{
		
		$(insertedTr).hide(); 
	}
	return insertedTr;
}
function finishing_task_editor_inputNote_trrow_required(currentTr)
{
	var need = false;
	if(global_fte_showTaskNoteColumn)
	{
		var taskInfo = $(currentTr).data("taskData");
		var methodListObj = $(currentTr).find("select")[1];
		//var taskRowData = finishing_task_editor_get_data_by_device_methodID(taskInfo['device'],taskInfo['methodID']);
		var taskRowData = finishing_task_editor_get_data_by_device_methodID(taskInfo['device'],$(methodListObj).val());
		need = taskRowData['needInputNote'] == 'Y';
	}
	return need;
}

function finishing_task_editor_apply_inputNote(currentTr)
{
	if(global_fte_showTaskNoteColumn)
	{
		var taskInfo = $(currentTr).data("taskData");
		var methodListObj = $(currentTr).find("select")[1];
		var taskRowData = finishing_task_editor_get_data_by_device_methodID(taskInfo['device'],$(methodListObj).val());
		var need = finishing_task_editor_inputNote_trrow_required(currentTr);
		var column_index = finishing_task_editor_get_column_index($(currentTr).closest('table'),'Task Note');
		var task_note_input = $(currentTr).find("td:eq("+column_index+") input");
		if(need)
		{
			if(task_note_input.length == 0)
			{
				if(taskInfo['note'] == undefined)
					taskInfo['note'] = '';
				$(currentTr).find('td:eq('+column_index+')').append(taskRowData.noteQuestion + '<br><input type="text" value="'+taskInfo['note']+'"/>');
		
			}
	}else{
			//remove note controle if exist
			
			if(task_note_input.length > 0)
			{
				var taskInfo = $(currentTr).data("taskData");
				taskInfo['note'] = '';
				$(currentTr).data("taskData",taskInfo);
				$(currentTr).find("td:eq("+column_index+")").html('');
			}
		}
	}
}
function finishing_task_editor_get_column_index(tableObj,columnName)
{
	if(tableObj.find("tr td:contains('"+columnName+"')").length > 0)
	{
		return tableObj.find("tr td:contains('"+columnName+"')").index();
	}else{
		return -1;
	}
	
}
function finishing_task_editor_change_method(selMethodObj,taskInfo)
{
	
   var changeTaskIndex = $(selMethodObj).parent().parent().index() - 3;
   var changeMethod = $(selMethodObj).find('option:selected').text();
	$(finishing_task_editor_object).trigger('changetask',{'index':changeTaskIndex,'desc':changeMethod})
			
	var methodListObj = $(selMethodObj).parent().parent().find("select")[1];
	var optionListObj = $(selMethodObj).parent().parent().find("select")[2];
	var descriptionInputObj = $(selMethodObj).parent().parent().find(":input")[3];
	
	var methodData = finishing_task_editor_get_data(selMethodObj,true);

	
	if(taskInfo && taskInfo.description)
	{
		$(descriptionInputObj).val(taskInfo.description);
	}
	else
	{
		$(descriptionInputObj).val(methodData['taskdescription']);
	}
	
	if(taskInfo && taskInfo.optionID)
	{
		finishing_task_editor_showSubMenu(methodListObj,optionListObj,taskInfo.optionID);
	}
	else{
		finishing_task_editor_showSubMenu(methodListObj,optionListObj);
	}
	
	//apply input note control
	finishing_task_editor_apply_inputNote($(selMethodObj).parent().parent());
	
}

function finishing_task_editor_change_option(selOptionObj,taskInfo){
	var metaData = $(selOptionObj).parent().parent().data("taskData");
	metaData.optionID = $(selOptionObj).val();
	metaData.optionDescription = $(selOptionObj).find("option:selected").text();
	$(selOptionObj).parent().parent().data("taskData",metaData);
}

function finishing_task_editor_showSubMenu(obj, sub_obj, selectedValue){
	$(sub_obj).empty();
	$(sub_obj).hide();
	if($(obj) == null || $(obj).val() == null){
			return false;
	}
	var methodData = finishing_task_editor_get_data(obj,true);
	var methodName = $(obj).val();
	//check does the query options already in cache
	
	var option_list = false;
	if(finishing_task_editor_cache['DEVICE_METHOD_OPTIONS'] && finishing_task_editor_cache['DEVICE_METHOD_OPTIONS'][methodData.device] && finishing_task_editor_cache['DEVICE_METHOD_OPTIONS'][methodData.device][methodName])
	{
		option_list = finishing_task_editor_cache['DEVICE_METHOD_OPTIONS'][methodData.device][methodName];
	}
	if(option_list)
	{
		  if(option_list.length == 0){
			if(global_manual_create_task_flag)
				$(sub_obj).trigger('change');
			return;
		  }
		  $(sub_obj).empty();//fix bug receive response nearly same time
		  $(sub_obj).show();
		  for(var i=0; i<option_list.length; i++){
			  $(sub_obj).append('<option value="'+option_list[i].optionID+'">'+option_list[i].optionDescription+'</option>"');
		  }
		  if(selectedValue != 'none'){
			  $(sub_obj).val(selectedValue);
		  }
		  
		  _finishing_task_editor_apply_ui_access_to_ui(global_instanceName);
		  if(global_manual_create_task_flag)
				$(sub_obj).trigger('change');
		  return;
	}
	
	$.post('/etc/shared/finishing.options.php',
		  {'request':'RETRIVE','methodID':$(obj).val(),'device':methodData.device}, 
		  function(data){
			  if(data.status == 0){
				 //there must check again. otherwise it will fill option list. even method selected null
				if($(obj) == null || $(obj).val() == null){
						return false;
				}
				  if(data.options.length > 0){
					  $(sub_obj).empty();//fix bug receive response nearly same time
					  $(sub_obj).show();
					  for(var i=0; i<data.options.length; i++){
						  var extra = "";
						  if(selectedValue != undefined && selectedValue != 'none' && selectedValue.toLowerCase() == data.options[i].optionID.toLowerCase()){
							  extra = "selected=\"selected\"";
						  }
						  $(sub_obj).append('<option value="'+data.options[i].optionID+'" ' + extra + '>'+data.options[i].optionDescription+'</option>"');
					  }
					  _finishing_task_editor_apply_ui_access_to_ui(global_instanceName);
					  if(global_manual_create_task_flag)
						$(sub_obj).trigger('change');
				  }
				  //save data to cache
				  if(finishing_task_editor_cache['DEVICE_METHOD_OPTIONS'][methodData.device])
				  {
					finishing_task_editor_cache['DEVICE_METHOD_OPTIONS'][methodData.device][methodName] = data.options;
				  }
				  else
				  {
					finishing_task_editor_cache['DEVICE_METHOD_OPTIONS'][methodData.device] = new Array();
					finishing_task_editor_cache['DEVICE_METHOD_OPTIONS'][methodData.device][methodName] = data.options;
				  }
		
			  }else{
				  alert('An error occured (' + data.status + ')');
			  }
		  },'json');
}
function finishing_task_editor_change_task(selTaskObj,taskInfo)
{
	if(taskInfo == null)
	{
		taskInfo = {};
	}
	var methodListObj = $(selTaskObj).parent().parent().find("select")[1];
	var taskData = finishing_task_editor_get_data(selTaskObj);
	
	$(methodListObj).empty();
	var methodID = taskInfo.methodID.toLowerCase();
	var foundInList = false	
	$.each(taskData, function(i){
		var id = taskData[i].methodID.toLowerCase();
		if(id == methodID){
			foundInList = true;
		}
	});
	if(false == foundInList && typeof(global_raw_task_list) != "undefined"){
		$.each(global_raw_task_list, function(device){
			if (device.toLowerCase() == taskInfo.device.toLowerCase()){
				$.each(global_raw_task_list[device], function(method){
					if(method.toLowerCase() == methodID){
						taskData[methodID] = global_raw_task_list[device][method];
					}
				});
			}
		});
	}
	$.each(taskData,function(i){
		//if the paper restriction of coating already load. only put in the allow method
		//p defined in page global value
		if(global_method_show_as_methodID)
		{
			var newOption = "<option value='"+htmlEncode(taskData[i].methodID)+"' title='"+htmlEncode(taskData[i].taskdescription)+"'>"+htmlEncode(taskData[i].text)+"</option>";
		}else{
			var newOption = "<option value='"+htmlEncode(taskData[i].methodID)+"' title='"+htmlEncode(taskData[i].taskdescription)+"'>"+htmlEncode(taskData[i].taskdescription)+"</option>";
		}
		$(methodListObj).append(newOption);
	});
	if(taskInfo && taskInfo.methodID)
	{
		$(methodListObj).find('option').each(function(i,obj){
			if($(obj).attr('value').toLowerCase() == taskInfo.methodID.toLowerCase()){
				taskInfo.methodID = $(obj).attr("value");
				$(methodListObj).val(taskInfo.methodID);
				$(methodListObj).trigger('change',[taskInfo]);
			}
		});
	}
	$(methodListObj).bind('change', function(){ finishing_task_editor_change_method(this, taskInfo)});
}

function finishing_task_editor_init_select_task_list(selObj,selectItem)
{
  $(selObj).empty();
  $.each(finishing_task_editor_task_map,function(i){
	  var upperFirstCharacterFormate = i.substr(0,1).toUpperCase() + i.substr(1);
	  var newOption = "<option value='"+htmlEncode(i)+"'>"+htmlEncode(upperFirstCharacterFormate)+"</option>";
	  $(selObj).append(newOption);
 
  });
  $(selObj).val(selectItem);
}
function finishing_task_editor_create_init()
{
	//only init once
	if(global_finishing_editor_has_inited) return;
	
	var instanceName = global_instanceName;
	var initData     = global_initData;
	//if finishing_task_instance_count equal 1. need to init finishing tasks map.
	$(function (){
		finishing_task_editor_instance_count++;
		if(finishing_task_editor_instance_count == 1)
		{
			$.get('/etc/shared/ajax_page.php',
					  {'request':'get_finishing_task', 'publicEnabled':global_enable_public},
					  function(data){
						  if(data.result == "0"){
							  finishing_task_editor_task_map = data.response;
							  if(null == finishing_task_editor_task_map || undefined == finishing_task_editor_task_map){
								  finishing_task_editor_task_map = new Array();
							  }
							  //need to apply ui access to task map
							  if(global_ui_access){
								  _finishing_task_editor_apply_ui_access_to_task_map();
								  // process the job's tasks can not be allowed any more after ui access was changed
								  (function(){
									  var tmp = [];
									  $.each(initData, function(i1, n1){
										  var found = false;
										  $.each(finishing_task_editor_task_map, function(i2, n2){
											  if(i2 == n1.device.toLowerCase()){
												  found = true;
												  return false;
											  }
										  });
										  if (found){
											  tmp.push(n1);
										  }
									  });
									  initData = tmp;
									  delete tmp;
								  })();
							  }
							  //init add task select list
							  _finishing_task_editor_init_rows(instanceName,initData)
								
						  }else{
							  alert("Query finishing task list exception, Please try later");
						  }
					  },
					  'json');
		}else{
			  //init add task select list
			  _finishing_task_editor_init_rows(instanceName,initData);
		}	
	
	});
	
	
}

//filter out the task, methodID which no allow in ui_access
function _finishing_task_editor_apply_ui_access_to_task_map()
{
	for(var key in finishing_task_editor_task_map)
	{
		var deviceInUIaccess = false;
		$.each(global_ui_access,function()
			   {
					if(this.device && this.device.toLowerCase() == key)
					{
						deviceInUIaccess = true;
						for(var key2 in finishing_task_editor_task_map[key])
						{
							var optionInUIaccess = false;
							$.each(this.option,function()
								   {
										if(this.methodid && this.methodid.toLowerCase() == key2)
										{
											optionInUIaccess = true;
										}
								   }
								   );
							if(!optionInUIaccess)
							{
								delete finishing_task_editor_task_map[key][key2];
							}
						}
					}
			   }
			   );
		if(deviceInUIaccess == false)
		{
			delete finishing_task_editor_task_map[key];
			continue;
		}
		/*
		if(!(global_ui_access[key] && global_ui_access[key]['option']))
		{
			delete finishing_task_editor_task_map[key]
			continue;
		}
		
		for(var key2 in finishing_task_editor_task_map[key])
		{
			//check does the option exists in ui access
			var optionInUIaccess = false;
			
			for(var key3 in  global_ui_access[key]['option'])
			{
				if(global_ui_access[key]['option'][key3] == key2)
				{
					optionInUIaccess = true;
					break;
				}
			}
			if(!optionInUIaccess)
			{
				delete finishing_task_editor_task_map[key][key2];
			}
		}
		*/
	}
}


function _finishing_task_editor_init_rows(instanceName,initData)
{
	 var selectAddObj = $("#" + instanceName + "_select_add");
	  finishing_task_editor_init_select_task_list(selectAddObj);

	  if(initData.length && initData.length > 0)
	  {
		  
		  //create rows
		  $.each(initData,function (i,n){
			  
			  finishing_task_editor_add_row(instanceName,null,n);
		  });
		  
		  //this function must be called there. this function execute after the page has loaded
		  //the task map gloabl variable;
		  finishing_task_editor_adjust_coating(instanceName,$(p.paper_ui_object_selector).val());					  
	  }else{
		  finishing_task_editor_create_completed(instanceName);
	  }
	  _finishing_task_editor_toggle_table_title(instanceName);
	  finishing_task_editor_init_create_task_menu(instanceName, $(p.paper_ui_object_selector).val());
}

function finishing_task_editor_moveTr(btnObj)
{
	var $trObj 	  = $(btnObj).parent().parent();
	var $tableObj = $trObj.parent().parent();
	var taskName = $($trObj.find("select").get(0)).val();
	var methodName = $($trObj.find("select").get(1)).val();
	var direction = $(btnObj).attr("value");
	
	$(finishing_task_editor_object).trigger('swaptask',{'index':($trObj.index() - 3),'direction':direction});
	var trData = $trObj.data("taskData");
	if(direction == "up")
	{
		//the first row no need to up
		if($trObj.prevAll().length == 3)
		{
			return;
		}
		var $beforTr = $trObj.prev();
		$beforTr.before($($trObj.clone(true)));	
		
		var $insertedTr = $beforTr.prev();
		$($insertedTr.find("select").get(0)).val(taskName);
		$($insertedTr.find("select").get(1)).val(methodName);
		$insertedTr.data("taskData",trData);
		


		//switch css
		var clsName = $insertedTr.attr("class");
		$insertedTr.attr("class",$beforTr.attr("class"));
		$beforTr.attr("class",clsName);
		$insertedTr.find("td").css("background-color",$insertedTr.css("background-color"));
		$beforTr.find("td").css("background-color",$beforTr.css("background-color"));
		$trObj.remove();
	}else if(direction == "down")
	{
		//the last row no need to down
		if($trObj.nextAll().length == 0)
		{
			return;
		}
		var $nextTr = $trObj.next();
		$nextTr.after($($trObj.clone(true)));
		
		var $insertedTr = $nextTr.next();
		$($insertedTr.find("select").get(0)).val(taskName);
		$($insertedTr.find("select").get(1)).val(methodName);
		$insertedTr.data("taskData",trData);
		
		
		//switch css
		var clsName = $insertedTr.attr("class");
		$insertedTr.attr("class",$nextTr.attr("class"));
		$nextTr.attr("class",clsName);
		$insertedTr.find("td").css("background-color",$insertedTr.css("background-color"));
		$nextTr.find("td").css("background-color",$nextTr.css("background-color"));
		$trObj.remove();
	}
	
	//toggle up and down button
	_finishing_task_editor_toggle_arrows($tableObj.attr("id"));

}
function _finishing_task_editor_toggle_arrows(instanceName)
{
	$tableObj = $("#" + instanceName);
	$tableObj.find("tr:gt(2)").each(function(i,n){
		$($(n).find("img.up")).css("visibility","visible");
		$($(n).find("img.down")).css("visibility","visible");
	});
	$firstTr = $tableObj.find("tr:eq(3)");
	$($firstTr.find("img.up")).css("visibility","hidden");
	$lastTr  = $tableObj.find("tr:last");
	$($lastTr.find("img.down")).css("visibility","hidden");
}
function finishing_task_editor_adjust_coating(instanceName,paperID)
{ 
	var $editor = $("#" + instanceName);
	_filterMenuItem(paperID);
	//the task_map not loaded from server.
	if(finishing_task_editor_task_map == undefined){
		return false;
	}
	if(paperID == 0)
	{
		$editor.find("tr:gt(2)").each(function (i,n){
			var taskListObj   =  $(n).find("select")[0];
			var methodListObj = $(n).find("select")[1];
			var optionListObj = $(n).find("select")[2];
			var selectedMethod = $(methodListObj).val();
			var selectedOption = $(optionListObj).val();
			if($(taskListObj).val() == "coating")
			{
				$(methodListObj).empty();
				finishing_task_editor_showSubMenu(methodListObj,optionListObj);
			}
		});
		if(!global_finishing_editor_has_inited)
		{
			finishing_task_editor_create_completed(instanceName);
		}
		return false;
	}
	//check does the query paperID's coating option list in cache
	var option_list = finishing_task_editor_cache["PAPER_COATING_OPTIONS"][paperID];
	if(option_list == undefined)
	{
		$(document).trigger(FINISHING_TASK_EDTOR_EVENTS.LOAD_COATING_METHOD_START);
		$.get('/etc/shared/ajax_page.php',
				 {'request':'get_coating_methods', 'paperID':paperID},
				 function(data){
					if(data.result == ajax_response.ERROR_OK){
						//save response to cache
						finishing_task_editor_cache["PAPER_COATING_OPTIONS"][paperID] = data.response;
						option_list = finishing_task_editor_cache["PAPER_COATING_OPTIONS"][paperID];
						
						//apply option list to ui
						$editor.find("tr:gt(2)").each(function (i,n){
							var taskListObj   =  $(n).find("select")[0];
							var methodListObj = $(n).find("select")[1];
							var optionListObj = $(n).find("select")[2];
							var selectedMethod = $(methodListObj).val();
							var selectedOption = $(optionListObj).val();
							if($(taskListObj).val() == "coating")
							{
								$(methodListObj).empty();
								if(option_list.length == 0){
									$(this).remove();
									_finishing_task_editor_toggle_arrows(instanceName);
								}else{
									$.each(option_list,function(i2,n2){
										if(global_method_show_as_methodID)
										{
											var newOption = "<option value='"+htmlEncode(n2["methodID"])+"'>"+htmlEncode(n2["methodID"])+"</option>";
																					
										}else{
											var newOption = "<option value='"+htmlEncode(n2["methodID"])+"'>"+htmlEncode(n2["taskdescription"])+"</option>";
																					
										}
										$(methodListObj).append(newOption);
									});
									// un-supported coating method , such as P1 allow "Both Side Coating" , while P2 allow only "Front Side"
									// change coating method from P1 to P2, if user select "Both Side" coating, th
									var allow_option = false;
									for( i=0; i<option_list.length; i++){
										if(option_list[i].methodID == selectedMethod){
											allow_option = true;
										}
									}
									if (allow_option == true){
										$(methodListObj).val(selectedMethod);
										finishing_task_editor_showSubMenu(methodListObj,optionListObj,selectedOption);
									}else{
										$(this).remove();
										_finishing_task_editor_toggle_arrows(instanceName);
									}
									$(methodListObj).val(selectedMethod);
									finishing_task_editor_showSubMenu(methodListObj,optionListObj,selectedOption);
								}
							}
						});
					}
					else{
						try {
							console.log(data.message);
						}
						catch(err)
						{
						// do nothing
						}
					}
					$(document).trigger(FINISHING_TASK_EDTOR_EVENTS.LOAD_COATING_METHOD_END);
				 },'json');		
	}else{
		//apply option list to ui
		$editor.find("tr:gt(2)").each(function (i,n){
			var taskListObj   =  $(n).find("select")[0];
			var methodListObj = $(n).find("select")[1];
			var optionListObj = $(n).find("select")[2];
			var selectedMethod = $(methodListObj).val();
			var selectedOption = $(optionListObj).val();
			if($(taskListObj).val() == "coating")
			{
				$(methodListObj).empty();
				if(option_list.length == 0){
					$(this).remove();
					_finishing_task_editor_toggle_arrows(instanceName);
				}else{
					$.each(option_list,function(i2,n2){
						if(global_method_show_as_methodID)
						{
							var newOption = "<option value='"+htmlEncode(n2["methodID"])+"'>"+htmlEncode(n2["methodID"])+"</option>";
						
						}else{
							var newOption = "<option value='"+htmlEncode(n2["methodID"])+"'>"+htmlEncode(n2["taskdescription"])+"</option>";
						
						}
							$(methodListObj).append(newOption);
					});
					var allow_option = false;
					for( i=0; i<option_list.length; i++){
						if(option_list[i].methodID == selectedMethod){
							allow_option = true;
						}
					}
					if (allow_option == true){
						$(methodListObj).val(selectedMethod);
						finishing_task_editor_showSubMenu(methodListObj,optionListObj,selectedOption);
					}else{
						$(this).remove();
						_finishing_task_editor_toggle_arrows(instanceName);
					}
					_finishing_task_editor_apply_ui_access_to_ui(instanceName);
				}
			}
		});
	}

	
	if(!global_finishing_editor_has_inited)
	{
		finishing_task_editor_create_completed(instanceName);
	}

}
function finishing_task_editor_create_completed(instanceName)
{
	global_finishing_editor_has_inited = true;
	//apply input note ui to each tr
	var $editor = $("#" + instanceName);
	$editor.find("tr:gt(2)").each(function (i,currentTr){
		finishing_task_editor_apply_inputNote(currentTr);
	});
	
}
function finishing_task_editor_check_already_input_note(instanceName)
{
	var $editor = $("#" + instanceName);
	var allInput = true;
	$editor.find("tr:gt(2)").each(function (i,currentTr){
		need = finishing_task_editor_inputNote_trrow_required(currentTr);
		if(need)
		{
			var column_index = finishing_task_editor_get_column_index($editor,'Task Note');
			var task_note_input = $(currentTr).find("td:eq("+column_index+") input");
			if(task_note_input.val() == '')
			{
				allInput = false;
				task_note_input.focus();
				return false;
			}
		}
	});
	return allInput;
}
function finishing_task_editor_updateUItoHiddenFormElement(instanceName)
{
	var $editor = $("#" + instanceName);
	var $hiddenInput = $(":input[name='finishing_task_description']");
	
	var strVal = "";
	$editor.find("tr").each(function (i,n){
		if(i <= 2)
			return true;
		
		
		
		var taskListObj = $(n).find("select")[0];
		var methodListObj = $(n).find("select")[1];
		var optionListObj = $(n).find("select")[2];
		col_index = finishing_task_editor_get_column_index($editor,'Description');
		var descriptionInputObj = $(n).find(" td:eq("+col_index+") input");
		col_index = finishing_task_editor_get_column_index($editor,'Task Note');
		var taskNoteInputObj = false;
		if(col_index != -1)
			taskNoteInputObj = $(n).find(" td:eq("+col_index+") input");
		
		var tmpObj = $(n).data('taskData');
		if(tmpObj == undefined)
			tmpObj = new Object();
		tmpObj['device'] = $(taskListObj).val();
		tmpObj['methodID'] = $(methodListObj).val();
		tmpObj['optionID'] = $(optionListObj).val();
		tmpObj['description'] = $(descriptionInputObj).val();
		if(taskNoteInputObj)
		{
			tmpObj['note'] = $(taskNoteInputObj).val();
		}
			
		tmpObj['hide'] = $(n).css('display') == 'none'?'Y':'';
		$(n).data('taskData',tmpObj);
		
		strVal += JSON.stringify(tmpObj) + ",";
		
	});
	strVal = strVal.substring(0,strVal.length-1);
	var result = "["+strVal+']';
	$hiddenInput.val(result);
}

function popup_edit_finishing_task_detail_dialog(trObj,taskData)
{
	$("#edit_finishing_task_detail").dialog('destroy');
	$("#edit_finishing_task_detail").dialog({
		autoOpen: true,
		width: 450,
		modal: true,
		resizable:false,
		title: "Edit Finishing Tasks Detail",
		close:function(){
					//$("#edit_finishing_task_detail").dialog('destroy');
					return false;
				},
		open:function(){
			var instanceName = $(trObj).parent().parent().attr("id");
			finishing_task_editor_updateUItoHiddenFormElement(instanceName);
			var taskData = $(trObj).data("taskData");
			if(taskData == undefined)
				taskData = new Object();
			
			//clean data on ui
			$("#edit_finishing_task_detail").find("input").val("");
			$("#edit_finishing_task_detail").find("textarea.note").val('');
			var aaaaaa=$("#edit_finishing_task_detail").find("textarea.note");
			//collapse fieldset
		
			$('fieldset.cost').collapse({closed:true});
			$('fieldset.wholeCost').collapse({closed:true});
			$("#edit_finishing_task_detail").find("select").val(taskData['priceUnit']);
			//apply data to UI
			$("#edit_finishing_task_detail").find("input").each(function(i,n){
				var keyStr = $(n).attr("class");
				$($("#edit_finishing_task_detail").find("input."+keyStr)).val(taskData[keyStr]==undefined?'':taskData[keyStr]);
			});
			//readonly fields
			$("#edit_finishing_task_detail").find("div").each(function(i,n){
				var keyStr = $(n).attr("class");
				$($("#edit_finishing_task_detail").find("div."+keyStr)).text(taskData[keyStr]);
				
				
				if(keyStr == "device")
				{
					var taskName = taskData[keyStr].replace(/_/g," ");
					taskName = UppercaseTheFirstLetter(taskName);
					$($("#edit_finishing_task_detail").find("div."+keyStr)).text(taskName);
				}
			});
			$("#edit_finishing_task_detail").find("textarea.note").val(taskData["note"]==undefined?'':taskData["note"]);
			
			
			
		},
		buttons: {
			"Cancel": function(){
				//$("#edit_finishing_task_detail").dialog('destroy');
				$("#edit_finishing_task_detail").dialog('close');
				return false;
			},
			"OK": function(){
				var taskDataUpdate = $(trObj).data("taskData");
				$("#edit_finishing_task_detail").find("input").each(function(i,n){
					var keyStr = $(n).attr("class");
					taskDataUpdate[keyStr] = $(n).val();
				});
	
				taskDataUpdate['note'] = $("#edit_finishing_task_detail").find("textarea.note").val();
	
				taskDataUpdate['priceUnit'] = $("#edit_finishing_task_detail").find("select").val();
			
				$(trObj).data("taskData",taskDataUpdate);
				//$("#edit_finishing_task_detail").dialog('destroy');
				//set tr descripton field
				$(trObj).find('input:last').val(taskDataUpdate["description"]);
				$("#edit_finishing_task_detail").dialog('close');
				return false;
			}
	
		}
	});
}

function json_replacer(key, value) {
/* 		console.log(key, value); */
		if (typeof(value) == 'string')
		{
			value = value.replace(/\'/g,"\x27")
		}
	return value;
}
function finishing_task_editor_get_methoddata_by_id(mid)
{
	var mData = false; 
	$.each(finishing_task_editor_task_map,function(i,methodList){
		$.each(methodList,function(i2,methodObj){
			if(methodObj.id == mid)
			{
				mData = methodObj;
				return false;
			}
		});
		if(mData != false)
		{
			return false;
		}
		
	});
	 return mData
}
function finishing_task_editor_init_create_task_menu(instanceName, paperID)
{
	var trObj = $("#"+instanceName).find("tr:eq(1)");
	var isAnEmptyMenu = true;
	var menuUI = '<div class="finishing_task_editor_menu_container">'+
					'<ul id="'+instanceName+'_add_task_menu" class="menu">'+
						'<li class="menumain"><button type="button" class="finishing_task_editor_button">Add New Task</button>'+
							'<ul>';
	  $.each(finishing_task_editor_task_map,function(i){
		  var taskName = i.replace(/_/g," ");
		  taskName     = UppercaseTheFirstLetter(taskName);
	
		 var uiaccess = _finishing_task_editor_get_task_ui_access(i);
		 //if task UI access set to read disabled current menu item
		 if(uiaccess == "read")
		 {
			 return;
		 }
		 //If task UI access set to "". it's a hidden item. not show in menue. but can not return
		 if(global_ui_access != false && uiaccess == "")
		 {
			 return true;
		 } 
		 isAnEmptyMenu = false;
		 
		 menuUI += '<li>'+htmlEncode(taskName)+'<ul>'; 
		  $.each(finishing_task_editor_task_map[i],function(i2,n2){
			  //var menuItemValue = JSON.stringify(n2, json_replacer);
			  var menuItemValue = n2['id'];
			  var tmpText = n2['taskdescription'];
			  menuUI += "<li><input type='hidden' value='"+htmlEncode(menuItemValue)+"'/>"+tmpText+"</li>";
		  });
		  menuUI += '</ul></li>';
	 
	  });
		
		menuUI +=					'</ul>'+
						'</li>'+
					'</ul>'+
					'<div style="clear:both;"></div>'+
				'</div>';
	menuUI = $(menuUI);
	menuUI.find('button').button({			
		icons: {
			secondary: "ui-icon-triangle-1-s"
		}
	});
	$(trObj).find("td:eq(0)").append(menuUI);


	var options = {
			minWidth: 130, 
			arrowSrc: '/img/arrow_right.gif', 
			copyClassAttr: true, 
			onClick: function(e, menuItem){
					global_manual_create_task_flag = true;
					//console.log(this);
					$.Menu.closeAll();
					/*
					try{
						var taskInfo = JSON.parse($(this).find("input").val());
					}
					catch(erro) {
						try{
							console.log('bad JSON: ' + $(this).find("input").val());
						}
						catch(erro) {
							// do nothing
						}
					}*/
					var taskInfo = finishing_task_editor_get_methoddata_by_id($(this).find("input").val());
					//taskInfo['device'] = taskInfo['device'].toLowerCase();
					var newTaskData = new Object();
					for(var key in taskInfo)
					{
						switch(key)
						{
						case 'device':
							newTaskData[key] = taskInfo[key].toLowerCase();
							break;
						case 'price':
							newTaskData['piece'] = taskInfo[key].toLowerCase();
							break;
						default:
							newTaskData[key] = taskInfo[key];
							break;
						}
					}
					var now = new Date();
					newTaskData['due'] = now.getFullYear() + "-" + now.getMonth() + "-" + now.getDate();
					$(finishing_task_editor_object).trigger('addnewtask',{'device':taskInfo['device'].toUpperCase(),'desc':taskInfo['taskdescription']});
					finishing_task_editor_add_row(instanceName,null,newTaskData);
					//p is the gloabl value defineded in parent page. it contain description about page ui controls. please 
					//see an example at popup_itemedit.php line 1196 (the line number maybe different in future)
					var currentPaperID = $(p.paper_ui_object_selector).val();
					finishing_task_editor_adjust_coating(instanceName,currentPaperID);
			}};
	$('#'+instanceName+'_add_task_menu').menu(options);
if(isAnEmptyMenu)
	{
		$('#'+instanceName+'_add_task_menu').hide();
		//Hide the first and the second row
		var $editor = $("#"+instanceName);
		$($editor.find("tr").get(0)).hide();
		$($editor.find("tr").get(1)).hide();
	}

	_filterMenuItem($(p.paper_ui_object_selector).val());
}

//filter the coating menu item
function _filterMenuItem(paperID){
	if(paperID == 0){
		$(".menu-item span:contains('Coating')").closest('li').hide();
		return false;
	}
	$(document).trigger(FINISHING_TASK_EDTOR_EVENTS.LOAD_COATING_METHOD_START);
	$.get('/etc/shared/ajax_page.php',
		{'request':'get_coating_methods', 'paperID':paperID},
		function(data){
			if(data.result == ajax_response.ERROR_OK){
				if(data.response.length == 0){
					$(".menu-item span:contains('Coating')").closest('li').hide();
				}else{
					$(".menu-item span:contains('Coating')").closest('li').show();
					$.each($(".innerbox .menu-item :input"), function(i, v){
						//try{
							var taskInfo = finishing_task_editor_get_methoddata_by_id($(this).val());//JSON.parse($(this).val());
						//}
						//catch(erro) {
						//	try{
						//		console.log('bad JSON: ' + $(this).val());
						//	}
						//	catch(erro) {
								// do nothing
						//	}
						//}
						if (taskInfo.device == 'Coating'){
							$(this).parent().parent().hide();
							for( i=0; i< data.response.length; i++){
								if (data.response[i].methodID == taskInfo.methodID){
									$(this).parent().parent().show();
									break;
								}
							}
						}
					});
				}
			}
			$(document).trigger(FINISHING_TASK_EDTOR_EVENTS.LOAD_COATING_METHOD_END);
		},
		'json');
}

function _finishing_task_editor_apply_ui_access_to_ui(instanceName)
{
	var $editor = $("#"+instanceName);
	$editor.find("tr:gt(2)").each(function (i,n){
		var taskListObj   =  $(n).find("select")[0];
		var methodListObj = $(n).find("select")[1];
		var optionListObj = $(n).find("select")[2];
		var selectedMethod = $(methodListObj).val();
		var selectedOption = $(optionListObj).val();
		var taskName = $(taskListObj).val();
		var uiaccess = _finishing_task_editor_get_task_ui_access(taskName);
		if(uiaccess == "read")
		{

			$(methodListObj).hide();
			$(optionListObj).hide();
	
			if($($(methodListObj).parent()).find("span").length == 0)
			{
				$($(methodListObj).parent()).append("<span>" + $(methodListObj).find("option:selected").text() + "</span>");
			}
			
			var optionText = $(optionListObj).find("option:selected").text();
			if($($(optionListObj).parent()).find("span").length == 0 && optionText != "")
			{
				$($(optionListObj).parent()).append("<span>"+optionText+"</span>");
			}
			
			
			var $deleteImg = $(n).find("img:last");
			$deleteImg.hide();
		}
	});
}
function _finishing_task_editor_get_task_ui_access(taskName)
{
	var uiaccess = "";
	if(global_ui_access)
	{
		$.each(global_ui_access, function()
			   {
					if(this.device.toLowerCase() == taskName.toLowerCase() && this.access)
					{
						uiaccess = this.access;
						return uiaccess;
					}
				});
		/*
		if(global_ui_access[taskName] && global_ui_access[taskName]['access'])
		{
			uiaccess = global_ui_access[taskName]['access'];
			return uiaccess;
		}
		*/
	}
	return uiaccess;
}
/**
 * CHANGES
 * v.2.1.2 - Fixed bug in which nested fieldsets are used.
 * v.2.1.1 - Forgot to put the new filter from v.2.1 into the if (settings.closed)
 * v.2.1 - Changed $(this).parent().children().filter( ELEMENTS HERE) to $(this).parent().children().not('label').  Prevents you from having to guess what elements will be in the fieldset.
 * v.2.0 - Added settings to allow a fieldset to be initiated as closed.
 *
 * This script may be used by anyone, but please link back to me.
 *
 * Copyright 2009-2010.  Michael Irwin (http://michael.theirwinfamily.net)
 */
       
$.fn.collapse = function(options) {
	var defaults = {
		closed : false
	}
	settings = $.extend({}, defaults, options);

	return this.each(function() {
		var obj = $(this);
		obj.find("legend:first").unbind("click");
		obj.find("legend:first").addClass('collapsible').click(function() {
			if (obj.hasClass('collapsed'))
				obj.removeClass('collapsed').addClass('collapsible');
	
			$(this).removeClass('collapsed');
	
			obj.children().not('legend').toggle("slow", function() {
			 
				 if ($(this).is(":visible"))
					obj.find("legend:first").addClass('collapsible');
				 else
					obj.addClass('collapsed').find("legend").addClass('collapsed');
			 });
		});
		if (settings.closed) {
			obj.addClass('collapsed').find("legend:first").addClass('collapsed');
			obj.children().not("legend:first").css('display', 'none');
		}
	});
};

function UppercaseTheFirstLetter(string,option){
	var splitby,parts,i,uppercased;
	splitby = " ";
	if(option==0){splitby=" ";}
	else if(option==1){splitby=".";}
	else if(option==2){splitby="<BR>";}
	
	string=string.replace(/^\s+/, '').replace(/\s+$/, ''); 
	//we removed unnecessary spaces at the beginning and ending of string. 
	parts = string.split(splitby);
	for(i=0;i<parts.length;i++){
	          parts[i]=parts[i].replace(/^\s+/, '').replace(/\s+$/, '');
	          if(parts[i].length>0){
	          uppercased=parts[i].slice(0,1).toUpperCase()+parts[i].slice(1,parts[i].length);
	                    if(i>0)output+=splitby+uppercased; else output=uppercased;
	          }
	}
	
	return output;
}


