/*************************************************************************************
* Popups general
*************************************************************************************/

/**
 * Display a popup page
 * @param {String} sUrl
 * @param {String} sParams
 * @param {String} sMethod POST(default)/GET
 * @type Boolean
 */
function popUpPageOpen(sUrl, sParams, sMethod) {
   // Params defaults
   if(sParams == undefined) sParams = '';
   if(sMethod == undefined) sMethod = 'POST';
   
   // Layer visibility
   document.getElementById('popUpBg').className = 'popUpBgEnabled';
   document.getElementById('popUpPage').className = 'popUpPageEnabled';

   // Hide scrollbars
   document.documentElement.style.overflow = 'hidden';
   document.body.scroll = "no";

   // Set loading icon
   var eContentDiv = document.getElementById('popUpContent');
   eContentDiv.innerHTML = '<img style="display:block;margin: 0px auto;" src="/sites/defaultSite/user/templates/images/loading.gif" width="32" height="32">';

   // Get contents
   return XmlHttpSetContents(sUrl, eContentDiv, sParams, sMethod);
}

/**
 * Close a popup page
 */
function popUpPageClose() {
   // Hide scrollbars
   document.documentElement.style.overflow = 'auto';
   document.body.scroll = "yes";

   // Hide popup divs
   document.getElementById('popUpBg').className = 'popUpBgDisabled';
   document.getElementById('popUpPage').className = 'popUpPageDisabled';
   document.getElementById('popUpContent').innerHTML = '';
   return true;
}

/*************************************************************************************
* XMLHttpRequest
*************************************************************************************/

/**
 * Set the contents of an div(asynchronously)
 * @param string sUrl
 * @param string sParams
 * @param object oTargetElement The DIV element to fill with contents.
 * @param string sMethod POST(default) or GET
 */
function XmlHttpSetContents(sUrl, oTarget, sParams, sMethod) {
   // Params defaults
   if(sParams == undefined) sParams = '';
   if(sMethod == undefined) sMethod = 'POST';

   // Get request object
   var xmlHttp;
   xmlHttp = xmlHttpGetObject();
   if (xmlHttp==null) {
      oTarget.innerHTML = 'Sorry... Your browser does not support viewing this content';
      return false;
   }

   // Perform request
   xmlHttp.onreadystatechange=function() {
      if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
         if (xmlHttp.status==200) {
            oTarget.innerHTML = xmlHttp.responseText;
            return true;
         }
         else {
            oTarget.innerHTML = 'Sorry... Could not retrieve page contents. Error message: '+xmlHttp.responseText;
            return false;
         }
      }
   }

   if(sMethod == 'POST') {
      xmlHttp.open('POST',sUrl,true);
      xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      xmlHttp.setRequestHeader("Content-length", sParams.length);
      xmlHttp.setRequestHeader("Connection", "close");
      xmlHttp.send(sParams);
   }
   else {
      if(sParams) sUrl = sUrl+'?'+sParams;
      xmlHttp.open('POST',sUrl,true);
      xmlHttp.send();
   }
   
   return true;
}

/**
 * Get an XML HTTP request object
 * @return XMLHttpRequest|NULL
 */
function xmlHttpGetObject() {
   var oXmlHttp=null;
   if(window.XMLHttpRequest) {
      oXmlHttp=new XMLHttpRequest();
   }
   else if(window.ActiveXObject) {
      oXmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
   }
   return oXmlHttp;
}

/*************************************************************************************
* Forms
*************************************************************************************/

/**
 * Submit a form
 * @param string sElementID Id or name property for the button
 * @param string sSubmitValue value property for the button
 * @return boolean
 */
function jsSubmit(sElementID, sSubmitValue) {
   // Get the form
   var oElement = document.getElementById(sElementID);
   var sElementName = oElement.name;
   if(!sElementName) sElementName = sElementID;

   var oParentElement;

   while(oElement.parentNode) {
      oParentElement = oElement.parentNode;
      if(oParentElement.tagName == 'FORM') {
         var oHiddenElement = document.createElement('input');
         oHiddenElement.setAttribute('type','hidden');
         oHiddenElement.setAttribute('name',sElementName);
         oHiddenElement.setAttribute('value',sSubmitValue);

         oParentElement.appendChild(oHiddenElement);
         oParentElement.submit();
         return true;
      }
      oElement = oParentElement;
   }
   return true;
}

//** Return a checkbox array as javascript array variable
function checkBox2Array(oElement) {
   var aReturn = [];
   for(i=0, j=0; i<oElement.length; i++) {
      if(oElement[i].checked) {
         aReturn[j] = oElement[i].value;
         j++;
      }
   }
   return aReturn;
}

/**
 * Add an nbsp; to select options when Firefox is browser
 * Used to fix problem where firefox "forgets" padding in pulldown menu
 * @param string sElementID [1...n] Id property for the button
 * @return void
 */
function ffFixSelectOption() {
   var sReg=/firefox/i;
   if(sReg.test(navigator.userAgent)) {
      var i,j;
      aSelectElements = document.getElementsByTagName('select');
      for(i = 0; i < aSelectElements.length; i++ ) {
         for (j=0;j<aSelectElements[i].length;j++) {
            aSelectElements[i].options[j].text = aSelectElements[i].options[j].text+String.fromCharCode(160);
         }
      }
   }
}

/*************************************************************************************
* DHTML
*************************************************************************************/

/**
 * Compare HTML element heights, and set all elements to the height of highest element
 * @param string 1...n One parameter per element id to check height for
 * @return the height of the elements
 */
function equalHeight() {
   var aElements = [];
   var maxHeight = 0;
   var i = 0;

   for(i = 0; i < arguments.length; i++ ) {
      aElements.push(document.getElementById(arguments[i]));
   }
   for(i = 0; i < aElements.length; i++ ) {
      if(maxHeight < aElements[i].offsetHeight) {
         maxHeight = aElements[i].offsetHeight;
      }
   }
   if(!maxHeight) return false;
	
	/* PATCH FF BEGIN */
	/* Test page: www.digitalesenter.no -> booking -> services */
	/* @todo patch should be improved if problems also occur in later versions of Firefox. (Patch only prevents element overlap, not correct heights) */
	var sReg=/Firefox\/(4|5)\.0/i;
	var bIsFF4 = sReg.test(navigator.userAgent);
	/* PATCH FF END */
	
   for(i = 0; i < aElements.length; i++ ) {
		/* PATCH FF BEGIN */
		if(bIsFF4) {
			aElements[i].style.minHeight = maxHeight+'px';
			continue;
		}
		/* PATCH FF END */
      aElements[i].style.height = maxHeight+'px';
   }
   return maxHeight;
}

/*************************************************************************************
* Css
*************************************************************************************/

/** Include a style sheet */
function emIncludeStyleSheet(sLink) {
   if(document.createStyleSheet) {
      document.createStyleSheet(sLink);
   } else {
      var headElement = document.getElementsByTagName("head")[0];
      var linkElement = document.createElement('link');
      linkElement.type = 'text/css';
      linkElement.rel = 'stylesheet';
      linkElement.href = sLink;
      linkElement.media = 'screen';
      headElement.appendChild(linkElement);
   }
}

//*** Get a style for an element
// Note: do not use cammelBack notation for styles
// Note: may or may not work
function getStyle(sElementId, sStyle, iDefault) {
   var sReturn = false;
   var oElement = document.getElementById(sElementId);

   if (oElement.currentStyle) {
      sReturn = oElement.currentStyle[sStyle];
   }
   else if(window.getComputedStyle) {
      sReturn = document.defaultView.getComputedStyle(oElement,null).getPropertyValue(sStyle);
   }

   if(!sReturn) {
      sReturn = iDefault;
   }

   return sReturn;
}

/*************************************************************************************
* Browser properties
*************************************************************************************/

//** Get the height of the current window
function windowHeight() {
   var iHeight = null;
   if( typeof( window.innerHeight ) == 'number' ) {
      iHeight = window.innerHeight; //Non-IE
   } else if( document.documentElement && ( document.documentElement.clientHeight || document.documentElement.clientHeight ) ) {
      iHeight = document.documentElement.clientHeight; //IE 6+ in 'standards compliant mode'
   } else if( document.body && document.body.clientHeight ) {
      iHeight = document.body.clientHeight; //IE 4 compatible
   }
   return iHeight;
}

/*************************************************************************************
* Search catalog box
*************************************************************************************/

var sFieldDefaultText;

function clearInputField(mElement) {
   if(typeof(mElement) == 'string') mElement = document.getElementById(mElement);

   if(mElement.value == sFieldDefaultText || mElement.value == '') {
      mElement.value = '';
      mElement.className = '';
   }
   return true;
}

function setFieldDefaultText(mElement, sText) {
   if(typeof(mElement) == 'string') mElement = document.getElementById(mElement);

   // Insert default text
   if(sText === undefined) sText = sFieldDefaultText;
   if(mElement.value == '' || mElement.value == sFieldDefaultText) {
      mElement.className = 'baseColorL5b';
      mElement.value = sText;
   }
   sFieldDefaultText = sText;

   return true;
}

/*************************************************************************************
* Select language box
*************************************************************************************/

/** Show/hide Language selection box */
function flipLangSelect() {
   if(document.getElementById('langSelectPopup').style.visibility == "visible") {
      document.getElementById('langSelectPopup').style.visibility='hidden';
   }
   else {
      document.getElementById('langSelectPopup').style.visibility='visible';
   }
   return false;
}

/*************************************************************************************
* "PHP" functions
*************************************************************************************/

//** is_array for javascript
// MIT and GPL licence
function is_array( mixed_var ) {
   // http://kevin.vanzonneveld.net
   // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
   // +   improved by: Legaev Andrey
   // +   bugfixed by: Cord
   // *     example 1: is_array(['Kevin', 'van', 'Zonneveld']);
   // *     returns 1: true
   // *     example 2: is_array('Kevin van Zonneveld');
   // *     returns 2: false

   return ( mixed_var instanceof Array );
}

//** string_replace for javascript
// MIT and GPL licence
function str_replace(search, replace, subject) {
   // http://kevin.vanzonneveld.net
   // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
   // +   improved by: Gabriel Paderni
   // +   improved by: Philip Peterson
   // +   improved by: Simon Willison (http://simonwillison.net)
   // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
   // -    depends on: is_array
   // *     example 1: str_replace(' ', '.', 'Kevin van Zonneveld');
   // *     returns 1: 'Kevin.van.Zonneveld'
   // *     example 2: str_replace(['{name}', 'l'], ['hello', 'm'], '{name}, lars');
   // *     returns 2: 'hemmo, mars'

   var f = search, r = replace, s = subject;
   var ra = is_array(r), sa = is_array(s);
   f = [].concat(f);
   r = [].concat(r);
   i = (s = [].concat(s)).length;

   while (j = 0, i--) {
      while (s[i] = s[i].split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){};
   };

   return sa ? s : s[0];
}

//** Var dump for javascript
// Delete
function var_dump(data,addwhitespace,safety,level) {
   var rtrn = '';
   var dt,it,spaces = '';
   if(!level) {
      level = 1;
   }
   for(var i=0; i<level; i++) {
      spaces += '   ';
   }//end for i<level
   if(typeof(data) != 'object') {
      dt = data;
      if(typeof(data) == 'string') {
         if(addwhitespace == 'html') {
            dt = dt.replace(/&/g,'&amp;');
            dt = dt.replace(/>/g,'&gt;');
            dt = dt.replace(/</g,'&lt;');
         }//end if addwhitespace == html
         dt = dt.replace(/\"/g,'\"');
         dt = '"' + dt + '"';
      }//end if typeof == string
      if(typeof(data) == 'function' && addwhitespace) {
         dt = new String(dt).replace(/\n/g,"\n"+spaces);
         if(addwhitespace == 'html') {
            dt = dt.replace(/&/g,'&amp;');
            dt = dt.replace(/>/g,'&gt;');
            dt = dt.replace(/</g,'&lt;');
         }//end if addwhitespace == html
      }//end if typeof == function
      if(typeof(data) == 'undefined') {
         dt = 'undefined';
      }//end if typeof == undefined
      if(addwhitespace == 'html') {
         if(typeof(dt) != 'string') {
            dt = new String(dt);
         }//end typeof != string
         dt = dt.replace(/ /g,"&nbsp;").replace(/\n/g,"<br>");
      }//end if addwhitespace == html
      return dt;
   }//end if typeof != object && != array
   for (var x in data) {
      if(safety && (level > safety)) {
         dt = '*RECURSION*';
      } else {
         try {
            dt = var_dump(data[x],addwhitespace,safety,level+1);
         } catch (e) {
            continue;
         }
      }//end if-else level > safety
      it = var_dump(x,addwhitespace,safety,level+1);
      rtrn += it + ':' + dt + ',';
      if(addwhitespace) {
         rtrn += '\n'+spaces;
      }//end if addwhitespace
   }//end for...in
   if(addwhitespace) {
      rtrn = '{\n' + spaces + rtrn.substr(0,rtrn.length-(2+(level*3))) + '\n' + spaces.substr(0,spaces.length-3) + '}';
   } else {
      rtrn = '{' + rtrn.substr(0,rtrn.length-1) + '}';
   }//end if-else addwhitespace
   if(addwhitespace == 'html') {
      rtrn = rtrn.replace(/ /g,"&nbsp;").replace(/\n/g,"<br>");
   }//end if addwhitespace == html
   return rtrn;
}//end function var_dump

