/**
* 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[2] + "
" +
"
De " + dados[3] + "
" +
"
por até R$ " + dados[4] + "
" +
"
Desconto de até " + dados[5] + "%
" +
"
" +
"
" +
" 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 = "
";
$('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 = "
";
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 = "
";*/
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('');
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('');
var sistema = document.getElementById("sistema");
sistema.innerHTML = '';
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);
}
};
}();