/*
  *  function scroll();
  *  content: Content id
  *	 position up/down: 1/0
  *	 action start/stop: 1/0
  */
var time = false;
var limit = 0;
var speed = 25;
function scrollDiv( content, position, action ) {
	if (action == 0) {
		if ( time ) {
			clearTimeout( time );
		}
	} else {
		var scroll_content = $( content );
		var top_margin = parseInt(scroll_content.style.marginTop);
		var step;
		if ( position == 0 ) {
			limit = bot_limit;  
			step = -1;
		} else {
			limit = 0;
			step = 1;
		}
		if ( top_margin == limit ) {
			if ( time ) {
				clearTimeout( time );
			}
			return false;
		}
		
		scroll_content.style.marginTop = top_margin + step +'px';
		
		time = window.setTimeout("scrollDiv('"+ content +"', "+ position + ", " + action + ")", speed );
	}
}
function scrollHeight( outer, scroll ) {
	try {
		var bot_limit = $('outer').offsetHeight - $('scroll').offsetHeight;
		if ( bot_limit > 0) {
			bot_limit = 0;
		}
		return bot_limit;
	}
	catch ( e ) {
	
	}
}

/* showHideList */
var showHideListItem = false;
var showHideListTitle = false;
function showHideList ( title, content ) {
	var contentTitle = $( title );
	var contentBlock = $( content );
	
	/* from cookies */
	if ( contentBlock.style.display == 'block' ) {
		contentBlock.style.display = 'none';
		contentTitle.className = '';
		showHideListItem = false;
		showHideListTitle = false;
		
	} else {
		if ( ( showHideListTitle ) && ( showHideListItem ) ) {
			$( showHideListTitle ).className = '';
			$( showHideListItem ).style.display = 'none';
		}
		showHideListItem = content;
		showHideListTitle = title;
		/* cookies */
		setDataToCookie( 'showHideListItem', content );
		setDataToCookie( 'showHideListTitle', title );
		
		
		contentTitle.className = 'active';
		contentBlock.style.display = 'block';
	}
}
function updateList() {
	if (( !showHideListItem) && (!showHideListTitle)) {
		var activeItem = getDataFromCookie('showHideListItem');
		var activeTitle = getDataFromCookie('showHideListTitle');
		$( activeItem ).style.display = 'block';
		$( activeTitle ).className = 'active';
		showHideListItem = activeItem;
		showHideListTitle = activeTitle;
	}
}
/* showHideList */

function getDataFromCookie( cookieName ){
	labelName = cookieName;
	var labelLen = labelName.length;
	var cookieData = document.cookie;
	var cLen = cookieData.length;
	var i = 0;
	var cEnd;
	var selected_value = '';
	while (i < cLen) {
		var j = i + labelLen;
		if (cookieData.substring(i,j) == labelName) {
			cEnd = cookieData.indexOf(';',j);

		if (cEnd == -1) {
			cEnd = cookieData.length;
		}

		selected_value =  unescape(cookieData.substring(j+1, cEnd));
		}
		i++;
	}

	return selected_value;

}

function setDataToCookie( cookieName, value ){
	var exp = new Date();
	var oneYearFromNow = exp.getTime() + (365 * 24 * 60 * 60 * 1000);
	exp.setTime(oneYearFromNow);
	document.cookie = cookieName + "=" + value + "; expires=" + exp.toGMTString() + "; path=/;";
}

function confirmation( msg, url ) {

	var confirmed = confirm( msg );
	
	if ( confirmed ) {
		window.location = url;
	} else {
		return false;
	}
}

function runQuery( url, id, confirm_msg ) {
	
	// maybe trhow confirm box
	if ( confirm_msg.length > 0 ) {
		var confirmed = confirm( confirm_msg );
		
		if ( !confirmed ) {
			return false;
		}
	}
	
	// send ajax request
	var ajaxRequest = new Ajax.Request(
		url, {
			method: 'get',
			parameters: '',
			onSuccess: function ( req ) {
				try {
					$( id ).innerHTML = req.responseText;
				} catch( e ) {
				}
			}
		}
	);
}


function runQueryWithFunction( url, id, confirm_msg, function_to_eval ) {
	
	// maybe throw confirm box
	if ( confirm_msg.length > 0 ) {
		var confirmed = confirm( confirm_msg );
		
		if ( !confirmed ) {
			return false;
		}
	}
	
	// send ajax request
	var ajaxRequest = new Ajax.Request(
		url, {
			method: 'get',
			parameters: '',
			onSuccess: function ( req ) {
				
				if ( function_to_eval != '' ) {
					eval( function_to_eval );
				} else {
					try {
						$( id ).innerHTML = req.responseText;
					} catch( e ) {
					}
				}
			}
		}
	);
}


function runQueryAndFunction( url, id, confirm_msg, function_to_eval ) {
	
	// maybe throw confirm box
	if ( confirm_msg.length > 0 ) {
		var confirmed = confirm( confirm_msg );
		
		if ( !confirmed ) {
			return false;
		}
	}
	
	// send ajax request
	var ajaxRequest = new Ajax.Request(
		url, {
			method: 'get',
			parameters: '',
			onSuccess: function ( req ) {
				try {
					$( id ).innerHTML = req.responseText;
					
					// html element updated, now call function
					if ( function_to_eval != '' ) {
						eval( function_to_eval );
					}
				} catch( e ) {
				}
			}
		}
	);
}


function populateSelectViaAjax( url, id, empty_value, confirm_msg, function_to_eval ) {
	
	// maybe throw confirm box
	if ( confirm_msg.length > 0 ) {
		var confirmed = confirm( confirm_msg );
		
		if ( !confirmed ) {
			return false;
		}
	}
	
	// send ajax request
	var ajaxRequest = new Ajax.Request(
		url, {
			method: 'get',
			parameters: '',
			onSuccess: function ( req ) {
				try {
					//var json = req.responseText.evalJSON(true);
					var json = eval ( "(" + req.responseText + ")" );
					
					var element = $( id );
					var iterator = 1;
					
					element.options.length = 0;
					
					if( empty_value != '' ) {
						element.options[0] = new Option( empty_value, 0 );
					}
					
					for ( var i in json ) {
						if ( json[i] && typeof json[i] == 'string' ) {
							element.options[iterator] = new Option( json[i], i );
							iterator = iterator + 1;
						}
					}
					
					if( empty_value != '' ) {
						element.options[0].selected = true;
					} else {
						element.options[0] = null;
					}
					
					// html element updated, now call function
					if ( function_to_eval != '' ) {
						eval( function_to_eval );
					}
				} catch( e ) {
				}
			}
		}
	);
}



function extractHtmlTagPropertyValues( html, tagName, propertyName ) {

	var extracts = new Array();
	
	// extract the requested properties of the requested tags
	var tagArr = html.split( '<' + tagName );
	for ( i=0; i<tagArr.length; i++ ) {
		var propArr = tagArr[i].split( propertyName + '="' );
		if ( propArr.length > 1 ) {
			var valueArr = propArr[1].split( '"' );
			extracts.push( valueArr[0] );
		}
	}
	
	return extracts;
}				


function insertShowAllOption( id, showAllText ) {
	
	var html = $( id ).innerHTML;
	html = "\n<option value=\"0\">" + showAllText + "</option>\n" + html;
	$( id ).innerHTML = html;
	
}

function removeShowAllOption( id ) {
	
	$( id ).options[0] = null;
}


function setShowAllText( id, showAllText ) {
	
	if( showAllText != '' ) {
		$( id ).options[0].text = showAllText;
	}
}

function deleteObject( id, confirm_msg ) {
	
	// maybe trhow confirm box
	if ( confirm_msg.length > 0 ) {
		var confirmed = confirm( confirm_msg );
		
		if ( !confirmed ) {
			return false;
		}
	}
	
	try {
		$( id ).parentNode.removeChild( $( id ) );
	} catch( e ) {
	}
}


/**
 * Create new question functions
 */
function addAnswer( parent_block_id, answer_label, delete_confirm_text ) {

	// get prototype for copy
	var objAnswerPrototype = $( 'new_answer_block' );
	
	// create new element
	var newObject = document.createElement( 'div' );
	newObject.innerHTML = objAnswerPrototype.innerHTML;
	newObject.id = 'answer_' + answers_iter;
	newObject.className = 'answer';
	
	// create label
	var labels = newObject.getElementsByTagName( 'label' );
	labels[0].innerHTML = '<strong>' + answer_label + '<\/strong>';
	
	// new element's href for removing an answer
	var hrefs = newObject.getElementsByTagName( 'a' );
	hrefs[0].onclick = new Function( 'deleteObject( "' + newObject.id + '", "' + delete_confirm_text + '" ); return false;' );
	
	// new element's textarea
	var textareas = newObject.getElementsByTagName( 'textarea' );
	textareas[0].name = 'form[answers][' + parent_block_id + '][' + answers_iter + '][answer_text]';
	
	// new element's inputs (for file and answer_correct checkbox
	var inputs = newObject.getElementsByTagName( 'input' );
	inputs[0].name = 'form[answers][' + parent_block_id + '][' + answers_iter + '][question_answer_point]';
	inputs[1].name = 'form[answers][' + parent_block_id + '][' + answers_iter + '][question_answer_correct]';
	inputs[1].onclick = new Function( 'changeCorrectAnswersCount( this );' );
	inputs[2].name = 'answer_' + answers_iter + '_file';
	
	// add answer to the parent element
	var objParent = $( parent_block_id );
	objParent.appendChild( newObject );
	
	answers_iter++;
}


function addSection( parent_block_id, section_label, answer_label, delete_confirm_text ) {

	// get prototype for copy
	var objSectionPrototype = $( 'new_section_block' );
	
	// create new element
	var newObject = document.createElement( 'div' );
	newObject.innerHTML = objSectionPrototype.innerHTML;
	newObject.id = 'section_' + sections_iter;
	
	// create label
	var labels = newObject.getElementsByTagName( 'label' );
	labels[0].innerHTML = '<strong>' + section_label + '<\/strong>';
	
	// new element's textarea
	var textareas = newObject.getElementsByTagName( 'textarea' );
	textareas[0].name = 'form[sections][' + newObject.id + '][section_text]';
	
	// new element's input for file
	var inputs = newObject.getElementsByTagName( 'input' );
	inputs[0].name = newObject.id + '_file';
	
	// new element's href for adding answer
	var hrefs = newObject.getElementsByTagName( 'a' );
	hrefs[0].onclick = new Function( 'deleteObject( "' + newObject.id + '", "' + delete_confirm_text + '" ); return false;' );
	hrefs[1].onclick = new Function( 'addAnswer( "' + newObject.id + '", "' + answer_label + '", "' + delete_confirm_text + '" ); return false;' );
	
	// add section to the parent element
	var objParent = $( parent_block_id );
	objParent.appendChild( newObject );
	
	sections_iter++;
}


function submitQuestion( form_id, return_to_list ) {
	
	if ( return_to_list == 1 ) {
		$( 'return_to_list' ).value = '1';
	}
	
	$( 'answers_iter' ).value = answers_iter;
	$( 'sections_iter' ).value = sections_iter;
	
	$( form_id ).submit();
}


/*
 * Edit question functions
 */
function addAnswer_2( parent_block_id, answer_label, delete_confirm_text ) {

	// get prototype for copy
	var objAnswerPrototype = $( 'new_answer_block' );
	
	// create new element
	var newObject = document.createElement( 'div' );
	newObject.innerHTML = objAnswerPrototype.innerHTML;
	newObject.id = 'answer_' + answers_iter;
	newObject.className = 'answer';
	
	// create label
	var labels = newObject.getElementsByTagName( 'label' );
	labels[0].innerHTML = '<strong>' + answer_label + /*answers_iter +*/ '<\/strong>';
	
	// new element's href for removing an answer
	var hrefs = newObject.getElementsByTagName( 'a' );
	hrefs[0].onclick = new Function( 'deleteObject( "' + newObject.id + '", "' + delete_confirm_text + '" ); return false;' );
	
	// new element's textarea
	var textareas = newObject.getElementsByTagName( 'textarea' );
	textareas[0].name = 'form[answers][' + parent_block_id + '][' + answers_iter + '][question_answer_name]';
	
	// new element's inputs (for file and answer_correct checkbox
	var inputs = newObject.getElementsByTagName( 'input' );
	inputs[0].name = 'form[answers][' + parent_block_id + '][' + answers_iter + '][question_answer_point]';
	inputs[1].name = 'form[answers][' + parent_block_id + '][' + answers_iter + '][question_answer_correct]';
	inputs[1].onclick = new Function( 'changeCorrectAnswersCount( this );' );
	inputs[2].name = newObject.id + '_file';
	
	// add answer to the parent element
	var objParent = $( parent_block_id );
	objParent.appendChild( newObject );
	
	answers_iter++;
}


function addSection_2( parent_block_id, section_label, answer_label, delete_confirm_text ) {

	// get prototype for copy
	var objSectionPrototype = $( 'new_section_block' );
	
	// create new element
	var newObject = document.createElement( 'div' );
	newObject.innerHTML = objSectionPrototype.innerHTML;
	newObject.id = 'section_' + sections_iter;
	
	// create label
	var labels = newObject.getElementsByTagName( 'label' );
	labels[0].innerHTML = '<strong>' + section_label + /*sections_iter +*/ '<\/strong>';
	
	// new element's textarea
	var textareas = newObject.getElementsByTagName( 'textarea' );
	textareas[0].name = 'form[sections][' + newObject.id + '][question_part_name]';
	
	// new element's input for file
	var inputs = newObject.getElementsByTagName( 'input' );
	inputs[0].name = newObject.id + '_file';
	
	// new element's hrefs for removing and adding an answer
	var hrefs = newObject.getElementsByTagName( 'a' );
	hrefs[0].onclick = new Function( 'deleteObject( "' + newObject.id + '", "' + delete_confirm_text + '" ); return false;' );
	hrefs[1].onclick = new Function( 'addAnswer_2( "' + newObject.id	+ '", "' + answer_label + '", "' + delete_confirm_text + '" ); return false;' );
	
	// add section to the parent element
	var objParent = $( parent_block_id );
	objParent.appendChild( newObject );
	
	sections_iter++;
}


function clearTestFilter() {

	var filter_test_type_ref = document.getElementById( 'filter_test_type' );
	var filter_test_subject_ref = document.getElementById( 'filter_test_subject' );
	var filter_test_topic_ref = document.getElementById( 'filter_test_topic' );
	var filter_test_level_ref = document.getElementById( 'filter_test_level' );
	var filter_test_pool_ref = document.getElementById( 'filter_test_pool' );
	var filter_test_state_ref = document.getElementById( 'filter_test_state' );
	
	if ( filter_test_type_ref ) {
		filter_test_type_ref.options.selectedIndex = 0;
	}
	
	if ( filter_test_subject_ref ) {
		filter_test_subject_ref.options.selectedIndex = 0;
	}
	
	if ( filter_test_topic_ref ) {
		filter_test_topic_ref.options.selectedIndex = 0;
	}
	
	if ( filter_test_level_ref ) {
		filter_test_level_ref.options.selectedIndex = 0;
	}
	
	if ( filter_test_pool_ref ) {
		filter_test_pool_ref.options.selectedIndex = 0;
	}
	
	if ( filter_test_state_ref ) {
		filter_test_state_ref.checked = '';
	}
}


/*
 * Functions for questions popup
 */
Array.prototype.in_array = function ( obj ) {
	var len = this.length;
	for ( var x = 0 ; x <= len ; x++ ) {
		if ( this[x] == obj ) return true;
	}
	return false;
}

function insertIntoOrderedDivList( parentDivId, insertDivId, divToCloneId, newDivId, useSibling ) {
	
	// Get link div objects
	var parentDiv = document.getElementById( parentDivId );
	var insertAfterDiv = document.getElementById( insertDivId );
	var divToClone = document.getElementById( divToCloneId );
	
	//	Create final div, populate from current final element
	var newDiv = divToClone.cloneNode( true );
	newDiv.id = newDivId;
	newDiv.style.display = 'block';
	
	if ( insertAfterDiv ) {
		// Insert the new node
		if ( useSibling ) {
			insertAfterDiv.parentNode.insertBefore( newDiv, insertAfterDiv.nextSibling );
		} else {
			insertAfterDiv.parentNode.insertBefore( newDiv, insertAfterDiv );
		}
	} else {
		// Append the new node
		parentDiv.appendChild( newDiv );
	}
}


function identifyAssignedQuestions() {
	var opener_ids1 = new Array();
	var opener_ids2 = new Array();
	
	if ( curr_section == 1 ) {
		var myOpenerCbsCurr = window.opener.document.getElementById( 'test_questions_1' ).getElementsByTagName('input');
		var myOpenerCbsOther = window.opener.document.getElementById( 'test_questions_2' ).getElementsByTagName('input');
	} else if ( curr_section == 2 ) {
		var myOpenerCbsOther = window.opener.document.getElementById( 'test_questions_1' ).getElementsByTagName('input');
		var myOpenerCbsCurr = window.opener.document.getElementById( 'test_questions_2' ).getElementsByTagName('input');
	}
	

	var cbs = document.getElementById('test_cb_form').getElementsByTagName('input');
	var j = 0;
	
	for ( var i in myOpenerCbsCurr ) {
		if ( myOpenerCbsCurr[i].getAttribute && myOpenerCbsCurr[i].getAttribute('type') == 'checkbox' && myOpenerCbsCurr[i].checked && myOpenerCbsCurr[i].id ) {
			opener_ids1[j] = myOpenerCbsCurr[i].id;
			j++;
		}
	}

	for ( var i in cbs ) {
		if ( cbs[i].getAttribute && cbs[i].getAttribute('type') == 'checkbox' && cbs[i].value && opener_ids1 && opener_ids1.in_array( cbs[i].id ) ) {
			cbs[i].checked = true;
			document.getElementById( 'name_' + cbs[i].id ).className = 'question_selected';
		}
	}
	
	var j = 0;
	for ( var i in myOpenerCbsOther ) {
		if ( myOpenerCbsOther[i].getAttribute && myOpenerCbsOther[i].getAttribute('type') == 'checkbox' && myOpenerCbsOther[i].checked && myOpenerCbsOther[i].id ) {
			opener_ids2[j] = myOpenerCbsOther[i].id;
			j++;
		}
	}
	
	for ( var i in cbs ) {
		if ( cbs[i].getAttribute && cbs[i].getAttribute('type') == 'checkbox' && cbs[i].value && opener_ids2 && opener_ids2.in_array( cbs[i].id ) ) {
			cbs[i].setAttribute( 'disabled', 'disabled' );
			document.getElementById( 'name_' + cbs[i].id ).className = 'question_selected';
		}
	}
	
}

function getCheckboxes() {
	var checked_ids = new Array();
	var opener_ids = new Array();
	var return_ids = new Array();
	var delete_ids = new Array();
	var opener_not_checked_ids = new Array();
	var localCbxs = document.getElementById( 'test_cb_form' ).getElementsByTagName( 'input' );
	var myOpenerCbxs = window.opener.document.getElementById('test_questions_' + curr_section).getElementsByTagName( 'input' );
	
	var callingRef = document.getElementById( 'calling_ref' ).value;
	var positionRef = document.getElementById( 'position_ref' ).value;
	var finalLinkBlock = document.getElementById( 'final_link_block' ).value;
	
	if ( localCbxs ) {
		var j = 0;
		var k = 0;
		
		for ( var i in localCbxs ) {
			if ( localCbxs[i].getAttribute && localCbxs[i].getAttribute('type') == 'checkbox' && localCbxs[i].checked == true && localCbxs[i].id ) {
				checked_ids[j] = localCbxs[i].id;
				j++;
			}
			
			if ( localCbxs[i].getAttribute && localCbxs[i].getAttribute('type') == 'checkbox' && localCbxs[i].checked == false && localCbxs[i].id ) {
				delete_ids[k] = localCbxs[i].id;
				k++;
			}
		}
	}
	
	if ( myOpenerCbxs ) {
		j = 0;
		k = 0;
		
		for ( var i in myOpenerCbxs ) {
			if ( myOpenerCbxs[i] && myOpenerCbxs[i].getAttribute && myOpenerCbxs[i].getAttribute('type') == 'checkbox' && myOpenerCbxs[i].id ) {
				opener_ids[j] = myOpenerCbxs[i].id;
				j++;
				if ( myOpenerCbxs[i].checked == false ) {
					opener_not_checked_ids[k] = myOpenerCbxs[i].id;
					k++;
				}
			}
		}
	}
	
	if ( checked_ids ) {
		j = 0;
		
		for ( var i = 0; i < checked_ids.length; i++ ) {
			if ( opener_ids && !opener_ids.in_array( checked_ids[i] ) ) {
				return_ids[j] = checked_ids[i];
				j++;
			} else if ( opener_not_checked_ids && opener_not_checked_ids.in_array( checked_ids[i] ) ) {
				window.opener.document.getElementById( checked_ids[i] ).checked = true;
			}
		}
	}
	
	// Currently not deleting from the question assign window
	//if ( delete_ids ) {
	//	for ( var i = 0; i < delete_ids.length; i++ ) {
	//		if ( delete_ids[i] && opener_ids.in_array( delete_ids[i] ) ) {
	//			var deleteElement = window.opener.document.getElementById( 'div_' + delete_ids[i] );
	//
	//			if ( deleteElement ) {
	//				deleteElement.parentNode.removeChild( deleteElement );
	//				document.getElementById( delete_ids[i] ).checked = false;
	//				document.getElementById( 'name_' + delete_ids[i] ).className = '';
	//			}
	//		}
	//	}
	//}
	
	if ( return_ids ) {
		for ( var i = 0; i < return_ids.length; i++ ) {
			var linkBlock = 'break';
			if ( i == return_ids.length - 1 ) {
				if ( finalLinkBlock == 'break' ) {
					linkBlock = 'normal';
				} else {
					linkBlock = 'break';
				}
			}
			
			window.opener.makeRemoteQuestion( curr_section, positionRef, return_ids[i], $('div_' + return_ids[i]).innerHTML, linkBlock );
			window.opener.setLinksToNormal( callingRef );
			document.getElementById( return_ids[i] ).checked = true;
			document.getElementById( 'name_' + return_ids[i] ).className = 'question_selected';
		}
	}
}

function makeQuestion( currSection, positionRef, questionTag, divText, nonActiveLinksSection ) {
	
	var numQuestions = eval( $( 's_' + currSection + '_num_questions' ).value ) + 1;
	var newQuestionSortTag = 's_' + currSection + '_q_' + numQuestions;
	
	// Add the question div
	insertIntoOrderedDivList( 'section_' + currSection + '_questions', positionRef, 'question_div_template', newQuestionSortTag, false );
	
	// Get question container element
	var myQuestionDiv = document.getElementById( newQuestionSortTag ).getElementsByTagName( 'div' ).item( 0 );
	myQuestionDiv.id = 'div_' + questionTag;
	myQuestionDiv.innerHTML = divText;
	
	// Essential modifications to checkbox inputs
	document.getElementById( questionTag ).setAttribute( 'name', 'form[sections][' + currSection + '][question_ids][]' );
	document.getElementById( questionTag ).className = 'no_style';
	document.getElementById( questionTag ).checked = true;
	
	// Add links divs, added before the position_ref div
	insertIntoOrderedDivList( 'section_' + currSection + '_questions', positionRef, 'section_links_template_break', newQuestionSortTag + '_links_break', false );
	insertIntoOrderedDivList( 'section_' + currSection + '_questions', positionRef, 'section_links_template_normal', newQuestionSortTag + '_links_normal', false );
	
	// replace in links
	var divText = document.getElementById( newQuestionSortTag + '_links_break' ).innerHTML;
	divText = divText.replace( /POSITION_REF/g, newQuestionSortTag );
	divText = divText.replace( /SECTION_NUM_REF/g, currSection );
	divText = divText.replace( /QUESTION_FLAG/g, 'true' );
	document.getElementById( newQuestionSortTag + '_links_break' ).innerHTML = divText;
	
	var divText = document.getElementById( newQuestionSortTag + '_links_normal' ).innerHTML;
	divText = divText.replace( /POSITION_REF/g, newQuestionSortTag );
	divText = divText.replace( /SECTION_NUM_REF/g, currSection );
	divText = divText.replace( /QUESTION_FLAG/g, 'true' );
	document.getElementById( newQuestionSortTag + '_links_normal' ).innerHTML = divText;
	
	// Update num_questions field
	$( 's_' + currSection + '_num_questions' ).value = numQuestions;
	
	// Set the correct links div to active. 
	if ( document.getElementById( newQuestionSortTag + '_links_' + nonActiveLinksSection ) ) {
		document.getElementById( newQuestionSortTag + '_links_' + nonActiveLinksSection ).style.display = 'none';
	}
}


function showHideAllQuestionText( currContainer, newStyle ) {
	
	var ids = new Array();
	var localCbxs = document.getElementById( currContainer ).getElementsByTagName( 'input' );
	
	if ( localCbxs ) {
		for ( var i in localCbxs ) {
			if ( localCbxs[i] && localCbxs[i].getAttribute && localCbxs[i].getAttribute('type') == 'checkbox' && localCbxs[i].id ) {
				document.getElementById( 'text_' + localCbxs[i].id ).style.display = newStyle;
			}
		}
	}
}

function removeDeselectedQuestions( parentDivId ) {
	var delete_ids = new Array();
	var localCbxs = document.getElementById( parentDivId ).getElementsByTagName('input');
	 
	if ( localCbxs ) {
		var j = 0;
		for ( var i in localCbxs ) {
			if ( localCbxs[i] && localCbxs[i].getAttribute && localCbxs[i].getAttribute('type') == 'checkbox' && localCbxs[i].checked == false && localCbxs[i].id ) {
				delete_ids[j] = localCbxs[i].id;
				j++;
			}
		}
	}
	
	if ( delete_ids ) {
		for ( var i = 0; i < delete_ids.length; i++ ) {
			var deleteQuestionDiv = document.getElementById( 'div_' + delete_ids[i] );
			
			// Its parent's id will be the key
			var rootId = deleteQuestionDiv.parentNode.id;
			
			var deleteElementMain = document.getElementById( rootId );
			var deleteElementLinks1 = document.getElementById( rootId + '_links_break' );
			var deleteElementLinks2 = document.getElementById( rootId + '_links_normal' );
			
			if ( !deleteElementMain || !deleteElementLinks1 || !deleteElementLinks2 ) {
				return false;
			}
			
			// Need some indication if next container was a pagebreak or similar. Interpret from links style. Links1 is the 'break' links block.
			isPagebreakNext = false;
			if ( deleteElementLinks1.style.display.indexOf( 'block' ) > -1 ) {
				isPagebreakNext = true;
			}
			
			// Copy this question's link styles to the previous node, unless the previous one is a [[pagebreak]]
			
			var prevSibling = deleteElementMain;
			var stop = false;
			while ( !stop ) {
				prevSibling = prevSibling.previousSibling;
				if ( ( prevSibling.nodeName == 'DIV' && prevSibling.id.indexOf( 'links' ) == -1 ) || !prevSibling.previousSibling ) {
					stop = true;
					if ( prevSibling.previousSibling ) {
						var prevContainer = prevSibling;
					}
				}
			}
			
			if ( prevContainer ) {
				// Find out if pagebreak
				var children = prevContainer.getElementsByTagName( 'div' );
				var isPagebreak = false;
				for (var j in children ) {
					if ( children[j].id && children[j].id.indexOf( 'pagebreak' ) > -1 ) {
						isPagebreak = true;
					}
				}
				
				if ( isPagebreak ) {
					// Deleted question was preceded by a pagebreak. If next container is also a pagebreak, need to remove one of them, ideally the previous one.
					if ( isPagebreakNext ) {
						document.getElementById( prevContainer.id ).parentNode.removeChild( document.getElementById( prevContainer.id ) );
						document.getElementById( prevContainer.id + '_links_break' ).parentNode.removeChild( document.getElementById( prevContainer.id + '_links_break' ) );
						document.getElementById( prevContainer.id + '_links_normal' ).parentNode.removeChild( document.getElementById( prevContainer.id + '_links_normal' ) );
						// NB: In this case of pagebreak deletion, should not need to modify previous container's links, as we already know that the following container is a pagebreak.
					} else {
						document.getElementById( prevContainer.id + '_links_break' ).style.display = 'block';
						document.getElementById( prevContainer.id + '_links_normal' ).style.display = 'none';
					}
				} else {
					document.getElementById( prevContainer.id + '_links_break' ).style.display = deleteElementLinks1.style.display;
					document.getElementById( prevContainer.id + '_links_normal' ).style.display = deleteElementLinks2.style.display;
				}
			}
			
			deleteElementMain.parentNode.removeChild( deleteElementMain );
			deleteElementLinks1.parentNode.removeChild( deleteElementLinks1 );
			deleteElementLinks2.parentNode.removeChild( deleteElementLinks2 );
		}
	}
}

function addPageBreak( currSection, positionRef ) {
	
	var numQuestions = eval( $( 's_' + currSection + '_num_questions' ).value ) + 1;
	var newQuestionDivId = 's_' + currSection + '_q_' + numQuestions;
	var newQuestionDivLinksId = newQuestionDivId + '_links_break';
	
	// Insert, links first, then pagebreak before it
	insertIntoOrderedDivList( 'section_' + currSection + '_questions', positionRef, 'section_links_template_normal', newQuestionDivId + '_links_normal', true );
	insertIntoOrderedDivList( 'section_' + currSection + '_questions', newQuestionDivId + '_links_normal', 'section_links_template_break', newQuestionDivLinksId, false );
	insertIntoOrderedDivList( 'section_' + currSection + '_questions', newQuestionDivLinksId, 'pagebreak_div_template', newQuestionDivId, false );
	
	// Set the correct links div to active. 
	document.getElementById( newQuestionDivId + '_links_normal' ).style.display = 'none';
	
	// replace in pagebreak
	var divText = document.getElementById( newQuestionDivId ).innerHTML;
	divText = divText.replace( /POSITION_REF/g, newQuestionDivId );
	divText = divText.replace( /SECTION_NUM_REF/g, currSection );
	divText = divText.replace( /QUESTION_FLAG/g, 'false' );
	document.getElementById( newQuestionDivId ).innerHTML = divText;
	
	// replace in pagebreak links
	var divText = document.getElementById( newQuestionDivLinksId ).innerHTML;
	divText = divText.replace( /POSITION_REF/g, newQuestionDivId );
	divText = divText.replace( /SECTION_NUM_REF/g, currSection );
	divText = divText.replace( /QUESTION_FLAG/g, 'false' );
	document.getElementById( newQuestionDivLinksId ).innerHTML = divText;
	
	// Update num_questions field
	$( 's_' + currSection + '_num_questions' ).value = numQuestions;
	
	// Reverse the display of links just clicked
	var linksOtherRef = positionRef;
	if ( linksOtherRef.indexOf( 'break' ) > 0 ) {
		linksOtherRef = linksOtherRef.replace( /break/, 'normal' );
	} else {
		linksOtherRef = linksOtherRef.replace( /normal/, 'break' );
	}
	document.getElementById( positionRef ).style.display = 'none';
	document.getElementById( linksOtherRef ).style.display = 'block';
}

function delPageBreak( divContext ) {
	
	// This assumes that:
	//	- pagebreak cannot be the first element, so there is always a previousSibling
	//	- there are two linkd divs prior to a pagebreak, as a questions will always have both available
	
	// Switch the previous question's add_break link back on
	var prevSibling = document.getElementById( divContext );
	var stop = false;
	
	while ( !stop ) {
		prevSibling = prevSibling.previousSibling;
		if ( ( prevSibling.nodeName == 'DIV' && prevSibling.id.indexOf( '_links_' ) > -1 ) || !prevSibling.previousSibling ) {
			stop = true;
			var prevContainer = prevSibling;
		}
	}
			
	if ( prevContainer && prevContainer.style ) {
		// If order has been preserved, prevSibling will be a question's normal links, and prev.prev the break links
		prevContainer.style.display = 'block';
		var otherLinksDivId = prevContainer.id.replace( /normal/, 'break' );
		if ( document.getElementById( otherLinksDivId ) ) {
			// Do this check to ensure graceful degradation if there are inconsistencies
			document.getElementById( otherLinksDivId ).style.display = 'none';
		}
	}
	
	// Then pagebreak div
	var deleteElement = document.getElementById( divContext );
	if ( deleteElement ) {
		deleteElement.parentNode.removeChild( deleteElement );
	}
	
	// Then pagebreak links div
	deleteElement = document.getElementById( divContext + '_links_break' );
	if ( deleteElement ) {
		deleteElement.parentNode.removeChild( deleteElement );
	}
	
}


function showPrint( id ) {
	var obj = $( id );
	if ( obj.className == 'hidden' ) {
		obj.className = 'hidden_print';
	} else {
		obj.className = 'hidden';
	}
}

function switchPasswordFields( first_id, second_id, switch_type, lang_const ) {
	
	switch ( switch_type ) {
		
		case 1:
			
			if( $( first_id ).getElementsByTagName( 'input' )[0].value == lang_const ) {
				showHideObject( first_id );
				showHideObject( second_id );
				
				$( second_id ).getElementsByTagName( 'input' )[0].focus();
			}
			
		break;
		
		case 2:
			
			if( $( second_id ).getElementsByTagName( 'input' )[0].value == '' ) {
				showHideObject( first_id );
				showHideObject( second_id );
			}
			
		break;
	}
}

var question_answers_counts = new Array();

function countChecked( question_id, checkbox_id, direction ) {
	
	if ( direction == 'inc' ) {
		
		if ( question_answers_counts[question_id]['count'] < question_answers_counts[question_id]['max_answers'] ) {
			
			question_answers_counts[question_id]['count']++;
			return true;
			
		} else {
			
			document.forms['test_solve_form'][checkbox_id].checked = false;
			return false;
		}
		
	} else {
		
		if ( question_answers_counts[question_id]['count'] > 0 ) {
			
			question_answers_counts[question_id]['count']--;
		}
	}
}

/**
 * Add your school members
 */
function addLine() {
	
	var teacher_lines_iter = parseInt( $( 'teacher_lines_iter' ).value ) + 1;
	
	// get prototype for copy
	var objAnswerPrototype = $( 'teacher_line' );
	
	// create new temp row element
	var tempRow = document.createElement( 'tr' );
	tempRow.innerHTML = objAnswerPrototype.innerHTML;
	
	var selects = tempRow.getElementsByTagName( 'select' );
	selects[0].name = 'form[' + teacher_lines_iter + '][user_title]';
	
	
	// building new row
	var objParent = $( 'teacher_lines' ).getElementsByTagName( 'tbody' )[0];
	var row = document.createElement( 'tr' );
	
	var td_1 = document.createElement( 'td' );
	var td_2 = document.createElement( 'td' );
	var td_3 = document.createElement( 'td' );
	var td_4 = document.createElement( 'td' );
	
	var input_1 = document.createElement( 'input' );
	var input_2 = document.createElement( 'input' );
	var input_3 = document.createElement( 'input' );
	input_1.name = 'form[' + teacher_lines_iter + '][user_name]';
	input_2.name = 'form[' + teacher_lines_iter + '][user_surname]';
	input_3.name = 'form[' + teacher_lines_iter + '][user_email]';
	
	td_1.appendChild( selects[0] );
	td_2.appendChild( input_1 );
	td_3.appendChild( input_2 );
	td_4.appendChild( input_3 );
	
	row.appendChild( td_1 );
    row.appendChild( td_2 );
    row.appendChild( td_3 );
    row.appendChild( td_4 );
	
    objParent.appendChild( row );
	
	// increase iterator
	$( 'teacher_lines_iter' ).value = teacher_lines_iter;
}

function ObjectCookie( object_id ) {
	var obj = $( object_id );
	
	if ( !obj ) {
	  return;
	}
	
	showHideObject( object_id );
	
	if( $(object_id).style.display == 'none') {
		setDataToCookie( object_id, 'hidden');
	} else {
		setDataToCookie( object_id, 'active');
	}
}

function changeCorrectAnswersCount( element ) {
	
	var count = parseInt( $('question_correct_answers').value );

	if ( element.checked == true ) {
		$('question_correct_answers').value = count+1;
	} else if ( element.checked == false ) {
		$('question_correct_answers').value = count-1;
	}
}

function changeSubjects( selected, id, empty_value ) {
	
	if ( examSubjects ) {
		changeDropdownValues ( selected, id, empty_value, examSubjects );
	}
}

function changeTopics( selected, id, empty_value ) {
	
	if ( examTopics ) {
		changeDropdownValues ( selected, id, empty_value, examTopics );
	}
}

function changeDropdownValues( selected, id, empty_value, data ) {
	
	var element = $( id );
	var iterator = 1;
	
	element.options.length = 0;
	
	if( empty_value != '' ) {
		element.options[0] = new Option( empty_value, 0 );
	}
	
	for ( var i in data[selected] ) {
		if ( data[selected][i] && typeof data[selected][i] == 'string' ) {
			element.options[iterator] = new Option( data[selected][i], i );
			iterator = iterator + 1;
		}
	}
	
	if( empty_value != '' ) {
		element.options[0].selected = true;
	} else {
		element.options[0] = null;
	}
}