/**
 * @desc    kMagic JavaScript Library
 * @author  kubus media
 * @package kMagic
 */



// === WINDOW =====================================================================================

/**
 * @desc   Opens new window and set focus to it
 * @param  url to open, name of window, options of windows
 * @return void
 */
function openWindow(url, name, options)
{
	var f = window.open(url, name, options);
	f.focus();
}



/**
 * @desc   Opens addtional window for picture preview
 * @param  url to open
 * @return void
 */
function openPicture(url)
{
	openWindow(
		url, 'picture', 
		'scrollbars=0,resizable=1,menubar=0,toolbar=0,location=0,status=0'
	);
}



// === CONFIRM ====================================================================================

/**
 * @desc   Displays confirm screen before deleting element
 * @param  element name
 * @return true on confirm, otherwise false
 */
function deleteElement(element)
{
	return confirm("Do you really want to delete '" + element + "\'?");
}



// === UPDATE =====================================================================================

/**
 * @desc   Updates form, image and div in picture list
 * @param  form key, form value, image key, image value, div key, div value
 * @return void
 */
function updateFormImageDiv(form_key, form_value, img_key, img_value, div_key, div_value)
{
	document.forms['edit_form'].elements[form_key].value = form_value;

	document.images[img_key].src = img_value;

	var image_name = document.getElementById(div_key);
	image_name.innerHTML = div_value;
}



/**
 * @desc   Updates element
 * @param  select menu pointer, element key
 * @return void
 */
function updateElement(select_menu, elem_key)
{
	if (select_menu.selectedIndex > -1)
	{
		select_value = select_menu.options[select_menu.selectedIndex].value;

		document.forms['edit_form'].elements[elem_key].value = select_value;
	}
}



/**
 * @desc   Updates image in picture list
 * @param  select menu pointer, image key
 * @return void
 */
function updateImage(select_menu, img_key)
{
	if (select_menu.selectedIndex > -1)
	{
		select_value = select_menu.options[select_menu.selectedIndex].value;

		document.images[img_key].src = select_value;
	}
}



// === MANAGE USER ================================================================================

// suffixes of fields to copy and empty - prefix is either 'shipping_' or 'billing_'
// to each element name, 'useredit[' and ']' are added
var field_suffixes = new Array(
	'company', 'name', 'phone', 'fax', 'cell_phone', 'address', 
	'location', 'zip_code', 'state', 'country'
);



/**
 * @desc   Copies all form elements defined by field_suffixes
 * @param  void
 * @return void
 */
function copyList()
{
	addressForm = document.forms['address_form'];

	for (var i = 0; i < field_suffixes.length; i++)
	{
		target_name = 'useredit[shipping_' + field_suffixes[i] + ']';
		source_name = 'useredit[billing_' + field_suffixes[i] + ']';

		addressForm.elements[target_name].value = addressForm.elements[source_name].value;
		addressForm.elements[target_name].readOnly = true;
	}
}



/**
 * @desc   Empties all form elements defined by field_suffixes
 * @param  void
 * @return void
 */
function emptyList()
{
	addressForm = document.forms['address_form'];

	for (var i = 0; i < field_suffixes.length; i++)
	{
		element_name = 'useredit[shipping_' + field_suffixes[i] + ']';

		addressForm.elements[element_name].value = "";
		addressForm.elements[element_name].readOnly = false;
	}
}



/**
 * @desc   Checks form elementsa
 * @param  void
 * @return void
 */
function checkContent()
{
	element_name = 'useredit[use_different_shipping]';

	if (getRadioValue(document.forms['address_form'].elements[element_name]) == 0)
	{
		copyList();
	}
}



// === RADIO ======================================================================================

/**
 * @desc   Gets value of given radio object
 * @param  radio object
 * @return radio value
 */
function getRadioValue(radioObject)
{
	for (var i = 0; i < radioObject.length; i++)
	{
		if (radioObject[i].checked)
		{
			return radioObject[i].value;
		}
	}

	return false;
}



/**
 * @desc   Sets value of given radio object
 * @param  radio object, radio value
 * @return void
 */
function setRadioValue(radioObject, radioValue)
{
	for (var i = 0; i < radioObject.length; i++)
	{
		radioObject[i].checked = false;

		if (radioObject[i].value == radioValue.toString())
		{
			radioObject[i].checked = true;
		}
	}
}



// === SELECT =====================================================================================

/**
 * @desc   Gets entry of given select menu
 * @param  selectMenu, selectValue
 * @return void
 */
function getSelectMenu(selectMenu)
{
	index = selectMenu.selectedIndex;

	if (index > 0)
	{
		return selectMenu.options[index].value;
	}
	else
	{
		return false;
	}
}



/**
 * @desc   Sets entry of given select menu
 * @param  selectMenu, selectValue
 * @return void
 */
function setSelectMenu(selectMenu, selectValue)
{
	for (var i = 0; i < selectMenu.length; i++)
	{
		if (selectMenu.options[i].value == selectValue)
		{
			selectMenu.selectedIndex = i;
			return;
		}
	}
}



// === SHOW / HIDE ================================================================================

/**
 * @desc   Shows or hides id, dependig on current state
 * @param  id
 * @return void
 */
function showHideID(id)
{
	element = document.getElementById(id);

	if (element.className == 'visible')
	{
		element.className = 'invisible';
	}
	else
	{
		element.className = 'visible';
	}
}



/**
 * @desc   Hides id
 * @param  id
 * @return void
 */
function hideID(id)
{
	element = document.getElementById(id);
	element.className = 'invisible';
}



/**
 * @desc   Shows id
 * @param  id
 * @return void
 */
function showID(id)
{
	element = document.getElementById(id);
	element.className = 'visible';
}



/**
 * @desc   Shows or hides id, dependig on length
 * @param  id, minimum length for showing
 * @return void
 */
function showHideIDByLength(id, length)
{
	element = document.getElementById(id);

	if (element.innerHTML.length >= length)
	{
		element.className = 'visible';
	}
	else
	{
		element.className = 'invisible';
	}
}



// === ENABLE / DISABLE ===========================================================================

/**
 * @desc   Enables element of form
 * @param  form name, element name
 * @return void
 */
function enableFormElement(form_name, element_name){
	document.forms[form_name].elements[element_name].disabled = false;
}



/**
 * @desc   Disables element of form
 * @param  form name, element name
 * @return void
 */
function disableFormElement(form_name, element_name){
	document.forms[form_name].elements[element_name].disabled = true;
}



// === ELEMENT ====================================================================================

/**
 * @desc   Sets text of element
 * @param  element id, element text
 * @return void
 */
function setElementText(id, text){
	element = document.getElementById(id);
	element.innerHTML = text;
}



/**
 * @desc   Gets text of element
 * @param  element id
 * @return element text
 */
function getElementText(id){
	element = document.getElementById(id);
	return element.innerHTML;
}



/**
 * @desc   Copies text of one element to another
 * @param  source element id, target element id
 * @return void
 */
function copyElementText(source_id, target_id)
{
	setElementText(target_id, getElementText(source_id));
}



// === INDEX ======================================================================================

/**
 * @desc   Returns index of next list element (round robin)
 * @param  current index, list length
 * @return next index
 */
function nextIndex(current_index, list_length)
{
	return (current_index + 1 < list_length ? current_index + 1 : 0);

}



/**
 * @desc   Returns index of previous list element (round robin)
 * @param  current index, list length
 * @return previous index
 */
function previousIndex(current_index, list_length)
{
	return (current_index - 1 < 0 ? list_length - 1 : current_index - 1);
}



// === TEXT =======================================================================================

/**
 * @desc   Shows part of a text
 * @param  text id, text to show id, text to show length, additional id to show
 * @return void
 */
function showTextPart(source_text_id, target_text_id, target_text_length, add_show_id)
{
	source_text_str = getElementText(source_text_id);

	if (source_text_str.length < target_text_length)
	{
		return;
	}

	source_text_array = source_text_str.split(' ');
	target_text_str   = '';

	for (i = 0; i < source_text_array.length; i++)
	{
		if (target_text_str.length + source_text_array[i].length + 1 > target_text_length)
		{
			break;
		}
		else
		{
			target_text_str += source_text_array[i] + ' ';
		}
	}

	setElementText(target_text_id, target_text_str + '...');

	hideID(source_text_id);
	showID(target_text_id);

	if (add_show_id != '')
	{
		showID(add_show_id);
	}
}
