jQuery.noConflict();
var timeoutMsg = '';

/**
 * ajax - wrapper based on prototype to do custom ajax calls
 * @param request {boolean} 'post' or true=POST, 'get' or false=GET
 * @param action {string} url to call
 * @param option {string} optional info to send with call
 * @param e {string} html tag id where to send response
 * @param form {string} if we are POSTing name of form
 * @param confirm {string} optional message to request confirmation from user
 * @param execute {string} optional extra js function to execute after this request is complete
 * @return false
 */
function ajax (request, action, option, e, form, confirm, execute, exec_params, load_text)
{
	// check GET params
	params = window.location.href.toQueryParams();
	// by default with don't need confirmation
	var go = true;
	if (confirm)
	{
		go = window.confirm(confirm);
	}
	// inject our base params
	parameters = new Hash();
    parameters.set('option', option);
	if (params['lang'])
	{
		parameters.set('lang', params['lang']);
	}
    else
    {
        parameters.lang = '';
    }
	// our followup function needs to execute with params
	if (exec_params)
	{
		execute = String(execute+'("'+exec_params+'")');
	}
	// set load image location
	if (go)
	{
        if (!load_text) load_text = '';
		ajaxShowLoadingImage(e, request, load_text);
	}
	// process regular get requests
	if ((!request || request == 'get' || request == 'geth') && go)
	{
		var myAjax = new Ajax.Request(action, {
			method: 'get',
			parameters: parameters,
            timeoutDelay: 30,
            onFailure: ajaxTimeout,
            onTimeout: ajaxTimeout,
			onComplete: function (transport) {
				ajaxHideLoadingImage(e);
				$(e).innerHTML = transport.responseText;
				if (execute)
				{
					eval(execute);
				}
			}
		});
	}
	// process form post requests
	else if ((request || request == 'post') && go)
	{
		if ($(form))
		{
            // add hidden element for option
            var o = document.createElement('INPUT');
            o.setAttribute('type', 'hidden');
            o.setAttribute('name', 'option');
            o.setAttribute('value', option);
    		$(form).appendChild(o);
            // submit form
			$(form).request({
                onFailure: ajaxTimeout,
                onTimeout: ajaxTimeout,
				onComplete: function (transport) {
					ajaxHideLoadingImage(e);
					$(e).innerHTML = transport.responseText;
					if (execute)
					{
						eval(execute);
					}
				}
			});
		}
		else
		{
            ajaxHideLoadingImage(e);
			if (execute)
			{
				eval(execute);
			}
		}
	}
	return false;
}

/**
 * hide possible secondary image location
 */
function ajaxHideLoadingImage(target)
{
	if ($(target+'_load'))
	{
        showElement(target);
		target = target + '_load';
		hideElement(target);
	}
}

/**
 * show ajax load image
 */
function ajaxShowLoadingImage(target, request)
{
	if ($(target+'_load'))
	{
        if (request == 'post' ||  request == 'get')
        {
            hideElement(target);
        }
		target = target + '_load';
		$(target).innerHTML = '<img src="'+baseUrl+'/images/default/ajax_loader.gif" class="vmiddle">';
		showElement(target);
	}
}

/**
 * ajax timeout
 */
var ajaxTimeout = function(arg)
{
    displayMessenger('messenger', timeoutMsg, 'error');
    /*
    if (arg.request.timeout)
        failureNode.update("failure has occured, server timeout at fault");
    else
        console.log("failure has occured, unknown causes.");
    */
}

var cX = 0; var cY = 0; var rX = 0; var rY = 0;
function UpdateCursorPosition(e){ cX = e.pageX; cY = e.pageY;}
function UpdateCursorPositionDocAll(e){ cX = event.clientX; cY = event.clientY;}
if(document.all) { document.onmousemove = UpdateCursorPositionDocAll; }
else { document.onmousemove = UpdateCursorPosition; }

function AssignPosition(e)
{
	if (self.pageYOffset)
	{
		rX = self.pageXOffset;
		rY = self.pageYOffset;
	}
	else if (document.documentElement && document.documentElement.scrollTop)
	{
		rX = document.documentElement.scrollLeft;
		rY = document.documentElement.scrollTop;
	}
	else if (document.body)
	{
		rX = document.body.scrollLeft;
		rY = document.body.scrollTop;
	}
	if (document.all)
	{
		cX += rX;
		cY += rY;
	}
	e.style.position = 'absolute';
	e.style.left = (cX+20) + "px";
	e.style.top = (cY-20) + "px";
}

	// classSelect - changes the css class of an element
function classSelect (id, offClass, onClass)
{
	if ($(id).hasClassName(onClass))
	{
		$(id).removeClassName(onClass);
		$(id).addClassName(offClass);
	}
	else
	{
		$(id).removeClassName(offClass);
		$(id).removeClassName(offClass);
		$(id).addClassName(onClass);
	}
}

/**
 * adds and removes the css that controls the highlight of a field
 *
 * @param string form_name
 * @param string field
 */
function changeFormStyle(form_name, field)
{
    // build our row selector
	var td = 'td_'+field;
    if (field.search(/langs/) >= 0)
    {
        td = 'td_langs';
    }
    if (field.search(/modules/) >= 0)
    {
        td = 'td_modules';
    }
    if (field == 'start' || field == 'end')
    {
        td = 'td_dates';
    }
    if (field.search(/question/) >= 0)
    {
        td = 'td_question-input';
    }
    // cycle all form fields to select our field and deselect all others
	var x = document.getElementById(form_name);
	for (var i=0; i<x.length; i++)
	{
        // current field
        var field_id = x.elements[i].id;
		var td_temp = 'td_'+field_id;
        // match special fields
        if (field_id.search(/langs/) >= 0)
        {
            td_temp = 'td_langs';
        }
        if (field_id.search(/modules/) >= 0)
        {
            td_temp = 'td_modules';
        }
        if (field_id == 'start' || field_id == 'end')
        {
            td_temp = 'td_dates';
        }
        if (field_id.search(/question/) >= 0)
        {
            td_temp = 'td_question-input';
            field = field_id;
        }
		if($(td_temp) != 'undefined' && $(td_temp) != null)
		{
            // select our field
			if(td_temp == td)
			{
                if ($(previous)) $(previous).removeClassName('unselected');
                $(field).removeClassName('unselected');
                $(field).addClassName('selected');
                $(td).removeClassName('unselected');
				$(td).addClassName('selected');
			}
            // its not our field so unselect it
			else
			{
                $(x.elements[i].id).removeClassName('selected');
                $(x.elements[i].id).addClassName('unselected');
				$(td_temp).removeClassName('selected');
                $(td_temp).addClassName('unselected');
			}
		}
        // store previous field for css adjustments
        if (x.elements[i].id != 'turing-id') var previous = td_temp;
	}
}

/**
 * checks if country exists
 *
 * @param country
 * @param countriesList
 */
function check_country (country, countriesList)
{
	var search = '';
	//cycle throw countries
	for (var i = 0; i < countriesList.length; i++)
	{
		//if contry is found
		if (country.toLowerCase() == countriesList[i].toLowerCase())
		{
			search = countriesList[i];
			continue;
		}
	}
	if (!search)
	{
		//clean location
		jQuery('#location').val('');
	}
	else
	{
		//add formated location
		jQuery('#location').val(search);
	}
}

/**
 * shows the messenger
 *
 * @param element - where to display the message on
 * @param msg - message to display (optional)
 * @param type - type of message (sucess, error), optional
 */
function displayMessenger(element, msg, type)
{
    // try to auto detect a type
    if (!type || type == 'undefined' || type == '')
    {
        if (!msg)
        {
            msg = $(element).innerHTML;
        }
        if (msg.search(/%S%/) > -1)
        {
            type = 'sucess';
            msg = msg.replace(/%S%/, " ");
        }
        else if (msg.search(/%E%/) > -1)
        {
            type = 'error';
            msg = msg.replace(/%E%/, " ");
        }
    }
    // add message
	if (msg)
	{
		$(element).innerHTML = msg;
	}
    // change aspect according to type
    if (type)
    {
        if (type == 'sucess')
        {
            $(element).addClassName('sucess_bg');
            $(element).innerHTML = '<img src="'+baseUrl+'/images/default/messenger_sucess_dark.png" class="vmiddle">' + ' ' + $(element).innerHTML;
        }
        else if (type == 'error')
        {
            $(element).innerHTML = '<img src="'+baseUrl+'/images/default/messenger_error_dark.png" class="vmiddle">' + ' ' + $(element).innerHTML;
        }
    }
    // display
	showElement(element);
	window.setTimeout(function() { hideElement(element); }, 5000);
}

/**
 * Displays the given element in the given position of other element
 *
 * @param target{string} - element to show
 * @param ref {string} - element
 * @param position {string} - position of the element to show
 */
function displayOn(target, ref, position)
{
	if ($(ref) && !$(ref).id)
	{
		document.body.appendChild($(ref));
	}
	var ref_ele = getAbsolutePos($(ref))
	showElement(target);
	//document.body.appendChild($(target));
	//left bottom left-point
	if(position == 'lb1')
	{
		$(target).style.left = parseFloat(ref_ele.x) - parseFloat($(target).offsetWidth) + "px";
		$(target).style.top = parseFloat(ref_ele.y) + parseFloat($(ref).offsetHeight) + "px";
	}
	//left bottom right-point
	else if(position == 'lb2')
	{
		$(target).style.left = parseFloat(ref_ele.x) + "px";
		$(target).style.top = parseFloat(ref_ele.y) + parseFloat($(ref).offsetHeight) + "px";
	}
	//right bottom left-point
	else if(position == 'rb1')
	{
		$(target).style.left = parseFloat(ref_ele.x) + parseFloat($(ref).offsetWidth) - parseFloat($(target).offsetWidth) + "px";
		$(target).style.top = parseFloat(ref_ele.y) + parseFloat($(ref).offsetHeight) + "px";
	}
	//right bottom right-point
	else if(position == 'rb2')
	{
		$(target).style.left = parseFloat(ref_ele.x) + parseFloat($(ref).offsetWidth) + "px";
		$(target).style.top = parseFloat(ref_ele.y) + parseFloat($(ref).offsetHeight) + "px";
	}
	//left top left-point
	else if(position == 'lt1')
	{
		$(target).style.left = parseFloat(ref_ele.x) - parseFloat($(target).offsetWidth) + "px";
		$(target).style.top = parseFloat(ref_ele.y) - parseFloat($(target).offsetHeight) + "px";
	}
	//left top right-point
	else if(position == 'lt2')
	{
		$(target).style.left = parseFloat(ref_ele.x) + "px";
		$(target).style.top = parseFloat(ref_ele.y) - parseFloat($(target).offsetHeight) + "px";
	}
	//right top left-point
	else if(position == 'rt1')
	{
		$(target).style.left = parseFloat(ref_ele.x) + parseFloat($(ref).offsetWidth) - parseFloat($(target).offsetWidth) + "px";
		$(target).style.top = parseFloat(ref_ele.y) - parseFloat($(target).offsetHeight) + "px";
	}
	//right top right-point
	else if(position == 'rt2')
	{
		$(target).style.left = parseFloat(ref_ele.x) + parseFloat($(ref).offsetWidth) + "px";
		$(target).style.top = parseFloat(ref_ele.y) - parseFloat($(target).offsetHeight) + "px";
	}
    //right top left-point inside
	else if(position == 'rti1')
	{
		$(target).style.left = parseFloat(ref_ele.x) + parseFloat($(ref).offsetWidth) - parseFloat($(target).offsetWidth) + "px";
		$(target).style.top = parseFloat(ref_ele.y) - parseFloat($(target).offsetHeight) + parseFloat($(target).offsetHeight) + "px";
	}
     //right top left-point outside
	else if(position == 'rti2')
	{
		$(target).style.left = parseFloat(ref_ele.x) + parseFloat($(ref).offsetWidth) + "px";
		$(target).style.top = parseFloat(ref_ele.y) - parseFloat($(target).offsetHeight) + parseFloat($(target).offsetHeight) + "px";
	}
    $(target).style.position = 'absolute';
    $(target).style.display = 'block';
    $(target).style.zIndex = "50";
	//if target is inside of a modal window
	if ($('modal'))
	{
		$(target).style.zIndex = parseFloat($('modal').style.zIndex) + parseFloat(1);
	}
}

function getAbsolutePos(el)
{
	var SL = 0, ST = 0;
	var is_div = /^div$/i.test(el.tagName);
	if (is_div && el.scrollLeft)
		SL = el.scrollLeft;
	if (is_div && el.scrollTop)
		ST = el.scrollTop;
	var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
	if (el.offsetParent) {
		var tmp = this.getAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
}

/**
 * drop down main menu
 */
function dropdownMenu()
{
		// get all modules (main links)
	var modules = $('menubar').getElementsByTagName("li");
	if (modules)
	{
			// apply event functions to all modules
		for(i=0;i<modules.length;i++)
		{
				// shows children
			modules[i].onmouseover=function(){
				if (this.className == 'menubar')
				{
					$(this).childElements()[1].className = 'submenuOn';
				}
			};
				// hides children
			modules[i].onmouseout=function(){
				if (this.className == 'menubar')
				{
					$(this).childElements()[1].className = 'submenuOff';
				}
			};
		}
	}
}

/**
 * add help comments to form tags
 *
 * @param form {string}
 */
function formHelper(form)
{
	elements = $(form).getElements();
	if (elements)
	{
		for(i=0; i<elements.length; i++)
		{
			if (!$(elements[i]).readAttribute('onfocus'))
			{
				elements[i].onfocus=function(){
					if ($(this).readAttribute('help'))
					{
						help = 'helper';
						if (!$(help).hasClassName('help'))
						{
							$(help).addClassName('help hidden font nano textleft');
						}
						$(help).innerHTML = $(this).readAttribute('help');
                        // we might have a support element to index our help
                        if ($($(this).readAttribute('id')+'_help'))
                        {
                            displayOn(help, $(this).readAttribute('id')+'_help', 'rti2');
                        }
                        // just display next to element
                        else
                        {
                            displayOn(help, $(this).readAttribute('id'), 'rti2');
                        }
                        changeFormStyle(form, $(this).readAttribute('id'));
					}
				}
				elements[i].onblur=function(){
					if ($(this).readAttribute('help'))
					{
						help = 'helper';
						hideElement(help);
					}
				}
			}
		}
	}
}

/**
 * get viewport from browser
 */
function getBrowserDimensions()
{
	var viewport = { x: 0, y: 0 };
	if (Prototype.Browser.IE) {
		viewport.height = document.documentElement.clientHeight;
		viewport.width = document.documentElement.clientWidth;
	} else {
		viewport.height = window.innerHeight;
		viewport.width = document.width || document.body.offsetWidth;
	}
	return viewport;
}

/**
 * hides an element using css class
 *
 * @param e {string}
 */
function hideElement(e)
{
	if ($(e))
	{
		$(e).removeClassName('visible');
		$(e).addClassName('hidden');
	}
}

/**
 * hides a floating element
 *
 * @param e {string}
 */
function hideFloat(e)
{
	if (e.length < 1) { return; }
	$(e).removeClassName('show');
	$(e).removeClassName(e);
	$(e).addClassName('hidden');
}

/**
 * opens an ajax in a modal window
 *
 * @param width {string} width of modal window
 * @param height {string} height of modal window
 * @param element {string} element name for modal window
 * @param closeText {string} text to close window
 * @param closeImage {string} image to close window
 * @param closeFunction {string} function to execute after closure
 */
function modalWindowOpen(width, height, element, closeText, closeImage, closeFunction)
{
	// get viewport and center point
	viewport = getBrowserDimensions();
	var center = { x: 0, y: 0 };
	center.height = viewport.height/2;
	center.width = viewport.width/2;
	// build overlay
	var overlay = Element.extend(document.createElement('div'));
	overlay.writeAttribute('id', 'overlay');
	overlay.observe('click', function(){
		modalWindowClose(closeFunction);
	});
	overlay.setStyle({
		top:0,
		left:0,
		zIndex:999,
		backgroundColor:'black',
		opacity:'0.7',
		position:'absolute',
		width:'100%',
		height:viewport.height+'px',
		display:'none'
	});
	// build modal window
	var modal = Element.extend(document.createElement('div'));
	modal.writeAttribute('id', 'modal');
	modal.setStyle({
		top:(center.height-height/2)+'px',
		left:(center.width-width/2)+'px',
		zIndex:1001,
		backgroundColor:'#163342',
		position:'absolute',
		width:width+'px',
		height:height+'px',
		overflow:'auto',
		display:'none'
	});
	// build close button
	var modalClose = Element.extend(document.createElement('div'));
	modalClose.setAttribute('id', 'modalClose');
	modalClose.observe('click', function(){
		modalWindowClose(closeFunction);
	});
	modalClose.setStyle({
		top:(center.height-(20+height/2))+'px',
		left:(center.width-width/2)+'px',
		zIndex:1001,
		color:'white',
		position:'absolute',
		width:width+'px',
		height:'20px',
		textAlign:'right',
		display:'none'
	});
	modalClose.addClassName('link font normal bold');
	modalClose.innerHTML = closeText;
	if(closeImage)
	{
		modalClose.innerHTML = modalClose.innerHTML + ' <img src="'+ closeImage + '" class="vmiddle"/>';
	}
	// build out content element
	var content = Element.extend(document.createElement('div'));
	content.setAttribute('id', element);
	content.setStyle({
		position:'relative',
		display:'none'
	});
	// build out content loading element
	var contentLoad = Element.extend(document.createElement('div'));
	contentLoad.setAttribute('id', element+'_load');
	contentLoad.setStyle({
		position:'relative'
	});
	// add our modal elements to the document body for display
	var body = document.getElementsByTagName('body')[0];
	body.appendChild(overlay);
	body.appendChild(modal);
	modal.appendChild(content);
	modal.appendChild(contentLoad);
	body.appendChild(modalClose);
	// display our modal element
	overlay.show();
	modal.show();
	modalClose.show();
	content.show();
}

/**
 * destroys modal elements thus closing modal window and execute a function
 *
 * @param closeFunction {string}
 */
function modalWindowClose(closeFunction)
{
	var body = document.getElementsByTagName('body')[0];
	body.removeChild($('modal'));
	body.removeChild($('modalClose'));
	body.removeChild($('overlay'));
	if(closeFunction)
	{
		eval(closeFunction);
	}
}

function openCalendar(field, related)
{
	Calendar.setup({
		inputField:		field,
		ifFormat:			"%Y-%m-%d",
		showOthers:		true,
		weekNumbers: 	false,
		range:			[2000,2100],
		align:				'cR',
		onUpdate: 		setRelated
	});
}

function reverseFloat(d)
{
	if (d.length < 1) { return; }
	var e = $(d);
	AssignPosition(e);
	if ($(e).hasClassName('hidden'))
	{
		$(e).removeClassName('hidden');
		$(e).addClassName('show');
		$(e).addClassName(d);
	}
	else
	{
		$(e).removeClassName('show');
		$(e).removeClassName(d);
		$(e).addClassName('hidden');
	}
}

/**
 * reverses the current visibility of an element
 *
 * @param string e
 */
function reverseVisibility (e)
{
	if ($(e).hasClassName('hidden'))
	{
		$(e).removeClassName('hidden');
		$(e).addClassName('show');
	}
	else
	{
		$(e).removeClassName('show');
		$(e).addClassName('hidden');
	}
}

function selector(field, value)
{
	for (i=0; i<$(field).length; i++)
	{
		if ($(field).options[i].value == value)
		{
			$(field).selectedIndex=i;
			break;
		}
	}
}

/**
 * changes the innerHTML of an element
 *
 * @param content
 * @param element
 */
function setContent(content, element)
{
    $(element).innerHTML = content;
}

/**
 * supplies an handy calendar selector
 *
 * @param field {string} where to tie the calendar to
 * @param relative {string} opens the calendar with
 */
function setRelated(calendar)
{
	if ($('end') && $('start'))
	{
		date1 = $('start').value.split('-');
		date2 = $('end').value.split('-');
		var startDate = new Date(date1[0], date1[1], date1[2]);
		var endDate = new Date(date2[0], date2[1], date2[2]);
	}
	if ($('end') && $('start') && $('start') == calendar.params.inputField)
	{
		$('end').value = $('start').value;
	}
	else if ($('end') && $('start') && startDate>endDate)
	{
		$('end').value = $('start').value;
	}
}

/**
 * sets the translated timeout msg
 *
 * @param msg {string}
 */
function setTimeoutMsg(msg)
{
    timeoutMsg = msg;
}

function showElement(e)
{
	if ($(e))
	{
		$(e).removeClassName('hidden');
		$(e).addClassName('visible');
	}
}

/**
 * shows an element next to the mouse
 *
 * @param d {string} element to display
 */
function showFloat(d)
{
	if (d.length < 1) { return; }
	var e = $(d);
	AssignPosition(e);
	$(e).removeClassName('hidden');
	$(e).addClassName('show');
	$(e).addClassName(d);
}

/**
 * show waiting image
 *
 * @param target {string} what to replace to show waiting image
 * @param text {string} text to show next to image
 */
function showWaiting(target, text)
{
	if ($(target))
	{
		$(target).innerHTML = '<img src="'+baseUrl+'/images/default/ajax_loader.gif" class="vmiddle">' + ' ' + text;
	}
}
