function get_dimensions(obj) {
	var result = { "left": 0, "right" : 0, "top": 0, "bottom" : 0, "width" : obj.offsetWidth, "height" : obj.offsetHeight };
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			result.left += obj.offsetLeft;
			result.top += obj.offsetTop;
			obj = obj.offsetParent;
		}
	} else {
		if (obj.x) {
			result.left += obj.x;
		}
		if (obj.y) {
			result.top += obj.y;
		}
	}
	result.right = result.left + result.width;
	result.bottom = result.top + result.height;
	return result;
}

function get_obj_by_path(obj, path) {
    path = path;
    var routes = [];
    var step;
    var index;
    var parts = path.split(/\s+/);
    var j;
    for (var i = 0; i < parts.length; i++) {
        step = parts[i];
        index = 0;
        if (i == parts.length - 1) {
            routes[routes.length] = { step: step, index: index };
            break;
        }
        for (j = i + 1; j < parts.length; j++) {
            if (parts[j].search(/^\d+$/gi) == -1) {
                if (j == i + 1) {
                    routes[routes.length] = { step: step, index: index };
                }
                break;
            } else {
                routes[routes.length] = { step: step, index: parts[j] }
            }
        }
        i = j - 1;
    }

    var result = obj;
    var route;
    try {
        for (var i = 0; i < routes.length && result; i++) {
            route = routes[i];
            with (route) {
                if (step == "parent") {
                    while (index-- >= 0 && result) {
                        result = result.parentNode;
                    }
                } else if (step == "prev") {
                    result = not_text_previous_subling(result, index);
                } else if (step == "next") {
                    result = not_text_next_subling(result, index);
                } else if (step == "child") {
                    result = not_text_child(result, index);
                } else if (step == "last") {
                    result = not_text_last_child(result, index);
                } else if (step == "") {    //    do nothing, continue
                } else {
                    alert("get_obj_by_path:\nUnknow step type:\"" + step + "\"");
                }
            }
        }
    } catch (e) {
        return null;
    }
    return result;
}

//    aliases
function not_text_child(obj, index) {
    return not_text_child_by_index(obj, index);
}
function not_text_last_child(obj, index) {
    return not_text_last_child_by_index(obj, index);
}
function not_text_next_subling(obj, index) {
    return not_text_next_subling_by_index(obj, index);
}
function not_text_previous_subling(obj, index) {
    return not_text_previous_subling_by_index(obj, index);
}

function not_text_child_length(obj) {
    var length = 0;
    var result = obj.firstChild;
    for (; result; result = result.nextSibling) {
        if (result.nodeType != 3 && result.nodeType != 8) length++;
    }
    return length;
}

function not_text_child_by_index(obj, index) {
    //    when damn mozilla gets white spaces it creates new node, while IE does not
    if (index == undefined) {
        index = 0;
    }
    var i = -1;
    var result = obj.firstChild;
    for (; result; result = result.nextSibling) {
        if (result.nodeType != 3 && result.nodeType != 8) i++;
        if (i == index) break;
    }
    return result;
}

function not_text_last_child_by_index(obj, index) {
    if (index == undefined) {
        index = 0;
    }
    var i = -1;
    var result = obj.lastChild;
    for (; result; result = result.previousSibling) {
        if (result.nodeType != 3 && result.nodeType != 8) i++;
        if (i == index) break;
    }
    return result;
}

function not_text_next_subling_by_index(obj, index) {
    if (index == undefined) {
        index = 0;
    }
    var i = -1;
    var result = obj.nextSibling;
    for (; result; result = result.nextSibling) {
        if (result.nodeType != 3 && result.nodeType != 8) i++;
        if (i == index) break;
    }
    return result;
}

function not_text_previous_subling_by_index(obj, index) {
    if (index == undefined) {
        index = 0;
    }
    var i = -1;
    var result = obj.previousSibling;
    for (; result; result = result.previousSibling) {
        if (result.nodeType != 3 && result.nodeType != 8) i++;
        if (i == index) break;
    }
    return result;
}

function insert_text_to_textarea(textarea, text) {
	var new_text = text;
	var scrollTop = textarea.scrollTop;
	if (document.selection) {	// IE
		textarea.focus();
		var sel = document.selection.createRange();
		sel.text = new_text;
	} else if (textarea.selectionStart || textarea.selectionStart == "0") {	// Mozilla
		var start_pos = textarea.selectionStart;
		var end_pos = textarea.selectionEnd;
		textarea.value = textarea.value.substring(0, start_pos) + new_text + textarea.value.substring(end_pos, textarea.value.length);
	} else {
		textarea.value += new_text;
	}
	var temp=window.location+"hello";
	if (temp.indexOf("quote")==-1) window.location=window.location+"#quote";
}

function preload_images() {
	if (document.images) {
		if (!document.p) document.p = new Array();
		for (var i = 0;  i < arguments.length; i++) {
			var img = new Image();
			img.src = arguments[i];
			document.p[document.p.length] = img;
		}
	}
}

function $(id){
	return document.getElementById(id);
}

var element_doing_ajax_array=new Object;
var element_doing_ajax_array_index=0;

function show_element_doing_ajax(element, local_element_doing_ajax_array, local_element_doing_ajax_array_index){

	if (local_element_doing_ajax_array) element_doing_ajax_array = local_element_doing_ajax_array;
	if (local_element_doing_ajax_array_index) element_doing_ajax_array_index = local_element_doing_ajax_array_index;

    if (!element.getAttribute("doing_ajax_index")) {

        element.setAttribute("doing_ajax_index", element_doing_ajax_array_index++);
        var element_doing_ajax=document.createElement("div");
        element_doing_ajax_array[element.getAttribute("doing_ajax_index")]=element_doing_ajax;
        element_doing_ajax.className="element_doing_ajax";
        element.parentNode.insertBefore(element_doing_ajax, element.nextSibling);
        element_doing_ajax.innerHTML="<table cellspacing=\"0\" cellpadding=\"0\" height=\"100%\" width=\"100%\"><tr><td><img src=\"images/ajax-loader.gif\"/></td></tr></table>";
    } else {
        element_doing_ajax=element_doing_ajax_array[element.getAttribute("doing_ajax_index")];
    }
    // calc position
    var dimensions=get_dimensions(element);
    element_doing_ajax.style.top=dimensions.top+"px";
    element_doing_ajax.style.left=dimensions.left+"px";
    element_doing_ajax.style.width=dimensions.width+"px";
    element_doing_ajax.style.height=dimensions.height+"px";
    // show
    //swap_class_names(element, undefined, "element_doing_ajax_opacity");
    if (element.style.display=="none") return;
    element_doing_ajax.style.display="block";


}

function hide_element_doing_ajax(element){
    //swap_class_names(element, "element_doing_ajax_opacity", undefined);
    element_doing_ajax=element_doing_ajax_array[element.getAttribute("doing_ajax_index")];
    if (element_doing_ajax !== undefined) element_doing_ajax.style.display="none";
}

function array_search(needle, haystack, strict) {
    for (var i = 0; i < haystack.length; i++) {
        if (strict && (needle === haystack[i]) || !strict && (needle == haystack[i])) {
            return i;
        }
    }
    return false;
}

function add_event_listener(el, evname, func) {
    if (el.attachEvent) { // IE
        el.attachEvent("on" + evname, func);
    } else if (el.addEventListener) { // Gecko / W3C
        el.addEventListener(evname, func, true);
    } else {
        el["on" + evname] = func;
    }
}



function array_search(needle, haystack, strict) {
    for (var i = 0; i < haystack.length; i++) {
        if (strict && (needle === haystack[i]) || !strict && (needle == haystack[i])) {
            return i;
        }
    }
    return false;
}

function in_array(needle, haystack, strict) {
    for (var i = 0; i < haystack.length; i++) {
        if (strict && (needle == haystack[i]) || !strict && (needle == haystack[i])) {
            return true;
        }
    }
    return false;
}

function array_unique(array) {
    var result = [];
    var element;
    for (var i = 0; i < array.length; i++) {
        element = array[i];
        if (array_search(element, result, true) === false) {
            result.push(element);
        }
    }
    return result;
}

function swap_class_names(obj, class_name_remove, class_name_add) {
    if (!obj) {
        return false;
    } else {
        var classes = obj.className.split(/\s+/);
        var found = false;
        if (class_name_remove !== undefined) {
            for (var i = classes.length - 1; i >= 0; i--) {
                if (classes[i] == class_name_remove) {
                    if (class_name_add !== undefined) {
                        classes[i] = class_name_add;
                    } else {
                        classes[i] = null;
                    }
                    found = true;
                    break;
                }
            }
        }
        if (!found && class_name_add !== undefined) {
            classes.push(class_name_add);
        }
        classes = array_unique(classes);
        obj.className = classes.join(" ");
    }
}

