function exec_xml(path, method_name, params, callback_func, response_tags, callback_func_arg) {
    var oXml = new zXml();
    oXml.reset();
    oXml.setPath(path);
    oXml.setMethod(method_name);
    for(var key in params) {
        var val = params[key];
        oXml.addParam(key, val);
    }
    oXml.request(xml_response_filter, oXml, callback_func, response_tags, callback_func_arg);
}

function request_xml(method_name, action, params, callback_func, response_tags, callback_func_arg) {
    params['action'] = action;
    exec_xml('server.php',method_name, params, callback_func, response_tags, callback_func_arg);
}

function set_form_elements(fo_obj, ret_obj) {
    for(var i=0;i<fo_obj.length;i++) {
        var obj = fo_obj[i];
        var type = obj.type;
        var name = obj.name;
        var val = '';
        if(typeof(ret_obj[name])!='undefined'&&ret_obj[name]) val = ret_obj[name];
        switch(type) {
            case 'text' :
            case 'textarea' :
            case 'hidden' :
                    obj.value = val;
                break;
            case 'checkbox' :
                    if(typeof(obj.length)!='undefined') {
                        for(var j=0;j<obj.length;j++) {
                            if(obj[i].checked) {
                                selected_obj = obj[i];
                                break;
                            }
                        }
                    } else selected_obj = obj;
                    if(selected_obj.value == val) selected_obj.checked = true;
                break;
            case 'select' :
            case 'select-one' :
                    for(var j=0;j<obj.options.length;j++) {
                        if(obj.options[j].value == val) {
                            obj.options[j].selected = true;
                            break;
                        }
                    }
                break;
            case 'raido' :
                    if(typeof(obj.length)!='undefined') {
                        for(var j=0;j<obj.length;j++) {
                            if(obj[i].checked) {
                                selected_obj = obj[i];
                                break;
                            }
                        }
                    } else selected_obj = obj;
                    if(selected_obj.value == val) selected_obj.checked = true;
                break;
            case 'button' :
            case 'submit' :
                    continue;
                break;
        }

    }
}

function get_form_elements(fo_obj) {
    var obj_list = new Array();
    var params = new Array();
    var prev_name = '';
    for(var i=0;i<fo_obj.length;i++) {
        var name = fo_obj[i].name;
        if(!name) continue;
        if(name!=prev_name) prev_name = obj_list[obj_list.length] = name;
    }
    for(var i=0;i<obj_list.length;i++) {
        var name = obj_list[i];
        if(!name) continue;
        if(name.indexOf('_delete')>=0) continue;
        if(name.indexOf('_tmp')>=0) continue;
        var obj = fo_obj[name];
        var type = '';
        if(obj.type=='select-one') type = obj.type;
        else if(typeof(obj.length)!='undefined') type = obj[0].type;
        else type = obj.type;
        switch(type) {
            case 'text' :
            case 'textarea' :
            case 'password' :
            case 'hidden' :
                    var value = '';
                    if(typeof(obj.length)!='undefined') {
                        for(var j=0;j<obj.length;j++) value += obj[j].value+'|@|';
                    } else {
                        value = obj.value;
                    }
                    params[name] = value;
                break;
            case 'select' :
            case 'select-one' :
                    if(obj.options.length<1) params[name] = '';
                    else {
                        if(obj.size>0) {
                            var _val = new Array();
                            for(var j=0;j<obj.options.length;j++) {
                               var _opt = new Array();
                               _opt[0] = obj.options[j].value;
                               _opt[1] = obj.options[j].text;
                               _val[_val.length] = _opt.join('|@|');
                            }
                            params[name] = _val.join('\n');
                        } else {
                            var si = obj.selectedIndex;
                            if(si<0) params[name] = '';
                            else params[name] = obj.options[si].value;
                        }
                    }
                break;
            case 'radio' :
                    var selected_obj = null;
                    if(typeof(obj.length)!='undefined') {
                        for(var j=0;j<obj.length;j++) {
                            if(obj[j].checked) {
                                selected_obj = obj[j];
                                break;
                            }
                        }
                    } else selected_obj = obj;
                    if(selected_obj&&selected_obj.checked) params[name] = selected_obj.value;
                    else params[name] = '';
                break;
            case 'checkbox' :
                    var value = '';
                    if(typeof(obj.length)!='undefined') {
                        for(var j=0;j<obj.length;j++) {
                            if(obj[j].checked) value += obj[j].value+'|@|';
                        }
                    } else {
                        if(obj.checked) value = obj.value;
                    }
                    params[name] = value;
                break;
            case 'button' :
            case 'submit' :
                    continue;
                break;
            case 'file' :
                    var _image_obj = xGetElementById('_image_'+name);
                    if(_image_obj) params[name] = _image_obj.value;
                break;
        }
    }
    return params;
}

function xml_response_filter(oXml, callback_func, response_tags, callback_func_arg) {
    var xmlDoc = oXml.getResponseXml();
    if(!xmlDoc) return;

    if(typeof(response_tags)=='undefined' || !response_tags) response_tags = new Array('error','message');

    var ret_obj = oXml.toZMsgObject(xmlDoc, response_tags);
    if(ret_obj['error']!=0) alert(ret_obj['message']);
    else callback_func(ret_obj, response_tags, callback_func_arg);
}

function check_empty(params, fo_obj, check_list) {
    for(var i=0;i<check_list.length;i++) {
        var key = check_list[i];
        var val = params[key];
        var msg = alert_msg[key];
        var obj = fo_obj[key];
        if(typeof(obj)=='undefined') continue;
        if(!val) {
            alert(msg);
            if(typeof(obj)!='undefined' && obj.type != 'hidden') obj.focus();
            return false;
        }
    }
    return true;
}

function request_confirm(key) {
    return confirm(alert_msg[key]);
}

function is_valid_email(value) {
    var pattern = /^[_a-zA-Z0-9-\.]+@[\.a-zA-Z0-9-]+\.[a-zA-Z]+$/;
    return pattern.test(value);
}

function is_alpha(value) {
    var pattern = /^[a-zA-Z]+$/;
    return pattern.test(value);
}

function is_num_alpha(value) {
    var pattern = /^[a-zA-Z0-9]+$/;
    return pattern.test(value);
}

function is_valid_user_id(value) {
    if(value.length < 4 || value.length > 12 || !is_num_alpha(value)) return false;
    return true;
}

function is_valid_password(value) {
    if(value.length < 4 || value.length > 20) return false;
    return true;
}

String.prototype.trim = function()
{
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

function toggle_zone(id) {
    var obj = xGetElementById(id);
    if(obj.style.display == 'block') obj.style.display = 'none';
    else obj.style.display = 'block';
}

function show_original_image(url) {
    var win = window.open('about:blank','_OriginalImage','width=100,height=100,scrollbars=no');
    var html = ""+
        "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"+
        "<html><title></title><head></head><body>"+
        "<a href='#' onClick='self.close();return false;'><img src=\""+url+"\" id='original' style='border:0px;cursor:pointer;' onload=\"resize_window(this); function resize_window(obj) { var w = obj.offsetWidth-document.body.clientWidth; var h = obj.offsetHeight-document.body.clientHeight; window.resizeBy(w,h); }\" /></a>"+
        "</body></html>";

    try{
        win.stop();
    } catch(e) {
    }
    win.document.body.style.margin = "0px 0px 0px 0px;";
    xInnerHtml(win.document.body, html);
    win.focus();
}

function admin_move_menu(mid) {
    location.href="./admin.php?mid="+mid;
}

var _inactiveHiddenedSelect = new Array();
function inactiveShade(bool) {
    var obj = xGetElementById('inactive_shade_layer');
    if(!obj) {
        obj = xCreateElement("DIV");
        obj.id = 'inactive_shade_layer';
        obj.style.position = 'absolute';
        xLeft(obj,0);
        xTop(obj,0);
        obj.style.visibility = 'hidden';
        obj.style.backgroundColor = '#63676C';
        obj.style.opacity = 0.7;
        obj.style.filter = "alpha(opacity=70)";
        document.body.insertBefore(obj, document.body.lastChild);
    }
     
    xWidth(obj, getBodyWidth());
    xHeight(obj, getBodyHeight());

    if(bool == true) {
        obj.style.visibility = 'visible';

        if(xIE4Up) {
            var objs = xGetElementsByTagName('SELECT');
            _inactiveHiddenedSelect = new Array();
            for(var i=0;i<objs.length;i++) {
                if(objs[i].id=='signupform_type'||objs[i].id=='member_manager_level_list') continue;
                objs[i].style.visibility = 'hidden';
                _inactiveHiddenedSelect[i] = objs[i];
            }
        }
    } else {
        if(xIE4Up) {
            var objs = xGetElementsByTagName('SELECT');
            for(var i=0;i<objs.length;i++) {
                if(objs[i].id=='signupform_type'||objs[i].id=='member_manager_level_list') continue;
                if(objs[i].style.visibility == 'hidden') objs[i].style.visibility = 'visible';
            }
        }

        obj.style.visibility = 'hidden';
    }
}

xAddEventListener(window,'resize',resizeInactiveShade);
function resizeInactiveShade() {
    var obj = xGetElementById('inactive_shade_layer');
    if(!obj || obj.style.visibility != 'visible') return;

    xWidth(obj, getBodyWidth());
    xHeight(obj, getBodyHeight());
}

function getBodyHeight() {
    var ch = xClientHeight();
    var sh = window.document.body.scrollHeight;
    return ch>sh?ch:sh;
}

function getBodyWidth() {
    var cw = xClientWidth();
    var sw = window.document.body.scrollWidth;
    return cw>sw?cw:sw;
}

function setPositionInWindow(obj) {
    var w = xWidth(obj);
    var h = xHeight(obj);
    if(xLeft(obj)+w>=getBodyWidth()) xLeft(obj, getBodyWidth()-w-10);
    if(xTop(obj)+h>=getBodyHeight()) xTop(obj, getBodyHeight()-h-10);
    if(xLeft(obj)<1) xLeft(obj, 10);
    if(xTop(obj)<1) xTop(obj, 10);
}

function expandAdminInfo(stat) {
	var obj = document.getElementById('admin_info_expand');
	if(stat == 1) {
		var newStat = "block";
	} else  if(stat == 0) {
		var newStat = "none";
	} else {
		var newStat = obj.style.display == 'none' ? 'block' : 'none';
	}
	obj.style.display = newStat;
}


function copy_clip(meintext){
    if (window.clipboardData) { 
        // the IE-manier
        window.clipboardData.setData("Text", meintext);
        // waarschijnlijk niet de beste manier om Moz/NS te detecteren;
        // het is mij echter onbekend vanaf welke versie dit precies werkt:
    } else if (window.netscape) {
        // dit is belangrijk maar staat nergens duidelijk vermeld:
        // you have to sign the code to enable this, or see notes below
        netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

        // maak een interface naar het clipboard
        var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
        if (!clip) return;

        // maak een transferable
        var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
        if (!trans) return;

        // specificeer wat voor soort data we op willen halen; text in dit geval
        trans.addDataFlavor('text/unicode');

        // om de data uit de transferable te halen hebben we 2 nieuwe objecten nodig om het in op te slaan
        var str = new Object();
        var len = new Object();

        var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);

        var copytext=meintext;

        str.data=copytext;

        trans.setTransferData("text/unicode",str,copytext.length*2);

        var clipid=Components.interfaces.nsIClipboard;

        if (!clip) return false;

        clip.setData(trans,null,clipid.kGlobalClipboard);
    }

    var msg = alert_msg['url_copy'];
    if(typeof(msg)=='undefined'||!msg) return;
    alert(msg);
}
