
Array.prototype.toString =
Object.prototype.toString = function() {
    var cont = [];
    var addslashes = function(s) {
        // Использовать replace НЕЛЬЗЯ - в Опере
        // происходит зацикливание, т.к. из replace
        // зачем-то вызывается Object.toString().
        return s.split('\\').join('\\\\').split('"').join('\\"');
    }
    for (var k in this) {
        if (cont.length) cont[cont.length-1] += ",";
        var v = this[k];
        var vs = '';
        if(v === null || v === undefined)
            vs = v;
        else if (v.constructor == String)
            vs = '"' + addslashes(v) + '"';
        else
            vs = v.toString();
        if (this.constructor == Array)
            cont[cont.length] = vs;
        else
            cont[cont.length] = k + ": " + vs;
    }
    // Здесь тоже нельзя делать replace()!
    cont = "----" + cont.join("\n").split("\n").join("\n----");
    var s = cont;
    if (this.constructor == Object) {
        s = "{\n"+cont+"\n}";
    } else if (this.constructor == Array) {
        s = "[\n"+cont+"\n]";
    }
    return s;
}

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/mg, '');
}




function URLEncode(text)
{
    var SafeChars = "0123456789" +                        // Numeric
                    "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +        // Alphabetic
                    "abcdefghijklmnopqrstuvwxyz" +
                    "-_.!~*'()";                          // RFC2396 Mark characters

    var Hex = "0123456789ABCDEF";

    var Unicode2Win1251 = {
        0x402: '80', 0x403: '81', 0x201A:'82', 0x453: '83', 0x201E:'84', 0x2026:'85', 0x2020:'86', 0x2021:'87', 0x20AC:'88', 0x2030:'89', 0x409: '8A', 0x2039:'8B', 0x40A: '8C', 0x40C: '8D', 0x40B: '8E', 0x40F: '8F',
        0x452: '90', 0x2018:'91', 0x2019:'92', 0x201C:'93', 0x201D:'94', 0x2022:'95', 0x2013:'96', 0x2014:'97',              0x2122:'99', 0x459: '9A', 0x203A:'9B', 0x45A: '9C', 0x45C: '8D', 0x45B: '9E', 0x45F: '9F',
        0xA0:  'A0', 0x40E: 'A1', 0x45E: 'A2', 0x408: 'A3', 0xA4:  'A4', 0x490: 'A5', 0xA6:  'A6', 0xA7:  'A7', 0x401: 'A8', 0xA9:  'A9', 0x404: 'AA', 0xAB:  'AB', 0xAC:  'AC', 0xAD:  'AD', 0xAE:  'AE', 0x407: 'AF',
        0xB0:  'B0', 0xB1:  'B1', 0x406: 'B2', 0x456: 'B3', 0x491: 'B4', 0xB5:  'B5', 0xB6:  'B6', 0xB7:  'B7', 0x451: 'B8', 0x2116:'B9', 0x454: 'BA', 0xBB:  'BB', 0x458: 'BC', 0x405: 'BD', 0x455: 'BE', 0x457: 'BF',
        0x410: 'C0', 0x411: 'C1', 0x412: 'C2', 0x413: 'C3', 0x414: 'C4', 0x415: 'C5', 0x416: 'C6', 0x417: 'C7', 0x418: 'C8', 0x419: 'C9', 0x41A: 'CA', 0x41B: 'CB', 0x41C: 'CC', 0x41D: 'CD', 0x41E: 'CE', 0x41F: 'CF',
        0x420: 'D0', 0x421: 'D1', 0x422: 'D2', 0x423: 'D3', 0x424: 'D4', 0x425: 'D5', 0x426: 'D6', 0x427: 'D7', 0x428: 'D8', 0x429: 'D9', 0x42A: 'DA', 0x42B: 'DB', 0x42C: 'DC', 0x42D: 'DD', 0x42E: 'DE', 0x42F: 'DF',
        0x430: 'E0', 0x431: 'E1', 0x432: 'E2', 0x433: 'E3', 0x434: 'E4', 0x435: 'E5', 0x436: 'E6', 0x437: 'E7', 0x438: 'E8', 0x439: 'E9', 0x43A: 'EA', 0x43B: 'EB', 0x43C: 'EC', 0x43D: 'ED', 0x43E: 'EE', 0x43F: 'EF',
        0x440: 'F0', 0x441: 'F1', 0x442: 'F2', 0x443: 'F3', 0x444: 'F4', 0x445: 'F5', 0x446: 'F6', 0x447: 'F7', 0x448: 'F8', 0x449: 'F9', 0x44A: 'FA', 0x44B: 'FB', 0x44C: 'FC', 0x44D: 'FD', 0x44E: 'FE', 0x44F: 'FF'
    }

    var encoded = "";
    for (var i = 0; i < text.length; i++ ) {
        var ch = text.charAt(i);
        if (ch == " ") {
            encoded += "+";
        } else if (SafeChars.indexOf(ch) != -1) {
            encoded += ch;
        } else if (ch.charCodeAt(0) > 127) {
            encoded += "%" + Unicode2Win1251[ch.charCodeAt(0)];
        } else {
            encoded += "%" + Hex.charAt((ch.charCodeAt(0) >> 4) & 0xF) + Hex.charAt(ch.charCodeAt(0) & 0xF);
        }
    }

    return encoded;
}





var net = new Object();

net.READY_STATE_UNINITIALIZED = 0;
net.READY_STATE_LOADING       = 1;
net.READY_STATE_LOADED        = 2;
net.READY_STATE_INTERACTIVE   = 3;
net.READY_STATE_COMPLETE      = 4;

net.ContentLoader = function(url, onload, onerror, method, params, contentType) {
    this.req = null;
    this.onload = onload;
    this.onerror = (onerror)? onerror : this.defaultError;
    this.loadXMLDoc(url, method, params, contentType);
}

net.ContentLoader.prototype.loadXMLDoc = function(url, method, params, contentType) {
    if(!method) {
        method="GET";
    }
    if(!contentType && method=="POST") {
        contentType='application/x-www-form-urlencoded';
    }
    if(window.XMLHttpRequest) {
        this.req=new XMLHttpRequest();
    } else if(window.ActiveXObject){
        this.req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    if(this.req) {
        try {
            var loader = this;
            this.req.onreadystatechange = function() {
                net.ContentLoader.onReadyState.call(loader);
            }
            this.req.open(method, url, true);
            if (contentType) {
                this.req.setRequestHeader('Content-Type', contentType);
            }
            this.req.send(params);
        } catch(err) {
            this.onerror.call(this);
        }
    }
}

net.ContentLoader.onReadyState = function() {
    var req = this.req;
    var ready = req.readyState;
    if(ready == net.READY_STATE_COMPLETE) {
        var httpStatus = req.status;
        if(httpStatus == 200 || httpStatus == 0) {
            this.onload.call(this);
        } else {
            this.onerror.call(this);
        }
    }
}

/*net.ContentLoader.prototype.defaultError = function() {
    alert("error fetching data!\n\n"
        + "readyState:" + this.req.readyState + "\n"
        + "status: " + this.req.status + "\n"
        + "headers: " + this.req.getAllResponseHeaders());
}*/

net.ContentLoader.prototype.defaultError = function() {
    alert("В данное время ваш запрос не может быть обработан.\r\nПожалуйста повторите позже.");
}

function parseMyData()
{
    document.getElementById('res').innerHTML=this.req.responseText;
}

//var loader = new net.ContentLoader('mydata.php', parseMyData, null, 'POST', 's=aaaa');

//alert(loader);





var ValidatorMessages = {
    validator_filled:   "Поле \"{label}\" не заполнено.",
    validator_email:    "{label} \"{value}\" указан неверно, пожалуйста, указывайте реальный адрес.",
    validator_code:     "Поле \"{label}\" должно содержать ровно 5 цифр.",
    validator_numbers:     "Поле \"{label}\" должно содержать только цифры.",
    validator_selected: "Выберите одно из значений в поле \"{label}\".",
    validator_checked:  "Выберите хотя бы одно из действий  {label} .",
    validator_pass:  "Не идентично поле \"{label}\".",
    validator_or: "Некорректно задано значение \"{label}\". Должен быть указан один из вариантов.",
    validator_login: "Поле \"{label}\" не заполнено.",
    
	default_message:    "Проверьте правильность заполнения поля \"{label}\"."
}

function checkForm()
{
    this.formErrors = [];
    for(var i = 0; i < this.formMeta.length; i++) {
        for(var j = 0; j < this.formMeta[i].meta.length; j++) {
            var metaName = this.formMeta[i].meta[j].name;
            var metaValue = this.formMeta[i].meta[j].value.split(/\s+/); // alert(metaValue);

            if(metaName.toLowerCase() == 'validator') {
                for(var k = 0; k < metaValue.length; k++) {

                    var negate = false;
                    // metaValue="[@][!]validator_1[:modifier_1] [@][!]validator_2[:modifier_2] ..."
                    if(metaValue[k].charAt(0) == '@') {
                        // Ignore (it's for server use)
                        metaValue[k] = metaValue[k].substr(1);
                    }
                    if(metaValue[k].charAt(0) == '!') {
                        // Negate rule
                        var negate = true;
                        metaValue[k] = metaValue[k].substr(1);
                    }
                    if(metaValue[k].match(/^(.*?):(.*)$/)) {
                        // Ignore (it's for server use)
                        metaValue[k] = /^(.*?):(.*)$/.exec(metaValue[k])[1];
                    }
                    //alert(metaName + '_' + metaValue[k]);
                    if(typeof(window[metaName + '_' + metaValue[k]]) == 'function') {
                        var element = document.getElementById(this.formMeta[i].id) || document.getElementsByName(this.formMeta[i].name)[0];
                        if ((this.formMeta[i]['type'] == 'single' && element.type == 'radio') ||
                            (this.formMeta[i]['type'] == 'multiple' && element.type == 'checkbox')) {
                            var inputs = document.getElementsByName(this.formMeta[i].name + (this.formMeta[i]['type'] == 'multiple' ? '[]' : ''));
                            //for (var n = 0; n < inputs.length; n++) {
                            for (var n = inputs.length - 1; n >= 0; n--) {   // It's for Opera
                                if (inputs[n].checked) {
                                    var value = inputs[n].value;
                                    break;
                                } else {
                                    var value = '';
                                }
                            }
                        } else {
                            var value = element.value;
                        }
                        var status = window[metaName + '_' + metaValue[k]](value, this.formMeta[i]);
                        var message = null;
                        if(typeof(status) == 'object') {
                            message = status;
                            status = false;
                        }
                        // If error detected, report it.
                        if (!negate && !status || negate && status) {
                            var currErr = {};
                            currErr[metaName] = metaValue[k];
                            currErr['message'] = message;
                            if (typeof(this.formMeta[i].type) != 'undefined') {
                                currErr['type'] = this.formMeta[i].type;
                            }
                            if (typeof(this.formMeta[i].id) != 'undefined') {
                                currErr['id'] = this.formMeta[i].id;
                            }
                            if (typeof(this.formMeta[i].name) != 'undefined') {
                                currErr['name'] = this.formMeta[i].name;
                            }
                            if (typeof(this.formMeta[i].label) != 'undefined') {
                                currErr['label'] = this.formMeta[i].label;
                            }
                            if (typeof(this.formMeta[i].items) != 'undefined') {
                                currErr['items'] = this.formMeta[i].items;
                            }
                            currErr['value'] = value;
                            this.formErrors.push(currErr);
                            break;
                        }
                    }
                }
            }
        }
    }


    var errorMessage = '';
    for(var n = 0; n < this.formErrors.length; n++) {
        if(this.formErrors[n].message != null) {
            errorMessage += this.formErrors[n].message + "\n";
        } else {
            if(typeof(ValidatorMessages) != 'undefined' && typeof(ValidatorMessages['validator_' + this.formErrors[n].validator]) != 'undefined') {
                var currMessage = ValidatorMessages['validator_' + this.formErrors[n].validator];
                currMessage = currMessage.replace(/\{label\}/ig, this.formErrors[n].label);
                currMessage = currMessage.replace(/\{value\}/ig, this.formErrors[n].value);
                errorMessage += currMessage + "\n";
            } else if(typeof(ValidatorMessages) != 'undefined' && typeof(ValidatorMessages['default_message']) != 'undefined') {
                var currMessage = ValidatorMessages['default_message'];
                currMessage = currMessage.replace(/\{label\}/ig, this.formErrors[n].label);
                currMessage = currMessage.replace(/\{value\}/ig, this.formErrors[n].value);
                errorMessage += currMessage + "\n";
            } else {
                //errorMessage += '"validator_' + this.formErrors[n].validator + '"' + ' failed for field ' + '"' + this.formErrors[n].label + '"' + "\n";
                errorMessage += 'Проверьте, пожалуйста, правильность заполнения поля "' + this.formErrors[n].label + '"' + "\n";
            }
        }
    }


    if(this.formErrors.length > 0) {
        alert(errorMessage);
        return false;
    } else {
        var sendByAjax = false;
        var sendByAjaxFunc = function() { /*alert(this.req.responseText);*/  var Win = window.open('about:blank', 'aaa'); 
        Win.document.write(this.req.responseText); }
        /*var inputs = this.getElementsByTagName('input');
        for(var k = 0; k < inputs.length; k++) {
            if(inputs[k].type == 'hidden' && inputs[k].id == 'is_ajax' && inputs[k].value && !inputs[k].name) {
                sendByAjax = true;
                if(typeof(window[inputs[k].value]) == 'function') {
                    sendByAjaxFunc = window[inputs[k].value];
                }
                break;
            }
        }*/
        if (typeof(window[this.is_ajax]) == 'function') {
            sendByAjaxFunc = window[this.is_ajax];
        }

        //if(sendByAjax) {
        if (this.is_ajax) {
            var formElements = this.elements;
            var data = new Array();
            for(var i = 0; i < formElements.length; i++) {
                if ((formElements[i].type == 'radio' || formElements[i].type == 'checkbox') && !formElements[i].checked) {
                } else if (formElements[i].tagName == 'SELECT' && formElements[i].multiple) {
                    for (var n = 0; n < formElements[i].options.length; n++) {
                        if (formElements[i].options[n].selected) {
                            data.push(URLEncode(formElements[i].name) + '=' + URLEncode(formElements[i].options[n].value));
                        }
                    }
                } else {
                    data.push(URLEncode(formElements[i].name) + '=' + URLEncode(formElements[i].value));
                }
            }

            if(this.action) {
                var loc = this.action;
            } else {
                var loc = window.location;
            }

            var loader = new net.ContentLoader(loc, sendByAjaxFunc, null, 'POST', data.join('&'));
            loader.form = this;            // Link for current form (may be usufull)

            return false;
        } else {
            return true;
        }
    }


    //return false;
}

function validator_filled(value, meta)
{
    return value.trim();
}

function validator_login(value, meta)
{
    return value.trim();
}

function validator_or(value, meta)
{
	return (value != '') || (document.getElementById(meta.id+'2').checked);
}

function validator_pass(value, meta)
{
//	alert(value);
    return value == document.getElementById(meta.id+'2').value;
}

function validator_email(value, meta)
{
    return value.trim() == '' || value.match(/^[\w\.\-]+@[\w\.\-]+\.[a-zA-Z]{2,}$/i)? true : false;
}

function validator_code(value, meta)
{
    return value.match(/^\d{5}$/)? true : false;
}

function validator_numbers(value, meta)
{
    return (value.match(/^[0-9]{1,}$/)? true : false) || value == '';
}

//допустимы пробелы
function validator_numbers2(value, meta)
{
    return (value.match(/^[0-9 ]{1,}$/)? true : false) || value == '';
}


function validator_selected(value, meta)
{
    return value != 0;        // Because value is string, and because "0" is true
}

function validator_checked(value, meta)
{
    return value != '';
}

function callBackFunc()
{
    var error_str = '';
    eval("var errors = " + this.req.responseText);
    if (errors.length > 0 && errors[0]!=='') {
        for (var i = 0; i < errors.length; i++)
        {
            error_str += errors[i] + "\n";
        }
/*        alert(error_str);// Можно выводить алертом а можно в виде текста*/

        if(error_str.match('@s@'))
        {
          $('_feedback_auth_id').value='';
          $('feedback_ok').style.display='none';
          error_str = error_str.replace(/@s@/g,'');
          
          if(error_str[0]=='#')
          {
          	error_str = error_str.replace('#','');
          	if($page()=='login'){window.location.href=window.location.pathname}
          }
        }
       $("alert").style.display='';
      $("alert").innerHTML='<font color="red">'+error_str+'</font>';
        
      
    } else {

      /*  Сюда вставить действия при положительном отклике скрипта
        Например:*/
      /*
        document.getElementsByName("feedback")[0].style.display='none';*/
//      if(this.req.responseText=='Регистрация прошла успешно') window.location = reload();else

  $("alert").innerHTML= this.req.responseText;
        
    }
}

