/*=====Helper Functions=====*/
/**
* !!!WARNING!!!
* Difference between in_array() function is that THIS function returns current position 
* of matched element and in_array() return only boolean value
*/
function inArray(what, where){
	var a = -1;
    for(var i=0; i<where.length; i++) {
        if(what == where[i]) {
            a=i;
            break;
        }
    }
   
    return a;
}


function explode( delimiter, string ) {    // Split a string by string
    // 
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: kenneth
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
 
    var emptyArray = { 0: '' };
 
    if ( arguments.length != 2
        || typeof arguments[0] == 'undefined'
        || typeof arguments[1] == 'undefined' )
    {
        return null;
    }
 
    if ( delimiter === ''
        || delimiter === false
        || delimiter === null )
    {
        return false;
    }
 
    if ( typeof delimiter == 'function'
        || typeof delimiter == 'object'
        || typeof string == 'function'
        || typeof string == 'object' )
    {
        return emptyArray;
    }
 
    if ( delimiter === true ) {
        delimiter = '1';
    }
 
    return string.toString().split ( delimiter.toString() );
}
/*=====End of Helper Functions=====*/
/**
* Delete it, if u'll be sure of its useless!
* @param deprecated ?
*
*/
function selectAllOptions(selStr)
{
  var selObj = document.getElementById(selStr);
  for (var i=0; i<selObj.options.length; i++) {
    selObj.options[i].selected = true;
  }
}



var constr_trades = [];//constr_trades data
var trades_checked = [];//checked checkboxes
var open_categories = [];
$(function(){
	
	
	
	/*
	 * Build user construction trades list
	 */
	$("input[name='project_type_list[]']").change(function(){
		var query = '';
		$("input[name='project_type_list[]']").each(
			function () {
				if($(this).attr('checked') == true){
					query = query + 'project_type_list['+$(this).val()+']=' + $(this).val() + '&';

				}
			}
		);

		var sub_category_id = $(this).val();
		buildProjectTypeList(sub_category_id, query);
		if(query.length > 0){
			$('#tree_container').show();
		}else{
			$('#tree_container').hide();
		}
		
	});
	

  /*
   * Build project construction trades list
   */	
  $("input[name='project_type']").change(function(){

	var tree = $("#tree").treeview();  
	var sub_category_id = $(this).val();
	
	// first we need to save all collapsable category ids
	saveOpenedCategories();
	
    $.post("/project/get_sub_categories_trades/" + sub_category_id,{ ajax: 'true'}, function(result){
    	var subCategory = '';    	
    	 if(result.data) {		
    		
    		$("#tree").html('');
    		
    		var total = result.data.total;
    		var i=1;
    		
	  		$.each(result.data, function(sub_id, sub) {  			
	  			// making right sub category class by exploding the string
  				var sub_class = explode('(',sub);
  				sub_class = explode(')',sub_class[sub_class.length-1]);
  				sub_class = sub_class[0].toLowerCase();
  				sub_class = sub_class.replace(' ','_');
	  			if(sub_id != 'total'){	  				
	  				if (i == total){	  					
	  					subCategory = $('<li class="clearfix sub_category_tree expandable lastExpandable '+sub_class+'" id="sub_category_id_'+ sub_id +'"><div class="hitarea expandable-hitarea lastExpandable-hitarea"/><span class="head_category">' + sub + '</span></li>').appendTo(tree);
	  				}else{
	  					subCategory = $('<li class="clearfix sub_category_tree expandable '+sub_class+'" id="sub_category_id_'+ sub_id +'"><div class="hitarea expandable-hitarea"/><span class="head_category">' + sub + '</span></li>').appendTo(tree);
	  				}	  				
	  				tree.treeview({add: subCategory});
	  			}
	  			i++;
		  	});
		  	
	  		if(typeof open_categories != 'undefined' && open_categories.length){
	  			restoreOpenedCategories(open_categories);
	  		}
	  		
	  		$("#tree div.hitarea, #tree span, #tree p").click(function(){
	  			var id = $(this).parent().attr('id');
	  			var sub_category_id = id.replace(/(.*)sub_category_id_([0-9]+)(.*)/gi, "$2");
	  			var ul_html = $(this).parent().children('ul').html();
	  			
	  			addTradeTree(sub_category_id, ul_html);
	  		});	  		
    	 };
    });


    
  }); 
  
});

function mark_trades_count(sub_category_id, open_categories){

	var trades_count = 0;
	$.each(trades_checked, function(i,trade){
		trade_category = explode('_',trade);
		trade_category = trade_category[trade_category.length-1];
		if(trade_category == sub_category_id){
			trades_count++;
		}
	});
	
	
	var count_text = '<span id="trades_count_'+sub_category_id+'" class="trades_count">; Trades Selected: <strong>'+trades_count+'</strong></span>';
	if(typeof $("span#trades_count_"+sub_category_id) != 'undefined' && $("span#trades_count_"+sub_category_id).length){
			$("span#trades_count_"+sub_category_id+ ' strong').text(trades_count);
	}else if(trades_count > 0){
		$("#sub_category_id_"+sub_category_id + " span").append(count_text);
	}
}

/*
 * Adds Construction trades to selected category
 */
function addTradeTree(sub_category_id, ul_html, do_open){
		var id = "sub_category_id_"+sub_category_id;
		post = true;
		var subCategoryTrade = '';
		
		
		if (constr_trades[id] == undefined){			
			$.ajax({				
				url:"/project/get_construction_trades/" + sub_category_id ,
				dataType: 'json',
				type:'post', 
				async: false, 
				success: function(result){		  					
  				if(result.data){
  					constr_trades[id] = result.data;
	  			}
				}
			});
		}
		var total = constr_trades[id].total;
		var i = 1;
		
		if (constr_trades[id] && ul_html == null ){
			subCategoryTrade += '<ul style="display:block;">';	  								
			$.each(constr_trades[id], function(trade_id, trade){  						
				if(trade_id != 'total'){
	  				if (i == total){
	  					subCategoryTrade += '<li class="trade last">';
	  				}else{
	  					subCategoryTrade += '<li class="trade">';	
	  				}
	  				//check if this checkbox is already checked
	  				var pos = inArray(trade_id+'_'+sub_category_id, trades_checked);
	  				
	  				if(pos != -1 && pos !== false){
	  					subCategoryTrade += '<input id="trade['+ sub_category_id +']['+ trade_id +']" class="trades_checkbox" type="checkbox" name="construction_trades['+ sub_category_id +'][]" checked value="'+ trade_id +'" /><label for="trade['+ sub_category_id +']['+ trade_id +']">'+ trade +'</label></li>';
	  				}else{
	  					subCategoryTrade += '<input id="trade['+ sub_category_id +']['+ trade_id +']" class="trades_checkbox" type="checkbox" name="construction_trades['+ sub_category_id +'][]" value="'+ trade_id +'" /><label for="trade['+ sub_category_id +']['+ trade_id +']">'+ trade +'</label></li>';
	  				}
				}
				i++;
			});
			subCategoryTrade += '</ul>';
			
			
			//changing li class to collapsable
			if($("#"+id).hasClass('lastExpandable')){
				$("#"+id).removeClass('lastExpandable').addClass('lastCollapsable');
			}
			$("#" +id).removeClass('expandable').addClass('collapsable');
			
			
			//changing li div class			
			if($('#'+id+' div').hasClass('lastExpandable-hitarea')){
				$('#'+id+' div').removeClass('lastExpandable-hitarea closed').addClass('lastCollapsable-hitarea');
			}
			$('#'+id+' div').removeClass('expandable-hitarea').addClass('collapsable-hitarea closed');
			
			
			$(subCategoryTrade).appendTo("#" + id);
			
			$("li.trade").unbind('click');			
			$(".trades_checkbox").unbind('click');
			
			// Bind events on checkboxes clicks
			$(".trades_checkbox").click(function(){
				var pid = $(this).attr('name');
				pid = pid.split('[');
				pid = pid[1].split(']');
				pid = pid[0];
				
				var name = $(this).val()+'_'+pid;
				
				var pos = inArray(name, trades_checked);
				
				if(pos != -1 && pos !== false){					
					if (trades_checked[0] != name){
						var temp = trades_checked[0]; 
						trades_checked[0] = name;
						trades_checked[pos] = temp;						
						trades_checked.shift(); 
					}else{ 
						trades_checked.shift();
					}
				}else{
					trades_checked.push(name);
				}
				
				// if this trade was added to checkboxes list, we need to show a helper text with count of total checkboxes selected
				var sub_catid = $(this).parents('.sub_category_tree').attr('id');
				sub_catid = explode('_',sub_catid);
				sub_catid = sub_catid[sub_catid.length-1];
				
				mark_trades_count(sub_catid);
			});	
		}
		
		if((typeof(do_open) != 'undefined' && do_open) || typeof(do_open) == 'undefined'){
			if($('#'+id+' div').hasClass('is_opened')){				
				$("li#"+id+ " ul").hide();

	  			$('#'+id+' div').removeClass('collapsable-hitarea').addClass('expandable-hitarea');
				
				if($("#"+id+" div").hasClass('lastCollapsable-hitarea')){
					$('#'+id+' div').removeClass('lastCollapsable-hitarea').addClass('lastExpandable-hitarea');
					$('#'+id).removeClass('lastCollapsable collapsable').addClass('lastExpandable expandable');
				}
				
				$('#'+id+' div').removeClass('is_opened');
			}else{
				if($("#"+id+" div").hasClass('lastExpandable-hitarea')){
					$('#'+id+' div').removeClass('lastExpandable-hitarea').addClass('lastCollapsable-hitarea');
					$('#'+id).removeClass('lastExpandable closed expandable').addClass('lastCollapsable collapsable');
				}	
				$("li#"+id+ " ul").show();
				$('#'+id+' div').removeClass('expandable-hitarea').addClass('collapsable-hitarea is_opened');
			}
		}
			// hide all other opened categories			
			$.each($("li#"+id).siblings(),function(i,sibling){
				if($(sibling).hasClass('collapsable') || $(sibling).hasClass('lastCollapsable')){					
					$(sibling).children('div').removeClass('is_opened');
					$(sibling).children('div').removeClass('collapsable').addClass('expandable');					
					$(sibling).children('div').removeClass('collapsable-hitarea').addClass('expandable-hitarea');
					$(sibling).children('ul').hide();
				}
			});
}	



/**
* Update city on zip code entered
*
*/
function updateCityState(zip_id, city_id, state_id){
	var url = "/project/get_city_by_zip/";

	zip_id = zip_id == undefined ? 'zip' : zip_id;
	city_id = city_id ==undefined ? 'city' : city_id;
	state_id = state_id ==undefined ? 'state' : state_id;

	if($('#'+city_id).val() == 0 || !$("#"+city_id).length){
		var zip_val = $('#'+zip_id).val();
		$.post(url, 'zip='+zip_val, function(data){			
			if(data.data.city_state){
				$('#'+city_id).val(data.data.city_state);
			}
			if(data.data.state){
				$('#'+state_id).val(data.data.state);
			}
			
		});
	}else{
		return false;
	}
}


/*
* Build contruction trade categories tree
*/
function buildProjectTypeList(sub_category_id, query){
	var tree = $("#tree").treeview();
	
	// first we need to save all collapsable category ids
	saveOpenedCategories();	
	
	$.ajax({				
		url:"/project/get_sub_categories_trades",
		dataType: 'json',
		type:'post',
		data: query,
		async: false,
		success: function(result){		  					
			
		 var subCategory = '';
    	 if(result.data) {
     		$("#tree").html('');

     		var total = result.data.total;
     		var i=1;
     		
 	  		$.each(result.data, function(sub_id, sub){
 	  			if(sub_id != 'total'){
 	  				// making right sub category class by exploding the string
 	  				var sub_class = explode('(',sub);
 	  				sub_class = explode(')',sub_class[sub_class.length-1]);
 	  				sub_class = sub_class[0].toLowerCase();
 	  				sub_class = sub_class.replace(' ','_');
 	  				
 	  				// Add 'check all' links to each of categories.
 	  				var check_all = '<div class="check_all"><input class="unchecked '+sub_id+'" id="check_all_'+sub_id+'" type="checkbox"/><label for="check_all_'+sub_id+'">Check All</label>';
 	  				if (i == total){
 	  					subCategory = $('<li class="clearfix sub_category_tree expandable lastExpandable '+sub_class+'" id="sub_category_id_'+ sub_id +'"><div class="hitarea expandable-hitarea lastExpandable-hitarea"/><span>' + sub + '</span>'+check_all+'</li>').appendTo(tree);
 	  				}else{
 	  					subCategory = $('<li class="clearfix sub_category_tree expandable '+sub_class+'" id="sub_category_id_'+ sub_id +'"><div class="hitarea expandable-hitarea"/><span>' + sub + '</span>'+check_all+'</li>').appendTo(tree);
 	  				}
 	  				
 	  				
 	  				tree.treeview({add: subCategory});
 	  			}
 	  			i++;
 		  	});
 		  	
 	  		
 	  		$("#tree div.hitarea, #tree span, #tree p, span.check_all a").click(function(){
	  			var id = $(this).parent().attr('id');
	  			var sub_category_id = id.replace(/(.*)sub_category_id_([0-9]+)(.*)/gi, "$2");
	  			var ul_html = $(this).parent().children('ul').html();
	  			
	  			addTradeTree(sub_category_id, ul_html);	  			
	  		});
	  		
	  		// Bind check_all button event
 	  		$("div.check_all input").click(function(){
 	  			
	  			var id = $(this).parent().parent().attr('id');
	  			var sub_category_id = id.replace(/(.*)sub_category_id_([0-9]+)(.*)/gi, "$2");
	  			var ul_html = $(this).parent().parent().children('ul').html();
	  			
	  			
	  			// Check or Uncheck all checkboxes
	  			var check = true;
	  			if($(this).hasClass('checked')){
	  				check = false;
	  				$(this).removeClass('checked').addClass('unchecked');
	  				$(this).siblings('label').text('Check All');
	  			}else if($(this).hasClass('unchecked')){
	  				$(this).removeClass('unchecked').addClass('checked');
	  				$(this).siblings('label').text('Uncheck All');
	  			}
	  			
	  			// Define, do we need to open
				var do_open = false;
				if(check && !$("#"+id+' div.hitarea').hasClass('is_opened')){
					do_open = true;
				}
	  			addTradeTree(sub_category_id, ul_html, do_open);
	  			
	  			// Call a function to (un)check all needed checkboxes
				check_all($(this).parent().siblings('ul'), check, sub_category_id);
	  		});

	  		
	  		if(typeof open_categories != 'undefined' && open_categories.length){	  		
	  			restoreOpenedCategories(open_categories);
	  		}
 	  		
    	 };	 
	}
	});
	
}

/**
*
* Checks all checkboxes and add them to 'trades_checked' Array
*
* @param object elem	Element where to start finding neede checkboxes
* @param boolean check	Check flag(true of false)
*/
function check_all(elem, check, sub_category_id){	
	// first we do is adding/removing needed trades to 'trades_checked' array in loop
	// this is required just for 'trades_checked' array to contain right entities(checkboxes)
	
	if(check){
		needed_expr = $(elem).find(':checkbox');
	}else{
		needed_expr = $(elem).find(':checkbox').filter(':checked');
	}
	
	$.each(needed_expr, function(i,el){
		var pid = $(el).attr('name');
		pid = pid.split('[');
		pid = pid[1].split(']');
		pid = pid[0];		
		
		var name = $(el).val()+'_'+pid;
		
		var pos = inArray(name, trades_checked);
		
		if(pos != -1 && pos !== false){
			if (trades_checked[0] != name){
				var temp = trades_checked[0]; 
				trades_checked[0] = name;
				trades_checked[pos] = temp;						
				trades_checked.shift(); 
			}else{ 
				trades_checked.shift();
			}
		}else{
			trades_checked.push(name);
		}
		
		// if this trade was added to checkboxes list, we need to show a helper text with count of total checkboxes selected
		if(typeof(sub_catid) == 'undefined'){
			var sub_catid = $(this).parents('.sub_category_tree').attr('id');
			sub_catid = explode('_',sub_catid);
			sub_catid = sub_catid[sub_catid.length-1];
		}
	});
	
	// Mark trades count
	mark_trades_count(sub_category_id);		
	// and finally - (un)check all needed checkboxes			
	$(elem).find(':checkbox').attr('checked', check);
	
}


/**
* Save collapsed categories
*/
function saveOpenedCategories(){
	if(typeof open_categories == 'undefined'){
		window.open_categories = new Array();
	}
	$.each($("#tree").children(),function(i,el){
		if($(el).hasClass('collapsable') || $(el).hasClass('lastCollapsable')){
			var cat_id = explode('_',$(el).attr('id'));
			cat_id = cat_id[cat_id.length-1];
			open_categories.push(cat_id);
		}
	});	
}

/**
* Restore collapsed(opened) categories after new category is fetched
*/
function restoreOpenedCategories(collapsed_cats){	
	if(collapsed_cats.length){
		$.each(collapsed_cats,function(i,sub_catid){
			mark_trades_count(sub_catid, true);
		});
	}
}
