/* ZACATEK SOUBORU - ajax@p1 ******************************************************/
/** 
 * Funkce pro odeslani HTTP pozadavku pro AJAX
 * 
 * @param successHandler reference na funkci pro obsluhu uspesne dokonceneho pozadavku
 * @param errorHandler reference na funkci pro obsluhu chyby
 * @param [parameters] pole s parametry
 * @param [content] telo odeslane zpravy
 * 
 * @return true v pripade uspechu
 *
 * Autor: V3lbloud [2008-05-16]
 */ 
function ajaxRequest(successHandler, errorHandler, parameters, content) {	
	var httpRequest;

	// IE
	if(window.ActiveXObject) {
		httpRequest = new ActiveXObject("Microsoft.XMLHTTP");

	// Mozilla, Safari, ...
	} else if(window.XMLHttpRequest) {
		httpRequest = new XMLHttpRequest();
		httpRequest.overrideMimeType('text/xml');

	} else {
		return false;
	}

	var paramStr = '?nocache=' + (new Date).getTime();
	if(parameters) {
		for(var key in parameters)
			paramStr += '&' + key + '=' + urlencode(parameters[key]);
	}

	httpRequest.onreadystatechange = function() {
		ajaxResponseHandler(httpRequest, successHandler, errorHandler);
	};

	httpRequest.open('GET', 'http://www.paralekarna.cz/ajax/5-5/831-831/10-10/8-8/1036-1036' + paramStr);
	httpRequest.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
	httpRequest.send(content);
	return true;
}

/** 
 * Funkce pro pro zpracovani odpovedi na HTTP pozadavek z AJAXu
 * 
 * @param httpRequest reference na HTTP objekt
 * @param successHandler reference na funkci pro obsluhu uspesne dokonceneho pozadavku
 * @param errorHandler reference na funkci pro obsluhu chyby
 *
 * @return true v pripade uspechu
 *
 * Autor: V3lbloud [2008-05-16]
 */
function ajaxResponseHandler(httpRequest, successHandler, errorHandler) {
	if(httpRequest.readyState == 4) {
		if(httpRequest.status == 200) {
			// IE
			if(window.ActiveXObject) {
				xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
				xmlDoc.async = "false";
				xmlDoc.loadXML(httpRequest.responseText);

				if(xmlDoc.parseError != 0) {
					if(errorHandler) errorHandler("Chyba XML");
					return false;
				} else {
					if(successHandler) successHandler(xmlDoc);
					return true;
				}			
						
			// FF, Mozilla, Safari ...
			} else if(window.XMLHttpRequest) {
				if((httpRequest.responseXML == null)||(httpRequest.responseXML.documentElement.nodeName == "parsererror")) {
					if(errorHandler) errorHandler("Chyba XML");
					return false;
				} else {
					if(successHandler) successHandler(httpRequest.responseXML);
					return true;
				}
			} else {
				if(errorHandler) errorHandler("Parser se nepodarilo inicializovat");
				return false;
			}

			return true;
		} else if(httpRequest.status != 0) {	// HTTP 0 (prijaty neuplny pozadavek - obcas pri refreshi stranky)
			if(errorHandler) errorHandler("HTTP " + httpRequest.status);
			return false;
		} 
	}

	return true;
}

/**
  * Funkce vraci hodnotu atributu XML elementu nebo defaultValue, pokud nebyl definovan
  *
  * @param node reference na XML element
  * @param name jmeno atributu
  * @param [defaultValue] vychozi hodnota
  *
  * @return hodnota atributu
  *
  * Autor: V3lbloud [2008-05-16]
  */
function getNodeAttribute(node, name, defaultValue) {
	for(var i in node.attributes) {
		if(node.attributes[i].name == name)
			return node.attributes[i].value;
	}

	return defaultValue;
}

/**
 * Funkce pro zakodovani retezce pro pouziti v URL
 * Prevzato z http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_urlencode/
 */
function urlencode(str) {
    var histogram = {}, tmp_arr = [];
    var ret = str.toString();
    
    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    // The histogram is identical to the one in urldecode.
    histogram["'"]   = '%27';
    histogram['(']   = '%28';
    histogram[')']   = '%29';
    histogram['*']   = '%2A';
    histogram['~']   = '%7E';
    histogram['!']   = '%21';
    histogram['%20'] = '+';
    
    // Begin with encodeURIComponent, which most resembles PHP's encoding functions
    ret = encodeURIComponent(ret);
    
    for (search in histogram) {
        replace = histogram[search];
        ret = replacer(search, replace, ret) // Custom replace. No regexing
    }
    
    // Uppercase for full PHP compatibility
    return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
        return "%"+m2.toUpperCase();
    });
    
    return ret;
}
/* ZACATEK SOUBORU - common-functions@p1 ******************************************************/
/*
 * Funkce vyhleda vsechny tagy tagName, ktere jsou potomky elementu htmlElement,
 *  a maji tridu className
 *  
 * @param htmlElement reference na HTML element
 * @param tagName nazev hledaneho tagu
 * @param className nazev hledane tridy
 */     
function getElementsByClassName(htmlElement, tagName, className) {
  var result = Array();
  
  for(var key in htmlElement.getElementsByTagName(tagName)) {
    var child = htmlElement.getElementsByTagName(tagName)[key];
    if(child.className) {
      var classes = child.className.split(" ");
    
      for(var i = 0; i < classes.length; i++) {
        if(classes[i] == className) {
          result[result.length] = child;
          break;
        }
      }
    }
  }
  
  return result;
}
/* ZACATEK SOUBORU - messages@messages ******************************************************/
/*
 * Funkce prida hlasku typu type s textem text do vypisu hlasek
 *
 * @param text text hlasky
 * @param [type] typ hlasky (defaultne: info)
 */
function addMessage(text, type) {
	var msgType = (type) ? type : 'info';
	var msgBlocks = getElementsByClassName(document, 'div', 'messageListingBlock');

	for(var key in msgBlocks) {
		var msgBlock = msgBlocks[key];
		msgBlock.innerHTML += '<div class="msg ' + msgType + 'Msg">' + text + '</div>';
	}

	return (msgBlocks.length > 0);
}
/* ZACATEK SOUBORU - pollVote@poll ******************************************************/
function vote(pollId, voteId) {
	// Celkovy pocet hlasu
	var totalNode = document.getElementById('poll' + pollId + '-total');
	var newTotal = parseInt(totalNode.innerHTML) + 1;
	totalNode.innerHTML = newTotal;

	if(newTotal == 1) {
		document.getElementById('poll' + pollId + '-total1').innerHTML = 'V anketě hlasoval';
		document.getElementById('poll' + pollId + '-total2').innerHTML = 'člověk';
	} else if((newTotal < 5)&&(newTotal > 0)) {
		document.getElementById('poll' + pollId + '-total1').innerHTML = 'V anketě hlasovali';
		document.getElementById('poll' + pollId + '-total2').innerHTML = 'lidi';
	} else {
		document.getElementById('poll' + pollId + '-total1').innerHTML = 'V anketě hlasovalo';
		document.getElementById('poll' + pollId + '-total2').innerHTML = 'lidí';
	}

	// Zrusim odkazy a prepocitam procenta
	var pollAnswers = document.getElementById('pollAnswerListing-' + pollId).getElementsByTagName('h5');
	for(var key in pollAnswers) {
		if(pollAnswers[key].className == 'pollAnswer') {
			var answerId = pollAnswers[key].getAttribute('id').substr(pollAnswers[key].getAttribute('id').lastIndexOf('r') + 1);			
			var percentageNode = document.getElementById('poll' + pollId + '-percentage' + answerId);			
			var votes = Math.round(parseFloat(percentageNode.innerHTML) /100 * (newTotal - 1));

			// Nova procenta
			if(voteId == answerId) {
				percentageNode.innerHTML = ((votes + 1) / (newTotal / 100)).toFixed(1) + '%';
				document.getElementById('poll' + pollId + '-chartBar' + answerId).style.width = percentageNode.innerHTML;
			} else {
				percentageNode.innerHTML = (votes / (newTotal / 100)).toFixed(1) + '%';
				document.getElementById('poll' + pollId + '-chartBar' + answerId).style.width = percentageNode.innerHTML;
			}			

			pollAnswers[key].innerHTML = pollAnswers[key].firstChild.innerHTML;
		}
	}

	addMessage('Váš hlas byl započítán.<br />Děkujeme za vaši účast v anketě.');

	var params = new Array();
	params['vote'] = voteId;
	return ajaxRequest(null, null, params);
}
