﻿function $(elementName)
{
	return document.getElementById(elementName)
}

Utils = function() {};

Utils.haveClass = function(object, className)
{
	if (!(object && object.className)) return false;

	return object.className.match(className);
};

Utils.removeClass = function(object, className)
{
	if (!(object && object.className)) return;

    var arr = object.className.split(" ");
    var arrnew = [];
    for (var i = 0; i < arr.length; i++) { if (arr[i] == className) continue; arrnew.push(arr[i]); };
    object.className = arrnew.join(" ");
};

Utils.addClass = function(object, className)
{
	if (object.className != "") object.className += " ";
	object.className += className;
};

Utils.extendsClass = function(subClass, superClass)
{
	var Extends = function(){};
	Extends.prototype = superClass.prototype;
	subClass.prototype = new Extends();
	subClass.prototype.constructor = subClass;
	subClass.super_constructor = superClass;
	subClass.super_class = superClass.prototype;
};

Utils.getAbsolutePos = function(element)
{
	var leftScroll = 0;
	var topScroll = 0;
	if (element.tagName.toLowerCase() == "div")
	{
		if (element.scrollLeft) leftScroll = element.scrollLeft;
		if (element.scrollTop) topScroll = element.scrollTop;
	}

	var position = {
		left : element.offsetLeft - leftScroll,
		top : element.offsetTop - topScroll};

	if (element.offsetParent)
	{
		var parentPosition = Utils.getAbsolutePos(element.offsetParent);
		position.left += parentPosition.left;
		position.top += parentPosition.top;
	}
	return position;
};

Utils.getAbsoluteRect = function(element)
{
	var position = Utils.getAbsolutePos(element);

	var rect = {
		left : position.left,
		top : position.top,
		right : position.left + element.offsetWidth,
		bottom : position.top + element.offsetHeight};

	return rect;
};

Utils.findSelectedRadio = function(radioListName)
{
    var arr = document.getElementsByName(radioListName);
    if (arr)
    {
        var i;
        for (i = 0; i < arr.length; i++)
        {
            if (arr[i].checked) return arr[i].value;
        }
    }
    
    return -1;
};

Utils.include = function(scriptPath)
{
	var head = document.getElementsByTagName("HEAD")[0];

	var script = document.createElement("SCRIPT");
	script.language = "javascript";
	script.type = "text/javascript";
	script.src = scriptPath;
	head.appendChild(script);
};

Utils.isClick = function()
{
	if (window.event == null) return false;
	return (window.event.keyCode == 13);
};

Utils.alert = function(text)
{
	if (Utils.isDefined(text) && text != null && text.trim() != "")
	{
		alert(text);
		return false;
	}

	return true;
}

Utils.isDefined = function(value)
{
	return typeof(value) != "undefined";
}

Utils.selectedValue = function(list)
{
	return list.options[list.selectedIndex].value;
}

Utils.setSelectedValue = function(element, sel_value)
{
	var iter = 0;
	for (; iter < element.length; iter++)
	{
		if (element.options[iter].value == sel_value)
		{
			element.selectedIndex = iter;
			return;
		}
	}
}

Utils.getFloat = function(name, defaultValue)
{
	var value_str = $(name).value;

	value_str = (value_str + "").replace(/[^-\.\d]*/g, "");
	if (!Utils.isDefined(value_str)) return;
	
	var value = parseFloat(value_str);
	if (isNaN(value)) value_str = value_str.replace(/,/g, ".");
	value = parseFloat(value_str);
	if (isNaN(value)) return defaultValue;
	
	return value;
}

Utils.AJAXResultType = {object: 0, text: 1};

Utils.executeAJAX = function(url, successFunc, errorFunc, params, processFunc, timeout, execType)
{
    execType = typeof(execType) == "undefined" ? Utils.AJAXResultType.object : execType;
    var callback =
    {
        success: function(response)
        {
            var result;
            if (Utils.AJAXResultType.object == execType)
                eval("result = " + response.responseText);
            else
                result = {isError: false, text: response.responseText};
            if (typeof(result) == "object")
            {
                if (result.isError)
                {
                
                    response.argument.errorFunc(result.errorMessage, response.argument.params);
                    return false;
                }

                return response.argument.successFunc(result, response.argument.params);
            }
        },

        failure: function(response) {
            response.argument.errorFunc(response.statusText, response.argument.params);
            return false;
        },

        argument: {
            successFunc: successFunc,
            errorFunc: errorFunc,
            params: params
        },

        timeout: typeof(timeout != "undefined") ? timeout : 60000
    };

    if (typeof(processFunc) == "function") processFunc(params);
    return YAHOO.util.Connect.asyncRequest('GET', url, callback);
}

Utils.formatAJAXString = function(text)
{
    var formater = $("ajax_err_formater_panel");
    if (!formater)
    {
        formater = DOMUtils.appendChild("div", document.body);
        formater.id = "ajax_err_formater_panel";
        formater.style.display = "none";
    }
    formater.innerHTML = text;
    return formater.innerText;
}

AJAXUtils = function(page, processPanel, lock)
{
    this.processPanel = processPanel;
    this.lock = lock;
    this.page = page;
};

AJAXUtils.prototype =
{
    processPanel: null,
    lock: null,
    root: "../../",
    execType: Utils.AJAXResultType.object,
    request: null,
    showCancel: false,
    
    error_func: function(message, params)
    {
        if (params.obj.processPanel)
            params.obj.processPanel.innerHTML = "";
        if (params.obj.lock)
            params.obj.lock.unlock();

        var msg = Utils.formatAJAXString(message);
        if (typeof String.format == "function")
        {
            alert(String.format(params.obj.error_message, msg));
        }
        else
            alert(params.obj.error_message + msg);
    },

    exec: function(onload, error_message, func_name, params, ajax_params)
    {
        this.error_message = error_message;
        var params_str = "";
        var alertParams = false;
        var newWindow = false;
        var addThrow = false;
        if (params)
        {
            for (var i = 0; i < params.length; i++)
            {
                if (params[i].name == "ajax_alert")
                {
                    alertParams = true;
                    continue;
                }
                else if (params[i].name == "_blank")
                {
                    newWindow = true;
                    addThrow = true;
                    continue;
                }
                else if (params[i].name == "_open")
                {
                    newWindow = true;
                    continue;
                }
                params_str += (params_str == "" ? "" : "&") + params[i].name + "=" + encodeURIComponent(params[i].value);
            }
        }
        if (alertParams) alert(params_str);
        if (newWindow)
        {
            window.open(this.page + "?function=" + func_name + (addThrow ? "&throw=1" : "") + (params_str == "" ? "" : "&" + params_str), null, 
                        "width=" + screen.width + ", height=" + screen.height + ", resizable=yes, directories=yes, help=no, scroll=yes, status=yes, toolbar=yes, menubar=yes, location=yes");
            return;
        }
		//alert("page = " + this.page + "?function=" + func_name + (params_str == "" ? "" : "&" + params_str));
        this.request =
            Utils.executeAJAX(this.page + "?function=" + func_name + (params_str == "" ? "" : "&" + params_str),
                              function(result, params)
                              {
                                params.obj.request = null;
                                onload(result, params.ajax_params);
                                if (params.obj.processPanel)
                                    params.obj.processPanel.innerHTML = "";
                                if (params.obj.lock)
                                    params.obj.lock.unlock();
                              },
                              function(message, params)
                              {
                                params.obj.request = null;
                                params.obj.error_func(message, params);
                              },
                              {ajax_params: ajax_params, obj: this},
                              function(params)
                              {
                                if (params.obj.processPanel)
                                    DOMUtils.showProcess(params.obj.processPanel.id, params.obj.root);
                                if (params.obj.lock)
                                {
                                    if (params.obj.showCancel)
                                        params.obj.lock.lock(function(){params.obj.abort.call(params.obj)});
                                    else
                                        params.obj.lock.lock();
                                }
                              },
                              undefined,
                              this.execType);
    },
    
    abort: function()
    {
        if (this.request != null)
            YAHOO.util.Connect.abort(this.request);
        this.request = null;
        if (this.processPanel)
            this.processPanel.innerHTML = "";
        if (this.lock)
            this.lock.unlock();
    }
}

DOMUtils = function(){};

DOMUtils.appendChild = function(elementName, parent)
{
    var element = document.createElement(elementName);
    parent.appendChild(element);
    return element;
}

DOMUtils.getFirstChildById = function(element, id)
{
	for (var iter = 0; iter < element.childNodes.length; iter++)
	{
		if (element.childNodes[iter].id == id)
			return element.childNodes[iter];
	}
	
	return null;
}

DOMUtils.addImage = function(panelName, imgUrl)
{
    DOMUtils.appendChild("IMG", $(panelName)).src = imgUrl;
}

DOMUtils.showProcess = function(panelName, root)
{
    root = root || "../../";
    DOMUtils.addImage(panelName, root + "IMG/spinner.gif");
}

DOMUtils.clearGrid = function(grid)
{
    while (grid.tBodies[0].children.length > 0)
    {
        grid.tBodies[0].removeChild(grid.tBodies[0].firstChild);
    }
}
