var WStarCore = {};

// W3C DOM 2 Events model
if (document.addEventListener)
{
  WStarCore.addEventListener = function(target, type, listener)
  {
    target.addEventListener(type, listener, false);
  };

  WStarCore.removeEventListener = function(target, type, listener)
  {
    target.removeEventListener(type, listener, false);
  };

  WStarCore.preventDefault = function(event)
  {
    event.preventDefault();
  };

  WStarCore.stopPropagation = function(event)
  {
    event.stopPropagation();
  };
}
// Internet Explorer Events model
else if (document.attachEvent)
{
  WStarCore.addEventListener = function(target, type, listener)
  {
    // prevent adding the same listener twice, since DOM 2 Events ignores
    // duplicates like this
    if (WStarCore._findListener(target, type, listener) != -1) return;

    // listener2 calls listener as a method of target in one of two ways,
    // depending on what this version of IE supports, and passes it the global
    // event object as an argument
    var listener2 = function()
    {
      var event = window.event;

      if (Function.prototype.call)
      {
        listener.call(target, event);
      }
      else
      {
        target._currentListener = listener;
        target._currentListener(event)
        target._currentListener = null;
      }
    };

    // add listener2 using IE's attachEvent method
    target.attachEvent("on" + type, listener2);

    // create an object describing this listener so we can clean it up later
    var listenerRecord =
    {
      target: target,
      type: type,
      listener: listener,
      listener2: listener2
    };

    // get a reference to the window object containing target
    var targetDocument = target.document || target;
    var targetWindow = targetDocument.parentWindow;

    // create a unique ID for this listener
    var listenerId = "l" + WStarCore._listenerCounter++;

    // store a record of this listener in the window object
    if (!targetWindow._allListeners) targetWindow._allListeners = {};
    targetWindow._allListeners[listenerId] = listenerRecord;

    // store this listener's ID in target
    if (!target._listeners) target._listeners = [];
    target._listeners[target._listeners.length] = listenerId;

    // set up WStarCore._removeAllListeners to clean up all listeners on unload
    if (!targetWindow._unloadListenerAdded)
    {
      targetWindow._unloadListenerAdded = true;
      targetWindow.attachEvent("onunload", WStarCore._removeAllListeners);
    }
  };

  WStarCore.removeEventListener = function(target, type, listener)
  {
    // find out if the listener was actually added to target
    var listenerIndex = WStarCore._findListener(target, type, listener);
    if (listenerIndex == -1) return;

    // get a reference to the window object containing target
    var targetDocument = target.document || target;
    var targetWindow = targetDocument.parentWindow;

    // obtain the record of the listener from the window object
    var listenerId = target._listeners[listenerIndex];
    var listenerRecord = targetWindow._allListeners[listenerId];

    // remove the listener, and remove its ID from target
    target.detachEvent("on" + type, listenerRecord.listener2);
    target._listeners.splice(listenerIndex, 1);

    // remove the record of the listener from the window object
    delete targetWindow._allListeners[listenerId];
  };

  WStarCore.preventDefault = function(event)
  {
    event.returnValue = false;
  };

  WStarCore.stopPropagation = function(event)
  {
    event.cancelBubble = true;
  };

  WStarCore._findListener = function(target, type, listener)
  {
    // get the array of listener IDs added to target
    var listeners = target._listeners;
    if (!listeners) return -1;

    // get a reference to the window object containing target
    var targetDocument = target.document || target;
    var targetWindow = targetDocument.parentWindow;

    // searching backward (to speed up onunload processing), find the listener
    for (var i = listeners.length - 1; i >= 0; i--)
    {
      // get the listener's ID from target
      var listenerId = listeners[i];

      // get the record of the listener from the window object
      var listenerRecord = targetWindow._allListeners[listenerId];

      // compare type and listener with the retrieved record
      if (listenerRecord.type == type && listenerRecord.listener == listener)
      {
        return i;
      }
    }
    return -1;
  };
  WStarCore.findListener = function(target, type, listener)
  {
    // get the array of listener IDs added to target
    var listeners = target._listeners;
    if (!listeners) return -1;

    // get a reference to the window object containing target
    var targetDocument = target.document || target;
    var targetWindow = targetDocument.parentWindow;

    // searching backward (to speed up onunload processing), find the listener
    for (var i = listeners.length - 1; i >= 0; i--)
    {
      // get the listener's ID from target
      var listenerId = listeners[i];

      // get the record of the listener from the window object
      var listenerRecord = targetWindow._allListeners[listenerId];

      // compare type and listener with the retrieved record
      if (listenerRecord.type == type && listenerRecord.listener == listener)
      {
        return i;
      }
    }
    return -1;
  };
  WStarCore._removeAllListeners = function()
  {
    var targetWindow = this;

    for (id in targetWindow._allListeners)
    {
      var listenerRecord = targetWindow._allListeners[id];
      listenerRecord.target.detachEvent(
          "on" + listenerRecord.type, listenerRecord.listener2);
      delete targetWindow._allListeners[id];
    }
  };

  WStarCore._listenerCounter = 0;
}

WStarCore.addClass = function(target, theClass)
{
  if (!WStarCore.hasClass(target, theClass))
  {
    if (target.className == "")
    {
      target.className = theClass;
    }
    else
    {
      target.className += " " + theClass;
    }
  }
};

WStarCore.getElementsByClass = function(theClass)
{
  var elementArray = [];

  if (document.all)
  {
    elementArray = document.all;
  }
  else
  {
    elementArray = document.getElementsByTagName("*");
  }

  var matchedArray = [];
  var pattern = new RegExp("(^| )" + theClass + "( |$)");

  for (var i = 0; i < elementArray.length; i++)
  {
    if (pattern.test(elementArray[i].className))
    {
      matchedArray[matchedArray.length] = elementArray[i];
    }
  }

  return matchedArray;
};

WStarCore.hasClass = function(target, theClass)
{
  var pattern = new RegExp("(^| )" + theClass + "( |$)");

  if (pattern.test(target.className))
  {
    return true;
  }

  return false;
};

WStarCore.removeClass = function(target, theClass)
{
  var pattern = new RegExp("(^| )" + theClass + "( |$)");

  target.className = target.className.replace(pattern, "$1");
  target.className = target.className.replace(/ $/, "");
};

WStarCore.getElementsBySearch = function(theTag,theAttribute,theSearchText,boolExactMatch)
{
    if ( typeof( boolExactMatch ) == "string" && boolExactMatch.toLowerCase() == "true" ) boolExactMatch = true;
    if ( typeof( boolExactMatch ) == "string" && boolExactMatch.toLowerCase() == "false" ) boolExactMatch = false;
    if ( typeof( boolExactMatch ) != "boolean" ) boolExactMatch = true;
    
  theTag = (theTag) ? theTag : "*" ;
  var elementArray = [];

  if (document.getElementsByTagName)
  {
    elementArray = document.getElementsByTagName(theTag);
  }
  else if (document.all)
  {
    elementArray = document.all;
  }
  else
  {
    elementArray = document.getElementsByTagName(theTag);
  }

  var matchedArray = [];
  try
  {
    var pattern = new RegExp("(^| )" + theSearchText + "( |$)");

    for (var i = 0; i < elementArray.length; i++)
    {
        if ( boolExactMatch )
        {
            if( theAttribute.toLowerCase() == 'id')
            {
                if ( elementArray[i].id == theSearchText )  
                {
                    matchedArray[matchedArray.length] = elementArray[i];
                }
            }
            else
            {
                if ( eval ( " elementArray[i]."+theAttribute+" " ) == theSearchText )
                {
                    matchedArray[matchedArray.length] = elementArray[i];
                }
            }
        }
        else if( theAttribute.toLowerCase() == 'id')
        {
            if (elementArray[i].id.indexOf(theSearchText) > -1) 
            {
                matchedArray[matchedArray.length] = elementArray[i];
            }
        }
        else if( theAttribute.toLowerCase() == 'href')
        {
            if (elementArray[i].href.indexOf(theSearchText) > -1) 
            {
                matchedArray[matchedArray.length] = elementArray[i];
            }
        }
        else if ( " ! nobr h3 ".indexOf(" "+theTag.toLowerCase()+" ") > -1  && theAttribute.toLowerCase() == 'innerhtml' )
        {
            if (elementArray[i].innerHTML.indexOf(theSearchText) > -1) 
            {
                matchedArray[matchedArray.length] = elementArray[i];
            }   
        }
        else
        {
            if ( eval ( " pattern.test( elementArray[i]."+theAttribute+" ) " ) )
            {
                matchedArray[matchedArray.length] = elementArray[i];
            }
        }

    }
  }
  catch(e){}

  return matchedArray;
};
WStarCore.getParentElement = function (thisObject, ParentTagName, LevelDepth )
{
    try
    {
        LevelDepth = (LevelDepth == '' || !Number(LevelDepth)) ? 10 : LevelDepth ;
        var RecursiveNodes = '';
        var i = 0;
        do
        {
            RecursiveNodes += '.parentNode';
            if ( eval ( " thisObject"+RecursiveNodes+".tagName.toLowerCase(); " ) == ParentTagName.toLowerCase() )
            {
                return eval ( " thisObject"+RecursiveNodes+" " );
            }
            i++;
        }while (i<LevelDepth && eval ( " thisObject"+RecursiveNodes+".tagName.toLowerCase(); " ) != ParentTagName.toLowerCase() );
    }
    catch(e){}
};
WStarCore.getChildTagsArray = new Array();
WStarCore.getChildTags = function (thisObject, findTag )
{
	if ( thisObject.childNodes )
	{
		var iIndex = thisObject.childNodes.length;
		for ( var i = 0; i < iIndex; i++)
		{	
			var nextObject = thisObject.childNodes[i];
			
			if ( nextObject.nodeName.toLowerCase() == findTag.toLowerCase() )
			{
				WStarCore.getChildTagsArray[WStarCore.getChildTagsArray.length] = nextObject;
			}
			WStarCore.getChildTags(nextObject,findTag);
		}
	}
	return WStarCore.getChildTagsArray;
};
WStarCore.SelectedOption = function (id,sel)
{
    var re = new RegExp("^" + sel, "i"); // i -> ignoreCase
    var obj = document.getElementById(id);
    for(var i=0; i<obj.options.length; i++)
    {
        obj.options[i].selected=false;
        if(re.test(obj.options[i].text))
        {
            obj.options[i].selected=true;
        }
    }
};
WStarCore.RemoveOption = function (id,sel)
{
    var re = new RegExp("^" + sel, "i"); // i -> ignoreCase
    var obj = document.getElementById(id);
    for(var i=0; i<obj.options.length; i++)
    {
        if(re.test(obj.options[i].text))
        {
            obj.remove(i);
            break;
        }
    }
};
WStarCore.getComputedStyle = function(element, styleProperty)
{
  var computedStyle = null;

  if (typeof element.currentStyle != "undefined")
  {
    computedStyle = element.currentStyle;
  }
  else
  {
    computedStyle = document.defaultView.getComputedStyle(element, null);
  }

  return computedStyle[styleProperty];
};
/////////////////////////////////////////////////////////////////////////////////////
WStarCore.inStrReplace = function (str,replaceThis,withThis)
{
	/* /////////////////////////////////////////
	Developer : Chayne Walsh
	Date : 14th March 2007
	Copyright : none , please send any improvements to development@chayne.net
	Regexp replacing.
	var regExpProtocols = "(http://|mailto:|ftp://|https://)";
	url = this.inStrReplace(url,regExpProtocols,'');
	////////////////////////////////////////// */
	var replaceThis = new RegExp(replaceThis,"gi");
	str = str.replace(replaceThis,withThis);
	return str;
}

WStarCore.Trim = function(sString) 
{
	while (sString.substring(0,1) == ' ')
	{
		sString = sString.substring(1, sString.length);
	}
	while (sString.substring(sString.length-1, sString.length) == ' ')
	{
		sString = sString.substring(0,sString.length-1);
	}
	return sString;
}

WStarCore.createXHR = function() 
{
	var request;
	if (window.XMLHttpRequest)// Mozilla, Safari, ...
	{ 
		request = new XMLHttpRequest();
		if (request.overrideMimeType) { request.overrideMimeType('text/xml'); }
	}
	else if (window.ActiveXObject)// IE
	{ 
		try
		{
			request = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e)
		{
			try
			{
				request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e){}
		}
	}

	if (!request)
	{
		alert('Giving up :( Cannot create an XMLHTTP instance');
		return false;
	}
	
	return request;
}

WStarCore.getQueryString = function (q)
{
	/*/////////////////////////////////////////
	Developer : Original Unknown and Chayne Walsh
	Version Date : 2007-03-28-02
	Querystring extractor
	//////////////////////////////////////////*/
	var qs = location.search.substring(1);
	var nv = qs.split('&');
	var url = new Object();
	for(i = 0; i < nv.length; i++)
	{
		eq = nv[i].indexOf('=');
		url[nv[i].substring(0,eq)] = unescape(nv[i].substring(eq + 1));
	}
	return (url[q]) ? url[q] : '' ;
}

WStarCore.getEnv = function (op)
{
	/* //////////////////////////////////////////////////////////
	Developer: Chayne Walsh
	Copyright: None, use at your own risk
	Date Modified: 31 July 2007
	
	This function is intended to emulate the PHP getEnv function
	and provide a way to seamlessly use the scripts in a development 
	localhost and remove server environments.
	It has other added options like HTTP_ROOT and RELATIVE_ROOT.
	RELATIVE ROOT is an alternative to DOCUMENT ROOT as we do not 
	want to show anyone the DOCUMENT ROOT in our scripts.
	
	If you make any amazing addition and improvements to this function
	please send me a copy to development@chayne.net.
	////////////////////////////////////////////////////////////// */
	var r='';
	var strPathName = new String(window.location.pathname);
	splitPathName = strPathName.split("/");
	if( op == 'PAGE_NAME_FULL' )
	{
		var pageName = '';
		pageName = splitPathName[splitPathName.length -1].split('?');
		r = pageName[0];
	}
 	if(op == 'SCRIPT_NAME')
	{
		splitPathName.pop();
		r = splitPathName.join("/");
	}
	if(op == 'DOCUMENT_ROOT')
	{
		r = (window.location.hostname=='localhost') 
		? "c:/www/domains/lockforce.com.au/" // document root of your development server 
		: ''; // document root of your deployment server
	}
	if(op == 'HTTP_ROOT')
	{
		r = (window.location.hostname=='localhost') 
		? "http://"+window.location.hostname+'/'+splitPathName[1] + "/" //iis virtual
		: "http://"+window.location.hostname + "/" ;
	}
	
	if(op == 'RELATIVE_ROOT')
	{
		var r = '';
		var directoryDepth = (window.location.hostname=='localhost')
		? splitPathName.length - 3 
		: splitPathName.length -3;
		if(directoryDepth > 0)
		{
			r='';
			for(i = 0; i < directoryDepth; i++)
			{
				r += '../';
			}
		}
	}
	return r;
}

WStarCore.setGrayScale = function (bid,grayscale)
{
	try
	{
		bid = ( typeof bid == 'object' ) ? bid : document.getElementById(bid) ;
		if ( grayscale < 0 || grayscale > 1 ) grayscale = false;
		if (bid.filters)
		{
			if ( grayscale != false ) bid.style.filter='progid:DXImageTransform.Microsoft.BasicImage(grayscale=' + grayscale +')';
		}
	}
	catch (e) {/*do nothing*/};
}
WStarCore.setOpacity = function ( id, opacity )
{
	try
	{
		var doc = ( typeof id == 'object' ) ? id : document.getElementById(id);
		var object = ( typeof id == 'object' ) ? id.style : doc.style ;
		object.opacity = (opacity / 100); 
		object.MozOpacity = (opacity / 100); 
		object.KhtmlOpacity = (opacity / 100); 
		object.filter = "alpha(opacity=" + opacity + ")"; 
	}
	catch (e) { }
} 
WStarCore.opacityFlash = function (id, opacStart, opacEnd, millisec)
{
	try
	{
		var speed = Math.round(millisec / 100); 
		var timer = 0; 
		
		if(opacStart > opacEnd)
		{ 
			for(i = opacStart; i >= opacEnd; i--)
			{ 
				setTimeout("WStarCore.setOpacity('" + id + "'," + i + ")",(timer * speed)); 
				timer++; 
			} 
		}
		else if(opacStart < opacEnd)
		{ 
			for(i = opacStart; i <= opacEnd; i++) 
			{ 
				setTimeout("WStarCore.setOpacity('" + id + "'," + i + ")",(timer * speed)); 
				timer++; 
			} 
		} 
		
	}
	catch (e) {/*do nothing*/}
}

WStarCore.ResponseCookie = function (name,value,days) 
{
	'y-m-d HH:mm:ss'
	
	if (days) 
	{
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

WStarCore.RequestCookie = function (name) 
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) 
	{
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

WStarCore.DestroyCookie = function (name) 
{
	createCookie(name,"",-1);
}


WStarCore.Debug = true;
WStarCore.DebugMessages = function (DebugMessage)
{
	if ( WStarCore.Debug )
	{
		if ( !document.getElementById('JavaScriptDebuggingMessagesDisplay') )
		{
			var debugDiv = document.createElement('div');
			debugDiv.id = 'JavaScriptDebuggingMessagesDisplay';
			debugDiv.style.display = 'none';
			debugDiv.style.fontSize = '10px';
			debugDiv.style.width = '99.9%';
			debugDiv.style.verticalAlign = 'middle';
			debugDiv.innerHTML = '' +
				'<table cellspacing=0 cellpadding=0 border=0 style="margin:2px 0px 2px 0px;border:1px solid buttonface;padding:5px 15px 5px 15px;background-color:#ffffff;"> \n' +
				'        <tr> \n' +
				'            <td valign="top"> \n' +
				'                <img src="http://myhomeii/Icons/Bugs.png"/> \n' +
				'            </td> \n' +
				'            <td> \n' +
				'                 <h4 style="font-size:12pt;">JavaScript Debugging Information!</h4> \n' +
				'	            <p style="margin:12px 0px 0px 0px;"> \n' +
				'                    <ul id="JavaScriptDebuggingMessageList"> \n' +
				'                    </ul> \n' +
				'	            </p> \n' +
				'            </td> \n' +
				'        </tr> \n' +
				'    </table> \n';
			document.body.appendChild(debugDiv );
		}
		if ( document.getElementById('JavaScriptDebuggingMessagesDisplay') && DebugMessage != '' )
		{
			var debugBox = document.getElementById('JavaScriptDebuggingMessagesDisplay');
			var debugList = document.getElementById('JavaScriptDebuggingMessageList');
			var li = document.createElement('li');
			li.style.fontSize = '10pt';
			var text = document.createTextNode(DebugMessage);
			li.appendChild(text);
			debugList.appendChild(li);
			debugBox.style.display = '';
		}
	}
} 

WStarCore.Test = function()
{
    alert('Testing Works');
}
WStarCore.start = function(runnable)
{
  WStarCore.addEventListener(window, "load", runnable.init);
};

/* Repeat string n times */
String.prototype.repeat = function(n) 
{
	var ret = "";
	for (var i = 0; i < n; ++i) 
	{
		ret += this;
	}
	return ret;
};
String.prototype.RegExpSplit = function(exp)
{
/* Still in development - Not currently in use */
	if ( exp == null || exp == '' ) exp = /,/;
	var r = "";
	var exp = new RegExp(exp,"gi");
	r = this.split(exp);
	return r;
};

