Core Javascript 1

download Core Javascript 1

of 17

Transcript of Core Javascript 1

  • 7/25/2019 Core Javascript 1

    1/17

    eSignal Formula Script EFS) Tutorial Series

    I N T R O D U C T O R Y T U T O R I A L 2

    Commonly Used Core JavaScript

    Summary: The following items in this tutorial will cover the main aspects of Core JavaScript thatare most commonly used in EFS formula development. This tutorial does not cover all aspectsof Core JavaScript because there are many topics that are rarely or never used in EFS formuladevelopment. The intent of this tutorial is to give the new user a solid start to understandingJavaScript specifically for developing EFS formulas.

    Topic List:

    1. Description of JavaScript2. Variables3. JavaScript Syntax4. Most commonly used Statements5. Most commonly used Operators6. Function Parameters7. Core JavaScript Resources

    1

  • 7/25/2019 Core Javascript 1

    2/17

    2.1 Description of JavaScript

    JavaScript is a lightweight, object-oriented programming language invented by Netscape,which was initially used for their Internet browser. JavaScript is not a stand-alonelanguage for developing software. Its designed to be embedded into applications such asweb browsers and eSignal to give control over certain elements of the host application to

    the end user. In the case of eSignal, this element is the formula studies feature of theAdvanced Chart.

    2.2 Variables

    2.2.1 The Keyword: varThe varkeyword is used to initialize, or declare, variables in JavaScript. Variables are

    simply user-defined containers for storing values. You will see many examples of varused in the examples throughout this tutorial.

    An important characteristic of JavaScript that often lead to coding errors for beginners isthat the language is a soft-typed, or untyped, programming language. What this means isthat you are not required to declare a variable with a specific data type. You are alsoallowed to use, or recycle, the same variable to store different data types throughout yourcode as needed. Also, the var keyword is not required to declare variables. Its not arecommended practice, but you can simply type a new variable name and assign a valueto it anywhere in your code.

    2.2.2 Variable ScopeThere are two types of scope, global and local. What determines the scope of a variableis the location in the formula where the variable is declared. The area of a formula that isoutside any user-defined functions is called the global scope. The area inside a user-defined function is called the local scope. The difference between the two is the life of thevariable. Variables declared in the global scope will exist for the life of the formula. Useglobal variables when you need to store a value between executions of your formula oryou want other user-defined functions to use the variable. Variables declared inside auser-defined function, such as main(), will only exist for that single execution of thefunction where the variable was declared.

    As we mentioned in the previous section, using the var keyword to declare your variablesis optional. Its highly recommended that you always use the var keyword to declarevariables. It becomes helpful when reading through your code during thedevelopment/debugging process. More importantly, if you create all your variables asglobals, your formula will require more resources, which makes the formula less efficient.Using local variables whenever possible is one way to help keep your formulas runningefficiently.

    - 2 -

  • 7/25/2019 Core Javascript 1

    3/17

    2.3 JavaScript Syntax

    2.3.1 Case Sensitivity

    JavaScript is a case sensitive language. We touched on this topic in the previous tutorialwhen we discussed the capitalization of the preMain()and main()user-defined functions.However, case sensitivity applies to everything youll code in JavaScript, not just functionnames. Always keep in mind that the capitalization of function names, variable names,etc. must be coded with consistency throughout your formula. The lack of attention to thisissue leads to one of the common pitfalls for new users. For example, lets say wevecreated a variable, nNumberand set it equal to 10. Then,later in the formula, we add 2 tonnumber (note the lower casen), followed by an if()statement

    checking for the value ofnNumber to see if it is equal to12. Figure 1 is a code example(CaseSensitivity.efs)illustratingthis problem. Because wemistyped the variable name online 8, our nNumber variablenever gets changed to the valueof 12. Therefore the conditionalstatement on line 10 neverevaluates to true. The end result

    is that the code on line 11 willnever be executed. The solutionof course is to change nnumberto nNumber.

    You might be wondering why the formula doesnt generate an error on line 8. Remember,the varkeyword used to declare variables is optional in JavaScript. JavaScript is aflexible language when it comes to variable declaration. Essentially, what happens on line8 is that the EFS engine creates a new variable, nnumber, with an initial value of 12. Ourformula example really has two variables at this point. There isnt any facility in the EFSengine that will catch and alert you of this of type of error. It cant make any decisions foryou and assume you meant to use nNumber. All the EFS engine sees is that you areusing two variables. Its up to you to catch this type of mistake, which is referred to as alogic error. This is where formula debugging will become an important part of your toolset. We wont go into this now, but there will be an entire tutorial dedicated to debuggingformulas later in the series.

    2.3.2 The Semicolon ;

    3

    http://share.esignal.com/download.jsp?groupid=84&folder=Tutorial%20Formulas&file=CaseSensitivity.efshttp://share.esignal.com/download.jsp?groupid=84&folder=Tutorial%20Formulas&file=CaseSensitivity.efshttp://share.esignal.com/download.jsp?groupid=84&folder=Tutorial%20Formulas&file=CaseSensitivity.efshttp://share.esignal.com/download.jsp?groupid=84&folder=Tutorial%20Formulas&file=CaseSensitivity.efs
  • 7/25/2019 Core Javascript 1

    4/17

  • 7/25/2019 Core Javascript 1

    5/17

    your code and check it line by line to find the proper location for the missing brace. Its agood idea to save your work often and perform syntax checks as you go.

    2.3.4 Commented Code //and /* */The EFS engine ignores commented code. You may want to include some notes foryourself or others that may be reading your code to help explain or remind yourself whatvarious parts of the code is supposed to do. Many programmers include a section ofcomments at the top of the formula for descriptions of the study, version numbers, contactinfo etc. Another common use for commented code is to temporarily disable a line or linesof code during the development process. This is a quick way to save some of yourprevious work just in case you want to go back to a previous method you were usingwithout having to retype the code.

    There are two ways to comment code. Youcan comment a single line of code with twoforward slashes, //. Or you can commentan entire block of code by placing a forwardslash followed by an asterisk, /*, at the frontof code block and another asterisk followedby a forward slash at the end of the codeblock, */ (see Figure 4). These multi-linecomment symbols do not have to be on aseparate line. They can be on the sameline in front of some code or at the end of a

    line.

    The multi-line comment symbols can also be used to comment a section of code thats inthe middle of a line of code (see Figure 5). Using our previous code example fornNumber, the result ofnNumber would nowequal 20. ThenNumber = 12;statement is now

    5

  • 7/25/2019 Core Javascript 1

    6/17

    ignored. nNumber was initialized with a value of 10. Therefore, nNumber is now onlymultiplied by 2.

    2.3.5 Identifiers

    Identifiers are nothing more than the names you use for your formula variables and any

    user-defined elements. The general rule to follow when designing your namingconventions for identifiers is to never start them with a number. Doing so will generate asyntax error indicating that there is a missing variable name. Using special characters atthe beginning of an identifier will also generate errors, except for underscores (_) anddollars signs ($). The following are examples of valid identifiers.

    _myPrice cntr1 nNumberVar

    $myVariableName cntr2 sStringVar

    I cntr3 bBooleanVar

    As you read through other users formula code you may notice that many programmersuse a naming convention where the first letter is lower case and the second is capitalized.The first character typically indicates the intended data type for the variable where nindicates a Number, s for String and b for Boolean. This is not a requirement but ithelps you and those reading your code understand what the code was intended toperform.

    2.3.6 Reserved Words

    In JavaScript, there is a list of words reserved for specific purposes that you cannot use inyour naming conventions for your identifiers. These words are used as part of the coreJavaScript language itself and will generate syntax errors if you try to use them asidentifiers. This following list is referred to as the Reserved Words.

    6

  • 7/25/2019 Core Javascript 1

    7/17

    AbstractargumentsArraybooleanBooleanbreakbytecasecatch

    charclassconstcontinueDatedebuggerdecodeURIdecodeURIComponentdefault

    deletedodouble

    elseencodeURI

    enumErrorescapeexportextendsevalEvalErrorfalsefinal

    finallyfloatforfunctionFunctiongotoifimplementsimportinInfinityinstanceofintinterface

    isFiniteisNaNlongMathNaNnativenewnullNumber

    ObjectpackageparseFloatparseIntprivateprotectedpublicrangeErrorReferenceErrorRegExprturnshortstaticString

    super

    switchsynchronizedSyntaxErrorthisthrowthrowstransienttrue

    trytypeofTypeErrorundefinedunescapeURIErrorvarvoidvolatilewhilewith

    2.3.7 Data Types

    At the heart of any programming language, there are certain data types the language isallowed to manipulate to produce some end result. In JavaScript, there are three basicdata types, Numbers, Strings and Boolean values.

    Numbersare self-explanatory. The important thing to know about numbers in JavaScriptis that they are all treated as floating-point values.

    Stringsare a series of characters made up of letters, digits or special charactersenclosed by single or double quotes ( or ). In EFS, strings are most commonly used fordrawing text labels on the chart or printing debugging information to the Formula OutputWindow. The following are examples of valid strings.

    buy at market

    123

    7

  • 7/25/2019 Core Javascript 1

    8/17

    There are many core JavaScript functions used for manipulating strings. However, theyarent heavily used for EFS development so well cover these methods later in theAdvanced tutorial series. For now, the important functionality of Strings that you shouldbe aware of is the ability to concatenate them to make larger strings. To concatenate, or

    join, strings together we use the + symbol in the same way we would add two numberstogether. In figure 6, for example, the result of sStringon line 15 creates the string, Buy100 IBM at Market! when printed to the formula output window. Notice also that you can

    incorporate numbers into string concatenations. The numbers may be a constant, suchas the 100 used in this example, or variables that store a number data type.

    Booleandata types only have two values, trueand false. These values are constants,which are also represented as 1 or 0, 1 being true. Boolean variables in EFSdevelopment are commonly used to keep track of events or conditions to control theexecution of specific code blocks within the formula. This type of Boolean variable is alsocommonly referred to as a flag.

    One example using a flag can be found in our EFS Library under Help Examples,AlertOncePerBar.efs. In figure 7, the Boolean flag, vFlag, is used to prevent an alert fromsignaling more than once per bar. The formula uses some made-up data for the sake ofdemonstration, but you could easily modify the conditional statement on line 14 to detect aparticular event to suite yourneeds. What happens withthis code is an audible alertwill sound on the first trade ofeach bar in real time. If youwant to see the formula inaction, apply it to a chart with

    a 1-minute interval. Thetrade that triggers the alerthappens to be the first tradeof the bar because that is theonly instance where vFlag isequal to (==) false and (&& )vData1 is greater than (>)vData2. The first time theconditional statement on line14 evaluates to true, vFlag

    8

    http://kb.esignalcentral.com/article.asp?article=1436&p=4http://kb.esignalcentral.com/article.asp?article=1436&p=4http://kb.esignalcentral.com/article.asp?article=1436&p=4
  • 7/25/2019 Core Javascript 1

    9/17

    subsequently get set to true indicating that the alert has occurred for the current bar. Sofor every trade after that during the 1-minute interval, the portion of the conditionalstatement, vFlag == false, evaluates to false, which prevents the code block from lines 15-17 from executing. Once the bar state of NEWBAR is detected again, vFlag is then resetto false, which allows the condition on line 14 to evaluate to true again and so on.

    2.4 Most Commonly Used Statements

    Statements are a group of Core JavaScript keywords that are used to perform specificbehaviors or actions. Statements are the essential elements used that inevitablydetermine the logic for a set of code. Each statement has a unique syntax that must befollowed. For beginning EFS development, the following statements, if(), else, functionand returnare the most commonly used.

    2.4.1 The if )Statement

    The if()statement is used to evaluate astatement or condition and then executes ablock of code if that condition evaluates to true.If the condition evaluates to false, the codeinside the if() statement block will be ignored.In figure 8, the if() statement is checking to seeif the value of the bTestvariable is equal to aBoolean true. The bTest variable is initializedas true, therefore the if() statement evaluatesto true. As a result, the code on line 10 will beexecuted every time main() is called by the

    Advanced Chart.

    2.4.2 The elseStatementThe elsestatement is used in conjunctionwith the if()statement. When an if()statement evaluates to false and it has anelse statement present, the code blockwithin the else statement will be executed.In figure 9, weve added an else statementfor the if() statement on line 9. BecausebTestwas initialized as true, the else block

    will never be executed. Try changing theinitialization value for bTest on line 5 to falseand reload the formula. You will see stringsof goodbye printed in the formula outputwindow instead of hello.

    The elsestatement can also be immediately followed by another if()statement. This isreferred to as an else if()statement. This allows you to test collection of conditions in aspecific order and only execute the first one that is found to be true. Figure 10 illustrates asimple example where a variable, sSymbol, is set to a specific value. In main, the tree of

    9

  • 7/25/2019 Core Javascript 1

    10/17

    if() and else if() statements check to see if that variable is equal to a particular symbol.Since sSymbol is initialized with the value of IDC, the first two if() statements evaluate tofalse. The third if() statement evaluates to true and prints Symbol is Interactive DataCorp. to the formula output window.

    2.4.3 The functionStatementThe functionstatement is used to create custom functions, or user-defined functionswithin your formula code. main()and preMain()are both examples of a user-definedfunction. Functions are useful for organizing your code and also help you write moreefficient code. If, for example, you have a routine that you need to execute multiple times,you can eliminate writing repetitive lines of code within main to perform the routine byplacing the routine in its own function outside of main. This allow you to call that functionfrom within main to execute that routine as many times as you need. Figure 11 uses theprevious code example from Figure 10, which moves the routine that checks for the valueof sSymbol into a user-defined function named, CheckSymbol().

    10

  • 7/25/2019 Core Javascript 1

    11/17

  • 7/25/2019 Core Javascript 1

    12/17

    data before executing a routine. If a function does not have its required set of valid datafor the routine, there is no need to allow the function to continue to execute. This not onlyhelps improve the efficiency of your code, but also may prevent the calculation oferroneous data due to the lack of valid components that a function may require. Figure 13illustrates a basic example of this process. The code on line 8 is referred to as a nullcheck. This is a good programming practiceto use because its a good way to validate that

    an expected return value exists before you tryto manipulate that data later in your code. Inthis example, we did not return the nRetvariable from our calcNumber()function bymistake. The result is that the if() statementon line 8 will evaluate to true and execute thereturn statement. Try adding some codeafter the return statement, such as adebugPrintln(hello) statement. You will seethat it does not execute. To correct theformula, add the nRet variable back to the

    return statement in the calcNumber() function.

    There is one very important exception to the returnstatement behavior that is specific tothe EFS environment and not part of the core JavaScript. The return statement in main()will always be the last line of code to be executed in an EFS formula. Therefore, theeSignal application has been designed to receive this returned data, which allows theAdvanced Chart to display the results. There will be many examples of this return usedthroughout the tutorial series as it is the primary purpose of EFS formula development. Inour example in Figure 13, the result of nNumber gets plotted in the Advanced Chart as anon-price study (or indicator), which displays a horizontal line at 4.

    2.5 Most Commonly Used Operators

    In simple terms, operators are just special characters or words used for many purposes,such as concatenating strings, performing math, or checking for equality or inequality toname a few. This topic could be significantly large, so for the purposes of this tutorial wewill only cover the operators that you will use most often for EFS formula development.For a complete list of operators, visitChapter 5 Operatorsin the Core JavaScript 1.5Reference of the EFS KnowledgeBase.

    2.5.1 Arithmetic OperatorsArithmetic operators are used to compute math operations. Math operators applied tovariables that are strings will convert the string to a number and then perform the math.The result will return a number. However, the Addition operator is an exception to thisrule. The (+) symbol is also used for string concatenation, so if at least one element of theequation is a string, the (+) operator will perform string concatenation. You shouldnt runinto this issue in EFS formula development very often. As long as you ensure that thedata types of your variables intended for math operations are always numbers youll avoidany problems here.

    12

    http://kb.esignalcentral.com/article.asp?article=1774&p=4http://kb.esignalcentral.com/article.asp?article=1774&p=4http://kb.esignalcentral.com/article.asp?article=1774&p=4
  • 7/25/2019 Core Javascript 1

    13/17

    + Additionvar nNum = 1 + 1 nNum is 2var nNum = 1 + 1 nNum is 11var nNum = 1 + 1 nNum is 11var nNum = "1" + ("1" - 2) nNum is 1-1

    - Subtractionvar nNum = 1 - 1 nNum is 0var nNum = 1 - 1 nNum is 0var nNum = 1 - 1 nNum is 0

    * Multiplicationvar nNum = 2 * 2 nNum is 4var nNum = 2 * 2 nNum is 4var nNum = 2 * 2 nNum is 4

    / Divisionvar nNum = 4 / 2 nNum is 2var nNum = 4 / 2 nNum is 2

    var nNum = 4 / 2 nNum is 2

    2.5.2 Equality OperatorsThere are two Equality Operators that you will use in almost every formula you write, theEquality operator (==) and the Inequality Operator (!=). These two operators simplyperform a comparison between two values and returns a Boolean (true or false) result.You will most often use these in conjunction with the if() statement.

    == Equalityif (5 == 5) Evaluates to true.if (5 == 5) Evaluates to true.if (5 == 0) Evaluates to false.if (true == true) Evaluates to false.

    != Inequalityif (5 != 5) Evaluates to false.if (5 != 5) Evaluates to false.if (5 != 0) Evaluates to true.if (true != true) Evaluates to true.

    2.5.3 Comparison OperatorsThere are four Comparison Operators that are frequently used in EFS formuladevelopment. These are the operators that allow you to compare two values to check ifone is Less than (), Less than or equal (=) to the other.

  • 7/25/2019 Core Javascript 1

    14/17

    > Greater Thanif (5 > 5) Evaluates to false.if (5 > 5) Evaluates to false.if (5 > 0) Evaluates to true.

    = 5) Evaluates to false.

    Make note also that the Comparison Operators can be used with Strings as well. Thedifference is that the comparison is based on alphabetical order. However, this is rarelyused in EFS formula development.

    2.5.4 String OperatorsThe primary String Operator that is used in EFS formula development is theConcatenation Operator (+). Youve seen some examples of this already, but heres a fewmore. Note that you can also include numbers and Boolean values within theconcatenation. This comes in handy when debugging formulas with the debugPrintln()function.

    + Concatenationbuy + + here Evaluates to buy heresell + 100 + at Market Evaluates to sell 100 at Market

    2.5.5 Logical OperatorsThere are three Logical Operators, AND (&& ), OR (||), and NOT (!). These operators areprimarily used within if() statements when incorporating conditions or rules into yourformulas. They allow you design more complex combinations of comparisons within anif() statement. The NOT operator is less utilized, so lets look at some examples of theAND and OR operators first.

    && Logical ANDif (5 > 4 && 10 < 20) Evaluates to true.If (5 < 4 && 10 < 20) Evaluates to false.

    If (5 < 4 && 10 > 20) Evaluates to false.|| Logical OR

    if (5 > 4 || 10 < 20) Evaluates to true.If (5 < 4 || 10 < 20) Evaluates to true.If (5 < 4 || 10 > 20) Evaluates to false.

    When using these two logical operators, the expressions on either side converts to aBoolean value. With the AND operator, both sides must evaluate to true in order for theif() statement to evaluate to true. With the OR operator, only one side has to evaluate to

    14

  • 7/25/2019 Core Javascript 1

    15/17

    true. You can incorporate multiple logical operators into a single if() statement.Depending on what you need to do, you may need to organize the expressions intogroups by enclosing them inside a set of parentheses like in the following example.

    if (5 > 4 && (10 < 20 || 10 < 5) ) Evaluates to true.

    The Logical NOT operator simply inverts the value of a Boolean expression. For example,

    if an expression evaluates to true and you then place the logical NOT operator in front ofthat expression, it will evaluate to false.

    ! Logical NOTif (5 > 4) Evaluates to true.If !(5 > 4) Evaluates to false.

    2.5.6 Assignment OperatorsAssignment operators are simply used to assign values to variables. The most commonlyused assignment operator is the =(equals) operator. This operator expects a variable

    name on the left side and the value to be assigned to it on the right side.

    = Equalsvar nNum = 5;The variable nNum is assigned to the value of 5.

    There are also some assignment operators that perform arithmetic and assignment at thesame time. They are simply short cuts for basic math operations. For example,

    +=nNum += 10;

    This is a shortcut for nNum = nNum + 10;-=

    nNum -= 10;This is a shortcut for nNum = nNum - 10;

    *=nNum *= 10;

    This is a shortcut for nNum = nNum * 10;/=

    nNum /= 10;This is a shortcut for nNum = nNum / 10;

    2.5.7 The Function Call Operator )The Function Call operator, (), is used to invoke a function. Whenever you see thisoperator, you know that it is a function that is performing some built-in operation orfunction, which may also be a user-defined function as illustrated in figure 11 in section2.4.3. Many functions do not require any arguments (or parameters). In that case, youwill use the Function Call operator just as youve seen it being used up to this point.However, functions may also have a set of required or optional parameters that need tobe specified, which is discussed in detail in the following topic.

    15

  • 7/25/2019 Core Javascript 1

    16/17

    2.6 Function Parameters

    This is a very important topic to understand because EFS formula development is highly

    dependant on the use of function parameters. When you start making requests for data, itis the parameters passed to the EFS functions that tell the EFS engine what to return toyour formula.

    2.6.1 Function Parameter BasicsTo illustrate the basic concept usingfunction parameters, well first use thecode example from figure 13 and passthe two numbers used in thecalcNumber() function as parametersfrom the call within main(). On line 7, we

    have now added two parameters to thecalcNumber() function call. Notice theyare separated by commas. Passingmultiple function parameters requires thatthe list of parameters is separated bycommas so that each parameter can beassigned to a unique variable in thefunction they are being passed to. On line 13, we have added those two variable namesthat will be assigned to the values of the parameters passed to it from main(). Theassignments will be done in the same order as the parameters that were passed. In thiscase nNum1and nNum2 will both be assigned a value of 2. Now take a look at line 14.

    You will notice that we used our two new variables in place of the hard coded 2s that wewere using in figure 13. If we did not make this change, then the parameters passed tothe function would never be used by the function and it would always return the result of 2* 2. Try changing the parameters passed on line 7 to see different results.

    An important note to make about the parameter variables of a user-defined function suchand nNum1and nNum2become local variables to the function. They do not need to bedeclared anywhere in your formula code with the varkeyword. Remember also that localvariables are only available to the function where they were created. You will not be ableto access those variable in any other function unless they are passed as parameters to afunction call within calcNumber().

    16

  • 7/25/2019 Core Javascript 1

    17/17

    2.6.2 Variables as Function ParametersVariables may also be used as function parameters. In figure 14, we used constants, orhard-coded values as parameters. Lets consider an example where we create a newvariable and pass it as a parameter to the calcNumber()function. On line 7 we created anew variable, nFirst, which isassigned to our originalcalcNumber() call with

    constant parameters. On line9, weve replaced theconstants with our nFirstvariable. nFirst getsassigned to a value of 4,which results in nNumberreceiving the value of 16.This code example is also abasic illustration of recyclingcode through the use of afunction that we previously

    discussed.

    2.7 Core JavaScript Resources

    The core JavaScript topics discussed in this tutorial only highlight the most commonlyused aspects of the language for the new EFS developer. To learn more about the topicsdiscussed here and more elements of the JavaScript language please check out some ofthe following resources.

    JavaScript for EFS Video Series Nearly 6 hours of video tutorials that also coversthe core JavaScript concepts discussed in this tutorial plus many tips and tricks forprogramming with JavaScript.

    Core JavaScript 1.5 Reference This on-line book is the complete referencemanual for the core JavaScript language for version 1.5 located in ourEFSKnowledgeBase.

    Core JavaScript 1.5 Guide This on-line book is a comprehensive guide thatcovers all aspects of JavaScript 1.5 located in our EFS KnowledgeBase.

    Whats Next?

    In the next tutorial, Introductory Tutorial 3 Introduction to preMain() and main(), wewill introduce the specific EFS functions used in preMain(). We will also discuss theusage of main() in greater detail.

    http://www.esignalcentral.com/university/esignal/tutorial/javascript/default.asphttp://kb.esignalcentral.com/article.asp?article=1759&p=4http://kb.esignalcentral.com/article.asp?article=1759&p=4http://kb.esignalcentral.com/?cid=4&c=12&cpc=ULwO0A442oKs512Q04X5j0UupP4SveI6dt2WJi7http://kb.esignalcentral.com/?cid=4&c=12&cpc=ULwO0A442oKs512Q04X5j0UupP4SveI6dt2WJi7http://kb.esignalcentral.com/?cid=4&c=12&cpc=ULwO0A442oKs512Q04X5j0UupP4SveI6dt2WJi7http://kb.esignalcentral.com/article.asp?article=1830&p=4http://kb.esignalcentral.com/?cid=4&c=12&cpc=ULwO0A442oKs512Q04X5j0UupP4SveI6dt2WJi7http://kb.esignalcentral.com/?cid=4&c=12&cpc=ULwO0A442oKs512Q04X5j0UupP4SveI6dt2WJi7http://kb.esignalcentral.com/article.asp?article=1830&p=4http://kb.esignalcentral.com/?cid=4&c=12&cpc=ULwO0A442oKs512Q04X5j0UupP4SveI6dt2WJi7http://kb.esignalcentral.com/?cid=4&c=12&cpc=ULwO0A442oKs512Q04X5j0UupP4SveI6dt2WJi7http://kb.esignalcentral.com/article.asp?article=1759&p=4http://www.esignalcentral.com/university/esignal/tutorial/javascript/default.asp