  //Initialize Global Variable
  var col = 0;
  var parent = null;
  var items = new Array();
  var N = 0;
  
  
  /**
   * Dictionary Object Constructor
   */
  function DictionaryFormObject(formName) {
	this.formObject = document.forms[formName];
		if(!this.formObject)
		{
		  alert("BUG: Could not get form object ["+ formName+"]");
			return;
		} 
		
	this.disableDict = disableThisDictionary;
	this.preSelectDict = preSelectDictionary;
	this.initButtons =  initializeLicenseButtons;
	this.setLicenseType = setLicenseRadioButton;
  }
  
  /**
   * This function will replace all instances of findStr in oldStr with repStr.
   */
  function replaceAll(oldStr,findStr,repStr) {
	  var srchNdx = 0;  
	  var newStr = "";  
	  while (oldStr.indexOf(findStr,srchNdx) != -1)
	  {
	     newStr += oldStr.substring(srchNdx,oldStr.indexOf(findStr,srchNdx));
	     newStr += repStr;
	     srchNdx = (oldStr.indexOf(findStr,srchNdx) + findStr.length);
	  }
	  newStr += oldStr.substring(srchNdx,oldStr.length);

	  return newStr;
  }
  
  function get(i)
  {
    var node = items[i].getElementsByTagName("TD")[col];
	
    if(node.childNodes.length == 0) return "";
    var retval = node.firstChild.nodeValue;
	var pricingValue = node.innerHTML;
	
	if (navigator.appName=="Netscape"&&parseFloat(navigator.appVersion)>=4.7) {
		if(pricingValue.indexOf(">") != -1) { //This is to extract the Float from a string
			pricingValue = replaceAll(pricingValue, "\n", " ");
	    	retval = pricingValue.substring(pricingValue.indexOf(">")+1, pricingValue.length);
	    	retval = retval.substring(30);
	    	retval = replaceAll(retval, ",", "");
	    	return parseFloat(retval);
	    }
	} else {
		if(retval == null) { //This is to extract the Float value from a string
	    	var pricingValue = node.innerHTML;
	    	retval = pricingValue.substring(pricingValue.indexOf(">")+5, pricingValue.length);
	    	retval = replaceAll(retval, ",", "");
	    	return parseFloat(retval);
	    }
	}
	
    return retval;
  }
  	  
  function compare(val1, val2, desc)
  {
    return (desc) ? val1 > val2 : val1 < val2;
  }

  function exchange(i, j)
  {
    if(i == j+1) {
      parent.insertBefore(items[i], items[j]);
    } else if(j == i+1) {
      parent.insertBefore(items[j], items[i]);
    } else {
      var tmpNode = parent.replaceChild(items[i], items[j]);
      if(typeof(items[i]) == "undefined") {
        parent.appendChild(tmpNode);
      } else {
        parent.insertBefore(tmpNode, items[i]);
      }
    }
  }

  function quicksort(m, n, desc)
  {
  	var ifArrowChange = false;
  	
  	for(var i=m; i < n-1; i++) {
  		for(var j = i+1; j < n; j++) {
	  		if (desc) {
	  		 	if(get(i) > get(j)) {
	  		 		exchange(i,j);
	  		 		ifArrowChange = true;
	  		 	}
	  		} else {
	  			if(get(i) < get(j)) {
	  		 		exchange(i, j);
	  		 		ifArrowChange = true;
	  		 	}
	  		}
  		}
  	}
  	
  	return ifArrowChange;
  }

  /**
   * This will sort the data inside the table.
   *
   * tableid = the id/name of the table to be sorted.
   * n = the column number to be sorted.
   * ifFreeDict = flag if free dictionaries or not.
   * formName = the name of the form.
   * flagColumnName = flag if ascending or descending sort order.
   * arrowImageID = flag for the changing arrow image (either down/up).
   */
  function sortTable(tableid, n, ifFreeDict, formName, flagColumnName, arrowImageID)
  {
  	/**
     * Initialize dictionary form object
     */
	DictionaryFormObject(formName); 
	
 	if (!ifFreeDict)getSelectedDictionary(this.formObject);	
	 	
    parent = document.getElementById(tableid);
    col = n;

	    if(parent.nodeName != "TBODY") {
	      parent = parent.getElementsByTagName("TBODY")[0];
		}  
		
		if (parent == null) {
			return;			
		}
		if (parent.nodeName == null) {
			return;
		}
	    if(parent.nodeName != "TBODY") {
	      return false;  
		}  
	
    items = parent.getElementsByTagName("TR");
    N = items.length;

	var flagValue = this.formObject[flagColumnName].value;
	var ifChangeArrow = false;
		
	if (flagValue=="true") {
		ifChangeArrow = quicksort(0, N, true);
		this.formObject[flagColumnName].value="false";
	} else { 
		ifChangeArrow = quicksort(0, N, false);
		this.formObject[flagColumnName].value="true"; 
	}
	
	    var ascImagePath = "http://content.cleverlearn.com/dev/dev.war/dictionary/imgs/sortAsc.gif";
		var descImagePath = "http://content.cleverlearn.com/dev/dev.war/dictionary/imgs/sortDesc.gif";
		var arrowImageObj = document.getElementById(arrowImageID);
		
		if(ifChangeArrow) {
			if (arrowImageObj.src == ascImagePath) {
				arrowImageObj.src = descImagePath;
			} else {
				arrowImageObj.src = ascImagePath;
			}
		}
		
		if (!ifFreeDict) {
		   postSelectDictionaries();
		}
  }
  
  function getSelectedDictionary(formObject) {
  	  var arrayOfSelectedDicts = new Array();
  	  var arrayOfSelectedLicense = new Array();
	  if (this.formObject["dictionary"]) {
	  	  for (var d=0; d < this.formObject["dictionary"].length; d++) {
	  	  	  if (this.formObject["dictionary"][d].checked) {
	  	  	  	  arrayOfSelectedDicts.push(this.formObject["dictionary"][d].value);
	  	  	  	  if (this.formObject[this.formObject["dictionary"][d].value][0].checked) arrayOfSelectedLicense.push(0);  
	  	  	  	  else arrayOfSelectedLicense.push(1); 
	  	  	  }
		  }
	  }
	  setSelectedDictionaries(arrayOfSelectedDicts);
	  setSelectedLicenses(arrayOfSelectedLicense);
  }
  
  function postSelectDictionaries () {
  	  for (var s=0; s < getSelectedDictionaries().length; s++) {
  	  	  for (var d=0; d < this.formObject["dictionary"].length; d++) {
    	  	   var selectedDictValues = formObject["dictionary"][d].value;
  	  	       if (selectedDictValues == getSelectedDictionaries()[s]) {
		  	       this.formObject["dictionary"][d].checked = true;
	  	       	   this.formObject[selectedDictValues][getSelectedLicenses()[s]].checked=true;
		  	   }
		  }
	  }
  }
  
  function setSelectedDictionaries(arrayDictionaries) {
	  this.arrayDict = arrayDictionaries;
  }
  
  function getSelectedDictionaries() {
  	  return this.arrayDict;
  }
  
  function setSelectedLicenses(arrayOfLicenses) {
	  this.arrayLicenses = arrayOfLicenses;
  }
  
  function getSelectedLicenses() {
  	  return this.arrayLicenses;
  }
  
  function disableThisDictionary(dictID) {
	   for (var dictCounter=0; dictCounter < this.formObject["dictionary"].length; dictCounter++) {
	  	   var dictionaryValues = this.formObject["dictionary"][dictCounter].value;
  	       if (dictionaryValues == dictID) {
	  	       if(!this.formObject["dictionary"][dictCounter].disabled){ 
	  	       	   this.formObject["dictionary"][dictCounter].disabled = true;
	  	       }
	  	   }
	  }
  }

  /**
   *
   * This is to pre-select lifetime dictionaries coming from Clicktionary application
   */
  function preSelectDictionary(selectedDictID, ifLifetime) {
	 if(this.formObject["dictionary"]) {
	      for(var dictIndex = 0; dictIndex<this.formObject["dictionary"].length; dictIndex++) {
	         var dictionaryID = this.formObject["dictionary"][dictIndex].value;
			 if (selectedDictID) {
		         if(dictionaryID == selectedDictID) {
	         		this.formObject["dictionary"][dictIndex].checked = true;
					this.initButtons(ifLifetime);
	        		break;
		         } 
		     } else {
		     	 this.initButtons();
		     }
	      }
     } else {
     	 alert("BUG [pre-selecting lifetime dictionaries]: No dictionaries detected.");
     	 return;
     }
  }
  
  function initializeLicenseButtons(ifLifetime) {
		if(this.formObject["dictionary"]) {
			var licenseIndex = 0;
			var ifDisabled = false;
			
			for(var index=0; index<this.formObject["dictionary"].length; index++) {
				var selectedDictId = this.formObject["dictionary"][index].value;
			
				if (this.formObject["dictionary"][index].checked) {
					if (ifLifetime) { //select lifetime license
						licenseIndex = 1;
						ifDisabled = true;
						disableNextButton();
					} else { //select annual license
						licenseIndex = 0;
						ifDisabled = false;
					}
					this.formObject[selectedDictId][licenseIndex].checked = true;
					this.setLicenseType(selectedDictId, ifDisabled); 
				} else { this.setLicenseType(selectedDictId, true); }
			}
		} else {
			alert("BUG [Initializing license buttons]: No dictionaries detected.");
			return;
		}
  }
  
  function setLicenseRadioButton(selectedDictionary, ifDisabled) {
  	  for(var licenseIndex=0; licenseIndex<this.formObject[selectedDictionary].length; licenseIndex++)
		 this.formObject[selectedDictionary][licenseIndex].disabled = ifDisabled;
  }