/*	Product popup addon
 *
 *	@copyright IDEV.no and Silverthemes.com
 *	@author Jone Eide <jone@idev.no>
 **/
function PopupOverlayTxt(options){
	this.url=options.url;
	this.create_overlay=options.create_overlay;
	this.createPopup();
	this.createImagePopup();
	this.product_id=false;
	if(typeof options.imagesearch=='undefined'){
		this.imagesearch='div.catalog-listing img';
	} else{
		this.imagesearch=options.imagesearch;
	}
	if(typeof options.parentsearch=='undefined'){
		this.parentsearch='li.item';
	} else{
		this.parentsearch=options.parentsearch;
	}
	if(typeof options.serial=='undefined'){
		this.code='none';
	} else{
		this.code=options.serial;
	}
	if(this.create_overlay){
		this.createOverlay();
	}
	$$(this.imagesearch).invoke('observe','click',PopupOverlayTxt.getImagePopupClickFunction(this));
}
PopupOverlayTxt.prototype.createImagePopup=function(){
	this.imagepopup=document.createElement('div');
	this.imagepopup.id='product-image-popup';
	Element.extend(this.imagepopup);
	this.imagepopup.setStyle({display:'none'});
	this.imagepopup.addClassName('product-image-popup-normal');
	this.imagepopup.update('View more');
	this.imagepopup.observe('mouseover',PopupOverlayTxt.getImagePopupMouseOverFunction(this));
	this.imagepopup.observe('mouseout',PopupOverlayTxt.getImagePopupMouseOutFunction(this));
	this.imagepopup.observe('click',PopupOverlayTxt.getImagePopupClickFunction(this));
	document.body.insertBefore(this.imagepopup,document.body.childNodes[0]);
};
PopupOverlayTxt.getImagePopupClickFunction=function(popup_overlay){
	return function(event){
		popup_overlay.product_id=this.id.split('-')[1];
		var element=event.element();
		popup_overlay.getProductData(popup_overlay.product_id);
		popup_overlay.show();
	};
};
PopupOverlayTxt.getImagePopupMouseOutFunction=function(popup_overlay){
	return function(event){
		popup_overlay.imagepopup.removeClassName('product-image-popup-hover');
		popup_overlay.imagepopup.addClassName('product-image-popup-normal');
		popup_overlay.imagepopup.hide();
	};
};
PopupOverlayTxt.getImagePopupMouseOverFunction=function(popup_overlay){
	return function(event){
		popup_overlay.imagepopup.removeClassName('product-image-popup-normal');
		popup_overlay.imagepopup.addClassName('product-image-popup-hover');
		popup_overlay.imagepopup.show();
	};
};
PopupOverlayTxt.getImageMouseOutFunction=function(popup_overlay){
	return function(event){
		var element=event.element();
		event.preventDefault();
		popup_overlay.imagepopup.hide();
	};
};
PopupOverlayTxt.getImageMouseOverFunction=function(popup_overlay){
	return function(event){event.preventDefault();
		var element=event.element();
		var dimensions=element.getDimensions();
		var offset=element.cumulativeOffset();
		var image_height=dimensions.height;
		var image_width=dimensions.width;
		var imagepopup_dimensions=popup_overlay.imagepopup.getDimensions();
		var offset_left=offset[0]+((image_width/2)-(imagepopup_dimensions.width/2));
		var offset_top=offset[1]+image_height-imagepopup_dimensions.height;popup_overlay.imagepopup.setStyle({top:offset_top+'px',left:offset_left+'px'});
		popup_overlay.imagepopup.show();
		var parent=element.up(popup_overlay.parentsearch);
		popup_overlay.product_id=parent.id.split('-')[1];
		var linkparent=element.up('a');
		popup_overlay.product_url=linkparent.href;
	};
};
PopupOverlayTxt.prototype.setLoading=function(){
	var html='<div class="productpopup-loading">Loading...</div>';
	this.contents.update(html);
	this.centerPopup();
};
PopupOverlayTxt.prototype.getProductData=function(product_id){
	var url=this.url+'?product_id='+product_id;
	var popup_overlay=this;
	this.setLoading();
	var request=new Ajax.Request(url,{
		method:'get',onSuccess:function(transport){
			var data=transport.responseText;
			if(!popup_overlay.check()){
				data=data+Base64.decode('PHA+UGxlYXNlIHB1cmNoYXNlIGEgbGljZW5zZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LnNpbHZlcnRoZW1lcy5jb20iPnd3dy5TaWx2ZXJ0aGVtZXMuY29tPC9hPi48L3A+');
			}
			popup_overlay.contents.update(data);
			popup_overlay.centerPopup();
			$('popup-product-button-close').observe('click',function(e){
				popup_overlay.hide();
			});
			$('popup-product-button-close').observe('mouseover',function(e){
				e.element().addClassName('popup-product-button-close-active');
			});
			$('popup-product-button-close').observe('mouseout',function(e){
				e.element().removeClassName('popup-product-button-close-active');
			});
			$('popup-product-button-product').observe('click',function(e){
				window.location=popup_overlay.product_url;
			});
			$('popup-product-button-product').observe('mouseover',function(e){
				e.element().addClassName('popup-product-button-active');
			});
			$('popup-product-button-product').observe('mouseout',function(e){
				e.element().removeClassName('popup-product-button-active');
			});
		},onFailure:function(){
			alert('AJAX request failed.');
		}
	});
};
PopupOverlayTxt.getLinkClickFunction=function(popup_overlay){
	return function(event){
		var element=event.element();
		var product_id=element.id;
		event.preventDefault();
		popup_overlay.getProductData(product_id);
		popup_overlay.show();
	};
};
PopupOverlayTxt.prototype.show=function(){
	if(this.create_overlay){
		this.overlay.show();
	}
	var effect=new Effect.Appear(this.popup,{duration:0.3});
};
PopupOverlayTxt.prototype.hide=function(){
	var overlay=this.overlay;
	var popup_overlay=this;
	var effect=new Effect.Fade(this.popup,{duration:0.2,afterFinish:function(){
		if(popup_overlay.create_overlay){
			var neweffect=new Effect.Fade(overlay,{duration:0.2});}
		}
	});
};
PopupOverlayTxt.prototype.getPopup=function(){
	if(typeof this.popup=='undefined'){
		return this.createPopup();
	}else{
		return this.popup;
	}
};
PopupOverlayTxt.getCloseLinkFunction=function(popup_overlay){
	return function(event){
		popup_overlay.hide();
	};
};
PopupOverlayTxt.prototype.buildHeader=function(){
	this.header=document.createElement('div');
	Element.extend(this.header);
	this.header.addClassName('productpopup-header');
	this.header.appendChild(document.createTextNode(''));
	this.closeicon=document.createElement('div');
	this.closeicon.appendChild(document.createTextNode(''));
	Element.extend(this.closeicon);
	this.closeicon.observe('click',PopupOverlayTxt.getCloseLinkFunction(this));
	this.closeicon.addClassName('closeicon');
	this.header.appendChild(this.closeicon);
	this.popup.appendChild(this.header);
};
PopupOverlayTxt.prototype.check=function(){
	if(hex_sha1(hex_sha1(Base64.decode('cHJvZHVjdHBvcHVw'))+document.domain)==this.code){
		return true;
	}
	return false;
};
PopupOverlayTxt.prototype.buildContents=function(){
	this.contents=document.createElement('div');
	Element.extend(this.contents);
	this.contents.appendChild(document.createTextNode(''));
	this.contents.addClassName('contents');
	this.popup.appendChild(this.contents);
};
PopupOverlayTxt.prototype.buildFooter=function(){
	this.footer=document.createElement('div');
	Element.extend(this.footer);
	this.footer.addClassName('productpopup-footer');
	this.footer.appendChild(document.createTextNode(''));
	this.popup.appendChild(this.footer);
};
PopupOverlayTxt.prototype.centerPopup=function(){
	var dimensions=document.viewport.getDimensions();
	var popup_width=this.popup.getWidth();
	var popup_height=this.popup.getHeight();
	var offset=document.viewport.getScrollOffsets();
	var width=dimensions.width;
	var left=(width/2)-(popup_width/2);
	var height=dimensions.height;var top=(height/2)-(popup_height/2)+offset.top;
	this.popup.setStyle({top:top+'px',left:left+'px'});
};
PopupOverlayTxt.prototype.createPopup=function(){
	this.popup=document.createElement('div');
	this.popup.id='popup';
	Element.extend(this.popup);
	this.buildHeader();
	this.buildContents();
	this.buildFooter();
	this.popup.setStyle({display:'none'});
	document.body.insertBefore(this.popup,document.body.childNodes[0]);
	return this.popup;
};
PopupOverlayTxt.prototype.createOverlay=function(){
	this.overlay=document.createElement('div');
	this.overlay.id='popup-overlay';
	Element.extend(this.overlay);
	this.overlay.setStyle({height:document.body.offsetHeight+'px',display:'none'});
	var PopupOverlayTxt=this;
	this.overlay.observe('click',function(e){
		PopupOverlayTxt.hide();
	});
	document.body.insertBefore(this.overlay,document.body.childNodes[0]);
};
function hex_sha1(s){return rstr2hex(rstr_sha1(str2rstr_utf8(s)));}
function b64_sha1(s){return rstr2b64(rstr_sha1(str2rstr_utf8(s)));}
function any_sha1(s,e){return rstr2any(rstr_sha1(str2rstr_utf8(s)),e);}
function hex_hmac_sha1(k,d)
{return rstr2hex(rstr_hmac_sha1(str2rstr_utf8(k),str2rstr_utf8(d)));}
function b64_hmac_sha1(k,d)
{return rstr2b64(rstr_hmac_sha1(str2rstr_utf8(k),str2rstr_utf8(d)));}
function any_hmac_sha1(k,d,e)
{return rstr2any(rstr_hmac_sha1(str2rstr_utf8(k),str2rstr_utf8(d)),e);}
function sha1_vm_test()
{return hex_sha1("abc").toLowerCase()=="a9993e364706816aba3e25717850c26c9cd0d89d";}
function rstr_sha1(s)
{return binb2rstr(binb_sha1(rstr2binb(s),s.length*8));}
function rstr_hmac_sha1(key,data)
{var bkey=rstr2binb(key);if(bkey.length>16)bkey=binb_sha1(bkey,key.length*8);var ipad=Array(16),opad=Array(16);for(var i=0;i<16;i++)
{ipad[i]=bkey[i]^0x36363636;opad[i]=bkey[i]^0x5C5C5C5C;}
var hash=binb_sha1(ipad.concat(rstr2binb(data)),512+data.length*8);return binb2rstr(binb_sha1(opad.concat(hash),512+160));}
function rstr2hex(input)
{try{hexcase}catch(e){hexcase=0;}
var hex_tab=hexcase?"0123456789ABCDEF":"0123456789abcdef";var output="";var x;for(var i=0;i<input.length;i++)
{x=input.charCodeAt(i);output+=hex_tab.charAt((x>>>4)&0x0F)
+hex_tab.charAt(x&0x0F);}
return output;}
function rstr2b64(input)
{try{b64pad}catch(e){b64pad='';}
var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var output="";var len=input.length;for(var i=0;i<len;i+=3)
{var triplet=(input.charCodeAt(i)<<16)|(i+1<len?input.charCodeAt(i+1)<<8:0)|(i+2<len?input.charCodeAt(i+2):0);for(var j=0;j<4;j++)
{if(i*8+j*6>input.length*8)output+=b64pad;else output+=tab.charAt((triplet>>>6*(3-j))&0x3F);}}
return output;}
function rstr2any(input,encoding)
{var divisor=encoding.length;var remainders=Array();var i,q,x,quotient;var dividend=Array(Math.ceil(input.length/2));for(i=0;i<dividend.length;i++)
{dividend[i]=(input.charCodeAt(i*2)<<8)|input.charCodeAt(i*2+1);}
while(dividend.length>0)
{quotient=Array();x=0;for(i=0;i<dividend.length;i++)
{x=(x<<16)+dividend[i];q=Math.floor(x/divisor);x-=q*divisor;if(quotient.length>0||q>0)
quotient[quotient.length]=q;}
remainders[remainders.length]=x;dividend=quotient;}
var output="";for(i=remainders.length-1;i>=0;i--)
output+=encoding.charAt(remainders[i]);var full_length=Math.ceil(input.length*8/(Math.log(encoding.length)/Math.log(2)))
for(i=output.length;i<full_length;i++)
output=encoding[0]+output;return output;}
function str2rstr_utf8(input)
{var output="";var i=-1;var x,y;while(++i<input.length)
{x=input.charCodeAt(i);y=i+1<input.length?input.charCodeAt(i+1):0;if(0xD800<=x&&x<=0xDBFF&&0xDC00<=y&&y<=0xDFFF)
{x=0x10000+((x&0x03FF)<<10)+(y&0x03FF);i++;}
if(x<=0x7F)
output+=String.fromCharCode(x);else if(x<=0x7FF)
output+=String.fromCharCode(0xC0|((x>>>6)&0x1F),0x80|(x&0x3F));else if(x<=0xFFFF)
output+=String.fromCharCode(0xE0|((x>>>12)&0x0F),0x80|((x>>>6)&0x3F),0x80|(x&0x3F));else if(x<=0x1FFFFF)
output+=String.fromCharCode(0xF0|((x>>>18)&0x07),0x80|((x>>>12)&0x3F),0x80|((x>>>6)&0x3F),0x80|(x&0x3F));}
return output;}
function str2rstr_utf16le(input)
{var output="";for(var i=0;i<input.length;i++)
output+=String.fromCharCode(input.charCodeAt(i)&0xFF,(input.charCodeAt(i)>>>8)&0xFF);return output;}
function str2rstr_utf16be(input)
{var output="";for(var i=0;i<input.length;i++)
output+=String.fromCharCode((input.charCodeAt(i)>>>8)&0xFF,input.charCodeAt(i)&0xFF);return output;}
function rstr2binb(input)
{var output=Array(input.length>>2);for(var i=0;i<output.length;i++)
output[i]=0;for(var i=0;i<input.length*8;i+=8)
output[i>>5]|=(input.charCodeAt(i/8)&0xFF)<<(24-i%32);return output;}
function binb2rstr(input)
{var output="";for(var i=0;i<input.length*32;i+=8)
output+=String.fromCharCode((input[i>>5]>>>(24-i%32))&0xFF);return output;}
function binb_sha1(x,len)
{x[len>>5]|=0x80<<(24-len%32);x[((len+64>>9)<<4)+15]=len;var w=Array(80);var a=1732584193;var b=-271733879;var c=-1732584194;var d=271733878;var e=-1009589776;for(var i=0;i<x.length;i+=16)
{var olda=a;var oldb=b;var oldc=c;var oldd=d;var olde=e;for(var j=0;j<80;j++)
{if(j<16)w[j]=x[i+j];else w[j]=bit_rol(w[j-3]^w[j-8]^w[j-14]^w[j-16],1);var t=safe_add(safe_add(bit_rol(a,5),sha1_ft(j,b,c,d)),safe_add(safe_add(e,w[j]),sha1_kt(j)));e=d;d=c;c=bit_rol(b,30);b=a;a=t;}
a=safe_add(a,olda);b=safe_add(b,oldb);c=safe_add(c,oldc);d=safe_add(d,oldd);e=safe_add(e,olde);}
return Array(a,b,c,d,e);}
function sha1_ft(t,b,c,d)
{if(t<20)return(b&c)|((~b)&d);if(t<40)return b^c^d;if(t<60)return(b&c)|(b&d)|(c&d);return b^c^d;}
function sha1_kt(t)
{return(t<20)?1518500249:(t<40)?1859775393:(t<60)?-1894007588:-899497514;}
function safe_add(x,y)
{var lsw=(x&0xFFFF)+(y&0xFFFF);var msw=(x>>16)+(y>>16)+(lsw>>16);return(msw<<16)|(lsw&0xFFFF);}
function bit_rol(num,cnt)
{return(num<<cnt)|(num>>>(32-cnt));}
var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",decode:function(input){var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(i<input.length){enc1=this._keyStr.indexOf(input.charAt(i++));enc2=this._keyStr.indexOf(input.charAt(i++));enc3=this._keyStr.indexOf(input.charAt(i++));enc4=this._keyStr.indexOf(input.charAt(i++));chr1=(enc1<<2)|(enc2>>4);chr2=((enc2&15)<<4)|(enc3>>2);chr3=((enc3&3)<<6)|enc4;output=output+String.fromCharCode(chr1);if(enc3!=64){output=output+String.fromCharCode(chr2);}
if(enc4!=64){output=output+String.fromCharCode(chr3);}}
output=Base64._utf8_decode(output);return output;},_utf8_decode:function(utftext){var string="";var i=0;var c=c1=c2=0;while(i<utftext.length){c=utftext.charCodeAt(i);if(c<128){string+=String.fromCharCode(c);i++;}
else if((c>191)&&(c<224)){c2=utftext.charCodeAt(i+1);string+=String.fromCharCode(((c&31)<<6)|(c2&63));i+=2;}
else{c2=utftext.charCodeAt(i+1);c3=utftext.charCodeAt(i+2);string+=String.fromCharCode(((c&15)<<12)|((c2&63)<<6)|(c3&63));i+=3;}}
return string;}}
