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 = '
'; document.body.insertBefore(d, document.body.firstChild); var over = document.body.style.overflow ? document.body.style.overflow : 'auto'; document.body.style.overflow = 'hidden'; var element; var listener = function(event) { if( event.origin != firano.framework.protocol + "firano.ru") { return; } if ('close' == event.data) { d.innerHTML = ''; document.body.style.overflow = over; } }; if (window.addEventListener){ window.addEventListener("message", listener, false); } else { window.attachEvent("onmessage", listener); } }; //проверка доступности формы firano.isShow = function(sum){ var minSum = 3000; return parseFloat(sum) >= minSum; };