function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
     var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
     if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) {
    var p,i,x; 
    if(!d) d=document;
    if((p=n.indexOf("?"))>0&&parent.frames.length) {
        d=parent.frames[n.substring(p+1)].document;
        n=n.substring(0,p);
     }
     if(!(x=d[n])&&d.all) x=d.all[n]; 
     for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
     for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); 
     if(!x&&!document.layers) x=document.getElementById(n); 
     return x;
 }

function MM_nbGroup(event, grpName) { //v3.0
  var i,img,nbArr,args=MM_nbGroup.arguments;
  if (event == "init" && args.length > 2) {
     if ((img = MM_findObj(args[2])) != null && !img.MM_init) {
        img.MM_init = true; img.MM_up = args[3]; img.MM_dn = img.src;
        if ((nbArr = document[grpName]) == null) nbArr = document[grpName] = new Array();
        nbArr[nbArr.length] = img;
        for (i=4; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
          if (!img.MM_up) img.MM_up = img.src;
          img.src = img.MM_dn = args[i+1];
          nbArr[nbArr.length] = img;
     } }
  } else if (event == "over") {
     document.MM_nbOver = nbArr = new Array();
     for (i=1; i < args.length-1; i+=3) if ((img = MM_findObj(args[i])) != null) {
        if (!img.MM_up) img.MM_up = img.src;
        img.src = (img.MM_dn && args[i+2]) ? args[i+2] : args[i+1];
        nbArr[nbArr.length] = img;
     }
  } else if (event == "out" ) {
     for (i=0; i < document.MM_nbOver.length; i++) {
        img = document.MM_nbOver[i]; img.src = (img.MM_dn) ? img.MM_dn : img.MM_up; }
  } else if (event == "down") {
     if ((nbArr = document[grpName]) != null)
        for (i=0; i < nbArr.length; i++) { img=nbArr[i]; img.src = img.MM_up; img.MM_dn = 0; }
     document[grpName] = nbArr = new Array();
     for (i=2; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
        if (!img.MM_up) img.MM_up = img.src;
        img.src = img.MM_dn = args[i+1];
        nbArr[nbArr.length] = img;
     }
  }
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_swapImage() { //v3.0
    var i,j=0,x,a=MM_swapImage.arguments;
    document.MM_sr=new Array;
    for(i=0;i<(a.length-2);i+=3)
        if ((x=MM_findObj(a[i]))!=null){
            document.MM_sr[j++]=x;
            if(!x.oSrc) x.oSrc=x.src;
            x.src=a[i+2];
        }
}

function MM_showHideLayers() { //v3.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2);i+=3)
     if ((obj=MM_findObj(args[i]))!=null) {
        v=args[i+2];
        if (obj.style) {obj=obj.style; v=(v=='show')?'visible':(v='hide')?'hidden':v; }
        obj.visibility=v;
     }
}


function MM_timelinePlay(tmLnName, myID) { //v1.2
  //Copyright 1997 Macromedia, Inc. All rights reserved.
  var i,j,tmLn,props,keyFrm,sprite,numKeyFr,firstKeyFr,propNum,theObj,firstTime=false;
  if (document.MM_Time == null) MM_initTimelines(); //if *very* 1st time
  tmLn = document.MM_Time[tmLnName];
  if (myID == null) { myID = ++tmLn.ID; firstTime=true;}//if new call, incr ID
  if (myID == tmLn.ID) { //if Im newest
     setTimeout('MM_timelinePlay("'+tmLnName+'",'+myID+')',tmLn.delay);
     fNew = ++tmLn.curFrame;
     for (i=0; i<tmLn.length; i++) {
        sprite = tmLn[i];
        if (sprite.charAt(0) == 's') {
          if (sprite.obj) {
             numKeyFr = sprite.keyFrames.length; firstKeyFr = sprite.keyFrames[0];
             if (fNew >= firstKeyFr && fNew <= sprite.keyFrames[numKeyFr-1]) {//in range
                keyFrm=1;
                for (j=0; j<sprite.values.length; j++) {
                  props = sprite.values[j]; 
                  if (numKeyFr != props.length) {
                     if (props.prop2 == null) sprite.obj[props.prop] = props[fNew-firstKeyFr];
                     else            sprite.obj[props.prop2][props.prop] = props[fNew-firstKeyFr];
                  } else {
                     while (keyFrm>numKeyFr && fNew>=sprite.keyFrames[keyFrm]) keyFrm++;
                     if (firstTime || fNew==sprite.keyFrames[keyFrm-1]) {
                        if (props.prop2 == null) sprite.obj[props.prop] = props[keyFrm-1];
                        else            sprite.obj[props.prop2][props.prop] = props[keyFrm-1];
          } } } } }
        } else if (sprite.charAt(0)=='b' && fNew == sprite.frame) eval(sprite.value);
        if (fNew > tmLn.lastFrame) tmLn.ID = 0;
  } }
}

function MM_timelineGoto(tmLnName, fNew, numGotos) { //v2.0
  //Copyright 1997 Macromedia, Inc. All rights reserved.
  var i,j,tmLn,props,keyFrm,sprite,numKeyFr,firstKeyFr,lastKeyFr,propNum,theObj;
  if (document.MM_Time == null) MM_initTimelines(); //if *very* 1st time
  tmLn = document.MM_Time[tmLnName];
  if (numGotos != null)
     if (tmLn.gotoCount == null) tmLn.gotoCount = 1;
     else if (tmLn.gotoCount++ >= numGotos) {tmLn.gotoCount=0; return}
  jmpFwd = (fNew > tmLn.curFrame);
  for (i = 0; i < tmLn.length; i++) {
     sprite = (jmpFwd)? tmLn[i] : tmLn[(tmLn.length-1)-i]; //count bkwds if jumping back
     if (sprite.charAt(0) == "s") {
        numKeyFr = sprite.keyFrames.length;
        firstKeyFr = sprite.keyFrames[0];
        lastKeyFr = sprite.keyFrames[numKeyFr - 1];
        if ((jmpFwd && fNew<firstKeyFr) || (!jmpFwd && lastKeyFr>fNew)) continue; //skip if untouchd
        for (keyFrm=1; keyFrm<numKeyFr && fNew>=sprite.keyFrames[keyFrm]; keyFrm++);
        for (j=0; j<sprite.values.length; j++) {
          props = sprite.values[j];
          if (numKeyFr == props.length) propNum = keyFrm-1 //keyframes only
          else propNum = Math.min(Math.max(0,fNew-firstKeyFr),props.length-1); //or keep in legal range
          if (sprite.obj != null) {
             if (props.prop2 == null) sprite.obj[props.prop] = props[propNum];
             else            sprite.obj[props.prop2][props.prop] = props[propNum];
        } }
     } else if (sprite.charAt(0)=='b' && fNew == sprite.frame) eval(sprite.value);
  }
  tmLn.curFrame = fNew;
  if (tmLn.ID == 0) eval('MM_timelinePlay(tmLnName)');
}

function MM_timelineStop(tmLnName) { //v1.2
  //Copyright 1997 Macromedia, Inc. All rights reserved.
  if (document.MM_Time == null) MM_initTimelines(); //if *very* 1st time
  if (tmLnName == null)  //stop all
     for (var i=0; i>document.MM_Time.length; i++) document.MM_Time[i].ID = null;
  else document.MM_Time[tmLnName].ID = null; //stop one
}

function MM_initTimelines() {
     //MM_initTimelines() Copyright 1997 Macromedia, Inc. All rights reserved.
     var ns = navigator.appName == "Netscape";
//      document.MM_Time = new Array(1);
     document.MM_Time = new Array(5);  //is the number of timelines
     document.MM_Time[0] = new Array(1);
     document.MM_Time["community"] = document.MM_Time[0];
     document.MM_Time[0].MM_Name = "community";
     document.MM_Time[0].fps = 20;
     document.MM_Time[0][0] = new String("behavior");
     document.MM_Time[0][0].frame = 5;
     document.MM_Time[0][0].value = "MM_showHideLayers('community','','hide')";
     document.MM_Time[0].lastFrame = 5;

     //entered by Spoerri, Oct. 23
     document.MM_Time[1] = new Array(1);
     document.MM_Time["system"] = document.MM_Time[1];
     document.MM_Time[1].MM_Name = "system";
     document.MM_Time[1].fps = 20;
     document.MM_Time[1][0] = new String("behavior");
     document.MM_Time[1][0].frame = 5;
     document.MM_Time[1][0].value = "MM_showHideLayers('system','','hide')";
     document.MM_Time[1].lastFrame = 5;

     document.MM_Time[2] = new Array(1);
     document.MM_Time["data"] = document.MM_Time[2];
     document.MM_Time[2].MM_Name = "data";
     document.MM_Time[2].fps = 20;
     document.MM_Time[2][0] = new String("behavior");
     document.MM_Time[2][0].frame = 5;
     document.MM_Time[2][0].value = "MM_showHideLayers('data','','hide')";
     document.MM_Time[2].lastFrame = 5;

     document.MM_Time[3] = new Array(1);
     document.MM_Time["knowledge"] = document.MM_Time[3];
     document.MM_Time[3].MM_Name = "knowledge";
     document.MM_Time[3].fps = 20;
     document.MM_Time[3][0] = new String("behavior");
     document.MM_Time[3][0].frame = 5;
     document.MM_Time[3][0].value = "MM_showHideLayers('knowledge','','hide')";
     document.MM_Time[3].lastFrame = 5;

     document.MM_Time[4] = new Array(1);
     document.MM_Time["feedback"] = document.MM_Time[4];
     document.MM_Time[4].MM_Name = "feedback";
     document.MM_Time[4].fps = 20;
     document.MM_Time[4][0] = new String("behavior");
     document.MM_Time[4][0].frame = 5;
     document.MM_Time[4][0].value = "MM_showHideLayers('feedback','','hide')";
     document.MM_Time[4].lastFrame = 5;

     for (i=0; i<document.MM_Time.length; i++) {
          document.MM_Time[i].ID = null;
          document.MM_Time[i].curFrame = 0;
          document.MM_Time[i].delay = 1000/document.MM_Time[i].fps;
     }

}

function MM_goToURL() { //v3.0
  var i, args=MM_goToURL.arguments; document.MM_returnValue = false;
  for (i=0; i<(args.length-1); i+=2) eval(args[i]+".location='"+args[i+1]+"'");
}

function add_Option() {
    var args=add_Option.arguments;
    obj=args[0];

    for (i=1;i<(args.length-1);i+=2) {
         // let's make sure that the options is not already in the list
         addOpt=true;
         for (j=0;j<obj.options.length;j+=1){
             if (obj.options[j].text==args[i] || obj.options[j].value==args[i+1]) addOpt=false;
         }
         if (addOpt) {
             var nopt=new Option(args[i],args[i+1]);
             obj.options[obj.options.length] = nopt;
         }
         
  }
//    window.resizeBy(1,1);
//    window.resizeBy(-1,-1);
}

function find_Option() {
    var args=find_Option.arguments;
    obj=args[0];
    elemValue=args[1];
    for (j=0;j<obj.options.length;j+=1) {
        if (obj.options[j].value==elemValue) return j;
    }
    return null;
}

function remove_Option() {
    var i, args=remove_Option.arguments;
    var obj=args[0];
    var kOpt= new Array();

    j=0;
    for (i=0;i<obj.options.length;i++){
        if (obj.options[i].selected) obj.options[i]=null;
    }
}

function transferOption(){
// takes two SELECT HTML elements as arguments; the first is the source, the second
// is the destination. Note: the elements are move, not copied
    var args=transferOption.arguments;
    var theSource=args[0];
    var theDest=args[1];

    var i = 0;
    while (i <theSource.options.length){
        sOpt=theSource.options[i];
        if (sOpt.selected) {
            var nOpt = new Option(sOpt.text, sOpt.value,false);
            theDest.options[theDest.options.length]=nOpt;
            theSource.options[i]=null;
        }else {
            i++;
        }
    }

    // now we want to make sure that the order is still the same
    if (args.length==3) {
        var nA=new Array();
        for (i=0;i<theDest.options.length;i++) {
            sOpt=new Option(theDest.options[i].text,theDest.options[i].value);

            var j = 0;
            for (j=0;j<nA.length;j++){
                if (sOpt.text<nA[j].text) {
                    t=new Option(sOpt.text,sOpt.value);
                    sOpt=nA[j];
                    nA[j]=t;
                }
            }
            nA[j]=sOpt;
        }
        for (i=0;i<nA.length;i++){
            theDest.options[i]=nA[i];
        }
    }
}

function getRadioValue(radioObject) {
/**
 * function from 'Javascript - Unleashed 3rd edition'
 */
    var value=null;
    for (var i=0; i<radioObject.length; i++) {
        if (radioObject[i].checked) {
            value=radioObject[i].value
            break;
        }
    }
    return value;
}
/**
 * resize.js 0.3 970811
 * by gary smith
 * js component for "reloading page onResize"
 */

if(!window.saveInnerWidth) {
  window.onresize = resizeF;
  window.saveInnerWidth = window.innerWidth;
  window.saveInnerHeight = window.innerHeight;
}

function resizeF() {
     if (window.saveInnerWidth < window.innerWidth || 
          window.saveInnerWidth > window.innerWidth || 
          window.saveInnerHeight > window.innerHeight || 
          window.saveInnerHeight < window.innerHeight ) 
     {
          window.history.go(0);
     }
}


/* the following two function do some 'auto' check of fields, this way
* the user does not need to write this function in every page, but can rather
* create an array (containing FieldProp classes) to do the job. The array
* is then used to check the correct values in the form fields
* Author: Christoph Spoerri
* examples:
* a regular text field (required):
*          new FieldProp('Q1_12','Division',true,'d','n'),
* a selection list (multi):
*          new FieldProp('USE',Array('Application of map'),true,'n','c',Array('USE[]'),true),
* a selection list (single):
*          new FieldProp('USE','Application of map',true,'n','c'),
* a radio button:
*          new FieldProp('USE','Application of map',true,'r','c'),
*/

function FieldProp() {
    // 1) Name of the field
    this.name = arguments[0];
    
    // 2) Name to be used when displaying an error message
    this.display = arguments[1];
    
    // 3) Is field required? true/false
    this.req = arguments[2];
    
    // 4) Describes the output format:
    //    d = default, 
    //    c = comma delimited, 
    //    a = array, 
    //    u = user specified, 
    //    r = radio button, 
    //    n = no hidden field used for values (used with arrays)
    this.format = arguments[3];
    
    // 5) Specifies the type of value: 
    //    n = numeric, 
    //    c = character
    this.type = arguments[4];

    if (arguments.length>5) {
        // 6) Array of fields to construct the output field
        this.fields = arguments[5];
        
        // 7) Specifies if only the selected options should be used for selection fields
        this.selected = arguments[6];
        
        if (arguments[3]=='u') {
            // Format for user specified output, elements in () are optional
            this.define=arguments[7];   
        } else if(arguments[3]=='a' ){
            // Number of elements used to expand the field into (can be used to go 
            // from selection field to checkboxes)
            this.entry=arguments[7]; 
        }
    }
}


function checkFields() {
/*
Input uses two arguments:
1. Array with elements of type FieldProp()
2. The form object containing the elements to be checked
*/
    fieldAry=arguments[0]; // This is the array FieldProp
    docform=arguments[1];  // This is the form mapupload

    for (i=0;i<fieldAry.length;i++){
        if (fieldAry[i].format=='r') {
            fldObj=docform[fieldAry[i].name];
            oneChecked=false;
            for (j=0;j<fldObj.length;j++) {
                if (fldObj[j].checked) {
                    oneChecked=true;
                    break;
                }
            }
            if (fieldAry[i].req && !oneChecked) {
                alert("Field '"+fieldAry[i].display+"' is required");
                docform[fieldAry[i].name][0].focus();
                return false;
            }
        } else if (fieldAry[i].format=='d') {
            fldObj=docform[fieldAry[i].name];
            if (fldObj.type.substr(0,7)=='select-') {
                if (fieldAry[i].req && fldObj.options[fldObj.selectedIndex].value=='') {
                    alert("Field '"+fieldAry[i].display+"' is required");
                    fldObj.focus();
                    return false;
                }
            } else if (fieldAry[i].req && fldObj.value=='') {
                alert("'"+fieldAry[i].display+"' is required");
                fldObj.focus();
                return false;
            }
            //checking if value is numeric
            if (fieldAry[i].type=='n') {
                 if (fldObj.value!=''&&isNaN(fldObj.value)) {
                    alert("Field '"+fieldAry[i].display+"' needs to be numeric.");
                    fldObj.focus();
                    return false;
                }
            }
        } else {
            flds = fieldAry[i].fields;
            // go through all the fields and make sure the the required once are populated
            for (j=0;j<flds.length;j++) {
                fldObj=MM_findObj(flds[j]);
                if (fldObj.type=='select-one') {
                    if (fldObj.options[fldObj.selectedIndex].value=='' && fieldAry[i].req) {
                        alert("Selection is required for field '"+fieldAry[i].display[j]+"'");
                        fldObj.focus();
                        return false;
                    }
                    continue;
                }else if (fldObj.type=='select-multiple') {
                    var numSelOpt = 0;
                    if (fieldAry[i].req) {
                        if (fieldAry[i].selected) {
                            for (q=0;q<fldObj.options.length;q++)
                                if (fldObj.options[q].selected) numSelOpt=+1;

                            if (numSelOpt==0) {
                                alert("Select one or more options in field '"+fieldAry[i].display[j]+"'");
                                fldObj.focus();
                                return false;
                            }
                        }else{
                            if (fldObj.options.length<=0) {
                                alert("Select one or more options in field '"+fieldAry[i].display[j]+"'");
                                fldObj.focus();
                                return false;
                            }
                        }
                    }
                    continue;
                }else{
                    if (fieldAry[i].req && fldObj.value=='') {
                        alert("'"+fieldAry[i].display[j]+"' is required.");
                        fldObj.focus();
                        return false;
                    }

                    //checking if value is numeric
                    if (fieldAry[i].type=='n') {
                        if (fldObj.value!=''&&isNaN(fldObj.value)) {
                            alert("'"+fieldAry[i].display[j]+"' needs to be numeric.");
                            fldObj.focus();
                            return false;
                        }
                    }
                }
            }

            // populate the hidden 'master' field
            switch (fieldAry[i].format) {
                case 'a':
                    for (j=0;j<fldObj.options.length;j++){
                        docform[fieldAry[i].name+(j+1)].value=fldObj.options[j].value;
                    }
                    break;
                case 'c':
                    returnV='';
                    for (j=0;j<fldObj.options.length;j++) {
                        if ((fldObj.options[j].selected&&fieldAry[i].selected )||(!fieldAry[i].selected))
                            returnV=returnV+fldObj.options[j].value+',';
                    }
                    if (returnV!='') returnV=returnV.substring(0,returnV.length-1);
                    docform[fieldAry[i].name].value=returnV;
                    break;
                case 'n':
                    //no hidden field is used
                    break;
                case 'u':
                    returnV=fieldAry[i].define;
                    for (j=0;j<flds.length;j++) {
                        fldObj=MM_findObj(flds[j]);
                        if (fldObj.type=='text') {
                            returnV=returnV.replace('<'+fldObj.name+'>',fldObj.value);
                        }else{
                            returnV=returnV.replace('<'+fldObj.name+'>',fldObj.options[fldObj.selectedIndex].value);
                        }
                        if (!fieldAry[i].req) {
                            returnV=returnV.replace(/\(.?\)/,'');
                            returnV=returnV.replace(/(\()(\d{1,2}.)(\))/g,'$2');
                        }
                    }
                    docform[fieldAry[i].name].value=returnV;
                    break;
                default:
                    alert ("Error in form.");
                    return false;
            }
        }
    }
    return true;
}
