// JavaScript Document
//Google Maps API key=ABQIAAAAVxNj2A7val8y0zyCCC3ngxQrs-fOrFBfFGLiGbQ9fOJElD13aBQr7_WuTeLab7jui58Y_D80ztHciA
var IE = document.all?true:false;
var serverProtocol = (window.document.location.protocol ? window.document.location.protocol : 'http:');
var serverURI = (window.document.location.hostname ? serverProtocol+'//'+window.document.location.hostname : '');

function ajax(url,method,process_function){
	var XMLHttpRequestObject = false;
    if ( window.XMLHttpRequest ){
	    XMLHttpRequestObject = new XMLHttpRequest();
    }
    else if ( window.ActiveXObject ){
        XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
    }
	if( XMLHttpRequestObject ){
  	    var data_source = url + '&_t=' + Math.random();
   	    if (method=="POST") {
			XMLHttpRequestObject.open( "POST", data_source );
		} else {
			XMLHttpRequestObject.open( "GET", data_source );
		}
   	    XMLHttpRequestObject.onreadystatechange = function(){
			if ( XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200 ){
				var xmlDocument = XMLHttpRequestObject.responseXML;
				delete XMLHttpRequestObject;
				XMLHttpRequestObject = null;
				process_function(xmlDocument);
			}
	    }
    	XMLHttpRequestObject.send( null );
	}
}

function ajax_x(url,method,process_function){
	var XMLHttpRequestObject = false;
    if ( window.XMLHttpRequest ){
	    XMLHttpRequestObject = new XMLHttpRequest();
    }
    else if ( window.ActiveXObject ){
        XMLHttpRequestObject = new ActiveXObject("Microsoft.XMLHTTP");
    }
	if( XMLHttpRequestObject ){
  	    var data_source = url + '&_t=' + Math.random();
   	    if (method=="POST") {
			XMLHttpRequestObject.open( "POST", data_source );
		} else {
			XMLHttpRequestObject.open( "GET", data_source );
		}
   	    XMLHttpRequestObject.onreadystatechange = function(){
			if ( XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200 ){
				var xmlDocument = XMLHttpRequestObject.responseText;
				delete XMLHttpRequestObject;
				XMLHttpRequestObject = null;
				process_function(xmlDocument);
			}
	    }
    	XMLHttpRequestObject.send( null );
	}
}

/* virtual selection box */
function vBox_show(vbox_id,x,y,w,h,data) {
	var box = document.getElementById(vbox_id);
	box.innerHTML = '<div class="box">'+data+'</div>';
	box.style.top = y+'px';
	box.style.left = x+'px';
	if (w>0) box.style.width = w+'px'; else box.style.width = "";
	if (h>0) box.style.height = h+'px'; else box.style.height = "";
	box.style.display = 'inline';
}

function vBox_hide(vbox_id) {
	try {
		document.getElementById(vbox_id).style.display = 'none';
		document.getElementById(vbox_id).innerHTML = "";
	} catch (e) {
	}
}

function findPosition( oElement ) {
  if( typeof( oElement.offsetParent ) != 'undefined' ) {
    for( var posX = 0, posY = 0; oElement; oElement = oElement.offsetParent ) {
      posX += oElement.offsetLeft;
      posY += oElement.offsetTop;
    }
    return [ posX, posY ];
  } else {
    return [ oElement.x, oElement.y ];
  }
}

/* start Add new wine functions */

function WineObj(id,name) {
	this.id = id;
	this.name = name;
	this.visible = true;
}

function RegionsObj(id,name,hname) {
	this.id = id;
	this.name = name;
	this.hname = hname;
	this.visible = false;
}

function GrapesObj(id,name) {
	this.id = id;
	this.name = name;
}

function VintageObj(id,name) {
	this.id = id;
	this.name = name;
}

function EmailTypeObj(id,name) {
	this.id = id;
	this.name = name;
}

function WebsiteTypeObj(id,name) {
	this.id = id;
	this.name = name;
}

function WinemakersObj(id,name) {
	this.id = id;
	this.name = name;
	this.visible = false;
}

var WineryArray = new Array();
var CenterArray = new Array();
var PointsArray = new Array();
var WineArray = new Array();
var RegionsArray = new Array();
var GrapesArray = new Array();
var VintageArray = new Array();
var EmailTypesArray = new Array();
var WebsiteTypesArray = new Array();
var WinemakersArray = new Array();
var WineryNavPos = 0;
var WinemakersNavPos = 0;

var SelectionNavPos = 0;
var SelectionNavStatus = 0;
var SelectionMax = 0;
var SelectionWait = 0;


function selectionNavUnselectAll(arrayElements,elementsName) {
	for (i=0;i<arrayElements.length;i++) {
		if (document.getElementById(elementsName+'_'+i)!=null)
		document.getElementById(elementsName+'_'+i).className='line';
	}
}

function findNextVisibleItem(arrayElements,position) {
	if (arrayElements[position].visible) return position;
	
	for (arrayElementsItem=position;arrayElementsItem<arrayElements.length;arrayElementsItem++) {
		if (arrayElements[arrayElementsItem].visible) return arrayElementsItem;
	}
	
	return 0;
}

function findPrevVisibleItem(arrayElements,position) {
	if (arrayElements[position].visible) return position;
	
	for (arrayElementsItem=position;arrayElementsItem>=0;arrayElementsItem--) {
		if (arrayElements[arrayElementsItem].visible) return arrayElementsItem;
	}
	
	return 0;
}

function selectionNav(arrayElements,elementsName,e,callbackFunction) {
	var keynum;
	if(window.event) {
		keynum = e.keyCode; //IE
	} else if(e.which) {
		keynum = e.which; // Netscape/Firefox/Opera
	}
	if (keynum==40) {
		SelectionNavStatus = 1;
		SelectionNavPos++;
		if (SelectionNavPos<0) SelectionNavPos = arrayElements.length-1;
		if (SelectionNavPos>arrayElements.length-1) SelectionNavPos = 0;
		//check if elemet is not viisble
		if (!arrayElements[SelectionNavPos].visible) {
			SelectionNavPos = findNextVisibleItem(arrayElements,SelectionNavPos);
		}
		if (document.getElementById(elementsName+'_'+SelectionNavPos)!=null) {
			selectionNavUnselectAll(arrayElements,elementsName);
			document.getElementById(elementsName+'_'+SelectionNavPos).className='lineover';
		}
	} else if (keynum==38) {
		SelectionNavStatus = 1;
		SelectionNavPos--;
		if (SelectionNavPos<0) SelectionNavPos = arrayElements.length-1;
		if (SelectionNavPos>arrayElements.length-1) SelectionNavPos = 0;
		//check if elemet is not viisble
		if (!arrayElements[SelectionNavPos].visible) {
			SelectionNavPos = findPrevVisibleItem(arrayElements,SelectionNavPos);
		}
		if (document.getElementById(elementsName+'_'+SelectionNavPos)!=null) {
			selectionNavUnselectAll(arrayElements,elementsName);
			document.getElementById(elementsName+'_'+SelectionNavPos).className='lineover';			
		}
	} else if (keynum==13) {
		SelectionNavStatus = 0;
		SelectionWait = 1;
		if (arrayElements.length>0 && SelectionNavPos<arrayElements.length && SelectionNavPos>=0) callbackFunction(SelectionNavPos);
		return false;
	}
}

function listWineryNavUnselAll() {
	for (i=0;i<WineryArray.length;i++) {
		if (document.getElementById('wineryItem_'+i)!=null)
		document.getElementById('wineryItem_'+i).className='line';
	}
}

function listWineryNav(e) {
var keynum;

if(window.event) // IE
	{
		keynum = e.keyCode;
	} else if(e.which) // Netscape/Firefox/Opera
	{
		keynum = e.which;
	}
	//40 38 13
	if (keynum==40) {
		WineryNavPos++;
		listWineryNavUnselAll()
		if (WineryNavPos<0) WineryNavPos = WineryArray.length-1;
		if (WineryNavPos>WineryArray.length-1) WineryNavPos = 0;
		if (document.getElementById('wineryItem_'+WineryNavPos)!=null) document.getElementById('wineryItem_'+WineryNavPos).className='lineover';
	} else if (keynum==38) {
		WineryNavPos--;
		listWineryNavUnselAll()
		if (WineryNavPos<0) WineryNavPos = WineryArray.length-1;
		if (WineryNavPos>WineryArray.length-1) WineryNavPos = 0;
		if (document.getElementById('wineryItem_'+WineryNavPos)!=null) document.getElementById('wineryItem_'+WineryNavPos).className='lineover';
	} else if (keynum==13) {
		if (WineryArray.length>0 && WineryNavPos<WineryArray.length && WineryNavPos>=0)	selectWinery(WineryNavPos);
		return false;
	}
}

function loadWineNames() {
	url = serverURI+"/xmlsrv.php?cmd=show_wine_names&winery_id="+document.mainForm.winery_id.value;
	var callback = function(xmlDocument) {
		if (xmlDocument==null) {
			alert('Unknown error!');
		} else {
			var items = xmlDocument.getElementsByTagName('wine');
			WineArray = new Array(items.length);
			for (i=0;i<items.length;i++) {
				WineArray[i] = new WineObj(items[i].getAttribute('id'),items[i].getAttribute('name'));
			}
		}
	}
	
	ajax(url,'GET',callback);	
}

function loadWineData() {
	url = serverURI+"/xmlsrv.php?cmd=show_wine_data&wine_id="+document.mainForm.wine_id.value;
	var callback = function(xmlDocument) {
		if (xmlDocument==null) {
			alert('Unknown error!');
		} else {
			var items = xmlDocument.getElementsByTagName('wine');
			if (items[0].getAttribute('id')==document.mainForm.wine_id.value && items[0].getAttribute('name')==document.mainForm.wine_name.value) {
				document.mainForm.wine_description.value = items[0].getAttribute('description');
				document.mainForm.wine_region_id.value = items[0].getAttribute('region_id');
				for (i=0;i<RegionsArray.length;i++) {
					if (RegionsArray[i].id == document.mainForm.wine_region_id.value) {
						document.mainForm.wine_region.value = RegionsArray[i].name;
						break;
					}
				}
				for (i=0; i<document.mainForm.wine_type.length; i++) {
					if(document.mainForm.wine_type.options[i].value==items[0].getAttribute('type')) {
						document.mainForm.wine_type.options[i].selected = true;
						break;
					}
				}
				document.mainForm.wine_alcohol.value = items[0].getAttribute('alcohol');
				//show grapes
				var grapeItems = items[0].getAttribute('grapes').split(',');
				while (document.getElementById('grapesFields').rows.length>0) delGrapesField();
				for (i=0;i<grapeItems.length;i++) {
					var garapeSubItems = grapeItems[i].split(' ');
					var grapeName = getGrapeName(garapeSubItems[0]);
					//alert(getGrapeName(1));
					if (grapeName!='') 
					addGrapesField(garapeSubItems[0],grapeName,garapeSubItems[1]);
				}
				if (grapeItems.length<3) addGrapesField('','','');
			}
		}
	}
	
	ajax(url,'GET',callback);	
}

function showWineList() {
	var obj = document.mainForm.wine_name;
	var data = "";
	if (WineArray.length==0) {
		vBox_hide('vBox1');
	} else {
		for (i=0;i<WineArray.length;i++) {
			data+= '<div class="line" onclick="selectWine('+i+')" onmouseover="this.className=\'lineover\'" onmouseout="this.className=\'line\'">'+WineArray[i].name+'</div>';
		}
		data+= '<div align="right"><a href="javascript:void(0);" onclick="vBox_hide(\'vBox1\')">close</a></div>';
		vBox_show('vBox1',findPosition(obj)[0],findPosition(obj)[1]+obj.offsetHeight-1,obj.offsetWidth,0,data);
	}
}

function hideWineList() {
	//var obj = document.mainForm.wine_name;
	//vBox_hide('vBox1');
	if (document.mainForm.wine_name.value!='' && document.mainForm.wine_id.value=='') {
		for (i=0;i<WineArray.length;i++) {
			if (WineArray[i].name==document.mainForm.wine_name.value) {
				selectWine(i);
				break;
			}
		}
	}
}

function selectWine(array_id) {
	document.mainForm.wine_id.value = WineArray[array_id].id;
	document.mainForm.wine_name.value = WineArray[array_id].name;
	loadWineData();
	vBox_hide('vBox1');
	loadVintages();
	document.mainForm.vintage.focus();
}

function clearWineData() {
	if (document.mainForm.wine_id.value!='')  {
		//vBox_hide('vBox1');
		var save_winery_id = document.mainForm.winery_id.value;
		var save_winery_name = document.mainForm.winery_name.value;
		var save_wine_name = document.mainForm.wine_name.value;
		ResetForm();
		document.mainForm.winery_id.value = save_winery_id;
		document.mainForm.winery_name.value = save_winery_name;
		document.mainForm.wine_name.value = save_wine_name;
		document.mainForm.wine_id.value = '';
	}
}


function loadGrapes() {
	url = serverURI+"/xmlsrv.php?cmd=show_grapes";

	var callback = function(xmlDocument) {
		if (xmlDocument==null) {
			alert('Unknown error!');
		} else {
			var items = xmlDocument.getElementsByTagName('grapes');
			GrapesArray = new Array(items.length);
			for (i=0;i<items.length;i++) {
				GrapesArray[i] = new GrapesObj(items[i].getAttribute('id'),items[i].getAttribute('name'));
			}
		}
	}
	
	ajax(url,'GET',callback);	
}

function listGrapes(obj,index) {
	var data = "";
	var count = 0;

	if (obj.value=='') {
		vBox_hide('vBox1');
	} else {
		if (GrapesArray.length==0) return;

		for (i=0;i<GrapesArray.length;i++) {
			if(GrapesArray[i].name.search(new RegExp(obj.value,"i"))>=0) {
				count++;
				data+= '<div class="line" onclick="selectGrape('+i+','+index+')" onmouseover="this.className=\'lineover\'" onmouseout="this.className=\'line\'">'+GrapesArray[i].name+'</div>';
			}
		}
		//alert(obj.offsetHeight );
		if(count>0) vBox_show('vBox1',findPosition(obj)[0],findPosition(obj)[1]+obj.offsetHeight-1,0,0,data); else vBox_hide('vBox1');
	}
}

function selectGrape(array_id,index) {
	document.mainForm['wine_grapes_id'+index].value = GrapesArray[array_id].id;
	document.mainForm['wine_grapes_name'+index].value = GrapesArray[array_id].name;
	vBox_hide('vBox1');
	//document.mainForm.wine_name.focus();*/
}

function getGrapeName(id) {
	for (j=0;j<GrapesArray.length;j++) {
		if (GrapesArray[j].id==id) {
			return GrapesArray[j].name;
		}
	}
	return '';
}

function addGrapesField(grapes_id,grapes_name,grapes_proc) {
	var obj = document.getElementById('grapesFields');
	var row = obj.insertRow(obj.rows.length);
	var cell = row.insertCell(0);
	cell.innerHTML = '<input type="hidden" name="wine_grapes_id'+obj.rows.length+'" value="'+grapes_id+'"> <input type="text" name="wine_grapes_name'+obj.rows.length+'" value="'+grapes_name+'" onkeyup="checkGrapesFields();listGrapes(this,'+obj.rows.length+');"> <input type="text" name="wine_grapes_proc'+obj.rows.length+'" value="'+grapes_proc+'" maxlength="3" size="2" onkeyup="checkGrapesFields()">%';
}

function delGrapesField() {
	//only delete last fields
	var obj = document.getElementById('grapesFields');
	obj.deleteRow(obj.rows.length-1);	
}

function checkGrapesFields() {
	var obj = document.getElementById('grapesFields');
	if (obj.rows.length>3) {
		//check last field
		var field = document.mainForm['wine_grapes_name'+obj.rows.length];
		if (field.value!='') addGrapesField('','',''); else {
			//check last-1
			var field1 = document.mainForm['wine_grapes_name'+(obj.rows.length-1)];
			if (field1.value=='') delGrapesField();
		}
		
	} else {
		//add extra field
		var field = document.mainForm['wine_grapes_name'+obj.rows.length];
		if (field.value!='') addGrapesField('','','');
	}
}

function loadVintages() {
	url = serverURI+"/xmlsrv.php?cmd=show_vintage_data&wine_id="+document.mainForm.wine_id.value;

	var callback = function(xmlDocument) {
		if (xmlDocument==null) {
			alert('Unknown error!');
		} else {
			var items = xmlDocument.getElementsByTagName('vintage');
			//VintageArray = new Array(items.length);
			clearVintageFields();
			for (i=0;i<items.length;i++) {
				//VintageArray[i] = new VintageObj(items[i].getAttribute('id'),items[i].getAttribute('name'));
				addVintageField(items[i].getAttribute('name'),(items[i].firstChild ? items[i].firstChild.nodeValue : ''),items[i].getAttribute('image'))
			}
		}
	}
	
	ajax(url,'GET',callback);	
}

function checkVintageField() {
	var obj = document.mainForm.vintage;
	if (obj.value=='') {
		//clear vintage table
		return;
	}

	if (obj.value.search(/,/)>=0) {
		//multiple vintage
		var values = obj.value.split(',');
		for (i=0;i<values.length;i++)
		if (!isNaN(values[i])){
			addVintageField(values[i],'','');
		}
	} else if (obj.value.search(/-/)>=0) {
		//interval vintage
		var intervals = obj.value.split('-');
		if (intervals.length==2 && !isNaN(intervals[0]) && !isNaN(intervals[1])) {
			//1 interval
			if (intervals[0]<intervals[1]) {
				for (i=intervals[0];i<=intervals[1];i++) addVintageField(i,'','');
			}
		} else {
			//? interval
		}

	} else if (!isNaN(obj.value)){
		//single vintage
		addVintageField(obj.value,'','');
	}
}

function isVintageField(year) {
	if (document.mainForm['vintage_'+year]!=null && document.mainForm['vintage_'+year].value=='1') return true; else return false;
}

function addVintageField(year,description,image) {
	if (isVintageField(year)) return;
	var obj = document.getElementById('vintageTable');
	var data = "";
	var row = obj.insertRow(obj.rows.length);
	var cell = row.insertCell(0);
	data+= '<input type="hidden" name="vintage_'+year+'" value="1">';
	data+= 'Vintage '+year+'<br>';
	data+= 'Information from Winery <br> <textarea name="vintage_description_'+year+'" style="width:370px; height:140px">'+description+'</textarea><br>';
	data+= 'Image <br>';
	if (image) data+= '<a href="../images/wine/'+image+'" target="_blank"><img src="../images/wine/'+image+'" class="vintageImage"></a><br>';
	data+= '<input type="file" name="image_'+year+'">';
	
	cell.innerHTML = data;
}

function clearVintageFields() {
	var obj = document.getElementById('vintageTable');
	for (i=obj.rows.length-1;i>=0;i--) {
		obj.deleteRow(i);
	}
}

function delVintageField(obj) {
	var index = obj.parentNode.parentNode.rowIndex;
	document.getElementById('vintageTable').deleteRow(index);
}

function ValidateEmail (emailStr) {
	var checkTLD=1; //1 means check it, 0 means don't.
    /* The following is the list of known TLDs that an e-mail address must end with. */
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=emailStr.match(emailPat);
	if (matchArray==null) {
		//alert("Email address seems incorrect (check @ and .'s)");
		return false;
	}
	
	var user=matchArray[1];
	var domain=matchArray[2];
	for (i=0; i<user.length; i++) {
		if (user.charCodeAt(i)>127) {
			//alert("Ths username contains invalid characters.");
			return false;
	   }
	}
	
	for (i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) {
			//alert("Ths domain name contains invalid characters.");
			return false;
		   }
	}

	if (user.match(userPat)==null) {
		//alert("The username doesn't seem to be valid.");
		return false;
	}

	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) {
		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				//alert("Destination IP address is invalid!");
				return false;
			   }
			}
		return true;
	}

	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for (i=0;i<len;i++) {
		if (domArr[i].search(atomPat)==-1) {
			//alert("The domain name does not seem to be valid.");
			return false;
	   }
	}

	if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) {
		//alert("The address must end in a well-known domain or two letter " + "country.");
		return false;
	}

	if (len<2) {
		//alert("This address is missing a hostname!");
		return false;
	}

	return true;
}

function ValidateURL(url) { 
    var v = new RegExp(); 
    v.compile("^[A-Za-z]+://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%&\?\/.,=]+$"); 
    if (!v.test(url)) { 
        //alert("You must supply a valid URL."); 
        return false; 
    } else return true;
} 

//Phone validation
var digits = "0123456789";
var phoneNumberDelimiters = "()- ";
var validWorldPhoneChars = phoneNumberDelimiters + "+";
var minDigitsInIPhoneNumber = 5;

function isInteger(s) {
	var i;
    for (i = 0; i < s.length; i++) {   
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    return true;
}

function stripCharsInBag(s, bag) {
	var i;
    var returnString = "";
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function checkInternationalPhone(strPhone){
	s=stripCharsInBag(strPhone,validWorldPhoneChars);
	return (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
}

function ValidatePhone(Phone){
	
	if ((Phone==null)||(Phone=="")){
		return false;
	}
	if (checkInternationalPhone(Phone)==false){
		return false;
	}
	return true;
 }

var popUpWin=0;

function popUpWindow(pageURL, title,w,h)

{

  if(popUpWin)

  {

    if(!popUpWin.closed) popUpWin.close();

  }
  
  var left = (screen.width/2)-(w/2);
  var top = (screen.height/2)-(h/2);

  popUpWin = window.open (pageURL, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left);

}

function showRegionWin() {
	popUpWindow('add_region.php', "PopupWin", 500, 300);
}

function showAddWineTypeWin() {
	popUpWindow('add_wine_type.php', "PopupWin", 430, 200);
}

function confirmDelUser()
{
    return confirm("Are you sure you want to delete this user?");
}

//popup functions
function disablePage() {
	document.getElementById('page').style.display = 'inline';
}

function enablePage() {
	document.getElementById('page').style.display = 'none';
}

function setOpacity(value) {
 document.getElementById("popup").style.opacity = value / 10;
 document.getElementById("popup").style.filter = 'alpha(opacity=' + value * 10 + ')';
}

function fadeInMyPopup() {
 for( var i = 0 ; i <= 100 ; i++ )
   setTimeout( 'setOpacity(' + (i / 10) + ')' , 8 * i );
}

function fadeOutMyPopup() {
 for( var i = 0 ; i <= 100 ; i++ ) {
   setTimeout( 'setOpacity(' + (10 - i / 10) + ')' , 8 * i );
 }
 setTimeout('closeMyPopup()', 800 );
}

function closeMyPopup() {
 document.getElementById("popup").style.display = "none";
 enablePage();
}

function showLoader() {
	document.getElementById('page').innerHTML = '<div id="pageLoader"></div>';
}

function hideLoader() {
	document.getElementById('page').innerHTML = '';
}

function showPopup(x,y,w,h,title,data) {
	var box = document.getElementById('popup');
	var popup_header = '<div id="popup_header"><div class="icon"></div> <h1>' + title + '</h1> <a class="close" onclick="fadeOutMyPopup();"></a></div>';
	var popup_footer = '';
	if (x==0) box.style.top = (screen.height/2)-(h/2)+'px'; else box.style.top = y+'px';
	if (y==0) box.style.left = (screen.width/2)-(w/2)+'px'; else box.style.left = x+'px';
	if (w>0) box.style.width = w+'px'; else box.style.width = "";
	if (h>0) box.style.height = h+'px'; else box.style.height = "";
	setOpacity( 0 );
	box.innerHTML = popup_header + '<div>' + data + '</div>' + popup_footer;
	box.style.display = "block";
	fadeInMyPopup();
}

  function removeRow( id ) {
    var tr = document.getElementById( id );
    if ( tr ) {
      if ( tr.nodeName == 'TR' ) {
        var tbl = tr;                  // Look up the hierarchy for TABLE
        while ( tbl != document && tbl.nodeName != 'TABLE' ) {
          tbl = tbl.parentNode;
        }
        if ( tbl && tbl.nodeName == 'TABLE' ) {
          while ( tr.hasChildNodes() ) {
            tr.removeChild( tr.lastChild );
          }
          tr.parentNode.removeChild( tr );
        }
      } else {
        alert( 'Specified document element is not a TR.  id=' + id );
      }
    } else {
      alert( 'Specified document element is not found.  id=' + id );
    }
  }
  
function PointObj(x,y) {
	this.x = x;
	this.y = y;
	this.visible = true;
}

var Base64 = {

    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        input = Base64._utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

        }

        return output;
    },

    // public method for decoding
    decode : function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output = output + String.fromCharCode(chr1);

            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }

        }

        output = Base64._utf8_decode(output);

        return output;

    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}