if(typeof console != 'object'){
console = {};
}
if(typeof console.log != "function"){
console.log = function(){};
}
var firano = {};
firano.framework = {
	protocol: (document.location.protocol == "https:" ? "https://" : "http://"),
    getElementsByClassName: function(className, scope){
        var ret = [];
        if (typeof scope == 'undefined') scope = document;
        var elems = scope.getElementsByTagName('*'), i;
        for (i in elems) {
            if (String(Number(i)) === i && elems.hasOwnProperty(i)) {
                if((' ' + elems[i].className + ' ').indexOf(' ' + className + ' ') > -1) {
                    ret.push(elems[i]);
                }
            }
        }
        return ret;
    },
    empty: function(obj) {
        if (typeof obj == 'undefined' || obj === null || obj === '' || obj === '0') return true;
        if (typeof obj == 'number' && (isNaN(obj) || obj === 0)) return true;
        if (obj instanceof Array && obj.length === 0 ) return true;
        if (obj instanceof Date && isNaN(Number(obj))) return true;
        return false;
    },
    clear: function(str) {
                return str
            .replace(/
/gi, '')
            .replace(/(<[^>\/]+>[^<]*<\/[^>]+>|<[^>\/]+\/>)/gi, '')
            .replace(/(<[^>\/]+>[^<]*<\/[^>]+>|<[^>\/]+\/>)/gi, '')
            .replace(/(<[^>\/]+>[^<]*<\/[^>]+>|<[^>\/]+\/>)/gi, '')
        ;
    },
    clear_int: function(str) {
    	return parseInt(this.clear(str).replace(/[\ \,]/g, ''));
    },
    stringify: function(data, type) {
        return this.json_encode(data);
    },
    json_encode: function(mixed_val) {
        try {
            var value = mixed_val;
            var quote = function (string) {
                var escapable = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
                var meta = { // table of character substitutions
                    '\b': '\\b',
                    '\t': '\\t',
                    '\n': '\\n',
                    '\f': '\\f',
                    '\r': '\\r',
                    '"': '\\"',
                    '\\': '\\\\'
                };
                escapable.lastIndex = 0;
                return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
                    var c = meta[a];
                    return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
                }) + '"' : '"' + string + '"';
            };
            var str = function (key, holder) {
                var gap = '';
                var indent = '    ';
                var i = 0; // The loop counter.
                var k = ''; // The member key.
                var v = ''; // The member value.
                var length = 0;
                var mind = gap;
                var partial = [];
                var value = holder[key];
// If the value has a toJSON method, call it to obtain a replacement value.
                if (value && typeof value === 'object' && typeof value.toJSON === 'function') {
                    value = value.toJSON(key);
                }
// What happens next depends on the value's type.
                switch (typeof value) {
                    case 'string':
                        return quote(value);
                    case 'number':
// JSON numbers must be finite. Encode non-finite numbers as null.
                        return isFinite(value) ? String(value) : 'null';
                    case 'boolean':
                    case 'null':
// If the value is a boolean or null, convert it to a string. Note:
// typeof null does not produce 'null'. The case is included here in
// the remote chance that this gets fixed someday.
                        return String(value);
                    case 'object':
// If the type is 'object', we might be dealing with an object or an array or
// null.
// Due to a specification blunder in ECMAScript, typeof null is 'object',
// so watch out for that case.
                        if (!value) {
                            return 'null';
                        }
                        if ((this.PHPJS_Resource && value instanceof this.PHPJS_Resource) || (window.PHPJS_Resource && value instanceof window.PHPJS_Resource)) {
                            throw new SyntaxError('json_encode');
                        }
// Make an array to hold the partial results of stringifying this object value.
                        gap += indent;
                        partial = [];
// Is the value an array?
                        if (Object.prototype.toString.apply(value) === '[object Array]') {
// The value is an array. Stringify every element. Use null as a placeholder
// for non-JSON values.
                            length = value.length;
                            for (i = 0; i < length; i += 1) {
                                partial[i] = str(i, value) || 'null';
                            }
// Join all of the elements together, separated with commas, and wrap them in
// brackets.
                            v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']';
                            gap = mind;
                            return v;
                        }
// Iterate through all of the keys in the object.
                        for (k in value) {
                            if (Object.hasOwnProperty.call(value, k)) {
                                v = str(k, value);
                                if (v) {
                                    partial.push(quote(k) + (gap ? ': ' : ':') + v);
                                }
                            }
                        }
// Join all of the member texts together, separated with commas,
// and wrap them in braces.
                        v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}';
                        gap = mind;
                        return v;
                    case 'undefined':
// Fall-through
                    case 'function':
// Fall-through
                    default:
                        throw new SyntaxError('json_encode');
                }
            };
// Make a fake root object containing our value under the key of ''.
// Return the result of stringifying the value.
            return str('', {
                '': value
            });
        } catch (err) { // Todo: ensure error handling above throws a SyntaxError in all cases where it could
// (i.e., when the JSON global is not available and there is an error)
            if (!(err instanceof SyntaxError)) {
                throw new Error('Unexpected error type in json_encode()');
            }
            this.php_js = this.php_js || {};
            this.php_js.last_error_json = 4; // usable by json_last_error()
            return null;
        }
    },
    load: function load(url, callback) {
                var xhr;
        if(typeof XMLHttpRequest !== 'undefined') xhr = new XMLHttpRequest();
        else {
            var versions = ["MSXML2.XmlHttp.5.0",
                "MSXML2.XmlHttp.4.0",
                "MSXML2.XmlHttp.3.0",
                "MSXML2.XmlHttp.2.0",
                "Microsoft.XmlHttp"]
            for(var i = 0, len = versions.length; i < len; i++) {
                try {
                    xhr = new ActiveXObject(versions[i]);
                    break;
                }
                catch(e){}
            } // end for
        }
        ensureReadiness = function () {
            if(xhr.readyState < 4) {
                return;
            }
            if(xhr.readyState === 4) {
                callback(xhr);
            }
        }
        xhr.onreadystatechange = ensureReadiness;
        xhr.open('GET', url, true);
        xhr.send('');
    },
    getAllParams: function() {
        var params = {};
        if (location.search) {
            var parts = location.search.substring(1).split('&');
            for (var i = 0; i < parts.length; i++) {
                var nv = parts[i].split('=');
                if (!nv[0]) continue;
                params[nv[0].toLowerCase()] = nv[1] || true;
            }
        }
        return params;
    },
    getParam: function(name, def) {
        def = def || '';
        return this.getAllParams()[name] || def;
    }
};
firano.basket = function(obj) {
    return firano.saveBasket(firano.getBasket(),firano.getOrderId(), obj);
}
firano.form = function() {
    return firano.showForm(firano.getBasket(),firano.getOrderId());
}
firano.getUser = function() {
    var ret = {};
    var userdata = firano.framework.getElementsByClassName('userdata_item');
    if (typeof userdata == 'undefined') {
        return ret;
    }
    var name,middle,surname,email,phone_mobile;
    for (key in userdata) {
        if (String(Number(key)) === key && userdata.hasOwnProperty(key)) {
            f = firano.framework;
            if(document.getElementsByClassName('userdata_item_name').length != 0) {
                ret['name'] = f.clear(f.getElementsByClassName('userdata_item_name', userdata[key])[0].innerHTML);
            }
            if(document.getElementsByClassName('userdata_item_middle').length != 0) {
                ret['middle'] = f.clear(f.getElementsByClassName('userdata_item_middle', userdata[key])[0].innerHTML);
            }
            if(document.getElementsByClassName('userdata_item_surname').length != 0) {
                ret['surname'] = f.clear(f.getElementsByClassName('userdata_item_surname', userdata[key])[0].innerHTML);
            }
            if(document.getElementsByClassName('userdata_item_email').length != 0) {
                ret['email'] = f.clear(f.getElementsByClassName('userdata_item_email', userdata[key])[0].innerHTML);
            }
            if(document.getElementsByClassName('userdata_item_phone_mobile').length != 0) {
                ret['phone_mobile'] = f.clear_int(f.getElementsByClassName('userdata_item_phone_mobile', userdata[key])[0].innerHTML);
            }
        }
    }
    var counter = 0;
    for (var i in ret) {
        counter++;
    }
    if(counter > 0) {
        return ret;
    } else {
        return false;
    }
};
firano.getBasket = function() {
    var ret = [];
    var basket = firano.framework.getElementsByClassName('basket_item');
    if (typeof basket == 'undefined') {
                return ret;
    }
    var item = {};
    var key,name,sum,price,count;
    for (key in basket) {
        if (String(Number(key)) === key && basket.hasOwnProperty(key)) {
                        f = firano.framework;
            name    = f.clear    (f.getElementsByClassName('basket_item_name',    basket[key])[0].innerHTML);
            category= f.clear_int(f.getElementsByClassName('basket_item_category',basket[key])[0].innerHTML);
            price   = f.clear_int(f.getElementsByClassName('basket_item_price',   basket[key])[0].innerHTML);
            sum     = f.clear_int(f.getElementsByClassName('basket_item_sum',     basket[key])[0].innerHTML);
            count   = f.clear_int(f.getElementsByClassName('basket_item_count',   basket[key])[0].innerHTML);
            brand   = f.clear    (f.getElementsByClassName('basket_item_brand',   basket[key])[0].innerHTML);
            model   = f.clear    (f.getElementsByClassName('basket_item_model',   basket[key])[0].innerHTML);
            if (firano.framework.empty(count)) {
				count=f.clear_int(f.getElementsByClassName('basket_item_count',   basket[key])[0].value);
            }
            if (firano.framework.empty(brand)) {
                console.log('не хватает бренда для элемента корзины');
            } else if (firano.framework.empty(model)) {
                console.log('не хватает модели для элемента корзины');
            } else if (firano.framework.empty(name) || firano.framework.empty(category) || firano.framework.empty(price) || firano.framework.empty(count) || firano.framework.empty(sum)) {
                // не хватает данных, это элемент корзины пропускаем и пишем в лог.
                console.log('не хватает данных для элемента корзины');
                console.log({ price: price, count: count, sum: sum });
            } else {
                ret.push ({ name: name, category: category, price: price, count: count, sum: sum, brand: brand, model: model });
            }
        }
    }
    return ret;
};
firano.getOrderId = function() {
    if (document.getElementById('order_id')) {
        return firano.framework.clear(document.getElementById('order_id').innerHTML);
    } else {
        return -1;
    }
}
firano.basketSaved = false;
firano.saveBasket = function(basket, order_id, obj) {
		console.log("эту функцию использовать нельзя, устарело");
    if (!firano.basketSaved) {
        var json = firano.framework.stringify(basket, 'basket');
        var data = encodeURIComponent(json);
        var rand = Math.floor(Math.random() * 9999);
        var src = firano.framework.protocol + 'firano.ru/embedded/basket_save/' + rand + '?domain=' + window.location.hostname + '&order_id=' + order_id + '&data=' + data;
        firano.framework.load(src, function(){
            firano.basketSaved = true;
            obj.click();
        });
        return false;
    } else {
        return true;
    }
};
firano.showForm = function(data, signature) {
    var data = encodeURIComponent(data);
	var d = document.createElement('div');
    d.innerHTML = '