
// http://stackoverflow.com/questions/136617/how-do-i-programatically-force-an-onchange-event-on-an-input
function fireEvent(element,event) {
    if (document.createEventObject) {
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt);
    }
    else {
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}

function clickLink(linkId) // client-side button/link clicking by the component's id
{
    var fireOnThis = document.getElementById(linkId);
    if (document.createEvent)
    {
	    var evObj = document.createEvent('MouseEvents');
	    evObj.initEvent( 'click', true, false );
	    fireOnThis.dispatchEvent(evObj);
    }
    else if (document.createEventObject)
    {
        fireOnThis.fireEvent('onclick');
	}
}

function incValueRound(component_id,decimals) {
	incrementValueRound(component_id, decimals, 1);
}
function decValueRound(component_id,decimals) {
	incrementValueRound(component_id, decimals, -1);
}
function incrementValueRound(component_id,decimals,sign) {
	var size = Math.pow(10, -decimals) *(Math.abs(sign)/sign);
    var elem = document.getElementById(component_id);
    var currentValue = Number(elem.value);
    var newNumber = Math.round((currentValue+size)*Math.pow(10,decimals))/Math.pow(10,decimals);
    elem.value = newNumber;
    
    fireEvent(elem, 'change');
}

function forceNumberLimits(component_id,minValue,maxValue,maxFractionDigits) {
	var val = Number(document.getElementById(component_id).value.replace(",","."));
	if (minValue != null && val < minValue)
		val = minValue;
	else if (maxValue != null && val > maxValue)
		val = maxValue;
	val = val.toFixed(maxFractionDigits);
	
	document.getElementById(component_id).value = val;
}

// http://www.annedorko.com/blog/toggle-enable-and-disable-a-form-field-with-a-checkbox-javascript-101
function toggleEnabledByCheckbox(checkboxElem, toggleID) {
	var toggle = document.getElementById(toggleID);
	updateToggle = checkboxElem.checked ? toggle.disabled=false : toggle.disabled=true;
}

function clickLinkOnEnter(event, linkId)
{
    if (event.keyCode==13)
        clickLink(linkId);
}

// based on http://softwareas.com/dynamic-favicon-library-updated by Michael Mahemoff's 

function addLink (iconURL) {
   var link = document.createElement("link");
   link.type = "image/x-icon";
   link.rel = "shortcut icon";
   link.href = iconURL;
   removeLinkIfExists();
   document.getElementsByTagName("head")[0].appendChild(link);
}

function removeLinkIfExists() {
   var links = document.getElementsByTagName("head")[0].getElementsByTagName("link");
   for (var i=0; i<links.length; i++) {
      var link = links[i];
      if (link.type=="image/x-icon" && link.rel=="shortcut icon") {
         document.getElementsByTagName("head")[0].removeChild(link);
         return; // Assuming only one match at most.
      }  
   }
}

//
// http://developer.yahoo.com/yui/editor/, see "saveHTML()"
//
var YUIEditorIntegrator = {
 editors: [],
 
 registerEditor: function(editorObj) {
  this.editors[this.editors.length] = editorObj; // add
 },
 
 formOnSubmit: function() {
  for (var editorKey in this.editors) {
   this.editors[editorKey].saveHTML();
  }
  return true;
 }
};
