function	autoUrl(name, dest)
{
	var loc;
	var id_list;

	id_list = document.getElementById(name);
	loc = id_list.options[id_list.selectedIndex].value;
	if (loc != 0)
		location.href = dest+loc;
	return ;
}

function	autoUrlNoList(name, dest)
{
	var loc;

	loc = document.getElementById(name).checked;
	location.href = dest + (loc == true ? 1 : 0);
	return ;
}

/*
** show or hide element e depending on condition show
*/
function toggle(e, show)
{
	e.style.display = show ? '' : 'none';
}

function toggleMultiple(tab)
{
    var len = tab.length;

    for (var i = 0; i < len; i++)
        if (tab[i].style)
            toggle(tab[i], tab[i].style.display == 'none');
}

/**
* Show dynamicaly an element by changing the sytle "display" property
* depending on the option selected in a select.
*
* @param string $select_id id of the select who controls the display
* @param string $elem_id prefix id of the elements controlled by the select
*   the real id must be : 'elem_id'+nb with nb the corresponding number in the
*   select (starting with 0).
*/
function showElemFromSelect(select_id, elem_id)
{
	var select = document.getElementById(select_id);
	for (var i = 0; i < select.length; ++i)
	{
	    var elem = document.getElementById(elem_id + select.options[i].value);
		if (elem != null)
			toggle(elem, i == select.selectedIndex);
	}
}

/**
* Get all div with specified name and for each one (by id), toggle their visibility
*/
function openCloseAllDiv(name, option)
{
	var tab = $('*[name='+name+']');
	for (var i = 0; i < tab.length; ++i)
		toggle(tab[i], option);
}

/**
* Toggle the value of the element id_button between text1 and text2
*/
function toggleElemValue(id_button, text1, text2)
{
	var obj = document.getElementById(id_button);
	if (obj)
		obj.value = ((!obj.value || obj.value == text2) ? text1 : text2);
}

function addBookmark(url, title)
{
	if (window.sidebar)
		return window.sidebar.addPanel(title, url, "");
	else if ( window.external )
		return window.external.AddFavorite( url, title);
	else if (window.opera && window.print)
		return true;
	return true;
}

function writeBookmarkLink(url, title, text, img)
{
	var insert = '';
	if (img)
		insert = writeBookmarkLinkObject(url, title, '<img src="' + img + '" alt="' + escape(text) + '" title="' + escape(text) + '" />') + '&nbsp';
	insert += writeBookmarkLinkObject(url, title, text);
	document.write(insert);
}

function writeBookmarkLinkObject(url, title, insert)
{
	if (window.sidebar || window.external)
		return ('<a href="javascript:addBookmark(\'' + escape(url) + '\', \'' + escape(title) + '\')">' + insert + '</a>');
	else if (window.opera && window.print)
		return ('<a rel="sidebar" href="' + escape(url) + '" title="' + escape(title) + '">' + insert + '</a>');
	return ('');
}

function checkCustomizations()
{
	var tmp;
	var pattern = new RegExp(' ?filled ?');
	for (var i = 0; i < customizationFields.length; i++)
		/* If the field is required and empty then we abort */
		if (parseInt(customizationFields[i][1]) == 1 && $('#' + customizationFields[i][0]).val() == '' && !pattern.test($('#' + customizationFields[i][0]).attr('class')))
			return false;
	return true;
}

function ceilf(value, precision)
{
	if (typeof(precision) == 'undefined')
		precision = 0
	var precisionFactor = precision == 0 ? 1 : Math.pow(10, precision);
	var tmp = value * precisionFactor;
	var tmp2 = tmp.toString();
	// If the current value has already the desired precision
	if (tmp2.indexOf('.') === false)
		return (value);
	if (tmp2.charAt(tmp2.length - 1) == 0)
		return value;
	return Math.ceil(tmp) / precisionFactor;
}

function floorf(value, precision)
{
	if (typeof(precision) == 'undefined')
		precision = 0
	var precisionFactor = precision == 0 ? 1 : Math.pow(10, precision);
	var tmp = value * precisionFactor;
	var tmp2 = tmp.toString();
	// If the current value has already the desired precision
	if (tmp2.indexOf('.') === false)
		return (value);
	if (tmp2.charAt(tmp2.length - 1) == 0)
		return value;
	return Math.floor(tmp) / precisionFactor;
}

/////////////////////////////////////////// behavior.js
var Behaviour = {
		list : new Array,
		
		register : function(sheet){
			Behaviour.list.push(sheet);
		},
		
		start : function(){
			Behaviour.addLoadEvent(function(){
				Behaviour.apply();
			});
		},
		
		apply : function(){
			for (h=0;sheet=Behaviour.list[h];h++){
				for (selector in sheet){
					list = document.getElementsBySelector(selector);
					
					if (!list){
						continue;
					}

					for (i=0;element=list[i];i++){
						sheet[selector](element);
					}
				}
			}
		},
		
		addLoadEvent : function(func){
			var oldonload = window.onload;
			
			if (typeof window.onload != 'function') {
				window.onload = func;
			} else {
				window.onload = function() {
					oldonload();
					func();
				}
			}
		}
	}

	Behaviour.start();

	function getAllChildren(e) {
	  // Returns all children of element. Workaround required for IE5/Windows. Ugh.
	  return e.all ? e.all : e.getElementsByTagName('*');
	}

	document.getElementsBySelector = function(selector) {
	  // Attempt to fail gracefully in lesser browsers
	  if (!document.getElementsByTagName) {
	    return new Array();
	  }
	  // Split selector in to tokens
	  var tokens = selector.split(' ');
	  var currentContext = new Array(document);
	  for (var i = 0; i < tokens.length; i++) {
	    token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;
	    if (token.indexOf('#') > -1) {
	      // Token is an ID selector
	      var bits = token.split('#');
	      var tagName = bits[0];
	      var id = bits[1];
	      var element = document.getElementById(id);
	      if (tagName && element.nodeName.toLowerCase() != tagName) {
	        // tag with that ID not found, return false
	        return new Array();
	      }
	      // Set currentContext to contain just this element
	      currentContext = new Array(element);
	      continue; // Skip to next token
	    }
	    if (token.indexOf('.') > -1) {
	      // Token contains a class selector
	      var bits = token.split('.');
	      var tagName = bits[0];
	      var className = bits[1];
	      if (!tagName) {
	        tagName = '*';
	      }
	      // Get elements matching tag, filter them for class selector
	      var found = new Array;
	      var foundCount = 0;
	      for (var h = 0; h < currentContext.length; h++) {
	        var elements;
	        if (tagName == '*') {
	            elements = getAllChildren(currentContext[h]);
	        } else {
	            elements = currentContext[h].getElementsByTagName(tagName);
	        }
	        for (var j = 0; j < elements.length; j++) {
	          found[foundCount++] = elements[j];
	        }
	      }
	      currentContext = new Array;
	      var currentContextIndex = 0;
	      for (var k = 0; k < found.length; k++) {
	        if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) {
	          currentContext[currentContextIndex++] = found[k];
	        }
	      }
	      continue; // Skip to next token
	    }
	    // Code to deal with attribute selectors
	    if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
	      var tagName = RegExp.$1;
	      var attrName = RegExp.$2;
	      var attrOperator = RegExp.$3;
	      var attrValue = RegExp.$4;
	      if (!tagName) {
	        tagName = '*';
	      }
	      // Grab all of the tagName elements within current context
	      var found = new Array;
	      var foundCount = 0;
	      for (var h = 0; h < currentContext.length; h++) {
	        var elements;
	        if (tagName == '*') {
	            elements = getAllChildren(currentContext[h]);
	        } else {
	            elements = currentContext[h].getElementsByTagName(tagName);
	        }
	        for (var j = 0; j < elements.length; j++) {
	          found[foundCount++] = elements[j];
	        }
	      }
	      currentContext = new Array;
	      var currentContextIndex = 0;
	      var checkFunction; // This function will be used to filter the elements
	      switch (attrOperator) {
	        case '=': // Equality
	          checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
	          break;
	        case '~': // Match one of space seperated words 
	          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
	          break;
	        case '|': // Match start with value followed by optional hyphen
	          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
	          break;
	        case '^': // Match starts with value
	          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
	          break;
	        case '$': // Match ends with value - fails with "Warning" in Opera 7
	          checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
	          break;
	        case '*': // Match ends with value
	          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
	          break;
	        default :
	          // Just test for existence of attribute
	          checkFunction = function(e) { return e.getAttribute(attrName); };
	      }
	      currentContext = new Array;
	      var currentContextIndex = 0;
	      for (var k = 0; k < found.length; k++) {
	        if (checkFunction(found[k])) {
	          currentContext[currentContextIndex++] = found[k];
	        }
	      }
	      // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);
	      continue; // Skip to next token
	    }
	    
	    if (!currentContext[0]){
	    	return;
	    }
	    
	    // If we get here, token is JUST an element (not a class or ID selector)
	    tagName = token;
	    var found = new Array;
	    var foundCount = 0;
	    for (var h = 0; h < currentContext.length; h++) {
	      var elements = currentContext[h].getElementsByTagName(tagName);
	      for (var j = 0; j < elements.length; j++) {
	        found[foundCount++] = elements[j];
	      }
	    }
	    currentContext = found;
	  }
	  return currentContext;
	}

	var xmlhttp
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
	  try {
	  xmlhttp=new ActiveXObject("Msxml2.XMLHTTP")
	 } catch (e) {
	  try {
	    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
	  } catch (E) {
	   xmlhttp=false
	  }
	 }
	@else
	 xmlhttp=false
	@end @*/
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
	 try {
	  xmlhttp = new XMLHttpRequest();
	 } catch (e) {
	  xmlhttp=false
	 }
	}
	function myXMLHttpRequest() {
	  var xmlhttplocal;
	  try {
	    xmlhttplocal= new ActiveXObject("Msxml2.XMLHTTP")
	 } catch (e) {
	  try {
	    xmlhttplocal= new ActiveXObject("Microsoft.XMLHTTP")
	  } catch (E) {
	    xmlhttplocal=false;
	  }
	 }

	if (!xmlhttplocal && typeof XMLHttpRequest!='undefined') {
	 try {
	  var xmlhttplocal = new XMLHttpRequest();
	 } catch (e) {
	  var xmlhttplocal=false;
	  alert('couldn\'t create xmlhttp object');
	 }
	}
	return(xmlhttplocal);
	}

	function sndReq(vote,id_num,ip_num,units) {
	var theUL = document.getElementById('unit_ul'+id_num); // the UL

	// switch UL with a loading div
	theUL.innerHTML = '<div class="loading"></div>';

	xmlhttp.open('get', 'modules/productrating/rating/rpc.php?j='+vote+'&q='+id_num+'&t='+ip_num+'&c='+units);
	xmlhttp.onreadystatechange = handleResponse;
	xmlhttp.send(null);	
	}

	function handleResponse() {
	if(xmlhttp.readyState == 4){
		if (xmlhttp.status == 200){
	   	
	    var response = xmlhttp.responseText;
	    var update = new Array();

	    if(response.indexOf('|') != -1) {
	        update = response.split('|');
	        changeText(update[0], update[1]);
	    }
		}
	}
	}

	function changeText( div2show, text ) {
	// Detect Browser
	var IE = (document.all) ? 1 : 0;
	var DOM = 0; 
	if (parseInt(navigator.appVersion) >=5) {DOM=1};

	// Grab the content from the requested "div" and show it in the "container"
	if (DOM) {
	    var viewer = document.getElementById(div2show);
	    viewer.innerHTML = text;
	}  else if(IE) {
	    document.all[div2show].innerHTML = text;
	}
	}

	/* =============================================================== */
	var ratingAction = {
		'a.rater' : function(element){
			element.onclick = function(){

			var parameterString = this.href.replace(/.*\?(.*)/, "$1"); // onclick="sndReq('j=1&q=2&t=127.0.0.1&c=5');
			var parameterTokens = parameterString.split("&"); // onclick="sndReq('j=1,q=2,t=127.0.0.1,c=5');
			var parameterList = new Array();

			for (j = 0; j < parameterTokens.length; j++) {
				var parameterName = parameterTokens[j].replace(/(.*)=.*/, "$1"); // j
				var parameterValue = parameterTokens[j].replace(/.*=(.*)/, "$1"); // 1
				parameterList[parameterName] = parameterValue;
			}
			var theratingID = parameterList['q'];
			var theVote = parameterList['j'];
			var theuserIP = parameterList['t'];
			var theunits = parameterList['c'];
			
			//for testing	alert('sndReq('+theVote+','+theratingID+','+theuserIP+','+theunits+')'); return false;
			sndReq(theVote,theratingID,theuserIP,theunits); return false;		
			}
		}
		
	};
	Behaviour.register(ratingAction);
////////////////////////////////////////////////////////////////////////////////
