/**
 * Submits an ajax request to the server
 * @param A HashMap or query-string of params
 * @param The name of the onSuccessCallback function
 */
function doSubmit(params, callback){
	var valid, msg = $('message');
	var url = '/creole-dictionary/browse.php';
	var ajax = new Ajax.Request(
			url,
			{ method: 'get',
			  parameters: params, 
			  onFailure: reportError,
			  onSuccess: callback
			 });

   	msg.show().update('Please Wait ...').style.color = 'green'
  	return false;
}// end doSubmit()

/**
 * Perform ajax search & display results
 */
function doAjaxSearch(params){
	var msg = $('ajaxSearchResults');
	var url = '/creole-dictionary/browse.php?method=ajax';
	var ajax = new Ajax.Request(
		url,
		{ method: 'get',
		  parameters: params, 
		  onFailure: reportError,
		  onSuccess: function(transport) {
			    if (transport.responseText.match(/Error/) || transport.responseText.match(/error/))
			      msg.show().update(transport.responseText).style.color = 'red';
			    else
			      msg.show().update(transport.responseText);
			  }
		});	

   	msg.show().update('Please Wait ...').style.color = 'green'
  	return false;
}// end doAjaxSearch()

function reportError(request) {
	if($('message') != undefined){
		var msg = 'An error occured ' + request.status;
		$('message').update('An error occurred').style.color = 'red';
		alert(msg);
	}
	else{
		$('ajaxResults').update('An error occurred').style.color= 'red';
	}
}

/**
 * Renders a particular template in the given placeHolder
 * @param A HashMap or query-string of parameters
 * @param The id of the Element (div or span) where to place the output
 */	
function doRender(params, placeHolder){
	var url = '/creole-dictionary/browse.php';			
	var ajax = new Ajax.Request(
			url,
			{ method: 'get',
			  parameters: params, 
			  onFailure: reportError,
			  onSuccess: function(transport) {
				    if (transport.responseText.match(/Error/) || transport.responseText.match(/error/))
				      $('message').show().update(transport.responseText).style.color = 'red';
				    else{
				    	$(placeHolder).update(transport.responseText);
				    	//msg.show().update(transport.responseText);
				    	$('message').update().hide();
				    } 
				  }
			});	

   	$('message').show().update('Please Wait ...').style.color = 'green'
  	return true;
}// end doRender()

var definitionFormLoaded = false;  
/**
 * Shows the add-a-definition form
 */
function showDefinitionForm(){
	$('add-form').toggle();
	if($('showDefLink').innerHTML == 'Cancel'){
		$('showDefLink').update('Add a definition').style.color = 'black';
		$('message').hide();
	}else{
		$('showDefLink').update('Cancel').style.color = 'red';
		if(!definitionFormLoaded){
			definitionFormLoaded = doRender($H({service:'render', template:'definition'}), 'definitionFormPlaceHolder');
		}
	}
}

/**
 * Form-validator for the add-a-definition form
 * @return boolean
 */
function isValidDefinitionForm(){
	if(!$('word_definition_text').present()){
		$('message').show().update('Definition can not be empty.').style.color = 'red';
		$('word_definition_text').style.border = '1px solid red';
		//alert('Definition can not be empty.');
		return false;
	}
	if(!$('word_definition_example').present()){
		$('message').show().update('Please provide an example of how to use the word based on the given definition.').style.color = 'red';
		$('word_definition_example').style.border = '1px solid red';
		//alert('Please provide an example of how to use the word based on the given definition.');
		return false;				
	}
	return true;
}

function doAddDefinition(){
	var valid = isValidDefinitionForm();
	if(!valid){
		return false;
	}
	
	var params = Form.serialize('addDefinitionForm');
	/*
	var p = '?service=add';
	$('addDefinitionForm').getElements().each(function (item){
		p = p + '&'+item.name+'='+item.value;
	})*/
	
	//params = p;
	var msg = $('message');
	var url = '/creole-dictionary/browse.php';			
	var ajax = new Ajax.Request(
			url,
			{ method: 'get',
			  parameters: params, 
			  onFailure: reportError,
			  onSuccess: handleResult
			});	

   	$('message').show().update('Please Wait ...').style.color = 'green'			
 		return false;		   	
}

/**
 * Handles the result after a successful ajax post of adding a definition
 * @param HTTPXMLRequest
 */
function handleResult(transport){
    if (transport.responseText.match(/Error/) || transport.responseText.match(/error/)){
		msg.show().update(transport.responseText).style.color = 'red';
    }
    else{
    	$('message').update(transport.responseText);
    	$('showDefLink').update('Add a definition');
    	$('add-form').hide();
		
		var node = '<li>'+
					'<h3>' + $('main-word').innerHTML + 
					'<span class="classification">&nbsp;' + $('definitionClassification').innerHTML + '</span>'+
				   '</h3>'+
				   '<p class="definition">'+ $F('word_definition_text').strip().quote() + '</p>' +
				   '<p class="example">' + $F('word_definition_example').strip().quote() + '</div>' +
				   '<small>last updated:' + new Date().toGMTString() + '</small>' +
				   '</li>';
		new Insertion.Bottom('definitionList', node);
    } 
}

//var relateFormLoaded = false;
/**
 * Shows the add-a-relation form
 */
function showRelateForm(t){
  	$('relateFormPlaceHolder').toggle();
	if($(t).innerHTML == 'Cancel'){
		$(t).update('Add');
		$('message').hide();
	}else{
		$(t).update('Cancel');
		$('relateWords').show();
		$('mainWord').value = $('main-word').innerHTML.trim();
		$('relativeText').focus();	
					
		if(t == 'showSynonymLink'){
			$('relationship')[0].selected = true;
		}else{
			$('relationship')[1].selected = true;
		}
	}// end if
}
 		
function relateTheWords(){
	var valid, msg = $('message');
	
  	// are both fields present?
    if ($('mainWord').present() && $('relativeText').present()){
    	if($F('mainWord').trim() != $F('relativeText').trim()){
	    	valid = true;
    	}else{
    		msg.show().update('A word cannot be it\'s own ' + $F('relationship').toLowerCase() + '. Seriously.').style.color = 'red';
    		valid = false;
    	}
    }else{
	    msg.show().update('Please fill out <i>all</i> the fields.').style.color = 'red';	    
	    valid = false;
    }
  	
	if(valid){
		doSubmit(Form.serialize('relateForm'), handleRelateSubmit);
	}
  	return false;
}
function handleRelateSubmit(transport){
	var msg = $('message');
	if (transport.responseText.match(/Error/) || transport.responseText.match(/error/))
		msg.show().update(transport.responseText).style.color = 'red';
	else{
		msg.update(transport.responseText);
		var text = $F('relativeText');
		var node = '<li><a href="/creole-dictionary/show/'+ text+'" title="' + text + '">' + text + '</a></li>';
		var where = '';
		if ($F('relationship') == 'SYNONYM'){
			where = 'synonymsList';
		}else if($F('relationship') == 'ANTONYM'){
			where = 'antonymsList';
		}
		new Insertion.Bottom(where, node);
		
		$('relateFormPlaceHolder').hide();
		if($('showSynonymLink').innerHTML == 'Cancel'){
			$('showSynonymLink').update('Add');
		}else if($('showOppositeLink').innerHTML == 'Cancel'){
			$('showOppositeLink').update('Add');
		}
	}
}
function updateDefinition(){
	var str = '?service=update&' + $('wordId').serialize();
	modifiedFields.each(function(f){
		str = str + '&' + $(f).serialize();
	})
	
	doSubmit(str, handleUpdateDefinition);
}
function handleUpdateDefinition(transport){
	if (transport.responseText.match(/Error/) || transport.responseText.match(/error/))
		msg.show().update(transport.responseText).style.color = 'red';
	else{
		$('message').update(transport.responseText);
		modifiedFields.each(function(f){
			$(f).style.border = '';
		})
	}
}

function deleteWord(){
	if(confirm('This will delete all its definitions as well! \n Do you really want to delete the word ' + $F('wordText') + ' ?')){
		doSubmit(new Hash({service: 'delete', wordId:$F('wordId'), wordText:$F('wordText')}), function(transport){
		    if (transport.responseText.match(/Error/) || transport.responseText.match(/error/)){
   			   $('message').show().update(transport.responseText).style.color = 'red';}
		    else{
   		      $('message').update(transport.responseText + '<br>You will now be redirected in 5 seconds');
			  var t=setTimeout("window.location = '/creole-dictionary'", 5000);
		    }
		});
	}
}

var deletedDefinitionId = '';
function deleteDefinition(defId){
	if(confirm('Do you really want this definition ' + $F('wordText') + ' ?')){
		deletedDefinitionId = defId;
		doSubmit(new Hash({service: 'delete', definitionId:defId, wordId: $F('wordId')}), handleDeleteDefinition);
	}
}

function handleDeleteDefinition(transport){
	if (transport.responseText.match(/Error/) || transport.responseText.match(/error/)){
   		$('message').show().update(transport.responseText).style.color = 'red';
	}
   	else{
     	$('message').update(transport.responseText);
		$('p'+deletedDefinitionId).remove();
		$('li'+deletedDefinitionId).remove();
   	}
}

function doDeleteRelationship(sId, sText, rel){
	if(confirm('Do you really want to delete the ' + rel + ' relationship between the words ' + $F('wordText') + ' and ' + sText + '?')){
		doSubmit(new Hash({service: 'delete', relativeId:sId, wordId: $F('wordId'), relationship:rel}), handleEdits);
	}
}
		
function handleEdits(transport){
    if (transport.responseText.match(/Error/) || transport.responseText.match(/error/))
	   $('message').show().update(transport.responseText).style.color = 'red';
    else
      $('message').update(transport.responseText);
}// end handleEdits()

function addWords(){
	var valid = true;
	var msg = $('message');
	
	valid = validateAddForm();
	
	if(valid){
		doSubmit(Form.serialize('addForm'), handleRelateSubmit);
	}
}// end addWords()

/**
 * Returns the textual string to be used to create a tooltip
 * @param The name of the word type [Adverb, Verb, Noun, Phrase, Pronoun, Article, Conjunction, Number, Preposition]
 */
function getTip(param){
 	var text = null;
 	if(param == 'Adjective'){
 		text = 'A word that serves as a modifier of a noun to denote a quality of the thing named, to indicate its quantity or extent, or to specify a thing as distinct from something else. It answers the questions "which?", "how many?", and "what kind of?", though probably not all three at once.';
 	}else if(param == 'Adverb'){
 		text = 'A word serving as a modifier of a verb, an adjective, another adverb, a preposition, a phrase, a clause, or a sentence, and expressing some relation of manner or quality, place, time, degree, number, cause, opposition, affirmation, or denial. It answers the questions "where?", "when?", or "how?", even if you didn\'t ask.';
 	}else if(param == 'Article'){
 		text = 'One of a small set of words or affixes (as a, an, and the) used with nouns to limit or give definiteness to the application. English has an indefinite article (a, an) and a definite article (the).';
 	}else if(param == 'Conjunction'){
 		text = 'A word that joins together sentences, clauses, phrases, or words. There are two kinds of conjunctions: coordinating conjunctions (such as "and" and "or") and subordinating conjunctions (such as "but"). There is a conjunction between "Jupiter" and "Mars" (namely, "and").';
 	}else if(param == 'Interjection'){
	 	text = 'An ejaculatory utterance usually lacking grammatical connection. Like Damn! Crap! or Sh1t! or ';
 	}else if(param == 'Noun'){
 		text = 'A word that is the name of something (as a person, animal, place, thing, quality, idea, or action). All of the nouns in this definition are emphasized.';
 	}else if(param == 'Number'){
 		text = 'A quality attached to a noun or pronoun that indicates a category of how many individuals are being referred to. Both English and Kreyol have two numbers: singular (one individual) and plural (more than one individual).';
 	}else if(param == 'Phrase'){
 		text = 'A group of two or more grammatically related words that form a sense unit expressing a thought. The phrase has the force of a single part of speech, such as a noun or adverb. For example, "two or more grammatically related words" is a phrase representing a noun.';
 	}else if(param == 'Preposition'){
 		text = 'A word that combines with a noun, pronoun, or noun equivalent to form a phrase that typically has an adverbial, adjectival, or substantival relation to some other word. In English, a preposition is generally considered a bad thing to end a sentence with.';
 	}else if(param == 'Pronoun'){
 		text = 'A word that is used as a substitute for a noun or noun equivalent, takes noun constructions, and refers to persons or things named or understood in the context. For example, "he" is a pronoun.';
 	}else if(param == 'Verb'){
 		text = 'A word that expresses an act, occurrence, or mode of being. It is the grammatical center of a predicate. For example, "verb" is a verb in the sentence "It is possible to verb any noun".';
 	}
 	return text.escapeHTML();
 }
 
 function isValidEmail(theEmail){
 	var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
	return filter.test(theEmail);
 }