/* ----------------------------------------------------------------------
	Janmedia Interactive JS Utils
	$Id: jmutils.js,v 1.19 2010-07-01 12:46:00 pcharasimiuk Exp $
---------------------------------------------------------------------- */

/* dom */
// 2009-02-02, fwo, prototype.js
if (typeof($)=='undefined') $ = function(id) { return document.getElementById(id) }
function $c(name) { return document.createElement(name); }

/* class */
function addClass(el,c) { if(!el) return; if(!containsClass(el, c)) el.className += " " + c; }
function removeClass(el, c) { if(!el) return; el.className = el.className.replace(new RegExp(c,"g"),""); }
function containsClass(el, c) { if(!el) return false; return el.className.indexOf(c) != -1 }

/* cookies */
function getCookie(name)
{
	var arg	= name + '=';
	var alen = arg.length;
	var	clen =document.cookie.length;
	var i = 0;
	while (i<clen)
	{
		var j = i + alen;
		if (document.cookie.substring(i,j)==arg) return getCookieVal(j);
		i = document.cookie.indexOf(" ",i) + 1;
		if (i==0) break;
	};
	return null;
}

function setCookie(name,value,path,expires)
{
	str = name + "=" + value;
	if (expires) str += " ;expires="+expires;
        if (path) str += " ;path="+path;
	document.cookie = str;
}

function getCookieVal(offset)
{
	var endstr = document.cookie.indexOf(";", offset);
	if (endstr==-1) endstr = document.cookie.length;
	return unescape(document.cookie.substring(offset,endstr));
};

function delCookie(name)
{
	if (getCookie(name))
    	document.cookie = name + "=; expires=Thu, 01-Jan-70 00:00:01 GMT";
}

/* debug */
function debug(object)
{
	var t = "";
	for(var i in object)
		t+=i+" -> "+object[i]+"<br>";
	document.body.innerHTML=t;
}

// render
function setOpacity(el, o)
{
	el.style.opacity = o/100;
	el.style.filter = "alpha(opacity="+o+")";
}

// prettier dialog
// errorMesssage - display message
// elementFocus - set focus to element after hide alert (optional)
function myAlert(errorMessage, elementFocus)
{
	var box = new AlertBox();
	box.addMessage(errorMessage);
	box.addPostElement(elementFocus);
	box.addButton("OK","Zamknij","button",false);
	box.show();
	box.addShadow();
	return false;
}

function AlertBox()
{
	var dialogAlertId = "dialog_alert";

	var elementFocus = null;
	var buttons = new Array();
	var returnVal = null;

	var alertBg = document.createElement("div");
	alertBg.setAttribute("id", dialogAlertId);
	document.getElementsByTagName("body").item(0).appendChild(alertBg);

	var dialog = document.createElement("div");
	dialog.className = "dialog";
	dialog.onclick = function(e) { e = e||event; e.cancelBubble = true; return false; }
	alertBg.appendChild(dialog);

	this.addShadow = function()
	{
		// shadow
		var shadow = document.createElement("div");
		shadow.className = "shadow";
		shadow.style.position = "absolute";
		shadow.style.background = "#000";
		shadow.style.top = (dialog.offsetTop + 3) + "px";
		shadow.style.left = (dialog.offsetLeft + 3) + "px";
		shadow.style.width = dialog.offsetWidth + "px";
		shadow.style.height = dialog.offsetHeight + "px";
		shadow.style.opacity = 0.15;
		shadow.style.filter = "alpha(opacity=15)";
		alertBg.appendChild(shadow);
	}

	this.addPostElement = function(elem)
	{
		elementFocus = elem;
	}

	this.addMessage = function(msg)
	{
		var text = document.createElement("div");
		text.className = "text";
		text.innerHTML = msg;
		text.onselectstart = new Function("return false");
		dialog.appendChild(text);
	}

	this.addButton = function(text, title, className, ret)
	{
		var button = document.createElement("a");
		button.setAttribute("href","#");
		button.innerHTML = text;
		button.className = className;
		button.onfocus = function() { addClass(this,"focus"); }
		button.title = title;
		button.onblur = function() { removeClass(this,"focus"); }
		dialog.appendChild(button);
		button.onclick = function()
		{
			alertBg.parentNode.removeChild(alertBg);
			if(elementFocus) elementFocus.focus();
			return false;
		}
		buttons[buttons.length] = button;
	}

	this.show = function()
	{
		var scroll = getPageScroll();

		alertBg.style.width = document.documentElement.scrollWidth + "px";
		alertBg.style.height = document.documentElement.scrollHeight + "px";

		var innerHeight = window.innerHeight ? window.innerHeight : ( screen.availHeight - 100 )

		dialog.style.position = "absolute";
		dialog.style.top = ( ( scroll.y + ( innerHeight/2 )  ) - ( dialog.offsetHeight / 2 ) ) + "px";
		dialog.style.left = ( (parseInt(alertBg.style.width) / 2) - ( dialog.offsetWidth / 2 ) ) + "px";

		alertBg.onclick = function()
		{
			dialog.className += " alert";
			setTimeout( function()
			{
				removeClass(dialog,"alert");
				if(buttons.length == 1) buttons[0].focus();
			}, 1000 );
		}

		buttons[buttons.length - 1].focus();
	}

	function getPageScroll()
	{
		var scroll = new Object();
		if (self.pageYOffset)
		{
			scroll.x = self.pageXOffset;
			scroll.y = self.pageYOffset;
		}
		else if (document.documentElement && document.documentElement.scrollTop)
		{
			scroll.x = document.documentElement.scrollLeft;
			scroll.y = document.documentElement.scrollTop;
		}
		else if (document.body)
		{
			scroll.x = document.body.scrollLeft;
			scroll.y = document.body.scrollTop;
		}
		return scroll;
	}


}

/* ajax */
function ajaxRequest(url, method, containerResponse, callback)
{
	var req;
	if(window.XMLHttpRequest)
		req = new XMLHttpRequest();
	else if(window.ActiveXObject)
		req = new ActiveXObject("Microsoft.XMLHTTP");
	if(!req) return false; // if browser doesn't support ajax return false

	method = method.toUpperCase();

	// process function
 	req.onreadystatechange=function()
 	{
  		if (req.readyState == 4)
  			if(req.status == 200)
  			{
  				if(containerResponse) containerResponse.innerHTML = req.responseText;
  				if(callback) callback(req);
  			}
	}

	// send request
	if(method == "GET")
	{
		req.open(method, url, true );
		req.send(null);
	}
	else if(method == "POST")
	{
		try // catch an exception to prevent errors (opera <= 8 doesn't support
			// post request)
		{
			req.open(method, url.slice(0,url.indexOf("?")), true );
			var parameters = url.slice(url.indexOf("?") + 1);
			req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	      	req.setRequestHeader("Content-length", parameters.length);
	      	req.setRequestHeader("Connection", "close");
	      	req.send(parameters);
      	}
      	catch (e)
      	{
      		return false;
      	}
	}
	else
	{
		alert("Not normal method: " + method);
		return false;
	}

	return true;
}


/* fb input hover */
addEvent(window,"load",run);

function run()
{
	setTimeout(hoverFbButtons,0);
}

importScript("/js/CSS.js");
function hoverFbButtons()
{
	var buttons = document.getElementsByTagName("input");
	for(var i = 0; i < buttons.length; i++)
	{
		var b = buttons[i];
		if(b.getAttribute("type")=="submit" && CSS.containsClass(b.parentNode.parentNode,"fb_submit"))
		{
			b.onmouseover = function() { CSS.addClass(this,"hover"); }
			b.onmouseout = function() { CSS.removeClass(this,"hover"); }
		}
	}
}

function toggleCategory(hId,aObj)
{
	var h = $(hId);
	if (CSS.containsClass(h,'unfolded')){
		aObj.innerHTML = 'rozwi\u0144';
		CSS.removeClass(h,'unfolded');
	} else{
		aObj.innerHTML = 'zwi\u0144'
		CSS.addClass(h,'unfolded');
	}
}


/* SUGGESTOR - requires basic functions from the top $, $c etc */
importScript('/js/AjaxRpc.js');
function createSuggestor(input, mainShop)
{
	input.setAttribute("autocomplete","off");
	var suggestorTimeout;

	var buffer = new Object();

	// fixy dla IE
	if (mainShop && (navigator.userAgent.indexOf("MSIE") != -1 || navigator.userAgent.indexOf("MSIE") != -1)) {
		if(typeof ieLfix == "undefined") ieLfix = 58;
		if(typeof ieTfix == "undefined") ieTfix = 13;
	} else {
		ieLfix = 0;
		ieTfix = 1;
	}

	// shadow
	var suggestShadow = $c("div");
	suggestShadow.className = "suggest_shadow hidden";
	suggestShadow.style.width = input.offsetWidth + "px";
	suggestShadow.style.left = (input.offsetLeft + ieLfix + 2) + "px";
	suggestShadow.style.top = (input.offsetTop + input.offsetHeight + ieTfix + 3) + "px";
	setOpacity(suggestShadow,10);
	input.form.appendChild(suggestShadow);

	var suggestContainer = $c("div");
	suggestContainer.className = "suggest hidden";
	suggestContainer.style.width = (input.offsetWidth - 2) + "px";
	suggestContainer.style.left = (input.offsetLeft + ieLfix) + "px";
	suggestContainer.style.top = ((input.offsetTop + input.offsetHeight) + ieTfix) + "px";
	suggestContainer.style.margin = "0 !important";
	input.form.appendChild(suggestContainer);
	var clauses = new Array();
	var activeClause = -1;

	var okURIchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";
	var hexchars = "0123456789ABCDEF";
	var clause = "";

	input.onkeydown = suggest;
	input.onfocus = suggest;
	addEvent(document,"click",hideSuggestor);
	input.onclick = function(e) { e=e||event; e.cancelBubble = true; }

	function suggest(e)
	{
		e = e || event;
		var key=e.keyCode ? e.keyCode : e.charCode;
		if(key==13||key==16||key==37||key==39)
		{
			if(key==13) clearTimeout(suggestorTimeout);
			return;
		}
		if(key==27)
		{
			replaceDefault(activeClause);
			hideSuggestor();
			return;
		}
		if(key==40||key==38)
		{
			if(clauses.length == 0) return;
			var newActiveClause = activeClause;
			newActiveClause += (key == 40) ? 1 : -1;

			if(newActiveClause < -1) { newActiveClause = clauses.length - 1; }
			else if(newActiveClause >= clauses.length) { newActiveClause = -1; }

			if(newActiveClause == -1) replaceDefault(newActiveClause);
			else replaceActive(newActiveClause,true);

			if (e.preventDefault) e.preventDefault();
			e.returnValue = false;
			return false;
		}
		else
		{
			clause = input.value;
			clearTimeout(suggestorTimeout);
			suggestorTimeout = setTimeout(searchSuggest,200);
		}
	}

	function replaceDefault(newActive)
	{
		removeClass(clauses[activeClause],"active");
		activeClause = newActive;
		input.value = clause;
	}

	function replaceActive(newActive,replaceInput)
	{
		if(activeClause != -1) removeClass(clauses[activeClause],"active");
		activeClause = newActive;
		addClass(clauses[activeClause],"active");
		if(replaceInput) input.value = clauses[activeClause].clause;
	}

	function searchSuggest()
	{
		if(input.value.length < 3)
		{
			hideSuggestor();
			return;
		}
		if(!buffer[input.value])
		{
			var f = function(req)
			{
				buffer[input.value] = req;
				displaySuggest(buffer[input.value]);
			}
			AjaxRpc.execute("com.janmedia.net.ajax.AjaxFacade.getSearchSuggests",[input.value],f);

// buffer[input.value] = ["asdf","asdfw34","asdfasdfasd"];
// displaySuggest(buffer[input.value]);

/*
 * ajaxRequest("/szukaj_podpowiedzi.xml?prefix=" +
 * encodeURIComponent(input.value), "GET",null, function(req) {
 * buffer[input.value] = req.responseXML; displaySuggest(buffer[input.value]); } );
 */
		}
		else
			displaySuggest(buffer[input.value]);
	}

	function displaySuggest(response)
	{

		clauses = new Array();
		suggestContainer.innerHTML = "";
		hideSuggestor();

		if(response.length == 0) return;

		var frame = $c("iframe");
		frame.src = "/images/blank.gif";
		frame.frameBorder="0";
		suggestContainer.appendChild(frame);

		showSuggestor();
		activeClause = -1;
		for( var i = 0; i < response.length; i++)
		{
			var clause = $c("div");
			clause.innerHTML = response[i] ;
// clause.innerHTML = responseClauses[i].getAttribute("name") + "<span>~" +
// responseClauses[i].getAttribute("results") + "</span>";
			clause.clause = clause.innerHTML;
			clause.title = "Szukaj wyra\u017Cenia: " + clause.innerHTML;
			clause.no = i;
			clause.onmouseover = function() { replaceActive(this.no,false) };
			clause.onclick = function() { replaceActive(this.no,true); input.form.submit() };
			suggestContainer.appendChild(clause);
			/*
			 * var results = $c("span"); results.innerHTML =
			 * responseClauses[i].getAttribute("results");
			 * //clause.appendChild(results);
			 */
			clauses[i] = clause;

		}
		// addClass(clauses[activeClause],"active");

// var close = $c("div");
// close.className = "close";
// suggestContainer.appendChild(close);
// var closeButton = $c("a");
// closeButton.href="#";
// closeButton.innerHTML = "Zamknij";
// closeButton.title = "Schowaj okno z podpowiedziami";
// close.appendChild(closeButton);
// close.onclick = function() { return false; }

		frame.style.height = (suggestContainer.offsetHeight - 4) + "px";
		frame.style.width = (suggestContainer.offsetWidth - 2) + "px";
		suggestShadow.style.height = (suggestContainer.offsetHeight - 1) + "px";
	}

	function hideSuggestor()
	{
		addClass(suggestContainer,"hidden");
		addClass(suggestShadow,"hidden");
		return true;
	}

	function showSuggestor()
	{
		removeClass(suggestContainer,"hidden");
		removeClass(suggestShadow,"hidden");
		return false;
	}

	function encodeURIComponent(s)
	{
		var s = utf8(s);
		var c;
		var enc = "";
		for (var i= 0; i<s.length; i++)
		{
			if (okURIchars.indexOf(s.charAt(i))==-1) enc += "%"+toHex(s.charCodeAt(i));
			else enc += s.charAt(i);
	  	}
	  	return enc;
	}

	function utf8(wide)
	{
		var c, s; var enc = ""; var i = 0;
		while(i<wide.length)
		{
			c= wide.charCodeAt(i++);
			// handle UTF-16 surrogates
			if (c>=0xDC00 && c<0xE000) continue;
			if (c>=0xD800 && c<0xDC00)
			{
				if (i>=wide.length) continue;
				s= wide.charCodeAt(i++);
				if (s<0xDC00 || c>=0xDE00) continue;
				c= ((c-0xD800)<<10)+(s-0xDC00)+0x10000;
			}
			// output value
				if (c<0x80) enc += String.fromCharCode(c);
				else if (c<0x800) enc += String.fromCharCode(0xC0+(c>>6),0x80+(c&0x3F));
				else if (c<0x10000) enc += String.fromCharCode(0xE0+(c>>12),0x80+(c>>6&0x3F),0x80+(c&0x3F));
				else enc += String.fromCharCode(0xF0+(c>>18),0x80+(c>>12&0x3F),0x80+(c>>6&0x3F),0x80+(c&0x3F));
		}
		return enc;
	}

	function toHex(n)
	{
		return hexchars.charAt(n>>4)+hexchars.charAt(n & 0xF);
	}
}