/**
 * Breakwater
 *
 * Javascript object for handling submitting of forms
 * via Ajax.
 *
 * Christoffer Landtman <landtman at realnode.com>
 * Erik Berglund <berglund at realnode.com>
 * Copyright (C) 2003-2006 Oy Realnode Ab
 */

var Timeout = null;
var bw_row_element_clicked = false;

var isIE, isSafari, isOpera, isMozilla = false;
if (navigator.userAgent.indexOf('MSIE') != -1) {
	isIE = true;
} else if (navigator.userAgent.indexOf('Safari') != -1) {
	isSafari = true;
} else if (navigator.userAgent.indexOf('Opera') != -1) {
	isOpera = true;
} else {
	isMozilla = true;
}

function bw_show_element(element_id, e) {
	var positions = bw_cursor_position(e);
	var x = positions[0];
	var y = positions[1];
	
	// Reassure that help box is not out of bounds
	if(y + bw_get_element(element_id).offsetHeight > document.body.scrollTop + document.body.clientHeight) {
		y = document.body.scrollTop + document.body.clientHeight - bw_get_element(element_id).offsetHeight - 10;
	}
	
	if(x + bw_get_element(element_id).offsetWidth > document.body.scrollLeft + document.body.clientWidth) {
		y = document.body.scrollLeft + document.body.clientWidth - bw_get_element(element_id).offsetWidth - 10;
	}

	_bw_perform_element(element_id, x, y);
}

function bw_show_delayed_element(element_id, e) {
	// Default timeout
	var time = 500;
	
	var positions = bw_cursor_position(e);
	var x = positions[0];
	var y = positions[1];
	
	// Reassure that element is not out of bounds
	if(document.all) {
		if(y + bw_get_element(element_id).offsetHeight > document.body.scrollTop + document.body.clientHeight) {
			y = y - bw_get_element(element_id).offsetHeight - 15;
		}
		
		if(x + bw_get_element(element_id).offsetWidth > document.body.scrollLeft + document.body.clientWidth) {
			x = x - bw_get_element(element_id).offsetWidth - 15;
		}
	} else if (document.getElementById) {
		if(y + bw_get_element(element_id).offsetHeight > window.innerHeight) {
			y = y - bw_get_element(element_id).offsetHeight - 15;
		}
	
		if(x + bw_get_element(element_id).offsetWidth > document.body.offsetWidth) {
			x = x - bw_get_element(element_id).offsetWidth - 15;
		}
	}

	var variables = "'" + element_id + "', '" + x + "', '" + y +"'";
	eval('Timeout = setTimeout("_bw_perform_element(' + variables + ')",' + time + ')');
}

function _bw_perform_element(element_id, x, y) {
	if (x != "undefined" && y != "undefined") {
		var element = bw_get_element(element_id);
		element.style.left = x;
		element.style.top = y;
		element.style.visibility = "visible";
	}
}

function bw_cursor_position(e) {
	x = (window.Event) ? e.pageX : event.clientX;
	y = (window.Event) ? e.pageY : event.clientY;
	return [x, y];
}

function bw_get_element(id) {
	// Internet Explorer
	if (document.all) {
		return document.all[id];
	}
	// Mozilla, Firefox and derivatives
	else if (document.getElementById) {
		return document.getElementById(id);
	}
	// Old NS
	else if (document.layers) {
		return document.layers[id];
	}
	else {
		return null;
	}
}

function bw_hide_element(element_id) {
	// Check if we have a delayed show
	if(Timeout != undefined) {
		clearTimeout(Timeout);
	}

	var element = bw_get_element(element_id);
	element.style.visibility = "hidden";
}

function bw_hide_delayed_element(element_id, wait) {
	var hide_timeout = setTimeout("bw_hide_element('" + element_id + "')", wait);
}

function bw_encode_url(url) {
	// Encode url
	url = encodeURIComponent(url);
	
	// Handle Score (#)
	if(url.indexOf("#") != -1) {
		url = url.replace(/#/g, "%23");
	}
	
	return url;
}

function bw_new_window(url, width, height) {
 	// Randomize the window name
	return window.open(url, Math.random(), "width=" + width + ", height=" + height + ", left=50, top=50, menubar=no, status=no, location=no, toolbar=no, scrollbars=yes, resizable=yes");
}

function bw_row_click(command) {
	if(bw_row_element_clicked == false) {
		eval(command);
	} else {
		bw_row_element_clicked = false;
	}
}

function bw_row_element_click() {
	bw_row_element_clicked = true;
}

function bw_row_element_click(command) {
	bw_row_element_clicked = true;
	eval(command);
}

function bw_check_compulsory(form_object) {
	var field_names = Array();
	var elements_array = form_object.names;
	var descriptions_array = form_object.descriptions;
	var compulsory_message = form_object.compulsory_message;
	var suggest_message = form_object.suggest_message;
	
	// Loop elements
	for(var i = 0; i < elements_array.length; i++) {
		if(element = form_object.elements[elements_array[i]]) {
			if(!element.disabled && element.value == "") {
				field_names[field_names.length] = descriptions_array[i];
				if (bw_get_element(elements_array[i] + "_container")) {
					bw_add_class(bw_get_element(elements_array[i] + "_container"), "mark_compulsory");
				} else {
					bw_add_class(element, "mark_compulsory");
				}
				// Focus only first element
				if (field_names.length <= 1) {
					element.focus();
				}
			} else if (!element.disabled && element.value == "-1") {
				if (form_object.elements[elements_array[i] + "_suggest"]) {
					alert(suggest_message + " '" + descriptions_array[i] + "'!");
					return false;
				}
			} else if (element.value != "") { // Remove possible previous, now unnecessary compulsory mark
				if (bw_get_element(elements_array[i] + "_container")) {
					bw_remove_class(bw_get_element(elements_array[i] + "_container"), " mark_compulsory");
				} else {
					bw_remove_class(element, " mark_compulsory");
				}
			}
		}
	}
	
	if (field_names.length != 0) {
		alert(compulsory_message + "\n'" + field_names.join("'\n'") + "'");
		return false;
	} else {
		return true;
	}
}

function bw_table_index_position(position, user, table_id) {
	// Set cookies
	document.cookie = "bw_table_index_position["+user+"]["+table_id+"]="+escape(position)+";expires=";
	window.location.reload();
}

function bw_table_index_count(count, user, table_id) {
	// Reset position
	bw_table_index_position(0, user, table_id);
	
	// Set cookies
	document.cookie = "bw_table_index_count["+user+"]["+table_id+"]="+escape(count)+";expires=";
	window.location.reload();
}

function bw_table_sorting(column, direction, user, table_id) {
	// Store column
	bw_set_cookie("bw_table_sorting_column["+user+"]["+table_id+"]", column);
	
	// Store direction
	bw_set_cookie("bw_table_sorting_direction["+user+"]["+table_id+"]", direction);
	
	// Reload window
	window.location.reload();
}

function bw_add_option(dropdown_element, description, value, position) {
	if (position == undefined) {
		position = dropdown_element.length;
	}
	dropdown_element.options[position] = new Option(description, value);
}

function bw_set_cookie(name, value) {
	document.cookie = name+"="+escape(value)+";expires=";
}

function bw_delete_cookie(name) {
	document.cookie = name+"=";
}

function bw_get_cookie(name) {
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    } else {
        begin += 2;
    }
    var end = document.cookie.indexOf(";", begin);
    if (end == -1) {
        end = dc.length;
    }
    return unescape(dc.substring(begin + prefix.length, end));
}

function bw_focus_first_field(form_name) {
	if(form = document.forms[form_name]) {
		for(var i=0; i<form.elements.length; i++) {
			var item = form.elements.item(i);
			if(item.type == "text" || item.type == "textarea") {
				item.select();
				break;
			}
		}
	}
}

function bw_get_html(element_id) {
	return bw_get_element(element_id).innerHTML;
}

function bw_replace_html(element_id, content) {
  	var target = bw_get_element(element_id);
	target.innerHTML = content; 
}

function bw_append_html(element_id, content) {
	var target = bw_get_element(element_id);
	target.innerHTML += content; 
}

function bw_http_param(name) {
	var qs = location.search;
	if(qs.indexOf(name) > 0) {
		var start = qs.indexOf(name);
		alert(qs.substring(start));
	} else {
		return "";
	}
}

function bw_scroll_percent_top(offset) {
  	if (isIE) {
  		return offset + (document.body.scrollTop / document.body.clientHeight) * 100 + "%";
	} else {
		return offset + (window.pageYOffset / window.innerHeight) * 100 + "%";
	}
}

function bw_add_class(element, class_name) {
	if (element && element.className) {
		if (element.className.indexOf(class_name) == -1) {
			element.className += " " + class_name;
		} 
	}
}

function bw_remove_class(element, class_name) {
	if (element && element.className) {
		var start = element.className.indexOf(class_name);
		switch (start) {
			case -1:
				return;
			
			case 0:
				element.className = element.className.substring(class_name.length - 1);
				return;
			
			default:
				element.className = element.className.substring(0, start) + element.className.substring(start + class_name.length);
				return;
		}
	}
}
