var checklist = false;

$.defineTag = function( tag ) {
	$[tag.toUpperCase()] = function() {
		return $._createNode( tag, arguments );
	}
};

(function() {
	var tags = [
		'a', 'br', 'button', 'canvas', 'div', 'fieldset', 'form',
		'h1', 'h2', 'h3', 'hr', 'img', 'input', 'label', 'legend',
		'li', 'ol', 'optgroup', 'option', 'p', 'pre', 'select',
		'span', 'strong', 'table', 'tbody', 'td', 'textarea',
		'tfoot', 'th', 'thead', 'tr', 'tt', 'ul' ];
	for( var i = tags.length - 1;  i >= 0;  i-- ) {
		$.defineTag( tags[i] );
	}
})();

$.NBSP = '\u00a0';

$._createNode = function( tag, args ) {
	var fix = { 'class':'className', 'Class':'className' };
	var e;
	try {
		var attrs = args[0] || {};
		e = document.createElement( tag );
		for( var attr in attrs ) {
			var a = fix[attr] || attr;
			e[a] = attrs[attr];
		}
		for( var i = 1;  i < args.length;  i++ ) {
			var arg = args[i];
			if( arg == null ) continue;
			if( arg.constructor != Array ) append( arg );
			else for( var j = 0;  j < arg.length;  j++ )
				append( arg[j] );
		}
	}
	catch( ex ) {
		alert( 'Cannot create <' + tag + '> element:\n' +
			args.toSource() + '\n' + args );
		e = null;
	}
	
	function append( arg ) {
		if( arg == null ) return;
		var c = arg.constructor;
		switch( typeof arg ) {
			case 'number': arg = '' + arg;  // fall through
			case 'string': arg = document.createTextNode( arg );
		}
		e.appendChild( arg );
	}
	
	return e;
};

/** Node Handling ******************************************/

function Node(id, label) 
{
	this.id 		= id;
	this.label 		= label;
	this.children 	= [];
}

function deleteChildNodes(parent) 
{
	if(parent == undefined || parent == null) return;
	while (parent.firstChild) parent.removeChild (parent.firstChild);
}

function createElement(type, name, checked) 
{
	var element = null;
	try {
		element = document.createElement('<input type="'+type+'" name="'+name+'"'+(checked ? ' checked="checked"' : '')+'>');
	} catch (e) {}

	if(!element || element.nodeName != 'INPUT') {
		element 			= document.createElement('input');
		element.type 		= type;
		element.name 		= name;
		element.checked 	= checked;
	}
	return element;
}

function nodeChecklist(nodes, element_id, checked_id) 
{
	var element = document.getElementById(element_id);

	if (nodes.length > 0) {

		var ul = $.UL({id: element_id, className: 'checklist'});

		for (var i = 0; i < nodes.length; i++) {

			var label = document.createElement ('label');
			label.setAttribute ('for', element_id + '_' + nodes[i].id);

			var input = createElement ('checkbox', 'regionLevel4[]', false);
			input.id = element_id + '_' + nodes[i].id;
			input.value = nodes[i].id;
			input.checked = (checked_id && nodes[i].id == checked_id);

			label.appendChild (input);

			label.appendChild (
				document.createTextNode (' ' + nodes[i].label)
			);

			label.onmouseover = function() { this.className = 'hover' }
			label.onmouseout = function() { this.className = '' }

			ul.appendChild ($.LI( {}, label ));

		}

		element.parentNode.replaceChild (ul, element);

	} else {

		var p = $.P( {id: element_id}, 'Please select a region and district' );

		element.parentNode.replaceChild (p, element);

	}

	return true;
}

function nodeSelectBox(nodes, element_id, selected_id, all_text, disabled, exclude)
{
	var element = document.getElementById(element_id);

	if(element) {

		var select = document.getElementById(element_id);//$.SELECT({id: element_id, name: element_id});
		var child_nodes = [];

		select.appendChild ($.OPTION({
			text: all_text,
			innerText: all_text,
			value: '-2',
			selected: !selected_id
		}));

		for (var i = 0; i < nodes.length; i++) {

			if(exclude instanceof Array && exclude.length) {
				if(exclude.in_array(nodes[i].label)) {
					continue;
				}
			}
			var selected = (selected_id && nodes[i].id == selected_id);
			if (selected)
				child_nodes = nodes[i].children;
			select.appendChild ($.OPTION({
				text: nodes[i].label,
				innerText: nodes[i].label,
				value: nodes[i].id,
				selected: selected
			}));
		}
		/*if (disabled)
			select.disabled = true;*/
		element.parentNode.replaceChild (select, element);
		return child_nodes;
	}
	return false;
}

function changeRegion (formName, selLevel, prefix, selEleId, isSpan, spanSuffix, selId) {
    var childrenList = [];
    var default_reg_string = (formName != undefined && (formName == 'browseForm' || formName == 'advancedSearchForm' ) ) ? 'All Regions' : 'Please select your area';
    var default_suburb_string = (formName != undefined && (formName == 'browseForm' || formName == 'advancedSearchForm' ) ) ? 'All Suburbs' : 'Please select your suburb';

    var selOpt = document.forms[formName][document.getElementById(prefix+selEleId).name].options;
    var selIndex = document.forms[formName][document.getElementById(prefix+selEleId).name].selectedIndex;
    var selValue = (selIndex != null && selIndex != undefined && selIndex > 0) ? selOpt[selIndex].value : selId;
    if(selValue == '0') return;
    var level2Value = "";
    var level2Opt = document.forms[formName][document.getElementById(prefix+'regionLevel2').name].options;
    var level2Index = document.forms[formName][document.getElementById(prefix+'regionLevel2').name].selectedIndex;
    level2Value = level2Opt[level2Index].value;
    var targetEleId = (selLevel == 1) ? 'regionLevel3' : ((selLevel == 2) ? 'regionLevel4' : '');
    var defaultOption = (selLevel == 1) ? default_reg_string : ((selLevel == 2) ? default_suburb_string : '');
    document.forms[formName][document.getElementById(prefix+targetEleId).name].length = 0;
    for (var i = 0; i < region_detail.length; i++) {
      if (region_detail[i].id == level2Value){
        childrenList = region_detail[i].children;
        if(selLevel == 2){
          if(childrenList.length > 0){
            for (var j = 0; j < childrenList.length; j++) {
              if (childrenList[j].id == selValue) childrenList = childrenList[j].children;
            }
          }
        }
      }
    }
    if(childrenList.length>0){
      if(isSpan){
        document.getElementById(prefix+targetEleId+spanSuffix).style.display = '';
      }
      nodeSelectBox(childrenList, prefix+targetEleId, selId, defaultOption, !selValue, true);
    } else {
      document.getElementById(prefix+targetEleId).selectedIndex = 0;
      if(isSpan){
        document.getElementById(prefix+targetEleId+spanSuffix).style.display = 'none';
      }
    }

    if(selLevel == 1){
      if(document.forms[formName][document.getElementById(prefix+'regionLevel4').name] != undefined
              && document.forms[formName][document.getElementById(prefix+'regionLevel4').name] != null){
       document.forms[formName][document.getElementById(prefix+'regionLevel4').name].length = 0;
       if(isSpan){
         document.getElementById(prefix+'regionLevel4'+spanSuffix).style.display = 'none';
       }
     }
     if(prefix != 'search_'){
        if(window.hideAndMovePaperEdition){
          hideAndMovePaperEdition();
        }
     }
     if(window.changeRegionLevel3)
       changeRegionLevel3(formName, 0);
     if(window.changeRegionLevel4)
       changeRegionLevel4(formName, 0);
   }
   if(selLevel == 2 ){
      if(window.changeRegionLevel3)
        changeRegionLevel3(formName, selValue);
      if(window.changeRegionLevel4)
        changeRegionLevel4(formName, 0);
    }

}



/*
  From Regions... jsp  */

var region_items = new Array();

function initRegion(regionLevel2InitValue, regionlevel3InitValue, regionlevel4InitValue, prefix, formName) {
  // initialise level 3 & 4 to 1 blank option

  hideRegionElements(prefix);
  //load init value from the previous search
  var regionLevel2Init = regionLevel2InitValue;
  var regionLevel3Init = regionlevel3InitValue;
  var regionLevel4Init = regionlevel4InitValue;

  if (regionLevel2Init > 0 ) {
    var level1Obj = document.getElementById(prefix + 'regionLevel2');
    if(level1Obj != null && level1Obj != undefined){
      var count = 0;
      for (count==0; count < level1Obj.length; count++) {
         if( regionLevel2Init == level1Obj[count].value){
           document.forms[formName][prefix + 'regionLevel2'].selectedIndex = count;
           break;
         }
      }
    }
    changeRegion(formName, '1', prefix,'regionLevel2', 'true', '_span', regionLevel3Init > 0 ? regionLevel3Init : '' );
    if(prefix != 'search_'){
       if(window.hideAndMovePaperEdition){
          hideAndMovePaperEdition();
        }
     };
  } else {
     document.forms[formName][prefix + 'regionLevel2'].selectedIndex = 0;
  }

  if (regionLevel3Init > 0) {// && document.forms[formName][prefix + 'regionLevel3'].selectedIndex > 0) {
   changeRegion(formName, '2', prefix,'regionLevel3', 'true', '_span', regionLevel4Init > 0 ? regionLevel4Init : '');
   if(window.changeRegionLevel4)
     changeRegionLevel4(formName, regionLevel4Init);
  }

}


function findRegionDetailByValue(selectedValue) {
  var regionDetail = null;
  for (var i = 0; i < region_items.length; i++) {
    regionDetail = region_items[i];
    if (regionDetail['id'] == selectedValue) {
      return regionDetail;
    }
  }
  return null;
}

function hideRegionElements(prefix) {
  if (document.getElementById(prefix + "regionLevel3_span") != null) {
    document.getElementById(prefix + "regionLevel3_span").style.display = 'none';
  }
  if (document.getElementById(prefix + "regionLevel4_span") != null) {
    document.getElementById(prefix + "regionLevel4_span").style.display = 'none';
  }  
}

function findRegionNameByValue(selectedValue, selectedText) {
  var regionDetail = findRegionDetailByValue(selectedValue);
  var region_name = (regionDetail != null && regionDetail != undefined) ? regionDetail['desc'] : (selectedText != null || selectedText != '' ? selectedText : "Auckland (all suburbs)");
  if(regionDetail != null && regionDetail != undefined){
      if(regionDetail['level'] == '4' && regionDetail['parent_id'] != ''){
        region_name = findRegionDetailByValue(findRegionDetailByValue(regionDetail['parent_id'])['parent_id'])['desc']+" - "+findRegionDetailByValue(regionDetail['parent_id'])['desc']+" - "+region_name;
      } else if(regionDetail['level'] == '3' && regionDetail['parent_id'] != ''){
        region_name = findRegionDetailByValue(regionDetail['parent_id'])['desc']+" - "+region_name;
      }
  }
  return region_name != '' ? region_name : "Auckland (all suburbs)";
}

/* Cookie management for regions */
function setCookie(c_name,value,expiredays){
  var exdate=new Date();
  exdate.setDate(exdate.getDate()+expiredays);
  document.cookie=c_name+ "=" +escape(value)+
  ((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
}
function getCookie(c_name){
    //alert(c_name);
  if (document.cookie.length>0){
    c_start=document.cookie.indexOf(c_name + "=");
    if (c_start!=-1){
      c_start=c_start + c_name.length+1;
      c_end=document.cookie.indexOf(";",c_start);
      if (c_end==-1){
        c_end=document.cookie.length;
      }
       // alert(document.cookie);
      return unescape(document.cookie.substring(c_start,c_end));
    }
  }
  return "";
}

function setAdvSearchRegionsToCookie(regLvl1, regLvl2, regLvl3, regLvl4, cookieRegLvl1,cookieRegLvl2,cookieRegLvl3,
        cookieRegLvl4){
    //alert(regLvl1+"-"+regLvl2+"-"+regLvl3+"-"+regLvl4+"-"); 
  if(regLvl1 != undefined){
    setCookie(cookieRegLvl1, regLvl1, 1);
  }
  if(regLvl2 != undefined){
    setCookie(cookieRegLvl2, regLvl2, 1);
  }
  if(regLvl3 != undefined){
    setCookie(cookieRegLvl3, regLvl3, 1);
  }
  if(regLvl4 != undefined){
    setCookie(cookieRegLvl4, regLvl4, 1);      
  }

  
}


