/*
term :

terms is an object that holds the queryparts plus the modification 
of that querypart - additions of AND or NOT and OR.

if the user chose to extend the queryterm law by adding "law and order" with AND

terms becomes : [ law -> [ AND -> [ "law and order" ]]]

if the user chose to extend the queryterm law by adding "lawsuit" with AND

terms becomes : [ law -> [ AND -> [ "law and order", lawsuit ]]]
...

*/

/* THE TERM OBJECT */
var terms = new Object();
var terms_for_checkboxes = new Array();
/* THE ORIGINAL QUERY [ IS SET WITH setOriginalQuery onBodyLoad ] */
var originalquery = ""	
var querystring = ""	

/* @param Element THE SOURCE DOM ELEMENT WHICH WAS CLICKED */						
/* @param Modifier THE QUERYTERM MODIFIER [ = AND | OR | NOT ]*/
/* @param QueryPart THE PART OF THE QUERY TO BE MODIFIED */
/* @param ThesaurusTerm THE TERM FROM THE THESAURUS TO USE */
function ModifyQueryString(Element, Modifier, QueryPart, ThesaurusTerm, QueryStringInputField) {
	terms_for_checkboxes.push(Modifier+QueryPart+ThesaurusTerm);
	var QueryPartForCheckBoxes = QueryPart;
	//if ( querystring===undefined || querystring==null || querystring=='' ) {
		setOriginalQuery(QueryStringInputField);
	//}
    if(QueryPart.indexOf(" ")!=-1){
			if(originalquery.indexOf('"'+QueryPart+'"')!=-1){
				QueryPart = '"'+QueryPart+'"'
			}
	        //QueryPart = '"'+QueryPart+'"';
    }

	//alert("ModifyQueryString "+ Element +" "+ Modifier+" "+QueryPart+" "+ThesaurusTerm);

	var prefix=Element.id.substring(0,3);
	var op=Element.id.substring(3,4);
	var suffix=Element.id.substring(4);

    /* IF THE ELEMENT IS SET TO TRUE */
    if(Element.checked == true){            
        /* THE QUERYPART IS NOT YET IN THE OBJECT */
        if(terms[QueryPart]===undefined){
                /* CREATE A NEW ARRAY FOR ALL THE THESAURUSTERMS AND PUSH THE ACTUAL THESAURUSTERM */
                thesterms = new Array();
                thesterms.push(ThesaurusTerm);	
                /* SINCE NOT EVEN THE QUERYPART IS IN THE OBJECT IT IS VERY UNLIKELY THAT THE MODIFIER IS IN IT */    
                thesmodifiers = new Object();
                thesmodifiers[Modifier] = thesterms;
				thesmodifiers["Active"]=true;
                terms[QueryPart]=thesmodifiers;
        } else {
                /* THE QUERYPART IS IN THE OBJECT BUT THE MODIFIER IS NEW */
                if(thesmodifiers[Modifier]===undefined){
                        /* CREATE A NEW ARRAY FOR ALL THE THESAURUSTERMS AND PUSH THE ACTUAL THESAURUSTERM */
                        thesterms = new Array();
                        thesterms.push(ThesaurusTerm);	
                        thesmodifiers = terms[QueryPart];
                        thesmodifiers[Modifier] = thesterms;
                        terms[QueryPart] = thesmodifiers;
                } else {
                        /* QUERYPART AND MODIFIER ARE IN THE OBJECT SO ONLY PUSH THE THESAURUSTERM */
                        terms[QueryPart][Modifier].push(ThesaurusTerm);
                }
        }	       
		// lock other checkboxes
		if (Modifier=="AND") {
			document.getElementById(prefix+'O'+suffix).disabled=true;
			document.getElementById(prefix+'N'+suffix).disabled=true;
		}
		else if (Modifier=="OR") {
			document.getElementById(prefix+'A'+suffix).disabled=true;
			document.getElementById(prefix+'N'+suffix).disabled=true;
		}
		else if (Modifier=="NOT") {
			document.getElementById(prefix+'A'+suffix).disabled=true;
			document.getElementById(prefix+'O'+suffix).disabled=true;
		}
		printQuery(Modifier, QueryStringInputField);
    } else {          
		/* REMOVE THE TERM FROM THE ARRAY FOR MODERATION CHECKBOXES */
        document.getElementById(prefix+'A'+suffix).disabled=false;
        document.getElementById(prefix+'O'+suffix).disabled=false;
        document.getElementById(prefix+'N'+suffix).disabled=false;
		var tmp_terms_for_checkboxes = new Array();
        for(var i = 0; i < terms_for_checkboxes.length; i++){
            if(terms_for_checkboxes[i]!=(Modifier+QueryPartForCheckBoxes+ThesaurusTerm)){
                tmp_terms_for_checkboxes.push(terms_for_checkboxes[i]);
	        }
        }
		terms_for_checkboxes = tmp_terms_for_checkboxes;
		ModeratedSearchManager.setTerms(terms_for_checkboxes);
		var QueryElement = document.getElementById(QueryStringInputField);
		if(ThesaurusTerm.indexOf(" ")==-1){
			if(originalquery.indexOf(" " + Modifier + " " + ThesaurusTerm + " ")!=-1){                
				QueryElement.value = originalquery.replace(" " + Modifier + " " + ThesaurusTerm + " "," ");
				return;
			} else 
			if(originalquery.indexOf(" " + Modifier + " " + ThesaurusTerm)!=-1){                
                QueryElement.value = originalquery.replace(" " + Modifier + " " + ThesaurusTerm,"");
				return;
            } else
            if(originalquery.indexOf(" " + ThesaurusTerm + " " + Modifier + " ")!=-1){
                QueryElement.value = originalquery.replace(" " + ThesaurusTerm + " " + Modifier + " ","");
                return;
            } else
			if(originalquery.indexOf(ThesaurusTerm + " " + Modifier + " ")!=-1){
				QueryElement.value = originalquery.replace(ThesaurusTerm + " " + Modifier + " ","");
			}
		} else {
            if(originalquery.indexOf(" " + Modifier + " " + '"'+ThesaurusTerm+'"' + " ")!=-1){
                QueryElement.value = originalquery.replace(" " + Modifier + " " + '"'+ThesaurusTerm+'"' + " "," ");
                return;
            } else
			if(originalquery.indexOf(" " + Modifier + " " + '"'+ThesaurusTerm+'"')!=-1){
			    QueryElement.value = originalquery.replace(" " + Modifier + " " + '"'+ThesaurusTerm+'"',"");
			    return;
			} else
			if(originalquery.indexOf(" " + '"'+ThesaurusTerm+'"' + " " + Modifier + " ")!=-1){
			    QueryElement.value = originalquery.replace(" " + '"'+ThesaurusTerm+'"' + " " + Modifier + " ","");
			    return;
			} else
			if(originalquery.indexOf('"'+ThesaurusTerm+'"' + " " + Modifier + " ")!=-1){
			    QueryElement.value = originalquery.replace('"'+ThesaurusTerm+'"' + " " + Modifier + " ","");
			}

		}
    }
}   

/* @param Mod THE MODIFIER FOR getQueryForQueryPart */
function printQuery(Mod, QueryStringInputField){
        /* GET A MODIFIABLE COPY OF THE ORIGINAL QUERYSTRING */
        querystring = originalquery; 
        
        /* LOOPING OVER ALL QUERYPARTS IN terms */
        for(QueryPart in terms){
            if(typeof terms[QueryPart] !== 'function'){
                /* BUILD REGEX FOR FINDING THE QUERYPART IN THE ORIGINAL QUERYSTRING */
                var regex = new RegExp('\\b'+QueryPart+'\\b(?!")','gi');
                fromindex = 0;
                querystring = querystring.replace(regex,function(thematch){
                /* SINCE JAVASCRIPT REGEX ARE LIMITED THERES NEED FOR UKRAINIAN STYLE CODING [ LOOKBEHIND FOR A QUOT ]*/   
                if(querystring.substring(querystring.indexOf(thematch,fromindex)-1,querystring.indexOf(thematch,fromindex))!='"'){
                                /* NOT QUOT FOUND SO THEMATCH MUST BE WHAT WE WE'RE LOOKING FOR - GET THE MODIFIED QUERY FOR THIS QUERYPART */
                                returner = getQueryForQueryPart(thematch, Mod);
                        } else {
                                returner = thematch;
                        }
                        fromindex = querystring.indexOf(thematch,fromindex)+(thematch.length);
                        return returner;					
                });  
                if(querystring == originalquery){
                   querystring = querystring.replace(QueryPart, getQueryForQueryPart(QueryPart, Mod));    
                }  
            }    
        }                        
	document.getElementById(QueryStringInputField).value = (querystring);
	ModeratedSearchManager.setTerms(terms_for_checkboxes);
	terms = new Object();
}


function clone(o) {
	if(typeof(o) !== 'object') return o;
		if(o == null) return o;
		var newO = new Object();
			for(var i in o) { alert(i); newO[i] = clone(o[i]); }
				return newO;
}



/* @param QueryPart THE QUERYPART WE NEED THE MODIFIED QUERY FOR */

function getQueryForQueryPart(QueryPart){
        /* THE RETURN QUERY */
        var Query = "";
        /* A FLAG FOR SETTING BRACKETS AROUND MULTIPLE THESAURUSTERMS OF ONE MODIFIER */
        var multi = false;        
        /* A COUNTER FOR THE MODIFIERS OF THE terms OBJECT */
        var ModCounter = 0;        
        /* SELFEXPLANATORY LOOP */
        for(Modifier in terms[QueryPart]){
                if(typeof terms[QueryPart][Modifier] !== 'function'){
                        if(terms[QueryPart][Modifier].length>1 && (Modifier=="AND")){ Query += " AND ("; multi = true; }
                        if(terms[QueryPart][Modifier].length>1 && (Modifier=="NOT")){ Query += " NOT "; multi = true; }
                        for(ThesaurusTerm in terms[QueryPart][Modifier]){
                                if(typeof terms[QueryPart][Modifier][ThesaurusTerm] !== 'function'){
                                        MultiAwareModifier = multi == true ? " OR " : Modifier;	
                                        if(multi == true){
                                                MultiAwareModifier = ThesaurusTerm == 0 ? "" : MultiAwareModifier;
                                        }
                                        if(terms[QueryPart][Modifier][ThesaurusTerm].indexOf(" ")!=-1){
                                                Query += " " + MultiAwareModifier + " \"" + terms[QueryPart][Modifier][ThesaurusTerm] + "\"";			
                                        } else {
                                                Query += " " + MultiAwareModifier + " " + terms[QueryPart][Modifier][ThesaurusTerm]+"";	
                                        }
                                }
                        }
                        if(terms[QueryPart][Modifier].length>1 && (Modifier=="AND")){ Query += ") "; multi = false; }								
                        ModCounter++;
                }
        }        
        if(ModCounter>0){
            /* IF QUERYPART WAS MODIFIED IN SOME WAY PUT IT INTO BRACKETS */
			if(Modifier=="AND"){
	            Query = "(" + QueryPart + Query + ")";
			} else {
				Query = QueryPart + Query;
			}
        } else { 
            Query += QueryPart; 
        }
        
        return Query;
}

function setOriginalQuery(QueryStringInputField) {
    originalquery = document.getElementById(QueryStringInputField).value;
}

function notYetImplemented() {
	alert("This feature has not yet been implemented!");
}

function showMore(termId) {
	var children = document.getElementById(termId).getElementsByTagName("tr");
	for(var i = 0; i < children.length; i++){
		children[i].removeAttribute("class");
	}
	document.getElementById("ShowMore_"+termId).innerHTML = "&nbsp;";
	/*
	//alert("showMore: "+$("tr.mst"+termId).size()+" terms");
	$("tr.mst"+termId).lt(1000).removeClass("QMhidden");
	$("tr.mst"+termId).lt(1000).removeClass("mst"+termId);
	//alert("showMore: "+$("tr.mst"+termId).size()+" terms remaining");
	if ($("tr.mst"+termId).size()<1) {
		$("tr#sm"+termId).html("<td colspan=\4\">&nbsp;<td>");
		//alert("showMore: link removed");
	}
	*/
}

