/*********************************************************************************/
//                           FRANK HEININGER MEDIA WORKS                   
//                      CUSTOM RADIO BUTTONS & CHECKBOXES                
//                                  v.1.1 (c)2006                            
//                     JAVASCRIPT TO INCLUDE IN THE HTML HEADER           
//                                                                           
//  [CAUTION]                                                                 
//  Don't forget to define images for the custom radio buttons and checkboxes.   
//                                                                         
//      for more information read the howto.txt delivered in this package      
//                                                                          
//   media@gloryempire.de                                  www.fhm-works.de.vu   
//                                                                            
// developed and published by |FRANK HEININGER MEDIA WORKS| made in germany 2006 
//                                                                              
// version 1.1 by Patrick van der Puye (patvdp@gmx.de)            
//		- added array support              
// version 1.2 by Patrick van der Puye (patvdp@gmx.de)                 
//		- added support for disabled buttons                                                            
/*********************************************************************************/




/** SUPPORT FUNCTIONS **/


/**
* adds an eventhandler to an html tag
*
* @param 	html object		html tag
* @param	string			event name
* @param	function		function to be called by event
* @return	bool			success
*/
function FHM_FORM_addEvent(elemObj, evType, funcName){
	if(evType.substr(0,2)=="on")
		evType = evType.substring(2,evType.length);
	if (elemObj.addEventListener){
   		elemObj.addEventListener(evType,funcName,false);
   		return true;
	}else if(elemObj.attachEvent){
   		var r = elemObj.attachEvent("on"+evType,funcName);
   		return r;
	}else{
   		return false;
	}
}


/**
* gets the caller of an event object
*
* @param 	event object	event
* @return	html object		caller of event
*/
function FHM_FORM_getEventSender(ev){
   	return (ev.target) ? ev.target : ev.srcElement;
}




/** MAIN FUNCTIONS **/


/**
* entry for initialization of alternative
* radio buttons and checkboxes
*
* @return	none
*/
FHM_FORM_initialize = function(){

	try{
		FHM_FORM_radioActive;
		FHM_FORM_radioInactive;
		FHM_FORM_checkboxActive;
		FHM_FORM_checkboxInactive;

		FHM_FORM_initializeRadio();
		FHM_FORM_initializeCheckbox();


	}catch(e){
		alert("*** FHM WORKS - CUSTOM RADIO BUTTONS & CHECKBOXES ***\n\nERROR:\n\n There is/are one or more image(s) for custom radio buttons \n and checkboxes that is not defined.");
	}

}


/**
* gets the formular object by one of its children
*
* @param 	html object		child node
* @return	html object		form node if succed
* 			bool			false if failed
*/
function FHM_FORM_getFormByChild(formChild){
	parentElem = formChild.parentNode;
	while(parentElem){
		if(parentElem.tagName.toLowerCase()=="form")
			return parentElem;
		parentElem = parentElem.parentNode;
	}
	return false;
}


/**
* replaces the common radio buttons of the
* document by the defined alternative images
* and creates a hidden value to store and
* submit the selected value
*
* @return	none
*/
function FHM_FORM_initializeRadio(){
	i=0;
	while(document.getElementsByTagName("FORM")[i]){
		formular = document.getElementsByTagName("FORM")[i];
		j=0;
		setNb=0;
		nameCnt = [];
		activeImage = [];
		inpHidden = [];
		radioSets=[];
		while(formular.getElementsByTagName("INPUT")[j]){
			element = formular.getElementsByTagName("INPUT")[j];
			if(element.getAttribute("type")=="radio"){
				elemChecked = (element.checked) ? true : false;
				elemName = element.getAttribute("name");
				elemValue = element.getAttribute("value");
				elemParent = element.parentNode;
				if(nameCnt[elemName]>0){
					nameCnt[elemName] = nameCnt[elemName] + 1;
				}else{
					radioSets[setNb] = elemName;setNb++;
					hideInp = document.createElement("INPUT");
					hideInp.setAttribute("id",elemName);
					hideInp.setAttribute("name",elemName);
					hideInp.setAttribute("type","hidden");
					hideInp.setAttribute("value","");
						formular.appendChild(hideInp);
					nameCnt[elemName] = 1;
					inpHidden[elemName] = hideInp;
				}
				image = document.createElement("IMG");
				image.setAttribute("id",elemName + "\[" + (nameCnt[elemName]-1) + "\]");
				image.setAttribute("name",elemValue);
				
				if (!element.getAttribute("disabled"))
					FHM_FORM_addEvent(image,"click", FHM_FORM_clickRadio);
				else
					image.style.opacity=0.5;
					
				image.setAttribute("src",FHM_FORM_radioInactive);
				image.setAttribute("class",'FHM_Radio');

				elemParent.replaceChild(image,element);
				if(elemChecked){
					inpHidden[elemName].setAttribute("value",elemValue);
					activeImage[elemName] = image;
				}
			}else{
				j++;
			}
		}
		for(k=0;k<setNb;k++){
			elem = radioSets[k];
			if(inpHidden[elem].getAttribute("value")!="")
				activeImage[elem].setAttribute("src",FHM_FORM_radioActive);
			else
				inpHidden[elem].setAttribute("name","");
		}
		i++;
	}
}


/**
* replaces the common checkboxes of the
* document by the defined alternative images
* and creates hidden values for each checkbox
* to store and submit the selected values
*
* @return	none
*/
function FHM_FORM_initializeCheckbox(){
	i=0;

	while(document.getElementsByTagName("FORM")[i]){
		formular = document.getElementsByTagName("FORM")[i];
		j=0;
		nameCnt = [];
		inpHidden = [];
		checkedCnt=[];
		while(formular.getElementsByTagName("INPUT")[j]){
			element = formular.getElementsByTagName("INPUT")[j];
			
			if(element.getAttribute("type")=="checkbox"){
						
				elemChecked = (element.checked) ? true : false;
				elemName = element.getAttribute("name");
				elemValue = element.getAttribute("value");
				elemParent = element.parentNode;
				if(nameCnt[elemName]>0){
					nameCnt[elemName] = nameCnt[elemName] + 1;
				}else{
					checkedCnt[elemName] = 0;
					nameCnt[elemName] = 1;
					inpHidden[elemName] = []
				}
				hideInp = document.createElement("INPUT");
				hideInp.setAttribute("id",elemName + "[" + (nameCnt[elemName]-1) + "]");
				hideInp.setAttribute("name","");
				hideInp.setAttribute("type","hidden");
				hideInp.setAttribute("value","");
				inpHidden[elemName][(nameCnt[elemName]-1)] = hideInp;
				formular.appendChild(hideInp);
				image = document.createElement("IMG");
				image.setAttribute("id",elemName + "\[" + (nameCnt[elemName]-1) + "\]");
				image.setAttribute("name",elemValue);
				image.setAttribute("class",'FHM_Checkbox');
				if (!element.getAttribute("disabled"))
					FHM_FORM_addEvent(image,"click", FHM_FORM_clickCheckbox);
				else
					image.style.opacity=0.5;
					
				if(elemChecked){
					image.setAttribute("src",FHM_FORM_checkboxActive);
					inpHidden[elemName][checkedCnt[elemName]].setAttribute("name",elemName + "[" + checkedCnt[elemName] + "]");
					inpHidden[elemName][checkedCnt[elemName]].setAttribute("value",elemValue);
					checkedCnt[elemName] = checkedCnt[elemName] + 1;
				}else{
					image.setAttribute("src",FHM_FORM_checkboxInactive);
				}
				elemParent.replaceChild(image,element);
			}else{
				j++;
			}
		}
		i++;
	}
}


/**
* reacts when a radio button is clicked,
* switches image sources and
* updates the hidden field
*
* @param 	event object	event that is calling the function
* @return	none
*/
FHM_FORM_clickRadio = function(ev){
	sender = FHM_FORM_getEventSender(ev);
	formular = FHM_FORM_getFormByChild(sender);
	if(formular){
		paramName = (sender.getAttribute("id")).substring(0,(sender.getAttribute("id")).indexOf("["));
		i=0;
		while(formular.getElementsByTagName("IMG")[i]){
			element = formular.getElementsByTagName("IMG")[i];
			if ((element.getAttribute("id")) && (element.getAttribute("id").match("^"+paramName) && element.getAttribute("id").substr(paramName.length,1)=="[")){
				if(element==sender)
					element.setAttribute("src",FHM_FORM_radioActive);
				else
					element.setAttribute("src",FHM_FORM_radioInactive);
			}
			i++;
		}
		i=0;
		while(formular.getElementsByTagName("INPUT")[i]){
			element = formular.getElementsByTagName("INPUT")[i];
			if(element.getAttribute("type")=="hidden" && element.getAttribute("id")==paramName){
				element.setAttribute("name",paramName);
				element.setAttribute("value",sender.getAttribute("name"));
				break;
			}
			i++;
		}
	}
}


/**
* reacts when a checkbox is clicked,
* switches the image source and
* updates the hidden fields
*
* @param 	event object	event that is calling the function
* @return	none
*/
FHM_FORM_clickCheckbox = function(ev){
	sender = FHM_FORM_getEventSender(ev);
	formular = FHM_FORM_getFormByChild(sender);
	values = [];valCnt=0;
	if(formular){
		paramName = (sender.getAttribute("id")).substring(0,(sender.getAttribute("id")).lastIndexOf("["));
		length1 = sender.getAttribute("src").length;
		length2 = FHM_FORM_checkboxActive.length;

		if((sender.getAttribute("src").substr(length1-length2,length2)==FHM_FORM_checkboxActive) && (length1==length2 || sender.getAttribute("src").charAt(length1-length2-1)=="\/"))
			sender.setAttribute("src",FHM_FORM_checkboxInactive);
		else
			sender.setAttribute("src",FHM_FORM_checkboxActive);
		i=0;valCnt=0;
		while(formular.getElementsByTagName("IMG")[i]){

			element = formular.getElementsByTagName("IMG")[i];

			if((element.getAttribute("id")) && (element.getAttribute("id").indexOf(paramName)==0 && element.getAttribute("id").substr(paramName.length,1)=="[")){
				length1 = element.getAttribute("src").length;
				length2 = FHM_FORM_checkboxActive.length;


				if((element.getAttribute("src").substr(length1-length2,length2)==FHM_FORM_checkboxActive) && (length1==length2 || element.getAttribute("src").charAt(length1-length2-1)=="\/")){
					values[valCnt] = element.getAttribute("name");
					valCnt++;
				}
			}
			i++;
		}
		i=0;setCnt=0;
		while(formular.getElementsByTagName("INPUT")[i]){
			element = formular.getElementsByTagName("INPUT")[i];
			if ((element.getAttribute("id")) && (element.getAttribute("type")=="hidden" && element.getAttribute("id").substr(0,paramName.length)==paramName && element.getAttribute("id").substr(paramName.length,1)=="[")){
				if(setCnt<valCnt){

					element.setAttribute("name",element.getAttribute("id"));
					element.setAttribute("value",values[setCnt]);
					setCnt++;
				}else{
					element.setAttribute("name","");
					element.setAttribute("value","");
				}

			}
			i++;
		}
	}
}




/** MAIN **/


/**
* when document is loaded call initialization
* by adding an onload eventhandler
*/
onload = FHM_FORM_initialize;
