/***************************************************************************

@name	 : Submit, Passing parameters to a server-side page.

@author  : Daniele Florio ( http://www.gizax.it )
@author  : Andrea Paiola  ( http://www.andreapaiola.it )
@version : 0.1

@uses    : Function that pass all parameters of a form to a back-end page
		   ( perl, php, java, jsp, script shell etc. ) using AHAH interface.

****************************************************************************/

function submit(FILE, METHOD){

	var num = document.forms[0].elements.length;
	var url = "";

	//radio button
	var j = 0;
	var a = 0;
	var radio_buttons = new Array();
	var nome_buttons = new Array();
	var the_form = window.document.forms[0];
	for(var i=0; i<the_form.length; i++){
		var temp = the_form.elements[i].type;
		if ( (temp == "radio") && ( the_form.elements[i].checked) ) {
			nome_buttons[a] = the_form.elements[i].name;
			radio_buttons[j] = the_form.elements[i].value;
			j++;
			a++;
		}
	}
	for(var k = 0; k < radio_buttons.length; k++) {
		url += nome_buttons[k] + "=" + radio_buttons[k] + "&";
	}
	//checkbox
	var j = 0;
	var a = 0;
	var check_buttons = new Array();
	var nome_buttons = new Array();
	var the_form = window.document.forms[0];
	for(var i=0; i<the_form.length; i++){
		var temp = the_form.elements[i].type;
		if ( (temp == "checkbox") && ( the_form.elements[i].checked) ) {
			nome_buttons[a] = the_form.elements[i].name;
			check_buttons[j] = the_form.elements[i].value;
			j++;
			a++;
		}
	}
	for(var k = 0; k < check_buttons.length; k++) {
		url += nome_buttons[k] + "=" + check_buttons[k] + "&";
	}
	for (var i = 0; i < num; i++){

		var chiave = document.forms[0].elements[i].name;
		var valore = document.forms[0].elements[i].value;
		var tipo = document.forms[0].elements[i].type;

		if ( (tipo == "submit") || (tipo == "radio") || (tipo == "checkbox") ){}
		else {
			url += chiave + "=" + valore + "&";
		}
	}
	var parameters = url;
	url = FILE + "?" + url;
	if (METHOD == undefined) { METHOD = "GET"; 	}
	if (METHOD == "GET") { ahah(url, 'target', '', METHOD); }
	else { ahah(FILE, 'target', '', METHOD, parameters); }
}

function ahah(url, target, delay, method, parameters) {

  if (method == undefined) {
	  //document.getElementById(target).innerHTML = '<img src="loading.gif" alt="" />';
	  //shiftOpacity(target, 1000, "down");

	  if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
	  } else if (window.ActiveXObject) {
		req = new ActiveXObject("Microsoft.XMLHTTP");
	  }
	  if (req) {
		req.onreadystatechange = function() {
			ahahDone(url, target, delay, method, parameters);
		};
		req.open("GET", url, true);
		req.send("");
	  }
  }
  if ( (method == "GET") || (method == "get") )
  {
	  //document.getElementById(target).innerHTML = '<img src="loading.gif" alt="" />';
	  //shiftOpacity(target, 1000, "down");

	  if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
	  } else if (window.ActiveXObject) {
		req = new ActiveXObject("Microsoft.XMLHTTP");
	  }
	  if (req) {
		req.onreadystatechange = function() {
			ahahDone(url, target, delay, method, parameters);
		};
		req.open(method, url, true);
		req.send("");
	  }
  }

  if ( (method == "POST") || (method == "post") )
  {
	  //document.getElementById(target).innerHTML = '<img src="loading.gif" alt="" />';
	  //shiftOpacity(target, 1000, "down");

	  if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
	  } else if (window.ActiveXObject) {
		req = new ActiveXObject("Microsoft.XMLHTTP");
	  }
	  if (req) {
		req.onreadystatechange = function() {
			ahahDone(url, target, delay, method, parameters);
		};
		req.open(method, url, true);
		req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		req.send(parameters);
	  }
  }
}

function ahahDone(url, target, delay, method, parameters) {

  //clearTimer(target);
  shiftOpacity(target, 1000);

  if (req.readyState == 4) {
    if (req.status == 200) {
      document.getElementById(target).innerHTML = req.responseText;
    } else {
      document.getElementById(target).innerHTML="ahah error:\n"+req.statusText;
    }
  }
}


function addEvent( obj, type, fn ) {
        if( obj.addEventListener )
                obj.addEventListener( type, fn, false );
        else if( obj.attachEvent ) {
                obj[ "e" + type + fn ] = fn;
                obj[ type + fn ]       = function() { obj[ "e" + type + fn ]( window.event ); }
                obj.attachEvent( "on" + type, obj[ type + fn ] );
        }
}

function imageXY( e ) {
        var mousepos = mousePosition( e );
        var elempos  = elementPosition( getTarget( e ) );

        var x = mousepos[ 0 ] - elempos[ 0 ];
        var y = mousepos[ 1 ] - elempos[ 1 ];

        var elempos  = elementPosition( getTarget( e ) );
		  var ex = elempos[ 0 ];
		  var ey = elempos[ 1 ];

		  var indirizzo = URLEncode(document.location.href);
		  var sH = screen.availHeight;
		  var sW = screen.availWidth;
        ahah('clickmap/action.php?act=save&page='+indirizzo+'&ex='+ex+'&ey='+ey+'&posx='+x+'&posy='+y+'&sh='+sH+'&sw='+sW, 'clickmap');
}

function mousePosition( e ) {
        var posx = 0;
        var posy = 0;
        if (!e) var e = window.event;
        if (e.pageX || e.pageY) {
                posx = e.pageX;
                posy = e.pageY;
        }
        else if (e.clientX || e.clientY) {
                posx = e.clientX + document.body.scrollLeft;
                posy = e.clientY + document.body.scrollTop;
        }

        return new Array( posx, posy );
}

function elementPosition( ) {
		  var obj = document.getElementById( 'contentclickmap' );

        var curleft = 0;
        var curtop  = 0;
        if( obj.offsetParent ) {
            curleft += obj.offsetLeft
            curtop  += obj.offsetTop
        }
        else if( obj.x ) {
                curleft += obj.x;
                curtop  += obj.y;
        }

       // alert(curleft+' - '+curtop);
        return new Array( curleft, curtop );
}

function getTarget( e ) {
        var targ;
        if (!e) var e = window.event;
        if (e.target) targ = e.target;
        else if (e.srcElement) targ = e.srcElement;
        if (targ.nodeType == 3) // defeat Safari bug
                targ = targ.parentNode;

        return targ;
}

function init( ) {
       // addEvent( document.getElementById( 'contentclickmap' ), 'click', imageXY );
}

addEvent( window, 'load', init );


function URLEncode( plaintext )
{
	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()";					// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	//var plaintext = document.URLForm.F1.value;
	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";				// x-www-urlencoded, rather than %20
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
			    alert( "Unicode Character '"
                        + ch
                        + "' cannot be encoded using standard URL encoding.\n" +
				          "(URL encoding only supports 8-bit characters.)\n" +
						  "A space (+) will be substituted." );
				encoded += "+";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for

	return encoded;
};

function URLDecode( encoded )
{
   // Replace + with ' '
   // Replace %xx with equivalent character
   // Put [ERROR] in output if %xx is invalid.
   var HEXCHARS = "0123456789ABCDEFabcdef";
   //var encoded = document.URLForm.F2.value;
   var plaintext = "";
   var i = 0;
   while (i < encoded.length) {
       var ch = encoded.charAt(i);
	   if (ch == "+") {
	       plaintext += " ";
		   i++;
	   } else if (ch == "%") {
			if (i < (encoded.length-2)
					&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1
					&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
				plaintext += unescape( encoded.substr(i,3) );
				i += 3;
			} else {
				//alert( 'Bad escape combination near ...' + encoded.substr(i) );
				plaintext += "%[ERROR]";
				i++;
			}
		} else {
		   plaintext += ch;
		   i++;
		}
	} // while
   return plaintext;
}


function opacity(id, opacStart, opacEnd, millisec) {
    //speed for each frame
    var speed = Math.round(millisec / 200);
    var timer = 0;

    //determine the direction for the blending, if start and end are the same nothing happens
    if(opacStart > opacEnd) {
        for(i = opacStart; i >= opacEnd; i--) {
            mytimer = setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
            timer++;
        }
    } else if(opacStart < opacEnd) {
        for(i = opacStart; i <= opacEnd; i++)
            {
            mytimer = setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
            timer++;
        }
    }
}

function shiftOpacity(id, millisec) {

    opacity(id, 0, 100, millisec);



    //if an element is invisible, make it visible, else make it ivisible

    //if(document.getElementById(id).style.opacity == 0) {
    //    opacity(id, 0, 100, millisec);
    //} else {
    //    opacity(id, 100, 0, millisec);
    //}

}


//change the opacity for different browsers
function changeOpac(opacity, id) {
    var object = document.getElementById(id).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")";
}

function clearTimer(id){
	changeOpac(0,id);
	clearTimeout(mytimer);
}
