var BrowserError = 'Error accessing page information, you might be using an incompatible browser...';
function ToggleElementSpecific(e_toggle, show) {
	if(!CheckElement(e_toggle, BrowserError)) return false;
	if(!CheckElement(e_toggle.style, BrowserError)) return false;
	e_toggle.style.display = show ? 'inline' : 'none';
	return true;
}

function ToggleElement(e_toggle) {
	if(!CheckElement(e_toggle, BrowserError)) return false;
	if(!CheckElement(e_toggle.style, BrowserError)) return false;

	show = (e_toggle.style.display == 'none') ? true : false;
	return ToggleElementSpecific(e_toggle, show);
}

function GetElement(psID) {
	if(document.all) {
		return document.all[psID];
	} else if(document.getElementById) {
		return document.getElementById(psID);
	} else {
	    for (iLayer = 1; iLayer < document.layers.length; iLayer++) {
		    if(document.layers[iLayer].id == psID)
			    return document.layers[iLayer];
		}      
	}

    return null;
} 
function GetSelectTextList(list) {
	if(!CheckElement(list, 'Error accessing list, unable to collect values...')) return '';

	res = '';
    for(i=0 ; i<list.options.length ; ++i) {
        res += list.options[i].text;
        if(i !=list.options.length-1)
            res += ',';
    }
	return res;			
}
function GetSelectTextListSeperator(list, separator) {
	if(!CheckElement(list, 'Error accessing list, unable to collect values...')) return '';

	res = '';
    for(i=0 ; i<list.options.length ; ++i) {
        res += list.options[i].text;
        if(i !=list.options.length-1)
            res += separator;
    }
	return res;			
}

function CheckElement(element, message) {
	if(element == null) {
		alert(message);
		return false;
	}
	return true;
}

function CreateSelectValueGroup(groupname, e_select) {
	lst = GetSelectValueList(e_select);	
	if(lst != '') {
		while(e_select.options.length>0) {
			e_select.remove(0);
		}
    	oOption = document.createElement("OPTION");
	    oOption.text = groupname;
		oOption.value = lst;
		e_select.options[0] = oOption;
		e_select.selectedIndex = 0;
		return true;
	} else {
		return false;
	}
}

function GetSelectValueList(list) {
    if(!CheckElement(list, 'Error accessing list, unable to collect values...')) return '';

	res = '';
	for(i=0 ; i<list.options.length ; ++i) {
		res += list.options[i].value;
		if(i !=list.options.length-1)
		    res += ',';
    }
    return res;
}

function GetSelectValueListSeparator(list, separator) {
    if(!CheckElement(list, 'Error accessing list, unable to collect values...')) return '';

	res = '';
	for(i=0 ; i<list.options.length ; ++i) {
		res += list.options[i].value;
		if(i !=list.options.length-1)
		    res += separator;
    }
    return res;
}

function AddTextToSelect(e_list, e_text) {
    if(!CheckElement(e_list, 'Error accessing list, try reloading the page...')) return false;
	if(!CheckElement(e_text, 'Error accessing text, try reloading the page...')) return false;
	curtext = e_text.value;
	if(curtext != '') {
		oOption = document.createElement("OPTION");
		oOption.text = curtext;
		e_text.value = '';
		idx = e_list.length;
		e_list.options[idx] = oOption;
		e_list.selectedIndex=idx;		
		return true;
	} else {
		alert('No text found to add');
		return false
	}
}

function MoveBetweenSelects(e_orig, e_dest) {
    if(!CheckElement(e_orig, 'Error accessing original list, try reloading the page...')) return false;
	if(!CheckElement(e_dest, 'Error accessing destination list, try reloading the page...')) return false;

	index = e_orig.options.selectedIndex;
	if(index==-1) {
		alert('Please select an item to move');
		return false
	} else {	
		oOption = document.createElement("OPTION");
		oOption.text = e_orig.options[index].text;
		oOption.value = e_orig.options[index].value;
		e_dest.options[e_dest.options.length] = oOption;
		e_orig.remove(index);
		return true;
	}
}

function mil(str) {
	  var t = str.split(':')
	  var hh = parseInt(t[0],10);
	  var mm = parseInt(t[1],10)
	  var ss = parseInt(t[2],10)
	  //hh += (str.toLowerCase().indexOf('pm')!=-1)?12:0;
	  var d = new Date(2007, 0, 1, hh, mm, ss); // just a date not around daylightsaving
	  return d.getTime();
	}

function AddTimeRange(e_date, e_starthour, e_startmin, e_endhour, e_endmin, e_ranges, rmv_btn, inpt_dataholder) {
	if(!CheckElement(e_date, 'Error accessing "date picker" element, try reloading the page...')) return false;
    if(!CheckElement(e_starthour, 'Error accessing "start hour" list, try reloading the page...')) return false;
	if(!CheckElement(e_startmin, 'Error accessing "start min" list, try reloading the page...')) return false;
	if(!CheckElement(e_endhour, 'Error accessing "end hour" list, try reloading the page...')) return false;
	if(!CheckElement(e_endmin, 'Error accessing "end min" list, try reloading the page...')) return false;
	if(!CheckElement(e_ranges, 'Error accessing "time ranges" list, try reloading the page...')) return false;
	if(!CheckElement(inpt_dataholder, 'Error accessing "input dataholder", try reloading the page...')) return false;

    var sep = ':';
    
    var date = e_date.value;
    
	var starthour = e_starthour.value;
	var startmin = e_startmin.value;
	var endhour = e_endhour.value;
	var endmin = e_endmin.value;
	var start = starthour+sep+startmin;
	var end = endhour+sep+endmin;
	
	var range = trim(date) + '=' + trim(start) + '-' + trim(end);
	
	var start_date = buildDateObject(date, start);
	var end_date = buildDateObject(date, end);
	var now = new Date();
	
	if (now > start_date) 
	{
		alert('The chosen date is in the past');
		return false;
	}
	
	else if (start_date > end_date) 
	{
		alert('Please use an end time greater than start time');
		return false;
	}
	
	else if (starthour+sep+startmin == endhour+sep+endmin)
	{
		alert('The start and end times are the same!');
		return false;
	}
	
	if (isOverlapping(inpt_dataholder.value, date, start, end))
	{
		return false;
	}
	
	if (inSelect(e_ranges, range))
	{
		return true;
	}
	else
	{
		 var length = (e_ranges.options ? e_ranges.options.length : 0);
		 var option = new Option(range, length);
		 e_ranges.options[length] = option;
		 
		 //sort here
		sortSelect(e_ranges, true);
		inpt_dataholder.value = '';
	    inpt_dataholder.value = glueSelectValues(e_ranges);
		 
	 	if (length > -1)
		{
			//rmv_btn.style.display = '';
	 		rmv_btn.disabled = null;
		}
		 	
		
	}
	   
	return true;
}

//expects values in a form of yyyy-mm-dd and hh:mm
function buildDateObject(date, time)
{
	var date_array = date.split('-');
	var year = date_array[0];
    var month = date_array[1] - 1;
    var day = date_array[2];
    
    var time_arr = time.split(":");
	var starthour = trim(time_arr[0]);
	var startmin = trim(time_arr[1]);
    
    return new Date(year,month,day, starthour, startmin);
}

function glueSelectValues(e_ranges)
{
	var data_holder = '';
	
	for (var i=0; i < e_ranges.options.length; i++) 
	{
		data_holder += e_ranges.options[i].text + "[^]";
    }
	
	return data_holder;
}

// sort function - ascending (case-insensitive)
function sortFuncAsc(record1, record2) {
    var value1 = record1.optText.toLowerCase();
    var value2 = record2.optText.toLowerCase();
    if (value1 > value2) return(1);
    if (value1 < value2) return(-1);
    return(0);
}

// sort function - descending (case-insensitive)
function sortFuncDesc(record1, record2) {
    var value1 = record1.optText.toLowerCase();
    var value2 = record2.optText.toLowerCase();
    if (value1 > value2) return(-1);
    if (value1 < value2) return(1);
    return(0);
}

function sortSelect(selectToSort, ascendingOrder) {
    if (arguments.length == 1) ascendingOrder = true;    // default to ascending sort

    // copy options into an array
    var myOptions = [];
    for (var loop=0; loop<selectToSort.options.length; loop++) {
        myOptions[loop] = { optText:selectToSort.options[loop].text, optValue:selectToSort.options[loop].value };
    }

    // sort array
    if (ascendingOrder) {
        myOptions.sort(sortFuncAsc);
    } else {
        myOptions.sort(sortFuncDesc);
    }

    // copy sorted options from array back to select box
    selectToSort.options.length = 0;
    for (var loop=0; loop<myOptions.length; loop++) {
        var optObj = document.createElement('option');
        optObj.text = myOptions[loop].optText;
        optObj.value = myOptions[loop].optValue;
        selectToSort.options.add(optObj);
    }
}

function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function isOverlapping(all_currentranges, new_date, new_start, new_end)
{
	var all_currentranges_arr = all_currentranges.split("[^]");
	
	for (var i = 0; i < all_currentranges_arr.length; i++) 
	{
		if (all_currentranges_arr[i] != '')
		{
			//dd-MM-yyyy @ hh:mm - hh:mm
			var current_daterange_arr = all_currentranges_arr[i].split("=");
			
			//dd-MM-yyyy
			var curr_date = trim(current_daterange_arr[0]);
			
			//hh:mm - hh:mm
			var curr_time_range = trim(current_daterange_arr[1]);
			
			var curr_time_range = curr_time_range.split("-");
			
			//hh:mm
			var curr_time_start = trim(curr_time_range[0]);
			
			//hh:mm
			var curr_time_end = trim(curr_time_range[1]);
			
			//get currentd ate as a string
			var current_date = new Date().toDateString();
			
			//construct date objects from the current range
			var current_start_date = buildDateObject(curr_date, curr_time_start);
			var current_end_date = buildDateObject(curr_date, curr_time_end);
			
			//construct date objects from the new range
			var new_start_date = buildDateObject(new_date, new_start);
			var new_end_date = buildDateObject(new_date, new_end);
			
			//convert dates to milliseconds to make comparison simpler
			var current_start_milli = current_start_date.getTime(); 
			var current_end_milli = current_end_date.getTime();
			var new_start_milli = new_start_date.getTime(); 
			var new_end_milli = new_end_date.getTime();
			
			var msg = '';
			
			if ((new_start_milli <= current_start_milli) && (current_start_milli < new_end_milli)
					&& (new_end_milli <= current_end_milli || new_end_milli >= current_end_milli))
			{
				//alert('new_start_date: ' + new_start_date + ' < current_start_date: ' + current_start_date);
				msg = 'Overlapping times are not allowed - Please check the entered "start" or "end" time!';
				alert(msg);
				return true;
			}
			
			else if ((current_start_milli <= new_start_milli) && (new_start_milli < current_end_milli)
					&& (current_end_milli <= new_end_milli || current_end_milli >= new_end_milli))
			{
				//alert('new_start_date: ' + new_start_date + ' < current_start_date: ' + current_start_date);
				msg = 'Overlapping times are not allowed - Please check the entered "start" or "end" time!';
				alert(msg);
				return true;
			}
		}
	}
	
	return false;
}

/**
 * Checks if the new time range exists already in the time range array
 * 
 * @param select
 * @param given_value
 * @return
 */
function inSelect(select, given_value)
{
	for (var i=0; i < select.options.length; i++) 
	{
    	if (select.options[i].text == given_value) 
    	{
    		return true;
    	}
    }
	return false;
}


function RemoveSelectedTimeRange(e_ranges, rmv_btn, inpt_dataholder) {
	if(!CheckElement(e_ranges, 'Error accessing item range list, try reloading the page...')) return false;

	var selIndex = e_ranges.selectedIndex;
	  if (selIndex != -1) {
	    for(i=e_ranges.length-1; i>=0; i--)
	    {
	      if(e_ranges.options[i].selected)
	      {   	  
	    	  e_ranges.options[i] = null;
	    	  inpt_dataholder.value = glueSelectValues(e_ranges);
	      }
	    }
	    if (e_ranges.length > 0) {
	    	e_ranges.selectedIndex = selIndex == 0 ? 0 : selIndex - 1;
	    }
	  }
	var length = (e_ranges.options ? e_ranges.options.length : 0);
	if (length == 0)
	{
		//rmv_btn.style.display = 'none';
		rmv_btn.disabled = 'true';
	}
	
	return true;
	
}

function UpdateHiddenElement(e_hidden,e_list,separator)
{
    if(!CheckElement(e_hidden, 'Error accessing hidden element, try reloading the page...')) return false;
    if(!CheckElement(e_list, 'Error accessing list, try reloading the page...')) return false;
    var values = GetSelectValueListSeparator(e_list, separator);
    e_hidden.value = values;    
}

function RemoveFromSelect(e_select) {
    if(!CheckElement(e_select, 'Error accessing list, try reloading the page...')) return false;
	index = e_select.options.selectedIndex;
	if(index==-1) {
		alert('Please select an item to move');
		return false
	} else {
		e_select.remove(index);
		return true;
	}
}


function InsertHandler(obj, eventname, handlercode) {
	if(!CheckElement(obj, BrowserError)) return false;
	if(eventname == 'onclick') {	
		obj.onclick = InjectCode(obj.onclick, handlercode);			
	} else if(eventname == 'onchange') {
	    obj.onclick = InjectCode(obj.onclick, handlercode);
	} else 
		return false;
	return true;
}

//Currently not parsing function parameters
function InjectCode(functioncode, newcode) {
	body = 'alert("InjectCode Failed")';
	if(functioncode != null) {
		fcstr = functioncode.toString();
		idx = fcstr.indexOf('{');
		if(idx == -1) {
			alert('InjectCode: No handler code found');
			return functioncode;
		}
		body = newcode + ' ' + fcstr.substring(idx+1, fcstr.lastIndexOf('}'));
	} else
		body = newcode;
	newfunc=new Function("event", body);	
	return newfunc;
}

function RemoveTextFromSelect(e_list, e_text) {
    if(!CheckElement(e_list, 'Error accessing list, try reloading the page...')) return false;
	if(!CheckElement(e_text, 'Error accessing text, try reloading the page...')) return false;
	
	index = e_list.options.selectedIndex;
	if(index==-1) {
		alert('Please select an item to remove');
		return false
	} else {
		// put element contents in textbox
		e_text.value = e_list.options[index].text;
		// remove element
		e_list.options[index] = null;
		if(index < e_list.length)
			e_list.selectedIndex = index;
		return true;
   }
}



function TextSearchEvent(key, e_text, e_select) {
    if(!CheckElement(e_select, 'Error accessing list, try reloading the page...')) return false;
	if(!CheckElement(e_text, 'Error accessing text, try reloading the page...')) return false;
	switch(key) {
		case 13:
			break;
		case 37: // LEFT
		case 38: // UP - Search previous
			SelectFindPrev(e_select, e_text.value)
			break;
		case 39: // RIGHT
		case 40: // DOWN - Search next
			SelectFindNext(e_select, e_text.value)
			break;
		default:
			SelectFindFirst(e_select, e_text.value)
	}    
}

function SelectFindNext(e_select, text) {
	start = (e_select.selectedIndex==-1) ? 0 : e_select.selectedIndex + 1;
	end = e_select.options.length;
	inc = 1;
	return SelectFind(start, end, inc, e_select, text);
}

function SelectFindFirst(e_select, text) {
	start = 0;
	end = e_select.options.length;
	inc = 1;
	return SelectFind(start, end, inc, e_select, text);
}

function SelectFindPrev(e_select, text) {
	end = 0;
	start = (e_select.selectedIndex==-1) ? e_select.options.length-1 : e_select.selectedIndex-1;
	inc = -1;
	return SelectFind(start, end, inc, e_select, text);	
}
function SelectFind(start, end, inc, e_select, text) {
	var str = text.replace('^\\s*','');
	if(str == '') 
		return;
	var j = 0;
	pattern1 = new RegExp(str,"i");

	pos = start;
	while(pos != end) {		
		if(pattern1.test(e_select.options[pos].text)) {
			e_select.selectedIndex = pos;
			break;
		}
		pos += inc;
	}

}

//SPECIFIC TO SERVICE COST PARAMETER
function addservicecost(basename,e_select)
{
	var s_e_select = document.getElementById(basename + '_service_select');
	var service	   = s_e_select.options[s_e_select.selectedIndex].value;
	var s_name	   = s_e_select.options[s_e_select.selectedIndex].text;
	var mo_input   = document.getElementById(basename + '_service_mo');
	var mo_rev     = mo_input.value;
	var mt_b_input = document.getElementById(basename + '_service_mt_b');
	var mt_b_rev   = mt_b_input.value;
	
	var mt_nb_input = document.getElementById(basename + '_service_mt_nb');
	var mt_nb_rev   = mt_nb_input.value;
	
	var p_input    = document.getElementById(basename + '_service_platform');
	var p_fee      = p_input.value;
	var op_input   = document.getElementById(basename + '_service_opcost');
	var op_cost    = op_input.value;
	
	var value_str  = 'serviceid=' + service + '[^]morevenue=' + mo_rev + '[^]mtrevenueb=' + mt_b_rev + '[^]mtrevenuenb=' + mt_nb_rev + '[^]platformfee=' + p_fee + '[^]' + 'opcost=' + op_cost;
	var text_str   = '[Service:' + s_name + '][MO:' + mo_rev + '][MTB:' + mt_b_rev + '][MTNB:' + mt_nb_rev + '][Platform:' + p_fee + '][OpCost:' + op_cost + ']';
	e_select.options[e_select.length] = new Option(text_str,value_str);
}

function addServiceCostToTable(basename)
{
	var cells=new Array();
	var s_e_select = document.getElementById(basename + '_service_select');
	var service	   = s_e_select.options[s_e_select.selectedIndex].value;
	var s_name	   = s_e_select.options[s_e_select.selectedIndex].text;
	cells[0]	   = s_name;
	var mo_input   = document.getElementById(basename + '_service_mo');
	var mo_rev     = mo_input.value;
	cells[1]	   = mo_rev;
	var mt_b_input = document.getElementById(basename + '_service_mt_b');
	var mt_b_rev   = mt_b_input.value;
	cells[2]	   = mt_b_rev;
	var mt_nb_input = document.getElementById(basename + '_service_mt_nb');
	var mt_nb_rev   = mt_nb_input.value;
	cells[3]	   = mt_nb_rev;
	var p_input    = document.getElementById(basename + '_service_platform');
	var p_fee      = p_input.value;
	cells[4]	   = p_fee;
	var op_input   = document.getElementById(basename + '_service_opcost');
	var op_cost    = op_input.value;
	cells[5]	   = op_cost;
	if (checkDuplicate(basename,service))
	{
		var tbl = document.getElementById(basename + '_servicecost_table');
		var lastRow = tbl.rows.length;
		var row = tbl.insertRow(-1);
		
		for(var i=0; i < cells.length; i++)
		{
			var cell = row.insertCell(i);
			if (i == 0)
			{
				cell.id = service;
			}
			else
			{
				cell.align = 'right';
			}
			var textNode = document.createTextNode(cells[i]);
			cell.appendChild(textNode);
		}
		var cell = row.insertCell(cells.length);
		var value_str  		= 'serviceid=' + service + '[^]morevenue=' + mo_rev + '[^]mtrevenueb=' + mt_b_rev + '[^]mtrevenuenb=' + mt_nb_rev + '[^]platformfee=' + p_fee + '[^]' + 'opcost=' + op_cost;
		cell.innerHTML   	= '<a href="#" onClick="removeRow(\'' + basename + '\', this);"><img src="image/delete.gif" border="0"/></a><input type="hidden" name="' + basename + '_cell" value="' + value_str + '" />';
		updateHiddenValue(basename,'|--|');
	}
}

function checkDuplicate(basename,serviceid)
{
	var tbl = document.getElementById(basename + '_servicecost_table');
	for (var i=1; i<tbl.tBodies[0].rows.length; i++) 
	{
		var sid = tbl.tBodies[0].rows[i].cells[0].id;
		if (serviceid == sid)
		{
			alert("The service [" + tbl.tBodies[0].rows[i].cells[0].textContent + "] has already been added");
			return false;
		}
	}
	return true;
}

function updateHiddenValue(basename,seperator)
{
	var valueEl = document.getElementById(basename);
	var cellEls = document.getElementsByName(basename + "_cell");
	var actVal  = '';
	for (var i=0; i < cellEls.length; i++)
	{
		var val = cellEls[i].value;
		if (actVal == '')
		{
			actVal = val;
		}
		else
		{
			actVal = actVal + seperator + val;
		}		
	}
	valueEl.value  = actVal;
}

function removeRow(basename,obj)
{
	var delRow = obj.parentNode.parentNode;
	var tbl = delRow.parentNode.parentNode;
	var rIndex = delRow.sectionRowIndex;
	tbl.deleteRow(rIndex);
	updateHiddenValue(basename,'|--|');
}



function onlyNumbers(evt,obj) 
{
	var e = evt
	if(window.event)
	{ // IE
		var charCode = e.keyCode;
	} 
	else if (e.which) 
	{ // Safari 4, Firefox 3.0.4
		var charCode = e.which
	}
	if ((charCode > 31 && (charCode < 45 || charCode > 57)) || charCode == 47)
	{
		return false;
	}
	
	return true;
}

