/** * Atalho ao objeto BOM (Browser Object Model) window */ var w = window; /** * Atalho ao objeto BOM (Browser Object Model) document */ var d = w.document; /** * Atalho ao objeto BOM (Browser Object Model) header */ var h = d.getElementsByTagName("head")[0]; /** * Funcao adicionada ao objeto nativo String * que limpa espaços em branco no inicio e fim de uma String * @return (String) this devolve o proprio valor da String sem os espaços */ String.prototype.trim = function() {return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");}; /** * Metodo isInteiro testa se o valor é um inteiro * @return (Boolean) true or false retorna verdadeiro caso seja inteiro */ String.prototype.isInteiro = function() {return (/^\d+$/).test(this);}; /** * Funcao que simula um forEach crossbrowser adicionado ao Array nativo * @param {Object} fn */ Array.prototype.each = function(fn) {for(var i = 0; i < this.length; i++) {fn(this[i]);}}; /** * Funcao para adicionar um item a um Array * @param {Object} item */ Array.prototype.add = function(item) {this[this.length] = item;}; /** * Metodo indexOf acrescentado ao Objeto nativo Array, * busca o index de um objeto dentro do array * @param {Number} v objeto a ser verificado * @return (Number) i posição do objeto no array */ Array.prototype.indexOf = function(v){for(var i in this){if(this[i] == v) {return i;}}}; /** * Metodo exceeded acrescentado ao Objeto nativo Array, * busca se um valor excedeu a dimensão de valores dentro do array * @param {Number} z * @return (Number) i Retorna -1 caso exceda o array ou o index */ Array.prototype.exceeded = function(z){var i = -1;for(var v in this) {if(v == z){i = 0;}} return i;}; /** * Wrapper para a captura de um elemento BOM * @param {Object} id */ var $ = function(id) {return document.getElementById(id)}; /* Show/hide element functions */ function show(id) { var element = $(id); element.style.visibility = 'visible'; element.style.display = ''; }; function hide(id) { var element = $(id); element.style.visibility = 'hidden'; element.style.display = 'none'; }; /** * @namespace Tuangr * @version 0.2 * @since 0.1 * @author Christiano Milfont */ if (typeof Tuangr == "undefined") { var Tuangr = {}; } /** * Componente Ajax * @version 0.2 * @since 0.2 * @author Christiano Milfont */ Tuangr.Ajax = function() { function handleReadyState(o, callback) { var poll = window.setInterval(function() { if(o && o.readyState == 4) { if(o.status == 200){ window.clearInterval(poll); if ( callback ){ callback(o); } } else if(o.status == 404){ window.clearInterval(poll); //if ( callback ){callback(o);} //alert("usuário não encontrado!"); } } }, 50); }; /** * Closure com construtor do objeto * @param {Object} method * @param {Object} uri * @param {Object} callback * @param {Object} postData * @version 0.2 * @since 0.2 */ return function(method, uri, callback, postData) { var http; try { http = new XMLHttpRequest(); } catch(e) { var msxml = ['MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP']; for ( var i=0, len = msxml.length; i < len; ++i ) { try { http = new ActiveXObject(msxml[i]); break; } catch(e) {} } } /*http.overrideMimeType("text/xml" ); http.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );*/ http.open(method, uri, true); handleReadyState(http, callback); http.send(postData || null); return http; }; }(); /** * Alias para o componente de Ajax * usa da forma $A('POST', 'http://www.tuangr.com/ofertas', callback, 'formato=json&total=5') * @version 0.1 * @since 0.1 */ var $A = Tuangr.Ajax; /** * Funcao CrossBrowser para adicionar um evento a um elemento * @param {Object} el Elemento que receberá o evento * @param {Object} type Tipo de evento. Ex: 'click' * @param {Object} fn Funcao que será disparada pelo evento */ Tuangr.addEvent = function(el, type, fn){ el['on'+type] = fn; }; if (document.addEventListener) { Tuangr.addEvent = function(element, type, handler) { element.addEventListener(type, handler, false); }; } else if (document.attachEvent) { Tuangr.addEvent = function(element, type, handler) { element.attachEvent("on" + type, handler); }; } /** * Objeto que realiza as regras de despacho entre o Tuangr e as redes * Sociais baseadas no OpenSocial * @classDescription Controlador do Tuangr nas redes OpenSocial * @version 0.2 * @since 0.1 * @author Christiano Milfont */ Tuangr.Oferta = function(){ /** * Function que pega o menor valor com base no objeto Scala * ou no preco base da oferta caso nao haja escala * @version 0.2 * @since 0.1 * @param {Object} scale * @param {Object} preco * @return {Number} minimo */ var precoMinimo = function(scale, preco) { var minimo = preco; /** * Consideramos que a ultima escala eh o menor valor * TODO * @param {Object} escala */ scale.each(function(escala){ minimo = escala.value }); return minimo; } /** * Funcao para devolver o desconto entre o menor e o maior preco * @version 0.2 * @since 0.1 * @param {Object} precoMinimo * @param {Object} precoMaximo */ var descontar = function(precoMinimo, precoMaximo){ var $_desconto = 100-(precoMinimo*100/precoMaximo); return Math.round($_desconto); }; /** * Funcao para trocar pontuacao da moeda * @version 0.2 * @since 0.1 * @param {Object} moeda */ var moeda_nacional = function(moeda) { return moeda.replace('.',','); }; /** * Funcao que monta o HTML de oferta para as redes sociais * @version 0.1 * @since 0.1 * @deprecated * @param {Object} dados */ var montarHTML = function(dados) { return "" + "
" + "
" + dados[1] + "
" + "
" + dados[2] + "
" + "
De " + dados[3] + "
" + "
por até R$ " + dados[4] + "
" + "
Desconto de até " + dados[5] + "%
" + "
" + dados[6] + "
" + "
" + " Ofertas válidas até" + "
" + dados[8] + " as " + dados[9] + "
" + "
" + "
" + dados[10] + "
" + "
" + ""; } /** * Funcao para extrair a data de uma string no formato pt-BR * @version 0.1 * @since 0.1 * @deprecated * @param {Object} data */ var extrairData = function(data) { return data.substring(0, 10); } /** * Funcao para extrair a hora de uma string no formato pt-BR * @version 0.2 * @since 0.1 * @deprecated * @param {Object} data */ var extrairHora = function(data) { return data.substring(11, 16); } /** * Funcao que recebe o conteudo ajax e aciona a montagem da oferta na tela * @version 0.1 * @since 0.1 * @deprecated * @param {Object} response */ var exibirOfertas = function(response) { var div = document.getElementById('ofertas'); div.innerHTML = ""; var retorno = response.text; var ofertas = [];ofertas = eval( retorno ); ofertas.each( function(o) { var offer = o.offer; var scale = o.scale; /** array */ var titulo = offer.nm_product; var url = offer.url; var dados = []; dados[0] = url; dados[1] = titulo; dados[2] = offer.manufacturer; dados[3] = moeda_nacional(offer.market_price); dados[4] = moeda_nacional(precoMinimo(scale, offer.market_price)); dados[5] = descontar(precoMinimo(scale, offer.market_price), offer.market_price); dados[6] = titulo; dados[7] = offer.picture_url; dados[8] = extrairData(offer.dt_termino_vigencia); dados[9] = extrairHora(offer.dt_termino_vigencia); dados[10] = ''; if(offer.fl_type_frete == 1) { dados[10] = 'Frete grátis'; } var oferta_div = document.createElement('div'); oferta_div.innerHTML = montarHTML(dados); div.appendChild(oferta_div); }); var proximos = document.createElement('div'); proximos.id = 'proximas_ofertas'; div.appendChild(proximos); }; /** * Função default de renderização do componente Ofertas */ var defaultRenderer = function() { var mostrar = function(o){ var offer = o.offer; var li = document.createElement('li'); li.appendChild(document.createTextNode('Item ')); li['onclick'] = function(elemento) { var x = $('L_OFFERS'); x.innerHTML = Tuangr.Oferta.base; Tuangr.Oferta.init_countdown(offer.countdown); $('I_OFFER_TITULO').innerHTML = "" + offer.nm_product + ""; $('I_OFFER_FABRICANTE').innerHTML = offer.manufacturer; $('I_OFFER_IMG').innerHTML = "Imagem de " + offer.nm_product + " não encontrada"; $('I_OFFER_FRETE').innerHTML = ""; $('I_OFFER_PRECO').innerHTML = offer.market_price; $('I_OFFER_PRECO_MIN').innerHTML = offer.min_price; $('I_OFFER_DESCONTO').innerHTML = offer.desconto; $('I_OFFER_SAIBA').innerHTML = "Saiba mais";; $('I_OFFER_COMPRA').innerHTML = "Faça sua compra!"; $('I_OFFER_CRONOMETRO').innerHTML = ""; $('I_OFFER_TERMINO').innerHTML = offer.dt_termino_vigencia; $('I_OFFER_MAIS').innerHTML = "Mais ofertas";; }; ul.appendChild(li); } var p = $('P_OFFERS'); var ul = document.createElement('ul'); Tuangr.Oferta.ofertas.each(mostrar); p.appendChild(ul); }; /** * Função para importar o css dinamicamente * @param {Object} styles [Array de estilos] */ var importCSS = function(styles) { for(var i=0; i" + offer.nm_product + ""; $('I_OFFER_FABRICANTE').innerHTML = offer.manufacturer; $('I_OFFER_IMG').innerHTML = "Imagem de produto não encontrada"; if(offer.fl_type_frete == 1) { show('I_OFFER_FRETE'); /*$('I_OFFER_FRETE').innerHTML = "Frete grátis";*/ } else { hide('I_OFFER_FRETE'); } $('I_OFFER_PRECO').innerHTML = offer.market_price; $('I_OFFER_PRECO_MIN').innerHTML = offer.min_price; $('I_OFFER_DESCONTO').innerHTML = offer.desconto; $('I_OFFER_SAIBA').innerHTML = "Saiba mais"; $('I_OFFER_COMPRA').innerHTML = "Faça sua compra!"; $('I_OFFER_CRONOMETRO').innerHTML = ""; $('I_OFFER_TERMINO').innerHTML = offer.dt_termino_vigencia; $('I_OFFER_MAIS').innerHTML = "Mais ofertas";; } catch (e) { alert("Estrutura danificada, falta id conforme: [" + e.message + "]"); } }, exec:function(offer) { try { Tuangr.Oferta.init_countdown(offer.countdown); $('I_OFFER_TITULO').innerHTML = "" + offer.nm_product + ""; $('I_OFFER_FABRICANTE').innerHTML = offer.manufacturer; /*$('I_OFFER_IMG').innerHTML = "Imagem de " + offer.nm_product + " não encontrada";*/ if(offer.fl_type_frete == 1) { show('I_OFFER_FRETE'); /*$('I_OFFER_FRETE').innerHTML = "Frete grátis";*/ } else { hide('I_OFFER_FRETE'); } $('I_OFFER_PRECO').innerHTML = offer.market_price; $('I_OFFER_PRECO_MIN').innerHTML = offer.min_price; $('I_OFFER_DESCONTO').innerHTML = offer.desconto; $('I_OFFER_SAIBA').innerHTML = "Saiba mais"; $('I_OFFER_COMPRA').innerHTML = "Faça sua compra!"; $('I_OFFER_CRONOMETRO').innerHTML = ""; $('I_OFFER_TERMINO').innerHTML = offer.dt_termino_vigencia; $('I_OFFER_MAIS').innerHTML = "Mais ofertas";; } catch (e) { alert("Estrutura danificada, falta id conforme: [" + e.message + "]"); } }, type:{ ENDING_SOON:'ending_soon', MOST_POPULAR:'most_popular', ALL:'all', RANDOM:'ramdom' }, switchType:function(type, total) { $('L_OFFERS').innerHTML = ''; Tuangr.Oferta.ofertas = []; Tuangr.Oferta.renderer = ''; if(total) { importJS([Tuangr.Oferta.tuangrHost+'/api/ofertas/lista?callback=Tuangr.Oferta.loadOffers&type='+type+'&total='+total]); } else { importJS([Tuangr.Oferta.tuangrHost+'/api/ofertas/lista?callback=Tuangr.Oferta.loadOffers&type='+type]); } importRenderer(); exibir(); }, /** * Objeto que renderiza a visao */ renderer: '', rendererURL:'', /** * Funcao que inicializa o countdown * @param {Object} time */ init_countdown:function(time) { w.clearTimeout(countdown_timeout); countdown_time = Math.floor(time*1000); Tuangr.Oferta.countdown(); }, /** * Variável que define se as imagens das ofertas tem ou não reflexo */ reflect:'', /** * largura das imagens */ w:300, /** * Altura da imagem */ h:220, /** * View html para um item do array */ base:'', /** * Array das ofertas */ ofertas:[], /** * Host padrão da aplicação */ tuangrHost:'http://sandbox.tuangr.com', /** * Função que carrega as ofertas do Tuangr * @param {Object} zofertas */ loadOffers:function(zofertas) {Tuangr.Oferta.ofertas = zofertas;}, /** * Função que carrega o html básico de um item * @param {Object} texto */ loadBase:function(texto) {Tuangr.Oferta.base = texto;}, /** * Funcao que inicializa o componente e carrega todas as dependências * descritas no objeto config e renderiza na posição que é chamado * @param {Object} config */ initWithModule:function(config) { if(config.tuangrHost && config.tuangrHost != '') { Tuangr.Oferta.tuangrHost = config.tuangrHost; } document.write('
loading
'); hide('X_OFFERS'); var styles = [(Tuangr.Oferta.tuangrHost+'/api/componente/css/ofertas/site')]; if(config.css){ styles = config.css; } if(styles.length > 0) { importCSS(styles); } var baseURL = Tuangr.Oferta.tuangrHost+'/api/componente/item/ofertas?callback=Tuangr.Oferta.loadBase'; if(config.base) { baseURL = Tuangr.Oferta.tuangrHost+'/api/componente/'+config.base+'/ofertas?callback=Tuangr.Oferta.loadBase'; } if (config.reflect) { Tuangr.Oferta.reflect = config.reflect; } if(config.w) { Tuangr.Oferta.w = config.w; } if(config.h) { Tuangr.Oferta.h = config.h; } if(Tuangr.Oferta.reflect.trim() != '') { importJS([ baseURL, Tuangr.Oferta.tuangrHost+'/api/ofertas/lista?callback=Tuangr.Oferta.loadOffers&noreflect='+Tuangr.Oferta.reflect+'&w='+Tuangr.Oferta.w+"&h="+Tuangr.Oferta.h ]); } else { importJS([ baseURL, Tuangr.Oferta.tuangrHost+'/api/ofertas/lista?callback=Tuangr.Oferta.loadOffers&w='+Tuangr.Oferta.w+"&h="+Tuangr.Oferta.h ]); } if(config.rendererURL) { Tuangr.Oferta.rendererURL = config.rendererURL; importRenderer(); } exibir(); }, initWithModuleOrkut:function(config) { if(config.tuangrHost && config.tuangrHost != '') { Tuangr.Oferta.tuangrHost = config.tuangrHost; } //document.write('
loading
'); var sistema = document.getElementById("sistema"); sistema.innerHTML = '
loading
'; show("sistema"); var styles = [(Tuangr.Oferta.tuangrHost+'/api/componente/css/ofertas/site')]; if(config.css){ styles = config.css; } if(styles.length > 0) { importCSS(styles); } var baseURL = Tuangr.Oferta.tuangrHost+'/api/componente/item/ofertas?callback=Tuangr.Oferta.loadBase'; if(config.base) { baseURL = Tuangr.Oferta.tuangrHost+'/api/componente/'+config.base+'/ofertas?callback=Tuangr.Oferta.loadBase'; } if (config.reflect) { Tuangr.Oferta.reflect = config.reflect; } if(config.w) { Tuangr.Oferta.w = config.w; } if(config.h) { Tuangr.Oferta.h = config.h; } if(Tuangr.Oferta.reflect.trim() != '') { importJS([ baseURL, Tuangr.Oferta.tuangrHost+'/api/ofertas/lista?callback=Tuangr.Oferta.loadOffers&noreflect='+Tuangr.Oferta.reflect+'&w='+Tuangr.Oferta.w+"&h="+Tuangr.Oferta.h ]); } else { importJS([ baseURL, Tuangr.Oferta.tuangrHost+'/api/ofertas/lista?callback=Tuangr.Oferta.loadOffers&w='+Tuangr.Oferta.w+"&h="+Tuangr.Oferta.h ]); } if(config.rendererURL) { Tuangr.Oferta.rendererURL = config.rendererURL; importRenderer(); } exibir(); }, /** * Funcao pública que controla o relogio de tempo faltante da oferta */ countdown : function() { countdown_time = countdown_time-1000; dday=Math.floor(countdown_time/(60*60*1000*24)*1); dhour=Math.floor((countdown_time%(60*60*1000*24))/(60*60*1000)*1); dmin=Math.floor(((countdown_time%(60*60*1000*24))%(60*60*1000))/(60*1000)*1); dsec=Math.floor((((countdown_time%(60*60*1000*24))%(60*60*1000))%(60*1000))/1000*1); $('I_OFFER_CRONOMETRO').innerHTML = dday+ "d, "+dhour+"h, "+dmin+"m e "+dsec+"s"; countdown_timeout = w.setTimeout('Tuangr.Oferta.countdown()',1000); } }; }();