// $Id: drupal.js 1724 2009-01-05 22:23:04Z plegagneur $

/**
 * Only enable Javascript functionality if all required features are supported.
 */

function isJsEnabled() {
  if (typeof document.jsEnabled == 'undefined') {
    // Note: ! casts to boolean implicitly.
    document.jsEnabled = !(
     !document.getElementsByTagName ||
     !document.createElement        ||
     !document.createTextNode       ||
     !document.documentElement      ||
     !document.getElementById);
  }
  return document.jsEnabled;
}

// Global Killswitch on the <html> element
if (isJsEnabled()) {
  document.documentElement.className = 'js';
}

/**
 * Make IE's XMLHTTP object accessible through XMLHttpRequest()
 */
if (typeof XMLHttpRequest == 'undefined') {
  XMLHttpRequest = function () {
    var msxmls = ['MSXML3', 'MSXML2', 'Microsoft']
    for (var i=0; i < msxmls.length; i++) {
      try {
        return new ActiveXObject(msxmls[i]+'.XMLHTTP')
      }
      catch (e) { }
    }
    throw new Error("No XML component installed!");
  }
}

/**
 * Creates an HTTP GET request and sends the response to the callback function.
 *
 * Note that dynamic arguments in the URI should be escaped with encodeURIComponent().
 */
function HTTPGet(uri, callbackFunction, callbackParameter) {
  var xmlHttp = new XMLHttpRequest();
  var bAsync = true;
  if (!callbackFunction) {
    bAsync = false;
  }
  xmlHttp.open('GET', uri, bAsync);
  xmlHttp.send(null);

  if (bAsync) {
    if (callbackFunction) {
      xmlHttp.onreadystatechange = function() {
        if (xmlHttp.readyState == 4) {
          callbackFunction(xmlHttp.responseText, xmlHttp, callbackParameter);
        }
      }
    }
    return xmlHttp;
  }
  else {
    return xmlHttp.responseText;
  }
}

/**
 * Creates an HTTP POST request and sends the response to the callback function
 *
 * Note: passing null or undefined for 'object' makes the request fail in Opera 8.
 *       Pass an empty string instead.
 */

function HTTPPost(uri, callbackFunction, callbackParameter, object) {
  var xmlHttp = new XMLHttpRequest();
  var bAsync = true;
  if (!callbackFunction) {
    bAsync = false;
  }

try{
	xmlHttp.open('POST', uri, bAsync);
}
catch (e){
	//alert(e)
	callbackFunction('failed', xmlHttp, callbackParameter)
	return 
}	
  
 // xmlHttp.open('POST', uri, bAsync);
  var toSend = '';
  if (typeof object == 'object') {
    xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    for (var i in object) {
      toSend += (toSend ? '&' : '') + i + '=' + encodeURIComponent(object[i]);
    }
  }
  else {
    toSend = object;
  }
  xmlHttp.send(toSend);

  if (bAsync) {
    if (callbackFunction) {
      xmlHttp.onreadystatechange = function() {
        if (xmlHttp.readyState == 4) {
          callbackFunction(xmlHttp.responseText, xmlHttp, callbackParameter);
        }
      }
    }
    return xmlHttp;
  }
  else {
    return xmlHttp.responseText;
  }
}

/**
 * Redirects a button's form submission to a hidden iframe and displays the result
 * in a given wrapper. The iframe should contain a call to
 * window.parent.iframeHandler() after submission.
 */
function redirectFormButton(uri, button, handler) {
  // (Re)create an iframe to target.
  createIframe();

  // Trap the button
  button.onmouseover = button.onfocus = function() {
    button.onclick = function() {
      // Prepare variables for use in anonymous function.
      var button = this;
      var action = button.form.action;
      var target = button.form.target;

      // Redirect form submission
      this.form.action = uri;
      this.form.target = 'redirect-target';

      handler.onsubmit();

      // Set iframe handler for later
      window.iframeHandler = function () {
        var iframe = $id('redirect-target');
        // Restore form submission
        button.form.action = action;
        button.form.target = target;

        // Get response from iframe body
        try {
          response = (iframe.contentWindow || iframe.contentDocument || iframe).document.body.innerHTML;
          // Firefox 1.0.x hack: Remove (corrupted) control characters
          response = response.replace(/[\f\n\r\t]/g, ' ');
          if (window.opera) {
            // Opera-hack: it returns innerHTML sanitized.
            response = response.replace(/&quot;/g, '"');
          }
        }
        catch (e) {
          response = null;
        }

        $id('redirect-target').onload = null;
        $id('redirect-target').src = 'about:blank';

        response = parseJson(response);
        // Check response code
        if (response.status == 0) {
          handler.onerror(response.data);
          return;
        }
        handler.oncomplete(response.data);
      }

      return true;
    }
  }
  button.onmouseout = button.onblur = function() {
    button.onclick = null;
  }
}

/**
 * Adds a function to the window onload event
 */
function addLoadEvent(func) {
  var oldOnload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  }
  else {
    window.onload = function() {
      oldOnload();
      func();
    }
  }
}

/**
 * Adds a function to a given form's submit event
 */
function addSubmitEvent(form, func) {
  var oldSubmit = form.onsubmit;
  if (typeof oldSubmit != 'function') {
    form.onsubmit = func;
  }
  else {
    form.onsubmit = function() {
      return oldSubmit() && func();
    }
  }
}

/**
 * Retrieves the absolute position of an element on the screen
 */
function absolutePosition(el) {
  var sLeft = 0, sTop = 0;
  var isDiv = /^div$/i.test(el.tagName);
  if (isDiv && el.scrollLeft) {
    sLeft = el.scrollLeft;
  }
  if (isDiv && el.scrollTop) {
    sTop = el.scrollTop;
  }
  var r = { x: el.offsetLeft - sLeft, y: el.offsetTop - sTop };
  if (el.offsetParent) {
    var tmp = absolutePosition(el.offsetParent);
    r.x += tmp.x;
    r.y += tmp.y;
  }
  return r;
};

function dimensions(el) {
  return { width: el.offsetWidth, height: el.offsetHeight };
}

/**
 * Returns true if an element has a specified class name
 */
function hasClass(node, className) {
  if (node.className == className) {
    return true;
  }
  var reg = new RegExp('(^| )'+ className +'($| )')
  if (reg.test(node.className)) {
    return true;
  }
  return false;
}

/**
 * Adds a class name to an element
 */
function addClass(node, className) {
  if (hasClass(node, className)) {
    return false;
  }
  node.className += ' '+ className;
  return true;
}

/**
 * Removes a class name from an element
 */
function removeClass(node, className) {
  if (!hasClass(node, className)) {
    return false;
  }
  // Replaces words surrounded with whitespace or at a string border with a space. Prevents multiple class names from being glued together.
  node.className = eregReplace('(^|\\s+)'+ className +'($|\\s+)', ' ', node.className);
  return true;
}

/**
 * Toggles a class name on or off for an element
 */
function toggleClass(node, className) {
  if (!removeClass(node, className) && !addClass(node, className)) {
    return false;
  }
  return true;
}

/**
 * Emulate PHP's ereg_replace function in javascript
 */
function eregReplace(search, replace, subject) {
  return subject.replace(new RegExp(search,'g'), replace);
}

/**
 * Removes an element from the page
 */
function removeNode(node) {
  if (typeof node == 'string') {
    node = $id(node);
  }
  if (node && node.parentNode) {
    return node.parentNode.removeChild(node);
  }
  else {
    return false;
  }
}

/**
 * Prevents an event from propagating.
 */
function stopEvent(event) {
  if (event.preventDefault) {
    event.preventDefault();
    event.stopPropagation();
  }
  else {
    event.returnValue = false;
    event.cancelBubble = true;
  }
}

/**
 * Parse a JSON response.
 *
 * The result is either the JSON object, or an object with 'status' 0 and 'data' an error message.
 */
function parseJson(data) {
  if (data.substring(0,1) != '{') {
    return { status: 0, data: data.length ? data : 'Unspecified error' };
  }
  return eval('(' + data + ');');
}

/**
 * Create an invisible iframe for form submissions.
 */
function createIframe() {
  // Delete any previous iframe
  deleteIframe();
  // Note: some browsers require the literal name/id attributes on the tag,
  // some want them set through JS. We do both.
  window.iframeHandler = function () {};
  var div = document.createElement('div');
  div.id = 'redirect-holder';
  div.innerHTML = '<iframe name="redirect-target" id="redirect-target" class="redirect" onload="window.iframeHandler();"></iframe>';
  var iframe = div.firstChild;
  with (iframe) {
    name = 'redirect-target';
    setAttribute('name', 'redirect-target');
    id = 'redirect-target';
  }
  with (iframe.style) {
    position = 'absolute';
    height = '1px';
    width = '1px';
    visibility = 'hidden';
  }
  document.body.appendChild(div);
}

/**
 * Delete the invisible iframe for form submissions.
 */
function deleteIframe() {
  var holder = $id('redirect-holder');
  if (holder != null) {
    removeNode(holder);
  }
}

/**
 * Wrapper around document.getElementById().
 */
function $id(id) {
  return document.getElementById(id);
}

// *** >>> added by AIM, set the focus to given element of given form
function setFocus(form_id, elt_id){
	//alert(form_id +":"+ elt_id)
	document.forms[form_id].elements[elt_id].focus();
	document.forms[form_id].elements[elt_id].select();
	//document.forms[form_id].elements[elt_id].style.borderWidth = "2px";
	document.forms[form_id].elements[elt_id].style.borderColor = "#3277AF";
	document.forms[form_id].elements[elt_id].style.backgroundColor = "#ffcccc";
}
// *** <<<



// *** >>> added by AIM, set the focus to given element of given form
function setPageFocus() {
	//document.focus();
}
// *** <<<


// *** >>> added by AIM, to update flash movies from a form

function textAreaChanged(field) {
	flash = window.frames['mgallery'].document.makeovers;
	flash.updateDescription(field.value);
	refreshMySpaceCode();
}

function makeoverSettingChanged(field) {
	flash = window.frames['mgallery'].document.makeovers;
	var showWhatfield = document.getElementById("edit[profile_makeover_gallery_show_selected]");
	var typefield = document.getElementById("edit[profile_makeover_gallery_subtype]");
	var numfield = document.getElementById("edit[profile_makeover_gallery_numPerPage]");
	
	switch (field.name) {
		
		case "edit[profile_makeover_gallery_show_selected]":
			if (field.value == "pick and choose") {		
				alert("By selecting 'pick and choose', you are only displaying your 'shared' makeovers.  See the bottom of this page for the link to your 'My Submissions' page where you can set the settings of your submittted makeovers.");
				flash.updateMakeovers("mtype", "all", false);
				if(navigator.appName.indexOf("Microsoft") != -1) {
					typefield.style.visibility = "hidden";
					typefield.value = "all";
				}else{
					typefield.innerHTML = '<option value="all" selected="selected">all</option>'; //firefox only?
				}
			}else{
				if(navigator.appName.indexOf("Microsoft") != -1) {
					typefield.style.visibility = "visible";
				}else{
					typefield.innerHTML = '<option value="user">user</option><option value="model">model</option><option value="all" selected="selected">all</option>'; //firefox only?
				}
			}
			flash.updateMakeovers("mShowWhat", field.value, true);
			break;
			
		case "edit[profile_makeover_gallery_numPerPage]":
			flash.updateMakeovers("mNumPerPage", field.value, true);
			break;
			
		case "edit[profile_makeover_gallery_subtype]":
			flash.updateMakeovers("mtype", field.value, true);
			break;
			
	}
	
	refreshMySpaceCode();
}

function refreshMySpaceCode() {
	var tf = document.getElementById("myspaceCode");
	var embedCode = "";
	
	var showWhat = encodeURIComponent(document.getElementById("edit[profile_makeover_gallery_show_selected]").value);
	var type = document.getElementById("edit[profile_makeover_gallery_subtype]").value;
	var num = document.getElementById("edit[profile_makeover_gallery_numPerPage]").value;
	var desc = encodeURIComponent(document.getElementById("edit[profile_makeover_gallery_description]").value);	
	//embedCode += showWhat + ", " + type + ", " + num + ", " + desc + "\n\n";
	//embedCode += username + ", " + uid_enc + ", " + uid_dec + "\n\n"; //in profile.module
	var flashvars = "myspace=true&server="+serverToUser+"&username="+username+"&uid="+uid_enc+"&uidDec="+uid_dec+"&mtype="+type+"&mNumPerPage="+num+"&mShowWhat="+showWhat+"&mdesc="+desc;
	//embedCode += flashvars + "\n\n";

	embedCode += '<object type="application/x-shockwave-flash" height="300" width="450" align="middle" flashVars="'+flashvars+'" data="http://'+serverToUser+'/makeover/widget/makeovers.swf">';
	embedCode += '<param name="movie" value="http://'+serverToUser+'/makeover/widget/makeovers.swf" />';
	embedCode += '<param name="quality" value="high" />';
	embedCode += '<param name="width" value="450" />';
	embedCode += '<param name="height" value="300" />';
	embedCode += '<param name="bgcolor" value="#ffffff" />';
	embedCode += '<param name="flashVars" value="'+flashvars+'" />'; 
	embedCode += '</object>';
	embedCode += '<div style="text-align:right;width:450px;"><a href="http://'+serverToUser+'/account/signup.php?ref=widget&source=myspace"><img src="http://'+serverToUser+'/images/btn/createYourOwn.gif" border=0 alt="Create your own!" title="Create your own!" /></a>';

	tf.value = embedCode;
	
}
// *** <<<


// *** >>> really basic expanding div (example use: see product_view() in product module)
// usage: requires a controller div (for text like 'click here to show') and the actual expander div.
// defines a default expander called 'e'. call e.initialise() in page body to start using it.
function MOSExpander()
{
	this._controller = null;
	this._cshow = '';
	this._chide = '';
	this._expander = null;
	this._html = '';
	this._toggle = 0; //closed
}

MOSExpander.prototype._controller;
MOSExpander.prototype._cshow;
MOSExpander.prototype._chide;
MOSExpander.prototype._expander;
MOSExpander.prototype._html;

MOSExpander.prototype._closeExpander = function()
{
	this._expander.innerHTML = '';
	this._expander.style.display = 'none';
	this._controller.innerHTML = "<a href='#' onClick='e.toggleExpander(); return false'>" + this._cshow + "</a>";
	this._toggle = 0; //closed
}
MOSExpander.prototype._openExpander = function()
{
	this._expander.innerHTML = this._html;
	this._expander.style.display = 'block';
	this._controller.innerHTML = "<a href='#' onClick='e.toggleExpander(); return false'>" + this._chide + "</a>";
	this._toggle = 1; //open
}

MOSExpander.prototype.toggleExpander = function()
{
	if (this._toggle == 1)
	{
		this._closeExpander();
	}
	else
	{
		this._openExpander();
	}
}

MOSExpander.prototype.initialise = function (controllerId,
	controllerShowText,
	controllerHideText,
	expanderId)
{
	this._controller = document.getElementById(controllerId);
	this._cshow = controllerShowText;
	this._chide = controllerHideText;
	this._expander = document.getElementById(expanderId);
	this._html = this._expander.innerHTML;
	this._toggle = 0; //closed
	this._closeExpander();
}

var e = new MOSExpander();
// *** <