
var ZMEDIA={	
	AJAX:"",
	COOKIE:{},
	DATE:{},
	FORM:{},	
	MODAL:{
		doModalClose:null,
    	saveOnUnload:null
	},
	STRING:{},
    referenceNameIsValid:'notchecked',
    callbackParams:{},
    nothing:function() {}    
};

ZMEDIA.isPrintableASCIIKey=function(eventObj){
	if(eventObj.charCode) return true;
	if(eventObj.keyCode>=65 && eventObj.keyCode<=90) return true;//Letters keys
	if(eventObj.keyCode>=48 && eventObj.keyCode<=57) return true;//number Letters
	if(eventObj.keyCode>=96 && eventObj.keyCode<=105) return true;//keypad numbers
	
	switch(eventObj.keyCode){
	case 32: // ' '
	case 59://;
	case 100:// numeric key pad -
	case 106:// numeric key pad /	
	case 107:// numeric key pad + or =			
	case 109: //-
	case 110:// numeric key pad .
	case 111:// numeric key pad /		
	case 188://,
	case 190://.
	case 191:// /
	case 192:// `	
	case 220: //\		
	case 222://'
			return true;
	default: return false;
	}
}
ZMEDIA.getElementWidth = function(ele) {
	if (typeof ele.clip !== "undefined") {
		return ele.clip.width;
	} else {
		if (ele.style.pixelWidth) {
			return ele.style.pixelWidth;
	    } else {
	    	return ele.offsetWidth;
	    }
	}
}
ZMEDIA.getElementHeight = function(ele) {
    if (typeof ele.clip !== "undefined") {
    	return ele.clip.height;
	} else {
		if (ele.style.pixelHeight) {
			return ele.style.pixelHeight;
		} else {
			return ele.offsetHeight;
		}
	}
}
//from http://www.softcomplex.com/docs/get_window_size_and_scrollbar_position.html
ZMEDIA.f_clientWidth=function() {
	return ZMEDIA.f_filterResults (
		window.innerWidth ? window.innerWidth : 0,
		document.documentElement ? document.documentElement.clientWidth : 0,
		document.body ? document.body.clientWidth : 0
	);
}
ZMEDIA.f_clientHeight=function() {
	return ZMEDIA.f_filterResults (
		window.innerHeight ? window.innerHeight : 0,
		document.documentElement ? document.documentElement.clientHeight : 0,
		document.body ? document.body.clientHeight : 0
	);
}
ZMEDIA.f_scrollLeft=function() {
	return ZMEDIA.f_filterResults (
		window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0
	);
}
ZMEDIA.f_scrollTop=function() {
	return ZMEDIA.f_filterResults (
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0
	);
}
ZMEDIA.f_filterResults=function(n_win, n_docel, n_body) {
	var n_result = n_win ? n_win : 0;
	if (n_docel && (!n_result || (n_result > n_docel)))
		n_result = n_docel;
	return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
},
ZMEDIA.getOffset=function( el ) {
    var _x = 0;
    var _y = 0;
    while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {
        _x += el.offsetLeft - el.scrollLeft;
        _y += el.offsetTop - el.scrollTop;
        el = el.offsetParent;
    }
    return { top: _y, left: _x };
}
	
ZMEDIA.IEVerion=function(){	  
	var _n=navigator,_w=window,_d=document;
	var version="NA";
	var na=_n.userAgent;
	var ieDocMode="NA";
	var ie8BrowserMode="NA";
	// Look for msie and make sure its not opera in disguise
	if(/msie/i.test(na) && (!_w.opera)){
		// also check for spoofers by checking known IE objects
		if(_w.attachEvent && _w.ActiveXObject){		
			// Get version displayed in UA although if its IE 8 running in 7 or compat mode it will appear as 7
			version = (na.match( /.+ie\s([\d.]+)/i ) || [])[1];
			// Its IE 8 pretending to be IE 7 or in compat mode		
			if(parseInt(version)==7){				
				// documentMode is only supported in IE 8 so we know if its here its really IE 8
				if(_d.documentMode){
					version = 8; //reset? change if you need to
					// IE in Compat mode will mention Trident in the useragent
					if(/trident\/\d/i.test(na)){
						version=7;
						ie8BrowserMode = "Compat Mode";
					// if it doesn't then its running in IE 7 mode
					}else{
						version=7;
						ie8BrowserMode = "IE 7 Mode";
					}
				}
			}else if(parseInt(version)==8){
				// IE 8 will always have documentMode available
				if(_d.documentMode){ ie8BrowserMode = "IE 8 Mode";}
			}
			// If we are in IE 8 (any mode) or previous versions of IE we check for the documentMode or compatMode for pre 8 versions			
			ieDocMode = (_d.documentMode) ? _d.documentMode : (_d.compatMode && _d.compatMode=="CSS1Compat") ? 7 : 5;//default to quirks mode IE5				   			
		}
	}				 
	return {
		"UserAgent" : na,
		"Version" : version,
		"BrowserMode" : ie8BrowserMode,
		"DocMode": ieDocMode
	}			
},
//ZMEDIA.getCity=function(e,target){return ;}//this will be for IE and UK (city selector)
ZMEDIA.leapYearCheck=function(e,target){
	if(window.event) e=window.event;
	var src=(e.target)?e.target:e.srcElement;
	var idx=src.selectedIndex;
	var val=src.options[idx].value;	
	target=target.split(",");
	var monthOb=document.getElementById(target[0]);
	var month=ZMEDIA.DATE.convertMonthToInt(monthOb.options[monthOb.options.selectedIndex].value);
	if(month==2){
		var leapYear=ZMEDIA.DATE.isLeapYear(val);
		var dayOb=document.getElementById(target[1]);
		var start=28;
		
		if(!leapYear && dayOb.options.selectedIndex>=start){ 
			dayOb.options.selectedIndex=start-1;
		}else if(dayOb.options.selectedIndex>=start){
			dayOb.options.selectedIndex=start;			
		}
			
		for(var x=start;x<dayOb.options.length;x++){dayOb.options[x].disabled=true;}
		if(leapYear) dayOb.options[28].disabled=false;
	}
}

ZMEDIA.getDaysInMonth=function(e,target){
	
	if(window.event) e=window.event;
	var src=(e.target)?e.target:e.srcElement;
	var	idx=src.selectedIndex;
	target=target.split(",");
	var targ=document.getElementById(target[0]);
	value=src.options[idx].value;
	value=ZMEDIA.DATE.convertMonthToInt(value);
	var dim=[0,31,28,31,30,31,30,31,31,30,31,30,31];
	var d=dim[value];
	var start=0;
	if(targ.options[0].value==""){start++;}
	for(var x=start;x<targ.options.length;x++){
		targ.options[x].disabled=false;
	}
	if(value==2){
		var year=document.getElementById(target[1]);
		var selYear=year.options[year.options.selectedIndex].value;
		if(ZMEDIA.DATE.isLeapYear(selYear))d++;
		
		if(targ.options.selectedIndex>d){targ.options.selectedIndex=d-1}
	}
	for(var x=d+start;x<targ.options.length;x++){
		targ.options[x].disabled=true;
	}	
}

ZMEDIA.formatPhone=function(e,ele){
	var key,str;  	
	  str='';  	  
	  if(e.charCode<48 || e.charCode>57){ return false;}
	  var phoneVal=ele.value;  	  
	  phoneVal=phoneVal.replace(/[^0-9]+/g,"");
	  if(phoneVal.length>10){return false;}
	  setTimeout(function(){
	    	var phoneVal=ele.value;  	  
	    	phoneVal=phoneVal.replace(/[^0-9]+/g,"");  	  		
	  		if( phoneVal.length<4){  	  		
				str=phoneVal;
	  		}else if(phoneVal.length<=7){  	  
	  			str=phoneVal.substring(0,phoneVal.length-4)+"-"+phoneVal.substring(phoneVal.length-4);  	  	
	  		}else if(phoneVal.length<=10){  	    	  
	  			str="("+phoneVal.substring(0,phoneVal.length-7)+") "+phoneVal.substring(phoneVal.length-7,phoneVal.length-4)+"-"+phoneVal.substring(phoneVal.length-4);  	  	  	  			
	  		}	   
	  		else{
	   			str=phoneVal;
	  		}  	  
	   		//reflow.formatValue=str;
	   		ele.value=str;
	 	},0);
}

ZMEDIA.gotoUrl=function(who){
  	document.location.href=who.value;
}

ZMEDIA.goToAdminPage=function(){
  var el=document.getElementById('admin_page_sel');
  var url=el.options[el.selectedIndex].value;
  document.location.href=url;
}

ZMEDIA.logout=function(){
	document.getElementById("admin_logout").submit();
}

ZMEDIA.AJAX={		
	processing:false,	
	getHTTPObject:function(){
		var xmlHttpReq=false;
		if(window.XMLHttpRequest){
			xmlHttpReq=new XMLHttpRequest();
			if(xmlHttpReq.overrideMimeType){
				xmlHttpReq.overrideMimeType('text/xml')
			}
			return xmlHttpReq
		}else if(window.ActiveXObject){
			try{
				xmlHttpReq=new ActiveXObject("Msxml2.XMLHTTP")
			}catch(e){
				try{
					xmlHttpReq=new ActiveXObject("Microsoft.XMLHTTP")
				}catch(e2){
				}
			}
			return xmlHttpReq
		}
	},
	
	submitRequest:function(url,parameters,successCmd,additionalParameters){
		var xmlHttpReq=ZMEDIA.AJAX.getHTTPObject();
		if(!xmlHttpReq){
			alert('Cannot create XMLHTTP instance');
			return false
		}if(ZMEDIA.AJAX.processing){
			alert("An Ajax request is already pending please wait.")
		}
		ZMEDIA.AJAX.processing=true;
		xmlHttpReq.onreadystatechange=function(){
			if(xmlHttpReq.readyState==4){
				var strResponse=xmlHttpReq.responseText;
				switch(xmlHttpReq.status){
					case 200:
						var docEle=xmlHttpReq.responseXML.documentElement;
						var errorOccurred=false;
						var messages=[];
						var data=[];
						for(var x=0;x<docEle.childNodes.length;x++){
							if(docEle.childNodes[x].tagName=="messages"){
								messages=ZMEDIA.AJAX.parseMessageNodes(docEle.childNodes[x])
							}else if(docEle.childNodes[x].tagName=="data"){
								data=ZMEDIA.AJAX.parseDataNodes(docEle.childNodes[x])
							}
						}
						ZMEDIA.AJAX.processing=false;successCmd(messages,data,additionalParameters);
					break;
					case 404:
						ZMEDIA.AJAX.processing=false;
						alert('Error: Not Found. The requested URL '+url+' could not be found.');
						break;
					case 500:
						ZMEDIA.AJAX.processing=false;
						ZMEDIA.AJAX.handleErrFullPage(strResponse);
						break;
					default:
						ZMEDIA.AJAX.processing=false;
						ZMEDIA.AJAX.handleErrFullPage(strResponse);
						break
				}
			}
		};
		xmlHttpReq.open("post",url,true);
		xmlHttpReq.setRequestHeader("Content-type","application/x-www-form-urlencoded");
		xmlHttpReq.setRequestHeader("Content-length",parameters.length);
		xmlHttpReq.setRequestHeader("Connection","close");
		if(xmlHttpReq.overrideMimeType){
			xmlHttpReq.overrideMimeType('text/xml')
		}try{
			xmlHttpReq.send(parameters)
		}catch(e){}
	},
	
	handleErrFullPage:function(strIn){
		var errorWin;
		try{
			errorWin=window.open('','errorWin');
			errorWin.document.body.innerHTML=strIn
		}catch(e){
			alert('An error occurred, but the error message cannot be'+' displayed because of your browser\'s pop-up blocker.\n'+'Please allow pop-ups from this Web site.')
		}
	},
	
	parseMessageNodes:function(xml){
		var idx;
		var messages=[];
		for(var x=0;x<xml.childNodes.length;x++){
			idx=xml.childNodes[x];
			var element={};
			element.name=(idx.childNodes[0].text)?idx.childNodes[0].text:idx.childNodes[0].textContent;
			element.status=(idx.childNodes[1].text)?idx.childNodes[1].text:idx.childNodes[1].textContent;
			element.value=(idx.childNodes[2].text)?idx.childNodes[2].text:idx.childNodes[2].textContent;
			messages[messages.length]=element
		}
		return messages
	},
	
	parseDataNodes:function(xml){
		var idx,my_JSON_object;
		var data=[];
		for(var x=0;x<xml.childNodes.length;x++){
			idx=xml.childNodes[x];
			var element={};
			element.name=(idx.childNodes[0].text)?idx.childNodes[0].text:idx.childNodes[0].textContent;
			if(idx.childNodes[1].childNodes.length==1){
				if(idx.childNodes[1].attributes.length==0){
					element.value=(idx.childNodes[1].text)?idx.childNodes[1].text:idx.childNodes[1].textContent
				}else{
					jsonStr=(idx.childNodes[1].text)?idx.childNodes[1].text:idx.childNodes[1].textContent;
					my_JSON_object=!(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(jsonStr.replace(/"(\\.|[^"\\])*"/g,'')))&&eval('('+jsonStr+')');
					element.value=my_JSON_object
				}
			}else{
				element.value=[];
				var arrayVal,arrayEle,arrayIdx;
				for(var i=0;i<idx.childNodes[1].childNodes.length;i+=2){
					arrayEle=idx.childNodes[1].childNodes[i];
					arrayIdx=(arrayEle.text)?arrayEle.text:arrayEle.textContent;
					arrayEle=idx.childNodes[1].childNodes[i+1];
					if(arrayEle.attributes.length==0){
						arrayVal=(arrayEle.text)?arrayEle.text:arrayEle.textContent
					}else{
						arrayVal=(arrayEle.text)?arrayEle.text:arrayEle.textContent;
						my_JSON_object=!(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(arrayVal.replace(/"(\\.|[^"\\])*"/g,'')))&&eval('('+arrayVal+')');arrayVal=my_JSON_object}element.value.push({key:arrayIdx,value:arrayVal}
						)
					}
				}
				data[data.length]=element
			}
			return data
		},
		
		getFatalMessage:function(messages){
			var error='';
			for(var idx=0;idx<messages.length;idx++){
				if(messages[idx].status==8||messages[idx].status==16){
					error+=messages[idx].value+"\n"
				}
			}
			return error
		}
	};
	

	//http://techpatterns.com/downloads/javascript_cookies.php
ZMEDIA.COOKIE.set=function( name, value, expires, path, domain, secure ){
	// set time, it's in milliseconds
	var today = new Date();
	today.setTime( today.getTime() );

/*
if the expires variable is set, make the correct
expires time, the current script below will set
it for x number of days, to make it for hours,
delete * 24, for minutes, delete * 60 * 24
*/
	if ( expires ){
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );

	document.cookie = name + "=" +escape( value ) +
		( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" ) +
		( ( path ) ? ";path=" + path : "" ) +
		( ( domain ) ? ";domain=" + domain : "" ) +
		( ( secure ) ? ";secure" : "" );
}

ZMEDIA.COOKIE.get=function( check_name ) {
	// first we'll split this cookie up into name/value pairs
	// note: document.cookie only returns name=value, not the other components
	var a_all_cookies = document.cookie.split( ';' );
	var a_temp_cookie = '';
	var cookie_name = '';
	var cookie_value = '';
	var b_cookie_found = false; // set boolean t/f default f

	for ( i = 0; i < a_all_cookies.length; i++ )
	{
		// now we'll split apart each name=value pair
		a_temp_cookie = a_all_cookies[i].split( '=' );

		// and trim left/right whitespace while we're at it
		cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g, '');

		// if the extracted name matches passed check_name
		if ( cookie_name == check_name ){
			b_cookie_found = true;
			// we need to handle case where cookie has no value but exists (no = sign, that is):
			if ( a_temp_cookie.length > 1 ){
				cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g, '') );
			}
			// note that in cases where cookie is initialized but no value, null is returned
			return cookie_value;			
		}
		a_temp_cookie = null;
		cookie_name = '';
	}
	if ( !b_cookie_found ){
		return null;
	}
}

// this deletes the cookie when called
ZMEDIA.COOKIE.unset=function( name, path, domain ) {
	if ( ZMEDIA.COOKIE.get( name ) ){ 
		document.cookie = name + "=" +(( path )? ";path=" + path : "") +
									  (( domain )? ";domain=" + domain : "" ) +
								";expires=Thu, 01-Jan-1970 00:00:01 GMT";
	}
}


ZMEDIA.DATE.setTime=function(id){
	var hr=document.getElementById(id+"_hr");
	hr=hr.options[hr.selectedIndex].value;
	var min=document.getElementById(id+"_min");
	min=min.options[min.selectedIndex].value;
	var sec=document.getElementById(id+"_sec");
	if(sec){
		sec=min.options[sec.selectedIndex].value;
	}else{
		sec="00";
	}
	var pm=document.getElementById(id+"_pm");
	if(pm.selectedIndex==1) hr=parseInt(hr,10)+12;
	document.getElementById(id).value=hr+":"+min+":"+sec;
}

ZMEDIA.DATE.isLeapYear=function(year){
	if(isNaN(year))return false;
	if((year%4)==0){
		if(parseInt(year/100)==(year/100.0)){
			if(year%400==0){return true;}
		}else{
			return true;
		}
	}
	return false;
}
ZMEDIA.DATE.convertMonthToInt=function(value){
	if(value==""){return 0;}
	if(parseInt(value)==value){return parseInt(value);}
	var months=["january","february","march","april","may","june","july","august","september","october","november","december"];
	var monthabbrev=["jan","feb","mar","apr","may","jun","jly","aug","sep","oct","nov","dec"];
	value=value.toLowerCase();
	for(var x=0;x<months.length;x++){
		if(months[x]==value){return x+1;}
	}
	for(var x=0;x<monthabbrev.length;x++){
		if(monthabbrev[x]==value){return x+1;}
	}
	return 1;
}
ZMEDIA.DATE.setFrmEleDate=function(ele){
	var name=ele.id;	
	var root=name.substring(0,name.indexOf("_"));
	var year=document.getElementById(root+"_year");
	var month=document.getElementById(root+"_month");
	var day=document.getElementById(root+"_day");
	
	document.getElementById(root).value=year.options[year.selectedIndex].value+"-"+
		month.options[month.selectedIndex].value+"-"+ day.options[day.selectedIndex].value;	
}

ZMEDIA.FORM.associate=function(srcId,destId){    
      var src=document.getElementById(srcId);      
      var dest=(destId)?document.getElementById(destId):{options:[]};
      
      for(x=0;x<src.options.length;x++){
    	  if(src.options[x].selected){    		    
    		  	var opt=new Option(src.options[x].text,src.options[x].value);
    		  	dest[dest.options.length]=opt;
    		  	src.options[x]=null;
    		  	x--;//we found one so we need to back up one    		  	
    	  }
      }
}

ZMEDIA.FORM.getRadioCheckedValue=function (ele){
	for(var i=0; i<ele.length; i++){
		if ((document.all)&&(ele[i].status==true)){return ele[i].value;}
		if ((!document.all)&&(ele[i].checked==true)){return ele[i].value;}
	}
};

ZMEDIA.FORM.getValue=function(ele){		
	if(typeof(ele)=="string") return ele;
	
   	switch(ele.type){
		case "hidden":
		case "text":
		case "password":
		case "textarea":
   			return ele.value;
		case "radio":
  			return ele.checked;
		case "checkbox":
  			return ele.checked;
		case "select-one":
  			return ele.options[ele.options.selectedIndex].value;

		default:
  			return false; 
   	}
}

ZMEDIA.FORM.list_change_order=function(ctrEle,dir){    
      var list=document.getElementById(ctrEle);
      var idx=list.selectedIndex;
      
      if(dir==-1 && idx==0){ return;} //1st is selected can not move up
      if(dir==1 && idx==list.options.length-1){ return;} //last is selected can not move down
      
      var src={};
      src.text=list[idx].text;
      src.value=list[idx].value;
      
      var dest={};
      dest.text=list[idx+dir].text;
      dest.value=list[idx+dir].value;
      
      list.options[idx].text=dest.text;
      list.options[idx].value=dest.value;
      
      list.options[idx+dir].text=src.text;      
      list.options[idx+dir].value=src.value;     
      list.selectedIndex=idx+dir;
}

ZMEDIA.FORM.list_change_order_swap=function(ctrEle){
      var list=document.getElementById(ctrEle);
      var idx=list.selectedIndex;
	  var tot=list.options.length;
	  newPos=prompt("Enter the position to move the selected item to [1-"+tot+"]",1);
	  if(!Number(newPos)){ alert("You did not enter a valid number [1-"+tot+"]");return;}
	  if(newPos<1){ alert("You did not enter a valid number [1-"+tot+"]");return;}
	  if(newPos>tot){alert("You did not enter a valid number [1-"+tot+"]");return;}
	  if(idx+1==newPos){ return;} //already at the move to pos
	  var ops=[];
	  mv=null;
	  count=0;
	  while(list.options.length){
	  	if(count++==idx){mv=list.options[0];}
	  	else{ ops[ops.length]=list.options[0];}
	  	list.options[0]=null;
	  }
	  count=1;
	  for(x=0;x<ops.length;x++){
	  	  if(count++==newPos){
	  	  	list.options[list.options.length]=mv;
	  	  	mv=null;
	  	  }
	  	  list.options[list.options.length]=ops[x];
	  }
	  if(mv){list.options[list.options.length]=mv;}
}

ZMEDIA.FORM.removeSelecion=function(srcId){    
      var src=document.getElementById(srcId);
      
      var x= src.selectedIndex;
      var srcOpt=src.options[x];
      
      src.options[x]=null;
}

ZMEDIA.FORM.selectAll=function(frm){
   	for(var x=0;x<frm.elements.length;x++){
		var t=frm.elements[x];
		if(frm.elements[x].tagName=="SELECT" && frm.elements[x].multiple){  
  			for(var y=0;y<frm.elements[x].options.length;y++){
				frm.elements[x].options[y].selected=true;
  			}
		}
   	}
}

ZMEDIA.FORM.selectAssociated=function(){
	var selObj =document.getElementsByTagName('select');	
	for(var x=0;x<selObj.length;x++){		
		var sel=selObj[x];
		if(!/^associated\d/.test(sel.id)) {continue;}
		for(var y=0;y<sel.options.length;y++){
			sel.options[y].selected=true;
		}
	}
}

ZMEDIA.FORM.setAdminNavDisplay=function(val){
	var ele=document.getElementById("admin_page_sel");
	if(!ele){return;}
	for(var x=0;x<ele.options.length;x++){
		if(ele.options[x].value.indexOf("/"+val+"/")!=-1){ break;}
	}
	if(x==ele.options.length){ return;} //this editor page is not selectable from the dropdown
	ele.selectedIndex=x;
}

ZMEDIA.FORM.setDatePicker=function(w,v){
	var ele=document.getElementById(w);
	ele.value=v;
	ele=document.getElementById(w+"_disp");
	ele.innerHTML=v;
}


ZMEDIA.FORM.setRadioOption=function(w,v){	
   var ele=document.getElementsByTagName("INPUT");
   if(!ele){return;}
   for(var x=0;x<ele.length;x++){
     if(ele[x].type!="radio"){ continue;}
     if(ele[x].name!=w){ continue;}
	  if(ele[x].value==v){
         ele[x].checked=true;
         return;
      }
   }
}


ZMEDIA.FORM.setSelect=function(p){
  	var ele=p[0];
  	var param=p[1];
  	if(ele==""){ return;}
  	var el=document.getElementById(ele);
  	var x=0;
  	for(;x<el.options.length;x++){
  		if(el.options[x].value==param){
  			break;
  		}
  	}
  	try{
  	  el.selectedIndex=x;
  	}catch(e){}
  }


ZMEDIA.FORM.setSelectOptionInSelectBox=function(w,v){
   var ele=document.getElementById(w);
   if(!ele){return;}
   for(var x=0;x<ele.options.length;x++){
      if(ele.options[x].value==v){
         ele.selectedIndex=x;
         break;
      }
   }
}

//this is the default only define it if we didn't already define this.

ZMEDIA.FORM.getProperFieldName=function(ele){					
	return ele.name;
	//if(ele.parentNode.parentNode.childNodes[0].nodeType==3){
	//	return ele.parentNode.parentNode.childNodes[1].childNodes[0].nodeValue;
	//}
	//var v=ele.parentNode.parentNode.childNodes[0].childNodes[0].nodeValue;	
}


ZMEDIA.FORM.checkPrecision=function(ele,per){
	
   var val = ZMEDIA.FORM.getValue(ele);  
   var param=per.split(','); 	
   if(isNaN(val)){ return false;}
   var p=val.indexOf(".");   
   var inc=0;
   //remove decimal place from str length
   if(p!=-1){
   	inc=1;
   }

   if(val.length-inc>param[0]){
   		alert(ZMEDIA.FORM.getProperFieldName(ele)+" exceed max number of digits ["+param[0]+"].");
   	 	return false;   
   }
   
   if(p==-1){ return true;}
   
   if((val.length-p-1) >param[1]){
   		alert(ZMEDIA.FORM.getProperFieldName(ele)+" exceed max number of decimal places ["+param[1]+"]");
   	 	return false;
   }
   return true;
}

ZMEDIA.FORM.correctValueForType=function(ele,p){
	var days=[0,30,28,31,30,31,30,31,31,30,31,30,31];
	var regex;
  	val=ZMEDIA.FORM.getValue(ele);
  	if(val=="" || val==null){ return true;}
  	var yrcheck=false;
  	var m=null,d=null;
  	switch(p){
   		case "integer":
   		    var nVal=Number(val);
   		    if(nVal!=val){return false;}
			if (isNaN(val)){return false;}
			if(val.indexOf(".")!=-1){ return false;}
			return true;
   		case "number":
			if (isNaN(val)){ return false;}
		break;
   		case "date":
			regex=new RegExp("(\\d{4})-(\\d{2})-(\\d{2})");
			var match=val.match(regex);			
			if(match==null){
    			return false;
			}else{				
				if(val=="0000-00-00") break;
    			if(match.length!=4){ return false;}
    			match=match.splice(1);
    			m=parseInt(match[1],10);
    			if( m<1 || m>12){ return false;}
    			d=match[2];
    			if(d>31){ return false;}    			
    			if(m==2){   
  					if(d>29){
    					return false;
  					}else if(d==29){
						if(match[0]%4==0){
   							if(match[0]%400==0){ }//aight it a leap year
   							else if(match[0]%100==0){ return false;}//it's not a leap year
 						}else{
   							return false;
 						}
  					}
    			}
			}
		break;
   		case "timestamp": //only dates after 1970
    		  yrcheck=true;    		
   		case "timestamp2"://any date
  			regex=/(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2})/;
  			
  			match=regex.exec(val);
  			
  			if(match==null){
				return false;
  			}else{
  				match=match.slice(1);//the entire string is int the 1st array element
				if(match.length<5){ return false;}
				if(yrcheck && match[0]<1970){return false;}
				m=parseInt(match[1],10);
				if( m<1 || m>12){ return false;}
				d=match[2];
				if(d>31){ return false;}
				if(m==2){   
   					if(d>29){
						return false;
   					}else if(d==29){
  						if(match[0]%4==0){
    						if(match[0]%400==0){}//aight it a leap year
    						else if(match[0]%100==0){ return false;}//it's not a leap year
  						}else{
    						return false;
  						}
   					}
				}
				if(parseInt(match[3],10)>=24){ return false;}
				if(parseInt(match[4],10)>=60){ return false;}
  			}   
		break;
		default:
		  	alert("Unkown type "+p+" for element "+ele.name);
			return false;
		break;
  	}
  return true;
}

ZMEDIA.FORM.isnull=function(ele){   
   value=ZMEDIA.FORM.getValue(ele);
   if(value===false){ return false;}
   if(value=="" || value==null){
		return true;
   }
   return false; 
}


ZMEDIA.FORM.isCCInfo=function(str,card,cvn,month,year){
	var d = new Date();			
	var cyear=d.getYear();
	
	if(cyear>year){
		ZMEDIA.FORM.alert("The credit card has expired.");
		 return false;
	}else if(cyear==year){
		month=parseInt(month,10);
		cmonth=parseInt(d.getMonth());
		if(month<cmonth){
			ZMEDIA.FORM.alert("The credit card has expired.");
		 	return false;			
		}
	}

	var cmonth=d.getMonth()+1;
	
	var result = false;
    var validNums;
   
    var cardLen = str.length;
    var firstdig = str.charAt(0);
    var seconddig = str.charAt(1);    
   
    card=card.toUpperCase();    
    switch (card){
    	case "VISA"://visa    	
    		result = (firstdig=="4") && ((cardLen == 16) || (cardLen == 13));    
    		if(!result) ZMEDIA.FORM.alert("Invalid Card Number for Visa.");		
    		if(!/^\d{3}$/.test(cvn)){ 
    			result=false;
    			ZMEDIA.FORM.alert("Invalid Card Verification Number for Visa.");		
    		}
    	break;
    	
    	case "AMEX":    	
    	case "AMERICAN EXPRESS":    	    	
   			validNums = "47";
   			result = (firstdig=="3") && (cardLen == 15) && (validNums.indexOf(seconddig)>=0);
   			if(!result) alert("Invalid Card Number for American Express.");		
			if(!/^\d{4}$/.test(cvn)){ 
    			result=false;
    			ZMEDIA.FORM.alert("Invalid Card Verification Number for American Express.");		
    		}
    	break;
    	
    	case "DINERS":    	
    	case "DINERS CLUB":    	
    	case "DINERS CLUB INT":    	
    	case "DINERS CLUB INTERNATIONAL":    	    		
    		validNums = "068";
    		result =  (firstdig=="3") && (cardLen == 14) && (validNums.indexOf(seconddig)>=0);
    		if(!result) ZMEDIA.FORM.alert("Invalid Card Number for Diners Club.");		
    		if(!/^\d{3}$/.test(cvn)){ 
    			result=false;
    			ZMEDIA.FORM.alert("Invalid Card Verification Number for Diners Club.");		
    		}
    	break;
    	
    	case "MASTERCARD"://masterCard
    		validNums = "12345";
    		result = (firstdig=="5") && (cardLen == 16) && (validNums.indexOf(seconddig)>=0);
    		if(!result) ZMEDIA.FORM.alert("Invalid Card Number for MasterCard.");		
    		if(!/^\d{3}$/.test(cvn)){ 
    			result=false;
    			ZMEDIA.FORM.alert("Invalid Card Verification Number for MasterCard.");		
    		}
    	break;
    
    	case "DISCOVER"://Discover
    		result = (cardLen == 16) && (str.substring(0,4) == "6011");
    		if(!result) ZMEDIA.FORM.alert("Invalid Card Number for Discover.");		
    		if(!/^\d{3}$/.test(cvn)){ 
    			result=false;
    			ZMEDIA.FORM.alert("Invalid Card Verification Number for Discover.");		
    		}
    	break;
    }
    if(result) return ZMEDIA.FORM.isLUN(str);
    return false;
}

ZMEDIA.FORM.isEmail=function(ele){
	var val=ZMEDIA.FORM.getValue(ele);	
	var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(2([0-4]\d|5[0-5])|1?\d{1,2})(\.(2([0-4]\d|5[0-5])|1?\d{1,2})){3} \])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;	
    return re.test(val);
}

ZMEDIA.FORM.isLUN=function(str){
    var result = true;
   
    var sum = 0;
    var mul = 1;
    var strLen = str.length;
   
    for (i = 0; i < strLen; i++){
    	var digit = str.substring(strLen-i-1,strLen-i);
    	var tproduct = parseInt(digit ,10)*mul;
    	if (tproduct >= 10){sum += (tproduct % 10) + 1;}
    	else{sum += tproduct;}
    	if (mul == 1){mul++;}
    	else{mul--;}
    }
    if ((sum % 10) != 0){result = false;}   
    return result;
}

ZMEDIA.FORM.isPhone=function(ele){
	var val=ZMEDIA.FORM.getValue(ele);
	var re=/^(\+\d*|1){0,1}(\s*|-|\.){0,1}(\(\d{3}\)|\d{3}){0,1}(\s*|-|\.){0,1}\d{3}(\s*|-|\.){0,1}\d{4}$/ 
	return re.test(val);
}

ZMEDIA.FORM.isRange=function(ele,range){
	var val=Number(ZMEDIA.FORM.getValue(ele));
	var start=range.charAt(0);
	if(start!='[' && start!='('){
		alert("Invalid range check for "+ZMEDIA.FORM.getProperFieldName(ele));
		return false;
	}
	
	var end=range.charAt(range.length-1);
	if(end!=']' && end!=')'){
		alert("Invalid range check for "+ZMEDIA.FORM.getProperFieldName(ele));
		return false;
	}


	var str=range.substring(1,range.length-1);
	var r=str.split(',');
		
	if(isNaN(r[0]) && r[0]!="-inifinity"){
		alert("Invalid range check for "+ZMEDIA.FORM.getProperFieldName(ele));
		return false;
	}
	if(isNaN(r[1]) && r[1]!="inifinity"){
		alert("Invalid range check for "+ZMEDIA.FORM.getProperFieldName(ele));
		return false;
	}
    
	switch(start){
		case '[': 
			if(!isNaN(r[1])){
				if(val < Number(r[0])){
					return false;
				}
			}
			break;
		case '(': 
			if(!isNaN(r[1])){
				if(val <= Number(r[0])){
					return false;
				}
			}		
			break;
	}
	
	switch(end){
		case ']': 
			if(!isNaN(r[1])){
				if(val > Number(r[1])){
					return false;
				}
			}
			break;
		case ')': 
			if(!isNaN(r[1])){
				if(val >= Number(r[1])){
					return false;
				}
			}		
			break;
	}
    	
	return true;
}


ZMEDIA.FORM.isYearRange=function(ele,range){
	var val=ZMEDIA.FORM.getValue(ele);
	if(isNaN(val) || parseInt(val)!=val){
		return false;
	}
	var start=range.charAt(0);
	if(start!='[' && start!='('){
		alert("Invalid range check for "+ZMEDIA.FORM.getProperFieldName(ele));
		return false;
	}
	
	var end=range.charAt(range.length-1);
	if(end!=']' && end!=')'){
		alert("Invalid range check for "+ZMEDIA.FORM.getProperFieldName(ele));
		return false;
	}


	var str=range.substring(1,range.length-1);
	var r=str.split(',');

	for(var x=0;x<r.length;x++){
		if(r[x]=="current"){
			var d = new Date();			
			r[x]=d.getYear();
		}
	
		if(isNaN(r[x]) && (r[x].charAt(0)=="+" || r[x].charAt(0)=="-")){				
			var intVal=parseInt(r[x].substring(1),10);			
			var idx=(x==1)?0:1;			
			if(r[x].charAt(0)=="+")
				r[x]=r[idx]+intVal;
			else
				r[x]=r[idx]-intVal;				
		}
	}
	
    
	switch(start){
		case '[': 
			if(!isNaN(r[1])){
				if(val < r[0]){
					return false;
				}
			}
			break;
		case '(': 
			if(!isNaN(r[0])){
				if(val <= r[0]){
					return false;
				}
			}		
			break;
	}
	
	switch(end){
		case '[': 
			if(!isNaN(r[1])){
				if(val > r[1]){
					return false;
				}
			}
			break;
		case '(': 
			if(!isNaN(r[1])){
				if(val >= r[1]){
					return false;
				}
			}		
			break;
	}
    	
	return true;
}


ZMEDIA.FORM.isZipcode=function(ele){
	var val=ZMEDIA.FORM.getValue(ele);
	//validates US or canadian zipcodes	
    var re = /(^\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$)/;    
    return re.test(val);
}


ZMEDIA.FORM.trim=function(element){
	value="";
	switch(element.type){
	case "hidden":
	case "text":
	case "password":
			value=element.value;
	}
	if(value){
		value=value.trim();
		element.value=value;
	}
}

ZMEDIA.FORM.alert=function(ele,str){
	var pName=ZMEDIA.FORM.getProperFieldName(ele);
	alert(pName+" "+str);
}
ZMEDIA.FORM.validateForm=function(frm, selectAllMulti){	
   	var ele=frm.elements;
   	
   	process_next_form_field:
   	for(var x=0;x<ele.length;x++){   
		var validateArg=ele[x].getAttribute("data-validate");
		//perform trimming on data fields
		ZMEDIA.FORM.trim(ele[x]);
		if(validateArg){			
    		var c=validateArg.split(" ");
    		for(var z=0;z<c.length;z++){
 				var y=c[z].split("=");     				
 				if(y[0]==""){ continue;}
 				switch(y[0]){
 					case "cc_check":
 						otherEle=y[1].split(",");
    				    //call to validateCCInfo(str,card,cvn,month,year)
   					   //let's remove extranious white space and dashes from curent element (card num) and cvn
   					    var myRegExp = new RegExp("[^0-9]","g"); 
   					    ele[x].value=ele[x].value.replace(myRegExp,"");
   					    frm[otherEle[1]].value=frm[otherEle[1]].value.replace(myRegExp,""); 						
 						
						if(!ZMEDIA.FORM.isCCInfo(ZMEDIA.FORM.getValue(ele[x]),ZMEDIA.FORM.getValue(frm[otherEle[0]]),ZMEDIA.FORM.getValue(frm[otherEle[1]]),ZMEDIA.FORM.getValue(frm[otherEle[2]]),ZMEDIA.FORM.getValue(frm[otherEle[3]]))){							
							return false;
						}
 					break;
 					
					case "match": //are null values allowed
						var matchEle=frm.elements[y[1]];						
						matchEleV=ZMEDIA.FORM.getValue(matchEle);
						eleV=ZMEDIA.FORM.getValue(ele[x]);
						if(matchEleV!=eleV){
							ZMEDIA.FORM.alert(ele[x]," and "+ZMEDIA.FORM.getProperFieldName(matchEle)+" must have the same values."); 
							return false;
						}
					break;
					case "length":
						var maxlen=0;
						var minlen=1;
						if(y[1].indexOf("-")==-1){
							maxlen=parseInt(y[1]);
						}else{
							var lrange=y[1].split("-");
							if(lrange.length>2){
								alert("Error invalid argument to length "+y[1]);
								return false;
							}
							minlen=parseInt(lrange[0]);
							maxlen=parseInt(lrange[1]);
							
						}
						eleV=ZMEDIA.FORM.getValue(ele[x]);
						alert(minlen+" "+maxlen+" "+eleV+" "+eleV.length);
						
						if(eleV.length<minlen){
							ZMEDIA.FORM.alert(ele[x]," can must be atleast "+minlen+" long."); 
    						return false;
						}						
						if(eleV.length>maxlen){
							ZMEDIA.FORM.alert(ele[x]," must be less than "+maxlen+" long."); 
    						return false;
						}	
						
					break;
					case "minlength":
						var min=parseInt(y[1]);
						if(min<0){
							alert("Negative minimum length not allowed");
							return false;
						}
						if(min==0) return true;
						if(ZMEDIA.FORM.isnull(ele[x])){
							ZMEDIA.FORM.alert(ele[x]," can not be empty."); 
    						return false;
						}						
						if(ele[x].value.length<min){
							ZMEDIA.FORM.alert(ele[x]," must be at least "+min+" characters long"); 
							return false;
						}	
						break;	
   					case "nullable": //are null values allowed same as required=false
   					   var nullVal=ZMEDIA.FORM.isnull(ele[x]);
						if (y[1]==1 || y[1]=="true"){ //
							if(nullVal) continue process_next_form_field;
						}
						else if(y[1]==0 || y[1]=="false"){ //
							if(nullVal){
								ZMEDIA.FORM.alert(ele[x]," can not be empty."); 
    							return false;
							}
						}else{
							alert("Invalid value for nullable check");
							return false;
						}
   					break;
   					case "password":
						if(ZMEDIA.FORM.isnull(ele[x])){
							ZMEDIA.FORM.alert(ele[x]," can not be empty."); 
    						return false;
						}						
						var pminlen=1;
						var pmaxlen=999;
						if(y[1].indexOf("-")>0){
							var pieces=y[1].split("-");
							pminlen=parseInt(pieces[0]);
							pmaxlen=parseInt(pieces[1]);
						}
						if(ele[x].value.length<pminlen){
							ZMEDIA.FORM.alert(ele[x]," must be at least "+pminlen+" characters long"); 
							return false;
						}
						if(ele[x].value.length>pmaxlen){
							ZMEDIA.FORM.alert(ele[x]," must be at less than "+pmaxlen+" characters long"); 
							return false;
						}
						break;	
   					case "precision":
						if(y[1]==-1){ continue;}
						if(isNaN(ZMEDIA.FORM.getValue(ele[x]))){
							ZMEDIA.FORM.alert(ele[x]," must be a number.");
							 return false;
						}
						if(!ZMEDIA.FORM.checkPrecision(ele[x],y[1])){
    						return false;
						}
					break;
					case "required": //are null values dissallowed					
					    nullVal=ZMEDIA.FORM.isnull(ele[x]);
					    console.log("validateArg "+ele[x].name);
					    if(ele[x].type=="checkbox"){
					    	nullVal=(ele[x].checked==true)?false:true;
					    }
						if (y[1]==1 || y[1]=="true"){							
							if(nullVal){//dissallowed
								ZMEDIA.FORM.alert(ele[x]," is a required field and  can not be empty."); 
    							return false;
							}
						}else if (y[1]==0 || y[1]=="false"){//allowed
							if(nullVal) continue process_next_form_field;//have a null skip testing
						}else{
							alert("Invalid value for required check.");
							return false;
						}						
   					break;

					case "range":
						if(!ZMEDIA.FORM.isRange(ele[x],y[1])){
							ZMEDIA.FORM.alert(ele[x]," the entered value is not in the allowed range "+y[1]);
							return false;
						}
					break;
					case "regex":						
						var patternR=y[1];
						var patternD=y[1];
						switch(patternR){
							case "ALPHANNUMERIC":
								patternR="^[A-Za-z0-9]+$";
								patternD=" Letters and Number only";
							break;
							case "ALPHA":
								patternR="^[A-Za-z]+$";
								patternD=" LETTERS Only";
							break;
							case "ALPHAUPPER":
								patternR="^[A-Z]+$";
								patternD=" UPPER CASE LETTERS only";
							break;
							case "ALPHALOWER":
								patternR="^[a-z]+$";
								patternD=" lower case letters only";
							break;
							case "ALPHALOWER":
								patternR="^[0-9]+$";
								patternD=" numbers only";
							break;
						}
						
						var myregexp = new RegExp(patternR);
						var value=ZMEDIA.FORM.getValue(ele[x]);
						alert(value+" "+myregexp);
						if(!value.match(myregexp)){
							ZMEDIA.FORM.alert(ele[x]," did not match the required pattern "+patternD);
							return false;
						}						
					break;
					case "pattern":					
						var v=false;
						switch(y[1]){
							case "email": v=ZMEDIA.FORM.isEmail(ele[x]); break;
							case "zipcode": v=ZMEDIA.FORM.isZipcode(ele[x]); break;
							case "phone": v=ZMEDIA.FORM.isPhone(ele[x]); break;
						}
						if(!v){
							str=" the required pattern "+y[1]+".";
							switch(y[1]){
								case "email": str="an email address."; break;
								case "zipcode": str="a zip/postal code"; break;
								case "phone": str="a phone number."; break;
							}
							ZMEDIA.FORM.alert(ele[x]," is not a valid value for "+str);
							return false;
						}
					break;
   				case "type":   					
					if(!ZMEDIA.FORM.correctValueForType(ele[x],y[1])){						
						ZMEDIA.FORM.alert(ele[x]," must be of type "+y[1]);
    					return false;
					}
					break;				
				case "year_range":
						if(!validateYearRange(ele[x],y[1])){
							ZMEDIA.FORM.alert(ele[x]+" the entered value is not in the allowed range "+y[1]);
							return false;
						}
					break;	
 				case "enum":		
 						eleV=ZMEDIA.FORM.getValue(ele[x]);			
						var v=false;
						var en=y[1].split("|");
						for(var z=0;z<en.length;z++){
							if(en[z]==eleV) continue process_next_form_field;//we matched so we are good
						}												
						ZMEDIA.FORM.alert(ele[x]," is not a valid "+y[1]);
						return false;
						
					break;				
					
				default: alert("Unknown validation "+y[0]+ " for "+ZMEDIA.FORM.getProperFieldName(ele[x])); return false;;
 				} 				
    		}
    		
		}		
   }      
   return true;
}

ZMEDIA.MODAL.mozPopInit=function(){
    ZMEDIA.MODAL.saveOnUnload = window.onunload;
    window.onunload = null;
}

ZMEDIA.MODAL.dialogClose=function(){
    if (document.all) {
	top.close();
	return;
    }
    window.onunload = ZMEDIA.MODAL.saveOnUnload;
    top.close();
}

ZMEDIA.MODAL.checkRef=function (){
	params={};
	var e=document.forms[0].elements;
	var rn=e["refName"].value;
	if(!rn || rn==""){
		alert("You must specify a reference name");
		return false;
	}
	var kb=e["kb"].value;
	var ref = window.showModalDialog("editor.do?forward=testref&action=testref&refName="+rn+"&kb="+kb, 
			params, "dialogWidth:390px;dialogHeight:140px;help:no;status:no");

	if(document.all){
		return checkRef_close(ref);
	}else{
		ZMEDIA.MODAL.doModalClose=checkRef_close;
	}
}

ZMEDIA.MODAL.FTPFileSelect=function(browseType, field,callback){
	var features = "dialogWidth:400px; dialogHeight:400px; help:no; status:no; resizable:no; scroll:auto; unadorned:yes;";		

	var myUrl= '';		
	switch(browseType){
		case 'file':  myUrl="All";break;
		case 'image':  myUrl="Img";break;
	}

	var obj ={};
	obj.fieldName=field;		
		
	ZMEDIA.MODAL.doModalClose=ZMEDIA.MODAL.FTPFileSelect_close;
	ZMEDIA.MODAL.FTPFileSelect_close.callbackFn=callback;
	
	var ob=window.showModalDialog("/admin/zFileUpload/Browse"+myUrl, obj, features);
	
	if(document.all){		    
		ZMEDIA.MODAL.doModalClose(ob,callback);
	}
}
	
ZMEDIA.MODAL.FTPFileSelect_close=function(ob,callbackFunc){
	if(callbackFunc){ ob=callbackFunc(ob);
	}else{
		if(ZMEDIA.MODAL.FTPFileSelect_close.callbackFn){ ob=ZMEDIA.MODAL.FTPFileSelect_close.callbackFn(ob);}
	}
	document.getElementById(ob.fieldName).value= ob.value;	
}

ZMEDIA.MODAL.getProvince=function(e,target){
	if(window.event) e=window.event;
	var src=(e.target)?e.target:e.srcElement;
	var idx=src.selectedIndex;
	var parameters="countrycode="+encodeURI(src.options[idx].value)+"&target="+encodeURI(target);
	ZMEDIA.AJAX.submitRequest("/ws/GetProvince",parameters,ZMEDIA.MODAL.getProvince__close);
}

ZMEDIA.MODAL.getProvince__close=function(messages,data){
	var fatal=ZMEDIA.AJAX.getFatalMessage(messages);
	var targetname=data.getElement('target').value;
	var targetdata=data.getElement('provinces').value;
	var countryCode=data.getElement('country_code').value;
	var targ;
	
	if(targetname){
		targ=document.getElementById(targetname);
		while(targ.options.length){
			targ.options[0]=null;
		}
	}else{
		alert("Error no state select element specified");
	}

	if(fatal){
		if(countryCode==""){
			var lable=targ.getAttribute("droplable");
			if(lable){
				targ.options[targ.options.length]=new Option(lable,"");
				return;
			}
		}
		alert("The request cold not be completed due to the following errors:\n"+fatal);		
	}
	var x=1;
	
	if(targetname){
		var lable=targ.getAttribute("droplable");
		if(lable){
			targ.options[targ.options.length]=new Option(lable,"");
		}		
		//If this parameter is set we want to set the active state/province to a specific value 
		if(ZMEDIA.callbackParams.getProvince)sel=ZMEDIA.callbackparams.getProvince;
		else sel=0;
		var dataA=targetdata.split(';');
		for(x=0;x<dataA.length;x++){
			targ.options[targ.options.length]=new Option(dataA[x],dataA[x]);
			if(sel==dataA[x]){
				targ.selectedIndex=x;
			}			
		}
	}
}

ZMEDIA.MODAL.getTimeStamp=function(mode,target,page,parameters){
   /*
  mode = 4 TIME        A time - The supported range is 00:00:00 to 23:59:59. MySQL displays DATE values in HH:MM:SS format
  mode = 3 DATE        A date - The supported range is 1000-01-01 to 9999-12-31. MySQL displays DATE values in YYYY-MM-DD format
  mode = 2 DATETIME -  A date and time combination The supported range is 1000-01-01 00:00:00 to 9999-12-31 23:59:59. MySQL displays DATETIME values in YYYY-MM-DD HH:MM:SS format
  mode = 1 TIMESTAMP - A timestamp The range is 1970-01-01 00:00:00 to sometime in the year 2037. MySQL displays TIMESTAMP values in YYYYMMDDHHMMSS, YYMMDDHHMMSS, YYYYMMDD or YYMMDD format, depending on whether M is 14 (or missing), 12, 8 or 6, but allows you to assign values to TIMESTAMP columns using either strings or numbers. A TIMESTAMP column is useful for recording the date and time of an INSERT or UPDATE operation because it is automatically set to the date and time of the most recent operation if you dont give it a value yourself
   */
  var ele=document.getElementById(target);
  var val=ele.value;
  
  var params={};
  params.id=target;
  params.value=ele.value;
  params.mode=mode;
  
  ZMEDIA.MODAL.doModalClose = ZMEDIA.MODAL.getTimeStamp_close;//FireFox compatability
    
    //Open the dialog box
  if(!page) {page="/common/html/calendar.html";}
  if(!parameters){
  	parameters="dialogWidth:225px;dialogHeight:260px;help:no;status:no";
  }
  var dateObj =
	window.showModalDialog(page, params,parameters);

  if (document.all){
	 ZMEDIA.MODAL.doModalClose(dateObj);
  }
  
}

ZMEDIA.MODAL.getTimeStamp_close=function(returnObj){
  if(!returnObj){return;}
  var dest=document.getElementById(returnObj.id+"_disp");
  
  var fmat=dest.getAttribute("data-display");
  var value=returnObj.value;
  
  if(fmat){	  
	  var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9])\s?(?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
	  var parts=value.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
	  var myDate= new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
	  value=myDate.format(fmat);
  }
  
  dest.innerHTML=value;
  document.getElementById(returnObj.id).value=returnObj.value;
  if(ZMEDIA.MODAL.getTimeStamp_close_callback)ZMEDIA.MODAL.getTimeStamp_close_callback(returnObj);
}


ZMEDIA.MODAL.lookupFieldValue=function(fieldName,lookupTable,lookupField,addToSelect,maxSelectAble){
	    if(maxSelectAble){ __MAX_SELECTABLE__=maxSelectAble;}
  		var params={};
  		params.fieldName=fieldName;
  
  		if(addToSelect){
  			if(maxSelectAble){
  				var sel=document.getElementById(fieldName);
  				if(sel.options.length==maxSelectAble){
  					alert("You can not add any more items to this field.");
  					return;
  				}
  			}
  			ZMEDIA.MODAL.doModalClose = lookupFieldValueSelect_close;//FireFox compatability
  		}else{
  			ZMEDIA.MODAL.doModalClose = lookupFieldValue_close;//FireFox compatability
  		}
    
    	//Open the dialog box
  		var dateObj =window.showModalDialog("/DialogFind/Entry/"+lookupTable+"/"+lookupField, params,
			       "dialogWidth:400px;dialogHeight:400px;help:no;status:no");

  		if (document.all){
	 		ZMEDIA.MODAL.doModalClose(dateObj);
  		}

}

ZMEDIA.MODAL.lookupFieldValue_close=function(returnObj){
  if(!returnObj){ return;}
  document.getElementById(returnObj.fieldName+"_display").value=returnObj.displayValue;
  document.getElementById(returnObj.fieldName).value=returnObj.value;
}

ZMEDIA.MODAL.lookupFieldValueSelect_close=function(returnObj){
  if(!returnObj){ return;}
  var sel=document.getElementById(returnObj.fieldName);
  
  var opt=new Option(returnObj.displayValue,returnObj.value);
  for(var x=0;x<sel.options.length;x++){
  	if(sel.options[x].value==returnObj.value){
  		alert("No duplicates allowed: "+returnObj.displayValue);
  		return;
  	}
  }
  sel.options[sel.options.length]=opt;
}



ZMEDIA.STRING.clean=function(str){
	if(typof(str)!="string"){
		str=str.value;
	}
	return str.replace(/[^a-zA-Z0-9]/g,"");
};


ZMEDIA.STRING.xmlEscape=function(x){
	if(!x || x==""){ return x;}
	x=x.replace("&","&amp;");
	x=x.replace("<","&lt;");
	x=x.replace(">","&gt;");
	return x;
};


//convert \n to <br>
ZMEDIA.STRING.escapeRet=function(str) {
    var result = str.split("\n");
    var text = "";
    text = result[0];
    for (var x = 1; x < result.length; x++){
		text += "<br>" + result[x];
    }
    return text;
};
ZMEDIA.STRING.lpad=function(s,l,c){
	if(s.length>=l){ return s;}
	while(s.length<l){
		s=c+s;
	}
	return s;
}

ZMEDIA.STRING.rpad=function(s,l,c){
	if(s.length>=l){ return s;}
	while(s.length<l){
		s+=c;
	}
	return s;
}






/* 
  AddEvent
 written by Dean Edwards, 2005
 with input from Tino Zijdel, Matthias Miller, Diego Perini

 http://dean.edwards.name/weblog/2005/10/add-event/
*/

addEvent=function(element, type, handler) {
	if (element.addEventListener) {
		element.addEventListener(type, handler, false);
	} else {
		// assign each event handler a unique ID
		if (!handler.$$guid) handler.$$guid = addEvent.guid++;
		// create a hash table of event types for the element
		if (!element.events) element.events = {};
		// create a hash table of event handlers for each element/event pair
		var handlers = element.events[type];
		if (!handlers) {
			handlers = element.events[type] = {};
			// store the existing event handler (if there is one)
			if (element["on" + type]) {
				handlers[0] = element["on" + type];
			}
		}
		// store the event handler in the hash table
		handlers[handler.$$guid] = handler;
		// assign a global event handler to do all the work
		element["on" + type] = handleEvent;
	}
};
// a counter used to create unique IDs
addEvent.guid = 1;

function removeEvent(element, type, handler) {
	if (element.removeEventListener) {
		element.removeEventListener(type, handler, false);
	} else {
		// delete the event handler from the hash table
		if (element.events && element.events[type]) {
			delete element.events[type][handler.$$guid];
		}
	}
};

function handleEvent(event) {
	var returnValue = true;
	// grab the event object (IE uses a global event object)
	event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
	// get a reference to the hash table of event handlers
	var handlers = this.events[event.type];
	// execute each event handler
	for (var i in handlers) {
		this.$$handleEvent = handlers[i];
		if (this.$$handleEvent(event) === false) {
			returnValue = false;
		}
	}
	return returnValue;
};

function fixEvent(event) {
	// add W3C standard event methods
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
};
fixEvent.preventDefault = function() {
	this.returnValue = false;
};
fixEvent.stopPropagation = function() {
	this.cancelBubble = true;
};



//Add a trim function to the String class
String.prototype.trim=function(){
   return this.replace(/^\s+|\s+$/g,"");
};


/* 
  For FF when traversing the HTTPRequestObject.requestXML to get a 
  node value it uses textContent.  ie Uses .text so instead of using ugly code
  to test for the browser we make FF act like ie
*/ 
if(!document.all){
  Node.prototype.__defineGetter__("text", function() { return this.textContent; });
}


if(typeof(fileBrowserCallBack) == "undefined"){
  fileBrowserCallBack= function (field_name, url, type, win) {
	// This is where you insert your custom filebrowser logic
	alert("Example of filebrowser callback: field_name: " + field_name + ", url: " + url + ", type: " + type);
	// Insert new URL, this would normaly be done in a popup
	win.document.forms[0].elements[field_name].value = "someurl.htm";
  };
}

//From Dean Edwards
Array.prototype.getElement=function(idx,occurance){
	var len=this.length;
	if(!occurance){ occurance=1;}
	var count=0;
	for(var x=0;x<len;x++){
		if(this[x].name==idx){
			 count++;
			 if(count==occurance){
			 	return this[x];		
			 }
		}
	}
};

//Simulates PHP's date function
//from http://jacwright.com/projects/javascript/date_format
Date.prototype.format = function(format) {	
	var returnStr = '';
	var replace = Date.replaceChars;
	for (var i = 0; i < format.length; i++) {
		var curChar = format.charAt(i);
		if (replace[curChar]) {
			returnStr += replace[curChar].call(this);
		} else {
			returnStr += curChar;
		}
	}
	return returnStr;
};
Date.replaceChars = {
	shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
	longMonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
	shortDays: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
	longDays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
	
	// Day
	d: function() { return (this.getDate() < 10 ? '0' : '') + this.getDate(); },
	D: function() { return Date.replaceChars.shortDays[this.getDay()]; },
	j: function() { return this.getDate(); },
	l: function() { return Date.replaceChars.longDays[this.getDay()]; },
	N: function() { return this.getDay() + 1; },
	S: function() { return (this.getDate() % 10 == 1 && this.getDate() != 11 ? 'st' : (this.getDate() % 10 == 2 && this.getDate() != 12 ? 'nd' : (this.getDate() % 10 == 3 && this.getDate() != 13 ? 'rd' : 'th'))); },
	w: function() { return this.getDay(); },
	z: function() { return "Not Yet Supported"; },
	// Week
	W: function() { return "Not Yet Supported"; },
	// Month
	F: function() { return Date.replaceChars.longMonths[this.getMonth()]; },
	m: function() { return (this.getMonth() < 9 ? '0' : '') + (this.getMonth() + 1); },
	M: function() { return Date.replaceChars.shortMonths[this.getMonth()]; },
	n: function() { return this.getMonth() + 1; },
	t: function() { return "Not Yet Supported"; },
	// Year
	L: function() { return (((this.getFullYear()%4==0)&&(this.getFullYear()%100 != 0)) || (this.getFullYear()%400==0)) ? '1' : '0'; },
	o: function() { return "Not Supported"; },
	Y: function() { return this.getFullYear(); },
	y: function() { return ('' + this.getFullYear()).substr(2); },
	// Time
	a: function() { return this.getHours() < 12 ? 'am' : 'pm'; },
	A: function() { return this.getHours() < 12 ? 'AM' : 'PM'; },
	B: function() { return "Not Yet Supported"; },
	g: function() { return this.getHours() % 12 || 12; },
	G: function() { return this.getHours(); },
	h: function() { return ((this.getHours() % 12 || 12) < 10 ? '0' : '') + (this.getHours() % 12 || 12); },
	H: function() { return (this.getHours() < 10 ? '0' : '') + this.getHours(); },
	i: function() { return (this.getMinutes() < 10 ? '0' : '') + this.getMinutes(); },
	s: function() { return (this.getSeconds() < 10 ? '0' : '') + this.getSeconds(); },
	// Timezone
	e: function() { return "Not Yet Supported"; },
	I: function() { return "Not Supported"; },
	O: function() { return (-this.getTimezoneOffset() < 0 ? '-' : '+') + (Math.abs(this.getTimezoneOffset() / 60) < 10 ? '0' : '') + (Math.abs(this.getTimezoneOffset() / 60)) + '00'; },
	P: function() { return (-this.getTimezoneOffset() < 0 ? '-' : '+') + (Math.abs(this.getTimezoneOffset() / 60) < 10 ? '0' : '') + (Math.abs(this.getTimezoneOffset() / 60)) + ':' + (Math.abs(this.getTimezoneOffset() % 60) < 10 ? '0' : '') + (Math.abs(this.getTimezoneOffset() % 60)); },
	T: function() { var m = this.getMonth(); this.setMonth(0); var result = this.toTimeString().replace(/^.+ \(?([^\)]+)\)?$/, '$1'); this.setMonth(m); return result;},
	Z: function() { return -this.getTimezoneOffset() * 60; },
	// Full Date/Time
	c: function() { return this.format("Y-m-d") + "T" + this.format("H:i:sP"); },
	r: function() { return this.toString(); },
	U: function() { return this.getTime() / 1000; }
};
